diff options
Diffstat (limited to 'engine')
| -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 | 
13 files changed, 502 insertions, 504 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 | 
