Skip to content

Commit

Permalink
Merge branch 'ai' of github.com:Cardshifter/Cardshifter into
Browse files Browse the repository at this point in the history
client-server

Conflicts:
	cardshifter-api/client-server-documentation.txt
	cardshifter-api/pom.xml
	cardshifter-api/src/main/java/com/cardshifter/server/incoming/LoginMessage.java
	cardshifter-api/src/main/java/com/cardshifter/server/outgoing/WelcomeMessage.java
	cardshifter-core/src/main/java/com/cardshifter/core/Game.java
	cardshifter-core/src/main/java/com/cardshifter/core/Zone.java
	cardshifter-core/src/main/java/com/cardshifter/core/console/CommandLineOptions.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/Handlers.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/IncomingHandler.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/MessageHandler.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/Server.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/ServerGame.java
	cardshifter-server/src/main/java/com/cardshifter/server/model/TCGGame.java
  • Loading branch information
Zomis committed Sep 3, 2014
2 parents 30734fb + eaed062 commit 0a39da2
Show file tree
Hide file tree
Showing 18 changed files with 483 additions and 22 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -14,3 +14,7 @@ dependency-reduced-pom.xml

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

### Ignore Netbeans workspace
nb-configuration.xml
nbactions.xml
@@ -0,0 +1,8 @@
package com.cardshifter.ai;

import com.cardshifter.core.Player;
import com.cardshifter.core.UsableAction;

public interface CardshifterAI {
UsableAction getAction(Player player);
}
@@ -0,0 +1,47 @@
package com.cardshifter.ai;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.cardshifter.core.Player;
import com.cardshifter.core.TargetAction;
import com.cardshifter.core.Targetable;
import com.cardshifter.core.UsableAction;

