summaryrefslogtreecommitdiff
path: root/battle/hidden_power.asm
diff options
context:
space:
mode:
Diffstat (limited to 'battle/hidden_power.asm')
-rw-r--r--battle/hidden_power.asm108
1 files changed, 108 insertions, 0 deletions
diff --git a/battle/hidden_power.asm b/battle/hidden_power.asm
new file mode 100644
index 000000000..995acea2d
--- /dev/null
+++ b/battle/hidden_power.asm
@@ -0,0 +1,108 @@
+GetHiddenPower: ; fbced
+; Override Hidden Power's type and power based on the actor's DVs.
+
+ ld hl, BattleMonDVs
+ ld a, [hBattleTurn]
+ and a
+ jr z, .GotDVs
+ ld hl, EnemyMonDVs
+.GotDVs
+
+
+; Power:
+
+; Take the top bit from...
+
+; Atk
+ ld a, [hl]
+ swap a
+ and 8
+ ld b, a
+; Def
+ ld a, [hli]
+ and 8
+ srl a
+ or b
+ ld b, a
+; Spd
+ ld a, [hl]
+ swap a
+ and 8
+ srl a
+ srl a
+ or b
+ ld b, a
+; Spc
+ ld a, [hl]
+ and 8
+ srl a
+ srl a
+ srl a
+ or b
+ ld b, a
+
+; * 5
+ add a
+ add a
+ add b
+ ld b, a
+
+; + (Spc & 3)
+ ld a, [hld]
+ and 3
+ add b
+
+; / 2
+ srl a
+
+; + 30
+ add 30
+; + 1
+ inc a
+ ld d, a
+
+
+; Type:
+
+; Def & 3
+ ld a, [hl]
+ and 3
+ ld b, a
+
+; + (Atk & 3) << 2
+ ld a, [hl]
+ and 3 << 4
+ swap a
+ add a
+ add a
+ or b
+
+; Skip Normal
+ inc a
+
+; Skip type 6 (unused)
+ cp 6
+ jr c, .GotType
+ inc a
+
+; Skip unused types between Steel and Fire
+ cp STEEL + 1
+ jr c, .GotType
+ add FIRE - (STEEL + 1)
+
+
+.GotType
+ push af
+ ld a, BATTLE_VARS_MOVE_TYPE
+ call GetBattleVarPair
+ pop af
+ ld [hl], a
+
+ ld a, d
+ push af
+ callba BattleCommand06
+ pop af
+ ld d, a
+ ret
+; fbd54
+