diff options
-rw-r--r-- | data/types/type_matchups.asm | 226 | ||||
-rwxr-xr-x | engine/bcd.asm | 110 | ||||
-rwxr-xr-x | engine/events/field_moves.asm | 1082 | ||||
-rwxr-xr-x | engine/items/inventory.asm | 1446 | ||||
-rwxr-xr-x | engine/items/item_effects.asm | 158 | ||||
-rwxr-xr-x | engine/overworld/spawn_points.asm | 118 | ||||
-rwxr-xr-x | engine/pokemon/health.asm | 716 | ||||
-rw-r--r-- | gfx/pokemon/annon_pics.asm | 106 | ||||
-rwxr-xr-x | home/items.asm | 138 | ||||
-rwxr-xr-x | home/tables.asm | 54 |
10 files changed, 2077 insertions, 2077 deletions
diff --git a/data/types/type_matchups.asm b/data/types/type_matchups.asm index 2c1f22c..8923a80 100644 --- a/data/types/type_matchups.asm +++ b/data/types/type_matchups.asm @@ -1,113 +1,113 @@ -INCLUDE "constants.asm"
-
-SECTION "Type Matchups", ROMX[$506D], BANK[$0D]
-
-TypeMatchups: ; 3506d
- ; attacker, defender, *=
- db TYPE_NORMAL, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_NORMAL, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_METAL, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_WATER, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_GROUND, NO_EFFECT
- db TYPE_ELECTRIC, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_METAL, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_WATER, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_ICE, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_DRAGON, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_NORMAL, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_GHOST, NO_EFFECT
- db TYPE_FIGHTING, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_POISON, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GROUND, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_POISON, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GHOST, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_ELECTRIC, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_FLYING, NO_EFFECT
- db TYPE_GROUND, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_FLYING, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_FIGHTING, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_FIGHTING, SUPER_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_DARK, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_GHOST, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
- db TYPE_ROCK, TYPE_GROUND, NOT_VERY_EFFECTIVE
- db TYPE_ROCK, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_GHOST, TYPE_NORMAL, NO_EFFECT
- db TYPE_GHOST, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_GHOST, TYPE_DARK, NOT_VERY_EFFECTIVE
- db TYPE_DRAGON, TYPE_DRAGON, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_NORMAL, NOT_VERY_EFFECTIVE
- db TYPE_DARK, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_GHOST, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_METAL, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_METAL, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_METAL, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_METAL, TYPE_METAL, NO_EFFECT
-
- db -2 ; end (with Foresight)
-
-; Foresight removes Ghost's immunity to Normal
- db TYPE_NORMAL, TYPE_GHOST, NO_EFFECT
-
- db -1 ; end
-; 3519b
+INCLUDE "constants.asm" + +SECTION "Type Matchups", ROMX[$506D], BANK[$0D] + +TypeMatchups: ; 3506d + ; attacker, defender, *= + db TYPE_NORMAL, TYPE_ROCK, NOT_VERY_EFFECTIVE + db TYPE_NORMAL, TYPE_DARK, SUPER_EFFECTIVE + db TYPE_FIRE, TYPE_FIRE, NOT_VERY_EFFECTIVE + db TYPE_FIRE, TYPE_WATER, NOT_VERY_EFFECTIVE + db TYPE_FIRE, TYPE_GRASS, SUPER_EFFECTIVE + db TYPE_FIRE, TYPE_ICE, SUPER_EFFECTIVE + db TYPE_FIRE, TYPE_BUG, SUPER_EFFECTIVE + db TYPE_FIRE, TYPE_ROCK, NOT_VERY_EFFECTIVE + db TYPE_FIRE, TYPE_DRAGON, NOT_VERY_EFFECTIVE + db TYPE_WATER, TYPE_FIRE, SUPER_EFFECTIVE + db TYPE_WATER, TYPE_WATER, NOT_VERY_EFFECTIVE + db TYPE_WATER, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE + db TYPE_WATER, TYPE_GRASS, NOT_VERY_EFFECTIVE + db TYPE_WATER, TYPE_GROUND, SUPER_EFFECTIVE + db TYPE_WATER, TYPE_ROCK, SUPER_EFFECTIVE + db TYPE_WATER, TYPE_DRAGON, NOT_VERY_EFFECTIVE + db TYPE_WATER, TYPE_METAL, SUPER_EFFECTIVE + db TYPE_ELECTRIC, TYPE_WATER, SUPER_EFFECTIVE + db TYPE_ELECTRIC, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE + db TYPE_ELECTRIC, TYPE_GRASS, NOT_VERY_EFFECTIVE + db TYPE_ELECTRIC, TYPE_GROUND, NO_EFFECT + db TYPE_ELECTRIC, TYPE_FLYING, SUPER_EFFECTIVE + db TYPE_ELECTRIC, TYPE_DRAGON, NOT_VERY_EFFECTIVE + db TYPE_ELECTRIC, TYPE_METAL, SUPER_EFFECTIVE + db TYPE_GRASS, TYPE_FIRE, NOT_VERY_EFFECTIVE + db TYPE_GRASS, TYPE_WATER, SUPER_EFFECTIVE + db TYPE_GRASS, TYPE_GRASS, NOT_VERY_EFFECTIVE + db TYPE_GRASS, TYPE_POISON, NOT_VERY_EFFECTIVE + db TYPE_GRASS, TYPE_GROUND, SUPER_EFFECTIVE + db TYPE_GRASS, TYPE_FLYING, NOT_VERY_EFFECTIVE + db TYPE_GRASS, TYPE_BUG, NOT_VERY_EFFECTIVE + db TYPE_GRASS, TYPE_ROCK, SUPER_EFFECTIVE + db TYPE_GRASS, TYPE_DRAGON, NOT_VERY_EFFECTIVE + db TYPE_ICE, TYPE_FIRE, NOT_VERY_EFFECTIVE + db TYPE_ICE, TYPE_WATER, NOT_VERY_EFFECTIVE + db TYPE_ICE, TYPE_GRASS, SUPER_EFFECTIVE + db TYPE_ICE, TYPE_ICE, NOT_VERY_EFFECTIVE + db TYPE_ICE, TYPE_GROUND, SUPER_EFFECTIVE + db TYPE_ICE, TYPE_FLYING, SUPER_EFFECTIVE + db TYPE_ICE, TYPE_DRAGON, SUPER_EFFECTIVE + db TYPE_FIGHTING, TYPE_NORMAL, SUPER_EFFECTIVE + db TYPE_FIGHTING, TYPE_ICE, SUPER_EFFECTIVE + db TYPE_FIGHTING, TYPE_POISON, NOT_VERY_EFFECTIVE + db TYPE_FIGHTING, TYPE_FLYING, NOT_VERY_EFFECTIVE + db TYPE_FIGHTING, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE + db TYPE_FIGHTING, TYPE_BUG, NOT_VERY_EFFECTIVE + db TYPE_FIGHTING, TYPE_ROCK, SUPER_EFFECTIVE + db TYPE_FIGHTING, TYPE_GHOST, NO_EFFECT + db TYPE_FIGHTING, TYPE_METAL, NOT_VERY_EFFECTIVE + db TYPE_POISON, TYPE_GRASS, SUPER_EFFECTIVE + db TYPE_POISON, TYPE_POISON, NOT_VERY_EFFECTIVE + db TYPE_POISON, TYPE_GROUND, NOT_VERY_EFFECTIVE + db TYPE_POISON, TYPE_BUG, SUPER_EFFECTIVE + db TYPE_POISON, TYPE_ROCK, NOT_VERY_EFFECTIVE + db TYPE_POISON, TYPE_GHOST, NOT_VERY_EFFECTIVE + db TYPE_POISON, TYPE_METAL, NOT_VERY_EFFECTIVE + db TYPE_GROUND, TYPE_FIRE, SUPER_EFFECTIVE + db TYPE_GROUND, TYPE_ELECTRIC, SUPER_EFFECTIVE + db TYPE_GROUND, TYPE_GRASS, NOT_VERY_EFFECTIVE + db TYPE_GROUND, TYPE_POISON, SUPER_EFFECTIVE + db TYPE_GROUND, TYPE_FLYING, NO_EFFECT + db TYPE_GROUND, TYPE_BUG, NOT_VERY_EFFECTIVE + db TYPE_GROUND, TYPE_ROCK, SUPER_EFFECTIVE + db TYPE_FLYING, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE + db TYPE_FLYING, TYPE_GRASS, SUPER_EFFECTIVE + db TYPE_FLYING, TYPE_FIGHTING, SUPER_EFFECTIVE + db TYPE_FLYING, TYPE_BUG, SUPER_EFFECTIVE + db TYPE_FLYING, TYPE_ROCK, NOT_VERY_EFFECTIVE + db TYPE_PSYCHIC, TYPE_FIGHTING, SUPER_EFFECTIVE + db TYPE_PSYCHIC, TYPE_POISON, SUPER_EFFECTIVE + db TYPE_PSYCHIC, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE + db TYPE_PSYCHIC, TYPE_DARK, NOT_VERY_EFFECTIVE + db TYPE_BUG, TYPE_FIRE, NOT_VERY_EFFECTIVE + db TYPE_BUG, TYPE_GRASS, SUPER_EFFECTIVE + db TYPE_BUG, TYPE_FIGHTING, NOT_VERY_EFFECTIVE + db TYPE_BUG, TYPE_POISON, SUPER_EFFECTIVE + db TYPE_BUG, TYPE_FLYING, NOT_VERY_EFFECTIVE + db TYPE_BUG, TYPE_PSYCHIC, SUPER_EFFECTIVE + db TYPE_BUG, TYPE_GHOST, NOT_VERY_EFFECTIVE + db TYPE_BUG, TYPE_DARK, SUPER_EFFECTIVE + db TYPE_ROCK, TYPE_FIRE, SUPER_EFFECTIVE + db TYPE_ROCK, TYPE_ICE, SUPER_EFFECTIVE + db TYPE_ROCK, TYPE_FIGHTING, NOT_VERY_EFFECTIVE + db TYPE_ROCK, TYPE_GROUND, NOT_VERY_EFFECTIVE + db TYPE_ROCK, TYPE_FLYING, SUPER_EFFECTIVE + db TYPE_ROCK, TYPE_BUG, SUPER_EFFECTIVE + db TYPE_ROCK, TYPE_METAL, NOT_VERY_EFFECTIVE + db TYPE_GHOST, TYPE_NORMAL, NO_EFFECT + db TYPE_GHOST, TYPE_PSYCHIC, SUPER_EFFECTIVE + db TYPE_GHOST, TYPE_DARK, NOT_VERY_EFFECTIVE + db TYPE_DRAGON, TYPE_DRAGON, SUPER_EFFECTIVE + db TYPE_DARK, TYPE_NORMAL, NOT_VERY_EFFECTIVE + db TYPE_DARK, TYPE_PSYCHIC, SUPER_EFFECTIVE + db TYPE_DARK, TYPE_GHOST, SUPER_EFFECTIVE + db TYPE_DARK, TYPE_DARK, SUPER_EFFECTIVE + db TYPE_METAL, TYPE_WATER, NOT_VERY_EFFECTIVE + db TYPE_METAL, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE + db TYPE_METAL, TYPE_ROCK, SUPER_EFFECTIVE + db TYPE_METAL, TYPE_METAL, NO_EFFECT + + db -2 ; end (with Foresight) + +; Foresight removes Ghost's immunity to Normal + db TYPE_NORMAL, TYPE_GHOST, NO_EFFECT + + db -1 ; end +; 3519b diff --git a/engine/bcd.asm b/engine/bcd.asm index 020dc64..6d441b2 100755 --- a/engine/bcd.asm +++ b/engine/bcd.asm @@ -1,55 +1,55 @@ -INCLUDE "constants.asm"
-
-SECTION "BCD", ROMX[$4de3], BANK[$03]
-
-AddBCD: ; 03:4de3
- and a
- ld b, c
-.add
- ld a, [de]
- adc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .add
- jr nc, .done
-
- ld a, $99
- inc de
-
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
-
-.done
- ret
-
-
-SubBCD: ; 03:4df9
- and a
- ld b, c
-.sub
- ld a, [de]
- sbc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .sub
- jr nc, .done
- ld a, 0
- inc de
-
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
- scf
-.done
- ret
+INCLUDE "constants.asm" + +SECTION "BCD", ROMX[$4de3], BANK[$03] + +AddBCD: ; 03:4de3 + and a + ld b, c +.add + ld a, [de] + adc [hl] + daa + ld [de], a + dec de + dec hl + dec c + jr nz, .add + jr nc, .done + + ld a, $99 + inc de + +.fill + ld [de], a + inc de + dec b + jr nz, .fill + +.done + ret + + +SubBCD: ; 03:4df9 + and a + ld b, c +.sub + ld a, [de] + sbc [hl] + daa + ld [de], a + dec de + dec hl + dec c + jr nz, .sub + jr nc, .done + ld a, 0 + inc de + +.fill + ld [de], a + inc de + dec b + jr nz, .fill + scf +.done + ret diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm index 49729d2..4f688fe 100755 --- a/engine/events/field_moves.asm +++ b/engine/events/field_moves.asm @@ -1,541 +1,541 @@ -INCLUDE "constants.asm"
-
-; TODO - need to constantize tile ids, movements
-
-SECTION "Field Moves", ROMX[$4fab], BANK[$03]
-
-CutFunction: ; 03:4fab
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .CutScriptTable
- jp CallJumptable
-
-.CutScriptTable ; 03:4fc5
- init_script_table
- add_script TryCut
- add_script CheckCuttableBlock
- add_script CheckCuttableTile
- add_script DoCut
- add_script DoCut2
- add_script FailCut
-
-TryCut: ; 03:4fd1
- call GetMapEnvironment
- cp ROUTE
- jr z, .success
- cp TOWN
- jr z, .success
- set_script FailCut
- xor a
- ret
-.success
- set_script CheckCuttableBlock
- xor a
- ret
-
-CheckCuttableBlock: ; 03:4fea
- call GetFacingTileCoord
- cp $80
- jr nz, .fail
- call GetBlockLocation
- ld a, l
- ld [wMapBlocksAddress], a
- ld a, h
- ld [wMapBlocksAddress + 1], a
- ld a, [hl]
- call GetCutReplacementBlock
- jr nc, .fail
- dec hl
- ld a, [hl]
- ld [wReplacementBlock], a
- set_script DoCut2
- xor a
- ret
-.fail
- set_script CheckCuttableTile
- xor a
- ret
-
-GetCutReplacementBlock: ; 03:5015
- ld c, a
- ld hl, CutReplacementBlocks
-.loop
- ld a, [hli]
- cp -1
- ret z
- inc hl
- cp c
- jr nz, .loop
- scf
- ret
-
-CutReplacementBlocks: ; 03:5023
-; replacement block, facing block
- db $30, $25
- db $31, $2A
- db $32, $34
- db $33, $35
- db -1
-
-CheckCuttableTile: ; 03:502c
- call GetFacingTileCoord
- call IsCuttableTile
- jr nc, .fail
- call GetBlockLocation
- ld a, [hl]
- cp $3b
- jr nz, .fail
- ld a, l
- ld [wMapBlocksAddress], a
- ld a, h
- ld [wMapBlocksAddress + 1], a
- ld a, $04
- ld [wReplacementBlock], a
- set_script DoCut
- xor a
- ret
-.fail
- set_script FailCut
- xor a
- ret
-
-IsCuttableTile: ; 03:5057
- ld hl, CuttableTiles
- ld c, a
-.loop
- ld a, [hli]
- cp -1
- ret z
- cp c
- jr nz, .loop
- scf
- ret
-
-CuttableTiles: ; 03:5064
- db $81
- db $82
- db $8A
- db $8B
- db -1
-
-FailCut: ; 03:5069
- ld hl, Text_CantUseCutHere
- call MenuTextBoxBackup
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantUseCutHere: ; 03:5073
- text "ここでは つかえません"
- prompt
-
-DoCut:
-DoCut2: ; 03:5080
- far_queue CutScript
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-CutScript: ; 03:508C
- call RefreshScreen
- ld hl, wPartyMonNicknames
- ld a, BOXMON
- ld [wMonType], a
- ld a, [wWhichPokemon]
- call GetNick
- call CopyStringToStringBuffer2
- ld hl, Text_CutItDown
- call MenuTextBoxBackup
- ld de, MUSIC_SURF
- call PlaySFX
- ld hl, wMapBlocksAddress
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wReplacementBlock]
- ld [hl], a
- call LoadMapPart
- call UpdateSprites
- call WaitBGMap
- call Function1fea
- scf
- ret
-
-Text_CutItDown ; 03:50c4
- text_from_ram wStringBuffer2
- text " は "
- line "くさかりを つかった!"
- prompt
-
-SurfFunction: ; 03:50d8
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .SurfScriptTable
- jp CallJumptable
-
-.SurfScriptTable: ; 03:50f2
- init_script_table
- add_script TrySurf
- add_script DoSurf
- add_script FailSurf
-
-TrySurf: ; 03:50f8
- call GetFacingTileCoord
- and $f0
- cp $20
- jr z, .success
- cp $40
- jr z, .success
- set_script FailSurf
- xor a
- ret
-.success
- set_script DoSurf
- xor a
- ret
-
-DoSurf: ; 03:5113
- queue_ba SurfScript
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-FailSurf: ; 03:5124
- ld hl, Text_CantSurfHere
- call MenuTextBoxBackup
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantSurfHere: ; 03:5133
- text "ここでは のることが"
- next "できません"
- prompt
-
-SurfScript: ; 03:5145
- call RefreshScreen
- ld hl, wPartyMonNicknames
- ld a, BOXMON
- ld [wMonType], a
- ld a, [wWhichPokemon]
- call GetNick
- call CopyStringToStringBuffer2
- ld hl, Text_UsedSurf
- call MenuTextBoxBackup
- ld a, PLAYER_SURF
- ld [wPlayerState], a
- call Function0d02
- call PlayMapMusic
- call MovePlayerIntoWater
- call Function1fea
- ret
-
-Text_UsedSurf: ; 03:5171
- text_from_ram wStringBuffer2
- text " は "
- line "@"
- text_from_ram wPlayerName
- text "を のせた!"
- prompt
-
-MovePlayerIntoWater: ; 03:5185
- call InitMovementBuffer
- call .get_movement_direction
- call AppendToMovementBuffer
- ld a, $32
- call AppendToMovementBuffer
- ld a, 0
- ld hl, wMovementBuffer
- call LoadMovementDataPointer
-.get_movement_direction
- ld a, [wPlayerWalking]
- srl a
- srl a
- ld e, a
- ld d, $00
- ld hl, SurfMovementDirections
- add hl, de
- ld a, [hl]
- ret
-
-; Direction to move player, mapped to facing direction
-SurfMovementDirections: ; 03:51ab
- db 4, 5, 6, 7
-
-
-FlyFunction: ; 03:51af
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .FlyScriptTable
- jp CallJumptable
-
-.FlyScriptTable: ; 03:51c9
- init_script_table
- add_script TryFly
- add_script ShowFlyMap
- add_script DoFly
- add_script FailFly
-
-TryFly: ; 03:51d1
- call GetMapEnvironment
- cp TOWN
- jr z, .success
- cp ROUTE
- jr z, .success
- set_script FailFly
- xor a
- ret
-.success
- set_script ShowFlyMap
- xor a
- ret
-
-ShowFlyMap: ; 03:51ea
- call LoadStandardMenuHeader
- call ClearSprites
- callab FlyMap
- call ClearPalettes
- call GetMemSGBLayout
- call ExitMenu
- ld a, [wFlyDestination]
- cp -1
- jr z, .dont_fly
- cp NUM_SPAWNS
- jr nc, .dont_fly
- set_script DoFly
- xor a
- ret
-.dont_fly
- call UpdateTimePals
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-DoFly: ; 03:521f
- ld a, [wFlyDestination]
- inc a
- ld [wDefaultSpawnPoint], a
- queue_ba FlyScript
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-FailFly: ; 03:5237
- ld hl, Text_CantUseFlyHere
- call MenuTextBoxBackup
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantUseFlyHere: ; 03:5246
- text "ここでは つかえません!"
- prompt
-
-FlyScript: ; 03:5254
- ld a, MAPSETUP_TELEPORT
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-
-DigFunction: ; 03:5260
- call .ResetScriptID
-.next
- ld a, [wFieldMoveScriptID]
- bit SCRIPT_FINISHED_F, a
- jr nz, .finish
- ld hl, .DigScriptTable
- call CallJumptable
- jr .next
-
-; Finish by returning only the low nibble
-.finish
- and $FF - SCRIPT_FINISHED_MASK
- ld [wFieldMoveSucceeded], a
- ret
-
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-
-.DigScriptTable: ; 03:527D
- init_script_table
- add_script CheckCanDig
- add_script DoDig
- add_script FailDig
-
-CheckCanDig: ; 03:5283
- call GetMapEnvironment
- cp INDOOR
- jr z, .success
- cp CAVE
- jr z, .success
- set_script FailDig
- ret
-.success
- set_script DoDig
- ret
-
-DoDig: ; 03:529a
- queue_ab DigScript
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
- ld [wFieldMoveScriptID], a
- ret
-
-FailDig: ; 03:52a8
- ld hl, Text_CantUseDigHere
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- ret
-
-Text_CantUseDigHere: ; 03:52b4
- text "ここでは つかえません!"
- prompt
-
-DigScript: ; 03:52c2
- ld hl, wDigWarpNumber
- ld de, wNextWarp
- ld bc, 3
- call CopyBytes
- ld a, MAPSETUP_WARP
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-EmptyFunctiond2da: ; 03:52da
- ret
-
-TeleportFunction: ; 03:52db
- xor a
- ld [wFieldMoveScriptID], a
-.next
- ld a, [wFieldMoveScriptID]
- bit SCRIPT_FINISHED_F, a
- jr nz, .finish
- ld hl, .TeleportScriptTable
- call CallJumptable
- jr .next
-
-; Finish by returning only the low nibble
-.finish
- and $FF - SCRIPT_FINISHED_MASK
- ld [wFieldMoveSucceeded], a
- ret
-
-.TeleportScriptTable
- init_script_table
- add_script TryTeleport
- add_script DoTeleport
- add_script FailTeleport
- add_script CheckIfSpawnPoint
-
-TryTeleport: ; 03:52fc
- call GetMapEnvironment
- cp TOWN
- jr z, .success
- cp ROUTE
- jr z, .success
- set_script FailTeleport
- ret
-.success
- set_script CheckIfSpawnPoint
- ret
-
-CheckIfSpawnPoint ; 03:5313
- ld a, [wLastSpawnMapGroup]
- ld d, a
- ld a, [wLastSpawnMapNumber]
- ld e, a
- callab IsSpawnPoint
- jr c, .not_spawn
- ld hl, Text_CantFindDestination
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- ret
-.not_spawn
- ld a, c
- ld [wDefaultSpawnPoint], a
- set_script DoTeleport
- ret
-
-Text_CantFindDestination: ; 03:533B
- text "とびさきが みつかりません"
- para ""
- done
-
-DoTeleport: ; 03:534b
- queue_ba TeleportScript
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
- ld [wFieldMoveScriptID], a
- ret
-
-FailTeleport: ; 03:5359
- ld hl, Text_CantUseTeleportHere
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- scf
- ret
-
-Text_CantUseTeleportHere: ; 03:5366
- text "ここでは つかえません!"
- para ""
- done
-
-TeleportScript: ; 03:5375
- call RefreshScreen
- ld hl, Text_ReturnToLastMonCenter
- call MenuTextBox
- ld c, 60
- call DelayFrames
- call CloseWindow
- call Function1fea
- ld a, MAPSETUP_TELEPORT
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-Text_ReturnToLastMonCenter: ; 03:5395
- text "さいごに たちよった"
- line "#センターにもどります"
- done
+INCLUDE "constants.asm" + +; TODO - need to constantize tile ids, movements + +SECTION "Field Moves", ROMX[$4fab], BANK[$03] + +CutFunction: ; 03:4fab + call .ResetScriptID +.next + call .ExecScript + jr nc, .next + ld [wFieldMoveSucceeded], a + ret +.ResetScriptID + xor a + ld [wFieldMoveScriptID], a + ret +.ExecScript + ld a, [wFieldMoveScriptID] + ld hl, .CutScriptTable + jp CallJumptable + +.CutScriptTable ; 03:4fc5 + init_script_table + add_script TryCut + add_script CheckCuttableBlock + add_script CheckCuttableTile + add_script DoCut + add_script DoCut2 + add_script FailCut + +TryCut: ; 03:4fd1 + call GetMapEnvironment + cp ROUTE + jr z, .success + cp TOWN + jr z, .success + set_script FailCut + xor a + ret +.success + set_script CheckCuttableBlock + xor a + ret + +CheckCuttableBlock: ; 03:4fea + call GetFacingTileCoord + cp $80 + jr nz, .fail + call GetBlockLocation + ld a, l + ld [wMapBlocksAddress], a + ld a, h + ld [wMapBlocksAddress + 1], a + ld a, [hl] + call GetCutReplacementBlock + jr nc, .fail + dec hl + ld a, [hl] + ld [wReplacementBlock], a + set_script DoCut2 + xor a + ret +.fail + set_script CheckCuttableTile + xor a + ret + +GetCutReplacementBlock: ; 03:5015 + ld c, a + ld hl, CutReplacementBlocks +.loop + ld a, [hli] + cp -1 + ret z + inc hl + cp c + jr nz, .loop + scf + ret + +CutReplacementBlocks: ; 03:5023 +; replacement block, facing block + db $30, $25 + db $31, $2A + db $32, $34 + db $33, $35 + db -1 + +CheckCuttableTile: ; 03:502c + call GetFacingTileCoord + call IsCuttableTile + jr nc, .fail + call GetBlockLocation + ld a, [hl] + cp $3b + jr nz, .fail + ld a, l + ld [wMapBlocksAddress], a + ld a, h + ld [wMapBlocksAddress + 1], a + ld a, $04 + ld [wReplacementBlock], a + set_script DoCut + xor a + ret +.fail + set_script FailCut + xor a + ret + +IsCuttableTile: ; 03:5057 + ld hl, CuttableTiles + ld c, a +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr nz, .loop + scf + ret + +CuttableTiles: ; 03:5064 + db $81 + db $82 + db $8A + db $8B + db -1 + +FailCut: ; 03:5069 + ld hl, Text_CantUseCutHere + call MenuTextBoxBackup + scf + ld a, SCRIPT_FAIL + ret + +Text_CantUseCutHere: ; 03:5073 + text "ここでは つかえません" + prompt + +DoCut: +DoCut2: ; 03:5080 + far_queue CutScript + scf + ld a, SCRIPT_SUCCESS + ret + +CutScript: ; 03:508C + call RefreshScreen + ld hl, wPartyMonNicknames + ld a, BOXMON + ld [wMonType], a + ld a, [wWhichPokemon] + call GetNick + call CopyStringToStringBuffer2 + ld hl, Text_CutItDown + call MenuTextBoxBackup + ld de, MUSIC_SURF + call PlaySFX + ld hl, wMapBlocksAddress + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wReplacementBlock] + ld [hl], a + call LoadMapPart + call UpdateSprites + call WaitBGMap + call Function1fea + scf + ret + +Text_CutItDown ; 03:50c4 + text_from_ram wStringBuffer2 + text " は " + line "くさかりを つかった!" + prompt + +SurfFunction: ; 03:50d8 + call .ResetScriptID +.next + call .ExecScript + jr nc, .next + ld [wFieldMoveSucceeded], a + ret +.ResetScriptID + xor a + ld [wFieldMoveScriptID], a + ret +.ExecScript + ld a, [wFieldMoveScriptID] + ld hl, .SurfScriptTable + jp CallJumptable + +.SurfScriptTable: ; 03:50f2 + init_script_table + add_script TrySurf + add_script DoSurf + add_script FailSurf + +TrySurf: ; 03:50f8 + call GetFacingTileCoord + and $f0 + cp $20 + jr z, .success + cp $40 + jr z, .success + set_script FailSurf + xor a + ret +.success + set_script DoSurf + xor a + ret + +DoSurf: ; 03:5113 + queue_ba SurfScript + ld a, -1 + ld [wFieldMoveScriptID], a + scf + ld a, SCRIPT_SUCCESS + ret + +FailSurf: ; 03:5124 + ld hl, Text_CantSurfHere + call MenuTextBoxBackup + ld a, -1 + ld [wFieldMoveScriptID], a + scf + ld a, SCRIPT_FAIL + ret + +Text_CantSurfHere: ; 03:5133 + text "ここでは のることが" + next "できません" + prompt + +SurfScript: ; 03:5145 + call RefreshScreen + ld hl, wPartyMonNicknames + ld a, BOXMON + ld [wMonType], a + ld a, [wWhichPokemon] + call GetNick + call CopyStringToStringBuffer2 + ld hl, Text_UsedSurf + call MenuTextBoxBackup + ld a, PLAYER_SURF + ld [wPlayerState], a + call Function0d02 + call PlayMapMusic + call MovePlayerIntoWater + call Function1fea + ret + +Text_UsedSurf: ; 03:5171 + text_from_ram wStringBuffer2 + text " は " + line "@" + text_from_ram wPlayerName + text "を のせた!" + prompt + +MovePlayerIntoWater: ; 03:5185 + call InitMovementBuffer + call .get_movement_direction + call AppendToMovementBuffer + ld a, $32 + call AppendToMovementBuffer + ld a, 0 + ld hl, wMovementBuffer + call LoadMovementDataPointer +.get_movement_direction + ld a, [wPlayerWalking] + srl a + srl a + ld e, a + ld d, $00 + ld hl, SurfMovementDirections + add hl, de + ld a, [hl] + ret + +; Direction to move player, mapped to facing direction +SurfMovementDirections: ; 03:51ab + db 4, 5, 6, 7 + + +FlyFunction: ; 03:51af + call .ResetScriptID +.next + call .ExecScript + jr nc, .next + ld [wFieldMoveSucceeded], a + ret +.ResetScriptID + xor a + ld [wFieldMoveScriptID], a + ret +.ExecScript + ld a, [wFieldMoveScriptID] + ld hl, .FlyScriptTable + jp CallJumptable + +.FlyScriptTable: ; 03:51c9 + init_script_table + add_script TryFly + add_script ShowFlyMap + add_script DoFly + add_script FailFly + +TryFly: ; 03:51d1 + call GetMapEnvironment + cp TOWN + jr z, .success + cp ROUTE + jr z, .success + set_script FailFly + xor a + ret +.success + set_script ShowFlyMap + xor a + ret + +ShowFlyMap: ; 03:51ea + call LoadStandardMenuHeader + call ClearSprites + callab FlyMap + call ClearPalettes + call GetMemSGBLayout + call ExitMenu + ld a, [wFlyDestination] + cp -1 + jr z, .dont_fly + cp NUM_SPAWNS + jr nc, .dont_fly + set_script DoFly + xor a + ret +.dont_fly + call UpdateTimePals + ld a, -1 + ld [wFieldMoveScriptID], a + scf + ld a, SCRIPT_FAIL + ret + +DoFly: ; 03:521f + ld a, [wFlyDestination] + inc a + ld [wDefaultSpawnPoint], a + queue_ba FlyScript + ld a, -1 + ld [wFieldMoveScriptID], a + scf + ld a, SCRIPT_SUCCESS + ret + +FailFly: ; 03:5237 + ld hl, Text_CantUseFlyHere + call MenuTextBoxBackup + ld a, -1 + ld [wFieldMoveScriptID], a + scf + ld a, SCRIPT_FAIL + ret + +Text_CantUseFlyHere: ; 03:5246 + text "ここでは つかえません!" + prompt + +FlyScript: ; 03:5254 + ld a, MAPSETUP_TELEPORT + ldh [hMapEntryMethod], a + jpab Functionfcc24 + + +DigFunction: ; 03:5260 + call .ResetScriptID +.next + ld a, [wFieldMoveScriptID] + bit SCRIPT_FINISHED_F, a + jr nz, .finish + ld hl, .DigScriptTable + call CallJumptable + jr .next + +; Finish by returning only the low nibble +.finish + and $FF - SCRIPT_FINISHED_MASK + ld [wFieldMoveSucceeded], a + ret + +.ResetScriptID + xor a + ld [wFieldMoveScriptID], a + ret + +.DigScriptTable: ; 03:527D + init_script_table + add_script CheckCanDig + add_script DoDig + add_script FailDig + +CheckCanDig: ; 03:5283 + call GetMapEnvironment + cp INDOOR + jr z, .success + cp CAVE + jr z, .success + set_script FailDig + ret +.success + set_script DoDig + ret + +DoDig: ; 03:529a + queue_ab DigScript + ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS + ld [wFieldMoveScriptID], a + ret + +FailDig: ; 03:52a8 + ld hl, Text_CantUseDigHere + call MenuTextBoxBackup + ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL + ld [wFieldMoveScriptID], a + ret + +Text_CantUseDigHere: ; 03:52b4 + text "ここでは つかえません!" + prompt + +DigScript: ; 03:52c2 + ld hl, wDigWarpNumber + ld de, wNextWarp + ld bc, 3 + call CopyBytes + ld a, MAPSETUP_WARP + ldh [hMapEntryMethod], a + jpab Functionfcc24 + +EmptyFunctiond2da: ; 03:52da + ret + +TeleportFunction: ; 03:52db + xor a + ld [wFieldMoveScriptID], a +.next + ld a, [wFieldMoveScriptID] + bit SCRIPT_FINISHED_F, a + jr nz, .finish + ld hl, .TeleportScriptTable + call CallJumptable + jr .next + +; Finish by returning only the low nibble +.finish + and $FF - SCRIPT_FINISHED_MASK + ld [wFieldMoveSucceeded], a + ret + +.TeleportScriptTable + init_script_table + add_script TryTeleport + add_script DoTeleport + add_script FailTeleport + add_script CheckIfSpawnPoint + +TryTeleport: ; 03:52fc + call GetMapEnvironment + cp TOWN + jr z, .success + cp ROUTE + jr z, .success + set_script FailTeleport + ret +.success + set_script CheckIfSpawnPoint + ret + +CheckIfSpawnPoint ; 03:5313 + ld a, [wLastSpawnMapGroup] + ld d, a + ld a, [wLastSpawnMapNumber] + ld e, a + callab IsSpawnPoint + jr c, .not_spawn + ld hl, Text_CantFindDestination + call MenuTextBoxBackup + ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL + ld [wFieldMoveScriptID], a + ret +.not_spawn + ld a, c + ld [wDefaultSpawnPoint], a + set_script DoTeleport + ret + +Text_CantFindDestination: ; 03:533B + text "とびさきが みつかりません" + para "" + done + +DoTeleport: ; 03:534b + queue_ba TeleportScript + ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS + ld [wFieldMoveScriptID], a + ret + +FailTeleport: ; 03:5359 + ld hl, Text_CantUseTeleportHere + call MenuTextBoxBackup + ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL + ld [wFieldMoveScriptID], a + scf + ret + +Text_CantUseTeleportHere: ; 03:5366 + text "ここでは つかえません!" + para "" + done + +TeleportScript: ; 03:5375 + call RefreshScreen + ld hl, Text_ReturnToLastMonCenter + call MenuTextBox + ld c, 60 + call DelayFrames + call CloseWindow + call Function1fea + ld a, MAPSETUP_TELEPORT + ldh [hMapEntryMethod], a + jpab Functionfcc24 + +Text_ReturnToLastMonCenter: ; 03:5395 + text "さいごに たちよった" + line "#センターにもどります" + done diff --git a/engine/items/inventory.asm b/engine/items/inventory.asm index 9524d70..c30e5c0 100755 --- a/engine/items/inventory.asm +++ b/engine/items/inventory.asm @@ -1,723 +1,723 @@ -INCLUDE "constants.asm"
-
-SECTION "Inventory", ROMX[$4AA1], BANK[$03]
-
-_ReceiveItem: ; 03:4AA1
- call DoesHLEqualwNumBagItems
- jp nz, PutItemInPocket
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets: ; 03:4ABA
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Item: ; 03:4AC2
- pop hl
- jp PutItemInPocket
-
-.KeyItem: ; 03:4AC6
- pop hl
- jp ReceiveKeyItem
-
-.Ball: ; 03:4ACA
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp ReceiveBall
-
-.TMHM: ; 03:4AD5
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp ReceiveTMHM
-
-
-_TossItem: ; 03:4AE0
- call DoesHLEqualwNumBagItems
- jr nz, .remove_item
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets ; 03:4AF8
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Ball ; 03:4B00
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp TossBall
-
-.TMHM ; 03:4B0B
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp TossTMHM
-
-.KeyItem ; 03:4B16
- pop hl
- jp TossKeyItem
-
-.Item ; 03:4B1A
- pop hl
-
-.remove_item ; 03:4B1B
- jp RemoveItemFromPocket
-
-
-_CheckItem: ; 03:4B1E
- call DoesHLEqualwNumBagItems
- jr nz, .not_bag
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets ; 03:4B36
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Ball ; 03:4B3E
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp CheckBall
-
-.TMHM ; 03:4B49
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp CheckTMHM
-
-.KeyItem ; 03:4B54
- pop hl
- jp CheckKeyItems
-
-.Item ; 03:4B58
- pop hl
-
-.not_bag
- jp CheckTheItem
-
-
-DoesHLEqualwNumBagItems: ; 03:4B5C
- ld a, l
- cp LOW(wNumBagItems)
- ret nz
- ld a, h
- cp HIGH(wNumBagItems)
- ret
-
-
-PutItemInPocket: ; 03:4B64
- ld d, h
- ld e, l
- inc hl
- ld a, [wCurItem]
- ld c, a
- ld b, 0
-
-; will add the item once the total
-; available space (b) exceeds the
-; amount being added
-.loop
- ld a, [hli]
- cp -1
- jr z, .terminator
- cp c
- jr nz, .next
- ld a, 99
- sub [hl]
- add b
- ld b, a
- ld a, [wItemQuantity]
- cp b
- jr z, .can_add
- jr c, .can_add
-
-.next
- inc hl
- jr .loop
-
-.terminator
- call GetPocketCapacity
- ld a, [de]
- cp c
- jr c, .can_add
-
- and a
- ret
-
-.can_add
- ld h, d
- ld l, e
- ld a, [wCurItem]
- ld c, a
-
-.loop2
- inc hl
- ld a, [hli]
- cp a, -1
- jr z, .terminator2
- cp c
- jr nz, .loop2
-
- ld a, [wItemQuantity]
- add [hl]
- cp a, 100
- jr nc, .set_max
- ld [hl], a
- jr .done
-
-; set this slot's quantity to 99,
-; and keep iterating through list
-; to add remaining amount
-.set_max
- ld [hl], 99
- sub 99
- ld [wItemQuantity], a
- jr .loop2
-
-.terminator2
- dec hl
- ld a, [wCurItem]
- ld [hli], a
- ld a, [wItemQuantity]
- ld [hli], a
- ld [hl], -1
- ld h, d
- ld l, e
- inc [hl]
-
-.done
- scf
- ret
-
-
-GetPocketCapacity: ; 03:4BC1
- ld c, MAX_ITEMS
- ld a, e
- cp a, LOW(wNumBagItems)
- jr nz, .not_bag
- ld a, d
- cp HIGH(wNumBagItems)
- ret z
-
-.not_bag
- ld c, MAX_PC_ITEMS
- ret
-
-
-RemoveItemFromPocket: ;03:4BCF
- ld d, h
- ld e, l
- inc hl
- ld a, [wItemIndex]
- ld c, a
- ld b, 0
- add hl, bc
- add hl, bc
- inc hl
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
-
- ld [hl], a
- ld [wItemQuantityBuffer], a
- and a
- jr nz, .done
-
-; if the remaining quantity is zero
-; then erase the slot by shifting
-; the subsequent data upwards
- dec hl
- ld b, h
- ld c, l
- inc hl
- inc hl
-
-.loop
- ld a, [hli]
- ld [bc], a
- inc bc
- cp -1
- jr nz, .loop
- ld h, d
- ld l, e
- dec [hl]
-
-.done
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckTheItem: ; 03:4BFD
- ld a, [wCurItem]
- ld c, a
-
-.loop
- inc hl
- ld a, [hli]
- cp -1
- jr z, .fail
- cp c
- jr nz, .loop
-
- scf
- ret
-
-.fail
- and a
- ret
-
-
-ReceiveKeyItem: ; 03:4C0E
- ld hl, wNumKeyItems
- ld a, [hli]
- cp a, MAX_KEY_ITEMS
- jr nc, .full_pack
- ld c, a
- ld b, 0
- add hl, bc
- ld a, [wCurItem]
- ld [hli], a
- ld [hl], -1
- ld hl, wNumKeyItems
- inc [hl]
- scf
- ret
-
-.full_pack
- and a
- ret
-
-
-TossKeyItem: ; 03:4C28
- ld hl, wNumKeyItems
- dec [hl]
- inc hl
- ld a, [wItemIndex]
- ld e, a
- ld d, 0
- add hl, de
- ld d, h
- ld e, l
- inc hl
-
-; erase this item by shifting
-; all subsequent data upwards
-.loop
- ld a, [hli]
- ld [de], a
- inc de
- cp -1
- jr nz, .loop
- scf
- ret
-
-
-CheckKeyItems: ; 03:4C40
- ld a, [wCurItem]
- ld c, a
- ld hl, wKeyItems
-
-.loop
- ld a, [hli]
- cp c
- jr z, .done
- cp -1
- jr nz, .loop
-
- and a
- ret
-
-.done
- scf
- ret
-
-
-; get index of ball item id c from BallItems
-GetBallIndex: ; 03:4C53
- ld a, c
- push hl
- push de
- push bc
- ld hl, BallItems
- ld de, 1
- call FindItemInTable
- ld a, b
- pop bc
- pop de
- pop hl
- ld c, a
- ret
-
-
-; get ball item id at index c in BallItems
-GetBallByIndex: ; 03:4c66
- push bc
- push hl
- ld b, 0
- ld hl, BallItems
- add hl, bc
- ld a, [hl]
- pop hl
- pop bc
- ld c, a
- ret
-
-
-BallItems: ; 03:4C73
- db ITEM_MASTER_BALL
- db ITEM_ULTRA_BALL
- db ITEM_GREAT_BALL
- db ITEM_POKE_BALL
- db -1
-
-
-; empties the ball pocket by setting the
-; terminator immediately after wNumBallItems
-
- ; Note, the ball pocket appears to be
- ; a fixed length, not -1 terminated
-EmptyBallPocket: ; 03:4C78
- ld hl, wNumBallItems
- xor a
- ld [hli], a
- ld [hl], -1
- ret
-
-
-ReceiveBall: ; 03:4C80
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [wItemQuantity]
- add [hl]
- cp 100
- jr nc, .overflow
- ld b, a
- ld a, [hl]
- and a
- jr nz, .done
-
-; increase the ball pocket size if
-; this ball's previous quantity was 0
- ld a, [wNumBallItems]
- inc a
- ld [wNumBallItems], a
-
-.done
- ld [hl], b
- scf
- ret
-
-.overflow
- and a
- ret
-
-
-TossBall: ; 03:4C9F
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
- jr nz, .done
-
-; increase the ball pocket size if
-; this ball's new quantity is 0
- ld b, a
- ld a, [wNumBallItems]
- dec a
- ld [wNumBallItems], a
- ld a, b
-
-.done
- ld [hl], a
- ld [wItemQuantityBuffer], a
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckBall: ; 03:4CC0
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [hl]
- and a
- ret z
- scf
- ret
-
-
-ReceiveTMHM: ; 03:4CCB
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [wItemQuantity]
- add [hl]
- cp 100
- jr nc, .overflow
- ld [hl], a
- scf
- ret
-
-.overflow
- and a
- ret
-
-
-TossTMHM: ; 03:4CDE
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
-
- ld [hl], a
- ld [wItemQuantityBuffer], a
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckTMHM: ; 03:4CF4
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [hl]
- and a
- ret z
- scf
- ret
-
-GetTMHMNumber: ; 03:4CFF
- ld a, c
- ld c, 0
-
- sub ITEM_TM01
- jr c, .not_machine
-
- cp ITEM_C8 - ITEM_TM01
- jr z, .not_machine
- jr c, .finish
-
- inc c
- cp ITEM_E1 - ITEM_TM01
- jr z, .not_machine
-
- jr c, .finish
- inc c
-
-; c represents the amount of non-TMs which
-; appear ahead of this item in the list
-; so subtract that value before exiting
-.finish
- sub c
- ld c, a
- scf
- ret
-
-.not_machine
- and a
- ret
-
-GetNumberedTMHM: ; 03:4D1A
-; Return the item id of a TM/HM by number c.
- ld a, c
- ld c, 0
-; Adjust for any dummy items.
- cp ITEM_C8 - ITEM_TM01 ; TM01-04
- jr c, .finish
- inc c
- cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28
- jr c, .finish
- inc c
- cp ITEM_FF - ITEM_TM01 - 2 ; End of list
- jr nc, .not_machine
-.finish
- add c
- add ITEM_TM01
- ld c, a
- scf
- ret
-.not_machine
- and a
- ret
-
-SECTION "GetItemAmount", ROMX[$4e10], BANK[$03]
-
-; Returns carry if user has the item
-; and the amount in b
-GetItemAmount: ; 03:4e10
- call CheckAmountInItemPocket
- ret c
- call CheckAmountInKeyItems
- ret c
- ld b, 0
- and a
- ret
-
-; Returns the amount of item b in b
-CheckAmountInItemPocket: ; 03:4E1C
- ld hl, wItems
-.loop
- inc hl
- ld a, [hli]
- cp -1
- ret z
- cp b
- jr nz, .loop
-
- ld a, [hl]
- ld b, a
- scf
- ret
-
-; Returns the amount of item b in b
-CheckAmountInKeyItems: ; 03:4E2B
- ld hl, wNumKeyItems
- ld a, [hli]
- and a
- ret z
-
-.loop
- ld a, [hli]
- cp -1
- ret z
- cp b
- jr nz, .loop
- ld b, 1
- scf
- ret
-
-SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03]
-
-; Return 1 in wItemAttributeParamBuffer and
-; carry if wCurItem can't be removed from the bag.
-_CheckTossableItem: ; 03:53AD
- ld a, ITEMATTR_PERMISSIONS
- call GetItemAttr
- bit CANT_TOSS_F, a
- jr nz, ItemAttr_ReturnCarry
- and a
- ret
-
-; Return 1 in wItemAttributeParamBuffer
-; and carry if wCurItem can't be selected.
-CheckSelectableItem: ; 03:53B8
- ld a, ITEMATTR_PERMISSIONS
- call GetItemAttr
- bit CANT_SELECT_F, a
- jr nz, ItemAttr_ReturnCarry
- and a
- ret
-
-; Return the pocket for wCurItem in wItemAttributeParamBuffer.
-CheckItemPocket: ; 03:53C3
- ld a, ITEMATTR_POCKET
- call GetItemAttr
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Return the context for wCurItem in wItemAttributeParamBuffer.
-CheckItemContext: ; 03:53CE
- ld a, ITEMATTR_HELP
- call GetItemAttr
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Return the menu for wCurItem in wItemAttributeParamBuffer.
-CheckItemMenu: ; 03:53D9
- ld a, ITEMATTR_HELP
- call GetItemAttr
- swap a
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Get attribute a of wCurItem.
-GetItemAttr: ; 03:53E6
- push hl
- push bc
- ld hl, ItemAttributes
- ld c, a
- ld b, 0
- add hl, bc
- xor a
- ld [wItemAttributeParamBuffer], a
- ld a, [wCurItem]
- dec a
- ld c, a
- ld a, ITEMATTR_STRUCT_LENGTH
- call AddNTimes
- ld a, BANK(ItemAttributes)
- call GetFarByte
- pop bc
- pop hl
- ret
-
-ItemAttr_ReturnCarry: ; 03:5405
- ld a, 1
- ld [wItemAttributeParamBuffer], a
- scf
- ret
-
-; Return the price of wCurItem in de.
-GetItemPrice: ; 03:540C
- push hl
- push bc
- ld a, ITEMATTR_PRICE
- call GetItemAttr
- ld e, a
- ld a, ITEMATTR_PRICE_HI
- call GetItemAttr
- ld d, a
- pop bc
- pop hl
- ret
+INCLUDE "constants.asm" + +SECTION "Inventory", ROMX[$4AA1], BANK[$03] + +_ReceiveItem: ; 03:4AA1 + call DoesHLEqualwNumBagItems + jp nz, PutItemInPocket + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets: ; 03:4ABA + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Item: ; 03:4AC2 + pop hl + jp PutItemInPocket + +.KeyItem: ; 03:4AC6 + pop hl + jp ReceiveKeyItem + +.Ball: ; 03:4ACA + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp ReceiveBall + +.TMHM: ; 03:4AD5 + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp ReceiveTMHM + + +_TossItem: ; 03:4AE0 + call DoesHLEqualwNumBagItems + jr nz, .remove_item + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets ; 03:4AF8 + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball ; 03:4B00 + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp TossBall + +.TMHM ; 03:4B0B + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp TossTMHM + +.KeyItem ; 03:4B16 + pop hl + jp TossKeyItem + +.Item ; 03:4B1A + pop hl + +.remove_item ; 03:4B1B + jp RemoveItemFromPocket + + +_CheckItem: ; 03:4B1E + call DoesHLEqualwNumBagItems + jr nz, .not_bag + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets ; 03:4B36 + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball ; 03:4B3E + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp CheckBall + +.TMHM ; 03:4B49 + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp CheckTMHM + +.KeyItem ; 03:4B54 + pop hl + jp CheckKeyItems + +.Item ; 03:4B58 + pop hl + +.not_bag + jp CheckTheItem + + +DoesHLEqualwNumBagItems: ; 03:4B5C + ld a, l + cp LOW(wNumBagItems) + ret nz + ld a, h + cp HIGH(wNumBagItems) + ret + + +PutItemInPocket: ; 03:4B64 + ld d, h + ld e, l + inc hl + ld a, [wCurItem] + ld c, a + ld b, 0 + +; will add the item once the total +; available space (b) exceeds the +; amount being added +.loop + ld a, [hli] + cp -1 + jr z, .terminator + cp c + jr nz, .next + ld a, 99 + sub [hl] + add b + ld b, a + ld a, [wItemQuantity] + cp b + jr z, .can_add + jr c, .can_add + +.next + inc hl + jr .loop + +.terminator + call GetPocketCapacity + ld a, [de] + cp c + jr c, .can_add + + and a + ret + +.can_add + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + +.loop2 + inc hl + ld a, [hli] + cp a, -1 + jr z, .terminator2 + cp c + jr nz, .loop2 + + ld a, [wItemQuantity] + add [hl] + cp a, 100 + jr nc, .set_max + ld [hl], a + jr .done + +; set this slot's quantity to 99, +; and keep iterating through list +; to add remaining amount +.set_max + ld [hl], 99 + sub 99 + ld [wItemQuantity], a + jr .loop2 + +.terminator2 + dec hl + ld a, [wCurItem] + ld [hli], a + ld a, [wItemQuantity] + ld [hli], a + ld [hl], -1 + ld h, d + ld l, e + inc [hl] + +.done + scf + ret + + +GetPocketCapacity: ; 03:4BC1 + ld c, MAX_ITEMS + ld a, e + cp a, LOW(wNumBagItems) + jr nz, .not_bag + ld a, d + cp HIGH(wNumBagItems) + ret z + +.not_bag + ld c, MAX_PC_ITEMS + ret + + +RemoveItemFromPocket: ;03:4BCF + ld d, h + ld e, l + inc hl + ld a, [wItemIndex] + ld c, a + ld b, 0 + add hl, bc + add hl, bc + inc hl + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + + ld [hl], a + ld [wItemQuantityBuffer], a + and a + jr nz, .done + +; if the remaining quantity is zero +; then erase the slot by shifting +; the subsequent data upwards + dec hl + ld b, h + ld c, l + inc hl + inc hl + +.loop + ld a, [hli] + ld [bc], a + inc bc + cp -1 + jr nz, .loop + ld h, d + ld l, e + dec [hl] + +.done + scf + ret + +.underflow + and a + ret + + +CheckTheItem: ; 03:4BFD + ld a, [wCurItem] + ld c, a + +.loop + inc hl + ld a, [hli] + cp -1 + jr z, .fail + cp c + jr nz, .loop + + scf + ret + +.fail + and a + ret + + +ReceiveKeyItem: ; 03:4C0E + ld hl, wNumKeyItems + ld a, [hli] + cp a, MAX_KEY_ITEMS + jr nc, .full_pack + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurItem] + ld [hli], a + ld [hl], -1 + ld hl, wNumKeyItems + inc [hl] + scf + ret + +.full_pack + and a + ret + + +TossKeyItem: ; 03:4C28 + ld hl, wNumKeyItems + dec [hl] + inc hl + ld a, [wItemIndex] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + inc hl + +; erase this item by shifting +; all subsequent data upwards +.loop + ld a, [hli] + ld [de], a + inc de + cp -1 + jr nz, .loop + scf + ret + + +CheckKeyItems: ; 03:4C40 + ld a, [wCurItem] + ld c, a + ld hl, wKeyItems + +.loop + ld a, [hli] + cp c + jr z, .done + cp -1 + jr nz, .loop + + and a + ret + +.done + scf + ret + + +; get index of ball item id c from BallItems +GetBallIndex: ; 03:4C53 + ld a, c + push hl + push de + push bc + ld hl, BallItems + ld de, 1 + call FindItemInTable + ld a, b + pop bc + pop de + pop hl + ld c, a + ret + + +; get ball item id at index c in BallItems +GetBallByIndex: ; 03:4c66 + push bc + push hl + ld b, 0 + ld hl, BallItems + add hl, bc + ld a, [hl] + pop hl + pop bc + ld c, a + ret + + +BallItems: ; 03:4C73 + db ITEM_MASTER_BALL + db ITEM_ULTRA_BALL + db ITEM_GREAT_BALL + db ITEM_POKE_BALL + db -1 + + +; empties the ball pocket by setting the +; terminator immediately after wNumBallItems + + ; Note, the ball pocket appears to be + ; a fixed length, not -1 terminated +EmptyBallPocket: ; 03:4C78 + ld hl, wNumBallItems + xor a + ld [hli], a + ld [hl], -1 + ret + + +ReceiveBall: ; 03:4C80 + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [wItemQuantity] + add [hl] + cp 100 + jr nc, .overflow + ld b, a + ld a, [hl] + and a + jr nz, .done + +; increase the ball pocket size if +; this ball's previous quantity was 0 + ld a, [wNumBallItems] + inc a + ld [wNumBallItems], a + +.done + ld [hl], b + scf + ret + +.overflow + and a + ret + + +TossBall: ; 03:4C9F + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + jr nz, .done + +; increase the ball pocket size if +; this ball's new quantity is 0 + ld b, a + ld a, [wNumBallItems] + dec a + ld [wNumBallItems], a + ld a, b + +.done + ld [hl], a + ld [wItemQuantityBuffer], a + scf + ret + +.underflow + and a + ret + + +CheckBall: ; 03:4CC0 + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [hl] + and a + ret z + scf + ret + + +ReceiveTMHM: ; 03:4CCB + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantity] + add [hl] + cp 100 + jr nc, .overflow + ld [hl], a + scf + ret + +.overflow + and a + ret + + +TossTMHM: ; 03:4CDE + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + + ld [hl], a + ld [wItemQuantityBuffer], a + scf + ret + +.underflow + and a + ret + + +CheckTMHM: ; 03:4CF4 + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [hl] + and a + ret z + scf + ret + +GetTMHMNumber: ; 03:4CFF + ld a, c + ld c, 0 + + sub ITEM_TM01 + jr c, .not_machine + + cp ITEM_C8 - ITEM_TM01 + jr z, .not_machine + jr c, .finish + + inc c + cp ITEM_E1 - ITEM_TM01 + jr z, .not_machine + + jr c, .finish + inc c + +; c represents the amount of non-TMs which +; appear ahead of this item in the list +; so subtract that value before exiting +.finish + sub c + ld c, a + scf + ret + +.not_machine + and a + ret + +GetNumberedTMHM: ; 03:4D1A +; Return the item id of a TM/HM by number c. + ld a, c + ld c, 0 +; Adjust for any dummy items. + cp ITEM_C8 - ITEM_TM01 ; TM01-04 + jr c, .finish + inc c + cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28 + jr c, .finish + inc c + cp ITEM_FF - ITEM_TM01 - 2 ; End of list + jr nc, .not_machine +.finish + add c + add ITEM_TM01 + ld c, a + scf + ret +.not_machine + and a + ret + +SECTION "GetItemAmount", ROMX[$4e10], BANK[$03] + +; Returns carry if user has the item +; and the amount in b +GetItemAmount: ; 03:4e10 + call CheckAmountInItemPocket + ret c + call CheckAmountInKeyItems + ret c + ld b, 0 + and a + ret + +; Returns the amount of item b in b +CheckAmountInItemPocket: ; 03:4E1C + ld hl, wItems +.loop + inc hl + ld a, [hli] + cp -1 + ret z + cp b + jr nz, .loop + + ld a, [hl] + ld b, a + scf + ret + +; Returns the amount of item b in b +CheckAmountInKeyItems: ; 03:4E2B + ld hl, wNumKeyItems + ld a, [hli] + and a + ret z + +.loop + ld a, [hli] + cp -1 + ret z + cp b + jr nz, .loop + ld b, 1 + scf + ret + +SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03] + +; Return 1 in wItemAttributeParamBuffer and +; carry if wCurItem can't be removed from the bag. +_CheckTossableItem: ; 03:53AD + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_TOSS_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +; Return 1 in wItemAttributeParamBuffer +; and carry if wCurItem can't be selected. +CheckSelectableItem: ; 03:53B8 + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_SELECT_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +; Return the pocket for wCurItem in wItemAttributeParamBuffer. +CheckItemPocket: ; 03:53C3 + ld a, ITEMATTR_POCKET + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Return the context for wCurItem in wItemAttributeParamBuffer. +CheckItemContext: ; 03:53CE + ld a, ITEMATTR_HELP + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Return the menu for wCurItem in wItemAttributeParamBuffer. +CheckItemMenu: ; 03:53D9 + ld a, ITEMATTR_HELP + call GetItemAttr + swap a + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Get attribute a of wCurItem. +GetItemAttr: ; 03:53E6 + push hl + push bc + ld hl, ItemAttributes + ld c, a + ld b, 0 + add hl, bc + xor a + ld [wItemAttributeParamBuffer], a + ld a, [wCurItem] + dec a + ld c, a + ld a, ITEMATTR_STRUCT_LENGTH + call AddNTimes + ld a, BANK(ItemAttributes) + call GetFarByte + pop bc + pop hl + ret + +ItemAttr_ReturnCarry: ; 03:5405 + ld a, 1 + ld [wItemAttributeParamBuffer], a + scf + ret + +; Return the price of wCurItem in de. +GetItemPrice: ; 03:540C + push hl + push bc + ld a, ITEMATTR_PRICE + call GetItemAttr + ld e, a + ld a, ITEMATTR_PRICE_HI + call GetItemAttr + ld d, a + pop bc + pop hl + ret diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm index d2e9545..7f886f1 100755 --- a/engine/items/item_effects.asm +++ b/engine/items/item_effects.asm @@ -1,79 +1,79 @@ -INCLUDE "constants.asm"
-
-SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03]
-
-ApplyPPUp: ; 03:78f6
- ld a, MON_MOVES
- call GetPartyParamLocation
- push hl
- ld de, wStringBuffer1
- predef FillPP
- pop hl
- ld c, MON_PP - MON_MOVES
- ld b, 0
- add hl, bc
- ld de, wStringBuffer1 + 1
- ld b, 0
-.loop
- inc b
- ld a, b
- cp NUM_MOVES + 1
- ret z
- ld a, [wce37]
- dec a
- jr nz, .use
- ld a, [wMenuCursorY]
- inc a
- cp b
- jr nz, .skip
-.use
- ld a, [hl]
- and PP_UP_MASK
- call nz, ComputeMaxPP
-.skip
- inc hl
- inc de
- jr .loop
-
-ComputeMaxPP: ; 03:792B
- push bc
- ; Divide the base PP by 5.
- ld a, [de]
- ldh [hDividend + 3], a
- xor a
- ldh [hDividend], a
- ldh [hDividend + 1], a
- ldh [hDividend + 2], a
- ld a, 5
- ldh [hDivisor], a
- ld b, 4
- call Divide
- ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM.
- ld a, [hl]
- ld b, a
- swap a
- and $f
- srl a
- srl a
- ld c, a
-.loop
- ; Normally, a move with 40 PP would have 64 PP with three PP Ups.
- ; Since this would overflow into bit 6, we prevent that from happening
- ; by decreasing the extra amount of PP each PP Up provides, resulting
- ; in a maximum of 61.
- ldh a, [hQuotient + 2]
- cp $8
- jr c, .okay
- ld a, $7
-.okay
- add b
- ld b, a
- ld a, [wce37]
- dec a
- jr z, .no_pp_up
- dec c
- jr nz, .loop
-.no_pp_up
- ld [hl], b
- pop bc
- ret
+INCLUDE "constants.asm" + +SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03] + +ApplyPPUp: ; 03:78f6 + ld a, MON_MOVES + call GetPartyParamLocation + push hl + ld de, wStringBuffer1 + predef FillPP + pop hl + ld c, MON_PP - MON_MOVES + ld b, 0 + add hl, bc + ld de, wStringBuffer1 + 1 + ld b, 0 +.loop + inc b + ld a, b + cp NUM_MOVES + 1 + ret z + ld a, [wce37] + dec a + jr nz, .use + ld a, [wMenuCursorY] + inc a + cp b + jr nz, .skip +.use + ld a, [hl] + and PP_UP_MASK + call nz, ComputeMaxPP +.skip + inc hl + inc de + jr .loop + +ComputeMaxPP: ; 03:792B + push bc + ; Divide the base PP by 5. + ld a, [de] + ldh [hDividend + 3], a + xor a + ldh [hDividend], a + ldh [hDividend + 1], a + ldh [hDividend + 2], a + ld a, 5 + ldh [hDivisor], a + ld b, 4 + call Divide + ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. + ld a, [hl] + ld b, a + swap a + and $f + srl a + srl a + ld c, a +.loop + ; Normally, a move with 40 PP would have 64 PP with three PP Ups. + ; Since this would overflow into bit 6, we prevent that from happening + ; by decreasing the extra amount of PP each PP Up provides, resulting + ; in a maximum of 61. + ldh a, [hQuotient + 2] + cp $8 + jr c, .okay + ld a, $7 +.okay + add b + ld b, a + ld a, [wce37] + dec a + jr z, .no_pp_up + dec c + jr nz, .loop +.no_pp_up + ld [hl], b + pop bc + ret diff --git a/engine/overworld/spawn_points.asm b/engine/overworld/spawn_points.asm index c159a21..2476c46 100755 --- a/engine/overworld/spawn_points.asm +++ b/engine/overworld/spawn_points.asm @@ -1,59 +1,59 @@ -INCLUDE "constants.asm"
-
-SECTION "LoadSpawnPoint", ROMX[$4791], BANK[$03]
-
-LoadSpawnPoint: ; 03:4791
-; loads the spawn point in wDefaultSpawnPoint
- push hl
- push de
- ld a, [wDefaultSpawnPoint]
- and a
- jr z, .skip
- dec a
- ld l, a
- ld h, 0
- add hl, hl
- add hl, hl
- ld de, SpawnPoints
- add hl, de
- ld a, [hli]
- ld [wMapGroup], a
- ld a, [hli]
- ld [wMapId], a
- ld a, [hli]
- ld [wXCoord], a
- ld a, [hli]
- ld [wYCoord], a
-.skip
- pop de
- pop hl
- ret
-
-IsSpawnPoint: ; 03:47b6
-; Checks if the map loaded in de is a spawn point.
-; Returns carry if it's a spawn point.
- ld hl, SpawnPoints
- ld c, 1
-.loop
- ld a, [hl]
- cp SPAWN_N_A
- jr z, .fail
- cp d
- jr nz, .next
- inc hl
- ld a, [hld]
- cp e
- jr z, .succeed
-.next
- push bc
- ld bc, SPAWN_POINT_SIZE
- add hl, bc
- pop bc
- inc c
- jr .loop
-.fail
- and a
- ret
-.succeed
- scf
- ret
+INCLUDE "constants.asm" + +SECTION "LoadSpawnPoint", ROMX[$4791], BANK[$03] + +LoadSpawnPoint: ; 03:4791 +; loads the spawn point in wDefaultSpawnPoint + push hl + push de + ld a, [wDefaultSpawnPoint] + and a + jr z, .skip + dec a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, SpawnPoints + add hl, de + ld a, [hli] + ld [wMapGroup], a + ld a, [hli] + ld [wMapId], a + ld a, [hli] + ld [wXCoord], a + ld a, [hli] + ld [wYCoord], a +.skip + pop de + pop hl + ret + +IsSpawnPoint: ; 03:47b6 +; Checks if the map loaded in de is a spawn point. +; Returns carry if it's a spawn point. + ld hl, SpawnPoints + ld c, 1 +.loop + ld a, [hl] + cp SPAWN_N_A + jr z, .fail + cp d + jr nz, .next + inc hl + ld a, [hld] + cp e + jr z, .succeed +.next + push bc + ld bc, SPAWN_POINT_SIZE + add hl, bc + pop bc + inc c + jr .loop +.fail + and a + ret +.succeed + scf + ret diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm index 2d81b8d..8456623 100755 --- a/engine/pokemon/health.asm +++ b/engine/pokemon/health.asm @@ -1,358 +1,358 @@ -INCLUDE "constants.asm"
-
-SECTION "HealParty", ROMX[$4d6f], BANK[$03]
-
-HealParty: ; 03:4d6f
- ld hl, wPartySpecies
- ld de, wPartyMons
-
-.party_loop
- ld a, [hli]
- cp -1
- jr z, .party_done
- push hl
- push de
-
-; Clear the status
- ld hl, MON_STATUS
- add hl, de
- xor a
- ld [hli], a
- ld [hl], a
-
-; Reset the PP
- ld hl, MON_MOVES
- add hl, de
- ld b, NUM_MOVES
-
-.move_loop
- push hl
- push bc
- ld a, [hl]
- and a
- jr z, .next_move
- dec a
- push hl
- ld hl, Moves
- ld bc, MOVE_DATA_SIZE
- call AddNTimes
- ld a, BANK(Moves)
- call GetFarByte
- pop hl
- ld bc, MON_PP - MON_MOVES
- add hl, bc
- ld b, a
- ld a, [hl]
- and PP_UP_MASK
- add b
- ld [hl], a
-
-.next_move
- pop bc
- pop hl
- inc hl
- dec b
- jr nz, .move_loop
-
-; Reset the HP
- pop de
- push de
- ld hl, MON_MAXHP
- add hl, de
- ld b, h
- ld c, l
- dec bc
- dec bc
- ld a, [hli]
- ld [bc], a
- inc bc
- ld a, [hl]
- ld [bc], a
- pop de
- pop hl
- push hl
- ld hl, PARTYMON_STRUCT_LENGTH
- add hl, de
- ld d, h
- ld e, l
- pop hl
- jr .party_loop
-
-.party_done
- xor a
- ld [wWhichPokemon], a
- ld [wce37], a
- ld a, [wPartyCount]
- ld b, a
-
-.pp_up
- push bc
- call ApplyPPUp
- pop bc
- ld hl, wWhichPokemon
- inc [hl]
- dec b
- jr nz, .pp_up
- ret
-
-SECTION "HP Bar", ROMX[$4e3c], BANK[$03]
-
-ComputeHPBarPixels: ; 03:4e3c
- push hl
- xor a
- ldh [hMultiplicand], a
- ld a, b
- ldh [hMultiplicand + 1], a
- ld a, c
- ldh [hMultiplicand + 2], a
- ld a, HP_BAR_LENGTH_PX
- ldh [hMultiplier], a
- call Multiply
- ; We need de to be under 256 because hDivisor is only 1 byte.
- ld a, d
- and a
- jr z, .divide
- ; divide de and hProduct by 4
- srl d
- rr e
- srl d
- rr e
- ldh a, [hProduct + 2]
- ld b, a
- ldh a, [hProduct + 3]
- srl b
- rr a
- srl b
- rr a
- ldh [hDividend + 3], a
- ld a, b
- ldh [hDividend + 2], a
-.divide
- ld a, e
- ldh [hDivisor], a
- ld b, 4
- call Divide
- ldh a, [hQuotient + 2]
- ld e, a
- pop hl
- and a
- ret nz
- ld e, 1
- ret
-
-UpdateHPBar: ; 03:4e7c
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
- push de
- push bc
- call UpdateHPBar_CalcHPDifference
- ld a, e
- ld [wHPBarHPDifference + 1], a
- ld a, d
- ld [wHPBarHPDifference], a
- pop bc
- pop de
- call UpdateHPBar_CompareNewHPToOldHP
- ret z
- ld a, -1
- jr c, .hp_decrease
- ld a, 1
-.hp_decrease
- ld [wHPBarDelta], a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
-.animate_hp_bar_loop
- push de
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- call UpdateHPBar_CompareNewHPToOldHP
- jr z, .animate_hp_bar_done
- jr nc, .hp_increase
-
-;hp_decrease
- dec bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, e
- sub d
- jr .apply
-.hp_increase
- inc bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, d
- sub e
-.apply
- call UpdateHPBar_PrintHPNumber
- and a
- jr z, .no_pixel_difference
- call UpdateHPBar_AnimateHPBar
-.no_pixel_difference
- ld a, [wHPBarNewHP]
- ld [wHPBarOldHP], a
- ld a, [wHPBarNewHP + 1]
- ld [wHPBarOldHP + 1], a
- pop de
- jr .animate_hp_bar_loop
-.animate_hp_bar_done
- pop de
- ld a, e
- ld [wHPBarOldHP], a
- ld a, d
- ld [wHPBarOldHP + 1], a
- or e
- jr z, .mon_fainted
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld d, e
-.mon_fainted
- call UpdateHPBar_PrintHPNumber
- ld a, 1
- call UpdateHPBar_AnimateHPBar
- jp WaitBGMap
-
-; animates the HP bar going up or down for (a) ticks (two waiting frames each)
-; stops prematurely if bar is filled up
-; e: current health (in pixels) to start with
-UpdateHPBar_AnimateHPBar: ; 03:4F11
- push hl
-
-.bar_animation_loop
- push af
- push de
- ld d, HP_BAR_LENGTH
- ld a, [wHPBarType]
- and BATTLE_HP_BAR
- ld b, a
- call DrawBattleHPBar
- ld c, 2
- call DelayFrames
- pop de
- ld a, [wHPBarDelta]
- add e
- cp HP_BAR_LENGTH_PX + 1
- jr nc, .bar_filled_up
- ld e, a
- pop af
- dec a
- jr nz, .bar_animation_loop
- pop hl
- ret
-.bar_filled_up
- pop af
- pop hl
- ret
-
-; compares old HP and new HP and sets c and z flags accordingly
-UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37
- ld a, d
- sub b
- ret nz
- ld a, e
- sub c
- ret
-
-; calcs HP difference between bc and de (into de)
-UpdateHPBar_CalcHPDifference: ; 03:4F3D
- ld a, d
- sub b
- jr c, .old_hp_greater
- jr z, .test_lower_byte
-.new_hp_greater
- ld a, e
- sub c
- ld e, a
- ld a, d
- sbc b
- ld d, a
- ret
-.old_hp_greater
- ld a, c
- sub e
- ld e, a
- ld a, b
- sbc d
- ld d, a
- ret
-.test_lower_byte
- ld a, e
- sub c
- jr c, .old_hp_greater
- jr nz, .new_hp_greater
- ld de, 0
- ret
-
-UpdateHPBar_PrintHPNumber: ; 03:4F5B
- push af
- push de
- ld a, [wHPBarType]
- and a
- jr z, .done
- ld a, [wHPBarOldHP]
- ld [wHPBarTempHP + 1], a
- ld a, [wHPBarOldHP + 1]
- ld [wHPBarTempHP], a
- push hl
- ld de, SCREEN_WIDTH + 1
- add hl, de
- push hl
- ld a, " "
- ld [hli], a
- ld [hli], a
- ld [hli], a
- pop hl
- ld de, wHPBarTempHP
- lb bc, 2, 3
- call PrintNumber
- call DelayFrame
- pop hl
-.done
- pop de
- pop af
- ret
-
-; calcs number of HP bar pixels for old and new HP value
-; d: new pixels
-; e: old pixels
-UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B
- push hl
- ld hl, wHPBarMaxHP
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- push de
- call ComputeHPBarPixels
- ld a, e
- pop de
- pop bc
- push af
- call ComputeHPBarPixels
- pop af
- ld d, e
- ld e, a
- pop hl
- ret
+INCLUDE "constants.asm" + +SECTION "HealParty", ROMX[$4d6f], BANK[$03] + +HealParty: ; 03:4d6f + ld hl, wPartySpecies + ld de, wPartyMons + +.party_loop + ld a, [hli] + cp -1 + jr z, .party_done + push hl + push de + +; Clear the status + ld hl, MON_STATUS + add hl, de + xor a + ld [hli], a + ld [hl], a + +; Reset the PP + ld hl, MON_MOVES + add hl, de + ld b, NUM_MOVES + +.move_loop + push hl + push bc + ld a, [hl] + and a + jr z, .next_move + dec a + push hl + ld hl, Moves + ld bc, MOVE_DATA_SIZE + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop hl + ld bc, MON_PP - MON_MOVES + add hl, bc + ld b, a + ld a, [hl] + and PP_UP_MASK + add b + ld [hl], a + +.next_move + pop bc + pop hl + inc hl + dec b + jr nz, .move_loop + +; Reset the HP + pop de + push de + ld hl, MON_MAXHP + add hl, de + ld b, h + ld c, l + dec bc + dec bc + ld a, [hli] + ld [bc], a + inc bc + ld a, [hl] + ld [bc], a + pop de + pop hl + push hl + ld hl, PARTYMON_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + pop hl + jr .party_loop + +.party_done + xor a + ld [wWhichPokemon], a + ld [wce37], a + ld a, [wPartyCount] + ld b, a + +.pp_up + push bc + call ApplyPPUp + pop bc + ld hl, wWhichPokemon + inc [hl] + dec b + jr nz, .pp_up + ret + +SECTION "HP Bar", ROMX[$4e3c], BANK[$03] + +ComputeHPBarPixels: ; 03:4e3c + push hl + xor a + ldh [hMultiplicand], a + ld a, b + ldh [hMultiplicand + 1], a + ld a, c + ldh [hMultiplicand + 2], a + ld a, HP_BAR_LENGTH_PX + ldh [hMultiplier], a + call Multiply + ; We need de to be under 256 because hDivisor is only 1 byte. + ld a, d + and a + jr z, .divide + ; divide de and hProduct by 4 + srl d + rr e + srl d + rr e + ldh a, [hProduct + 2] + ld b, a + ldh a, [hProduct + 3] + srl b + rr a + srl b + rr a + ldh [hDividend + 3], a + ld a, b + ldh [hDividend + 2], a +.divide + ld a, e + ldh [hDivisor], a + ld b, 4 + call Divide + ldh a, [hQuotient + 2] + ld e, a + pop hl + and a + ret nz + ld e, 1 + ret + +UpdateHPBar: ; 03:4e7c + ld a, [wHPBarOldHP] + ld c, a + ld a, [wHPBarOldHP + 1] + ld b, a + ld a, [wHPBarNewHP] + ld e, a + ld a, [wHPBarNewHP + 1] + ld d, a + push de + push bc + call UpdateHPBar_CalcHPDifference + ld a, e + ld [wHPBarHPDifference + 1], a + ld a, d + ld [wHPBarHPDifference], a + pop bc + pop de + call UpdateHPBar_CompareNewHPToOldHP + ret z + ld a, -1 + jr c, .hp_decrease + ld a, 1 +.hp_decrease + ld [wHPBarDelta], a + ld a, [wHPBarNewHP] + ld e, a + ld a, [wHPBarNewHP + 1] + ld d, a +.animate_hp_bar_loop + push de + ld a, [wHPBarOldHP] + ld c, a + ld a, [wHPBarOldHP + 1] + ld b, a + call UpdateHPBar_CompareNewHPToOldHP + jr z, .animate_hp_bar_done + jr nc, .hp_increase + +;hp_decrease + dec bc + ld a, c + ld [wHPBarNewHP], a + ld a, b + ld [wHPBarNewHP + 1], a + call UpdateHPBar_CalcOldNewHPBarPixels + ld a, e + sub d + jr .apply +.hp_increase + inc bc + ld a, c + ld [wHPBarNewHP], a + ld a, b + ld [wHPBarNewHP + 1], a + call UpdateHPBar_CalcOldNewHPBarPixels + ld a, d + sub e +.apply + call UpdateHPBar_PrintHPNumber + and a + jr z, .no_pixel_difference + call UpdateHPBar_AnimateHPBar +.no_pixel_difference + ld a, [wHPBarNewHP] + ld [wHPBarOldHP], a + ld a, [wHPBarNewHP + 1] + ld [wHPBarOldHP + 1], a + pop de + jr .animate_hp_bar_loop +.animate_hp_bar_done + pop de + ld a, e + ld [wHPBarOldHP], a + ld a, d + ld [wHPBarOldHP + 1], a + or e + jr z, .mon_fainted + call UpdateHPBar_CalcOldNewHPBarPixels + ld d, e +.mon_fainted + call UpdateHPBar_PrintHPNumber + ld a, 1 + call UpdateHPBar_AnimateHPBar + jp WaitBGMap + +; animates the HP bar going up or down for (a) ticks (two waiting frames each) +; stops prematurely if bar is filled up +; e: current health (in pixels) to start with +UpdateHPBar_AnimateHPBar: ; 03:4F11 + push hl + +.bar_animation_loop + push af + push de + ld d, HP_BAR_LENGTH + ld a, [wHPBarType] + and BATTLE_HP_BAR + ld b, a + call DrawBattleHPBar + ld c, 2 + call DelayFrames + pop de + ld a, [wHPBarDelta] + add e + cp HP_BAR_LENGTH_PX + 1 + jr nc, .bar_filled_up + ld e, a + pop af + dec a + jr nz, .bar_animation_loop + pop hl + ret +.bar_filled_up + pop af + pop hl + ret + +; compares old HP and new HP and sets c and z flags accordingly +UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37 + ld a, d + sub b + ret nz + ld a, e + sub c + ret + +; calcs HP difference between bc and de (into de) +UpdateHPBar_CalcHPDifference: ; 03:4F3D + ld a, d + sub b + jr c, .old_hp_greater + jr z, .test_lower_byte +.new_hp_greater + ld a, e + sub c + ld e, a + ld a, d + sbc b + ld d, a + ret +.old_hp_greater + ld a, c + sub e + ld e, a + ld a, b + sbc d + ld d, a + ret +.test_lower_byte + ld a, e + sub c + jr c, .old_hp_greater + jr nz, .new_hp_greater + ld de, 0 + ret + +UpdateHPBar_PrintHPNumber: ; 03:4F5B + push af + push de + ld a, [wHPBarType] + and a + jr z, .done + ld a, [wHPBarOldHP] + ld [wHPBarTempHP + 1], a + ld a, [wHPBarOldHP + 1] + ld [wHPBarTempHP], a + push hl + ld de, SCREEN_WIDTH + 1 + add hl, de + push hl + ld a, " " + ld [hli], a + ld [hli], a + ld [hli], a + pop hl + ld de, wHPBarTempHP + lb bc, 2, 3 + call PrintNumber + call DelayFrame + pop hl +.done + pop de + pop af + ret + +; calcs number of HP bar pixels for old and new HP value +; d: new pixels +; e: old pixels +UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B + push hl + ld hl, wHPBarMaxHP + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + push hl + push de + call ComputeHPBarPixels + ld a, e + pop de + pop bc + push af + call ComputeHPBarPixels + pop af + ld d, e + ld e, a + pop hl + ret diff --git a/gfx/pokemon/annon_pics.asm b/gfx/pokemon/annon_pics.asm index 4999071..1a342e7 100644 --- a/gfx/pokemon/annon_pics.asm +++ b/gfx/pokemon/annon_pics.asm @@ -1,53 +1,53 @@ -AnnonPics::
-AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic" ; 0x07cdd2--0x07ce57
-AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic" ; 0x07ce57--0x07ced0
-AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic" ; 0x07ced0--0x07cf64
-AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic" ; 0x07cf64--0x07cfed
-AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic" ; 0x07cfed--0x07d0a1
-AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic" ; 0x07d0a1--0x07d147
-AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic" ; 0x07d147--0x07d1ec
-AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic" ; 0x07d1ec--0x07d285
-AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic" ; 0x07d285--0x07d30e
-AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic" ; 0x07d30e--0x07d38b
-AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic" ; 0x07d38b--0x07d425
-AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic" ; 0x07d425--0x07d4ae
-AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic" ; 0x07d4ae--0x07d53f
-AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic" ; 0x07d53f--0x07d5c4
-AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic" ; 0x07d5c4--0x07d693
-AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic" ; 0x07d693--0x07d757
-AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic" ; 0x07d757--0x07d7c0
-AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic" ; 0x07d7c0--0x07d81f
-AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic" ; 0x07d81f--0x07d89b
-AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic" ; 0x07d89b--0x07d909
-AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic" ; 0x07d909--0x07d98d
-AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic" ; 0x07d98d--0x07da06
-AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic" ; 0x07da06--0x07da7a
-AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic" ; 0x07da7a--0x07dade
-AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic" ; 0x07dade--0x07dba1
-AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic" ; 0x07dba1--0x07dc57
-AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic" ; 0x07dc57--0x07dcf4
-AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic" ; 0x07dcf4--0x07dd8b
-AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic" ; 0x07dd8b--0x07de55
-AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic" ; 0x07de55--0x07df15
-AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic" ; 0x07df15--0x07df7d
-AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic" ; 0x07df7d--0x07dfd6
-AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic" ; 0x07dfd6--0x07e03d
-AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic" ; 0x07e03d--0x07e099
-AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic" ; 0x07e099--0x07e0ff
-AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic" ; 0x07e0ff--0x07e159
-AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic" ; 0x07e159--0x07e1f0
-AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic" ; 0x07e1f0--0x07e27a
-AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic" ; 0x07e27a--0x07e2e8
-AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic" ; 0x07e2e8--0x07e348
-AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic" ; 0x07e348--0x07e3e7
-AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic" ; 0x07e3e7--0x07e47a
-AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic" ; 0x07e47a--0x07e50a
-AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic" ; 0x07e50a--0x07e589
-AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic" ; 0x07e589--0x07e60d
-AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic" ; 0x07e60d--0x07e681
-AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic" ; 0x07e681--0x07e705
-AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic" ; 0x07e705--0x07e77b
-AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic" ; 0x07e77b--0x07e801
-AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic" ; 0x07e801--0x07e87c
-AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic" ; 0x07e87c--0x07e8fa
-AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic" ; 0x07e8fa--0x07e96a
+AnnonPics:: +AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic" ; 0x07cdd2--0x07ce57 +AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic" ; 0x07ce57--0x07ced0 +AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic" ; 0x07ced0--0x07cf64 +AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic" ; 0x07cf64--0x07cfed +AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic" ; 0x07cfed--0x07d0a1 +AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic" ; 0x07d0a1--0x07d147 +AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic" ; 0x07d147--0x07d1ec +AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic" ; 0x07d1ec--0x07d285 +AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic" ; 0x07d285--0x07d30e +AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic" ; 0x07d30e--0x07d38b +AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic" ; 0x07d38b--0x07d425 +AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic" ; 0x07d425--0x07d4ae +AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic" ; 0x07d4ae--0x07d53f +AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic" ; 0x07d53f--0x07d5c4 +AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic" ; 0x07d5c4--0x07d693 +AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic" ; 0x07d693--0x07d757 +AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic" ; 0x07d757--0x07d7c0 +AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic" ; 0x07d7c0--0x07d81f +AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic" ; 0x07d81f--0x07d89b +AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic" ; 0x07d89b--0x07d909 +AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic" ; 0x07d909--0x07d98d +AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic" ; 0x07d98d--0x07da06 +AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic" ; 0x07da06--0x07da7a +AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic" ; 0x07da7a--0x07dade +AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic" ; 0x07dade--0x07dba1 +AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic" ; 0x07dba1--0x07dc57 +AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic" ; 0x07dc57--0x07dcf4 +AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic" ; 0x07dcf4--0x07dd8b +AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic" ; 0x07dd8b--0x07de55 +AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic" ; 0x07de55--0x07df15 +AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic" ; 0x07df15--0x07df7d +AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic" ; 0x07df7d--0x07dfd6 +AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic" ; 0x07dfd6--0x07e03d +AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic" ; 0x07e03d--0x07e099 +AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic" ; 0x07e099--0x07e0ff +AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic" ; 0x07e0ff--0x07e159 +AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic" ; 0x07e159--0x07e1f0 +AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic" ; 0x07e1f0--0x07e27a +AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic" ; 0x07e27a--0x07e2e8 +AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic" ; 0x07e2e8--0x07e348 +AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic" ; 0x07e348--0x07e3e7 +AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic" ; 0x07e3e7--0x07e47a +AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic" ; 0x07e47a--0x07e50a +AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic" ; 0x07e50a--0x07e589 +AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic" ; 0x07e589--0x07e60d +AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic" ; 0x07e60d--0x07e681 +AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic" ; 0x07e681--0x07e705 +AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic" ; 0x07e705--0x07e77b +AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic" ; 0x07e77b--0x07e801 +AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic" ; 0x07e801--0x07e87c +AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic" ; 0x07e87c--0x07e8fa +AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic" ; 0x07e8fa--0x07e96a diff --git a/home/items.asm b/home/items.asm index dd4e8d3..332d5e1 100755 --- a/home/items.asm +++ b/home/items.asm @@ -1,69 +1,69 @@ -INCLUDE "constants.asm"
-
-if DEBUG
-SECTION "TossItem", ROM0[$3243]
-else
-SECTION "TossItem", ROM0[$3207]
-endc
-
-TossItem: ; 00:3243
- ldh a, [hROMBank]
- push af
- ld a, BANK(_TossItem)
- call Bankswitch
- push hl
- push de
- push bc
- call _TossItem
- pop bc
- pop de
- pop hl
- pop af
- call Bankswitch
- ret
-
-ReceiveItem:: ; 3259
-; function to add an item (in varying quantities) to the player's bag or PC box
-; INPUT:
-; HL = address of inventory (either wNumBagItems or wNumBoxItems)
-; [wCurItem] = item ID
-; [wItemQuantity] = item quantity
-; sets carry flag if successful, unsets carry flag if unsuccessful
- push bc
- ldh a, [hROMBank]
- push af
- ld a, BANK(_ReceiveItem)
- call Bankswitch
- push hl
- push de
- call _ReceiveItem
- pop de
- pop hl
- pop bc
- ld a, b
- call Bankswitch
- pop bc
- ret
-
-if DEBUG
-SECTION "GiveItem", ROM0[$366C]
-else
-SECTION "GiveItem", ROM0[$3630]
-endc
-
-GiveItem::
-; Give player quantity c of item b,
-; and copy the item's name to wcf4b.
-; Return carry on success.
- ld a, b
- ld [wNamedObjectIndexBuffer], a
- ld [wCurItem], a
- ld a, c
- ld [wItemQuantity], a
- ld hl, wNumBagItems
- call ReceiveItem
- ret nc
- call GetItemName
- call CopyStringToStringBuffer2
- scf
- ret
+INCLUDE "constants.asm" + +if DEBUG +SECTION "TossItem", ROM0[$3243] +else +SECTION "TossItem", ROM0[$3207] +endc + +TossItem: ; 00:3243 + ldh a, [hROMBank] + push af + ld a, BANK(_TossItem) + call Bankswitch + push hl + push de + push bc + call _TossItem + pop bc + pop de + pop hl + pop af + call Bankswitch + ret + +ReceiveItem:: ; 3259 +; function to add an item (in varying quantities) to the player's bag or PC box +; INPUT: +; HL = address of inventory (either wNumBagItems or wNumBoxItems) +; [wCurItem] = item ID +; [wItemQuantity] = item quantity +; sets carry flag if successful, unsets carry flag if unsuccessful + push bc + ldh a, [hROMBank] + push af + ld a, BANK(_ReceiveItem) + call Bankswitch + push hl + push de + call _ReceiveItem + pop de + pop hl + pop bc + ld a, b + call Bankswitch + pop bc + ret + +if DEBUG +SECTION "GiveItem", ROM0[$366C] +else +SECTION "GiveItem", ROM0[$3630] +endc + +GiveItem:: +; Give player quantity c of item b, +; and copy the item's name to wcf4b. +; Return carry on success. + ld a, b + ld [wNamedObjectIndexBuffer], a + ld [wCurItem], a + ld a, c + ld [wItemQuantity], a + ld hl, wNumBagItems + call ReceiveItem + ret nc + call GetItemName + call CopyStringToStringBuffer2 + scf + ret diff --git a/home/tables.asm b/home/tables.asm index 5c35a4f..02fc78a 100755 --- a/home/tables.asm +++ b/home/tables.asm @@ -1,27 +1,27 @@ -INCLUDE "constants.asm"
-
-SECTION "FindItemInTable", ROM0[$35F8]
-
-; find value a from table hl with row length de
-; returns carry and row index b if successful
-FindItemInTable: ; 00:35F8
- ld b, 0
- ld c, a
-
-.loop
- ld a, [hl]
- cp -1
- jr z, .fail
- cp c
- jr z, .success
- inc b
- add hl, de
- jr .loop
-
-.fail
- and a
- ret
-
-.success
- scf
- ret
+INCLUDE "constants.asm" + +SECTION "FindItemInTable", ROM0[$35F8] + +; find value a from table hl with row length de +; returns carry and row index b if successful +FindItemInTable: ; 00:35F8 + ld b, 0 + ld c, a + +.loop + ld a, [hl] + cp -1 + jr z, .fail + cp c + jr z, .success + inc b + add hl, de + jr .loop + +.fail + and a + ret + +.success + scf + ret |