package cicaprojekt; import java.awt.*; import java.util.HashMap; import java.util.Map; /** * A játékban megjelenő csillagkapukat reprezentáló osztály. */ public class Stargate { /** * Egy darab sárga csillagkapu létrehozása és tárolása. */ public static final Stargate yellowStargate = new Stargate("Yellow Stargate"); /** * Egy darab kék csillagkapu létrehozása és tárolása. */ public static final Stargate blueStargate = new Stargate("Blue Stargate"); /** * Egy darab piros csillagkapu létrehozása és tárolása. */ public static final Stargate redStargate = new Stargate("Red Stargate"); /** * Egy darab zöld csillagkapu létrehozása és tárolása. */ public static final Stargate greenStargate = new Stargate("Green Stargate"); /** * A csillagkapu párjának, a másik csillagkapunak a tárolása. */ public Stargate other; /** * A csillagkapu létrehozottságának a tárolása. */ private boolean isSpawned; /** * A csillagkapu aktuális helyének a tárolása. */ private Wall currentWall; /** * A csillagkapu kilépési irányának a tárolása. */ private Direction exitDirection; /** * A csillagkapu nevének a tárolása. */ private String name; /** * A csillagkapukat és színüket tároló Map. */ private static Map stargates = new HashMap<>(); /** * Az osztály konstruktora. * * @param name a csillagkapu neve */ private Stargate(String name) { isSpawned = false; this.name = name; } /** * A csillagkapuk inicializálása. Az egyes párok meghatározása és a * Map-ben való eltárolása. */ public static void init() { yellowStargate.other = blueStargate; blueStargate.other = yellowStargate; redStargate.other = greenStargate; greenStargate.other = redStargate; stargates.put(Color.YELLOW, yellowStargate); stargates.put(Color.BLUE, blueStargate); stargates.put(Color.RED, redStargate); stargates.put(Color.GREEN, greenStargate); } /** * A kapott szín alapján visszatér a kér csillagkapuval. * * @param color csillagkapu színe * @return elvárt csillagkapu */ public static Stargate get(Color color) { return stargates.get(color); } /** * A csillagkapu aktuális helyével tér vissza. * * @return aktuális fal */ public Wall getCurrentWall() { return currentWall; } /** * A csillagkapu aktuális helyének beállítása megadott fal és megadott irány * alapján. * * @param wall megadott fal * @param direction megadott irány */ public void setCurrentWall(Wall wall, Direction direction) { currentWall = wall; if(direction != null) exitDirection = Direction.invert(direction); isSpawned = wall != null; } /** * Egy csillagkapuról lekérdezi, hogy létre van-e hozva. * * @return true, ha létre van hozva * false, egyébként */ public boolean isSpawned() { return isSpawned; } /** * Egy csillagkapuról lekérdezi, hogy nyitva van-e. Ezt annak függvényében * dönti el, hogy a csillagkapu kilépési irányában lévő csempére rá lehet-e * lépni. * * @return true, ha rá lehet lépni * false, egyébként */ public boolean isOpen() { if(isSpawned & other.isSpawned) return other.getCurrentWall().getAdjacentTile(other.getExitDirection()).isSteppable(); return false; } /** * Visszatér a csillagkapu kilépési irányával. * * @return kilépési irány */ private Direction getExitDirection() { return exitDirection; } /** * A játékban való teleportálást implementáló függvény. * Ha a csillagkapu átjárható, akkor a belépő személy átkerül a kilépési * pontjára, egyébként marad a helyén. * * @param player a belépő személy */ public void teleport(PlayerBase player) { if(isOpen()) { Tile exit = other.getCurrentWall().getAdjacentTile(other.getExitDirection()); player.setCurrentTile(exit); exit.onEntry(player); } else player.setCurrentTile(this.getCurrentWall()); } /** * Ha a csillagkapu létre van hozva, akkor a nevével és az aktuális * tartózkodási helyével tér vissza, ha nincs létre hozva, akkor * pedig a nevével és a "not spawned" szöveggel. */ @Override public String toString() { if(isSpawned) return String.format("%s: %s", name, currentWall); else return String.format("%s: not spawned", name); } /** * Visszatér a csillagkapu nevével. * * @return a csillagkapu neve */ public String getName() { return name; } }