package org.pokenet.server.battle.mechanics.clauses; import org.pokenet.server.battle.Pokemon; import org.pokenet.server.battle.mechanics.statuses.StatusEffect; /** * This clause prevents a trainer from putting a particular status on more * than one of the opponent's pokemon at a time. * * @author Colin */ @SuppressWarnings("unchecked") public abstract class EffectClause extends Clause { private Class m_effect; /** * @param effect the status effect to restrict */ public EffectClause(String name, Class effect) { super(name); m_effect = effect; } public boolean equals(Object o2) { if (!(o2 instanceof EffectClause)) return false; if (o2 == null) return false; return ((EffectClause)o2).m_effect.equals(m_effect); } public boolean allowsStatus(StatusEffect eff, Pokemon source, Pokemon target) { if (source == target) return true; if (!m_effect.isAssignableFrom(eff.getClass())) return true; /** See if the opponent already has a pokemon with this effect and that * that effect was induced by this enemy trainer. */ Pokemon[] party = target.getTeammates(); for (int i = 0; i < party.length; ++i) { Pokemon p = party[i]; if (p.isFainted()) continue; StatusEffect effect = p.getEffect(m_effect); if (effect != null) { Pokemon inducer = effect.getInducer(); if ((inducer != null) && (inducer.getParty() == source.getParty())) return false; } } return true; } }