import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import java.net.HttpURLConnection; public class Game { private static ArrayList rooms = new ArrayList(); private static ArrayList inventory = new ArrayList(); private static ArrayList story = new ArrayList(); private boolean stoppFlag = false; String[] inputArray = null; String itemName = null; String intentName = null; String puzzleName = null; String input = null; Room currentRoom = null; Room intro; Room keller; Puzzle durchgang; Puzzle schloss; Puzzle door; Item schluessel; Item stahlschluessel; public Game() { try { startGame(); } catch (Exception ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } public void setVariables() { // 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. "); 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); //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); 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); 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(); } public void play() throws Exception { log("play()"); log("Input: " + input); input = input.replace("ä", "ae"); input = input.replace("ü", "ue"); input = input.replace("ö", "oe"); input = input.replace("ß", "ss"); if (input.contains(" ")) { inputArray = input.split(" "); for (String s : inputArray) { if (currentRoom.getItem(s) != null) { itemName = currentRoom.getItem(s).getName(); log("itemName: " + itemName); } else if (currentRoom.getPuzzle(s) != null) { puzzleName = currentRoom.getPuzzle(s).getName(); log("PuzzleName: " + puzzleName); } else { intentName = s; log("intentName: " + intentName); } } } else { intentName = input; log("intentName: " + intentName); } switch (intentName.toLowerCase()) { //intent case "lookaroundintent": log("Switch: lookAroundIntent"); if (itemName == null && puzzleName == null) { lookaround(); } break; //intent case "inspectintent": log("Switch: inspectintent"); if (itemName != null) { inspect(itemName); } else if (puzzleName != null) { inspect(puzzleName); } break; //intent case "examineintent": log("Switch: ExamineIntent"); if (itemName == null && puzzleName == null) { examine(); } break; //intent case "takeintent": log("Switch: TakeIntent"); if (itemName != null) { take(currentRoom.getItem(itemName)); } break; //intent case "openintent": log("Switch: OpenIntent"); if (puzzleName != null) { open(currentRoom.getPuzzle(puzzleName)); } break; //intent case "resetintent": log("Switch: ResetIntent"); if (itemName == null && puzzleName == null) { resetGame(); } break; //intent case "skipintent": log("Switch: SkipIntent"); 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()); } } } break; } itemName = null; intentName = null; puzzleName = null; log("stoppFlag: " + stoppFlag); if (stoppFlag == true) { endGame(); } } public void log(String s) throws Exception { String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/Log"; URL obj = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection(); //add reuqest header httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("User-Agent", "Mozilla/5.0"); httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // Send post request httpConn.setDoOutput(true); DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream()); String urlParameters = "log=" + s; wr.writeBytes(urlParameters); wr.flush(); wr.close(); BufferedReader in = new BufferedReader( new InputStreamReader(httpConn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); } public void lookaround() throws Exception { log("lookaround() "); say(currentRoom.getDescription()); } public void startGame() throws Exception { log("startGame() "); for (int i = 0; i < story.size(); i++) { say(story.get(i)); } } public void resetGame() throws Exception { log("resetGame() "); startGame(); } public void inspect(String s) throws Exception { log("inspect(" + s + ") "); Item currentItem=null; if(currentRoom.getItem(s) != null) { currentItem= currentRoom.getItem(s); log("currentItem: " + currentItem.getName()); say(currentItem.getDescription()); } Puzzle currentPuzzle=null; if(currentRoom.getPuzzle(s) != null) { currentPuzzle = currentRoom.getPuzzle(s); log("currentPuzzle " + currentPuzzle.getName()); say(currentPuzzle.getDescription()); } } public void endGame() throws Exception { log("endGame() "); say("Glückwunsch das Spiel ist beendet!"); setVariables(); } public void sendPost(String s) throws Exception { s = s.replace(" ", "%20"); String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/IO"; URL obj = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection(); //add reuqest header httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("User-Agent", "Mozilla/5.0"); httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // Send post request httpConn.setDoOutput(true); DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream()); String urlParameters = "alexaText=" + s; wr.writeBytes(urlParameters); wr.flush(); wr.close(); BufferedReader in = new BufferedReader( new InputStreamReader(httpConn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); } public void say(String s) throws Exception { log("say(" + s + ") "); try { sendPost(s); } catch (Exception ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } public void setInput(String s) throws Exception { log("setInput(" + s + ") "); input = s; } public void setRoom(Room nextRoom) throws Exception { log("setRoom(" + nextRoom.getName() + ") " ); currentRoom = nextRoom; say(currentRoom.getDescription()); } public void examine() throws Exception { log("examine() : " + getInventory()); if (getInventory().isEmpty()) { say("Deine Taschen sind leer"); } else if (inventory.size() >= 1) { say("In deinen Taschen befindet sich: "); } inventory.forEach((bag) -> { try { say(bag.getName()); } catch (Exception ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } }); } public void open(Puzzle currentPuzzle) throws Exception { log("open(" + currentPuzzle.getName() + ") "); if (currentPuzzle.isSolved()) // bereits gelöst { 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 } return; } if (!currentPuzzle.hasDependency() || 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 { currentPuzzle.setSolved(true); // auf gelöst setzen say(currentPuzzle.getSolvedText()); // Lösungstext if (currentRoom.getGameoverFlag() || currentPuzzle.getGameOverFlag()) // Wenn es das letzte Rätsel im Spiel war oder man vom Angreifer erwischt wurde { stoppFlag = true; // Spiel wird nun beendet } 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 } } else // Item zum lösen fehlt { say("das geht leider nicht, da fehlt noch etwas"); } } if (!currentPuzzle.getDependency().isSolved()) // Abhängigkeit nicht gelöst { say(currentPuzzle.getDependencyText()); } } public void take(Item currentItem) throws Exception { log("take(" + currentItem.getName() + ") "); if ((!inventory.contains(currentItem)) && (currentItem.isPortableFlag() == true)) { inventory.add(currentItem); currentRoom.items.remove(currentItem); say(currentItem.getName() + " wurde deiner Tasche hinzugefuegt"); } else if (currentItem.isPortableFlag() == false) { say("Das Item kann nicht mitgenommen werden"); } else { say("Das Item befindet sich bereits in deiner Tasche!"); } } public ArrayList getRooms() { return rooms; } public ArrayList getInventory() { return inventory; } public ArrayList getStory() { return story; } }