|
|
@@ -28,6 +28,9 @@ public class Game { |
|
|
|
private static ArrayList<String> story = new ArrayList<String>();
|
|
|
|
private static ArrayList<Item> items = new ArrayList<Item>();
|
|
|
|
private static ArrayList<Puzzle> puzzles = new ArrayList<Puzzle>();
|
|
|
|
private String deviceId = null;
|
|
|
|
|
|
|
|
|
|
|
|
private boolean stoppFlag = false;
|
|
|
|
private Map<String, Object> jsonMap = null;
|
|
|
|
private String[] inputArray = null;
|
|
|
@@ -38,15 +41,8 @@ public class Game { |
|
|
|
private String input = null;
|
|
|
|
private Room currentRoom = null;
|
|
|
|
|
|
|
|
private Room intro;
|
|
|
|
private Room keller;
|
|
|
|
private Puzzle durchgang;
|
|
|
|
private Puzzle schloss;
|
|
|
|
private Puzzle door;
|
|
|
|
private Item schluessel;
|
|
|
|
private Item stahlschluessel;
|
|
|
|
|
|
|
|
public Game() {
|
|
|
|
|
|
|
|
try {
|
|
|
|
startGame();
|
|
|
|
} catch (Exception ex) {
|
|
|
@@ -89,21 +85,18 @@ public class Game { |
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static String generateJSON() throws IOException {
|
|
|
|
public static String writeJSON(File f) throws IOException {
|
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
|
String s = "";
|
|
|
|
try (
|
|
|
|
JsonGenerator jGenerator
|
|
|
|
= mapper.getFactory().createGenerator(
|
|
|
|
new File("game.JSON"),
|
|
|
|
JsonEncoding.UTF8)) {
|
|
|
|
= mapper.getFactory().createGenerator(f,JsonEncoding.UTF8)) {
|
|
|
|
|
|
|
|
jGenerator.writeStartObject();
|
|
|
|
jGenerator.writeObjectField("room", rooms);
|
|
|
|
jGenerator.writeObjectField("puzzle", puzzles);
|
|
|
|
jGenerator.writeObjectField("item", items);
|
|
|
|
jGenerator.writeObjectField("story", story);
|
|
|
|
|
|
|
|
jGenerator.writeEndObject();
|
|
|
|
jGenerator.close();
|
|
|
|
|
|
|
@@ -130,76 +123,43 @@ public class Game { |
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setVariables() throws Exception {
|
|
|
|
public Item getItem(String s) {
|
|
|
|
for (int i = 0; i < items.size(); i++) {
|
|
|
|
if (items.get(i).getName().toLowerCase().equals(s.toLowerCase())) {
|
|
|
|
if (currentRoom.getItems().contains(items.get(i).getId())) {
|
|
|
|
return items.get(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Intro Raum
|
|
|
|
intro = new Room("Intro");
|
|
|
|
intro.setDescription("Hier ist das Intro von Kidnappd");
|
|
|
|
durchgang = new Puzzle("Durchgang");
|
|
|
|
durchgang.setSolvedText("Hurra, du hast das Intro Level beendet");
|
|
|
|
intro.puzzles.add(durchgang);
|
|
|
|
|
|
|
|
//Raum Object
|
|
|
|
keller = new Room("Keller");
|
|
|
|
|
|
|
|
durchgang.setNextRoom(keller);
|
|
|
|
keller.setDescription("der kleine Mondschein, der zuvor den unbekannten Raum schwach beleuchtet hat, leuchtet viel gr��er und viel heller und du erkennst nun den gesamten Raum. Er ist klein und d�ster. "
|
|
|
|
+ "überall h�ngen Spinnennetze und Staub sammelt sich am Betonboden. Du erkennst am anderen Ende des Raumes eine T�r");
|
|
|
|
|
|
|
|
//Puzzle Object
|
|
|
|
schloss = new Puzzle("Schloss");
|
|
|
|
schloss.setDescription("Es ist ein altes Schloss aus Metall, dass eine Einkerbung f�r einen Schl�ssel hat");
|
|
|
|
schloss.setSolvedText("Ja, es hat funktioniert! Mit einem Knacksen geht das Schloss auf und du kannst dich von deiner Beinfessel befreien. ");
|
|
|
|
puzzles.add(schloss);
|
|
|
|
keller.puzzles.add(schloss);
|
|
|
|
|
|
|
|
//Ausgang
|
|
|
|
door = new Puzzle("Tuer");
|
|
|
|
door.setDescription("Ausgang aus dem Keller");
|
|
|
|
door.setGameOverFlag(true);
|
|
|
|
door.setSolvedText("Geschafft! Die Tuer ist offen. Das Intro ist nun beendet");
|
|
|
|
keller.puzzles.add(door);
|
|
|
|
puzzles.add(door);
|
|
|
|
|
|
|
|
//Item Object
|
|
|
|
schluessel = new Item("Schluessel");
|
|
|
|
schluessel.setHiddenFlag(false);
|
|
|
|
schluessel.setPortableFlag(true);
|
|
|
|
schluessel.setDescription("Der Schl�ssel ist kalt und klein. Vielleicht hast du Gl�ck und er passt ins Schloss. Versuche es zu �ffnen!");
|
|
|
|
schloss.addItem(schluessel);
|
|
|
|
keller.items.add(schluessel);
|
|
|
|
items.add(schluessel);
|
|
|
|
|
|
|
|
door.setDependency(schloss);
|
|
|
|
door.setDependencyText("Du musst erst das Schloss der Kette knacken um die Tür öffnen zu können");
|
|
|
|
|
|
|
|
//Item Object
|
|
|
|
stahlschluessel = new Item("Stahlschluessel");
|
|
|
|
stahlschluessel.setHiddenFlag(false);
|
|
|
|
stahlschluessel.setPortableFlag(false);
|
|
|
|
stahlschluessel.setDescription("Ein Stahlschlüssel");
|
|
|
|
intro.items.add(stahlschluessel);
|
|
|
|
items.add(stahlschluessel);
|
|
|
|
|
|
|
|
rooms.add(intro);
|
|
|
|
rooms.add(keller);
|
|
|
|
story.add("Dein ganzer K�rper schmerzt, du liegst auf Betonboden. Du f�ngst laut an zu husten und Staubklumpen fliegen aus deinem Mund. Du �ffnest langsam und nur schwer die Augen, "
|
|
|
|
+ "doch es ist fast gar nichts zu sehen. Die einzige Lichtquelle ist ein kleines Fenster �ber dir, durch die ein schwacher Mondschein f�llt. Es ist also Nachts... "
|
|
|
|
+ "Langsam versuchst du dich an die fast komplette Dunkelheit zu gew�hnen und erkennst, dass du dich in einem kleinen dir unbekannten Raum befindest. Dich packt die Angst! "
|
|
|
|
+ "Was ist passiert, wo bist du und wie bist du hier gelandet?"
|
|
|
|
+ "Du nimmst die Stahlkette in die Hand. Sie ist schwer und verrostet. Mit den H�nden tastest du dich voran bis an die Heizung, wo du ein Schloss an der Kette entdeckst."
|
|
|
|
+ "Das Mondlicht ist nur sehr schwach, um den Raum zu begutachten. Du gehst in die Knie und tastest mit deinem H�nden wild und in Panik am Betonboden. "
|
|
|
|
+ "Pl�tzlich st��t du auf einen kleinen Gegenstand, der sich tats�chlich anf�hlt wie ein Schl�ssel. Du solltest ihn aufheben");
|
|
|
|
|
|
|
|
currentRoom = intro;
|
|
|
|
stoppFlag = false;
|
|
|
|
inventory = new ArrayList<Item>();
|
|
|
|
log("JSON: " + generateJSON());
|
|
|
|
public Puzzle getPuzzle(String s) {
|
|
|
|
for (int i = 0; i < items.size(); i++) {
|
|
|
|
if (items.get(i).getName().toLowerCase().equals(s.toLowerCase())) {
|
|
|
|
if (currentRoom.getPuzzles().contains(puzzles.get(i).getId())) {
|
|
|
|
return puzzles.get(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getId()
|
|
|
|
{
|
|
|
|
return deviceId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setVariables() throws Exception {
|
|
|
|
|
|
|
|
readJSON();
|
|
|
|
|
|
|
|
log("Readjson fertig");
|
|
|
|
|
|
|
|
|
|
|
|
currentRoom = rooms.get(0);
|
|
|
|
stoppFlag = false;
|
|
|
|
inventory = new ArrayList<>();
|
|
|
|
|
|
|
|
//log("JSON: " + writeJSON());
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
|
|
|
|
|
|
|
@@ -208,13 +168,11 @@ public class Game { |
|
|
|
String jsonStringPuzzle = objectMapper.writeValueAsString(jsonMap.get("puzzle"));
|
|
|
|
String jsonStringStory = objectMapper.writeValueAsString(jsonMap.get("story"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log("Item: " + jsonStringItem);
|
|
|
|
log("Room: " + jsonStringRoom);
|
|
|
|
log("Story: " + jsonStringStory);
|
|
|
|
log("Puzzle: " + jsonStringPuzzle);
|
|
|
|
|
|
|
|
|
|
|
|
String[] st = objectMapper.readValue(jsonStringStory, String[].class);
|
|
|
|
log("Story Array OK");
|
|
|
|
Item[] it = objectMapper.readValue(jsonStringItem, Item[].class);
|
|
|
@@ -223,32 +181,24 @@ public class Game { |
|
|
|
log("Puzzle Array OK");
|
|
|
|
Room[] ro = objectMapper.readValue(jsonStringRoom, Room[].class);
|
|
|
|
log("Room Array OK");
|
|
|
|
|
|
|
|
for(int i=0; i < ro.length; i++)
|
|
|
|
{
|
|
|
|
|
|
|
|
for (int i = 0; i < ro.length; i++) {
|
|
|
|
log("Room: " + ro[i].getName());
|
|
|
|
log("Description: " + ro[i].getDescription());
|
|
|
|
}
|
|
|
|
|
|
|
|
for(int i=0; i < it.length; i++)
|
|
|
|
{
|
|
|
|
|
|
|
|
for (int i = 0; i < it.length; i++) {
|
|
|
|
log("Item: " + it[i].getName());
|
|
|
|
log("Description: " + it[i].getDescription());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=0; i < pu.length; i++)
|
|
|
|
{
|
|
|
|
|
|
|
|
for (int i = 0; i < pu.length; i++) {
|
|
|
|
log("Puzzle: " + pu[i].getName());
|
|
|
|
log("Description: " + pu[i].getDescription());
|
|
|
|
log("DependencyText: " + pu[i].getDependencyText());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=0; i < st.length; i++)
|
|
|
|
{
|
|
|
|
|
|
|
|
for (int i = 0; i < st.length; i++) {
|
|
|
|
log("Story: " + st[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -259,10 +209,10 @@ public class Game { |
|
|
|
log("currentRoom: " + currentRoom.getName());
|
|
|
|
|
|
|
|
for (int i = 0; i < currentRoom.getPuzzles().size(); i++) {
|
|
|
|
log("Puzzle im Raum: " + currentRoom.getPuzzles().get(i).getName());
|
|
|
|
log("Puzzle im Raum: " + currentRoom.getPuzzles().get(i)); //getPuzzles().get(i).getName());
|
|
|
|
}
|
|
|
|
for (int i = 0; i < currentRoom.getItems().size(); i++) {
|
|
|
|
log("Item im Raum: " + currentRoom.getItems().get(i).getName());
|
|
|
|
log("Item im Raum: " + currentRoom.getItems().get(i)); //getItems().get(i).getName());
|
|
|
|
}
|
|
|
|
|
|
|
|
input = input.replace("ä", "ae");
|
|
|
@@ -274,11 +224,11 @@ public class Game { |
|
|
|
inputArray = input.split(" ");
|
|
|
|
|
|
|
|
for (String s : inputArray) {
|
|
|
|
if (currentRoom.getItem(s) != null) {
|
|
|
|
itemName = currentRoom.getItem(s).getName();
|
|
|
|
if (getItem(s) != null) {
|
|
|
|
itemName = getItem(s).getName();
|
|
|
|
log("itemName: " + itemName);
|
|
|
|
} else if (currentRoom.getPuzzle(s) != null) {
|
|
|
|
puzzleName = currentRoom.getPuzzle(s).getName();
|
|
|
|
} else if (getPuzzle(s) != null) {
|
|
|
|
puzzleName = getPuzzle(s).getName();
|
|
|
|
log("PuzzleName: " + puzzleName);
|
|
|
|
} else {
|
|
|
|
intentName = s;
|
|
|
@@ -301,10 +251,10 @@ public class Game { |
|
|
|
//intent
|
|
|
|
case "inspectintent":
|
|
|
|
log("Switch: InspectIntent");
|
|
|
|
if (currentRoom.getItem(itemName) != null) {
|
|
|
|
inspect(currentRoom.getItem(itemName));
|
|
|
|
} else if (currentRoom.getPuzzle(puzzleName) != null) {
|
|
|
|
inspect(currentRoom.getPuzzle(puzzleName));
|
|
|
|
if (getItem(itemName) != null) {
|
|
|
|
inspect(getItem(itemName));
|
|
|
|
} else if (getPuzzle(puzzleName) != null) {
|
|
|
|
inspect(getPuzzle(puzzleName));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
@@ -319,15 +269,15 @@ public class Game { |
|
|
|
//intent
|
|
|
|
case "takeintent":
|
|
|
|
log("Switch: TakeIntent");
|
|
|
|
if (currentRoom.getItem(itemName) != null) {
|
|
|
|
take(currentRoom.getItem(itemName));
|
|
|
|
if (getItem(itemName) != null) {
|
|
|
|
take(getItem(itemName));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
//intent
|
|
|
|
case "openintent":
|
|
|
|
log("Switch: OpenIntent");
|
|
|
|
if (currentRoom.getPuzzle(puzzleName) != null) {
|
|
|
|
open(currentRoom.getPuzzle(puzzleName));
|
|
|
|
if (getPuzzle(puzzleName) != null) {
|
|
|
|
open(getPuzzle(puzzleName));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
//intent
|
|
|
@@ -344,8 +294,8 @@ public class Game { |
|
|
|
if (itemName == null && puzzleName == null) {
|
|
|
|
resetGame();
|
|
|
|
for (int i = 0; i < currentRoom.puzzles.size(); i++) {
|
|
|
|
if (currentRoom.puzzles.get(i).getNextRoom() != null) {
|
|
|
|
setRoom(currentRoom.puzzles.get(i).getNextRoom());
|
|
|
|
if (getPuzzleById(currentRoom.puzzles.get(i)).getNextRoom() != null) {
|
|
|
|
setRoom(getRoomById(getPuzzleById(currentRoom.puzzles.get(i)).getNextRoom()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -364,6 +314,34 @@ public class Game { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Room getRoomById(int i) {
|
|
|
|
for (int j = 0; j < rooms.size(); j++) {
|
|
|
|
if (rooms.get(j).getId() == i) {
|
|
|
|
return rooms.get(j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Item getItemById(int i) {
|
|
|
|
for (int j = 0; j < items.size(); j++) {
|
|
|
|
if (items.get(j).getId() == i) {
|
|
|
|
return items.get(j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Puzzle getPuzzleById(int i) {
|
|
|
|
for (int j = 0; j < puzzles.size(); j++) {
|
|
|
|
if (puzzles.get(j).getId() == i) {
|
|
|
|
return puzzles.get(j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void log(String s) throws Exception {
|
|
|
|
String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/Log";
|
|
|
|
URL obj = new URL(url);
|
|
|
@@ -414,7 +392,7 @@ public class Game { |
|
|
|
log("inspect(" + currentPuzzle.getName() + ")");
|
|
|
|
|
|
|
|
for (int i = 0; i < currentRoom.getItems().size(); i++) {
|
|
|
|
if (currentRoom.getPuzzles().get(i) == currentPuzzle) {
|
|
|
|
if (currentRoom.getPuzzles().get(i) == currentPuzzle.getId()) {
|
|
|
|
say(currentPuzzle.getDescription());
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -424,7 +402,7 @@ public class Game { |
|
|
|
log("inspect(" + currentItem.getName() + ")");
|
|
|
|
|
|
|
|
for (int i = 0; i < currentRoom.getItems().size(); i++) {
|
|
|
|
if (currentRoom.getItems().get(i) == currentItem) {
|
|
|
|
if (currentRoom.getItems().get(i) == currentItem.getId()) {
|
|
|
|
say(currentItem.getDescription());
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -512,13 +490,13 @@ public class Game { |
|
|
|
say("ist bereits geöffnet");
|
|
|
|
if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
|
|
|
|
{
|
|
|
|
setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum
|
|
|
|
setRoom(getRoomById(currentPuzzle.getNextRoom())); // wechselt in den nächsten Raum
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!currentPuzzle.hasDependency() || currentPuzzle.getDependency().isSolved()) // ist keine Abhängigkeit vorhanden oder aber die Abhängigkeit ist gelöst
|
|
|
|
if (!currentPuzzle.hasDependency() || getPuzzleById(currentPuzzle.getDependency()).isSolved()) // ist keine Abhängigkeit vorhanden oder aber die Abhängigkeit ist gelöst
|
|
|
|
{
|
|
|
|
if (currentPuzzle.getItems().isEmpty() || getInventory().containsAll(currentPuzzle.getItems())) // keine Items zum lösen notwendig oder alle Items zum lösen befinden sich im Inventar
|
|
|
|
if (currentPuzzle.getItems().isEmpty() || checkPuzzleItemsInInventory(currentPuzzle.getId())) // keine Items zum lösen notwendig oder alle Items zum lösen befinden sich im Inventar
|
|
|
|
{
|
|
|
|
currentPuzzle.setSolved(true); // auf gelöst setzen
|
|
|
|
say(currentPuzzle.getSolvedText()); // Lösungstext
|
|
|
@@ -530,7 +508,7 @@ public class Game { |
|
|
|
|
|
|
|
if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
|
|
|
|
{
|
|
|
|
setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum
|
|
|
|
setRoom(getRoomById(currentPuzzle.getNextRoom())); // wechselt in den nächsten Raum
|
|
|
|
}
|
|
|
|
} else // Item zum lösen fehlt
|
|
|
|
{
|
|
|
@@ -538,7 +516,7 @@ public class Game { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!currentPuzzle.getDependency().isSolved()) // Abhängigkeit nicht gelöst
|
|
|
|
if (!getPuzzleById(currentPuzzle.getDependency()).isSolved()) // Abhängigkeit nicht gelöst
|
|
|
|
{
|
|
|
|
say(currentPuzzle.getDependencyText());
|
|
|
|
}
|
|
|
@@ -558,16 +536,19 @@ public class Game { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Room> getRooms() {
|
|
|
|
return rooms;
|
|
|
|
public boolean checkPuzzleItemsInInventory(int puzzleId) {
|
|
|
|
Puzzle p = getPuzzleById(puzzleId);
|
|
|
|
for (int i = 0; i < p.getItems().size(); i++) {
|
|
|
|
if (inventory.contains(getItemById(p.getItems().get(i)))) {
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Item> getInventory() {
|
|
|
|
return inventory;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<String> getStory() {
|
|
|
|
return story;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|