/* * The MIT License * * Copyright 2016 MrMcX. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package dungeon; import java.util.LinkedList; import java.util.List; import util.Counter; import util.Dice; /** * * @author MrMcX */ public class Room { /** * The unique number of the room */ public int number; /** * The list of exits in this room */ public Exit[] exits; /** * The room generation type */ public Dungeon.Type type; /** * Whether it is a room or a corridor */ public boolean isRoom, /** * Whether it has monsters, */ hasMonster, /** * traps, */ hasTrap, /** * magic, */ hasMagic, /** * specials, */ hasSpecial, /** * or treasures */ hasTreasure = false; /** * The enemy in this room */ public Enemy monster; /** * The treasure in this room */ public Treasure treasure; /** * The trap in this room */ public Trap trap; /** * Room description */ public String desc, /** * magic description */ magicPhenomenon, /** * special description */ specialPhenomenon = null; /** * Constructs a room with a given predecessor, number of exits, description and counter * @param predecessor Predecessor room * @param numberOfExits Number of exits * @param room Whether it is a room * @param desc Description of room * @param c Room counter */ public Room(Exit predecessor, int numberOfExits, boolean room, String desc, Counter c){ exits = new Exit[numberOfExits]; exits[0] = predecessor; this.isRoom = room; this.desc = desc; number = 0; } /** * Generates the content of the room * @param c Room counter * @param type Environment type * @return Returns more rooms to generate */ public List generate(Counter c, Dungeon.Type type){ number = c.Next(); List list = new LinkedList(); for(int i = 0; i < exits.length; i++){ if(exits[i] == null){ Exit predecessor = new Exit(this); Room newRoom = RandomRoom(false, predecessor, c, type); exits[i] = new Exit(newRoom, predecessor.type); list.add(newRoom); } } SetContents(type); return list; } private void SetContents(Dungeon.Type type){ if(isRoom){ switch(Dice.Roll(6, 2)){ case 2: case 3: return; case 4: hasMonster = true; monster = new Enemy(type); return; case 5: hasTrap = true; trap = new Trap(); case 6: hasTreasure = true; treasure = new Treasure(); return; case 7: hasMagic = true; // TODO: generate magic here return; case 8: hasSpecial = true; // TODO: generate special here return; case 9: hasMonster = true; hasTrap = true; monster = new Enemy(type); trap = new Trap(); return; case 10: hasMonster = true; hasTreasure = true; monster = new Enemy(type); treasure = new Treasure(); return; case 11: hasMonster = true; hasMagic = true; monster = new Enemy(type); // TODO: generate magic here return; case 12: hasTrap = true; hasTreasure = true; trap = new Trap(); treasure = new Treasure(); return; } } else { switch(Dice.Roll(6, 1)){ case 1: case 2: case 3: return; case 4: hasMonster = true; monster = new Enemy(type); return; case 5: hasTrap = true; trap = new Trap(); return; case 6: hasTreasure = true; treasure = new Treasure(); return; } } this.type = type; } @Override public String toString(){ if(!isRoom){ return "Gang " + number; } else if(Dungeon.Natural(type)){ return "Höhle " + number; } else { return "Raum " + number; } } /** * Returns a long description * @return Long description string */ public String toLongString(){ String out = ""; if(isRoom){ out += "Raum "; } else { out += "Gang "; } out += "Nummer " + number + ": " + desc + "\n" + "Ausgänge:\n"; for(Exit x : exits){ out += x.toLongString(); } if(hasMonster){ out += "Gegner:\n- " + monster.toString() + "\n"; } if(hasTrap){ out += "Fallen:\n- " + trap + "\n"; } if(hasMagic){ out += "Magische Phänomene:\n- " + magicPhenomenon + "\n"; } if(hasSpecial){ out += "Besondere Phänomene:\n- " + specialPhenomenon + "\n"; } if(hasTreasure){ out += "Fundsache:\n- " + treasure + "\n"; } return out; } /** * Returns a short description * @return Short description string */ public String toShortString(){ if(isRoom){ return "Raum Nummer " + number; } else { return "Gang Nummer " + number; } } private static Room RoomBigExits(Exit predecessor, Counter c, Dungeon.Type type){ int rand = Dice.Roll(3, 1); if(Dungeon.Natural(type)){ return new Room(predecessor, rand + 1, true, "große Höhle mit " + rand + " Ausgängen", c); } else { return new Room(predecessor, rand + 1, true, "großer Raum mit " + rand + " Ausgängen", c); } } private static Room RoomSmallExits(Exit predecessor, Counter c, Dungeon.Type type){ int rand = Dice.Roll(3, 1); if(Dungeon.Natural(type)){ return new Room(predecessor, rand + 1, true, "kleine Höhle mit " + rand + " Ausgängen", c); } else { return new Room(predecessor, rand + 1, true, "kleiner Raum mit " + rand + " Ausgängen", c); } } private static Room RoomBigNoExits(Exit predecessor, Counter c, Dungeon.Type type){ if(Dungeon.Natural(type)){ return new Room(predecessor, 1, true, "große Höhle ohne Ausgang", c); } else { return new Room(predecessor, 1, true, "großer Raum ohne Ausgang", c); } } private static Room RoomBigExitsStair(Exit predecessor, Counter c, Dungeon.Type type){ int rand = Dice.Roll(2, 1); if(Dungeon.Natural(type)){ return new Room(predecessor, rand + 2, true, "große Höhle mit " + rand + " Ausgängen und einer Treppe", c); } else { return new Room(predecessor, rand + 2, true, "großer Raum mit " + rand + " Ausgängen und einer Treppe", c); } } private static Room RoomSmallNoExits(Exit predecessor, Counter c, Dungeon.Type type){ if(Dungeon.Natural(type)){ return new Room(predecessor, 1, true, "kleine Höhle ohne Ausgang", c); } else { return new Room(predecessor, 1, true, "kleiner Raum ohne Ausgang", c); } } private static Room RoomSmallExitsStair(Exit predecessor, Counter c, Dungeon.Type type){ int rand = Dice.Roll(2, 1); if(Dungeon.Natural(type)){ return new Room(predecessor, rand + 2, true, "kleine Höhle mit " + rand + " Ausgängen und einer Treppe", c); } else { return new Room(predecessor, rand + 2, true, "kleiner Raum mit " + rand + " Ausgängen und einer Treppe", c); } } private static Room RoomGiant(Exit predecessor, Counter c, Dungeon.Type type){ int rand = Dice.Roll(2, 1); if(Dungeon.Natural(type)){ return new Room(predecessor, rand + 1, true, "gigantische Höhle mit " + rand + " Ausgängen", c); } else { return new Room(predecessor, rand + 1, true, "gigantischer Raum mit " + rand + " Ausgängen", c); } } private static Room CorridorStraight(Exit predecessor, Counter c){ return new Room(predecessor, 2, false, "gerader Gang", c); } private static Room CorridorRight(Exit predecessor, Counter c){ return new Room(predecessor, 2, false, "rechts abbiegender Gang", c); } private static Room CorridorLeft(Exit predecessor, Counter c){ return new Room(predecessor, 2, false, "links abbiegender Gang", c); } private static Room CrossingT(Exit predecessor, Counter c){ return new Room(predecessor, 3, false, "T-Kreuzung mit Abzweigungen nach links und rechts", c); } private static Room Crossing(Exit predecessor, Counter c){ return new Room(predecessor, 4, false, "Kreuzung, die in alle Richtungen weitergeht", c); } private static Room DeadEnd(Exit predecessor, Counter c){ return new Room(predecessor, 1, false, "Sackgasse", c); } /** * Generates a random room * @param first Whether it is the first room * @param predecessor Predecessor room * @param c Room counter * @param type Environment type * @return random room */ public static Room RandomRoom(boolean first, Exit predecessor, Counter c, Dungeon.Type type){ int number; if(first){ number = Dice.Roll(6, 1); } else { number = Dice.Roll(20, 1); } switch(number){ case 1: case 2: case 3: return RoomBigExits(predecessor, c, type); case 4: case 5: case 6: return RoomSmallExits(predecessor, c, type); case 7: return RoomBigNoExits(predecessor, c, type); case 8: case 9: return RoomBigExitsStair(predecessor, c, type); case 10: return RoomSmallNoExits(predecessor, c, type); case 11: case 12: return RoomSmallExitsStair(predecessor, c, type); case 13: case 14: return RoomGiant(predecessor, c, type); case 15: return CorridorStraight(predecessor, c); case 16: return CorridorRight(predecessor, c); case 17: return CorridorLeft(predecessor, c); case 18: return CrossingT(predecessor, c); case 19: return Crossing(predecessor, c); case 20: return DeadEnd(predecessor, c); } return null; } }