ZorkConditions are immutable objects

This commit is contained in:
Claudio Maggioni 2022-11-16 17:42:56 +01:00
parent 7cc2352b90
commit 8e54d0684b
8 changed files with 85 additions and 68 deletions

View file

@ -61,7 +61,6 @@ public class Zork {
} }
/* I love how basic java main functions are sometimes.*/ /* I love how basic java main functions are sometimes.*/
public static void main(String[] args) { public static void main(String[] args) {
if (args.length != 1) { if (args.length != 1) {

View file

@ -1,13 +1,14 @@
package com.github.dtschust.zork; package com.github.dtschust.zork;
/* Special Command condition */ /* Special Command condition */
public class ZorkCommand extends ZorkCondition { public class ZorkCommand implements ZorkEvaluatable {
public final String command; public final String command;
public ZorkCommand(String command) { public ZorkCommand(String command) {
this.command = command; this.command = command;
} }
@Override
public boolean evaluate(Zork zork) { public boolean evaluate(Zork zork) {
return command.equals(zork.userInput); return command.equals(zork.userInput);
} }

View file

@ -1,8 +1,10 @@
package com.github.dtschust.zork; package com.github.dtschust.zork;
/* Generic condition*/ /* Generic condition*/
public abstract class ZorkCondition { public abstract class ZorkCondition implements ZorkEvaluatable {
public String object; public final String object;
public abstract boolean evaluate(Zork zork); protected ZorkCondition(String object) {
this.object = object;
}
} }

View file

@ -2,9 +2,16 @@ package com.github.dtschust.zork;
/* Has conditions*/ /* Has conditions*/
public class ZorkConditionHas extends ZorkCondition { public class ZorkConditionHas extends ZorkCondition {
public String has; private final String has;
public String owner; private final String owner;
public ZorkConditionHas(String has, String object, String owner) {
super(object);
this.has = has;
this.owner = owner;
}
@Override
public boolean evaluate(Zork zork) { public boolean evaluate(Zork zork) {
/*Inventory is a special case as it isn't the name of any object in the game, check for it specifically*/ /*Inventory is a special case as it isn't the name of any object in the game, check for it specifically*/
if (owner.equals("inventory")) { if (owner.equals("inventory")) {

View file

@ -2,8 +2,14 @@ package com.github.dtschust.zork;
/* Status conditions*/ /* Status conditions*/
public class ZorkConditionStatus extends ZorkCondition { public class ZorkConditionStatus extends ZorkCondition {
public String status; private final String status;
public ZorkConditionStatus(String status, String object) {
super(object);
this.status = status;
}
@Override
public boolean evaluate(Zork zork) { public boolean evaluate(Zork zork) {
ZorkObject tested = zork.game.Objects.get(object); ZorkObject tested = zork.game.Objects.get(object);
return tested != null && tested.status.equals(status); return tested != null && tested.status.equals(status);

View file

@ -0,0 +1,5 @@
package com.github.dtschust.zork;
public interface ZorkEvaluatable {
boolean evaluate(Zork zork);
}

View file

@ -4,14 +4,14 @@ import java.util.ArrayList;
/*Trigger*/ /*Trigger*/
public class ZorkTrigger { public class ZorkTrigger {
public ArrayList<ZorkCondition> conditions = new ArrayList<>(); public ArrayList<ZorkEvaluatable> conditions = new ArrayList<>();
public ArrayList<String> print = new ArrayList<>(); public ArrayList<String> print = new ArrayList<>();
public ArrayList<String> action = new ArrayList<>(); public ArrayList<String> action = new ArrayList<>();
public String type = "single"; /*By default, single*/ public String type = "single"; /*By default, single*/
public boolean hasCommand = false; public boolean hasCommand = false;
public boolean evaluate(Zork zork) { public boolean evaluate(Zork zork) {
for (ZorkCondition condition : conditions) { for (ZorkEvaluatable condition : conditions) {
if (!condition.evaluate(zork)) { if (!condition.evaluate(zork)) {
return false; return false;
} }

View file

@ -2,10 +2,7 @@ package com.github.dtschust.zork.parser;
import com.github.dtschust.zork.*; import com.github.dtschust.zork.*;
import org.w3c.dom.CharacterData; import org.w3c.dom.CharacterData;
import org.w3c.dom.Document; import org.w3c.dom.*;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
@ -19,6 +16,16 @@ public class ZorkReader {
this.filename = filename; this.filename = filename;
} }
/* Get a string from an element (XML parsing stuff)*/
public static String getString(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "?";
}
public ZorkGame build() { public ZorkGame build() {
int j, k, l; int j, k, l;
@ -100,18 +107,19 @@ public class ZorkReader {
NodeList object = condition.getElementsByTagName("object"); NodeList object = condition.getElementsByTagName("object");
NodeList has = condition.getElementsByTagName("has"); NodeList has = condition.getElementsByTagName("has");
if (has.getLength() > 0) { if (has.getLength() > 0) {
ZorkConditionHas tempConditionHas = new ZorkConditionHas();
tempConditionHas.has = getString((Element) has.item(0));
tempConditionHas.object = getString((Element) object.item(0));
NodeList owner = condition.getElementsByTagName("owner"); NodeList owner = condition.getElementsByTagName("owner");
tempConditionHas.owner = getString((Element) owner.item(0)); ZorkConditionHas tempConditionHas = new ZorkConditionHas(
getString((Element) has.item(0)),
getString((Element) object.item(0)),
getString((Element) owner.item(0))
);
tempTrigger.conditions.add(tempConditionHas); tempTrigger.conditions.add(tempConditionHas);
} else { } else {
ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus();
tempConditionStatus.object = getString((Element) object.item(0));
NodeList sstatus = condition.getElementsByTagName("status"); NodeList sstatus = condition.getElementsByTagName("status");
tempConditionStatus.status = getString((Element) sstatus.item(0)); ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(
getString((Element) sstatus.item(0)),
getString((Element) object.item(0))
);
tempTrigger.conditions.add(tempConditionStatus); tempTrigger.conditions.add(tempConditionStatus);
} }
@ -211,18 +219,18 @@ public class ZorkReader {
NodeList object = condition.getElementsByTagName("object"); NodeList object = condition.getElementsByTagName("object");
NodeList has = condition.getElementsByTagName("has"); NodeList has = condition.getElementsByTagName("has");
if (has.getLength() > 0) { if (has.getLength() > 0) {
ZorkConditionHas tempConditionHas = new ZorkConditionHas();
tempConditionHas.has = getString((Element) has.item(0));
tempConditionHas.object = getString((Element) object.item(0));
NodeList owner = condition.getElementsByTagName("owner"); NodeList owner = condition.getElementsByTagName("owner");
tempConditionHas.owner = getString((Element) owner.item(0)); ZorkConditionHas tempConditionHas = new ZorkConditionHas(
getString((Element) has.item(0)),
getString((Element) object.item(0)),
getString((Element) owner.item(0)));
tempTrigger.conditions.add(tempConditionHas); tempTrigger.conditions.add(tempConditionHas);
} else { } else {
ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus();
tempConditionStatus.object = getString((Element) object.item(0));
NodeList sstatus = condition.getElementsByTagName("status"); NodeList sstatus = condition.getElementsByTagName("status");
tempConditionStatus.status = getString((Element) sstatus.item(0)); ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(
getString((Element) sstatus.item(0)),
getString((Element) object.item(0))
);
tempTrigger.conditions.add(tempConditionStatus); tempTrigger.conditions.add(tempConditionStatus);
} }
@ -305,18 +313,19 @@ public class ZorkReader {
NodeList object = condition.getElementsByTagName("object"); NodeList object = condition.getElementsByTagName("object");
NodeList has = condition.getElementsByTagName("has"); NodeList has = condition.getElementsByTagName("has");
if (has.getLength() > 0) { if (has.getLength() > 0) {
ZorkConditionHas tempConditionHas = new ZorkConditionHas();
tempConditionHas.has = getString((Element) has.item(0));
tempConditionHas.object = getString((Element) object.item(0));
NodeList owner = condition.getElementsByTagName("owner"); NodeList owner = condition.getElementsByTagName("owner");
tempConditionHas.owner = getString((Element) owner.item(0)); ZorkConditionHas tempConditionHas = new ZorkConditionHas(
getString((Element) has.item(0)),
getString((Element) object.item(0)),
getString((Element) owner.item(0))
);
tempTrigger.conditions.add(tempConditionHas); tempTrigger.conditions.add(tempConditionHas);
} else { } else {
ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus();
tempConditionStatus.object = getString((Element) object.item(0));
NodeList sstatus = condition.getElementsByTagName("status"); NodeList sstatus = condition.getElementsByTagName("status");
tempConditionStatus.status = getString((Element) sstatus.item(0)); ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(
getString((Element) sstatus.item(0)),
getString((Element) object.item(0))
);
tempTrigger.conditions.add(tempConditionStatus); tempTrigger.conditions.add(tempConditionStatus);
} }
@ -380,18 +389,18 @@ public class ZorkReader {
NodeList object = condition.getElementsByTagName("object"); NodeList object = condition.getElementsByTagName("object");
NodeList has = condition.getElementsByTagName("has"); NodeList has = condition.getElementsByTagName("has");
if (has.getLength() > 0) { if (has.getLength() > 0) {
ZorkConditionHas tempConditionHas = new ZorkConditionHas();
tempConditionHas.has = getString((Element) has.item(0));
tempConditionHas.object = getString((Element) object.item(0));
NodeList owner = condition.getElementsByTagName("owner"); NodeList owner = condition.getElementsByTagName("owner");
tempConditionHas.owner = getString((Element) owner.item(0)); ZorkConditionHas tempConditionHas = new ZorkConditionHas(
getString((Element) has.item(0)),
getString((Element) object.item(0)),
getString((Element) owner.item(0)));
tempCreature.conditions.add(tempConditionHas); tempCreature.conditions.add(tempConditionHas);
} else { } else {
ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus();
tempConditionStatus.object = getString((Element) object.item(0));
NodeList sstatus = condition.getElementsByTagName("status"); NodeList sstatus = condition.getElementsByTagName("status");
tempConditionStatus.status = getString((Element) sstatus.item(0)); ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(
getString((Element) sstatus.item(0)),
getString((Element) object.item(0))
);
tempCreature.conditions.add(tempConditionStatus); tempCreature.conditions.add(tempConditionStatus);
} }
@ -406,7 +415,6 @@ public class ZorkReader {
Element action = (Element) actions.item(l); Element action = (Element) actions.item(l);
tempCreature.action.add(getString(action)); tempCreature.action.add(getString(action));
} }
} }
NodeList triggers = element.getElementsByTagName("trigger"); NodeList triggers = element.getElementsByTagName("trigger");
@ -426,18 +434,18 @@ public class ZorkReader {
NodeList object = condition.getElementsByTagName("object"); NodeList object = condition.getElementsByTagName("object");
NodeList has = condition.getElementsByTagName("has"); NodeList has = condition.getElementsByTagName("has");
if (has.getLength() > 0) { if (has.getLength() > 0) {
ZorkConditionHas tempConditionHas = new ZorkConditionHas();
tempConditionHas.has = getString((Element) has.item(0));
tempConditionHas.object = getString((Element) object.item(0));
NodeList owner = condition.getElementsByTagName("owner"); NodeList owner = condition.getElementsByTagName("owner");
tempConditionHas.owner = getString((Element) owner.item(0)); ZorkConditionHas tempConditionHas = new ZorkConditionHas(
getString((Element) has.item(0)),
getString((Element) object.item(0)),
getString((Element) owner.item(0)));
tempTrigger.conditions.add(tempConditionHas); tempTrigger.conditions.add(tempConditionHas);
} else { } else {
ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus();
tempConditionStatus.object = getString((Element) object.item(0));
NodeList sstatus = condition.getElementsByTagName("status"); NodeList sstatus = condition.getElementsByTagName("status");
tempConditionStatus.status = getString((Element) sstatus.item(0)); ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(
getString((Element) sstatus.item(0)),
getString((Element) object.item(0))
);
tempTrigger.conditions.add(tempConditionStatus); tempTrigger.conditions.add(tempConditionStatus);
} }
@ -479,15 +487,4 @@ public class ZorkReader {
return data; return data;
} }
/* Get a string from an element (XML parsing stuff)*/
public static String getString(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "?";
}
} }