Skip to content
Snippets Groups Projects
FireFighterBehavior.java 2.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • package model;
    
    import util.Position;
    import util.TargetStrategy;
    import java.util.*;
    
    public class FireFighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement> {
        private List<ModelElement> obstacles=List.of(ModelElement.MOUNTAIN);
        private TargetStrategy ts=new TargetStrategy();
    
        List<Position> initializeTargets(BoardData boardData){
            List<Position> targets=new ArrayList<>();
            for (ModelElement me:ModelElement.values()) {
                if (me.isFire()){
                    System.out.println("0");
                    for (Element e:boardData.getElements().get(me.ordinal())) {
                        targets.add(e.getPosition());
                    }}
            }
            return targets;
        }
        @Override
        public List<Position> update(BoardData boardData,Element element) {
            Position position=element.getPosition();
            List<Position> targets=initializeTargets(boardData);
            for (int i=0;i<((FireFighter)element).speed;i++) {
                position=ts.neighborClosestToFire(position,targets,allLegalNeighbors(boardData));
                extinguish(boardData,position);
                targets.remove(position);
                targets.removeAll(boardData.getNeighbor(position));
            }
            return List.of(position);
        }
    
        @Override
        public List<ModelElement> getObstacles() {
            return obstacles;
        }
    
        public void extinguish(BoardData boardData, Position position){
            List<Position> l=new ArrayList<>(legalNeighbors(boardData,position));
            l.add(position);
            for (Position p:l) {
                List<Element> c=new ArrayList<>(boardData.getCell(p).Content);
                for (Element e:c) {
                    if (e instanceof Fire){
                        boardData.removeElement(e);}
                }
            }
        }
        @Override
        public List<Position> legalNeighbors(BoardData boardData,Position position) {
            List<Position> neighbors=new ArrayList<>(boardData.getNeighbor(position));
            for (Position p:boardData.getNeighbor(position)) {
                for (Element e:boardData.getCell(p).Content) {
                    for(ModelElement o:getObstacles())
                        if (e.getType()==o) neighbors.remove(p);
                }
            }
            return neighbors;
        }
        @Override
        public Map<Position, List<Position>> allLegalNeighbors(BoardData boardData) {
            Map<Position, List<Position>> neighbors= new HashMap<>(Map.copyOf(boardData.getNeighbors()));
            for (Position pkey: boardData.getNeighbors().keySet()) {
                neighbors.replace(pkey,legalNeighbors(boardData,pkey));
            }
            return neighbors;
        }
    }