001package fr.aumgn.dac2.game.training;
002
003import java.util.ArrayList;
004import java.util.List;
005import java.util.Map;
006import java.util.Map.Entry;
007
008import org.bukkit.World;
009import org.bukkit.command.CommandSender;
010import org.bukkit.entity.Player;
011
012import fr.aumgn.bukkitutils.localization.PluginMessages;
013import fr.aumgn.bukkitutils.playerref.PlayerRef;
014import fr.aumgn.bukkitutils.playerref.map.PlayersRefHashMap;
015import fr.aumgn.bukkitutils.playerref.map.PlayersRefMap;
016import fr.aumgn.dac2.DAC;
017import fr.aumgn.dac2.arena.regions.Pool;
018import fr.aumgn.dac2.game.AbstractGame;
019import fr.aumgn.dac2.game.GameParty;
020import fr.aumgn.dac2.game.start.GameStartData;
021import fr.aumgn.dac2.game.start.PlayerStartData;
022import fr.aumgn.dac2.shape.column.Column;
023import fr.aumgn.dac2.shape.column.ColumnPattern;
024import fr.aumgn.dac2.shape.column.GlassyPattern;
025
026public class Training extends AbstractGame {
027
028    private GameParty<TrainingPlayer> party;
029    private PlayersRefMap<TrainingPlayer> playersMap;
030
031    public Training(DAC dac, GameStartData data) {
032        super(dac, data);
033
034        Map<PlayerRef, ? extends PlayerStartData> playersData =
035                data.getPlayersData();
036        List<TrainingPlayer> list =
037                new ArrayList<TrainingPlayer>(playersData.size());
038        playersMap = new PlayersRefHashMap<TrainingPlayer>();
039
040        for (Entry<PlayerRef, ? extends PlayerStartData> entry :
041                playersData.entrySet()) {
042            PlayerRef playerId = entry.getKey();
043            TrainingPlayer player =
044                    new TrainingPlayer(playerId, entry.getValue());
045            list.add(player);
046            playersMap.put(playerId, player);
047        }
048        party = new GameParty<TrainingPlayer>(this, TrainingPlayer.class,
049                list);
050    }
051
052    @Override
053    public void start() {
054        resetPoolOnStart();
055        send("training.start");
056        nextTurn();
057    }
058
059    private void nextTurn() {
060        TrainingPlayer player = party.nextTurn();
061        tpBeforeJump(player);
062        send("training.playerturn", player.getDisplayName());
063    }
064
065    @Override
066    public void stop(boolean force) {
067        resetPoolOnEnd();
068        for (TrainingPlayer player : party.iterable()) {
069            player.sendStats(dac.getMessages());
070        }
071    }
072
073    @Override
074    public boolean contains(Player player) {
075        return playersMap.containsKey(player);
076    }
077
078    @Override
079    public void sendMessage(String message) {
080        for (TrainingPlayer player : party.iterable()) {
081            player.sendMessage(message);
082        }
083        sendSpectators(message);
084    }
085
086    @Override
087    public boolean isPlayerTurn(Player player) {
088        TrainingPlayer trainingPlayer = playersMap.get(player);
089        return trainingPlayer != null && party.isTurn(trainingPlayer);
090    }
091
092    @Override
093    public void onJumpSuccess(Player player) {
094        TrainingPlayer trainingPlayer = playersMap.get(player);
095        World world = arena.getWorld();
096        Pool pool = arena.getPool();
097
098        Column column = pool.getColumn(player);
099        ColumnPattern pattern = trainingPlayer.getColumnPattern();
100
101        if (column.isADAC(world)) {
102            send("training.jump.dac", trainingPlayer.getDisplayName());
103            trainingPlayer.incrementDacs();
104            pattern = new GlassyPattern(pattern);
105        } else {
106            send("training.jump.success", trainingPlayer.getDisplayName());
107            trainingPlayer.incrementSuccesses();
108        }
109
110        column.set(world, pattern);
111        if (pool.isFilled(world)) {
112            pool.reset(world);
113        }
114        tpAfterJumpSuccess(trainingPlayer, column);
115        nextTurn();
116    }
117
118    @Override
119    public void onJumpFail(Player player) {
120        TrainingPlayer trainingPlayer = playersMap.get(player);
121        send("training.jump.fail", trainingPlayer.getDisplayName());
122        trainingPlayer.incrementFails();
123
124        tpAfterJumpFail(trainingPlayer);
125        nextTurn();
126    }
127
128    @Override
129    public void onQuit(Player player) {
130        TrainingPlayer trainingPlayer = playersMap.get(player);
131        party.removePlayer(trainingPlayer);
132        playersMap.remove(player);
133        trainingPlayer.sendStats(dac.getMessages());
134    }
135
136    @Override
137    public void list(CommandSender sender) {
138        PluginMessages messages = dac.getMessages();
139
140        sender.sendMessage(messages.get("training.playerslist"));
141        for (TrainingPlayer player : party.iterable()) {
142            sender.sendMessage(messages.get("training.playerentry", 
143                    player.getIndex(), player.getDisplayName(),
144                    player.getSuccesses(), player.getDacs(),
145                    player.getFails()));
146        }
147    }
148}