package cicaprojekt; import java.util.Stack; /** * A játékban megjelenő mérlegeket reprezentáló osztály. */ public class Scale extends Field { /** * Az a Gate példány, amelyhez a mérleg van kötve. */ private Gate gateConnected; /** * A mérleg súlyhatára, efelett nyitja ki a hozzá tartozó kaput. */ private int threshold; /** * A mérlegen lévő súly. */ private int weight; /** * Az osztály konstruktora. Létrehoz a mérlegen egy üres dobozrakást. * * @param gate a kapu, amelyet a mérleg nyit * @param threshold a mérleg súlyhatára */ public Scale(Gate gate, int threshold) { gateConnected = gate; this.threshold = threshold; boxStack = new Stack<>(); } /** * A függvény igazzal tér vissza, ha a mérlegre rá lehet lépni, * hamissal, ha nem. Ezt a rajta lévő dobozok alapján dönti el. * * @return true, ha a dobozrakás üres * false, egyébként */ @Override public boolean isSteppable() { return boxStack.isEmpty(); } /** * A függvény akkor hívódik meg, ha egy személy rálép a mérlegre. * Ekkor a mérleghez tartozó kapu kinyílik. * * @param playerBase az a PlayerBase példány, amely * rálépett a mérlegre */ @Override public void onEntry(PlayerBase playerBase) { super.onEntry(playerBase); gateConnected.setOpen(true); } /** * A függvény akkor hívódik meg, ha egy személy lelépett a mérlegről. * Ilyenkor a mérleghez tartozó kapu bezáródik. * * @param playerBase az a PlayerBase példány, amely * lelépett a mérlegről */ @Override public void onExit(PlayerBase playerBase) { gateConnected.setOpen(false); } /** * A függvény eltávolít egy dobozt a mérlegen lévő dobozrakás tetejéről. * Ennek súlyát levonja a mérlegen lévő súlyból, majd visszatér a levett * dobozzal. Amennyiben nem volt egydoboz sem a mérlegen, úgy null-al tér vissza. * * @return a levett doboz, ha volt a mérlegen legalább egy * null, egyébként * @see #stackChanged() */ @Override public Box getABox() { if (boxStack.isEmpty()) return null; weight -= boxStack.peek().weight(); stackChanged(); return boxStack.pop(); } /** * A függvény rárak egy dobozt a mérlegen lévő dobozrakás tetejére, * majd ennek súlyával frissíti a mérlegen lévő súlyt is. * * @param box a rárakandó Box példány * @see #stackChanged() */ @Override public void putABox(Box box) { if (box == null) return; boxStack.push(box); weight += box.weight(); stackChanged(); } /** * Akkor hívódik meg, ha egy új doboz került a mérlegre, vagy egy doboz * lekerült róla. Ilyenkor ellenőrzi, hogy a súlyhatár át van-e lépve, * a mérleghez tartozó kaput pedig ennek megfelelően beállítja. * * @see Gate#setOpen(boolean) */ private void stackChanged() { if (weight >= threshold) gateConnected.setOpen(true); else gateConnected.setOpen(false); } /** * A függvény igazzal tér vissza, ha az adott típusú Tile-on lehet * ZPM, hamissal, ha nem. * * @return false */ @Override public boolean canHazZPM() { return false; } }