64public class MutantTarn
extends MultiStrategy {
65 private static final NpcMeleeStrategy MELEE = NpcMeleeStrategy.get();
66 private static final MagicAttack MAGIC =
new MagicAttack();
67 private static final RangedAttack RANGED =
new RangedAttack();
69 private static final FrozenSpecial FROZEN_SPECIAL =
new FrozenSpecial();
70 private static final IceSpecial ICE_SPECIAL =
new IceSpecial();
72 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(MELEE, MAGIC, RANGED);
73 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, RANGED);
74 private final CombatStrategy<Npc>[] SPECIALS = createStrategyArray(ICE_SPECIAL, FROZEN_SPECIAL);
76 private final Deque<CombatStrategy<Npc>> strategyQueue =
new LinkedList<>();
77 private int specialIndex;
80 currentStrategy = MELEE;
84 public void init(
Npc attacker,
Mob defender) {
85 if (strategyQueue.isEmpty()) {
86 for (
int index = 0; index < 6; index++) {
87 strategyQueue.add(RandomUtils.random(FULL_STRATEGIES));
89 strategyQueue.add(SPECIALS[specialIndex++ % SPECIALS.length]);
91 currentStrategy = strategyQueue.poll();
95 public boolean canAttack(
Npc attacker,
Mob defender) {
96 if (currentStrategy == MELEE && !MELEE.canAttack(attacker, defender)) {
97 currentStrategy = RandomUtils.random(NON_MELEE);
99 return currentStrategy.canAttack(attacker, defender);
103 public boolean withinDistance(
Npc attacker,
Mob defender) {
104 if (currentStrategy == MELEE && !MELEE.withinDistance(attacker, defender)) {
105 currentStrategy = RandomUtils.random(NON_MELEE);
107 return currentStrategy.canAttack(attacker, defender);
110 private static class IceSpecial
extends NpcMagicStrategy {
116 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
122 CombatHit combatHit = nextMagicHit(attacker, defender, 0);
123 combatHit.setAccurate(
true);
129 private static class RangedAttack
extends NpcMagicStrategy {
142 return new CombatHit[] { nextRangedHit(attacker, defender, 32) };
146 private static class MagicAttack
extends NpcMagicStrategy {
159 return new CombatHit[] { nextRangedHit(attacker, defender, 32) };
164 private static class FrozenSpecial
extends NpcMagicStrategy {
177 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
179 int randomHit =
Utility.random(1, 30);
183 public void appendDeath() {
189 shadow.walkTo(defender, () -> {
191 defender.damage(
new Hit(randomHit * shadow.getCurrentHealth() / shadow.getMaximumHealth()));
192 defender.graphic(287);
193 defender.graphic(910);
201 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
207 CombatHit combatHit = nextMagicHit(attacker, defender, -1);
208 combatHit.setAccurate(
false);