From 008818c35772bb096658691a6842c6241a4203a6 Mon Sep 17 00:00:00 2001 From: RaffaeleMorganti Date: Wed, 16 Nov 2022 17:18:19 +0100 Subject: [PATCH] parser moved outside --- README.md | 2 +- .../java/com/github/dtschust/zork/Zork.java | 633 +++--------------- .../com/github/dtschust/zork/ZorkCommand.java | 4 +- .../github/dtschust/zork/ZorkCondition.java | 4 +- .../dtschust/zork/ZorkConditionHas.java | 12 +- .../dtschust/zork/ZorkConditionStatus.java | 6 +- .../github/dtschust/zork/ZorkContainer.java | 4 +- .../github/dtschust/zork/ZorkCreature.java | 2 +- .../com/github/dtschust/zork/ZorkItem.java | 2 +- .../com/github/dtschust/zork/ZorkObject.java | 2 +- .../com/github/dtschust/zork/ZorkRoom.java | 2 +- .../com/github/dtschust/zork/ZorkTrigger.java | 6 +- .../github/dtschust/zork/parser/ZorkGame.java | 18 + .../dtschust/zork/parser/ZorkReader.java | 497 ++++++++++++++ 14 files changed, 618 insertions(+), 576 deletions(-) create mode 100644 src/main/java/com/github/dtschust/zork/parser/ZorkGame.java create mode 100644 src/main/java/com/github/dtschust/zork/parser/ZorkReader.java diff --git a/README.md b/README.md index f91ce3c..0844830 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ mvn clean package Example inputs can be found in RunThroughResults.txt as to how to beat the sample game. To run the sample game execute: ```shell -mvn exc:java +mvn exec:java ``` This command will load the `sampleGame.xml` XML game spec. \ No newline at end of file diff --git a/src/main/java/com/github/dtschust/zork/Zork.java b/src/main/java/com/github/dtschust/zork/Zork.java index 2228cd8..d27ab3f 100644 --- a/src/main/java/com/github/dtschust/zork/Zork.java +++ b/src/main/java/com/github/dtschust/zork/Zork.java @@ -5,12 +5,9 @@ package com.github.dtschust.zork; -import org.w3c.dom.CharacterData; -import org.w3c.dom.*; +import com.github.dtschust.zork.parser.ZorkGame; +import com.github.dtschust.zork.parser.ZorkReader; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.File; import java.util.HashMap; import java.util.Scanner; @@ -18,478 +15,16 @@ import java.util.Scanner; /* And away we go*/ public class Zork { public String userInput = ""; - /*Hashmaps to store the instance of the game*/ - public HashMap Rooms = new HashMap<>(); - public HashMap Items = new HashMap<>(); - public HashMap Containers = new HashMap<>(); - public HashMap Objects = new HashMap<>(); - public HashMap Creatures = new HashMap<>(); - public HashMap Inventory = new HashMap<>(); - public HashMap ObjectLookup = new HashMap<>(); public String currentRoom; - public File file; + public ZorkGame game; Scanner source = new Scanner(System.in); public Zork(String filename) { - int i, j, k, l, x, y, z; - file = new File(filename); - if (!file.canRead()) { - System.out.println("Error opening file. Exiting..."); - return; - } - - try { - /* Open the xml file*/ - DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - Document doc = builder.parse(file); - - Element rootElement = doc.getDocumentElement(); - - /* Every single first generation child is a room, container, creature, or item. So load them in*/ - NodeList nodes = rootElement.getChildNodes(); - for (k = 0; k < nodes.getLength(); k++) { - Node node = nodes.item(k); - Element element; - if (node instanceof Element) { - element = (Element) node; - String tagType = element.getTagName(); - - /* If it's a room ... */ - if (tagType.equals("room")) { - ZorkRoom tempRoom = new ZorkRoom(); - - /*Get all possible Room attributes*/ - - NodeList name = element.getElementsByTagName("name"); - tempRoom.name = getString((Element) name.item(0)); - NodeList type = element.getElementsByTagName("type"); - if (type.getLength() > 0) { - tempRoom.type = getString((Element) type.item(0)); - } else { - tempRoom.type = "regular"; - } - NodeList status = element.getElementsByTagName("status"); - if (status.getLength() > 0) { - tempRoom.status = getString((Element) type.item(0)); - } else { - tempRoom.status = ""; - } - NodeList description = element.getElementsByTagName("description"); - tempRoom.description = getString((Element) description.item(0)); - - NodeList items = element.getElementsByTagName("item"); - for (j = 0; j < items.getLength(); j++) { - Element item = (Element) items.item(j); - String itemName = getString(item); - tempRoom.item.put(itemName, itemName); - } - - NodeList creatures = element.getElementsByTagName("creature"); - for (j = 0; j < creatures.getLength(); j++) { - Element creature = (Element) creatures.item(j); - String creatureName = getString(creature); - tempRoom.creature.put(creatureName, creatureName); - } - - NodeList triggers = element.getElementsByTagName("trigger"); - for (j = 0; j < triggers.getLength(); j++) { - ZorkTrigger tempTrigger = new ZorkTrigger(); - Element trigger = (Element) triggers.item(j); - NodeList commands = trigger.getElementsByTagName("command"); - for (l = 0; l < commands.getLength(); l++) { - Element command = (Element) commands.item(l); - ZorkCommand tempCommand = new ZorkCommand(); - tempCommand.command = getString(command); - tempTrigger.conditions.add(tempCommand); - tempTrigger.hasCommand = true; - } - NodeList conditions = trigger.getElementsByTagName("condition"); - for (l = 0; l < conditions.getLength(); l++) { - Element condition = (Element) conditions.item(l); - NodeList object = condition.getElementsByTagName("object"); - NodeList has = condition.getElementsByTagName("has"); - 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"); - tempConditionHas.owner = getString((Element) owner.item(0)); - tempTrigger.conditions.add(tempConditionHas); - - } else { - ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); - tempConditionStatus.object = getString((Element) object.item(0)); - NodeList sstatus = condition.getElementsByTagName("status"); - tempConditionStatus.status = getString((Element) sstatus.item(0)); - tempTrigger.conditions.add(tempConditionStatus); - } - - } - NodeList ttype = element.getElementsByTagName("type"); - if (ttype.getLength() > 0) { - tempTrigger.type = getString((Element) ttype.item(0)); - } else { - tempTrigger.type = "single"; - } - NodeList prints = trigger.getElementsByTagName("print"); - for (l = 0; l < prints.getLength(); l++) { - Element print = (Element) prints.item(l); - tempTrigger.print.add(getString(print)); - } - NodeList actions = trigger.getElementsByTagName("action"); - for (l = 0; l < actions.getLength(); l++) { - Element action = (Element) actions.item(l); - tempTrigger.action.add(getString(action)); - } - - tempRoom.trigger.add(tempTrigger); - } - - NodeList containers = element.getElementsByTagName("container"); - for (j = 0; j < containers.getLength(); j++) { - Element container = (Element) containers.item(j); - String containerName = getString(container); - tempRoom.container.put(containerName, containerName); - } - - NodeList borders = element.getElementsByTagName("border"); - for (j = 0; j < borders.getLength(); j++) { - Element border = (Element) borders.item(j); - String borderdirection = getString((Element) border.getElementsByTagName("direction").item(0)); - String bordername = getString((Element) border.getElementsByTagName("name").item(0)); - tempRoom.border.put(borderdirection, bordername); - } - - /*Add this room to the rooms hashmap, put it in the generic objects hashmap, and store it's type in the objectlookup hashmap*/ - Rooms.put(tempRoom.name, tempRoom); - Objects.put(tempRoom.name, tempRoom); - ObjectLookup.put(tempRoom.name, "room"); - } - - /* If it's an item... */ - else if (tagType.equals("item")) { - ZorkItem tempItem = new ZorkItem(); - - /* Get all possible item attributes*/ - NodeList name = element.getElementsByTagName("name"); - if (name.getLength() > 0) - tempItem.name = getString((Element) name.item(0)); - - NodeList status = element.getElementsByTagName("status"); - if (status.getLength() > 0) { - tempItem.status = getString((Element) status.item(0)); - } else { - tempItem.status = ""; - } - - NodeList description = element.getElementsByTagName("description"); - if (description.getLength() > 0) - tempItem.description = getString((Element) description.item(0)); - - NodeList writing = element.getElementsByTagName("writing"); - if (writing.getLength() > 0) - tempItem.writing = getString((Element) writing.item(0)); - - NodeList turnon = element.getElementsByTagName("turnon"); - if (turnon.getLength() > 0) { - NodeList prints = element.getElementsByTagName("print"); - for (j = 0; j < prints.getLength(); j++) { - tempItem.turnOnPrint.add(getString((Element) prints.item(j))); - } - NodeList actions = element.getElementsByTagName("action"); - for (j = 0; j < actions.getLength(); j++) { - tempItem.turnOnAction.add(getString((Element) actions.item(j))); - } - - } - - NodeList triggers = element.getElementsByTagName("trigger"); - for (j = 0; j < triggers.getLength(); j++) { - ZorkTrigger tempTrigger = new ZorkTrigger(); - Element trigger = (Element) triggers.item(j); - NodeList commands = trigger.getElementsByTagName("command"); - for (l = 0; l < commands.getLength(); l++) { - Element command = (Element) commands.item(l); - ZorkCommand tempCommand = new ZorkCommand(); - tempCommand.command = getString(command); - tempTrigger.conditions.add(tempCommand); - tempTrigger.hasCommand = true; - } - NodeList conditions = trigger.getElementsByTagName("condition"); - for (l = 0; l < conditions.getLength(); l++) { - Element condition = (Element) conditions.item(l); - NodeList object = condition.getElementsByTagName("object"); - NodeList has = condition.getElementsByTagName("has"); - 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"); - tempConditionHas.owner = getString((Element) owner.item(0)); - tempTrigger.conditions.add(tempConditionHas); - - } else { - ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); - tempConditionStatus.object = getString((Element) object.item(0)); - NodeList sstatus = condition.getElementsByTagName("status"); - tempConditionStatus.status = getString((Element) sstatus.item(0)); - tempTrigger.conditions.add(tempConditionStatus); - } - - } - NodeList ttype = element.getElementsByTagName("type"); - if (ttype.getLength() > 0) { - tempTrigger.type = getString((Element) ttype.item(0)); - } else { - tempTrigger.type = "single"; - } - NodeList prints = trigger.getElementsByTagName("print"); - for (l = 0; l < prints.getLength(); l++) { - Element print = (Element) prints.item(l); - tempTrigger.print.add(getString(print)); - } - NodeList actions = trigger.getElementsByTagName("action"); - for (l = 0; l < actions.getLength(); l++) { - Element action = (Element) actions.item(l); - tempTrigger.action.add(getString(action)); - } - - tempItem.trigger.add(tempTrigger); - } - - /* Put each item in the items hashmap, the generic objects hashmap, and store its type in objectlookup*/ - Items.put(tempItem.name, tempItem); - Objects.put(tempItem.name, tempItem); - ObjectLookup.put(tempItem.name, "item"); - - } - - /* If it's a container... */ - else if (tagType.equals("container")) { - ZorkContainer tempCont = new ZorkContainer(); - - /*Get all possible container attributes*/ - - NodeList name = element.getElementsByTagName("name"); - if (name.getLength() > 0) - tempCont.name = getString((Element) name.item(0)); - - NodeList status = element.getElementsByTagName("status"); - if (status.getLength() > 0) - tempCont.status = getString((Element) status.item(0)); - - /*Initially assume a closed container*/ - tempCont.isOpen = false; - NodeList description = element.getElementsByTagName("description"); - if (description.getLength() > 0) - tempCont.description = getString((Element) description.item(0)); - - NodeList accepts = element.getElementsByTagName("accept"); - for (j = 0; j < accepts.getLength(); j++) { - /* If container has an accepts attribute, then it is always open*/ - tempCont.isOpen = true; - tempCont.accept.add(getString((Element) accepts.item(j))); - } - - NodeList citems = element.getElementsByTagName("item"); - for (j = 0; j < citems.getLength(); j++) { - Element item = (Element) citems.item(j); - String itemName = getString(item); - tempCont.item.put(itemName, itemName); - } - - NodeList triggers = element.getElementsByTagName("trigger"); - for (j = 0; j < triggers.getLength(); j++) { - ZorkTrigger tempTrigger = new ZorkTrigger(); - Element trigger = (Element) triggers.item(j); - NodeList commands = trigger.getElementsByTagName("command"); - for (l = 0; l < commands.getLength(); l++) { - Element command = (Element) commands.item(l); - ZorkCommand tempCommand = new ZorkCommand(); - tempCommand.command = getString(command); - tempTrigger.conditions.add(tempCommand); - tempTrigger.hasCommand = true; - } - NodeList conditions = trigger.getElementsByTagName("condition"); - for (l = 0; l < conditions.getLength(); l++) { - Element condition = (Element) conditions.item(l); - NodeList object = condition.getElementsByTagName("object"); - NodeList has = condition.getElementsByTagName("has"); - 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"); - tempConditionHas.owner = getString((Element) owner.item(0)); - tempTrigger.conditions.add(tempConditionHas); - - } else { - ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); - tempConditionStatus.object = getString((Element) object.item(0)); - NodeList sstatus = condition.getElementsByTagName("status"); - tempConditionStatus.status = getString((Element) sstatus.item(0)); - tempTrigger.conditions.add(tempConditionStatus); - } - - } - NodeList ttype = element.getElementsByTagName("type"); - if (ttype.getLength() > 0) { - tempTrigger.type = getString((Element) ttype.item(0)); - } else { - tempTrigger.type = "single"; - } - NodeList prints = trigger.getElementsByTagName("print"); - for (l = 0; l < prints.getLength(); l++) { - Element print = (Element) prints.item(l); - tempTrigger.print.add(getString(print)); - } - NodeList actions = trigger.getElementsByTagName("action"); - for (l = 0; l < actions.getLength(); l++) { - Element action = (Element) actions.item(l); - tempTrigger.action.add(getString(action)); - } - - tempCont.trigger.add(tempTrigger); - } - - /* Put each container in the containers hashmap, the generic object hashmap, and the objectlookup hashmap*/ - Containers.put(tempCont.name, tempCont); - Objects.put(tempCont.name, tempCont); - ObjectLookup.put(tempCont.name, "container"); - } - - /* And finally, if it's a creature...*/ - else if (tagType.equals("creature")) { - ZorkCreature tempCreature = new ZorkCreature(); - - /* Get all possible creature attributes*/ - - NodeList name = element.getElementsByTagName("name"); - if (name.getLength() > 0) - tempCreature.name = getString((Element) name.item(0)); - - NodeList status = element.getElementsByTagName("status"); - if (status.getLength() > 0) - tempCreature.status = getString((Element) status.item(0)); - - NodeList description = element.getElementsByTagName("description"); - if (description.getLength() > 0) - tempCreature.description = getString((Element) description.item(0)); - - NodeList vulns = element.getElementsByTagName("vulnerability"); - for (j = 0; j < vulns.getLength(); j++) { - String vulnString = getString((Element) vulns.item(j)); - tempCreature.vulnerability.put(vulnString, vulnString); - } - - NodeList attacks = element.getElementsByTagName("attack"); - for (j = 0; j < attacks.getLength(); j++) { - Element attack = (Element) attacks.item(j); - NodeList conditions = attack.getElementsByTagName("condition"); - for (l = 0; l < conditions.getLength(); l++) { - Element condition = (Element) conditions.item(l); - NodeList object = condition.getElementsByTagName("object"); - NodeList has = condition.getElementsByTagName("has"); - 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"); - tempConditionHas.owner = getString((Element) owner.item(0)); - tempCreature.conditions.add(tempConditionHas); - - } else { - ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); - tempConditionStatus.object = getString((Element) object.item(0)); - NodeList sstatus = condition.getElementsByTagName("status"); - tempConditionStatus.status = getString((Element) sstatus.item(0)); - tempCreature.conditions.add(tempConditionStatus); - } - - } - NodeList prints = attack.getElementsByTagName("print"); - for (l = 0; l < prints.getLength(); l++) { - Element print = (Element) prints.item(l); - tempCreature.print.add(getString(print)); - } - NodeList actions = attack.getElementsByTagName("action"); - for (l = 0; l < actions.getLength(); l++) { - Element action = (Element) actions.item(l); - tempCreature.action.add(getString(action)); - } - - } - - NodeList triggers = element.getElementsByTagName("trigger"); - for (j = 0; j < triggers.getLength(); j++) { - ZorkTrigger tempTrigger = new ZorkTrigger(); - Element trigger = (Element) triggers.item(j); - NodeList commands = trigger.getElementsByTagName("command"); - for (l = 0; l < commands.getLength(); l++) { - Element command = (Element) commands.item(l); - ZorkCommand tempCommand = new ZorkCommand(); - tempCommand.command = getString(command); - tempTrigger.conditions.add(tempCommand); - tempTrigger.hasCommand = true; - } - NodeList conditions = trigger.getElementsByTagName("condition"); - for (l = 0; l < conditions.getLength(); l++) { - Element condition = (Element) conditions.item(l); - NodeList object = condition.getElementsByTagName("object"); - NodeList has = condition.getElementsByTagName("has"); - 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"); - tempConditionHas.owner = getString((Element) owner.item(0)); - tempTrigger.conditions.add(tempConditionHas); - - } else { - ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); - tempConditionStatus.object = getString((Element) object.item(0)); - NodeList sstatus = condition.getElementsByTagName("status"); - tempConditionStatus.status = getString((Element) sstatus.item(0)); - tempTrigger.conditions.add(tempConditionStatus); - } - - } - NodeList ttype = element.getElementsByTagName("type"); - if (ttype.getLength() > 0) { - tempTrigger.type = getString((Element) ttype.item(0)); - } else { - tempTrigger.type = "single"; - } - NodeList prints = trigger.getElementsByTagName("print"); - for (l = 0; l < prints.getLength(); l++) { - Element print = (Element) prints.item(l); - tempTrigger.print.add(getString(print)); - } - NodeList actions = trigger.getElementsByTagName("action"); - for (l = 0; l < actions.getLength(); l++) { - Element action = (Element) actions.item(l); - tempTrigger.action.add(getString(action)); - } - - tempCreature.trigger.add(tempTrigger); - } - - /* Put each creature in the creatures hashmap, the generic object hashmap, and the objectlookup hashmap*/ - Creatures.put(tempCreature.name, tempCreature); - Objects.put(tempCreature.name, tempCreature); - ObjectLookup.put(tempCreature.name, "creature"); - } - - } - } - } catch (Exception e) { - System.out.println("Invalid XML file, exiting"); - System.exit(-1); - //e.printStackTrace(); - } + ZorkReader reader = new ZorkReader(filename); + game = reader.build(); /*Phew, we're finally done with that ... let's get playing!!*/ /* Some temporary initialization variables*/ @@ -501,7 +36,7 @@ public class Zork { /* Print out the first entrance description, starting the game!*/ - System.out.println(Rooms.get(currentRoom).description); + System.out.println(game.Rooms.get(currentRoom).description); /* There is no stopping in Zork, until we're done!!*/ while (true) { @@ -525,15 +60,7 @@ public class Zork { } } - /* 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 "?"; - } + /* I love how basic java main functions are sometimes.*/ public static void main(String[] args) { @@ -561,21 +88,21 @@ public class Zork { /* Take */ else if (input.startsWith("take") && input.split(" ").length >= 1) { tempString = input.split(" ")[1]; - if ((Rooms.get(currentRoom)).item.get(tempString) != null) { - Inventory.put(tempString, tempString); - ZorkRoom tempRoom = (Rooms.get(currentRoom)); + if ((game.Rooms.get(currentRoom)).item.get(tempString) != null) { + game.Inventory.put(tempString, tempString); + ZorkRoom tempRoom = (game.Rooms.get(currentRoom)); tempRoom.item.remove(tempString); - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); System.out.println("Item " + tempString + " added to inventory."); } else { /*Search all containers in the current room for the item!*/ boolean found = false; - for (String key : Rooms.get(currentRoom).container.keySet()) { - tempContainer = Containers.get(key); + for (String key : game.Rooms.get(currentRoom).container.keySet()) { + tempContainer = game.Containers.get(key); if (tempContainer != null && tempContainer.isOpen && tempContainer.item.get(tempString) != null) { - Inventory.put(tempString, tempString); + game.Inventory.put(tempString, tempString); tempContainer.item.remove(tempString); - Containers.put(tempContainer.name, tempContainer); + game.Containers.put(tempContainer.name, tempContainer); System.out.println("Item " + tempString + " added to inventory."); found = true; break; @@ -587,7 +114,7 @@ public class Zork { } /* Open Exit (you should be so lucky)*/ else if (input.equals("open exit")) { - if (Rooms.get(currentRoom).type.equals("exit")) { + if (game.Rooms.get(currentRoom).type.equals("exit")) { System.out.println("Game Over"); System.exit(0); } else { @@ -597,9 +124,9 @@ public class Zork { /* Open a container */ else if (input.startsWith("open") && input.split(" ").length >= 1) { tempString = input.split(" ")[1]; - String found = Rooms.get(currentRoom).container.get(tempString); + String found = game.Rooms.get(currentRoom).container.get(tempString); if (found != null) { - tempContainer = Containers.get(tempString); + tempContainer = game.Containers.get(tempString); tempContainer.isOpen = true; containerInventory(tempContainer.item, tempString); } else { @@ -610,8 +137,8 @@ public class Zork { else if (input.startsWith("read") && input.split(" ").length >= 1) { tempString = input.split(" ")[1]; ZorkItem tempItem; - if (Inventory.get(tempString) != null) { - tempItem = Items.get(tempString); + if (game.Inventory.get(tempString) != null) { + tempItem = game.Items.get(tempString); if (tempItem.writing != null && tempItem.writing != "") { System.out.println(tempItem.writing); } else { @@ -624,11 +151,11 @@ public class Zork { /* Drop an item*/ else if (input.startsWith("drop") && input.split(" ").length >= 1) { tempString = input.split(" ")[1]; - if (Inventory.get(tempString) != null) { - ZorkRoom tempRoom = Rooms.get(currentRoom); + if (game.Inventory.get(tempString) != null) { + ZorkRoom tempRoom = game.Rooms.get(currentRoom); tempRoom.item.put(tempString, tempString); - Rooms.put(tempRoom.name, tempRoom); - Inventory.remove(tempString); + game.Rooms.put(tempRoom.name, tempRoom); + game.Inventory.remove(tempString); System.out.println(tempString + " dropped."); } else { System.out.println("Error"); @@ -638,10 +165,10 @@ public class Zork { else if (input.startsWith("put") && input.split(" ").length >= 4) { tempString = input.split(" ")[1]; String destination = input.split(" ")[3]; - if (Rooms.get(currentRoom).container.get(destination) != null && Containers.get(destination).isOpen && Inventory.get(tempString) != null) { - tempContainer = Containers.get(destination); + if (game.Rooms.get(currentRoom).container.get(destination) != null && game.Containers.get(destination).isOpen && game.Inventory.get(tempString) != null) { + tempContainer = game.Containers.get(destination); tempContainer.item.put(tempString, tempString); - Inventory.remove(tempString); + game.Inventory.remove(tempString); System.out.println("Item " + tempString + " added to " + destination + "."); } else { System.out.println("Error"); @@ -651,8 +178,8 @@ public class Zork { else if (input.startsWith("turn on") && input.split(" ").length >= 3) { tempString = input.split(" ")[2]; ZorkItem tempItem; - if (Inventory.get(tempString) != null) { - tempItem = Items.get(tempString); + if (game.Inventory.get(tempString) != null) { + tempItem = game.Items.get(tempString); System.out.println("You activate the " + tempString + "."); if (tempItem != null) { for (y = 0; y < tempItem.turnOnPrint.size(); y++) { @@ -674,9 +201,9 @@ public class Zork { tempString = input.split(" ")[1]; ZorkCreature tempCreature; String weapon = input.split(" ")[3]; - if (Rooms.get(currentRoom).creature.get(tempString) != null) { - tempCreature = Creatures.get(tempString); - if (tempCreature != null && Inventory.get(weapon) != null) { + if (game.Rooms.get(currentRoom).creature.get(tempString) != null) { + tempCreature = game.Creatures.get(tempString); + if (tempCreature != null && game.Inventory.get(weapon) != null) { if (tempCreature.attack(this, weapon)) { System.out.println("You assault the " + tempString + " with the " + weapon + "."); for (y = 0; y < tempCreature.print.size(); y++) { @@ -710,8 +237,8 @@ public class Zork { ZorkContainer tempContainer; /*Check Room triggers*/ - for (x = 0; x < Rooms.get(currentRoom).trigger.size(); x++) { - tempTrigger = Rooms.get(currentRoom).trigger.get(x); + for (x = 0; x < game.Rooms.get(currentRoom).trigger.size(); x++) { + tempTrigger = game.Rooms.get(currentRoom).trigger.get(x); if (tempTrigger.evaluate(this)) { for (y = 0; y < tempTrigger.print.size(); y++) { System.out.println(tempTrigger.print.get(y)); @@ -723,16 +250,16 @@ public class Zork { skip = true; } if (tempTrigger.type.equals("single")) { - Rooms.get(currentRoom).trigger.remove(x); + game.Rooms.get(currentRoom).trigger.remove(x); } } } /* Check items in the containers in the room */ - for (String key : Rooms.get(currentRoom).container.keySet()) { - tempContainer = Containers.get(key); + for (String key : game.Rooms.get(currentRoom).container.keySet()) { + tempContainer = game.Containers.get(key); for (String key2 : tempContainer.item.keySet()) { - ZorkItem tempItem = Items.get(key2); + ZorkItem tempItem = game.Items.get(key2); for (x = 0; x < tempItem.trigger.size(); x++) { tempTrigger = tempItem.trigger.get(x); if (tempTrigger.evaluate(this)) { @@ -773,8 +300,8 @@ public class Zork { } /* Check all creatures in the room */ - for (String key : Rooms.get(currentRoom).creature.keySet()) { - ZorkCreature tempCreature = Creatures.get(key); + for (String key : game.Rooms.get(currentRoom).creature.keySet()) { + ZorkCreature tempCreature = game.Creatures.get(key); for (x = 0; x < tempCreature.trigger.size(); x++) { tempTrigger = tempCreature.trigger.get(x); if (tempTrigger.evaluate(this)) { @@ -795,8 +322,8 @@ public class Zork { } /* Check items in inventory */ - for (String key : Inventory.keySet()) { - ZorkItem tempItem = Items.get(key); + for (String key : game.Inventory.keySet()) { + ZorkItem tempItem = game.Items.get(key); for (x = 0; x < tempItem.trigger.size(); x++) { tempTrigger = tempItem.trigger.get(x); if (tempTrigger.evaluate(this)) { @@ -817,8 +344,8 @@ public class Zork { } /* Check items in room */ - for (String key : Rooms.get(currentRoom).item.keySet()) { - ZorkItem tempItem = Items.get(key); + for (String key : game.Rooms.get(currentRoom).item.keySet()) { + ZorkItem tempItem = game.Items.get(key); for (x = 0; x < tempItem.trigger.size(); x++) { tempTrigger = tempItem.trigger.get(x); if (tempTrigger.evaluate(this)) { @@ -854,10 +381,10 @@ public class Zork { fullDirection = "west"; } - destination = (Rooms.get(currentRoom)).border.get(fullDirection); + destination = (game.Rooms.get(currentRoom)).border.get(fullDirection); if (destination != null) { currentRoom = destination; - System.out.println(Rooms.get(currentRoom).description); + System.out.println(game.Rooms.get(currentRoom).description); } else { System.out.println("Can't go that way."); } @@ -872,25 +399,25 @@ public class Zork { object = action.split(" ")[1]; String newStatus = action.split(" ")[3]; - objectType = ObjectLookup.get(object); + objectType = game.ObjectLookup.get(object); if (objectType.equals("room")) { - ZorkRoom tempRoom = Rooms.get(object); + ZorkRoom tempRoom = game.Rooms.get(object); tempRoom.status = newStatus; - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } else if (objectType.equals("container")) { - ZorkContainer tempContainer = Containers.get(object); + ZorkContainer tempContainer = game.Containers.get(object); tempContainer.status = newStatus; - Containers.put(tempContainer.name, tempContainer); + game.Containers.put(tempContainer.name, tempContainer); } else if (objectType.equals("creature")) { - ZorkCreature tempCreature = Creatures.get(object); + ZorkCreature tempCreature = game.Creatures.get(object); tempCreature.status = newStatus; - Creatures.put(tempCreature.name, tempCreature); + game.Creatures.put(tempCreature.name, tempCreature); } else if (objectType.equals("item")) { - ZorkItem tempItem = Items.get(object); + ZorkItem tempItem = game.Items.get(object); tempItem.status = newStatus; - Items.put(tempItem.name, tempItem); + game.Items.put(tempItem.name, tempItem); } @@ -905,10 +432,10 @@ public class Zork { else if (action.startsWith("Add")) { String destination = action.split(" ")[3]; object = action.split(" ")[1]; - objectType = ObjectLookup.get(object); - String destinationType = ObjectLookup.get(destination); + objectType = game.ObjectLookup.get(object); + String destinationType = game.ObjectLookup.get(destination); if (destinationType.equals("room")) { - ZorkRoom tempRoom = Rooms.get(destination); + ZorkRoom tempRoom = game.Rooms.get(destination); if (objectType.equals("item")) tempRoom.item.put(object, object); else if (objectType.equals("creature")) @@ -917,14 +444,14 @@ public class Zork { tempRoom.container.put(object, object); else System.out.println("Error"); - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } else if (destinationType.equals("container")) { - ZorkContainer tempContainer = Containers.get(destination); + ZorkContainer tempContainer = game.Containers.get(destination); if (objectType.equals("item")) tempContainer.item.put(object, object); else System.out.println("Error"); - Containers.put(tempContainer.name, tempContainer); + game.Containers.put(tempContainer.name, tempContainer); } else { System.out.println("Error"); } @@ -933,52 +460,52 @@ public class Zork { /* Delete: figure out what object it is and delete it accordingly. Rooms are especially tricky */ else if (action.startsWith("Delete")) { object = action.split(" ")[1]; - objectType = ObjectLookup.get(object); - Objects.remove(object); + objectType = game.ObjectLookup.get(object); + game.Objects.remove(object); if (objectType.equals("room")) { ZorkRoom tempRoom; - for (String key : Rooms.keySet()) { - tempRoom = Rooms.get(key); + for (String key : game.Rooms.keySet()) { + tempRoom = game.Rooms.get(key); for (String key2 : tempRoom.border.keySet()) { if (tempRoom.border.get(key2).equals(object)) { tempRoom.border.remove(key2); } } - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } } else if (objectType.equals("item")) { ZorkRoom tempRoom; - for (String key : Rooms.keySet()) { - tempRoom = Rooms.get(key); + for (String key : game.Rooms.keySet()) { + tempRoom = game.Rooms.get(key); if (tempRoom.item.get(object) != null) { tempRoom.item.remove(object); - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } } ZorkContainer tempContainer; - for (String key : Containers.keySet()) { - tempContainer = Containers.get(key); + for (String key : game.Containers.keySet()) { + tempContainer = game.Containers.get(key); if (tempContainer.item.get(object) != null) { tempContainer.item.remove(object); - Containers.put(tempContainer.name, tempContainer); + game.Containers.put(tempContainer.name, tempContainer); } } } else if (objectType.equals("container")) { ZorkRoom tempRoom; - for (String key : Rooms.keySet()) { - tempRoom = Rooms.get(key); + for (String key : game.Rooms.keySet()) { + tempRoom = game.Rooms.get(key); if (tempRoom.container.get(object) != null) { tempRoom.container.remove(object); - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } } } else if (objectType.equals("creature")) { ZorkRoom tempRoom; - for (String key : Rooms.keySet()) { - tempRoom = Rooms.get(key); + for (String key : game.Rooms.keySet()) { + tempRoom = game.Rooms.get(key); if (tempRoom.creature.get(object) != null) { tempRoom.creature.remove(object); - Rooms.put(tempRoom.name, tempRoom); + game.Rooms.put(tempRoom.name, tempRoom); } } } @@ -1007,10 +534,10 @@ public class Zork { /* Print out the inventory when user types i */ public void inventory() { String output = "Inventory: "; - if (Inventory.isEmpty()) { + if (game.Inventory.isEmpty()) { System.out.println("Inventory: empty"); } else { - for (String key : Inventory.keySet()) { + for (String key : game.Inventory.keySet()) { output += key + ", "; } output = output.substring(0, output.length() - 2); diff --git a/src/main/java/com/github/dtschust/zork/ZorkCommand.java b/src/main/java/com/github/dtschust/zork/ZorkCommand.java index a58efdc..7321b59 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkCommand.java +++ b/src/main/java/com/github/dtschust/zork/ZorkCommand.java @@ -1,8 +1,8 @@ package com.github.dtschust.zork; /* Special Command condition*/ -class ZorkCommand extends ZorkCondition { - String command; +public class ZorkCommand extends ZorkCondition { + public String command; public boolean evaluate(Zork zork) { return command.equals(zork.userInput); diff --git a/src/main/java/com/github/dtschust/zork/ZorkCondition.java b/src/main/java/com/github/dtschust/zork/ZorkCondition.java index 4f0b73c..e9fba56 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkCondition.java +++ b/src/main/java/com/github/dtschust/zork/ZorkCondition.java @@ -1,8 +1,8 @@ package com.github.dtschust.zork; /* Generic condition*/ -abstract class ZorkCondition { - String object; +public abstract class ZorkCondition { + public String object; public abstract boolean evaluate(Zork zork); } diff --git a/src/main/java/com/github/dtschust/zork/ZorkConditionHas.java b/src/main/java/com/github/dtschust/zork/ZorkConditionHas.java index 7bf5559..cad4e45 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkConditionHas.java +++ b/src/main/java/com/github/dtschust/zork/ZorkConditionHas.java @@ -1,23 +1,23 @@ package com.github.dtschust.zork; /* Has conditions*/ -class ZorkConditionHas extends ZorkCondition { - String has; - String owner; +public class ZorkConditionHas extends ZorkCondition { + public String has; + public String owner; 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*/ if (owner.equals("inventory")) { - return zork.Inventory.get(object) != null && has.equals("yes") || zork.Inventory.get(object) == null && has.equals("no"); + return zork.game.Inventory.get(object) != null && has.equals("yes") || zork.game.Inventory.get(object) == null && has.equals("no"); } else { /* is it a room?*/ - ZorkRoom roomObject = zork.Rooms.get(owner); + ZorkRoom roomObject = zork.game.Rooms.get(owner); if (roomObject != null) { return (roomObject).item.get(object) != null && has.equals("yes") || (roomObject).item.get(object) == null && has.equals("no"); } /* is it a container?*/ else { - ZorkContainer containerObject = zork.Containers.get(owner); + ZorkContainer containerObject = zork.game.Containers.get(owner); if (containerObject != null) { return (containerObject).item.get(object) != null && has.equals("yes") || (containerObject).item.get(object) == null && has.equals("no"); diff --git a/src/main/java/com/github/dtschust/zork/ZorkConditionStatus.java b/src/main/java/com/github/dtschust/zork/ZorkConditionStatus.java index 25e9eab..48d66c2 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkConditionStatus.java +++ b/src/main/java/com/github/dtschust/zork/ZorkConditionStatus.java @@ -1,11 +1,11 @@ package com.github.dtschust.zork; /* Status conditions*/ -class ZorkConditionStatus extends ZorkCondition { - String status; +public class ZorkConditionStatus extends ZorkCondition { + public String status; public boolean evaluate(Zork zork) { - ZorkObject tested = zork.Objects.get(object); + ZorkObject tested = zork.game.Objects.get(object); return tested != null && tested.status.equals(status); } } diff --git a/src/main/java/com/github/dtschust/zork/ZorkContainer.java b/src/main/java/com/github/dtschust/zork/ZorkContainer.java index 6797aee..1900a53 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkContainer.java +++ b/src/main/java/com/github/dtschust/zork/ZorkContainer.java @@ -4,12 +4,12 @@ import java.util.ArrayList; import java.util.HashMap; /* Container*/ -class ZorkContainer extends ZorkObject { +public class ZorkContainer extends ZorkObject { public String name; public HashMap item = new HashMap<>(); public String description; public ArrayList accept = new ArrayList<>(); - boolean isOpen; + public boolean isOpen; public ZorkContainer() { } diff --git a/src/main/java/com/github/dtschust/zork/ZorkCreature.java b/src/main/java/com/github/dtschust/zork/ZorkCreature.java index eab8a21..32cdef4 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkCreature.java +++ b/src/main/java/com/github/dtschust/zork/ZorkCreature.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; /* Creature*/ -class ZorkCreature extends ZorkObject { +public class ZorkCreature extends ZorkObject { public String name; public String description; public HashMap vulnerability = new HashMap<>(); diff --git a/src/main/java/com/github/dtschust/zork/ZorkItem.java b/src/main/java/com/github/dtschust/zork/ZorkItem.java index a354395..6af7143 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkItem.java +++ b/src/main/java/com/github/dtschust/zork/ZorkItem.java @@ -3,7 +3,7 @@ package com.github.dtschust.zork; import java.util.ArrayList; /* Item*/ -class ZorkItem extends ZorkObject { +public class ZorkItem extends ZorkObject { public String name; public String description; public String writing; diff --git a/src/main/java/com/github/dtschust/zork/ZorkObject.java b/src/main/java/com/github/dtschust/zork/ZorkObject.java index f5abc90..079a6cc 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkObject.java +++ b/src/main/java/com/github/dtschust/zork/ZorkObject.java @@ -3,7 +3,7 @@ package com.github.dtschust.zork; import java.util.ArrayList; /* Generic object, everything inherits from this*/ -class ZorkObject { +public class ZorkObject { public String status; public ArrayList trigger = new ArrayList<>(); diff --git a/src/main/java/com/github/dtschust/zork/ZorkRoom.java b/src/main/java/com/github/dtschust/zork/ZorkRoom.java index 898d7e2..debe9f3 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkRoom.java +++ b/src/main/java/com/github/dtschust/zork/ZorkRoom.java @@ -3,7 +3,7 @@ package com.github.dtschust.zork; import java.util.HashMap; /* Room*/ -class ZorkRoom extends ZorkObject { +public class ZorkRoom extends ZorkObject { public String name; public String type = "regular"; public String description; diff --git a/src/main/java/com/github/dtschust/zork/ZorkTrigger.java b/src/main/java/com/github/dtschust/zork/ZorkTrigger.java index 5fb5f75..a021cb8 100644 --- a/src/main/java/com/github/dtschust/zork/ZorkTrigger.java +++ b/src/main/java/com/github/dtschust/zork/ZorkTrigger.java @@ -3,12 +3,12 @@ package com.github.dtschust.zork; import java.util.ArrayList; /*Trigger*/ -class ZorkTrigger { +public class ZorkTrigger { public ArrayList conditions = new ArrayList<>(); public ArrayList print = new ArrayList<>(); public ArrayList action = new ArrayList<>(); - String type = "single"; /*By default, single*/ - boolean hasCommand = false; + public String type = "single"; /*By default, single*/ + public boolean hasCommand = false; public boolean evaluate(Zork zork) { for (ZorkCondition condition : conditions) { diff --git a/src/main/java/com/github/dtschust/zork/parser/ZorkGame.java b/src/main/java/com/github/dtschust/zork/parser/ZorkGame.java new file mode 100644 index 0000000..04a4b32 --- /dev/null +++ b/src/main/java/com/github/dtschust/zork/parser/ZorkGame.java @@ -0,0 +1,18 @@ +package com.github.dtschust.zork.parser; + +import com.github.dtschust.zork.*; + +import java.io.File; +import java.util.HashMap; + +public class ZorkGame { + public HashMap Rooms = new HashMap<>(); + public HashMap Items = new HashMap<>(); + public HashMap Containers = new HashMap<>(); + public HashMap Objects = new HashMap<>(); + public HashMap Creatures = new HashMap<>(); + public HashMap Inventory = new HashMap<>(); + public HashMap ObjectLookup = new HashMap<>(); + public String currentRoom; + public File file; +} diff --git a/src/main/java/com/github/dtschust/zork/parser/ZorkReader.java b/src/main/java/com/github/dtschust/zork/parser/ZorkReader.java new file mode 100644 index 0000000..60815bf --- /dev/null +++ b/src/main/java/com/github/dtschust/zork/parser/ZorkReader.java @@ -0,0 +1,497 @@ +package com.github.dtschust.zork.parser; + +import com.github.dtschust.zork.*; +import org.w3c.dom.CharacterData; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; + +public class ZorkReader { + + private final String filename; + + public ZorkReader(String filename) { + this.filename = filename; + } + + public ZorkGame build(){ + int j, k, l; + + ZorkGame data = new ZorkGame(); + + File file = new File(filename); + if (!file.canRead()) { + System.out.println("Error opening file. Exiting..."); + throw new RuntimeException(); + } + + try { + /* Open the xml file*/ + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = builder.parse(file); + + Element rootElement = doc.getDocumentElement(); + + /* Every single first generation child is a room, container, creature, or item. So load them in*/ + NodeList nodes = rootElement.getChildNodes(); + for (k = 0; k < nodes.getLength(); k++) { + Node node = nodes.item(k); + Element element; + if (node instanceof Element) { + element = (Element) node; + String tagType = element.getTagName(); + + /* If it's a room ... */ + if (tagType.equals("room")) { + ZorkRoom tempRoom = new ZorkRoom(); + + /*Get all possible Room attributes*/ + + NodeList name = element.getElementsByTagName("name"); + tempRoom.name = getString((Element) name.item(0)); + NodeList type = element.getElementsByTagName("type"); + if (type.getLength() > 0) { + tempRoom.type = getString((Element) type.item(0)); + } else { + tempRoom.type = "regular"; + } + NodeList status = element.getElementsByTagName("status"); + if (status.getLength() > 0) { + tempRoom.status = getString((Element) type.item(0)); + } else { + tempRoom.status = ""; + } + NodeList description = element.getElementsByTagName("description"); + tempRoom.description = getString((Element) description.item(0)); + + NodeList items = element.getElementsByTagName("item"); + for (j = 0; j < items.getLength(); j++) { + Element item = (Element) items.item(j); + String itemName = getString(item); + tempRoom.item.put(itemName, itemName); + } + + NodeList creatures = element.getElementsByTagName("creature"); + for (j = 0; j < creatures.getLength(); j++) { + Element creature = (Element) creatures.item(j); + String creatureName = getString(creature); + tempRoom.creature.put(creatureName, creatureName); + } + + NodeList triggers = element.getElementsByTagName("trigger"); + for (j = 0; j < triggers.getLength(); j++) { + ZorkTrigger tempTrigger = new ZorkTrigger(); + Element trigger = (Element) triggers.item(j); + NodeList commands = trigger.getElementsByTagName("command"); + for (l = 0; l < commands.getLength(); l++) { + Element command = (Element) commands.item(l); + ZorkCommand tempCommand = new ZorkCommand(); + tempCommand.command = getString(command); + tempTrigger.conditions.add(tempCommand); + tempTrigger.hasCommand = true; + } + NodeList conditions = trigger.getElementsByTagName("condition"); + for (l = 0; l < conditions.getLength(); l++) { + Element condition = (Element) conditions.item(l); + NodeList object = condition.getElementsByTagName("object"); + NodeList has = condition.getElementsByTagName("has"); + 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"); + tempConditionHas.owner = getString((Element) owner.item(0)); + tempTrigger.conditions.add(tempConditionHas); + + } else { + ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); + tempConditionStatus.object = getString((Element) object.item(0)); + NodeList sstatus = condition.getElementsByTagName("status"); + tempConditionStatus.status = getString((Element) sstatus.item(0)); + tempTrigger.conditions.add(tempConditionStatus); + } + + } + NodeList ttype = element.getElementsByTagName("type"); + if (ttype.getLength() > 0) { + tempTrigger.type = getString((Element) ttype.item(0)); + } else { + tempTrigger.type = "single"; + } + NodeList prints = trigger.getElementsByTagName("print"); + for (l = 0; l < prints.getLength(); l++) { + Element print = (Element) prints.item(l); + tempTrigger.print.add(getString(print)); + } + NodeList actions = trigger.getElementsByTagName("action"); + for (l = 0; l < actions.getLength(); l++) { + Element action = (Element) actions.item(l); + tempTrigger.action.add(getString(action)); + } + + tempRoom.trigger.add(tempTrigger); + } + + NodeList containers = element.getElementsByTagName("container"); + for (j = 0; j < containers.getLength(); j++) { + Element container = (Element) containers.item(j); + String containerName = getString(container); + tempRoom.container.put(containerName, containerName); + } + + NodeList borders = element.getElementsByTagName("border"); + for (j = 0; j < borders.getLength(); j++) { + Element border = (Element) borders.item(j); + String borderdirection = getString((Element) border.getElementsByTagName("direction").item(0)); + String bordername = getString((Element) border.getElementsByTagName("name").item(0)); + tempRoom.border.put(borderdirection, bordername); + } + + /*Add this room to the rooms hashmap, put it in the generic objects hashmap, and store it's type in the objectlookup hashmap*/ + data.Rooms.put(tempRoom.name, tempRoom); + data.Objects.put(tempRoom.name, tempRoom); + data.ObjectLookup.put(tempRoom.name, "room"); + } + + /* If it's an item... */ + else if (tagType.equals("item")) { + ZorkItem tempItem = new ZorkItem(); + + /* Get all possible item attributes*/ + NodeList name = element.getElementsByTagName("name"); + if (name.getLength() > 0) + tempItem.name = getString((Element) name.item(0)); + + NodeList status = element.getElementsByTagName("status"); + if (status.getLength() > 0) { + tempItem.status = getString((Element) status.item(0)); + } else { + tempItem.status = ""; + } + + NodeList description = element.getElementsByTagName("description"); + if (description.getLength() > 0) + tempItem.description = getString((Element) description.item(0)); + + NodeList writing = element.getElementsByTagName("writing"); + if (writing.getLength() > 0) + tempItem.writing = getString((Element) writing.item(0)); + + NodeList turnon = element.getElementsByTagName("turnon"); + if (turnon.getLength() > 0) { + NodeList prints = element.getElementsByTagName("print"); + for (j = 0; j < prints.getLength(); j++) { + tempItem.turnOnPrint.add(getString((Element) prints.item(j))); + } + NodeList actions = element.getElementsByTagName("action"); + for (j = 0; j < actions.getLength(); j++) { + tempItem.turnOnAction.add(getString((Element) actions.item(j))); + } + + } + + NodeList triggers = element.getElementsByTagName("trigger"); + for (j = 0; j < triggers.getLength(); j++) { + ZorkTrigger tempTrigger = new ZorkTrigger(); + Element trigger = (Element) triggers.item(j); + NodeList commands = trigger.getElementsByTagName("command"); + for (l = 0; l < commands.getLength(); l++) { + Element command = (Element) commands.item(l); + ZorkCommand tempCommand = new ZorkCommand(); + tempCommand.command = getString(command); + tempTrigger.conditions.add(tempCommand); + tempTrigger.hasCommand = true; + } + NodeList conditions = trigger.getElementsByTagName("condition"); + for (l = 0; l < conditions.getLength(); l++) { + Element condition = (Element) conditions.item(l); + NodeList object = condition.getElementsByTagName("object"); + NodeList has = condition.getElementsByTagName("has"); + 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"); + tempConditionHas.owner = getString((Element) owner.item(0)); + tempTrigger.conditions.add(tempConditionHas); + + } else { + ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); + tempConditionStatus.object = getString((Element) object.item(0)); + NodeList sstatus = condition.getElementsByTagName("status"); + tempConditionStatus.status = getString((Element) sstatus.item(0)); + tempTrigger.conditions.add(tempConditionStatus); + } + + } + NodeList ttype = element.getElementsByTagName("type"); + if (ttype.getLength() > 0) { + tempTrigger.type = getString((Element) ttype.item(0)); + } else { + tempTrigger.type = "single"; + } + NodeList prints = trigger.getElementsByTagName("print"); + for (l = 0; l < prints.getLength(); l++) { + Element print = (Element) prints.item(l); + tempTrigger.print.add(getString(print)); + } + NodeList actions = trigger.getElementsByTagName("action"); + for (l = 0; l < actions.getLength(); l++) { + Element action = (Element) actions.item(l); + tempTrigger.action.add(getString(action)); + } + + tempItem.trigger.add(tempTrigger); + } + + /* Put each item in the items hashmap, the generic objects hashmap, and store its type in objectlookup*/ + data.Items.put(tempItem.name, tempItem); + data.Objects.put(tempItem.name, tempItem); + data.ObjectLookup.put(tempItem.name, "item"); + + } + + /* If it's a container... */ + else if (tagType.equals("container")) { + ZorkContainer tempCont = new ZorkContainer(); + + /*Get all possible container attributes*/ + + NodeList name = element.getElementsByTagName("name"); + if (name.getLength() > 0) + tempCont.name = getString((Element) name.item(0)); + + NodeList status = element.getElementsByTagName("status"); + if (status.getLength() > 0) + tempCont.status = getString((Element) status.item(0)); + + /*Initially assume a closed container*/ + tempCont.isOpen = false; + NodeList description = element.getElementsByTagName("description"); + if (description.getLength() > 0) + tempCont.description = getString((Element) description.item(0)); + + NodeList accepts = element.getElementsByTagName("accept"); + for (j = 0; j < accepts.getLength(); j++) { + /* If container has an accepts attribute, then it is always open*/ + tempCont.isOpen = true; + tempCont.accept.add(getString((Element) accepts.item(j))); + } + + NodeList citems = element.getElementsByTagName("item"); + for (j = 0; j < citems.getLength(); j++) { + Element item = (Element) citems.item(j); + String itemName = getString(item); + tempCont.item.put(itemName, itemName); + } + + NodeList triggers = element.getElementsByTagName("trigger"); + for (j = 0; j < triggers.getLength(); j++) { + ZorkTrigger tempTrigger = new ZorkTrigger(); + Element trigger = (Element) triggers.item(j); + NodeList commands = trigger.getElementsByTagName("command"); + for (l = 0; l < commands.getLength(); l++) { + Element command = (Element) commands.item(l); + ZorkCommand tempCommand = new ZorkCommand(); + tempCommand.command = getString(command); + tempTrigger.conditions.add(tempCommand); + tempTrigger.hasCommand = true; + } + NodeList conditions = trigger.getElementsByTagName("condition"); + for (l = 0; l < conditions.getLength(); l++) { + Element condition = (Element) conditions.item(l); + NodeList object = condition.getElementsByTagName("object"); + NodeList has = condition.getElementsByTagName("has"); + 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"); + tempConditionHas.owner = getString((Element) owner.item(0)); + tempTrigger.conditions.add(tempConditionHas); + + } else { + ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); + tempConditionStatus.object = getString((Element) object.item(0)); + NodeList sstatus = condition.getElementsByTagName("status"); + tempConditionStatus.status = getString((Element) sstatus.item(0)); + tempTrigger.conditions.add(tempConditionStatus); + } + + } + NodeList ttype = element.getElementsByTagName("type"); + if (ttype.getLength() > 0) { + tempTrigger.type = getString((Element) ttype.item(0)); + } else { + tempTrigger.type = "single"; + } + NodeList prints = trigger.getElementsByTagName("print"); + for (l = 0; l < prints.getLength(); l++) { + Element print = (Element) prints.item(l); + tempTrigger.print.add(getString(print)); + } + NodeList actions = trigger.getElementsByTagName("action"); + for (l = 0; l < actions.getLength(); l++) { + Element action = (Element) actions.item(l); + tempTrigger.action.add(getString(action)); + } + + tempCont.trigger.add(tempTrigger); + } + + /* Put each container in the containers hashmap, the generic object hashmap, and the objectlookup hashmap*/ + data.Containers.put(tempCont.name, tempCont); + data.Objects.put(tempCont.name, tempCont); + data.ObjectLookup.put(tempCont.name, "container"); + } + + /* And finally, if it's a creature...*/ + else if (tagType.equals("creature")) { + ZorkCreature tempCreature = new ZorkCreature(); + + /* Get all possible creature attributes*/ + + NodeList name = element.getElementsByTagName("name"); + if (name.getLength() > 0) + tempCreature.name = getString((Element) name.item(0)); + + NodeList status = element.getElementsByTagName("status"); + if (status.getLength() > 0) + tempCreature.status = getString((Element) status.item(0)); + + NodeList description = element.getElementsByTagName("description"); + if (description.getLength() > 0) + tempCreature.description = getString((Element) description.item(0)); + + NodeList vulns = element.getElementsByTagName("vulnerability"); + for (j = 0; j < vulns.getLength(); j++) { + String vulnString = getString((Element) vulns.item(j)); + tempCreature.vulnerability.put(vulnString, vulnString); + } + + NodeList attacks = element.getElementsByTagName("attack"); + for (j = 0; j < attacks.getLength(); j++) { + Element attack = (Element) attacks.item(j); + NodeList conditions = attack.getElementsByTagName("condition"); + for (l = 0; l < conditions.getLength(); l++) { + Element condition = (Element) conditions.item(l); + NodeList object = condition.getElementsByTagName("object"); + NodeList has = condition.getElementsByTagName("has"); + 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"); + tempConditionHas.owner = getString((Element) owner.item(0)); + tempCreature.conditions.add(tempConditionHas); + + } else { + ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); + tempConditionStatus.object = getString((Element) object.item(0)); + NodeList sstatus = condition.getElementsByTagName("status"); + tempConditionStatus.status = getString((Element) sstatus.item(0)); + tempCreature.conditions.add(tempConditionStatus); + } + + } + NodeList prints = attack.getElementsByTagName("print"); + for (l = 0; l < prints.getLength(); l++) { + Element print = (Element) prints.item(l); + tempCreature.print.add(getString(print)); + } + NodeList actions = attack.getElementsByTagName("action"); + for (l = 0; l < actions.getLength(); l++) { + Element action = (Element) actions.item(l); + tempCreature.action.add(getString(action)); + } + + } + + NodeList triggers = element.getElementsByTagName("trigger"); + for (j = 0; j < triggers.getLength(); j++) { + ZorkTrigger tempTrigger = new ZorkTrigger(); + Element trigger = (Element) triggers.item(j); + NodeList commands = trigger.getElementsByTagName("command"); + for (l = 0; l < commands.getLength(); l++) { + Element command = (Element) commands.item(l); + ZorkCommand tempCommand = new ZorkCommand(); + tempCommand.command = getString(command); + tempTrigger.conditions.add(tempCommand); + tempTrigger.hasCommand = true; + } + NodeList conditions = trigger.getElementsByTagName("condition"); + for (l = 0; l < conditions.getLength(); l++) { + Element condition = (Element) conditions.item(l); + NodeList object = condition.getElementsByTagName("object"); + NodeList has = condition.getElementsByTagName("has"); + 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"); + tempConditionHas.owner = getString((Element) owner.item(0)); + tempTrigger.conditions.add(tempConditionHas); + + } else { + ZorkConditionStatus tempConditionStatus = new ZorkConditionStatus(); + tempConditionStatus.object = getString((Element) object.item(0)); + NodeList sstatus = condition.getElementsByTagName("status"); + tempConditionStatus.status = getString((Element) sstatus.item(0)); + tempTrigger.conditions.add(tempConditionStatus); + } + + } + NodeList ttype = element.getElementsByTagName("type"); + if (ttype.getLength() > 0) { + tempTrigger.type = getString((Element) ttype.item(0)); + } else { + tempTrigger.type = "single"; + } + NodeList prints = trigger.getElementsByTagName("print"); + for (l = 0; l < prints.getLength(); l++) { + Element print = (Element) prints.item(l); + tempTrigger.print.add(getString(print)); + } + NodeList actions = trigger.getElementsByTagName("action"); + for (l = 0; l < actions.getLength(); l++) { + Element action = (Element) actions.item(l); + tempTrigger.action.add(getString(action)); + } + + tempCreature.trigger.add(tempTrigger); + } + + /* Put each creature in the creatures hashmap, the generic object hashmap, and the objectlookup hashmap*/ + data.Creatures.put(tempCreature.name, tempCreature); + data.Objects.put(tempCreature.name, tempCreature); + data.ObjectLookup.put(tempCreature.name, "creature"); + } + + } + } + } catch (Exception e) { + System.out.println("Invalid XML file, exiting"); + System.exit(-1); + //e.printStackTrace(); + } + + 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 "?"; + } + +}