cicaprojekt/cicaprojekt/Scale.java

134 lines
3.7 KiB
Java

package cicaprojekt;
import java.util.Stack;
/**
* A játékban megjelenő mérlegeket reprezentáló osztály.
*/
public class Scale extends Field {
/**
* Az a <code>Gate</code> 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 <code>PlayerBase</code> 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 <code>PlayerBase</code> 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ó <code>Box</code> 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ú <code>Tile</code>-on lehet
* ZPM, hamissal, ha nem.
*
* @return false
*/
@Override
public boolean canHazZPM() {
return false;
}
}