diff options
author | xCrystal <rgr.crystal@gmail.com> | 2015-04-01 11:23:27 +0200 |
---|---|---|
committer | xCrystal <rgr.crystal@gmail.com> | 2015-04-01 17:05:10 +0200 |
commit | e74dce24b4bbb0d0d23a1724932b289050b66d4a (patch) | |
tree | ac695b04a00f7af920e1e84b88adbcb0fce84842 | |
parent | 9d93b5b630eaabd57f213c9dc5761223ff7445ec (diff) |
Rename battle files and split move effects Part 1
1.asm, 4.asm, and 4_2.asm
-rwxr-xr-x | engine/battle/4.asm | 77 | ||||
-rwxr-xr-x | engine/battle/4_2.asm | 413 | ||||
-rwxr-xr-x | engine/battle/animations.asm | 26 | ||||
-rwxr-xr-x | engine/battle/e.asm | 2 | ||||
-rw-r--r-- | engine/battle/end_of_battle.asm | 88 | ||||
-rw-r--r-- | engine/battle/get_trainer_name.asm | 24 | ||||
-rw-r--r-- | engine/battle/moveEffects/conversion_effect.asm | 34 | ||||
-rw-r--r--[-rwxr-xr-x] | engine/battle/moveEffects/drain_hp_effect.asm (renamed from engine/battle/1.asm) | 0 | ||||
-rw-r--r-- | engine/battle/moveEffects/haze_effect.asm | 76 | ||||
-rw-r--r-- | engine/battle/moveEffects/recoil_effect.asm | 68 | ||||
-rw-r--r-- | engine/battle/wild_encounters.asm | 118 | ||||
-rwxr-xr-x | engine/menu/status_screen.asm | 64 | ||||
-rw-r--r-- | engine/overworld/is_player_just_outside_map.asm | 16 | ||||
-rwxr-xr-x | main.asm | 11 |
14 files changed, 510 insertions, 507 deletions
diff --git a/engine/battle/4.asm b/engine/battle/4.asm deleted file mode 100755 index e96267c4..00000000 --- a/engine/battle/4.asm +++ /dev/null @@ -1,77 +0,0 @@ -; returns whether the player is one tile outside the map in Z -IsPlayerJustOutsideMap: ; 128d8 (4:68d8) - ld a, [W_YCOORD] - ld b, a - ld a, [W_CURMAPHEIGHT] - call .compareCoordWithMapDimension - ret z - ld a, [W_XCOORD] - ld b, a - ld a, [W_CURMAPWIDTH] -.compareCoordWithMapDimension - add a - cp b - ret z - inc b - ret - -DrawHP: ; 128ef (4:68ef) - call GetPredefRegisters - ld a, $1 - jr DrawHP_ - -DrawHP2: ; 128f6 (4:68f6) - call GetPredefRegisters - ld a, $2 - -DrawHP_: ; 128fb (4:68fb) - ld [wHPBarType], a - push hl - ld a, [wLoadedMonHP] - ld b, a - ld a, [wLoadedMonHP + 1] - ld c, a - or b - jr nz, .nonzeroHP - xor a - ld c, a - ld e, a - ld a, $6 - ld d, a - jp .drawHPBarAndPrintFraction -.nonzeroHP - ld a, [wLoadedMonMaxHP] - ld d, a - ld a, [wLoadedMonMaxHP + 1] - ld e, a - predef HPBarLength - ld a, $6 - ld d, a - ld c, a -.drawHPBarAndPrintFraction - pop hl - push de - push hl - push hl - call DrawHPBar - pop hl - ld a, [hFlags_0xFFF6] - bit 0, a - jr z, .printFractionBelowBar - ld bc, $9 ; right of bar - jr .printFraction -.printFractionBelowBar - ld bc, SCREEN_WIDTH + 1 ; below bar -.printFraction - add hl, bc - ld de, wLoadedMonHP - ld bc, $203 - call PrintNumber - ld a, "/" - ld [hli], a - ld de, wLoadedMonMaxHP - ld bc, $203 - call PrintNumber - pop hl - pop de - ret diff --git a/engine/battle/4_2.asm b/engine/battle/4_2.asm deleted file mode 100755 index ea29cca7..00000000 --- a/engine/battle/4_2.asm +++ /dev/null @@ -1,413 +0,0 @@ -EndOfBattle: ; 137aa (4:77aa) - ld a, [wLinkState] - cp LINK_STATE_BATTLING - jr nz, .notLinkBattle -; link battle - ld a, [wEnemyMonPartyPos] - ld hl, wEnemyMon1Status - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - ld a, [wEnemyMonStatus] - ld [hl], a - call ClearScreen - callab DisplayLinkBattleVersusTextBox - ld a, [wBattleResult] - cp $1 - ld de, YouWinText - jr c, .placeWinOrLoseString - ld de, YouLoseText - jr z, .placeWinOrLoseString - ld de, DrawText -.placeWinOrLoseString - hlCoord 6, 8 - call PlaceString - ld c, $c8 - call DelayFrames - jr .evolution -.notLinkBattle - ld a, [wBattleResult] - and a - jr nz, .resetVariables - ld hl, wTotalPayDayMoney - ld a, [hli] - or [hl] - inc hl - or [hl] - jr z, .evolution ; if pay day money is 0, jump - ld de, wPlayerMoney + 2 - ld c, $3 - predef AddBCDPredef - ld hl, PickUpPayDayMoneyText - call PrintText -.evolution - xor a - ld [wccd4], a - predef EvolutionAfterBattle -.resetVariables - xor a - ld [wLowHealthAlarm], a ;disable low health alarm - ld [wc02a], a - ld [W_ISINBATTLE], a - ld [W_BATTLETYPE], a - ld [W_MOVEMISSED], a - ld [W_CUROPPONENT], a - ld [wd11f], a - ld [wNumRunAttempts], a - ld [wEscapedFromBattle], a - ld hl, wcc2b - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld [wListScrollOffset], a - ld hl, wPlayerStatsToDouble - ld b, $18 -.loop - ld [hli], a - dec b - jr nz, .loop - ld hl, wd72c - set 0, [hl] - call WaitForSoundToFinish - call GBPalWhiteOut - ld a, $ff - ld [wDestinationWarpID], a - ret - -YouWinText: ; 13853 (4:7853) - db "YOU WIN@" - -YouLoseText: ; 1385b (4:785b) - db "YOU LOSE@" - -DrawText: ; 13864 (4:7864) - db " DRAW@" - -PickUpPayDayMoneyText: ; 1386b (4:786b) - TX_FAR _PickUpPayDayMoneyText - db "@" - -; try to initiate a wild pokemon encounter -; returns success in Z -TryDoWildEncounter: ; 13870 (4:7870) - ld a, [wNPCMovementScriptPointerTableNum] - and a - ret nz - ld a, [wd736] - and a - ret nz - callab IsPlayerStandingOnDoorTileOrWarpTile - jr nc, .notStandingOnDoorOrWarpTile -.CantEncounter - ld a, $1 - and a - ret -.notStandingOnDoorOrWarpTile - callab IsPlayerJustOutsideMap - jr z, .CantEncounter - ld a, [wRepelRemainingSteps] - and a - jr z, .asm_1389e - dec a - jr z, .lastRepelStep - ld [wRepelRemainingSteps], a -.asm_1389e -; determine if wild pokémon can appear in the half-block we’re standing in -; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile? - hlCoord 9, 9 - ld c, [hl] - ld a, [W_GRASSTILE] - cp c - ld a, [W_GRASSRATE] - jr z, .CanEncounter - ld a, $14 ; in all tilesets with a water tile, this is its id - cp c - ld a, [W_WATERRATE] - jr z, .CanEncounter -; even if not in grass/water, standing anywhere we can encounter pokémon -; so long as the map is “indoor” and has wild pokémon defined. -; …as long as it’s not Viridian Forest or Safari Zone. - ld a, [W_CURMAP] - cp REDS_HOUSE_1F ; is this an indoor map? - jr c, .CantEncounter2 - ld a, [W_CURMAPTILESET] - cp FOREST ; Viridian Forest/Safari Zone - jr z, .CantEncounter2 - ld a, [W_GRASSRATE] -.CanEncounter -; compare encounter chance with a random number to determine if there will be an encounter - ld b, a - ld a, [hRandomAdd] - cp b - jr nc, .CantEncounter2 - ld a, [hRandomSub] - ld b, a - ld hl, WildMonEncounterSlotChances -.determineEncounterSlot - ld a, [hli] - cp b - jr nc, .gotEncounterSlot - inc hl - jr .determineEncounterSlot -.gotEncounterSlot -; determine which wild pokémon (grass or water) can appear in the half-block we’re standing in - ld c, [hl] - ld hl, W_GRASSMONS - aCoord 8, 9 - cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile? - jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default - ld hl, W_WATERMONS -; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not, -; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters. -.gotWildEncounterType - ld b, $0 - add hl, bc - ld a, [hli] - ld [W_CURENEMYLVL], a - ld a, [hl] - ld [wcf91], a - ld [wEnemyMonSpecies2], a - ld a, [wRepelRemainingSteps] - and a - jr z, .willEncounter - ld a, [wPartyMon1Level] - ld b, a - ld a, [W_CURENEMYLVL] - cp b - jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon - jr .willEncounter -.lastRepelStep - ld [wRepelRemainingSteps], a - ld a, $d2 - ld [H_DOWNARROWBLINKCNT2], a - call EnableAutoTextBoxDrawing - call DisplayTextID -.CantEncounter2 - ld a, $1 - and a - ret -.willEncounter - xor a - ret - -WildMonEncounterSlotChances: ; 13918 (4:7918) -; There are 10 slots for wild pokemon, and this is the table that defines how common each of -; those 10 slots is. A random number is generated and then the first byte of each pair in this -; table is compared against that random number. If the random number is less than or equal -; to the first byte, then that slot is chosen. The second byte is double the slot number. - db $32, $00 ; 51/256 = 19.9% chance of slot 0 - db $65, $02 ; 51/256 = 19.9% chance of slot 1 - db $8C, $04 ; 39/256 = 15.2% chance of slot 2 - db $A5, $06 ; 25/256 = 9.8% chance of slot 3 - db $BE, $08 ; 25/256 = 9.8% chance of slot 4 - db $D7, $0A ; 25/256 = 9.8% chance of slot 5 - db $E4, $0C ; 13/256 = 5.1% chance of slot 6 - db $F1, $0E ; 13/256 = 5.1% chance of slot 7 - db $FC, $10 ; 11/256 = 4.3% chance of slot 8 - db $FF, $12 ; 3/256 = 1.2% chance of slot 9 - -RecoilEffect_: ; 1392c (4:792c) - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVENUM] - ld hl, wBattleMonMaxHP - jr z, .asm_1393d - ld a, [W_ENEMYMOVENUM] - ld hl, wEnemyMonMaxHP -.asm_1393d - ld d, a - ld a, [W_DAMAGE] - ld b, a - ld a, [W_DAMAGE + 1] - ld c, a - srl b - rr c - ld a, d - cp STRUGGLE - jr z, .asm_13953 - srl b - rr c -.asm_13953 - ld a, b - or c - jr nz, .asm_13958 - inc c -.asm_13958 - ld a, [hli] - ld [wHPBarMaxHP+1], a - ld a, [hl] - ld [wHPBarMaxHP], a - push bc - ld bc, $fff2 - add hl, bc - pop bc - ld a, [hl] - ld [wHPBarOldHP], a - sub c - ld [hld], a - ld [wHPBarNewHP], a - ld a, [hl] - ld [wHPBarOldHP+1], a - sbc b - ld [hl], a - ld [wHPBarNewHP+1], a - jr nc, .asm_13982 - xor a - ld [hli], a - ld [hl], a - ld hl, wHPBarNewHP - ld [hli], a - ld [hl], a -.asm_13982 - hlCoord 10, 9 - ld a, [H_WHOSETURN] - and a - ld a, $1 - jr z, .asm_13990 - hlCoord 2, 2 - xor a -.asm_13990 - ld [wHPBarType], a - predef UpdateHPBar2 - ld hl, HitWithRecoilText - jp PrintText -HitWithRecoilText: ; 1399e (4:799e) - TX_FAR _HitWithRecoilText - db "@" - -ConversionEffect_: ; 139a3 (4:79a3) - ld hl, wEnemyMonType1 - ld de, wBattleMonType1 - ld a, [H_WHOSETURN] - and a - ld a, [W_ENEMYBATTSTATUS1] - jr z, .asm_139b8 - push hl - ld h, d - ld l, e - pop de - ld a, [W_PLAYERBATTSTATUS1] -.asm_139b8 - bit Invulnerable, a ; is mon immune to typical attacks (dig/fly) - jr nz, PrintButItFailedText - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ld hl, PlayCurrentMoveAnimation - call CallBankF - ld hl, ConvertedTypeText - jp PrintText - -ConvertedTypeText: ; 139cd (4:79cd) - TX_FAR _ConvertedTypeText - db "@" - -PrintButItFailedText: ; 139d2 (4:79d2) - ld hl, PrintButItFailedText_ -CallBankF: ; 139d5 (4:79d5) - ld b, BANK(PrintButItFailedText_) - jp Bankswitch - -HazeEffect_: ; 139da (4:79da) - ld a, $7 - ld hl, wPlayerMonAttackMod - call ResetStatMods - ld hl, wEnemyMonAttackMod - call ResetStatMods - ld hl, wPlayerMonUnmodifiedAttack - ld de, wBattleMonAttack - call ResetStats - ld hl, wEnemyMonUnmodifiedAttack - ld de, wEnemyMonAttack - call ResetStats - ld hl, wEnemyMonStatus - ld de, wEnemySelectedMove - ld a, [H_WHOSETURN] - and a - jr z, .asm_13a09 - ld hl, wBattleMonStatus - dec de - -.asm_13a09 - ld a, [hl] - ld [hl], $0 - and $27 - jr z, .asm_13a13 - ld a, $ff - ld [de], a - -.asm_13a13 - xor a - ld [W_PLAYERDISABLEDMOVE], a - ld [W_ENEMYDISABLEDMOVE], a - ld hl, wccee - ld [hli], a - ld [hl], a - ld hl, W_PLAYERBATTSTATUS1 - call CureStatuses - ld hl, W_ENEMYBATTSTATUS1 - call CureStatuses - ld hl, PlayCurrentMoveAnimation - call CallBankF - ld hl, StatusChangesEliminatedText - jp PrintText - -CureStatuses: ; 13a37 (4:7a37) - res Confused, [hl] - inc hl ; BATTSTATUS2 - ld a, [hl] - and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2 - ld [hli], a ; BATTSTATUS3 - ld a, [hl] - and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses - ld [hl], a - ret - -ResetStatMods: ; 13a43 (4:7a43) - ld b, $8 -.loop - ld [hli], a - dec b - jr nz, .loop - ret - -ResetStats: ; 13a4a (4:7a4a) - ld b, $8 -.loop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop - ret - -StatusChangesEliminatedText: ; 13a53 (4:7a53) - TX_FAR _StatusChangesEliminatedText - db "@" - -GetTrainerName_: ; 13a58 (4:7a58) - ld hl, W_GRASSRATE - ld a, [wLinkState] - and a - jr nz, .rival - ld hl, W_RIVALNAME - ld a, [W_TRAINERCLASS] - cp SONY1 - jr z, .rival - cp SONY2 - jr z, .rival - cp SONY3 - jr z, .rival - ld [wd0b5], a - ld a, TRAINER_NAME - ld [wNameListType], a - ld a, BANK(TrainerNames) - ld [wPredefBank], a - call GetName - ld hl, wcd6d -.rival - ld de, W_TRAINERNAME - ld bc, $d - jp CopyData diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm index 0f12e05a..dc08e0e1 100755 --- a/engine/battle/animations.asm +++ b/engine/battle/animations.asm @@ -407,7 +407,7 @@ MoveAnimation: ; 78d5e (1e:4d5e) ld c,30 call DelayFrames .next4 - call PlayApplyingAttackAnimation ; reload pic and flash the pic in and out (to show damage) + call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage) .AnimationFinished call WaitForSoundToFinish xor a @@ -463,37 +463,37 @@ PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd) jp [hl] AnimationTypePointerTable: ; 78dcf (1e:4dcf) - dw ShakeScreenVertically ; enemy mon has used a non-damaging move + dw ShakeScreenVertically ; enemy mon has used a damaging move without a side effect dw ShakeScreenHorizontallyHeavy ; enemy mon has used a damaging move with a side effect - dw ShakeScreenHorizontallySlow ; enemy mon has used a damaging move without a side effect - dw BlinkEnemyMonSprite ; player mon has used a non-damaging move + dw ShakeScreenHorizontallySlow ; enemy mon has used a non-damaging move + dw BlinkEnemyMonSprite ; player mon has used a damaging move without a side effect dw ShakeScreenHorizontallyLight ; player mon has used a damaging move with a side effect - dw ShakeScreenHorizontallySlow2 ; player mon has used a damaging move without a side effect + dw ShakeScreenHorizontallySlow2 ; player mon has used a non-damaging move -ShakeScreenVertically: ; 78ddb (1e:4ddb) +ShakeScreenVertically: ; 78ddb (1e:4ddb) call PlayApplyingAttackSound ld b, $8 jp AnimationShakeScreenVertically -ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3) +ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3) call PlayApplyingAttackSound ld b, $8 - jp AnimationShakeScreenHorizontallyFast + jp AnimationShakeScreenHorizontallyFast -ShakeScreenHorizontallySlow: ; 78deb (1e:4deb) +ShakeScreenHorizontallySlow: ; 78deb (1e:4deb) ld bc, $602 - jr AnimationShakeScreenHorizontallySlow + jr AnimationShakeScreenHorizontallySlow -BlinkEnemyMonSprite: ; 78df0 (1e:4df0) +BlinkEnemyMonSprite: ; 78df0 (1e:4df0) call PlayApplyingAttackSound jp AnimationBlinkEnemyMon -ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6) +ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6) call PlayApplyingAttackSound ld b, $2 jp AnimationShakeScreenHorizontallyFast -ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe) +ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe) ld bc, $302 AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01) diff --git a/engine/battle/e.asm b/engine/battle/e.asm index e7802e4e..1144abe8 100755 --- a/engine/battle/e.asm +++ b/engine/battle/e.asm @@ -335,7 +335,7 @@ AIMoveChoiceModification3: ; 39817 (e:5817) ld a, [W_ENEMYMOVETYPE] ld d, a ld hl, wEnemyMonMoves ; enemy moves - ld b, $5 + ld b, NUM_MOVES + 1 ld c, $0 .loopMoves dec b diff --git a/engine/battle/end_of_battle.asm b/engine/battle/end_of_battle.asm new file mode 100644 index 00000000..f03dd07f --- /dev/null +++ b/engine/battle/end_of_battle.asm @@ -0,0 +1,88 @@ +EndOfBattle: ; 137aa (4:77aa) + ld a, [wLinkState] + cp LINK_STATE_BATTLING + jr nz, .notLinkBattle +; link battle + ld a, [wEnemyMonPartyPos] + ld hl, wEnemyMon1Status + ld bc, wEnemyMon2 - wEnemyMon1 + call AddNTimes + ld a, [wEnemyMonStatus] + ld [hl], a + call ClearScreen + callab DisplayLinkBattleVersusTextBox + ld a, [wBattleResult] + cp $1 + ld de, YouWinText + jr c, .placeWinOrLoseString + ld de, YouLoseText + jr z, .placeWinOrLoseString + ld de, DrawText +.placeWinOrLoseString + hlCoord 6, 8 + call PlaceString + ld c, $c8 + call DelayFrames + jr .evolution +.notLinkBattle + ld a, [wBattleResult] + and a + jr nz, .resetVariables + ld hl, wTotalPayDayMoney + ld a, [hli] + or [hl] + inc hl + or [hl] + jr z, .evolution ; if pay day money is 0, jump + ld de, wPlayerMoney + 2 + ld c, $3 + predef AddBCDPredef + ld hl, PickUpPayDayMoneyText + call PrintText +.evolution + xor a + ld [wccd4], a + predef EvolutionAfterBattle +.resetVariables + xor a + ld [wLowHealthAlarm], a ;disable low health alarm + ld [wc02a], a + ld [W_ISINBATTLE], a + ld [W_BATTLETYPE], a + ld [W_MOVEMISSED], a + ld [W_CUROPPONENT], a + ld [wd11f], a + ld [wNumRunAttempts], a + ld [wEscapedFromBattle], a + ld hl, wcc2b + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld [wListScrollOffset], a + ld hl, wPlayerStatsToDouble + ld b, $18 +.loop + ld [hli], a + dec b + jr nz, .loop + ld hl, wd72c + set 0, [hl] + call WaitForSoundToFinish + call GBPalWhiteOut + ld a, $ff + ld [wDestinationWarpID], a + ret + +YouWinText: ; 13853 (4:7853) + db "YOU WIN@" + +YouLoseText: ; 1385b (4:785b) + db "YOU LOSE@" + +DrawText: ; 13864 (4:7864) + db " DRAW@" + +PickUpPayDayMoneyText: ; 1386b (4:786b) + TX_FAR _PickUpPayDayMoneyText + db "@"
\ No newline at end of file diff --git a/engine/battle/get_trainer_name.asm b/engine/battle/get_trainer_name.asm new file mode 100644 index 00000000..961f25cf --- /dev/null +++ b/engine/battle/get_trainer_name.asm @@ -0,0 +1,24 @@ +GetTrainerName_: ; 13a58 (4:7a58) + ld hl, W_GRASSRATE + ld a, [wLinkState] + and a + jr nz, .rival + ld hl, W_RIVALNAME + ld a, [W_TRAINERCLASS] + cp SONY1 + jr z, .rival + cp SONY2 + jr z, .rival + cp SONY3 + jr z, .rival + ld [wd0b5], a + ld a, TRAINER_NAME + ld [wNameListType], a + ld a, BANK(TrainerNames) + ld [wPredefBank], a + call GetName + ld hl, wcd6d +.rival + ld de, W_TRAINERNAME + ld bc, $d + jp CopyData diff --git a/engine/battle/moveEffects/conversion_effect.asm b/engine/battle/moveEffects/conversion_effect.asm new file mode 100644 index 00000000..511df2fd --- /dev/null +++ b/engine/battle/moveEffects/conversion_effect.asm @@ -0,0 +1,34 @@ +ConversionEffect_: ; 139a3 (4:79a3) + ld hl, wEnemyMonType1 + ld de, wBattleMonType1 + ld a, [H_WHOSETURN] + and a + ld a, [W_ENEMYBATTSTATUS1] + jr z, .asm_139b8 + push hl + ld h, d + ld l, e + pop de + ld a, [W_PLAYERBATTSTATUS1] +.asm_139b8 + bit Invulnerable, a ; is mon immune to typical attacks (dig/fly) + jr nz, PrintButItFailedText + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ld hl, PlayCurrentMoveAnimation + call CallBankF + ld hl, ConvertedTypeText + jp PrintText + +ConvertedTypeText: ; 139cd (4:79cd) + TX_FAR _ConvertedTypeText + db "@" + +PrintButItFailedText: ; 139d2 (4:79d2) + ld hl, PrintButItFailedText_ +CallBankF: ; 139d5 (4:79d5) + ld b, BANK(PrintButItFailedText_) + jp Bankswitch diff --git a/engine/battle/1.asm b/engine/battle/moveEffects/drain_hp_effect.asm index 517d53d1..517d53d1 100755..100644 --- a/engine/battle/1.asm +++ b/engine/battle/moveEffects/drain_hp_effect.asm diff --git a/engine/battle/moveEffects/haze_effect.asm b/engine/battle/moveEffects/haze_effect.asm new file mode 100644 index 00000000..2343e784 --- /dev/null +++ b/engine/battle/moveEffects/haze_effect.asm @@ -0,0 +1,76 @@ +HazeEffect_: ; 139da (4:79da) + ld a, $7 + ld hl, wPlayerMonAttackMod + call ResetStatMods + ld hl, wEnemyMonAttackMod + call ResetStatMods + ld hl, wPlayerMonUnmodifiedAttack + ld de, wBattleMonAttack + call ResetStats + ld hl, wEnemyMonUnmodifiedAttack + ld de, wEnemyMonAttack + call ResetStats + ld hl, wEnemyMonStatus + ld de, wEnemySelectedMove + ld a, [H_WHOSETURN] + and a + jr z, .asm_13a09 + ld hl, wBattleMonStatus + dec de + +.asm_13a09 + ld a, [hl] + ld [hl], $0 + and $27 + jr z, .asm_13a13 + ld a, $ff + ld [de], a + +.asm_13a13 + xor a + ld [W_PLAYERDISABLEDMOVE], a + ld [W_ENEMYDISABLEDMOVE], a + ld hl, wccee + ld [hli], a + ld [hl], a + ld hl, W_PLAYERBATTSTATUS1 + call CureStatuses + ld hl, W_ENEMYBATTSTATUS1 + call CureStatuses + ld hl, PlayCurrentMoveAnimation + call CallBankF + ld hl, StatusChangesEliminatedText + jp PrintText + +CureStatuses: ; 13a37 (4:7a37) + res Confused, [hl] + inc hl ; BATTSTATUS2 + ld a, [hl] + and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2 + ld [hli], a ; BATTSTATUS3 + ld a, [hl] + and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses + ld [hl], a + ret + +ResetStatMods: ; 13a43 (4:7a43) + ld b, $8 +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +ResetStats: ; 13a4a (4:7a4a) + ld b, $8 +.loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .loop + ret + +StatusChangesEliminatedText: ; 13a53 (4:7a53) + TX_FAR _StatusChangesEliminatedText + db "@" diff --git a/engine/battle/moveEffects/recoil_effect.asm b/engine/battle/moveEffects/recoil_effect.asm new file mode 100644 index 00000000..0460b208 --- /dev/null +++ b/engine/battle/moveEffects/recoil_effect.asm @@ -0,0 +1,68 @@ +RecoilEffect_: ; 1392c (4:792c) + ld a, [H_WHOSETURN] + and a + ld a, [W_PLAYERMOVENUM] + ld hl, wBattleMonMaxHP + jr z, .asm_1393d + ld a, [W_ENEMYMOVENUM] + ld hl, wEnemyMonMaxHP +.asm_1393d + ld d, a + ld a, [W_DAMAGE] + ld b, a + ld a, [W_DAMAGE + 1] + ld c, a + srl b + rr c + ld a, d + cp STRUGGLE + jr z, .asm_13953 + srl b + rr c +.asm_13953 + ld a, b + or c + jr nz, .asm_13958 + inc c +.asm_13958 + ld a, [hli] + ld [wHPBarMaxHP+1], a + ld a, [hl] + ld [wHPBarMaxHP], a + push bc + ld bc, $fff2 + add hl, bc + pop bc + ld a, [hl] + ld [wHPBarOldHP], a + sub c + ld [hld], a + ld [wHPBarNewHP], a + ld a, [hl] + ld [wHPBarOldHP+1], a + sbc b + ld [hl], a + ld [wHPBarNewHP+1], a + jr nc, .asm_13982 + xor a + ld [hli], a + ld [hl], a + ld hl, wHPBarNewHP + ld [hli], a + ld [hl], a +.asm_13982 + hlCoord 10, 9 + ld a, [H_WHOSETURN] + and a + ld a, $1 + jr z, .asm_13990 + hlCoord 2, 2 + xor a +.asm_13990 + ld [wHPBarType], a + predef UpdateHPBar2 + ld hl, HitWithRecoilText + jp PrintText +HitWithRecoilText: ; 1399e (4:799e) + TX_FAR _HitWithRecoilText + db "@" diff --git a/engine/battle/wild_encounters.asm b/engine/battle/wild_encounters.asm new file mode 100644 index 00000000..03119b90 --- /dev/null +++ b/engine/battle/wild_encounters.asm @@ -0,0 +1,118 @@ +; try to initiate a wild pokemon encounter +; returns success in Z +TryDoWildEncounter: ; 13870 (4:7870) + ld a, [wNPCMovementScriptPointerTableNum] + and a + ret nz + ld a, [wd736] + and a + ret nz + callab IsPlayerStandingOnDoorTileOrWarpTile + jr nc, .notStandingOnDoorOrWarpTile +.CantEncounter + ld a, $1 + and a + ret +.notStandingOnDoorOrWarpTile + callab IsPlayerJustOutsideMap + jr z, .CantEncounter + ld a, [wRepelRemainingSteps] + and a + jr z, .asm_1389e + dec a + jr z, .lastRepelStep + ld [wRepelRemainingSteps], a +.asm_1389e +; determine if wild pokémon can appear in the half-block we’re standing in +; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile? + hlCoord 9, 9 + ld c, [hl] + ld a, [W_GRASSTILE] + cp c + ld a, [W_GRASSRATE] + jr z, .CanEncounter + ld a, $14 ; in all tilesets with a water tile, this is its id + cp c + ld a, [W_WATERRATE] + jr z, .CanEncounter +; even if not in grass/water, standing anywhere we can encounter pokémon +; so long as the map is “indoor” and has wild pokémon defined. +; …as long as it’s not Viridian Forest or Safari Zone. + ld a, [W_CURMAP] + cp REDS_HOUSE_1F ; is this an indoor map? + jr c, .CantEncounter2 + ld a, [W_CURMAPTILESET] + cp FOREST ; Viridian Forest/Safari Zone + jr z, .CantEncounter2 + ld a, [W_GRASSRATE] +.CanEncounter +; compare encounter chance with a random number to determine if there will be an encounter + ld b, a + ld a, [hRandomAdd] + cp b + jr nc, .CantEncounter2 + ld a, [hRandomSub] + ld b, a + ld hl, WildMonEncounterSlotChances +.determineEncounterSlot + ld a, [hli] + cp b + jr nc, .gotEncounterSlot + inc hl + jr .determineEncounterSlot +.gotEncounterSlot +; determine which wild pokémon (grass or water) can appear in the half-block we’re standing in + ld c, [hl] + ld hl, W_GRASSMONS + aCoord 8, 9 + cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile? + jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default + ld hl, W_WATERMONS +; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not, +; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters. +.gotWildEncounterType + ld b, $0 + add hl, bc + ld a, [hli] + ld [W_CURENEMYLVL], a + ld a, [hl] + ld [wcf91], a + ld [wEnemyMonSpecies2], a + ld a, [wRepelRemainingSteps] + and a + jr z, .willEncounter + ld a, [wPartyMon1Level] + ld b, a + ld a, [W_CURENEMYLVL] + cp b + jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon + jr .willEncounter +.lastRepelStep + ld [wRepelRemainingSteps], a + ld a, $d2 + ld [H_DOWNARROWBLINKCNT2], a + call EnableAutoTextBoxDrawing + call DisplayTextID +.CantEncounter2 + ld a, $1 + and a + ret +.willEncounter + xor a + ret + +WildMonEncounterSlotChances: ; 13918 (4:7918) +; There are 10 slots for wild pokemon, and this is the table that defines how common each of +; those 10 slots is. A random number is generated and then the first byte of each pair in this +; table is compared against that random number. If the random number is less than or equal +; to the first byte, then that slot is chosen. The second byte is double the slot number. + db $32, $00 ; 51/256 = 19.9% chance of slot 0 + db $65, $02 ; 51/256 = 19.9% chance of slot 1 + db $8C, $04 ; 39/256 = 15.2% chance of slot 2 + db $A5, $06 ; 25/256 = 9.8% chance of slot 3 + db $BE, $08 ; 25/256 = 9.8% chance of slot 4 + db $D7, $0A ; 25/256 = 9.8% chance of slot 5 + db $E4, $0C ; 13/256 = 5.1% chance of slot 6 + db $F1, $0E ; 13/256 = 5.1% chance of slot 7 + db $FC, $10 ; 11/256 = 4.3% chance of slot 8 + db $FF, $12 ; 3/256 = 1.2% chance of slot 9 diff --git a/engine/menu/status_screen.asm b/engine/menu/status_screen.asm index f95a0710..b5254694 100755 --- a/engine/menu/status_screen.asm +++ b/engine/menu/status_screen.asm @@ -1,3 +1,67 @@ +DrawHP: ; 128ef (4:68ef) +; Draws the HP bar in the stats screen + call GetPredefRegisters + ld a, $1 + jr DrawHP_ + +DrawHP2: ; 128f6 (4:68f6) +; Draws the HP bar in the party screen + call GetPredefRegisters + ld a, $2 + +DrawHP_: ; 128fb (4:68fb) + ld [wHPBarType], a + push hl + ld a, [wLoadedMonHP] + ld b, a + ld a, [wLoadedMonHP + 1] + ld c, a + or b + jr nz, .nonzeroHP + xor a + ld c, a + ld e, a + ld a, $6 + ld d, a + jp .drawHPBarAndPrintFraction +.nonzeroHP + ld a, [wLoadedMonMaxHP] + ld d, a + ld a, [wLoadedMonMaxHP + 1] + ld e, a + predef HPBarLength + ld a, $6 + ld d, a + ld c, a +.drawHPBarAndPrintFraction + pop hl + push de + push hl + push hl + call DrawHPBar + pop hl + ld a, [hFlags_0xFFF6] + bit 0, a + jr z, .printFractionBelowBar + ld bc, $9 ; right of bar + jr .printFraction +.printFractionBelowBar + ld bc, SCREEN_WIDTH + 1 ; below bar +.printFraction + add hl, bc + ld de, wLoadedMonHP + ld bc, $203 + call PrintNumber + ld a, "/" + ld [hli], a + ld de, wLoadedMonMaxHP + ld bc, $203 + call PrintNumber + pop hl + pop de + ret + + ; Predef 0x37 StatusScreen: ; 12953 (4:6953) call LoadMonData diff --git a/engine/overworld/is_player_just_outside_map.asm b/engine/overworld/is_player_just_outside_map.asm new file mode 100644 index 00000000..24e434b3 --- /dev/null +++ b/engine/overworld/is_player_just_outside_map.asm @@ -0,0 +1,16 @@ +; returns whether the player is one tile outside the map in Z +IsPlayerJustOutsideMap: ; 128d8 (4:68d8) + ld a, [W_YCOORD] + ld b, a + ld a, [W_CURMAPHEIGHT] + call .compareCoordWithMapDimension + ret z + ld a, [W_XCOORD] + ld b, a + ld a, [W_CURMAPWIDTH] +.compareCoordWithMapDimension + add a + cp b + ret z + inc b + ret @@ -1907,7 +1907,7 @@ FieldMoveDisplayData: ; 7823 (1:7823) db $ff ; list terminator -INCLUDE "engine/battle/1.asm" +INCLUDE "engine/battle/moveEffects/drain_hp_effect.asm" INCLUDE "engine/menu/players_pc.asm" @@ -4755,7 +4755,7 @@ PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp" SECTION "Battle (bank 4)", ROMX, BANK[$4] -INCLUDE "engine/battle/4.asm" +INCLUDE "engine/overworld/is_player_just_outside_map.asm" INCLUDE "engine/menu/status_screen.asm" INCLUDE "engine/menu/party_menu.asm" @@ -4766,7 +4766,12 @@ ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic" INCLUDE "engine/turn_sprite.asm" INCLUDE "engine/menu/start_sub_menus.asm" INCLUDE "engine/items/tms.asm" -INCLUDE "engine/battle/4_2.asm" +INCLUDE "engine/battle/end_of_battle.asm" +INCLUDE "engine/battle/wild_encounters.asm" +INCLUDE "engine/battle/moveEffects/recoil_effect.asm" +INCLUDE "engine/battle/moveEffects/conversion_effect.asm" +INCLUDE "engine/battle/moveEffects/haze_effect.asm" +INCLUDE "engine/battle/get_trainer_name.asm" INCLUDE "engine/random.asm" |