From 870d85fc2713703f6dbc760df5b2c54328f0c9c3 Mon Sep 17 00:00:00 2001 From: luckytyphlosion <10688458+luckytyphlosion@users.noreply.github.com> Date: Tue, 3 Jul 2018 13:27:51 -0400 Subject: Merge branch 'master' of https://github.com/pret/pokegold-spaceworld --- data/types/type_matchups.asm | 226 +++--- engine/bcd.asm | 110 +-- engine/events/field_moves.asm | 1082 +++++++++++++-------------- engine/items/inventory.asm | 1446 ++++++++++++++++++------------------- engine/items/item_effects.asm | 158 ++-- engine/overworld/spawn_points.asm | 118 +-- engine/pokemon/health.asm | 716 +++++++++--------- gfx/pokemon/annon_pics.asm | 106 +-- home/items.asm | 138 ++-- 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 -- cgit v1.2.3