oglimmer/ggo

View on GitHub
core/src/main/java/de/oglimmer/ggo/logic/battle/CommandCenter.java

Summary

Maintainability
A
0 mins
Test Coverage
package de.oglimmer.ggo.logic.battle;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import de.oglimmer.ggo.logic.Field;
import de.oglimmer.ggo.logic.Game;
import de.oglimmer.ggo.logic.Player;
import de.oglimmer.ggo.logic.Unit;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@RequiredArgsConstructor
@Slf4j
public class CommandCenter implements Serializable {

    private static final long serialVersionUID = 1L;

    @NonNull
    private Game game;

    @Setter
    @Getter
    private boolean dry;

    private Map<Unit, Command> commands = new HashMap<>();

    @Getter
    private Map<Player, StringBuilder> infoMessages = new HashMap<>();

    public CommandCenter(CommandCenter toCopy, boolean dryRun) {
        this.game = toCopy.game;
        this.commands = new HashMap<>(toCopy.commands);
        this.dry = dryRun;
    }

    public void addCommand(Unit unit, Field targetField, CommandType command) {
        Command newCommand = new Command(command, unit, targetField);
        commands.put(unit, newCommand);
        log.trace("Added command {} for {} at {} ", command, unit.getUnitType(), targetField.getId());
    }

    public void removeCommandForUnit(Unit u) {
        for (Iterator<Map.Entry<Unit, Command>> it = commands.entrySet().iterator(); it.hasNext();) {
            Map.Entry<Unit, Command> en = it.next();
            if (en.getValue().getUnit() == u) {
                it.remove();
            }
        }
    }

    public void setAllToFortify() {
        game.getBoard().getFields().stream().filter(f -> f.getUnit() != null)
                .forEach(f -> addCommand(f.getUnit(), f, CommandType.FORTIFY));
    }

    // ACCESS

    public Command getByUnit(Unit unit) {
        return commands.get(unit);
    }

    public Set<Command> getByTargetField(Player forPlayer, Field f) {
        return commands.values().stream().filter(c -> c.getUnit().getPlayer() == forPlayer)
                .filter(c -> c.getTargetField() == f).collect(Collectors.toSet());
    }

    public void allCommands(Consumer<Command> consumer) {
        commands.values().forEach(consumer);
    }

    public Stream<Command> stream() {
        return commands.values().stream();
    }

    // BATTLE

    public void calcBattle() {
        BombarbResolver bomb = new BombarbResolver(this);
        bomb.collectTargets();

        CrossingBattleResolver br = new CrossingBattleResolver(this);
        br.battleCrossingUnits();

        BattleGroundResolver bgr = new BattleGroundResolver(this);
        bgr.battleBattleGrounds();

        bomb.killTargets();

        if (!dry) {
            MoveResolver mr = new MoveResolver(this);
            mr.moveUnits();
        }
    }

}