RuneHive-Game
Loading...
Searching...
No Matches
KalphiteQueen.kt
Go to the documentation of this file.
1package org.jire.runehiveps.kalphitequeen
2
3import com.runehive.game.Animation
4import com.runehive.game.Graphic
5import com.runehive.game.world.entity.combat.CombatType
6import com.runehive.game.world.entity.combat.CombatUtil.createStrategyArray
7import com.runehive.game.world.entity.combat.CombatUtil.randomStrategy
8import com.runehive.game.world.entity.combat.attack.FightType
9import com.runehive.game.world.entity.combat.hit.Hit
10import com.runehive.game.world.entity.combat.strategy.CombatStrategy
11import com.runehive.game.world.entity.combat.strategy.npc.MultiStrategy
12import com.runehive.game.world.entity.combat.strategy.npc.NpcMeleeStrategy
13import com.runehive.game.world.entity.mob.Mob
14import com.runehive.game.world.entity.mob.npc.Npc
15import com.runehive.util.RandomUtils
16import org.jire.runehiveps.WorldTask.schedule
17
18/**
19 * @author Jire
20 */
21class KalphiteQueen : MultiStrategy() {
22
23 private var transforming = false
24
25 private var switchingStyles = false
26
27 init {
28 currentStrategy = melee
29 }
30
31 override fun canAttack(attacker: Npc, defender: Mob) =
32 super.canAttack(attacker, defender) && !transforming
33
34 override fun canOtherAttack(attacker: Mob, defender: Npc) =
35 super.canOtherAttack(attacker, defender) && !transforming
36
37 override fun performChecks(attacker: Npc, defender: Mob) {
38 if(RandomUtils.inclusive(2) == 1) {
39 val strategies = (if (attacker.id == PHASE1_ID) phase1Strats else phase2Strats)
40 .filter {
41 it.canAttack(attacker, defender) && it.withinDistance(attacker, defender)
42 }
43 val strategy = RandomUtils.random(strategies) ?: return
44 currentStrategy = strategy
45 switchingStyles = true
46 }
47 super.performChecks(attacker, defender)
48 }
49
50 override fun attack(attacker: Npc?, defender: Mob?, hit: Hit?) {
51 switchingStyles = false
52 super.attack(attacker, defender, hit)
53 }
54 override fun block(attacker: Mob, defender: Npc, hit: Hit, combatType: CombatType) {
55 val id = defender.id
56 if ((id == PHASE1_ID && combatType.match(CombatType.MAGIC, CombatType.RANGED))
57 || (id == PHASE2_ID && combatType.match(CombatType.MELEE))
58 ) {
59 val newDamage = (hit.damage * 0.4).toInt()
60 hit.damage = newDamage
61 if (newDamage < 1) hit.isAccurate = false
62 }
63 super.block(attacker, defender, hit, combatType)
64 }
65
66 override fun preDeath(attacker: Mob, defender: Npc, hit: Hit) {
67 if (defender.getId() == PHASE1_ID) {
68 defender.isDead = false
69 defender.heal(255)
70 attacker.combat.reset()
71 defender.combat.reset(true)
72 defender.canAttack = false
73 defender.animate(6242)
74 defender.locking.lock()
75 transforming = true
76 schedule(5) {
77 currentStrategy = randomStrategy(phase2Strats)
78 defender.transform(PHASE2_ID)
79 defender.canAttack = false
80 defender.graphic(PHASE_SWITCH_GFX)
81 defender.animate(PHASE_SWITCH_ANIM)
82 schedule(8) {
83 transforming = false
84 defender.combat.reset(true)
85 defender.canAttack = true
86 defender.locking.unlock()
87 defender.combat.attack(attacker)
88 }
89 }
90 return
91 }
92
93 if (defender.getId() == PHASE2_ID) {
94 schedule(8) {
95 defender.transform(PHASE1_ID)
96 }
97 }
98
99 super.preDeath(attacker, defender, hit)
100 }
101
102 override fun onDeath(attacker: Mob, defender: Npc, hit: Hit) {
103 super.onDeath(attacker, defender, hit)
104 }
105
106 override fun getAttackDelay(attacker: Npc?, defender: Mob?, fightType: FightType?): Int {
107 return if(switchingStyles) 7 else 4
108 }
109
110 companion object {
111 const val PHASE1_ID = 963
112 const val PHASE2_ID = 965
113
114 val PHASE_SWITCH_GFX = Graphic(1055)
115 val PHASE_SWITCH_ANIM = Animation(6270)
116
117 val melee: NpcMeleeStrategy = NpcMeleeStrategy.get()
118
119 val phase1Strats: Array<CombatStrategy<Npc>> =
120 createStrategyArray(KalphiteQueenMagicStrategy.phase1, KalphiteQueenRangedStrategy.phase1, melee)
121 val phase2Strats: Array<CombatStrategy<Npc>> =
122 createStrategyArray(KalphiteQueenMagicStrategy.phase2, KalphiteQueenRangedStrategy.phase2, melee)
123
124 }
125
126}