summaryrefslogtreecommitdiff
path: root/engine/battle/used_move_text.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/battle/used_move_text.asm')
-rw-r--r--engine/battle/used_move_text.asm235
1 files changed, 235 insertions, 0 deletions
diff --git a/engine/battle/used_move_text.asm b/engine/battle/used_move_text.asm
new file mode 100644
index 00000000..5b148ab5
--- /dev/null
+++ b/engine/battle/used_move_text.asm
@@ -0,0 +1,235 @@
+BattleCommand_UsedMoveText:
+; battle command 03
+ ld hl, UsedMoveText
+ call PrintText
+ jp WaitBGMap
+
+UsedMoveText:
+; this is a stream of text and asm from 105db9 to 105ef6
+ text_far _ActorNameText
+ text_asm
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .start
+
+ ld a, [wPlayerMoveStruct + MOVE_ANIM]
+ call UpdateUsedMoves
+
+.start
+ ld a, BATTLE_VARS_LAST_MOVE
+ call GetBattleVarAddr
+ ld d, h
+ ld e, l
+
+ ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+ call GetBattleVarAddr
+
+ ld a, BATTLE_VARS_MOVE_ANIM
+ call GetBattleVar
+ ld [wMoveGrammar], a
+
+ call CheckUserIsCharging
+ jr nz, .grammar
+
+ ; update last move
+ ld a, [wMoveGrammar]
+ ld [hl], a
+ ld [de], a
+
+.grammar
+ call GetMoveGrammar ; convert move id to grammar index
+
+; everything except 'CheckObedience' made redundant in localization
+
+ ; check obedience
+ ld a, [wAlreadyDisobeyed]
+ and a
+ ld hl, UsedMove2Text
+ ret nz
+
+ ; check move grammar
+ ld a, [wMoveGrammar]
+ cp $3
+ ld hl, UsedMove2Text
+ ret c
+ ld hl, UsedMove1Text
+ ret
+
+UsedMove1Text:
+ text_far _UsedMove1Text
+ text_asm
+ jr UsedMoveText_CheckObedience
+
+UsedMove2Text:
+ text_far _UsedMove2Text
+ text_asm
+UsedMoveText_CheckObedience:
+; check obedience
+ ld a, [wAlreadyDisobeyed]
+ and a
+ jr z, .GetMoveNameText
+; print "instead,"
+ ld hl, .UsedInsteadText
+ ret
+
+.UsedInsteadText:
+ text_far _UsedInsteadText
+ text_asm
+.GetMoveNameText:
+ ld hl, MoveNameText
+ ret
+
+MoveNameText:
+ text_far _MoveNameText
+ text_asm
+; get start address
+ ld hl, .endusedmovetexts
+
+; get move id
+ ld a, [wMoveGrammar]
+
+; 2-byte pointer
+ add a
+
+; seek
+ push bc
+ ld b, 0
+ ld c, a
+ add hl, bc
+ pop bc
+
+; get pointer to usedmovetext ender
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.endusedmovetexts
+; entries correspond to MoveGrammar sets
+ dw EndUsedMove1Text
+ dw EndUsedMove2Text
+ dw EndUsedMove3Text
+ dw EndUsedMove4Text
+ dw EndUsedMove5Text
+
+EndUsedMove1Text:
+ text_far _EndUsedMove1Text
+ text_end
+
+EndUsedMove2Text:
+ text_far _EndUsedMove2Text
+ text_end
+
+EndUsedMove3Text:
+ text_far _EndUsedMove3Text
+ text_end
+
+EndUsedMove4Text:
+ text_far _EndUsedMove4Text
+ text_end
+
+EndUsedMove5Text:
+ text_far _EndUsedMove5Text
+ text_end
+
+GetMoveGrammar:
+; store move grammar type in wMoveGrammar
+
+ push bc
+; wMoveGrammar contains move id
+ ld a, [wMoveGrammar]
+ ld c, a ; move id
+ ld b, 0 ; grammar index
+
+; read grammar table
+ ld hl, MoveGrammar
+.loop
+ ld a, [hli]
+; end of table?
+ cp -1
+ jr z, .end
+; match?
+ cp c
+ jr z, .end
+; advance grammar type at 0
+ and a
+ jr nz, .loop
+; next grammar type
+ inc b
+ jr .loop
+
+.end
+; wMoveGrammar now contains move grammar
+ ld a, b
+ ld [wMoveGrammar], a
+
+; we're done
+ pop bc
+ ret
+
+INCLUDE "data/moves/grammar.asm"
+
+CheckUserIsCharging:
+ ldh a, [hBattleTurn]
+ and a
+ ld a, [wPlayerCharging] ; player
+ jr z, .end
+ ld a, [wEnemyCharging] ; enemy
+.end
+ and a
+ ret
+
+UpdateUsedMoves:
+; append move a to wPlayerUsedMoves unless it has already been used
+
+ push bc
+; start of list
+ ld hl, wPlayerUsedMoves
+; get move id
+ ld b, a
+; next count
+ ld c, NUM_MOVES
+
+.loop
+; get move from the list
+ ld a, [hli]
+; not used yet?
+ and a
+ jr z, .add
+; already used?
+ cp b
+ jr z, .quit
+; next byte
+ dec c
+ jr nz, .loop
+
+; if the list is full and the move hasn't already been used
+; shift the list back one byte, deleting the first move used
+; this can occur with struggle or a new learned move
+ ld hl, wPlayerUsedMoves + 1
+; 1 = 2
+ ld a, [hld]
+ ld [hli], a
+; 2 = 3
+ inc hl
+ ld a, [hld]
+ ld [hli], a
+; 3 = 4
+ inc hl
+ ld a, [hld]
+ ld [hl], a
+; 4 = new move
+ ld a, b
+ ld [wPlayerUsedMoves + 3], a
+ jr .quit
+
+.add
+; go back to the byte we just inced from
+ dec hl
+; add the new move
+ ld [hl], b
+
+.quit
+; list updated
+ pop bc
+ ret