Select Git revision
getRouteRules.py
Field.java 5.57 KiB
package mapobjs.defobjs;
import java.util.ArrayList;
import exceptions.DamagedException;
import game.Direction;
import mapobjs.movobjs.Bullet;
import mapobjs.movobjs.Player;
import mapobjs.movobjs.Replicator;
public class Field implements IElement {
private ArrayList<DefaultElement> toRemove = new ArrayList<>();
private ArrayList<DefaultElement> elements = new ArrayList<DefaultElement>();
public Field[] neighbours = new Field[4];
public Field() {
}
public boolean addElement (DefaultElement elem){
elements.add(elem);
return true;
}
public void setNeighbour (Direction dir, Field ne ){
switch (dir) {
case UP:
neighbours[0] = ne;
break;
case RIGHT:
neighbours[1] = ne;
break;
case DOWN:
neighbours[2] = ne;
break;
case LEFT:
neighbours[3] = ne;
break;
}
}
public Field getNeighbour(Direction dir){
switch (dir) {
case UP:
return neighbours[0];
case RIGHT:
return neighbours[1];
case DOWN:
return neighbours[2];
case LEFT:
return neighbours[3];
default:
return null;
}
}
@Override
public boolean meet(Player colonel) {
boolean isValid = true;
for (DefaultElement defaultElement : elements) {
if (!defaultElement.meet(colonel)) {
for(DefaultElement element : elements)
{
element.leave(colonel);
if(element == defaultElement)
{
break;
}
}
isValid = false;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
if(isValid)
{
this.elements.add(colonel);
}
return isValid;
}
@Override
public boolean meet(Bullet bullet) {
boolean isValid = true;
for (DefaultElement defaultElement : elements) {
if (!defaultElement.meet(bullet)) {
isValid = false;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
/*
* No need to add bullet to the list of elements,
* because it moves through the field in atomic time.
*/
return isValid;
}
@Override
public boolean meet(Box box) {
if(box == null)
{
return false;
}
for (DefaultElement defaultElement : elements) {
try {
if (!defaultElement.meet(box)) {
for(DefaultElement element : elements)
{
element.leave();
if(element == defaultElement)
{
break;
}
}
return false;
}
} catch (DamagedException e) {
return true;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
this.elements.add(box);
return true;
}
@Override
public boolean leave(Player colonel) {
boolean isValid = true;
for (DefaultElement defaultElement : elements) {
if (!defaultElement.leave(colonel)) {
isValid = false;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
if(isValid)
{
this.elements.remove(colonel);
return true;
}
else
return false;
}
@Override
public Box leave() {
Box tmp = null;
for (DefaultElement defaultElement : elements) {
Box box = defaultElement.leave();
if (box != null) {
tmp = box;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
if(tmp != null)
{
this.elements.remove(tmp);
return tmp;
}
else
{
return null;
}
}
public boolean leave(Portal portal) {
DefaultElement tmp = null;
for (DefaultElement defaultElement : elements) {
if (defaultElement.leave(portal)) {
tmp = defaultElement;
break;
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
if(tmp != null)
{
this.elements.remove(tmp);
return true;
}
return false;
}
@Override
public void damaged() {}
public boolean leave(Replicator replicator) {
this.elements.remove(replicator);
return true;
}
public boolean meet(Replicator replicator) {
boolean isValid = true;
for(DefaultElement element : elements)
{
if(!element.meet(replicator))
{
isValid = false;
}
}
if(isValid)
{
this.elements.add(replicator);
if(toRemove.size() == 1) // TODO: bűn ronda, és hibához vezethet
{
toRemove.add(replicator);
}
}
if(!toRemove.isEmpty())
{
for(DefaultElement toRemElement : toRemove)
{
if(elements.contains(toRemElement))
{
elements.remove(toRemElement);
}
}
toRemove.clear();
}
return isValid;
}
public boolean deleteElement(IElement elem)
{
return this.elements.remove(elem);
}
public boolean deleteAllElement()
{
this.elements.clear();
return true;
}
@Override
public void pickedUp(Box box) {
for (DefaultElement defaultElement : elements)
defaultElement.pickedUp(box);
}
public void addToRemove(DefaultElement element)
{
toRemove.add(element);
}
public boolean hasElementOn()
{
return !elements.isEmpty();
}
}