package tc.oc.pgm.match; import javax.annotation.Nullable; import tc.oc.pgm.filters.query.IPlayerQuery; import static com.google.common.base.Preconditions.checkNotNull; /** * Represents the competitive relationship between two player states. The attacker * can be null to indicate a neutral relationship i.e. "world" damage. * * Note a few subtleties: * - SELF and ALLY are mutually exclusive.. a player is not their own ally * - a player can be their own ENEMY if the two states have different parties */ public enum PlayerRelation { NEUTRAL, // attacker is null (e.g. world damage) or not participating SELF, // same player, same team ALLY, // different players, same team ENEMY; // different teams (same/different player doesn't matter) public static PlayerRelation get(IPlayerQuery victim, @Nullable IPlayerQuery attacker) { checkNotNull(victim); if(attacker == null || !attacker.getParty().isParticipatingType()) { return NEUTRAL; } else if(!victim.getParty().equals(attacker.getParty())) { return ENEMY; } else if(victim.equals(attacker)) { return SELF; } else { return ALLY; } } public boolean are(IPlayerQuery victim, @Nullable IPlayerQuery attacker) { return this == get(victim, attacker); } }