public class CompleteIdiot implements CardshifterAI {

private final Random random = new Random();

@Override
public UsableAction getAction(Player player) {
Stream<UsableAction> actions = player.getActions().values().stream();
Stream<UsableAction> cardActions = player.getGame().getZones().stream()
.flatMap(zone -> zone.getCards().stream())
.flatMap(card -> card.getActions().values().stream());

Stream<UsableAction> allActions = Stream.concat(actions, cardActions).filter(action -> action.isAllowed())
.filter(action -> setTargetIfPossible(action));
List<UsableAction> list = allActions.collect(Collectors.toList());

if (list.isEmpty()) {
return null;
}
return list.get(random.nextInt(list.size()));
}

private boolean setTargetIfPossible(UsableAction action) {
if (action instanceof TargetAction) {
TargetAction targetAction = (TargetAction) action;
List<Targetable> targets = targetAction.findTargets();
if (targets.isEmpty()) {
return false;
}
targetAction.setTarget(targets.get(random.nextInt(targets.size())));
return true;
}
return true;
}

}
11 changes: 10 additions & 1 deletion cardshifter-core/src/main/java/com/cardshifter/core/Game.java
Expand Up @@ -21,6 +21,7 @@ public class Game {
public final LuaValue data;
private boolean gameOver = false;
private final AtomicInteger ids;
private int turnNumber;

private Player currentPlayer;

Expand All @@ -36,12 +37,18 @@ public Game(InputStream file, Random random) {
this.players.add(new Player(this, "Player1"));
this.players.add(new Player(this, "Player2"));
this.random = random;

this.turnNumber = 0;
}

public Game(InputStream file) {
this(file, new Random());
}


public int getTurnNumber() {
return this.turnNumber;
}

public Player getCurrentPlayer() {
return currentPlayer;
}
Expand Down Expand Up @@ -97,6 +104,8 @@ public void nextTurn() {
this.currentPlayer = currentPlayer == null ? players.get(0) : currentPlayer.getNextPlayer();

this.events.callEvent(Events.TURN_START, CoerceJavaToLua.coerce(this.currentPlayer), null);

turnNumber++;
}

public int randomInt(int count) {
Expand Down
Expand Up @@ -11,6 +11,7 @@ public class TargetAction extends UsableAction {

private final Card card;
private final LuaValue targetAllowed;
private Targetable target;

public TargetAction(Card card, String name, LuaValue actionAllowed, LuaValue targetAllowed, LuaValue actionPerformed) {
super(name, actionAllowed, actionPerformed);
Expand All @@ -20,8 +21,10 @@ public TargetAction(Card card, String name, LuaValue actionAllowed, LuaValue tar

@Override
public void perform() {
// I know, this stinks.
throw new UnsupportedOperationException();
if (!this.isValidTarget(target)) {
throw new IllegalStateException("Not a valid target: " + target);
}
this.perform(target);
}

@Override
Expand All @@ -46,11 +49,11 @@ public List<Targetable> findTargets() {
return targets;
}

private boolean isValidTarget(Targetable target) {
public boolean isValidTarget(Targetable target) {
return targetAllowed.invoke(CoerceJavaToLua.coerce(card), CoerceJavaToLua.coerce(target), CoerceJavaToLua.coerce(this)).arg1().toboolean();
}

public void perform(Targetable target) {
private void perform(Targetable target) {
Game game = getGame(); // stored here in case it is unavailable after action has been performed
getActionFunction().invoke(CoerceJavaToLua.coerce(card), CoerceJavaToLua.coerce(target), CoerceJavaToLua.coerce(this));
game.getEvents().callEvent(Events.ACTION_USED, CoerceJavaToLua.coerce(card), CoerceJavaToLua.coerce(this));
Expand All @@ -61,4 +64,11 @@ public String toString() {
return "{TargetAction " + this.getName() + " on card " + this.card + "}";
}

public void setTarget(Targetable target) {
if (!isValidTarget(target)) {
throw new IllegalArgumentException("Not a valid target: " + target);
}
this.target = target;
}

}
Expand Up @@ -73,7 +73,8 @@ private void handleActionInput(final List<UsableAction> actions, final String in
}

Targetable target = targets.get(targetIndex);
targetAction.perform(target);
targetAction.setTarget(target);
targetAction.perform();
}
else action.perform();
print("Action performed");
Expand Down
Expand Up @@ -159,7 +159,8 @@ private void handleActionInput(final List<UsableAction> actions, final String in
}

Targetable target = targets.get(targetIndex);
targetAction.perform(target);
targetAction.setTarget(target);
targetAction.perform();
}
else action.perform();
print("Action performed");
Expand Down
4 changes: 4 additions & 0 deletions cardshifter-fx/.gitignore
@@ -1 +1,5 @@
/target

### Ignore Netbeans workspace
nb-configuration.xml
nbactions.xml
7 changes: 7 additions & 0 deletions cardshifter-fx/pom.xml
Expand Up @@ -13,6 +13,8 @@
<url>https://github.com/Cardshifter/Cardshifter</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
Expand All @@ -27,5 +29,10 @@
<version>3.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.cardshifter</groupId>
<artifactId>cardshifter-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
13 changes: 0 additions & 13 deletions cardshifter-fx/src/main/java/com/cardshift/fx/App.java

This file was deleted.

138 changes: 138 additions & 0 deletions cardshifter-fx/src/main/java/com/cardshifter/fx/CardNode.java
@@ -0,0 +1,138 @@
package com.cardshifter.fx;

import com.cardshifter.core.Card;
import com.cardshifter.core.LuaTools;
import com.cardshifter.core.TargetAction;
import com.cardshifter.core.Targetable;
import com.cardshifter.core.UsableAction;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

public class CardNode {

private final int sizeX;
private final int sizeY;
private final String name;
private final Card card;
private final FXMLGameController controller;

private final Group cardGroup;

public CardNode(int sizeX, int sizeY, String name, Card card, FXMLGameController controller) {
this.sizeX = sizeX;
this.sizeY = sizeY;
this.name = name;
this.card = card;
this.controller = controller;
this.cardGroup = new Group();
this.createCard();
}

public Group getCardGroup() {
return this.cardGroup;
}

private void createCard() {
this.createCardBackground();
this.createCardArt();
this.createCardIDLabel();
this.createCardPropertyLabelsGroup();
if(this.isCardActive() == true) {
this.createCardActivateButton();
}
}

private void createCardBackground() {
Rectangle activeBackground = new Rectangle(-10,-10,170,240);
activeBackground.setFill(Color.BLACK);
if(this.isCardActive() == true) {
activeBackground.setFill(Color.YELLOW);
}
cardGroup.getChildren().add(activeBackground);
}

private void createCardArt() {
Rectangle cardBack = new Rectangle(0,0,150,220);
cardBack.setFill(Color.FIREBRICK);
cardGroup.getChildren().add(cardBack);
}

private void createCardIDLabel() {
Label cardIdLabel = new Label();
cardIdLabel.setText(String.format("CardID = %d", card.getId()));
cardIdLabel.setTextFill(Color.WHITE);
cardGroup.getChildren().add(cardIdLabel);
}

private void createCardPropertyLabelsGroup() {
//This gets the text from Lua and makes labels for each property
int stringIndex = 0;
List<String> stringList = new ArrayList<>();
LuaTools.processLuaTable(card.data.checktable(), (k, v) -> stringList.add(k + ": " + v));
for (String string : stringList) {
Group cardTextStrings = new Group();
cardTextStrings.setTranslateY(25 + (stringIndex * 25));
cardGroup.getChildren().add(cardTextStrings);

Label cardStringLabel = new Label();
cardStringLabel.setText(string);
cardStringLabel.setTextFill(Color.WHITE);
cardTextStrings.getChildren().add(cardStringLabel);
stringIndex++;
}
}

private void createCardActivateButton() {
//only make a button when the card is active
Button button = new Button();
//button.setStyle("-fx-background-color:transparent");
button.minWidth(100);
button.minHeight(100);
button.prefWidth(100);
button.prefHeight(100);
button.setOnAction(this::buttonClick);
cardGroup.getChildren().add(button);
}

private void buttonClick(ActionEvent event) {
System.out.println("Trying to Perform Action");
List<UsableAction> cardActions = card.getActions().values().stream().filter(UsableAction::isAllowed).collect(Collectors.toList());
for (UsableAction action : cardActions) {
if (action.isAllowed()) {
if (action instanceof TargetAction) {
TargetAction targetAction = (TargetAction) action;
List<Targetable> targets = targetAction.findTargets();
if (targets.isEmpty()) {
return;
}

//int targetIndex = Integer.parseInt(input.nextLine());
int targetIndex = 0;
if (targetIndex < 0 || targetIndex >= cardActions.size()) {
return;
}

//TODO: add a check to make sure the target is valid//
Targetable target = targets.get(targetIndex);
targetAction.setTarget(target);
targetAction.perform();
}
else action.perform();
}
this.controller.render();
}
}

private boolean isCardActive() {
List<UsableAction> cardActions = card.getActions().values().stream().filter(UsableAction::isAllowed).collect(Collectors.toList());
return cardActions.size() > 0;
}
}

0 comments on commit 0a39da2

Please sign in to comment.