package com.lyndir.omicron.api;
import com.lyndir.lhunath.opal.system.error.AlreadyCheckedException;
import com.lyndir.lhunath.opal.system.util.ObjectUtils;
import java.util.Collection;
import java.util.stream.Stream;
/**
* @author lhunath, 2013-08-14
*/
public enum VictoryConditionType {
SUPREMACY {
@Override
public PublicVictoryConditionType pub() {
return PublicVictoryConditionType.SUPREMACY;
}
@Override
void install(final Game game) {
game.getController().addInternalGameListener( new GameListener() {
@Override
public void onPlayerLostObject(final IPlayer player, final IGameObject gameObject) {
if (!game.isRunning())
return;
Player supremePlayer = null;
for (final Player aPlayer : game.getPlayers())
if (!aPlayer.getObjects().isEmpty())
if (supremePlayer == null)
supremePlayer = aPlayer;
else
return;
game.getController().end( SUPREMACY, supremePlayer );
}
} );
}
},
MIGRATION {
@Override
public PublicVictoryConditionType pub() {
return PublicVictoryConditionType.MIGRATION;
}
@Override
void install(final Game game) {
// TODO
}
},
MIGHT {
public static final int MIGHT_SCORE_THRESHOLD = 10000;
@Override
public PublicVictoryConditionType pub() {
return PublicVictoryConditionType.MIGHT;
}
@Override
void install(final Game game) {
game.getController().addInternalGameListener( new GameListener() {
private IPlayer mightyPlayer;
private Turn mightySince;
@Override
public void onNewTurn(final Turn currentTurn) {
if (!game.isRunning())
return;
if (mightyPlayer != null)
if (currentTurn.getNumber() - mightySince.getNumber() >= 10)
game.getController().end( MIGHT, mightyPlayer );
}
@Override
public void onPlayerScore(final IPlayer player, final ChangeInt score) {
if (mightyPlayer != null) {
// There is a mighty player, check if this player's new score dethrones him.
if (mightyPlayer.equals( player ))
return;
if (mightyPlayer.getScore() - score.getTo() < MIGHT_SCORE_THRESHOLD) {
// Score gap closed, mighty player dethroned.
mightyPlayer = null;
mightySince = null;
}
}
if (mightyPlayer == null) {
// There is no mighty player. Check if a player has become mighty.
IPlayer mightiestPlayer = null;
boolean mightiestIsMighty = true;
for (final IPlayer aPlayer : game.getPlayers()) {
if (mightiestPlayer == null)
mightiestPlayer = aPlayer;
else if (aPlayer.getScore() > mightiestPlayer.getScore()) {
// aPlayer is mightier than current mightiest player. Check if that also makes him mighty.
mightiestIsMighty = aPlayer.getScore() - mightiestPlayer.getScore() >= MIGHT_SCORE_THRESHOLD;
mightiestPlayer = aPlayer;
}
}
if (mightiestPlayer != null && mightiestIsMighty) {
// We found a mighty player.
mightyPlayer = mightiestPlayer;
mightySince = game.getTurns().getLast();
}
}
}
} );
}
},
CAPTURE {
@Override
public PublicVictoryConditionType pub() {
return PublicVictoryConditionType.CAPTURE;
}
@Override
void install(final Game game) {
// TODO
}
};
abstract void install(Game game);
public static VictoryConditionType cast(final PublicVictoryConditionType victoryCondition) {
switch (victoryCondition) {
case SUPREMACY:
return SUPREMACY;
case MIGRATION:
return MIGRATION;
case MIGHT:
return MIGHT;
case CAPTURE:
return CAPTURE;
}
throw new AlreadyCheckedException();
}
public static Stream<VictoryConditionType> cast(final Collection<PublicVictoryConditionType> victoryConditions) {
return victoryConditions.stream().map( VictoryConditionType::cast );
}
public abstract PublicVictoryConditionType pub();
}