diff --git a/battle/moves/move_descriptions.asm b/battle/moves/move_descriptions.asm index df31fd38a..19659b32a 100644 --- a/battle/moves/move_descriptions.asm +++ b/battle/moves/move_descriptions.asm @@ -1,4 +1,5 @@ -; MoveDescriptions: ; 2cb52 +MoveDescriptions:: ; 2cb52 +; entries correspond to move ids (see constants/move_constants.asm) dw PoundDescription dw KarateChopDescription dw DoubleslapDescription diff --git a/battle/moves/move_effects.asm b/battle/moves/move_effects.asm index c34e5ed23..c56ff2560 100644 --- a/battle/moves/move_effects.asm +++ b/battle/moves/move_effects.asm @@ -1,3 +1,5 @@ +MoveEffects: ; 2732e + NormalHit: checkobedience usedmovetext diff --git a/battle/moves/move_effects_pointers.asm b/battle/moves/move_effects_pointers.asm index d15beedb7..a12092881 100644 --- a/battle/moves/move_effects_pointers.asm +++ b/battle/moves/move_effects_pointers.asm @@ -1,3 +1,4 @@ +MoveEffectsPointers: ; 271f4 ; entries correspond to EFFECT_* constants dw NormalHit dw DoSleep diff --git a/engine/battle_start.asm b/engine/battle_transition.asm similarity index 99% rename from engine/battle_start.asm rename to engine/battle_transition.asm index 9546980c2..f8756649b 100644 --- a/engine/battle_start.asm +++ b/engine/battle_transition.asm @@ -862,3 +862,12 @@ endm jr nz, .row ret ; 8c7c9 (23:47c9) + +Function8c7c9: +; XXX + ld a, $1 + ld [hBGMapMode], a + call WaitBGMap + xor a + ld [hBGMapMode], a + ret diff --git a/engine/caught_data.asm b/engine/caught_data.asm new file mode 100644 index 000000000..c079009ae --- /dev/null +++ b/engine/caught_data.asm @@ -0,0 +1,247 @@ +CheckPartyFullAfterContest: ; 4d9e5 + ld a, [wContestMon] + and a + jp z, .DidntCatchAnything + ld [CurPartySpecies], a + ld [CurSpecies], a + call GetBaseData + ld hl, PartyCount + ld a, [hl] + cp 6 + jp nc, .TryAddToBox + inc a + ld [hl], a + ld c, a + ld b, $0 + add hl, bc + ld a, [wContestMon] + ld [hli], a + ld [CurSpecies], a + ld a, $ff + ld [hl], a + ld hl, PartyMon1Species + ld a, [PartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wContestMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [PartyCount] + dec a + ld hl, PartyMonOT + call SkipNames + ld d, h + ld e, l + ld hl, PlayerName + call CopyBytes + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, StringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, PKMN_NAME_LENGTH + call CopyBytes + call GiveANickname_YesNo + jr c, .Party_SkipNickname + ld a, [PartyCount] + dec a + ld [CurPartyMon], a + xor a + ld [MonType], a + ld de, wMonOrItemNameBuffer + callab InitNickname + +.Party_SkipNickname: + ld a, [PartyCount] + dec a + ld hl, PartyMonNicknames + call SkipNames + ld d, h + ld e, l + ld hl, wMonOrItemNameBuffer + call CopyBytes + ld a, [PartyCount] + dec a + ld hl, PartyMon1Level + call GetPartyLocation + ld a, [hl] + ld [CurPartyLevel], a + call SetCaughtData + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and $80 + ld b, $13 + or b + ld [hl], a + xor a + ld [wContestMon], a + and a + ld [ScriptVar], a + ret + +.TryAddToBox: ; 4daa3 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + call CloseSRAM + jr nc, .BoxFull + xor a + ld [CurPartyMon], a + ld hl, wContestMon + ld de, wBufferMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld hl, PlayerName + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + callab InsertPokemonIntoBox + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + call GiveANickname_YesNo + ld hl, StringBuffer1 + jr c, .Box_SkipNickname + ld a, BOXMON + ld [MonType], a + ld de, wMonOrItemNameBuffer + callab InitNickname + ld hl, wMonOrItemNameBuffer + +.Box_SkipNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld de, sBoxMonNicknames + ld bc, PKMN_NAME_LENGTH + call CopyBytes + call CloseSRAM + +.BoxFull: + ld a, BANK(sBoxMon1Level) + call GetSRAMBank + ld a, [sBoxMon1Level] + ld [CurPartyLevel], a + call CloseSRAM + call SetBoxMonCaughtData + ld a, BANK(sBoxMon1CaughtLocation) + call GetSRAMBank + ld hl, sBoxMon1CaughtLocation + ld a, [hl] + and $80 + ld b, $13 + or b + ld [hl], a + call CloseSRAM + xor a + ld [wContestMon], a + ld a, $1 + ld [ScriptVar], a + ret + +.DidntCatchAnything: ; 4db35 + ld a, $2 + ld [ScriptVar], a + ret + +GiveANickname_YesNo: ; 4db3b + ld hl, TextJump_GiveANickname + call PrintText + jp YesNoBox + +TextJump_GiveANickname: ; 0x4db44 + ; Give a nickname to the @ you received? + text_jump UnknownText_0x1c12fc + db "@" + +SetCaughtData: ; 4db49 + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLevel + call GetPartyLocation +SetBoxmonOrEggmonCaughtData: ; 4db53 + ld a, [TimeOfDay] + inc a + rrca + rrca + ld b, a + ld a, [CurPartyLevel] + or b + ld [hli], a + ld a, [MapGroup] + ld b, a + ld a, [MapNumber] + ld c, a + cp MAP_POKECENTER_2F + jr nz, .NotPokecenter2F + ld a, b + cp GROUP_POKECENTER_2F + jr nz, .NotPokecenter2F + + ld a, [BackupMapGroup] + ld b, a + ld a, [BackupMapNumber] + ld c, a + +.NotPokecenter2F: + call GetWorldMapLocation + ld b, a + ld a, [PlayerGender] + rrca + or b + ld [hl], a + ret + +SetBoxMonCaughtData: ; 4db83 + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + call SetBoxmonOrEggmonCaughtData + call CloseSRAM + ret + +SetGiftBoxMonCaughtData: ; 4db92 + push bc + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + pop bc + call SetGiftMonCaughtData + call CloseSRAM + ret + +SetGiftPartyMonCaughtData: ; 4dba3 + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLevel + push bc + call GetPartyLocation + pop bc +SetGiftMonCaughtData: ; 4dbaf + xor a + ld [hli], a + ld a, $7e + rrc b + or b + ld [hl], a + ret + +SetEggMonCaughtData: ; 4dbb8 (13:5bb8) + ld a, [CurPartyMon] + ld hl, PartyMon1CaughtLevel + call GetPartyLocation + ld a, [CurPartyLevel] + push af + ld a, $1 + ld [CurPartyLevel], a + call SetBoxmonOrEggmonCaughtData + pop af + ld [CurPartyLevel], a + ret diff --git a/engine/check_nick_errors.asm b/engine/check_nick_errors.asm new file mode 100644 index 000000000..1cedca420 --- /dev/null +++ b/engine/check_nick_errors.asm @@ -0,0 +1,74 @@ +CheckNickErrors:: ; 669f +; error-check monster nick before use +; must be a peace offering to gamesharkers + +; input: de = nick location + + push bc + push de + ld b, PKMN_NAME_LENGTH + +.checkchar +; end of nick? + ld a, [de] + cp "@" ; terminator + jr z, .end + +; check if this char is a text command + ld hl, .textcommands + dec hl +.loop +; next entry + inc hl +; reached end of commands table? + ld a, [hl] + cp -1 + jr z, .done + +; is the current char between this value (inclusive)... + ld a, [de] + cp [hl] + inc hl + jr c, .loop +; ...and this one? + cp [hl] + jr nc, .loop + +; replace it with a "?" + ld a, "?" + ld [de], a + jr .loop + +.done +; next char + inc de +; reached end of nick without finding a terminator? + dec b + jr nz, .checkchar + +; change nick to "?@" + pop de + push de + ld a, "?" + ld [de], a + inc de + ld a, "@" + ld [de], a +.end +; if the nick has any errors at this point it's out of our hands + pop de + pop bc + ret + +.textcommands ; 66cf +; table defining which characters are actually text commands +; format: + ; ≥ < + db "", TX_BOX + 1 + db "", $18 + 1 + db $1d, "%" + 1 + db $35, "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "┘" + 1 + db -1 ; end diff --git a/engine/check_time.asm b/engine/check_time.asm new file mode 100644 index 000000000..615b51d29 --- /dev/null +++ b/engine/check_time.asm @@ -0,0 +1,19 @@ +CheckTime:: ; c000 + ld a, [TimeOfDay] + ld hl, TimeOfDayTable + ld de, 2 + call IsInArray + inc hl + ld c, [hl] + ret c + + xor a + ld c, a + ret + +TimeOfDayTable: ; c012 + db MORN_F, MORN + db DAY_F, DAY + db NITE_F, NITE + db NITE_F, NITE + db -1 diff --git a/engine/collision_stdscripts.asm b/engine/collision_stdscripts.asm new file mode 100644 index 000000000..17b1e49b2 --- /dev/null +++ b/engine/collision_stdscripts.asm @@ -0,0 +1,29 @@ +CheckFacingTileForStd:: ; 1365b +; Checks to see if the tile you're facing has a std script associated with it. If so, executes the script and returns carry. + ld a, c + ld de, 3 + ld hl, TileCollisionStdScripts + call IsInArray + jr nc, .notintable + + ld a, jumpstd_command + ld [wJumpStdScriptBuffer], a + inc hl + ld a, [hli] + ld [wJumpStdScriptBuffer + 1], a + ld a, [hli] + ld [wJumpStdScriptBuffer + 2], a + ld a, BANK(Script_JumpStdFromRAM) + ld hl, Script_JumpStdFromRAM + call CallScript + scf + ret + +.notintable + xor a + ret + +INCLUDE "data/collision_stdscripts.asm" + +Script_JumpStdFromRAM: ; 0x1369a + jump wJumpStdScriptBuffer diff --git a/engine/consume_held_item.asm b/engine/consume_held_item.asm new file mode 100644 index 000000000..52d7894cd --- /dev/null +++ b/engine/consume_held_item.asm @@ -0,0 +1,80 @@ +ConsumeHeldItem: ; 27192 + push hl + push de + push bc + ld a, [hBattleTurn] + and a + ld hl, OTPartyMon1Item + ld de, EnemyMonItem + ld a, [CurOTMon] + jr z, .theirturn + ld hl, PartyMon1Item + ld de, BattleMonItem + ld a, [CurBattleMon] + +.theirturn + push hl + push af + ld a, [de] + ld b, a + callba GetItemHeldEffect + ld hl, .ConsumableEffects +.loop + ld a, [hli] + cp b + jr z, .ok + inc a + jr nz, .loop + pop af + pop hl + pop bc + pop de + pop hl + ret + +.ok + xor a + ld [de], a + pop af + pop hl + call GetPartyLocation + ld a, [hBattleTurn] + and a + jr nz, .ourturn + ld a, [wBattleMode] + dec a + jr z, .done + +.ourturn + ld [hl], $0 + +.done + pop bc + pop de + pop hl + ret + +.ConsumableEffects: ; 271de +; Consumable items? + db HELD_BERRY + db HELD_2 + db HELD_5 + db HELD_HEAL_POISON + db HELD_HEAL_FREEZE + db HELD_HEAL_BURN + db HELD_HEAL_SLEEP + db HELD_HEAL_PARALYZE + db HELD_HEAL_STATUS + db HELD_30 + db HELD_ATTACK_UP + db HELD_DEFENSE_UP + db HELD_SPEED_UP + db HELD_SP_ATTACK_UP + db HELD_SP_DEFENSE_UP + db HELD_ACCURACY_UP + db HELD_EVASION_UP + db HELD_38 + db HELD_71 + db HELD_ESCAPE + db HELD_CRITICAL_UP + db -1 diff --git a/engine/crystal_colors.asm b/engine/crystal_colors.asm index 125fee8bc..25b831f01 100755 --- a/engine/crystal_colors.asm +++ b/engine/crystal_colors.asm @@ -612,3 +612,13 @@ InitMG_Mobile_LinkTradePalMap: ; 49856 call _InitMG_Mobile_LinkTradePalMap ret ; 4985a + +Unknown_4985a: ; unreferenced + db $ab, $03, $57, $24, $ac, $0e, $13, $32 + db $be, $30, $5b, $4c, $47, $60, $ed, $f2 + db $ab, $03, $55, $26, $aa, $0a, $13, $3a + db $be, $28, $33, $24, $6e, $71, $df, $b0 + db $a8, $00, $e5, $e0, $9a, $fc, $f4, $2c + db $fe, $4c, $a3, $5e, $c6, $3a, $ab, $4d + db $a8, $00, $b5, $b0, $de, $e8, $fc, $1c + db $ba, $66, $f7, $0e, $ba, $5e, $43, $bd diff --git a/engine/european_mail.asm b/engine/european_mail.asm new file mode 100644 index 000000000..8f037cc43 --- /dev/null +++ b/engine/european_mail.asm @@ -0,0 +1,129 @@ +IsMailEuropean: ; 1de5c8 +; return 1 if French +; return 2 if German +; return 3 if Italian +; return 4 if Spanish +; return 0 if none of the above + ld c, $0 + ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail + add hl, de + ld a, [hli] + cp "E" + ret nz + ld a, [hli] + inc c + cp "F" + ret z + inc c + cp "G" + ret z + inc c + cp "I" + ret z + inc c + cp "S" + ret z + ld c, $0 + ret + +; The regular font. +StandardEnglishFont: ; 1de5e6 +INCBIN "gfx/font/english.1bpp" + +; An extended font. +FrenchGermanFont: ; 1de9e6 +INCBIN "gfx/font/french_german.1bpp" + +; An even more extended font. +SpanishItalianFont: ; 1dede6 +INCBIN "gfx/font/spanish_italian.1bpp" + +HandleFrenchGermanMail: ; 1df1e6 +; called if mail is french or german +; fix 's 't 'v + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp $dc ; 's in french/german font + jr nz, .check_intermediate_chars + ld a, "'s" + jr .replace + +.check_intermediate_chars + sub "'s" + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add $cd + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +LireLeCourrierAnglais: +DeutenEnglischenPost: ; 1df203 +; Cette fonction convertit certains des caractères anglais pour +; leur équivalent dans le jeu de caractères français. +; Diese Funktion wandelt bestimmte englische Zeichen, um ihre +; Entsprechung in der Deutschen-Zeichensatz. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp "'s" + jr nz, .check_intermediate_chars + ld a, $dc + jr .replace + +.check_intermediate_chars + sub $cd + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add "'s" + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +HandleSpanishItalianMail: ; 1df220 +LeerCorreosIngleses: +LeggiPostaInglese: +; This function converts certain characters between +; the English and Spanish/Italian character sets. +; Esta función convierte ciertos caracteres entre +; el juego de caracteres Inglés y Español. +; Questa funzione converte alcuni caratteri tra +; l'inglese e il set di caratteri italiani. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + and $f0 + cp $d0 + jr nz, .dont_replace + ld a, [hl] + add $8 + and $f + or $d0 + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret diff --git a/engine/experience.asm b/engine/experience.asm new file mode 100644 index 000000000..c33aaf02a --- /dev/null +++ b/engine/experience.asm @@ -0,0 +1,162 @@ +CalcLevel: ; 50e1b + ld a, [TempMonSpecies] + ld [CurSpecies], a + call GetBaseData + ld d, 1 +.next_level + inc d + ld a, d + cp (MAX_LEVEL + 1) % $100 + jr z, .got_level + call CalcExpAtLevel + push hl + ld hl, TempMonExp + 2 + ld a, [hProduct + 3] + ld c, a + ld a, [hld] + sub c + ld a, [hProduct + 2] + ld c, a + ld a, [hld] + sbc c + ld a, [hProduct + 1] + ld c, a + ld a, [hl] + sbc c + pop hl + jr nc, .next_level + +.got_level + dec d + ret + +CalcExpAtLevel: ; 50e47 +; (a/b)*n**3 + c*n**2 + d*n - e + ld a, [BaseGrowthRate] + add a + add a + ld c, a + ld b, 0 + ld hl, GrowthRates + add hl, bc +; Cube the level + call .LevelSquared + ld a, d + ld [hMultiplier], a + call Multiply + +; Multiply by a + ld a, [hl] + and $f0 + swap a + ld [hMultiplier], a + call Multiply +; Divide by b + ld a, [hli] + and $f + ld [hDivisor], a + ld b, 4 + call Divide +; Push the cubic term to the stack + ld a, [hQuotient + 0] + push af + ld a, [hQuotient + 1] + push af + ld a, [hQuotient + 2] + push af +; Square the level and multiply by the lower 7 bits of c + call .LevelSquared + ld a, [hl] + and $7f + ld [hMultiplier], a + call Multiply +; Push the absolute value of the quadratic term to the stack + ld a, [hProduct + 1] + push af + ld a, [hProduct + 2] + push af + ld a, [hProduct + 3] + push af + ld a, [hli] + push af +; Multiply the level by d + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld a, [hli] + ld [hMultiplier], a + call Multiply +; Subtract e + ld b, [hl] + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + ld b, $0 + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a +; If bit 7 of c is set, c is negative; otherwise, it's positive + pop af + and $80 + jr nz, .subtract +; Add c*n**2 to (d*n - e) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + jr .done_quadratic + +.subtract +; Subtract c*n**2 from (d*n - e) + pop bc + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a + +.done_quadratic +; Add (a/b)*n**3 to (d*n - e +/- c*n**2) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + ret + +.LevelSquared: ; 50eed + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld [hMultiplier], a + jp Multiply + +INCLUDE "data/growth_rates.asm" diff --git a/engine/init_map.asm b/engine/init_map.asm new file mode 100644 index 000000000..5dd6c7b8a --- /dev/null +++ b/engine/init_map.asm @@ -0,0 +1,103 @@ +ReanchorBGMap_NoOAMUpdate:: ; 6454 + call DelayFrame + ld a, [hOAMUpdate] + push af + + ld a, $1 + ld [hOAMUpdate], a + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + + call .ReanchorBGMap + + pop af + ld [hBGMapMode], a + pop af + ld [hOAMUpdate], a + ld hl, VramState + set 6, [hl] + ret + +.ReanchorBGMap: + xor a + ld [hLCDCPointer], a + ld [hBGMapMode], a + ld a, $90 + ld [hWY], a + call OverworldTextModeSwitch + ld a, VBGMap1 / $100 + call .LoadBGMapAddrIntoHRAM + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + callba LoadOW_BGPal7 + callba ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + xor a + ld [hBGMapMode], a + ld [hWY], a + callba HDMATransfer_FillBGMap0WithBlack ; no need to farcall + ld a, VBGMap0 / $100 + call .LoadBGMapAddrIntoHRAM + xor a + ld [wBGMapAnchor], a + ld a, VBGMap0 / $100 + ld [wBGMapAnchor + 1], a + xor a + ld [hSCX], a + ld [hSCY], a + call ApplyBGMapAnchorToObjects + ret + +.LoadBGMapAddrIntoHRAM: ; 64b9 + ld [hBGMapAddress + 1], a + xor a + ld [hBGMapAddress], a + ret + +LoadFonts_NoOAMUpdate:: ; 64bf + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + + call .LoadGFX + + pop af + ld [hOAMUpdate], a + ret + +.LoadGFX: + call LoadFontsExtra + ld a, $90 + ld [hWY], a + call SafeUpdateSprites + call LoadStandardFont + ret + +HDMATransfer_FillBGMap0WithBlack: ; 64db + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + + ld a, "" ; $60 + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + call ByteFill + ld a, wDecompressScratch / $100 + ld [rHDMA1], a + ld a, wDecompressScratch % $100 + ld [rHDMA2], a + ld a, (VBGMap0 % $8000) / $100 + ld [rHDMA3], a + ld a, (VBGMap0 % $8000) % $100 + ld [rHDMA4], a + ld a, $3f + ld [hDMATransfer], a + call DelayFrame + + pop af + ld [rSVBK], a + ret diff --git a/engine/map_objects.asm b/engine/map_objects.asm index 162ea22df..4b8adb75f 100644 --- a/engine/map_objects.asm +++ b/engine/map_objects.asm @@ -1,7 +1,5 @@ - INCLUDE "data/facings.asm" - INCLUDE "data/map_objects.asm" diff --git a/engine/map_objects_2.asm b/engine/map_objects_2.asm new file mode 100644 index 000000000..3c9a9773c --- /dev/null +++ b/engine/map_objects_2.asm @@ -0,0 +1,70 @@ +LoadObjectMasks: ; 2454f + ld hl, wObjectMasks + xor a + ld bc, NUM_OBJECTS + call ByteFill + nop + ld bc, MapObjects + ld de, wObjectMasks + xor a +.loop + push af + push bc + push de + call GetObjectTimeMask + jr c, .next + call CheckObjectFlag +.next + pop de + ld [de], a + inc de + pop bc + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp NUM_OBJECTS + jr nz, .loop + ret + +CheckObjectFlag: ; 2457d (9:457d) + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .masked + ld hl, MAPOBJECT_EVENT_FLAG + add hl, bc + ld a, [hli] + ld e, a + ld a, [hl] + ld d, a + cp -1 + jr nz, .check + ld a, e + cp -1 + jr z, .unmasked + jr .masked +.check + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr nz, .masked +.unmasked + xor a + ret + +.masked + ld a, -1 + scf + ret + +GetObjectTimeMask: ; 245a7 (9:45a7) + call CheckObjectTime + ld a, -1 + ret c + xor a + ret diff --git a/engine/map_palettes.asm b/engine/map_palettes.asm new file mode 100644 index 000000000..ffeef7bf6 --- /dev/null +++ b/engine/map_palettes.asm @@ -0,0 +1,86 @@ +SwapTextboxPalettes:: ; 4c000 + hlcoord 0, 0 + decoord 0, 0, AttrMap + ld b, SCREEN_HEIGHT +.loop + push bc + ld c, SCREEN_WIDTH +.innerloop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .innerloop + pop bc + dec b + jr nz, .loop + ret + +ScrollBGMapPalettes:: ; 4c03f + ld hl, BGMapBuffer + ld de, BGMapPalBuffer +.loop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + +; .LowerNybble + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .loop + ret diff --git a/engine/menu_2.asm b/engine/menu_2.asm new file mode 100644 index 000000000..13568f3c5 --- /dev/null +++ b/engine/menu_2.asm @@ -0,0 +1,263 @@ +PlaceMenuItemName: ; 0x24ab4 + push de + ld a, [MenuSelection] + ld [wNamedObjectIndexBuffer], a + call GetItemName + pop hl + call PlaceString + ret + +PlaceMenuItemQuantity: ; 0x24ac3 + push de + ld a, [MenuSelection] + ld [CurItem], a + callba _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + pop hl + and a + jr nz, .done + ld de, $15 + add hl, de + ld [hl], "×" + inc hl + ld de, MenuSelectionQuantity + lb bc, 1, 2 + call PrintNum + +.done + ret + +PlaceMoneyTopRight: ; 24ae8 + ld hl, MenuDataHeader_0x24b15 + call CopyMenuDataHeader + jr PlaceMoneyDataHeader + +PlaceMoneyBottomLeft: ; 24af0 + ld hl, MenuDataHeader_0x24b1d + call CopyMenuDataHeader + jr PlaceMoneyDataHeader + +PlaceMoneyAtTopLeftOfTextbox: ; 24af8 + ld hl, MenuDataHeader_0x24b15 + lb de, 0, 11 + call OffsetMenuDataHeader + +PlaceMoneyDataHeader: ; 24b01 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld de, Money + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + ret + +MenuDataHeader_0x24b15: ; 0x24b15 + db $40 ; flags + db 00, 11 ; start coords + db 02, 19 ; end coords + dw NULL + db 1 ; default option + +MenuDataHeader_0x24b1d: ; 0x24b1d + db $40 ; flags + db 11, 00 ; start coords + db 13, 08 ; end coords + dw NULL + db 1 ; default option + +Special_DisplayCoinCaseBalance: ; 24b25 + ; Place a text box of size 1x7 at 11, 0. + hlcoord 11, 0 + ld b, 1 + ld c, 7 + call TextBox + hlcoord 12, 0 + ld de, CoinString + call PlaceString + hlcoord 17, 1 + ld de, ShowMoney_TerminatorString + call PlaceString + ld de, Coins + lb bc, 2, 4 + hlcoord 13, 1 + call PrintNum + ret + +Special_DisplayMoneyAndCoinBalance: ; 24b4e + hlcoord 5, 0 + ld b, 3 + ld c, 13 + call TextBox + hlcoord 6, 1 + ld de, MoneyString + call PlaceString + hlcoord 12, 1 + ld de, Money + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 6, 3 + ld de, CoinString + call PlaceString + hlcoord 15, 3 + ld de, Coins + lb bc, 2, 4 + call PrintNum + ret + +MoneyString: ; 24b83 + db "MONEY@" +CoinString: ; 24b89 + db "COIN@" +ShowMoney_TerminatorString: ; 24b8e + db "@" + +Function24b8f: ; 24b8f +; unreferenced, related to safari? + ld hl, Options + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + hlcoord 0, 0 + ld b, 3 + ld c, 7 + call TextBox + hlcoord 1, 1 + ld de, wSafariTimeRemaining + lb bc, 2, 3 + call PrintNum + hlcoord 4, 1 + ld de, .slash_500 + call PlaceString + hlcoord 1, 3 + ld de, .booru_ko + call PlaceString + hlcoord 5, 3 + ld de, wSafariBallsRemaining + lb bc, 1, 2 + call PrintNum + pop af + ld [Options], a + ret + +.slash_500 ; 24bcf + db "/500@" +.booru_ko ; 24bd4 + db "ボール こ@" + +StartMenu_DrawBugContestStatusBox: ; 24bdc + hlcoord 0, 0 + ld b, 5 + ld c, 17 + call TextBox + ret + +StartMenu_PrintBugContestStatus: ; 24be7 + ld hl, Options + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call StartMenu_DrawBugContestStatusBox + hlcoord 1, 5 + ld de, .Balls_EN + call PlaceString + hlcoord 8, 5 + ld de, wParkBallsRemaining + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + hlcoord 1, 1 + ld de, .CAUGHT + call PlaceString + ld a, [wContestMon] + and a + ld de, .None + jr z, .no_contest_mon + ld [wd265], a + call GetPokemonName + +.no_contest_mon + hlcoord 8, 1 + call PlaceString + ld a, [wContestMon] + and a + jr z, .skip_level + hlcoord 1, 3 + ld de, .LEVEL + call PlaceString + ld a, [wContestMonLevel] + ld h, b + ld l, c + inc hl + ld c, 3 + call Print8BitNumRightAlign + +.skip_level + pop af + ld [Options], a + ret + +.Balls_JP: ; 24c43 + db "ボール こ@" +.CAUGHT: ; 24c4b + db "CAUGHT@" +.Balls_EN: ; 24c52 + db "BALLS:@" +.None: ; 24c59 + db "None@" +.LEVEL: ; 24c5e + db "LEVEL@" + +FindApricornsInBag: ; 24c64 +; Checks the bag for Apricorns. + ld hl, Buffer1 + xor a + ld [hli], a + dec a + ld bc, 10 + call ByteFill + + ld hl, .ApricornBalls +.loop + ld a, [hl] + cp -1 + jr z, .done + push hl + ld [CurItem], a + ld hl, NumItems + call CheckItem + pop hl + jr nc, .nope + ld a, [hl] + call .addtobuffer +.nope + inc hl + inc hl + jr .loop + +.done + ld a, [Buffer1] + and a + ret nz + scf + ret + +.addtobuffer ; 24c94 + push hl + ld hl, Buffer1 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + pop hl + ret + +.ApricornBalls: ; 24ca0 + db RED_APRICORN, LEVEL_BALL + db BLU_APRICORN, LURE_BALL + db YLW_APRICORN, MOON_BALL + db GRN_APRICORN, FRIEND_BALL + db WHT_APRICORN, FAST_BALL + db BLK_APRICORN, HEAVY_BALL + db PNK_APRICORN, LOVE_BALL + db -1 diff --git a/engine/mon_stats.asm b/engine/mon_stats.asm new file mode 100644 index 000000000..ec468be16 --- /dev/null +++ b/engine/mon_stats.asm @@ -0,0 +1,486 @@ +DrawPlayerHP: ; 50b0a + ld a, $1 + jr DrawHP + +DrawEnemyHP: ; 50b0e + ld a, $2 + +DrawHP: ; 50b10 + ld [wWhichHPBar], a + push hl + push bc + ; box mons have full HP + ld a, [MonType] + cp BOXMON + jr z, .at_least_1_hp + + ld a, [TempMonHP] + ld b, a + ld a, [TempMonHP + 1] + ld c, a + +; Any HP? + or b + jr nz, .at_least_1_hp + + xor a + ld c, a + ld e, a + ld a, 6 + ld d, a + jp .fainted + +.at_least_1_hp + ld a, [TempMonMaxHP] + ld d, a + ld a, [TempMonMaxHP + 1] + ld e, a + ld a, [MonType] + cp BOXMON + jr nz, .not_boxmon + + ld b, d + ld c, e + +.not_boxmon + predef ComputeHPBarPixels + ld a, 6 + ld d, a + ld c, a + +.fainted + ld a, c + pop bc + ld c, a + pop hl + push de + push hl + push hl + call DrawBattleHPBar + pop hl + +; Print HP + bccoord 1, 1, 0 + add hl, bc + ld de, TempMonHP + ld a, [MonType] + cp BOXMON + jr nz, .not_boxmon_2 + ld de, TempMonMaxHP +.not_boxmon_2 + lb bc, 2, 3 + call PrintNum + + ld a, "/" + ld [hli], a + +; Print max HP + ld de, TempMonMaxHP + lb bc, 2, 3 + call PrintNum + pop hl + pop de + ret + +PrintTempMonStats: ; 50b7b +; Print TempMon's stats at hl, with spacing bc. + push bc + push hl + ld de, .StatNames + call PlaceString + pop hl + pop bc + add hl, bc + ld bc, SCREEN_WIDTH + add hl, bc + ld de, TempMonAttack + lb bc, 2, 3 + call .PrintStat + ld de, TempMonDefense + call .PrintStat + ld de, TempMonSpclAtk + call .PrintStat + ld de, TempMonSpclDef + call .PrintStat + ld de, TempMonSpeed + jp PrintNum + +.PrintStat: ; 50bab + push hl + call PrintNum + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + ret + +.StatNames: ; 50bb5 + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + next "@" + +GetGender: ; 50bdd +; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon). +; When calling this function, a should be set to an appropriate MonType value. + +; return values: +; a = 1: f = nc|nz; male +; a = 0: f = nc|z; female +; f = c: genderless + +; This is determined by comparing the Attack and Speed DVs +; with the species' gender ratio. + +; Figure out what type of monster struct we're looking at. + +; 0: PartyMon + ld hl, PartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [MonType] + and a + jr z, .PartyMon + +; 1: OTPartyMon + ld hl, OTPartyMon1DVs + dec a + jr z, .PartyMon + +; 2: sBoxMon + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + dec a + jr z, .sBoxMon + +; 3: Unknown + ld hl, TempMonDVs + dec a + jr z, .DVs + +; else: WildMon + ld hl, EnemyMonDVs + jr .DVs + +; Get our place in the party/box. + +.PartyMon: +.sBoxMon + ld a, [CurPartyMon] + call AddNTimes + +.DVs: + +; sBoxMon data is read directly from SRAM. + ld a, [MonType] + cp BOXMON + ld a, 1 + call z, GetSRAMBank + +; Attack DV + ld a, [hli] + and $f0 + ld b, a +; Speed DV + ld a, [hl] + and $f0 + swap a + +; Put our DVs together. + or b + ld b, a + +; Close SRAM if we were dealing with a sBoxMon. + ld a, [MonType] + cp BOXMON + call z, CloseSRAM + +; We need the gender ratio to do anything with this. + push bc + ld a, [CurPartySpecies] + dec a + ld hl, BaseData + BASE_GENDER + ld bc, BASE_DATA_SIZE + call AddNTimes + pop bc + + ld a, BANK(BaseData) + call GetFarByte + +; The higher the ratio, the more likely the monster is to be female. + + cp GENDERLESS + jr z, .Genderless + + and a ; GENDER_F0? + jr z, .Male + + cp GENDER_F100 + jr z, .Female + +; Values below the ratio are male, and vice versa. + cp b + jr c, .Male + +.Female: + xor a + ret + +.Male: + ld a, 1 + and a + ret + +.Genderless: + scf + ret + +ListMovePP: ; 50c50 + ld a, [wNumMoves] + inc a + ld c, a + ld a, NUM_MOVES + sub c + ld b, a + push hl + ld a, [Buffer1] + ld e, a + ld d, $0 + ld a, $3e ; P + call .load_loop + ld a, b + and a + jr z, .skip + ld c, a + ld a, "-" + call .load_loop + +.skip + pop hl + inc hl + inc hl + inc hl + ld d, h + ld e, l + ld hl, TempMonMoves + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + push bc + push hl + push de + ld hl, wMenuCursorY + ld a, [hl] + push af + ld [hl], b + push hl + callab GetMaxPPOfMove + pop hl + pop af + ld [hl], a + pop de + pop hl + push hl + ld bc, TempMonPP - (TempMonMoves + 1) + add hl, bc + ld a, [hl] + and $3f + ld [StringBuffer1 + 4], a + ld h, d + ld l, e + push hl + ld de, StringBuffer1 + 4 + lb bc, 1, 2 + call PrintNum + ld a, "/" + ld [hli], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum + pop hl + ld a, [Buffer1] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + pop hl + pop bc + inc b + ld a, b + cp NUM_MOVES + jr nz, .loop + +.done + ret + +.load_loop ; 50cc9 + ld [hli], a + ld [hld], a + add hl, de + dec c + jr nz, .load_loop + ret + +Function50cd0: ; 50cd0 +; XXX +.loop + ld [hl], $32 + inc hl + ld [hl], $3e + dec hl + add hl, de + dec c + jr nz, .loop + ret + +Predef22: ; unreferenced predef + push hl + push hl + ld hl, PartyMonNicknames + ld a, [CurPartyMon] + call GetNick + pop hl + call PlaceString + call CopyPkmnToTempMon + pop hl + ld a, [CurPartySpecies] + cp EGG + jr z, .egg + push hl + ld bc, -12 + add hl, bc + ld b, $0 + call DrawEnemyHP + pop hl + ld bc, 5 + add hl, bc + push de + call PrintLevel + pop de + +.egg + ret + +PlaceStatusString: ; 50d0a + push de + inc de + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + or b + pop de + jr nz, PlaceNonFaintStatus + push de + ld de, FntString + call CopyStatusString + pop de + ld a, $1 + and a + ret + +FntString: ; 50d22 + db "FNT@" + +CopyStatusString: ; 50d25 + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret + +PlaceNonFaintStatus: ; 50d2e + push de + ld a, [de] + ld de, PsnString + bit PSN, a + jr nz, .place + ld de, BrnString + bit BRN, a + jr nz, .place + ld de, FrzString + bit FRZ, a + jr nz, .place + ld de, ParString + bit PAR, a + jr nz, .place + ld de, SlpString + and SLP + jr z, .no_status + +.place + call CopyStatusString + ld a, $1 + and a + +.no_status + pop de + ret + +SlpString: db "SLP@" +PsnString: db "PSN@" +BrnString: db "BRN@" +FrzString: db "FRZ@" +ParString: db "PAR@" + +ListMoves: ; 50d6f +; List moves at hl, spaced every [Buffer1] tiles. + ld de, wListMoves_MoveIndicesBuffer + ld b, $0 +.moves_loop + ld a, [de] + inc de + and a + jr z, .no_more_moves + push de + push hl + push hl + ld [CurSpecies], a + ld a, MOVE_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld de, StringBuffer1 + pop hl + push bc + call PlaceString + pop bc + ld a, b + ld [wNumMoves], a + inc b + pop hl + push bc + ld a, [Buffer1] + ld c, a + ld b, 0 + add hl, bc + pop bc + pop de + ld a, b + cp NUM_MOVES + jr z, .done + jr .moves_loop + +.no_more_moves + ld a, b +.nonmove_loop + push af + ld [hl], "-" + ld a, [Buffer1] + ld c, a + ld b, 0 + add hl, bc + pop af + inc a + cp NUM_MOVES + jr nz, .nonmove_loop + +.done + ret diff --git a/engine/player_gfx.asm b/engine/player_gfx.asm new file mode 100644 index 000000000..1af444d73 --- /dev/null +++ b/engine/player_gfx.asm @@ -0,0 +1,263 @@ +Function88248: ; 88248 +; XXX + ld c, CAL + ld a, [PlayerGender] + bit 0, a + jr z, .okay + ld c, KAREN + +.okay + ld a, c + ld [TrainerClass], a + ret + +MovePlayerPicRight: ; 88258 + hlcoord 6, 4 + ld de, 1 + jr MovePlayerPic + +MovePlayerPicLeft: ; 88260 + hlcoord 13, 4 + ld de, -1 + ; fallthrough + +MovePlayerPic: ; 88266 +; Move player pic at hl by de * 7 tiles. + ld c, $8 +.loop + push bc + push hl + push de + xor a + ld [hBGMapMode], a + lb bc, 7, 7 + predef PlaceGraphic + xor a + ld [hBGMapThird], a + call WaitBGMap + call DelayFrame + pop de + pop hl + add hl, de + pop bc + dec c + ret z + push hl + push bc + ld a, l + sub e + ld l, a + ld a, h + sbc d + ld h, a + lb bc, 7, 7 + call ClearBox + pop bc + pop hl + jr .loop + +ShowPlayerNamingChoices: ; 88297 + ld hl, ChrisNameMenuHeader + ld a, [PlayerGender] + bit 0, a + jr z, .GotGender + ld hl, KrisNameMenuHeader +.GotGender: + call LoadMenuDataHeader + call VerticalMenu + ld a, [wMenuCursorY] + dec a + call CopyNameFromMenu + call CloseWindow + ret + +ChrisNameMenuHeader: ; 882b5 + db $40 ; flags + db 00, 00 ; start coords + db 11, 10 ; end coords + dw .MaleNames + db 1 ; ???? + db 0 ; default option + +.MaleNames: ; 882be + db $91 ; flags + db 5 ; items + db "NEW NAME@" +MalePlayerNameArray: ; 882c9 + db "CHRIS@" + db "MAT@" + db "ALLAN@" + db "JON@" + db 2 ; displacement + db " NAME @" ; title + +KrisNameMenuHeader: ; 882e5 + db $40 ; flags + db 00, 00 ; start coords + db 11, 10 ; end coords + dw .FemaleNames + db 1 ; ???? + db 0 ; default option + +.FemaleNames: ; 882ee + db $91 ; flags + db 5 ; items + db "NEW NAME@" +FemalePlayerNameArray: ; 882f9 + db "KRIS@" + db "AMANDA@" + db "JUANA@" + db "JODI@" + db 2 ; displacement + db " NAME @" ; title + +GetPlayerNameArray: ; 88318 This Function is never called + ld hl, PlayerName + ld de, MalePlayerNameArray + ld a, [PlayerGender] + bit 0, a + jr z, .done + ld de, FemalePlayerNameArray + +.done + call InitName + ret + +GetPlayerIcon: ; 8832c +; Get the player icon corresponding to gender + +; Male + ld de, ChrisSpriteGFX + ld b, BANK(ChrisSpriteGFX) + + ld a, [PlayerGender] + bit 0, a + jr z, .done + +; Female + ld de, KrisSpriteGFX + ld b, BANK(KrisSpriteGFX) + +.done + ret + +GetCardPic: ; 8833e + ld hl, ChrisCardPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld hl, KrisCardPic +.GotClass: + ld de, VTiles2 tile $00 + ld bc, $23 tiles + ld a, BANK(ChrisCardPic) ; BANK(KrisCardPic) + call FarCopyBytes + ld hl, CardGFX + ld de, VTiles2 tile $23 + ld bc, 6 tiles + ld a, BANK(CardGFX) + call FarCopyBytes + ret + +ChrisCardPic: ; 88365 +INCBIN "gfx/trainer_card/chris_card.2bpp" + +KrisCardPic: ; 88595 +INCBIN "gfx/trainer_card/kris_card.2bpp" + +CardGFX: ; 887c5 +INCBIN "gfx/trainer_card/trainer_card.2bpp" + +GetPlayerBackpic: ; 88825 + ld a, [PlayerGender] + bit 0, a + jr z, GetChrisBackpic + call GetKrisBackpic + ret + +GetChrisBackpic: ; 88830 + ld hl, ChrisBackpic + ld b, BANK(ChrisBackpic) + ld de, VTiles2 tile $31 + ld c, 7 * 7 + predef DecompressPredef + ret + +HOF_LoadTrainerFrontpic: ; 88840 + call WaitBGMap + xor a + ld [hBGMapMode], a + ld e, 0 + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld e, 1 + +.GotClass: + ld a, e + ld [TrainerClass], a + ld de, ChrisPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotPic + ld de, KrisPic + +.GotPic: + ld hl, VTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 + call Get2bpp + call WaitBGMap + ld a, $1 + ld [hBGMapMode], a + ret + +DrawIntroPlayerPic: ; 88874 +; Draw the player pic at (6,4). + +; Get class + ld e, CHRIS + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld e, KRIS +.GotClass: + ld a, e + ld [TrainerClass], a + +; Load pic + ld de, ChrisPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotPic + ld de, KrisPic +.GotPic: + ld hl, VTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 ; dimensions + call Get2bpp + +; Draw + xor a + ld [hGraphicStartTile], a + hlcoord 6, 4 + lb bc, 7, 7 + predef PlaceGraphic + ret + +ChrisPic: ; 888a9 +INCBIN "gfx/player/chris.2bpp" + +KrisPic: ; 88bb9 +INCBIN "gfx/player/kris.2bpp" + +GetKrisBackpic: ; 88ec9 +; Kris's backpic is uncompressed. + ld de, KrisBackpic + ld hl, VTiles2 tile $31 + lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions + call Get2bpp + ret + +KrisBackpic: ; 88ed6 +INCBIN "gfx/player/kris_back.2bpp" diff --git a/engine/pokedex_3.asm b/engine/pokedex_3.asm new file mode 100644 index 000000000..3414252c1 --- /dev/null +++ b/engine/pokedex_3.asm @@ -0,0 +1,162 @@ +LoadSGBPokedexGFX: ; 1ddf1c + ld hl, SGBPokedexGFX_LZ + ld de, VTiles2 tile $31 + call Decompress + ret + +LoadSGBPokedexGFX2: ; 1ddf26 (77:5f26) + ld hl, SGBPokedexGFX_LZ + ld de, VTiles2 tile $31 + lb bc, BANK(SGBPokedexGFX_LZ), $3a + call DecompressRequest2bpp + ret + +SGBPokedexGFX_LZ: ; 1ddf33 +INCBIN "gfx/pokedex/sgb.2bpp.lz" + +LoadQuestionMarkPic: ; 1de0d7 + ld hl, .QuestionMarkLZ + ld de, sScratch + call Decompress + ret + +.QuestionMarkLZ: ; 1de0e1 +INCBIN "gfx/pics/questionmark/front.2bpp.lz" + +DrawPokedexListWindow: ; 1de171 (77:6171) + ld a, $32 + hlcoord 0, 17 + ld bc, 12 + call ByteFill + hlcoord 0, 1 + lb bc, 15, 11 + call ClearBox + ld a, $34 + hlcoord 0, 0 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 16 + ld bc, 11 + call ByteFill + hlcoord 5, 0 + ld [hl], $3f + hlcoord 5, 16 + ld [hl], $40 + ld a, [wCurrentDexMode] + cp DEXMODE_OLD + jr z, .OldMode +; scroll bar + hlcoord 11, 0 + ld [hl], $50 + ld a, $51 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT - 3 + call Bank77_FillColumn + ld [hl], $52 + jr .Done + +.OldMode: +; no scroll bar + hlcoord 11, 0 + ld [hl], $66 + ld a, $67 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT - 3 + call Bank77_FillColumn + ld [hl], $68 +.Done: + ret + +DrawPokedexSearchResultsWindow: ; 1de1d1 (77:61d1) + ld a, $34 + hlcoord 0, 0 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 10 + ld bc, 11 + call ByteFill + hlcoord 5, 0 + ld [hl], $3f + hlcoord 5, 10 + ld [hl], $40 + hlcoord 11, 0 + ld [hl], $66 + ld a, $67 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT / 2 + call Bank77_FillColumn + ld [hl], $68 + ld a, $34 + hlcoord 0, 11 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 17 + ld bc, 11 + call ByteFill + hlcoord 11, 11 + ld [hl], $66 + ld a, $67 + hlcoord 11, 12 + ld b, 5 + call Bank77_FillColumn + ld [hl], $68 + hlcoord 0, 12 + lb bc, 5, 11 + call ClearBox + ld de, .esults_D + hlcoord 0, 12 + call PlaceString + ret + +.esults_D ; 1de23c +; (SEARCH R) + db "ESULTS" + next "" +; (### FOUN) + next "D!@" + +DrawDexEntryScreenRightEdge: ; 1de247 + ld a, [hBGMapAddress] + ld l, a + ld a, [hBGMapAddress + 1] + ld h, a + push hl + inc hl + ld a, l + ld [hBGMapAddress], a + ld a, h + ld [hBGMapAddress + 1], a + hlcoord 19, 0 + ld [hl], $66 + hlcoord 19, 1 + ld a, $67 + ld b, 15 + call Bank77_FillColumn + ld [hl], $68 + hlcoord 19, 17 + ld [hl], $3c + xor a + ld b, SCREEN_HEIGHT + hlcoord 19, 0, AttrMap + call Bank77_FillColumn + call WaitBGMap2 + pop hl + ld a, l + ld [hBGMapAddress], a + ld a, h + ld [hBGMapAddress + 1], a + ret + +Bank77_FillColumn: ; 1de27f + push de + ld de, SCREEN_WIDTH +.loop + ld [hl], a + add hl, de + dec b + jr nz, .loop + pop de + ret diff --git a/engine/pokerus.asm b/engine/pokerus.asm new file mode 100644 index 000000000..3e5e094e4 --- /dev/null +++ b/engine/pokerus.asm @@ -0,0 +1,160 @@ +GivePokerusAndConvertBerries: ; 2ed44 + call ConvertBerriesToBerryJuice + ld hl, PartyMon1PokerusStatus + ld a, [PartyCount] + ld b, a + ld de, PARTYMON_STRUCT_LENGTH +; Check to see if any of your Pokemon already has Pokerus. +; If so, sample its spread through your party. +; This means that you cannot get Pokerus de novo while +; a party member has an active infection. +.loopMons + ld a, [hl] + and $f + jr nz, .TrySpreadPokerus + add hl, de + dec b + jr nz, .loopMons + +; If we haven't been to Goldenrod City at least once, +; prevent the contraction of Pokerus. + ld hl, StatusFlags2 + bit 6, [hl] + ret z + call Random + ld a, [hRandomAdd] + and a + ret nz + ld a, [hRandomSub] + cp $3 + ret nc ; 3/65536 chance (00 00, 00 01 or 00 02) + ld a, [PartyCount] + ld b, a +.randomMonSelectLoop + call Random + and $7 + cp b + jr nc, .randomMonSelectLoop + ld hl, PartyMon1PokerusStatus + call GetPartyLocation ; get pokerus byte of random mon + ld a, [hl] + and $f0 + ret nz ; if it already has pokerus, do nothing +.randomPokerusLoop ; Simultaneously sample the strain and duration + call Random + and a + jr z, .randomPokerusLoop + ld b, a + and $f0 + jr z, .load_pkrs + ld a, b + and $7 + inc a +.load_pkrs + ld b, a ; this should come before the label + swap b + and $3 + inc a + add b + ld [hl], a + ret + +.TrySpreadPokerus: + call Random + cp 1 + 33 percent + ret nc ; 1/3 chance + + ld a, [PartyCount] + cp 1 + ret z ; only one mon, nothing to do + + ld c, [hl] + ld a, b + cp 2 + jr c, .checkPreviousMonsLoop ; no more mons after this one, go backwards + + call Random + cp 1 + 50 percent + jr c, .checkPreviousMonsLoop ; 1/2 chance, go backwards +.checkFollowingMonsLoop + add hl, de + ld a, [hl] + and a + jr z, .infectMon + ld c, a + and $3 + ret z ; if mon has cured pokerus, stop searching + dec b ; go on to next mon + ld a, b + cp 1 + jr nz, .checkFollowingMonsLoop ; no more mons left + ret + +.checkPreviousMonsLoop + ld a, [PartyCount] + cp b + ret z ; no more mons + ld a, l + sub e + ld l, a + ld a, h + sbc d + ld h, a + ld a, [hl] + and a + jr z, .infectMon + ld c, a + and $3 + ret z ; if mon has cured pokerus, stop searching + inc b ; go on to next mon + jr .checkPreviousMonsLoop + +.infectMon + ld a, c + and $f0 + ld b, a + ld a, c + swap a + and $3 + inc a + add b + ld [hl], a + ret + +; any berry held by a Shuckle may be converted to berry juice +ConvertBerriesToBerryJuice: ; 2ede6 + ld hl, StatusFlags2 + bit 6, [hl] + ret z + call Random + cp $10 + ret nc ; 1/16 chance + ld hl, PartyMons + ld a, [PartyCount] +.partyMonLoop + push af + push hl + ld a, [hl] + cp SHUCKLE + jr nz, .loopMon + ld bc, MON_ITEM + add hl, bc + ld a, [hl] + cp BERRY + jr z, .convertToJuice + +.loopMon + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop af + dec a + jr nz, .partyMonLoop + ret + +.convertToJuice + ld a, BERRY_JUICE + ld [hl], a + pop hl + pop af + ret diff --git a/engine/pokerus_tick.asm b/engine/pokerus_tick.asm new file mode 100644 index 000000000..3c97fdc5e --- /dev/null +++ b/engine/pokerus_tick.asm @@ -0,0 +1,26 @@ +ApplyPokerusTick: ; 13988 +; decreases all pokemon's pokerus counter by b. if the lower nybble reaches zero, the pokerus is cured. + ld hl, PartyMon1PokerusStatus ; PartyMon1 + MON_PKRS + ld a, [PartyCount] + and a + ret z ; make sure it's not wasting time on an empty party + ld c, a +.loop + ld a, [hl] + and $f ; lower nybble is the number of days remaining + jr z, .next ; if already 0, skip + sub b ; subtract the number of days + jr nc, .ok ; max(result, 0) + xor a +.ok + ld d, a ; back up this value because we need to preserve the strain (upper nybble) + ld a, [hl] + and $f0 + add d + ld [hl], a ; this prevents a cured pokemon from recontracting pokerus +.next + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + dec c + jr nz, .loop + ret diff --git a/engine/square_root.asm b/engine/square_root.asm new file mode 100644 index 000000000..496f66c83 --- /dev/null +++ b/engine/square_root.asm @@ -0,0 +1,30 @@ +GetSquareRoot: ; 13b87 +; Return the square root of de in b. + +; Rather than calculating the result, we take the index of the +; first value in a table of squares that isn't lower than de. + + ld hl, Squares + ld b, 0 +.loop +; Make sure we don't go past the end of the table. + inc b + ld a, b + cp $ff + ret z + +; Iterate over the table until b**2 >= de. + ld a, [hli] + sub e + ld a, [hli] + sbc d + + jr c, .loop + ret + +Squares: ; 13b98 +root set 1 + rept $ff + dw root*root +root set root+1 + endr diff --git a/engine/start_battle.asm b/engine/start_battle.asm new file mode 100644 index 000000000..51f46b3f2 --- /dev/null +++ b/engine/start_battle.asm @@ -0,0 +1,197 @@ +ShowLinkBattleParticipants: ; 2ee18 +; If we're not in a communications room, +; we don't need to be here. + ld a, [wLinkMode] + and a + ret z + + callba _ShowLinkBattleParticipants + ld c, 150 + call DelayFrames + call ClearTileMap + call ClearSprites + ret + +FindFirstAliveMonAndStartBattle: ; 2ee2f + xor a + ld [hMapAnims], a + call DelayFrame + ld b, 6 + ld hl, PartyMon1HP + ld de, PARTYMON_STRUCT_LENGTH - 1 + +.loop + ld a, [hli] + or [hl] + jr nz, .okay + add hl, de + dec b + jr nz, .loop + +.okay + ld de, MON_LEVEL - MON_HP + add hl, de + ld a, [hl] + ld [BattleMonLevel], a + predef Predef_StartBattle + callba _LoadBattleFontsHPBar + ld a, 1 + ld [hBGMapMode], a + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hWY], a + ld [rWY], a + ld [hMapAnims], a + ret + +PlayBattleMusic: ; 2ee6c + push hl + push de + push bc + + xor a + ld [MusicFade], a + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call MaxVolume + + ld a, [BattleType] + cp BATTLETYPE_SUICUNE + ld de, MUSIC_SUICUNE_BATTLE + jp z, .done + cp BATTLETYPE_ROAMING + jp z, .done + + ; Are we fighting a trainer? + ld a, [OtherTrainerClass] + and a + jr nz, .trainermusic + + callba RegionCheck + ld a, e + and a + jr nz, .kantowild + + ld de, MUSIC_JOHTO_WILD_BATTLE + ld a, [TimeOfDay] + cp NITE_F + jr nz, .done + ld de, MUSIC_JOHTO_WILD_BATTLE_NIGHT + jr .done + +.kantowild + ld de, MUSIC_KANTO_WILD_BATTLE + jr .done + +.trainermusic + ld de, MUSIC_CHAMPION_BATTLE + cp CHAMPION + jr z, .done + cp RED + jr z, .done + + ; really, they should have included admins and scientists here too... + ld de, MUSIC_ROCKET_BATTLE + cp GRUNTM + jr z, .done + cp GRUNTF + jr z, .done + + ld de, MUSIC_KANTO_GYM_LEADER_BATTLE + callba IsKantoGymLeader + jr c, .done + + ld de, MUSIC_JOHTO_GYM_LEADER_BATTLE + callba IsJohtoGymLeader + jr c, .done + + ld de, MUSIC_RIVAL_BATTLE + ld a, [OtherTrainerClass] + cp RIVAL1 + jr z, .done + cp RIVAL2 + jr nz, .othertrainer + + ld a, [OtherTrainerID] + cp RIVAL2_2_CHIKORITA ; Rival in Indigo Plateau + jr c, .done + ld de, MUSIC_CHAMPION_BATTLE + jr .done + +.othertrainer + ld a, [wLinkMode] + and a + jr nz, .johtotrainer + + callba RegionCheck + ld a, e + and a + jr nz, .kantotrainer + +.johtotrainer + ld de, MUSIC_JOHTO_TRAINER_BATTLE + jr .done + +.kantotrainer + ld de, MUSIC_KANTO_TRAINER_BATTLE + +.done + call PlayMusic + + pop bc + pop de + pop hl + ret + +ClearBattleRAM: ; 2ef18 + xor a + ld [wPlayerAction], a + ld [wBattleResult], a + + ld hl, wPartyMenuCursor + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + + ld [wMenuScrollPosition], a + ld [CriticalHit], a + ld [BattleMonSpecies], a + ld [wBattleParticipantsNotFainted], a + ld [CurBattleMon], a + ld [wForcedSwitch], a + ld [TimeOfDayPal], a + ld [PlayerTurnsTaken], a + ld [EnemyTurnsTaken], a + ld [EvolvableFlags], a + + ld hl, PlayerHPPal + ld [hli], a + ld [hl], a + + ld hl, BattleMonDVs + ld [hli], a + ld [hl], a + + ld hl, EnemyMonDVs + ld [hli], a + ld [hl], a + +; Clear the entire BattleMons area + ld hl, wBattle + ld bc, wBattleEnd - wBattle + xor a + call ByteFill + + callab ResetEnemyStatLevels + + call ClearWindowData + + ld hl, hBGMapAddress + xor a + ld [hli], a + ld [hl], VBGMap0 / $100 + ret diff --git a/engine/timeofdaypals.asm b/engine/timeofdaypals.asm index 90ff9141c..a4a07bc4d 100644 --- a/engine/timeofdaypals.asm +++ b/engine/timeofdaypals.asm @@ -1,3 +1,7 @@ +Predef35: ; 8c000 +Predef36: + ret + UpdateTimeOfDayPal:: ; 8c001 call UpdateTime ld a, [TimeOfDay] diff --git a/engine/trainer_scripts.asm b/engine/trainer_scripts.asm new file mode 100644 index 000000000..33dab3b9e --- /dev/null +++ b/engine/trainer_scripts.asm @@ -0,0 +1,31 @@ +TalkToTrainerScript:: ; 0xbe66a + faceplayer + trainerflagaction CHECK_FLAG + iftrue AlreadyBeatenTrainerScript + loadmemtrainer + encountermusic + jump StartBattleWithMapTrainerScript + +SeenByTrainerScript:: ; 0xbe675 + loadmemtrainer + encountermusic + showemote EMOTE_SHOCK, LAST_TALKED, 30 + callasm TrainerWalkToPlayer + applymovement2 MovementBuffer + writepersonxy LAST_TALKED + faceperson PLAYER, LAST_TALKED + jump StartBattleWithMapTrainerScript + +StartBattleWithMapTrainerScript: ; 0xbe68a + opentext + trainertext $0 + waitbutton + closetext + loadmemtrainer + startbattle + reloadmapafterbattle + trainerflagaction SET_FLAG + loadvar wRunningTrainerBattleScript, -1 + +AlreadyBeatenTrainerScript: + scripttalkafter diff --git a/engine/unused_correct_party.asm b/engine/unused_correct_party.asm new file mode 100644 index 000000000..dd2e1111c --- /dev/null +++ b/engine/unused_correct_party.asm @@ -0,0 +1,229 @@ +CorrectErrorsInPlayerParty: ; unreferenced + ld hl, PartyCount + ld a, [hl] + and a + ret z + + cp PARTY_LENGTH + 1 + jr c, .party_length_okay + ld a, PARTY_LENGTH + ld [hl], a +.party_length_okay + inc hl + + ld b, a + ld c, 0 +.loop1 + ld a, [hl] + and a + jr z, .invalid_species + cp NUM_POKEMON + 1 + jr z, .invalid_species + cp EGG + 1 + jr c, .next_species + +.invalid_species + ld [hl], SMEARGLE + push hl + push bc + ld a, c + ld hl, PartyMon1Species + call GetPartyLocation + ld [hl], SMEARGLE + pop bc + pop hl + +.next_species + inc hl + inc c + dec b + jr nz, .loop1 + ld [hl], $ff + + ld hl, PartyMon1 + ld a, [PartyCount] + ld d, a + ld e, 0 +.loop2 + push de + push hl + ld b, h + ld c, l + ld a, [hl] + and a + jr z, .invalid_species_2 + cp NUM_POKEMON + 1 + jr c, .check_level + +.invalid_species_2 + ld [hl], SMEARGLE + push de + ld d, 0 + ld hl, PartySpecies + add hl, de + pop de + ld a, SMEARGLE + ld [hl], a + +.check_level + ld [CurSpecies], a + call GetBaseData + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MIN_LEVEL + ld a, MIN_LEVEL + jr c, .invalid_level + ld a, [hl] + cp MAX_LEVEL + jr c, .load_level + ld a, MAX_LEVEL +.invalid_level + ld [hl], a +.load_level + ld [CurPartyLevel], a + + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld b, $1 + predef CalcPkmnStats + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop de + inc e + dec d + jr nz, .loop2 + + ld de, PartyMonNicknames + ld a, [PartyCount] + ld b, a + ld c, 0 +.loop3 + push bc + call .GetLengthOfStringWith6CharCap + push de + callba CheckStringForErrors + pop hl + pop bc + jr nc, .valid_nickname + + push bc + push hl + ld hl, PartySpecies + push bc + ld b, 0 + add hl, bc + pop bc + ld a, [hl] + cp EGG + ld hl, .TAMAGO + jr z, .got_nickname + ld [wd265], a + call GetPokemonName + ld hl, StringBuffer1 +.got_nickname + pop de + ld bc, PKMN_NAME_LENGTH + call CopyBytes + pop bc + +.valid_nickname + inc c + dec b + jr nz, .loop3 + + ld de, PartyMonOT + ld a, [PartyCount] + ld b, a + ld c, 0 +.loop4 + push bc + call .GetLengthOfStringWith6CharCap + push de + callba CheckStringForErrors + pop hl + jr nc, .valid_ot_name + ld d, h + ld e, l + ld hl, PlayerName + ld bc, NAME_LENGTH + call CopyBytes +.valid_ot_name + pop bc + inc c + dec b + jr nz, .loop4 + + ld hl, PartyMon1Moves + ld a, [PartyCount] + ld b, a +.loop5 + push hl + ld c, NUM_MOVES + ld a, [hl] + and a + jr z, .invalid_move + cp NUM_ATTACKS + 1 + jr c, .moves_loop +.invalid_move + ld [hl], POUND + +.moves_loop + ld a, [hl] + and a + jr z, .fill_invalid_moves + cp NUM_ATTACKS + 1 + jr c, .next_move + +.fill_invalid_moves + xor a + ld [hli], a + dec c + jr nz, .fill_invalid_moves + jr .next_pokemon + +.next_move + inc hl + dec c + jr nz, .moves_loop + +.next_pokemon + pop hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec b + jr nz, .loop5 + ret +; 13b6b + +.TAMAGO: ; 13b6b + db "タマゴ@@@" +; 13b71 + +.GetLengthOfStringWith6CharCap: ; 13b71 + push de + ld c, 1 + ld b, NAME_LENGTH_JAPANESE +.search_loop + ld a, [de] + cp "@" + jr z, .done + inc de + inc c + dec b + jr nz, .search_loop + dec c + dec de + ld a, "@" + ld [de], a +.done + pop de + ret +; 13b87 diff --git a/event/bug_contest.asm b/event/bug_contest.asm new file mode 100644 index 000000000..2cb88ad30 --- /dev/null +++ b/event/bug_contest.asm @@ -0,0 +1,43 @@ +Special_GiveParkBalls: ; 135db + xor a + ld [wContestMon], a + ld a, 20 + ld [wParkBallsRemaining], a + callba StartBugContestTimer + ret + +BugCatchingContestBattleScript:: ; 0x135eb + writecode VAR_BATTLETYPE, BATTLETYPE_CONTEST + randomwildmon + startbattle + reloadmapafterbattle + copybytetovar wParkBallsRemaining + iffalse BugCatchingContestOutOfBallsScript + end + +BugCatchingContestOverScript:: ; 0x135f8 + playsound SFX_ELEVATOR_END + opentext + writetext BugCatchingContestText_BeeepTimesUp + waitbutton + jump BugCatchingContestReturnToGateScript + +BugCatchingContestOutOfBallsScript: ; 0x13603 + playsound SFX_ELEVATOR_END + opentext + writetext BugCatchingContestText_ContestIsOver + waitbutton + +BugCatchingContestReturnToGateScript: ; 0x1360b + closetext + jumpstd bugcontestresultswarp + +BugCatchingContestText_BeeepTimesUp: ; 0x1360f + ; ANNOUNCER: BEEEP! Time's up! + text_jump UnknownText_0x1bd2ca + db "@" + +BugCatchingContestText_ContestIsOver: ; 0x13614 + ; ANNOUNCER: The Contest is over! + text_jump UnknownText_0x1bd2e7 + db "@" diff --git a/event/bug_contest_mon_stats.asm b/event/bug_contest_mon_stats.asm new file mode 100644 index 000000000..d6ad3997e --- /dev/null +++ b/event/bug_contest_mon_stats.asm @@ -0,0 +1,107 @@ +DisplayCaughtContestMonStats: ; cc000 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call LoadFontsBattleExtra + + ld hl, Options + ld a, [hl] + push af + set 4, [hl] + + hlcoord 0, 0 + ld b, 4 + ld c, 13 + call TextBox + + hlcoord 0, 6 + ld b, 4 + ld c, 13 + call TextBox + + hlcoord 2, 0 + ld de, .Stock + call PlaceString + + hlcoord 2, 6 + ld de, .This + call PlaceString + + hlcoord 5, 4 + ld de, .Health + call PlaceString + + hlcoord 5, 10 + ld de, .Health + call PlaceString + + ld a, [wContestMon] + ld [wd265], a + call GetPokemonName + ld de, StringBuffer1 + hlcoord 1, 2 + call PlaceString + + ld h, b + ld l, c + ld a, [wContestMonLevel] + ld [TempMonLevel], a + call PrintLevel + + ld de, EnemyMonNick + hlcoord 1, 8 + call PlaceString + + ld h, b + ld l, c + ld a, [EnemyMonLevel] + ld [TempMonLevel], a + call PrintLevel + + hlcoord 11, 4 + ld de, wContestMonMaxHP + lb bc, 2, 3 + call PrintNum + + hlcoord 11, 10 + ld de, EnemyMonMaxHP + call PrintNum + + ld hl, SwitchMonText + call PrintText + + pop af + ld [Options], a + + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + ret + +.Health: + db "HEALTH@" +.Stock: + db " STOCK ", $4a, " @" +.This: + db " THIS ", $4a, " @" + +SwitchMonText: ; cc0c2 + ; Switch #MON? + text_jump UnknownText_0x1c10cf + db "@" + +DisplayAlreadyCaughtText: ; cc0c7 + call GetPokemonName + ld hl, .AlreadyCaughtText + jp PrintText + +.AlreadyCaughtText: ; 0xcc0d0 + ; You already caught a @ . + text_jump UnknownText_0x1c10dd + db "@" + +Predef2F: +Predef38: +Predef39: ; cc0d5 + ret diff --git a/event/catch_tutorial.asm b/event/catch_tutorial.asm new file mode 100644 index 000000000..8340d8c13 --- /dev/null +++ b/event/catch_tutorial.asm @@ -0,0 +1,81 @@ +CatchTutorial:: ; 4e554 + ld a, [BattleType] + dec a + ld c, a + ld hl, .dw + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.dw ; 4e564 (13:6564) + dw .DudeTutorial + dw .DudeTutorial + dw .DudeTutorial + +.DudeTutorial: ; 4e56a (13:656a) +; Back up your name to your Mom's name. + ld hl, PlayerName + ld de, MomsName + ld bc, NAME_LENGTH + call CopyBytes +; Copy Dude's name to your name + ld hl, .Dude + ld de, PlayerName + ld bc, NAME_LENGTH + call CopyBytes + + call .LoadDudeData + + xor a + ld [hJoyDown], a + ld [hJoyPressed], a + ld a, [Options] + push af + and $f8 + add $3 + ld [Options], a + ld hl, .AutoInput + ld a, BANK(.AutoInput) + call StartAutoInput + callab StartBattle + call StopAutoInput + pop af + + ld [Options], a + ld hl, MomsName + ld de, PlayerName + ld bc, NAME_LENGTH + call CopyBytes + ret + +.LoadDudeData: ; 4e5b7 (13:65b7) + ld hl, wDudeNumItems + ld [hl], 1 + inc hl + ld [hl], POTION + inc hl + ld [hl], 1 + inc hl + ld [hl], -1 + ld hl, wDudeNumKeyItems + ld [hl], 0 + inc hl + ld [hl], -1 + ld hl, wDudeNumBalls + ld a, 1 + ld [hli], a + ld a, POKE_BALL ; 5 + ld [hli], a + ld [hli], a + ld [hl], -1 + ret + +.Dude: ; 4e5da + db "DUDE@" + +.AutoInput: ; 4e5df + db NO_INPUT, $ff ; end diff --git a/event/catch_tutorial_input.asm b/event/catch_tutorial_input.asm new file mode 100644 index 000000000..9d2a03db2 --- /dev/null +++ b/event/catch_tutorial_input.asm @@ -0,0 +1,43 @@ +_DudeAutoInput_A:: ; 1de28a + ld hl, DudeAutoInput_A + jr _DudeAutoInput + +_DudeAutoInput_RightA: ; 1de28f + ld hl, DudeAutoInput_RightA + jr _DudeAutoInput + +_DudeAutoInput_DownA: ; 1de294 + ld hl, DudeAutoInput_DownA + jr _DudeAutoInput + +_DudeAutoInput: ; 1de299 + ld a, BANK(DudeAutoInputs) + call StartAutoInput + ret + +DudeAutoInputs: + +DudeAutoInput_A: ; 1de29f + db NO_INPUT, $50 + db A_BUTTON, $00 + db NO_INPUT, $ff ; end + +DudeAutoInput_RightA: ; 1de2a5 + db NO_INPUT, $08 + db D_RIGHT, $00 + db NO_INPUT, $08 + db A_BUTTON, $00 + db NO_INPUT, $ff ; end + +DudeAutoInput_DownA: ; 1de2af + db NO_INPUT, $fe + db NO_INPUT, $fe + db NO_INPUT, $fe + db NO_INPUT, $fe + db D_DOWN, $00 + db NO_INPUT, $fe + db NO_INPUT, $fe + db NO_INPUT, $fe + db NO_INPUT, $fe + db A_BUTTON, $00 + db NO_INPUT, $ff ; end diff --git a/event/hidden_items.asm b/event/hidden_items.asm new file mode 100644 index 000000000..c4c51d5e6 --- /dev/null +++ b/event/hidden_items.asm @@ -0,0 +1,51 @@ +RepelWoreOffScript:: ; 0x13619 + opentext + writetext .text + waitbutton + closetext + end + +.text ; 0x13620 + ; REPEL's effect wore off. + text_jump UnknownText_0x1bd308 + db "@" + +HiddenItemScript:: ; 0x13625 + opentext + copybytetovar EngineBuffer3 + itemtotext 0, 0 + writetext .found_text + giveitem ITEM_FROM_MEM + iffalse .bag_full + callasm SetMemEvent + specialsound + itemnotify + jump .finish + +.bag_full ; 0x1363e + buttonsound + writetext .no_room_text + waitbutton + +.finish ; 13643 + closetext + end + +.found_text ; 0x13645 + ; found @ ! + text_jump UnknownText_0x1bd321 + db "@" + +.no_room_text ; 0x1364a + ; But has no space left… + text_jump UnknownText_0x1bd331 + db "@" + +SetMemEvent: ; 1364f + ld hl, EngineBuffer1 + ld a, [hli] + ld d, [hl] + ld e, a + ld b, SET_FLAG + call EventFlagAction + ret diff --git a/event/lucky_number.asm b/event/lucky_number.asm new file mode 100644 index 000000000..8cec7599d --- /dev/null +++ b/event/lucky_number.asm @@ -0,0 +1,226 @@ +Special_CheckForLuckyNumberWinners: ; 4d87a + xor a + ld [ScriptVar], a + ld [wFoundMatchingIDInParty], a + ld a, [PartyCount] + and a + ret z + ld d, a + ld hl, PartyMon1ID + ld bc, PartySpecies +.PartyLoop: + ld a, [bc] + inc bc + cp EGG + call nz, .CompareLuckyNumberToMonID + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec d + jr nz, .PartyLoop + ld a, BANK(sBox) + call GetSRAMBank + ld a, [sBoxCount] + and a + jr z, .SkipOpenBox + ld d, a + ld hl, sBoxMon1ID + ld bc, sBoxSpecies +.OpenBoxLoop: + ld a, [bc] + inc bc + cp EGG + jr z, .SkipOpenBoxMon + call .CompareLuckyNumberToMonID + jr nc, .SkipOpenBoxMon + ld a, 1 + ld [wFoundMatchingIDInParty], a + +.SkipOpenBoxMon: + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + dec d + jr nz, .OpenBoxLoop + +.SkipOpenBox: + call CloseSRAM + ld c, $0 +.BoxesLoop: + ld a, [wCurBox] + and $f + cp c + jr z, .SkipBox + ld hl, .BoxBankAddresses + ld b, 0 + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + call GetSRAMBank + ld a, [hli] + ld h, [hl] + ld l, a ; hl now contains the address of the loaded box in SRAM + ld a, [hl] + and a + jr z, .SkipBox ; no mons in this box + push bc + ld b, h + ld c, l + inc bc + ld de, sBoxMon1ID - sBox + add hl, de + ld d, a +.BoxNLoop: + ld a, [bc] + inc bc + cp EGG + jr z, .SkipBoxMon + + call .CompareLuckyNumberToMonID ; sets ScriptVar and CurPartySpecies appropriately + jr nc, .SkipBoxMon + ld a, 1 + ld [wFoundMatchingIDInParty], a + +.SkipBoxMon: + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + dec d + jr nz, .BoxNLoop + pop bc + +.SkipBox: + inc c + ld a, c + cp NUM_BOXES + jr c, .BoxesLoop + + call CloseSRAM + ld a, [ScriptVar] + and a + ret z ; found nothing + callba TrainerRankings_LuckyNumberShow + ld a, [wFoundMatchingIDInParty] + and a + push af + ld a, [CurPartySpecies] + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, .FoundPartymonText + pop af + jr z, .print + ld hl, .FoundBoxmonText + +.print + jp PrintText + +.CompareLuckyNumberToMonID: ; 4d939 + push bc + push de + push hl + ld d, h + ld e, l + ld hl, Buffer1 + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ld hl, LuckyNumberDigit1Buffer + ld de, wLuckyIDNumber + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ld b, 5 + ld c, 0 + ld hl, LuckyNumberDigit5Buffer + ld de, Buffer5 +.loop + ld a, [de] + cp [hl] + jr nz, .done + dec de + dec hl + inc c + dec b + jr nz, .loop + +.done + pop hl + push hl + ld de, -6 + add hl, de + ld a, [hl] + pop hl + pop de + push af + ld a, c + ld b, 1 + cp 5 + jr z, .okay + ld b, 2 + cp 3 + jr nc, .okay + ld b, 3 + cp 2 + jr nz, .nomatch + +.okay + inc b + ld a, [ScriptVar] + and a + jr z, .bettermatch + cp b + jr c, .nomatch + +.bettermatch + dec b + ld a, b + ld [ScriptVar], a + pop bc + ld a, b + ld [CurPartySpecies], a + pop bc + scf + ret + +.nomatch + pop bc + pop bc + and a + ret + +.BoxBankAddresses: ; 4d99f + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 + +.FoundPartymonText: ; 0x4d9c9 + ; Congratulations! We have a match with the ID number of @ in your party. + text_jump UnknownText_0x1c1261 + db "@" + +.FoundBoxmonText: ; 0x4d9ce + ; Congratulations! We have a match with the ID number of @ in your PC BOX. + text_jump UnknownText_0x1c12ae + db "@" + +Special_PrintTodaysLuckyNumber: ; 4d9d3 + ld hl, StringBuffer3 + ld de, wLuckyIDNumber + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ld a, "@" + ld [StringBuffer3 + 5], a + ret diff --git a/event/move_tutor.asm b/event/move_tutor.asm new file mode 100644 index 000000000..b26114dd0 --- /dev/null +++ b/event/move_tutor.asm @@ -0,0 +1,103 @@ +Special_MoveTutor: ; 4925b + call FadeToMenu + call ClearBGPalettes + call ClearScreen + call DelayFrame + ld b, SCGB_PACKPALS + call GetSGBLayout + xor a + ld [wItemAttributeParamBuffer], a + call .GetMoveTutorMove + ld [wd265], a + ld [wPutativeTMHMMove], a + call GetMoveName + call CopyName1 + callba ChooseMonToLearnTMHM + jr c, .cancel + jr .enter_loop + +.loop + callba ChooseMonToLearnTMHM_NoRefresh + jr c, .cancel +.enter_loop + call CheckCanLearnMoveTutorMove + jr nc, .loop + xor a + ld [ScriptVar], a + jr .quit + +.cancel + ld a, -1 + ld [ScriptVar], a +.quit + call CloseSubmenu + ret + +.GetMoveTutorMove: ; 492a5 + ld a, [ScriptVar] + cp 1 + jr z, .flamethrower + cp 2 + jr z, .thunderbolt + ld a, ICE_BEAM + ret + +.flamethrower + ld a, FLAMETHROWER + ret + +.thunderbolt + ld a, THUNDERBOLT + ret + +CheckCanLearnMoveTutorMove: ; 492b9 + ld hl, .MenuDataHeader + call LoadMenuDataHeader + + predef CanLearnTMHMMove + + push bc + ld a, [CurPartyMon] + ld hl, PartyMonNicknames + call GetNick + pop bc + + ld a, c + and a + jr nz, .can_learn + push de + ld de, SFX_WRONG + call PlaySFX + pop de + ld a, BANK(Text_TMHMNotCompatible) + ld hl, Text_TMHMNotCompatible + call FarPrintText + jr .didnt_learn + +.can_learn + callab KnowsMove + jr c, .didnt_learn + + predef LearnMove + ld a, b + and a + jr z, .didnt_learn + + ld c, HAPPINESS_LEARNMOVE + callab ChangeHappiness + jr .learned + +.didnt_learn + call ExitMenu + and a + ret + +.learned + call ExitMenu + scf + ret + +.MenuDataHeader: ; 0x4930a + db $40 ; flags + db 12, 00 ; start coords + db 17, 19 ; end coords diff --git a/event/special.asm b/event/special.asm index f1228abc6..71323499e 100755 --- a/event/special.asm +++ b/event/special.asm @@ -229,3 +229,7 @@ CopyPokemonName_Buffer1_Buffer3: ; 746e ld de, StringBuffer3 ld bc, PKMN_NAME_LENGTH jp CopyBytes + +Predef1: ; 747a +; not used + ret diff --git a/gfx/overworld_font.asm b/gfx/overworld_font.asm new file mode 100644 index 000000000..203b18fa0 --- /dev/null +++ b/gfx/overworld_font.asm @@ -0,0 +1,17 @@ +LoadOverworldFont:: ; 106594 + ld de, .font + ld hl, VTiles1 + lb bc, BANK(.font), $80 + call Get2bpp + ld de, .space + ld hl, VTiles2 tile $7f + lb bc, BANK(.space), 1 + call Get2bpp + ret +; 1065ad + +.font +INCBIN "gfx/font/overworld.2bpp" + +.space +INCBIN "gfx/font/space.2bpp" diff --git a/main.asm b/main.asm index a0e46c5a7..010895cf8 100644 --- a/main.asm +++ b/main.asm @@ -51,200 +51,16 @@ PushOAM: ; 403f PushOAMEnd INCLUDE "engine/map_objects.asm" - INCLUDE "engine/intro_menu.asm" - -ReanchorBGMap_NoOAMUpdate:: ; 6454 - call DelayFrame - ld a, [hOAMUpdate] - push af - - ld a, $1 - ld [hOAMUpdate], a - ld a, [hBGMapMode] - push af - xor a - ld [hBGMapMode], a - - call .ReanchorBGMap - - pop af - ld [hBGMapMode], a - pop af - ld [hOAMUpdate], a - ld hl, VramState - set 6, [hl] - ret - -.ReanchorBGMap: - xor a - ld [hLCDCPointer], a - ld [hBGMapMode], a - ld a, $90 - ld [hWY], a - call OverworldTextModeSwitch - ld a, VBGMap1 / $100 - call .LoadBGMapAddrIntoHRAM - call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap - callba LoadOW_BGPal7 - callba ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - xor a - ld [hBGMapMode], a - ld [hWY], a - callba HDMATransfer_FillBGMap0WithBlack ; no need to farcall - ld a, VBGMap0 / $100 - call .LoadBGMapAddrIntoHRAM - xor a - ld [wBGMapAnchor], a - ld a, VBGMap0 / $100 - ld [wBGMapAnchor + 1], a - xor a - ld [hSCX], a - ld [hSCY], a - call ApplyBGMapAnchorToObjects - ret - -.LoadBGMapAddrIntoHRAM: ; 64b9 - ld [hBGMapAddress + 1], a - xor a - ld [hBGMapAddress], a - ret - -LoadFonts_NoOAMUpdate:: ; 64bf - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - - call .LoadGFX - - pop af - ld [hOAMUpdate], a - ret - -.LoadGFX: - call LoadFontsExtra - ld a, $90 - ld [hWY], a - call SafeUpdateSprites - call LoadStandardFont - ret - -HDMATransfer_FillBGMap0WithBlack: ; 64db - ld a, [rSVBK] - push af - ld a, $6 - ld [rSVBK], a - - ld a, "" ; $60 - ld hl, wDecompressScratch - ld bc, wScratchAttrMap - wDecompressScratch - call ByteFill - ld a, wDecompressScratch / $100 - ld [rHDMA1], a - ld a, wDecompressScratch % $100 - ld [rHDMA2], a - ld a, (VBGMap0 % $8000) / $100 - ld [rHDMA3], a - ld a, (VBGMap0 % $8000) % $100 - ld [rHDMA4], a - ld a, $3f - ld [hDMATransfer], a - call DelayFrame - - pop af - ld [rSVBK], a - ret - +INCLUDE "engine/init_map.asm" INCLUDE "engine/learn.asm" - -CheckNickErrors:: ; 669f -; error-check monster nick before use -; must be a peace offering to gamesharkers - -; input: de = nick location - - push bc - push de - ld b, PKMN_NAME_LENGTH - -.checkchar -; end of nick? - ld a, [de] - cp "@" ; terminator - jr z, .end - -; check if this char is a text command - ld hl, .textcommands - dec hl -.loop -; next entry - inc hl -; reached end of commands table? - ld a, [hl] - cp -1 - jr z, .done - -; is the current char between this value (inclusive)... - ld a, [de] - cp [hl] - inc hl - jr c, .loop -; ...and this one? - cp [hl] - jr nc, .loop - -; replace it with a "?" - ld a, "?" - ld [de], a - jr .loop - -.done -; next char - inc de -; reached end of nick without finding a terminator? - dec b - jr nz, .checkchar - -; change nick to "?@" - pop de - push de - ld a, "?" - ld [de], a - inc de - ld a, "@" - ld [de], a -.end -; if the nick has any errors at this point it's out of our hands - pop de - pop bc - ret - -.textcommands ; 66cf -; table defining which characters are actually text commands -; format: - ; ≥ < - db "", TX_BOX + 1 - db "", $18 + 1 - db $1d, "%" + 1 - db $35, "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "┘" + 1 - db -1 ; end - +INCLUDE "engine/check_nick_errors.asm" INCLUDE "engine/math.asm" INCLUDE "data/items/item_attributes.asm" INCLUDE "engine/npc_movement.asm" INCLUDE "event/happiness_egg.asm" INCLUDE "event/special.asm" -Predef1: ; 747a -; not used - ret - SECTION "bank2", ROMX @@ -256,26 +72,7 @@ INCLUDE "engine/color.asm" SECTION "bank3", ROMX -CheckTime:: ; c000 - ld a, [TimeOfDay] - ld hl, TimeOfDayTable - ld de, 2 - call IsInArray - inc hl - ld c, [hl] - ret c - - xor a - ld c, a - ret - -TimeOfDayTable: ; c012 - db MORN_F, MORN - db DAY_F, DAY - db NITE_F, NITE - db NITE_F, NITE - db -1 - +INCLUDE "engine/check_time.asm" INCLUDE "engine/specials.asm" INCLUDE "engine/printnum.asm" INCLUDE "engine/health.asm" @@ -405,424 +202,14 @@ INCLUDE "event/itemfinder.asm" INCLUDE "engine/startmenu.asm" INCLUDE "engine/selectmenu.asm" INCLUDE "event/elevator.asm" - -Special_GiveParkBalls: ; 135db - xor a - ld [wContestMon], a - ld a, 20 - ld [wParkBallsRemaining], a - callba StartBugContestTimer - ret - -BugCatchingContestBattleScript:: ; 0x135eb - writecode VAR_BATTLETYPE, BATTLETYPE_CONTEST - randomwildmon - startbattle - reloadmapafterbattle - copybytetovar wParkBallsRemaining - iffalse BugCatchingContestOutOfBallsScript - end - -BugCatchingContestOverScript:: ; 0x135f8 - playsound SFX_ELEVATOR_END - opentext - writetext BugCatchingContestText_BeeepTimesUp - waitbutton - jump BugCatchingContestReturnToGateScript - -BugCatchingContestOutOfBallsScript: ; 0x13603 - playsound SFX_ELEVATOR_END - opentext - writetext BugCatchingContestText_ContestIsOver - waitbutton - -BugCatchingContestReturnToGateScript: ; 0x1360b - closetext - jumpstd bugcontestresultswarp - -BugCatchingContestText_BeeepTimesUp: ; 0x1360f - ; ANNOUNCER: BEEEP! Time's up! - text_jump UnknownText_0x1bd2ca - db "@" - -BugCatchingContestText_ContestIsOver: ; 0x13614 - ; ANNOUNCER: The Contest is over! - text_jump UnknownText_0x1bd2e7 - db "@" - -RepelWoreOffScript:: ; 0x13619 - opentext - writetext .text - waitbutton - closetext - end - -.text ; 0x13620 - ; REPEL's effect wore off. - text_jump UnknownText_0x1bd308 - db "@" - -HiddenItemScript:: ; 0x13625 - opentext - copybytetovar EngineBuffer3 - itemtotext 0, 0 - writetext .found_text - giveitem ITEM_FROM_MEM - iffalse .bag_full - callasm SetMemEvent - specialsound - itemnotify - jump .finish - -.bag_full ; 0x1363e - buttonsound - writetext .no_room_text - waitbutton - -.finish ; 13643 - closetext - end - -.found_text ; 0x13645 - ; found @ ! - text_jump UnknownText_0x1bd321 - db "@" - -.no_room_text ; 0x1364a - ; But has no space left… - text_jump UnknownText_0x1bd331 - db "@" - -SetMemEvent: ; 1364f - ld hl, EngineBuffer1 - ld a, [hli] - ld d, [hl] - ld e, a - ld b, SET_FLAG - call EventFlagAction - ret - -CheckFacingTileForStd:: ; 1365b -; Checks to see if the tile you're facing has a std script associated with it. If so, executes the script and returns carry. - ld a, c - ld de, 3 - ld hl, TileCollisionStdScripts - call IsInArray - jr nc, .notintable - - ld a, jumpstd_command - ld [wJumpStdScriptBuffer], a - inc hl - ld a, [hli] - ld [wJumpStdScriptBuffer + 1], a - ld a, [hli] - ld [wJumpStdScriptBuffer + 2], a - ld a, BANK(Script_JumpStdFromRAM) - ld hl, Script_JumpStdFromRAM - call CallScript - scf - ret - -.notintable - xor a - ret - -INCLUDE "data/collision_stdscripts.asm" - -Script_JumpStdFromRAM: ; 0x1369a - jump wJumpStdScriptBuffer - +INCLUDE "event/bug_contest.asm" +INCLUDE "event/hidden_items.asm" +INCLUDE "engine/collision_stdscripts.asm" INCLUDE "event/bug_contest_judging.asm" - -ApplyPokerusTick: ; 13988 -; decreases all pokemon's pokerus counter by b. if the lower nybble reaches zero, the pokerus is cured. - ld hl, PartyMon1PokerusStatus ; PartyMon1 + MON_PKRS - ld a, [PartyCount] - and a - ret z ; make sure it's not wasting time on an empty party - ld c, a -.loop - ld a, [hl] - and $f ; lower nybble is the number of days remaining - jr z, .next ; if already 0, skip - sub b ; subtract the number of days - jr nc, .ok ; max(result, 0) - xor a -.ok - ld d, a ; back up this value because we need to preserve the strain (upper nybble) - ld a, [hl] - and $f0 - add d - ld [hl], a ; this prevents a cured pokemon from recontracting pokerus -.next - ld de, PARTYMON_STRUCT_LENGTH - add hl, de - dec c - jr nz, .loop - ret - +INCLUDE "engine/pokerus_tick.asm" INCLUDE "event/bug_contest_2.asm" - -CorrectErrorsInPlayerParty: ; unreferenced - ld hl, PartyCount - ld a, [hl] - and a - ret z - - cp PARTY_LENGTH + 1 - jr c, .party_length_okay - ld a, PARTY_LENGTH - ld [hl], a -.party_length_okay - inc hl - - ld b, a - ld c, 0 -.loop1 - ld a, [hl] - and a - jr z, .invalid_species - cp NUM_POKEMON + 1 - jr z, .invalid_species - cp EGG + 1 - jr c, .next_species - -.invalid_species - ld [hl], SMEARGLE - push hl - push bc - ld a, c - ld hl, PartyMon1Species - call GetPartyLocation - ld [hl], SMEARGLE - pop bc - pop hl - -.next_species - inc hl - inc c - dec b - jr nz, .loop1 - ld [hl], $ff - - ld hl, PartyMon1 - ld a, [PartyCount] - ld d, a - ld e, 0 -.loop2 - push de - push hl - ld b, h - ld c, l - ld a, [hl] - and a - jr z, .invalid_species_2 - cp NUM_POKEMON + 1 - jr c, .check_level - -.invalid_species_2 - ld [hl], SMEARGLE - push de - ld d, 0 - ld hl, PartySpecies - add hl, de - pop de - ld a, SMEARGLE - ld [hl], a - -.check_level - ld [CurSpecies], a - call GetBaseData - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MIN_LEVEL - ld a, MIN_LEVEL - jr c, .invalid_level - ld a, [hl] - cp MAX_LEVEL - jr c, .load_level - ld a, MAX_LEVEL -.invalid_level - ld [hl], a -.load_level - ld [CurPartyLevel], a - - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld b, $1 - predef CalcPkmnStats - pop hl - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop de - inc e - dec d - jr nz, .loop2 - - ld de, PartyMonNicknames - ld a, [PartyCount] - ld b, a - ld c, 0 -.loop3 - push bc - call .GetLengthOfStringWith6CharCap - push de - callba CheckStringForErrors - pop hl - pop bc - jr nc, .valid_nickname - - push bc - push hl - ld hl, PartySpecies - push bc - ld b, 0 - add hl, bc - pop bc - ld a, [hl] - cp EGG - ld hl, .TAMAGO - jr z, .got_nickname - ld [wd265], a - call GetPokemonName - ld hl, StringBuffer1 -.got_nickname - pop de - ld bc, PKMN_NAME_LENGTH - call CopyBytes - pop bc - -.valid_nickname - inc c - dec b - jr nz, .loop3 - - ld de, PartyMonOT - ld a, [PartyCount] - ld b, a - ld c, 0 -.loop4 - push bc - call .GetLengthOfStringWith6CharCap - push de - callba CheckStringForErrors - pop hl - jr nc, .valid_ot_name - ld d, h - ld e, l - ld hl, PlayerName - ld bc, NAME_LENGTH - call CopyBytes -.valid_ot_name - pop bc - inc c - dec b - jr nz, .loop4 - - ld hl, PartyMon1Moves - ld a, [PartyCount] - ld b, a -.loop5 - push hl - ld c, NUM_MOVES - ld a, [hl] - and a - jr z, .invalid_move - cp NUM_ATTACKS + 1 - jr c, .moves_loop -.invalid_move - ld [hl], POUND - -.moves_loop - ld a, [hl] - and a - jr z, .fill_invalid_moves - cp NUM_ATTACKS + 1 - jr c, .next_move - -.fill_invalid_moves - xor a - ld [hli], a - dec c - jr nz, .fill_invalid_moves - jr .next_pokemon - -.next_move - inc hl - dec c - jr nz, .moves_loop - -.next_pokemon - pop hl - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - dec b - jr nz, .loop5 - ret -; 13b6b - -.TAMAGO: ; 13b6b - db "タマゴ@@@" -; 13b71 - -.GetLengthOfStringWith6CharCap: ; 13b71 - push de - ld c, 1 - ld b, NAME_LENGTH_JAPANESE -.search_loop - ld a, [de] - cp "@" - jr z, .done - inc de - inc c - dec b - jr nz, .search_loop - dec c - dec de - ld a, "@" - ld [de], a -.done - pop de - ret -; 13b87 - -GetSquareRoot: ; 13b87 -; Return the square root of de in b. - -; Rather than calculating the result, we take the index of the -; first value in a table of squares that isn't lower than de. - - ld hl, Squares - ld b, 0 -.loop -; Make sure we don't go past the end of the table. - inc b - ld a, b - cp $ff - ret z - -; Iterate over the table until b**2 >= de. - ld a, [hli] - sub e - ld a, [hli] - sbc d - - jr c, .loop - ret - -Squares: ; 13b98 -root set 1 - rept $ff - dw root*root -root set root+1 - endr +INCLUDE "engine/unused_correct_party.asm" +INCLUDE "engine/square_root.asm" SECTION "bank5", ROMX @@ -841,8 +228,6 @@ INCLUDE "event/mom.asm" INCLUDE "event/daycare.asm" INCLUDE "event/photo.asm" INCLUDE "engine/breeding.asm" - - INCLUDE "tilesets/data.asm" @@ -879,345 +264,10 @@ UpdateItemDescription: ; 0x244c3 ret INCLUDE "engine/pokepic.asm" - -LoadObjectMasks: ; 2454f - ld hl, wObjectMasks - xor a - ld bc, NUM_OBJECTS - call ByteFill - nop - ld bc, MapObjects - ld de, wObjectMasks - xor a -.loop - push af - push bc - push de - call GetObjectTimeMask - jr c, .next - call CheckObjectFlag -.next - pop de - ld [de], a - inc de - pop bc - ld hl, OBJECT_LENGTH - add hl, bc - ld b, h - ld c, l - pop af - inc a - cp NUM_OBJECTS - jr nz, .loop - ret - -CheckObjectFlag: ; 2457d (9:457d) - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - and a - jr z, .masked - ld hl, MAPOBJECT_EVENT_FLAG - add hl, bc - ld a, [hli] - ld e, a - ld a, [hl] - ld d, a - cp -1 - jr nz, .check - ld a, e - cp -1 - jr z, .unmasked - jr .masked -.check - ld b, CHECK_FLAG - call EventFlagAction - ld a, c - and a - jr nz, .masked -.unmasked - xor a - ret - -.masked - ld a, -1 - scf - ret - -GetObjectTimeMask: ; 245a7 (9:45a7) - call CheckObjectTime - ld a, -1 - ret c - xor a - ret - +INCLUDE "engine/map_objects_2.asm" INCLUDE "engine/scrolling_menu.asm" INCLUDE "engine/switch_items.asm" - -PlaceMenuItemName: ; 0x24ab4 - push de - ld a, [MenuSelection] - ld [wNamedObjectIndexBuffer], a - call GetItemName - pop hl - call PlaceString - ret - -PlaceMenuItemQuantity: ; 0x24ac3 - push de - ld a, [MenuSelection] - ld [CurItem], a - callba _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - pop hl - and a - jr nz, .done - ld de, $15 - add hl, de - ld [hl], "×" - inc hl - ld de, MenuSelectionQuantity - lb bc, 1, 2 - call PrintNum - -.done - ret - -PlaceMoneyTopRight: ; 24ae8 - ld hl, MenuDataHeader_0x24b15 - call CopyMenuDataHeader - jr PlaceMoneyDataHeader - -PlaceMoneyBottomLeft: ; 24af0 - ld hl, MenuDataHeader_0x24b1d - call CopyMenuDataHeader - jr PlaceMoneyDataHeader - -PlaceMoneyAtTopLeftOfTextbox: ; 24af8 - ld hl, MenuDataHeader_0x24b15 - lb de, 0, 11 - call OffsetMenuDataHeader - -PlaceMoneyDataHeader: ; 24b01 - call MenuBox - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH + 1 - add hl, de - ld de, Money - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - ret - -MenuDataHeader_0x24b15: ; 0x24b15 - db $40 ; flags - db 00, 11 ; start coords - db 02, 19 ; end coords - dw NULL - db 1 ; default option - -MenuDataHeader_0x24b1d: ; 0x24b1d - db $40 ; flags - db 11, 00 ; start coords - db 13, 08 ; end coords - dw NULL - db 1 ; default option - -Special_DisplayCoinCaseBalance: ; 24b25 - ; Place a text box of size 1x7 at 11, 0. - hlcoord 11, 0 - ld b, 1 - ld c, 7 - call TextBox - hlcoord 12, 0 - ld de, CoinString - call PlaceString - hlcoord 17, 1 - ld de, ShowMoney_TerminatorString - call PlaceString - ld de, Coins - lb bc, 2, 4 - hlcoord 13, 1 - call PrintNum - ret - -Special_DisplayMoneyAndCoinBalance: ; 24b4e - hlcoord 5, 0 - ld b, 3 - ld c, 13 - call TextBox - hlcoord 6, 1 - ld de, MoneyString - call PlaceString - hlcoord 12, 1 - ld de, Money - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - hlcoord 6, 3 - ld de, CoinString - call PlaceString - hlcoord 15, 3 - ld de, Coins - lb bc, 2, 4 - call PrintNum - ret - -MoneyString: ; 24b83 - db "MONEY@" -CoinString: ; 24b89 - db "COIN@" -ShowMoney_TerminatorString: ; 24b8e - db "@" - -Function24b8f: ; 24b8f -; unreferenced, related to safari? - ld hl, Options - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - hlcoord 0, 0 - ld b, 3 - ld c, 7 - call TextBox - hlcoord 1, 1 - ld de, wSafariTimeRemaining - lb bc, 2, 3 - call PrintNum - hlcoord 4, 1 - ld de, .slash_500 - call PlaceString - hlcoord 1, 3 - ld de, .booru_ko - call PlaceString - hlcoord 5, 3 - ld de, wSafariBallsRemaining - lb bc, 1, 2 - call PrintNum - pop af - ld [Options], a - ret - -.slash_500 ; 24bcf - db "/500@" -.booru_ko ; 24bd4 - db "ボール こ@" - -StartMenu_DrawBugContestStatusBox: ; 24bdc - hlcoord 0, 0 - ld b, 5 - ld c, 17 - call TextBox - ret - -StartMenu_PrintBugContestStatus: ; 24be7 - ld hl, Options - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call StartMenu_DrawBugContestStatusBox - hlcoord 1, 5 - ld de, .Balls_EN - call PlaceString - hlcoord 8, 5 - ld de, wParkBallsRemaining - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - hlcoord 1, 1 - ld de, .CAUGHT - call PlaceString - ld a, [wContestMon] - and a - ld de, .None - jr z, .no_contest_mon - ld [wd265], a - call GetPokemonName - -.no_contest_mon - hlcoord 8, 1 - call PlaceString - ld a, [wContestMon] - and a - jr z, .skip_level - hlcoord 1, 3 - ld de, .LEVEL - call PlaceString - ld a, [wContestMonLevel] - ld h, b - ld l, c - inc hl - ld c, 3 - call Print8BitNumRightAlign - -.skip_level - pop af - ld [Options], a - ret - -.Balls_JP: ; 24c43 - db "ボール こ@" -.CAUGHT: ; 24c4b - db "CAUGHT@" -.Balls_EN: ; 24c52 - db "BALLS:@" -.None: ; 24c59 - db "None@" -.LEVEL: ; 24c5e - db "LEVEL@" - -FindApricornsInBag: ; 24c64 -; Checks the bag for Apricorns. - ld hl, Buffer1 - xor a - ld [hli], a - dec a - ld bc, 10 - call ByteFill - - ld hl, .ApricornBalls -.loop - ld a, [hl] - cp -1 - jr z, .done - push hl - ld [CurItem], a - ld hl, NumItems - call CheckItem - pop hl - jr nc, .nope - ld a, [hl] - call .addtobuffer -.nope - inc hl - inc hl - jr .loop - -.done - ld a, [Buffer1] - and a - ret nz - scf - ret - -.addtobuffer ; 24c94 - push hl - ld hl, Buffer1 - inc [hl] - ld e, [hl] - ld d, 0 - add hl, de - ld [hl], a - pop hl - ret - -.ApricornBalls: ; 24ca0 - db RED_APRICORN, LEVEL_BALL - db BLU_APRICORN, LURE_BALL - db YLW_APRICORN, MOON_BALL - db GRN_APRICORN, FRIEND_BALL - db WHT_APRICORN, FAST_BALL - db BLK_APRICORN, HEAVY_BALL - db PNK_APRICORN, LOVE_BALL - db -1 - +INCLUDE "engine/menu_2.asm" INCLUDE "engine/mon_menu.asm" INCLUDE "battle/menu.asm" INCLUDE "engine/buy_sell_toss.asm" @@ -1278,91 +328,8 @@ _ReturnToBattle_UseBall: ; 2715c call WaitBGMap jp SetPalettes -ConsumeHeldItem: ; 27192 - push hl - push de - push bc - ld a, [hBattleTurn] - and a - ld hl, OTPartyMon1Item - ld de, EnemyMonItem - ld a, [CurOTMon] - jr z, .theirturn - ld hl, PartyMon1Item - ld de, BattleMonItem - ld a, [CurBattleMon] - -.theirturn - push hl - push af - ld a, [de] - ld b, a - callba GetItemHeldEffect - ld hl, .ConsumableEffects -.loop - ld a, [hli] - cp b - jr z, .ok - inc a - jr nz, .loop - pop af - pop hl - pop bc - pop de - pop hl - ret - -.ok - xor a - ld [de], a - pop af - pop hl - call GetPartyLocation - ld a, [hBattleTurn] - and a - jr nz, .ourturn - ld a, [wBattleMode] - dec a - jr z, .done - -.ourturn - ld [hl], $0 - -.done - pop bc - pop de - pop hl - ret - -.ConsumableEffects: ; 271de -; Consumable items? - db HELD_BERRY - db HELD_2 - db HELD_5 - db HELD_HEAL_POISON - db HELD_HEAL_FREEZE - db HELD_HEAL_BURN - db HELD_HEAL_SLEEP - db HELD_HEAL_PARALYZE - db HELD_HEAL_STATUS - db HELD_30 - db HELD_ATTACK_UP - db HELD_DEFENSE_UP - db HELD_SPEED_UP - db HELD_SP_ATTACK_UP - db HELD_SP_DEFENSE_UP - db HELD_ACCURACY_UP - db HELD_EVASION_UP - db HELD_38 - db HELD_71 - db HELD_ESCAPE - db HELD_CRITICAL_UP - db -1 - -MoveEffectsPointers: ; 271f4 +INCLUDE "engine/consume_held_item.asm" INCLUDE "battle/moves/move_effects_pointers.asm" - -MoveEffects: ; 2732e INCLUDE "battle/moves/move_effects.asm" Kurt_SelectQuantity_InterpretJoypad: ; 27a28 @@ -1399,379 +366,14 @@ INCBIN "gfx/battle/dude.2bpp.lz" SECTION "bankB", ROMX INCLUDE "battle/trainer_huds.asm" - INCLUDE "data/trainers/trainer_class_names.asm" - INCLUDE "battle/ai/redundant.asm" - INCLUDE "event/move_deleter.asm" - INCLUDE "engine/mysterygift2.asm" - INCLUDE "engine/tmhm2.asm" - -MoveDescriptions:: ; 2cb52 INCLUDE "battle/moves/move_descriptions.asm" - -GivePokerusAndConvertBerries: ; 2ed44 - call ConvertBerriesToBerryJuice - ld hl, PartyMon1PokerusStatus - ld a, [PartyCount] - ld b, a - ld de, PARTYMON_STRUCT_LENGTH -; Check to see if any of your Pokemon already has Pokerus. -; If so, sample its spread through your party. -; This means that you cannot get Pokerus de novo while -; a party member has an active infection. -.loopMons - ld a, [hl] - and $f - jr nz, .TrySpreadPokerus - add hl, de - dec b - jr nz, .loopMons - -; If we haven't been to Goldenrod City at least once, -; prevent the contraction of Pokerus. - ld hl, StatusFlags2 - bit 6, [hl] - ret z - call Random - ld a, [hRandomAdd] - and a - ret nz - ld a, [hRandomSub] - cp $3 - ret nc ; 3/65536 chance (00 00, 00 01 or 00 02) - ld a, [PartyCount] - ld b, a -.randomMonSelectLoop - call Random - and $7 - cp b - jr nc, .randomMonSelectLoop - ld hl, PartyMon1PokerusStatus - call GetPartyLocation ; get pokerus byte of random mon - ld a, [hl] - and $f0 - ret nz ; if it already has pokerus, do nothing -.randomPokerusLoop ; Simultaneously sample the strain and duration - call Random - and a - jr z, .randomPokerusLoop - ld b, a - and $f0 - jr z, .load_pkrs - ld a, b - and $7 - inc a -.load_pkrs - ld b, a ; this should come before the label - swap b - and $3 - inc a - add b - ld [hl], a - ret - -.TrySpreadPokerus: - call Random - cp 1 + 33 percent - ret nc ; 1/3 chance - - ld a, [PartyCount] - cp 1 - ret z ; only one mon, nothing to do - - ld c, [hl] - ld a, b - cp 2 - jr c, .checkPreviousMonsLoop ; no more mons after this one, go backwards - - call Random - cp 1 + 50 percent - jr c, .checkPreviousMonsLoop ; 1/2 chance, go backwards -.checkFollowingMonsLoop - add hl, de - ld a, [hl] - and a - jr z, .infectMon - ld c, a - and $3 - ret z ; if mon has cured pokerus, stop searching - dec b ; go on to next mon - ld a, b - cp 1 - jr nz, .checkFollowingMonsLoop ; no more mons left - ret - -.checkPreviousMonsLoop - ld a, [PartyCount] - cp b - ret z ; no more mons - ld a, l - sub e - ld l, a - ld a, h - sbc d - ld h, a - ld a, [hl] - and a - jr z, .infectMon - ld c, a - and $3 - ret z ; if mon has cured pokerus, stop searching - inc b ; go on to next mon - jr .checkPreviousMonsLoop - -.infectMon - ld a, c - and $f0 - ld b, a - ld a, c - swap a - and $3 - inc a - add b - ld [hl], a - ret - -; any berry held by a Shuckle may be converted to berry juice -ConvertBerriesToBerryJuice: ; 2ede6 - ld hl, StatusFlags2 - bit 6, [hl] - ret z - call Random - cp $10 - ret nc ; 1/16 chance - ld hl, PartyMons - ld a, [PartyCount] -.partyMonLoop - push af - push hl - ld a, [hl] - cp SHUCKLE - jr nz, .loopMon - ld bc, MON_ITEM - add hl, bc - ld a, [hl] - cp BERRY - jr z, .convertToJuice - -.loopMon - pop hl - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop af - dec a - jr nz, .partyMonLoop - ret - -.convertToJuice - ld a, BERRY_JUICE - ld [hl], a - pop hl - pop af - ret - -ShowLinkBattleParticipants: ; 2ee18 -; If we're not in a communications room, -; we don't need to be here. - ld a, [wLinkMode] - and a - ret z - - callba _ShowLinkBattleParticipants - ld c, 150 - call DelayFrames - call ClearTileMap - call ClearSprites - ret - -FindFirstAliveMonAndStartBattle: ; 2ee2f - xor a - ld [hMapAnims], a - call DelayFrame - ld b, 6 - ld hl, PartyMon1HP - ld de, PARTYMON_STRUCT_LENGTH - 1 - -.loop - ld a, [hli] - or [hl] - jr nz, .okay - add hl, de - dec b - jr nz, .loop - -.okay - ld de, MON_LEVEL - MON_HP - add hl, de - ld a, [hl] - ld [BattleMonLevel], a - predef Predef_StartBattle - callba _LoadBattleFontsHPBar - ld a, 1 - ld [hBGMapMode], a - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld [hWY], a - ld [rWY], a - ld [hMapAnims], a - ret - -PlayBattleMusic: ; 2ee6c - - push hl - push de - push bc - - xor a - ld [MusicFade], a - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - call MaxVolume - - ld a, [BattleType] - cp BATTLETYPE_SUICUNE - ld de, MUSIC_SUICUNE_BATTLE - jp z, .done - cp BATTLETYPE_ROAMING - jp z, .done - - ; Are we fighting a trainer? - ld a, [OtherTrainerClass] - and a - jr nz, .trainermusic - - callba RegionCheck - ld a, e - and a - jr nz, .kantowild - - ld de, MUSIC_JOHTO_WILD_BATTLE - ld a, [TimeOfDay] - cp NITE_F - jr nz, .done - ld de, MUSIC_JOHTO_WILD_BATTLE_NIGHT - jr .done - -.kantowild - ld de, MUSIC_KANTO_WILD_BATTLE - jr .done - -.trainermusic - ld de, MUSIC_CHAMPION_BATTLE - cp CHAMPION - jr z, .done - cp RED - jr z, .done - - ; really, they should have included admins and scientists here too... - ld de, MUSIC_ROCKET_BATTLE - cp GRUNTM - jr z, .done - cp GRUNTF - jr z, .done - - ld de, MUSIC_KANTO_GYM_LEADER_BATTLE - callba IsKantoGymLeader - jr c, .done - - ld de, MUSIC_JOHTO_GYM_LEADER_BATTLE - callba IsJohtoGymLeader - jr c, .done - - ld de, MUSIC_RIVAL_BATTLE - ld a, [OtherTrainerClass] - cp RIVAL1 - jr z, .done - cp RIVAL2 - jr nz, .othertrainer - - ld a, [OtherTrainerID] - cp RIVAL2_2_CHIKORITA ; Rival in Indigo Plateau - jr c, .done - ld de, MUSIC_CHAMPION_BATTLE - jr .done - -.othertrainer - ld a, [wLinkMode] - and a - jr nz, .johtotrainer - - callba RegionCheck - ld a, e - and a - jr nz, .kantotrainer - -.johtotrainer - ld de, MUSIC_JOHTO_TRAINER_BATTLE - jr .done - -.kantotrainer - ld de, MUSIC_KANTO_TRAINER_BATTLE - -.done - call PlayMusic - - pop bc - pop de - pop hl - ret - -ClearBattleRAM: ; 2ef18 - xor a - ld [wPlayerAction], a - ld [wBattleResult], a - - ld hl, wPartyMenuCursor - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - - ld [wMenuScrollPosition], a - ld [CriticalHit], a - ld [BattleMonSpecies], a - ld [wBattleParticipantsNotFainted], a - ld [CurBattleMon], a - ld [wForcedSwitch], a - ld [TimeOfDayPal], a - ld [PlayerTurnsTaken], a - ld [EnemyTurnsTaken], a - ld [EvolvableFlags], a - - ld hl, PlayerHPPal - ld [hli], a - ld [hl], a - - ld hl, BattleMonDVs - ld [hli], a - ld [hl], a - - ld hl, EnemyMonDVs - ld [hli], a - ld [hl], a - -; Clear the entire BattleMons area - ld hl, wBattle - ld bc, wBattleEnd - wBattle - xor a - call ByteFill - - callab ResetEnemyStatLevels - - call ClearWindowData - - ld hl, hBGMapAddress - xor a - ld [hli], a - ld [hl], VBGMap0 / $100 - ret +INCLUDE "engine/pokerus.asm" +INCLUDE "engine/start_battle.asm" PlaceGraphic: ; 2ef6e ; Fill wBoxAlignment-aligned box width b height c @@ -1894,128 +496,14 @@ PackFGFXPointers: ; 48e93 PackFGFX: ; 48e9b INCBIN "gfx/pack/pack_f.2bpp" -Special_MoveTutor: ; 4925b - call FadeToMenu - call ClearBGPalettes - call ClearScreen - call DelayFrame - ld b, SCGB_PACKPALS - call GetSGBLayout - xor a - ld [wItemAttributeParamBuffer], a - call .GetMoveTutorMove - ld [wd265], a - ld [wPutativeTMHMMove], a - call GetMoveName - call CopyName1 - callba ChooseMonToLearnTMHM - jr c, .cancel - jr .enter_loop - -.loop - callba ChooseMonToLearnTMHM_NoRefresh - jr c, .cancel -.enter_loop - call CheckCanLearnMoveTutorMove - jr nc, .loop - xor a - ld [ScriptVar], a - jr .quit - -.cancel - ld a, -1 - ld [ScriptVar], a -.quit - call CloseSubmenu - ret - -.GetMoveTutorMove: ; 492a5 - ld a, [ScriptVar] - cp 1 - jr z, .flamethrower - cp 2 - jr z, .thunderbolt - ld a, ICE_BEAM - ret - -.flamethrower - ld a, FLAMETHROWER - ret - -.thunderbolt - ld a, THUNDERBOLT - ret - -CheckCanLearnMoveTutorMove: ; 492b9 - ld hl, .MenuDataHeader - call LoadMenuDataHeader - - predef CanLearnTMHMMove - - push bc - ld a, [CurPartyMon] - ld hl, PartyMonNicknames - call GetNick - pop bc - - ld a, c - and a - jr nz, .can_learn - push de - ld de, SFX_WRONG - call PlaySFX - pop de - ld a, BANK(Text_TMHMNotCompatible) - ld hl, Text_TMHMNotCompatible - call FarPrintText - jr .didnt_learn - -.can_learn - callab KnowsMove - jr c, .didnt_learn - - predef LearnMove - ld a, b - and a - jr z, .didnt_learn - - ld c, HAPPINESS_LEARNMOVE - callab ChangeHappiness - jr .learned - -.didnt_learn - call ExitMenu - and a - ret - -.learned - call ExitMenu - scf - ret - -.MenuDataHeader: ; 0x4930a - db $40 ; flags - db 12, 00 ; start coords - db 17, 19 ; end coords - +INCLUDE "event/move_tutor.asm" INCLUDE "engine/crystal_colors.asm" - -Unknown_4985a: ; unreferenced - db $ab, $03, $57, $24, $ac, $0e, $13, $32 - db $be, $30, $5b, $4c, $47, $60, $ed, $f2 - db $ab, $03, $55, $26, $aa, $0a, $13, $3a - db $be, $28, $33, $24, $6e, $71, $df, $b0 - db $a8, $00, $e5, $e0, $9a, $fc, $f4, $2c - db $fe, $4c, $a3, $5e, $c6, $3a, $ab, $4d - db $a8, $00, $b5, $b0, $de, $e8, $fc, $1c - db $ba, $66, $f7, $0e, $ba, $5e, $43, $bd - INCLUDE "event/celebi.asm" INCLUDE "engine/main_menu.asm" INCLUDE "mobile/mobile_menu.asm" INCLUDE "engine/search.asm" + ; mobile battle selection INCLUDE "mobile/mobile_12_2.asm" -; mobile battle selection AskRememberPassword: ; 4ae12 call .DoMenu @@ -2079,93 +567,7 @@ Buena_ExitMenu: ; 4ae5e SECTION "bank13", ROMX -SwapTextboxPalettes:: ; 4c000 - hlcoord 0, 0 - decoord 0, 0, AttrMap - ld b, SCREEN_HEIGHT -.loop - push bc - ld c, SCREEN_WIDTH -.innerloop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - ld hl, TilesetPalettes - add [hl] - ld l, a - ld a, [TilesetPalettes + 1] - adc $0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, TilesetPalettes - add [hl] - ld l, a - ld a, [TilesetPalettes + 1] - adc $0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .innerloop - pop bc - dec b - jr nz, .loop - ret - -ScrollBGMapPalettes:: ; 4c03f - ld hl, BGMapBuffer - ld de, BGMapPalBuffer -.loop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - -; .LowerNybble - ld hl, TilesetPalettes - add [hl] - ld l, a - ld a, [TilesetPalettes + 1] - adc $0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, TilesetPalettes - add [hl] - ld l, a - ld a, [TilesetPalettes + 1] - adc $0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .loop - ret - +INCLUDE "engine/map_palettes.asm" INCLUDE "tilesets/palette_maps.asm" Unknown_4ce05: ; unreferenced @@ -2514,7 +916,6 @@ LinkTextbox2: ; 4d35b ret INCLUDE "engine/delete_save_change_clock.asm" - INCLUDE "tilesets/tileset_headers.asm" FlagPredef: ; 4d7c1 @@ -2653,567 +1054,11 @@ CheckPokerus: ; 4d860 scf ret -Special_CheckForLuckyNumberWinners: ; 4d87a - xor a - ld [ScriptVar], a - ld [wFoundMatchingIDInParty], a - ld a, [PartyCount] - and a - ret z - ld d, a - ld hl, PartyMon1ID - ld bc, PartySpecies -.PartyLoop: - ld a, [bc] - inc bc - cp EGG - call nz, .CompareLuckyNumberToMonID - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - dec d - jr nz, .PartyLoop - ld a, BANK(sBox) - call GetSRAMBank - ld a, [sBoxCount] - and a - jr z, .SkipOpenBox - ld d, a - ld hl, sBoxMon1ID - ld bc, sBoxSpecies -.OpenBoxLoop: - ld a, [bc] - inc bc - cp EGG - jr z, .SkipOpenBoxMon - call .CompareLuckyNumberToMonID - jr nc, .SkipOpenBoxMon - ld a, 1 - ld [wFoundMatchingIDInParty], a - -.SkipOpenBoxMon: - push bc - ld bc, BOXMON_STRUCT_LENGTH - add hl, bc - pop bc - dec d - jr nz, .OpenBoxLoop - -.SkipOpenBox: - call CloseSRAM - ld c, $0 -.BoxesLoop: - ld a, [wCurBox] - and $f - cp c - jr z, .SkipBox - ld hl, .BoxBankAddresses - ld b, 0 - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - call GetSRAMBank - ld a, [hli] - ld h, [hl] - ld l, a ; hl now contains the address of the loaded box in SRAM - ld a, [hl] - and a - jr z, .SkipBox ; no mons in this box - push bc - ld b, h - ld c, l - inc bc - ld de, sBoxMon1ID - sBox - add hl, de - ld d, a -.BoxNLoop: - ld a, [bc] - inc bc - cp EGG - jr z, .SkipBoxMon - - call .CompareLuckyNumberToMonID ; sets ScriptVar and CurPartySpecies appropriately - jr nc, .SkipBoxMon - ld a, 1 - ld [wFoundMatchingIDInParty], a - -.SkipBoxMon: - push bc - ld bc, BOXMON_STRUCT_LENGTH - add hl, bc - pop bc - dec d - jr nz, .BoxNLoop - pop bc - -.SkipBox: - inc c - ld a, c - cp NUM_BOXES - jr c, .BoxesLoop - - call CloseSRAM - ld a, [ScriptVar] - and a - ret z ; found nothing - callba TrainerRankings_LuckyNumberShow - ld a, [wFoundMatchingIDInParty] - and a - push af - ld a, [CurPartySpecies] - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, .FoundPartymonText - pop af - jr z, .print - ld hl, .FoundBoxmonText - -.print - jp PrintText - -.CompareLuckyNumberToMonID: ; 4d939 - push bc - push de - push hl - ld d, h - ld e, l - ld hl, Buffer1 - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ld hl, LuckyNumberDigit1Buffer - ld de, wLuckyIDNumber - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ld b, 5 - ld c, 0 - ld hl, LuckyNumberDigit5Buffer - ld de, Buffer5 -.loop - ld a, [de] - cp [hl] - jr nz, .done - dec de - dec hl - inc c - dec b - jr nz, .loop - -.done - pop hl - push hl - ld de, -6 - add hl, de - ld a, [hl] - pop hl - pop de - push af - ld a, c - ld b, 1 - cp 5 - jr z, .okay - ld b, 2 - cp 3 - jr nc, .okay - ld b, 3 - cp 2 - jr nz, .nomatch - -.okay - inc b - ld a, [ScriptVar] - and a - jr z, .bettermatch - cp b - jr c, .nomatch - -.bettermatch - dec b - ld a, b - ld [ScriptVar], a - pop bc - ld a, b - ld [CurPartySpecies], a - pop bc - scf - ret - -.nomatch - pop bc - pop bc - and a - ret - -.BoxBankAddresses: ; 4d99f - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 - -.FoundPartymonText: ; 0x4d9c9 - ; Congratulations! We have a match with the ID number of @ in your party. - text_jump UnknownText_0x1c1261 - db "@" - -.FoundBoxmonText: ; 0x4d9ce - ; Congratulations! We have a match with the ID number of @ in your PC BOX. - text_jump UnknownText_0x1c12ae - db "@" - -Special_PrintTodaysLuckyNumber: ; 4d9d3 - ld hl, StringBuffer3 - ld de, wLuckyIDNumber - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ld a, "@" - ld [StringBuffer3 + 5], a - ret - -CheckPartyFullAfterContest: ; 4d9e5 - ld a, [wContestMon] - and a - jp z, .DidntCatchAnything - ld [CurPartySpecies], a - ld [CurSpecies], a - call GetBaseData - ld hl, PartyCount - ld a, [hl] - cp 6 - jp nc, .TryAddToBox - inc a - ld [hl], a - ld c, a - ld b, $0 - add hl, bc - ld a, [wContestMon] - ld [hli], a - ld [CurSpecies], a - ld a, $ff - ld [hl], a - ld hl, PartyMon1Species - ld a, [PartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wContestMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ld a, [PartyCount] - dec a - ld hl, PartyMonOT - call SkipNames - ld d, h - ld e, l - ld hl, PlayerName - call CopyBytes - ld a, [CurPartySpecies] - ld [wd265], a - call GetPokemonName - ld hl, StringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, PKMN_NAME_LENGTH - call CopyBytes - call GiveANickname_YesNo - jr c, .Party_SkipNickname - ld a, [PartyCount] - dec a - ld [CurPartyMon], a - xor a - ld [MonType], a - ld de, wMonOrItemNameBuffer - callab InitNickname - -.Party_SkipNickname: - ld a, [PartyCount] - dec a - ld hl, PartyMonNicknames - call SkipNames - ld d, h - ld e, l - ld hl, wMonOrItemNameBuffer - call CopyBytes - ld a, [PartyCount] - dec a - ld hl, PartyMon1Level - call GetPartyLocation - ld a, [hl] - ld [CurPartyLevel], a - call SetCaughtData - ld a, [PartyCount] - dec a - ld hl, PartyMon1CaughtLocation - call GetPartyLocation - ld a, [hl] - and $80 - ld b, $13 - or b - ld [hl], a - xor a - ld [wContestMon], a - and a - ld [ScriptVar], a - ret - -.TryAddToBox: ; 4daa3 - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - ld a, [hl] - cp MONS_PER_BOX - call CloseSRAM - jr nc, .BoxFull - xor a - ld [CurPartyMon], a - ld hl, wContestMon - ld de, wBufferMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - ld hl, PlayerName - ld de, wBufferMonOT - ld bc, NAME_LENGTH - call CopyBytes - callab InsertPokemonIntoBox - ld a, [CurPartySpecies] - ld [wd265], a - call GetPokemonName - call GiveANickname_YesNo - ld hl, StringBuffer1 - jr c, .Box_SkipNickname - ld a, BOXMON - ld [MonType], a - ld de, wMonOrItemNameBuffer - callab InitNickname - ld hl, wMonOrItemNameBuffer - -.Box_SkipNickname: - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - ld de, sBoxMonNicknames - ld bc, PKMN_NAME_LENGTH - call CopyBytes - call CloseSRAM - -.BoxFull: - ld a, BANK(sBoxMon1Level) - call GetSRAMBank - ld a, [sBoxMon1Level] - ld [CurPartyLevel], a - call CloseSRAM - call SetBoxMonCaughtData - ld a, BANK(sBoxMon1CaughtLocation) - call GetSRAMBank - ld hl, sBoxMon1CaughtLocation - ld a, [hl] - and $80 - ld b, $13 - or b - ld [hl], a - call CloseSRAM - xor a - ld [wContestMon], a - ld a, $1 - ld [ScriptVar], a - ret - -.DidntCatchAnything: ; 4db35 - ld a, $2 - ld [ScriptVar], a - ret - -GiveANickname_YesNo: ; 4db3b - ld hl, TextJump_GiveANickname - call PrintText - jp YesNoBox - -TextJump_GiveANickname: ; 0x4db44 - ; Give a nickname to the @ you received? - text_jump UnknownText_0x1c12fc - db "@" - -SetCaughtData: ; 4db49 - ld a, [PartyCount] - dec a - ld hl, PartyMon1CaughtLevel - call GetPartyLocation -SetBoxmonOrEggmonCaughtData: ; 4db53 - ld a, [TimeOfDay] - inc a - rrca - rrca - ld b, a - ld a, [CurPartyLevel] - or b - ld [hli], a - ld a, [MapGroup] - ld b, a - ld a, [MapNumber] - ld c, a - cp MAP_POKECENTER_2F - jr nz, .NotPokecenter2F - ld a, b - cp GROUP_POKECENTER_2F - jr nz, .NotPokecenter2F - - ld a, [BackupMapGroup] - ld b, a - ld a, [BackupMapNumber] - ld c, a - -.NotPokecenter2F: - call GetWorldMapLocation - ld b, a - ld a, [PlayerGender] - rrca - or b - ld [hl], a - ret - -SetBoxMonCaughtData: ; 4db83 - ld a, BANK(sBoxMon1CaughtLevel) - call GetSRAMBank - ld hl, sBoxMon1CaughtLevel - call SetBoxmonOrEggmonCaughtData - call CloseSRAM - ret - -SetGiftBoxMonCaughtData: ; 4db92 - push bc - ld a, BANK(sBoxMon1CaughtLevel) - call GetSRAMBank - ld hl, sBoxMon1CaughtLevel - pop bc - call SetGiftMonCaughtData - call CloseSRAM - ret - -SetGiftPartyMonCaughtData: ; 4dba3 - ld a, [PartyCount] - dec a - ld hl, PartyMon1CaughtLevel - push bc - call GetPartyLocation - pop bc -SetGiftMonCaughtData: ; 4dbaf - xor a - ld [hli], a - ld a, $7e - rrc b - or b - ld [hl], a - ret - -SetEggMonCaughtData: ; 4dbb8 (13:5bb8) - ld a, [CurPartyMon] - ld hl, PartyMon1CaughtLevel - call GetPartyLocation - ld a, [CurPartyLevel] - push af - ld a, $1 - ld [CurPartyLevel], a - call SetBoxmonOrEggmonCaughtData - pop af - ld [CurPartyLevel], a - ret - +INCLUDE "event/lucky_number.asm" +INCLUDE "engine/caught_data.asm" INCLUDE "engine/search2.asm" - INCLUDE "engine/stats_screen.asm" - -CatchTutorial:: ; 4e554 - ld a, [BattleType] - dec a - ld c, a - ld hl, .dw - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.dw ; 4e564 (13:6564) - dw .DudeTutorial - dw .DudeTutorial - dw .DudeTutorial - -.DudeTutorial: ; 4e56a (13:656a) -; Back up your name to your Mom's name. - ld hl, PlayerName - ld de, MomsName - ld bc, NAME_LENGTH - call CopyBytes -; Copy Dude's name to your name - ld hl, .Dude - ld de, PlayerName - ld bc, NAME_LENGTH - call CopyBytes - - call .LoadDudeData - - xor a - ld [hJoyDown], a - ld [hJoyPressed], a - ld a, [Options] - push af - and $f8 - add $3 - ld [Options], a - ld hl, .AutoInput - ld a, BANK(.AutoInput) - call StartAutoInput - callab StartBattle - call StopAutoInput - pop af - - ld [Options], a - ld hl, MomsName - ld de, PlayerName - ld bc, NAME_LENGTH - call CopyBytes - ret - -.LoadDudeData: ; 4e5b7 (13:65b7) - ld hl, wDudeNumItems - ld [hl], 1 - inc hl - ld [hl], POTION - inc hl - ld [hl], 1 - inc hl - ld [hl], -1 - ld hl, wDudeNumKeyItems - ld [hl], 0 - inc hl - ld [hl], -1 - ld hl, wDudeNumBalls - ld a, 1 - ld [hli], a - ld a, POKE_BALL ; 5 - ld [hli], a - ld [hli], a - ld [hl], -1 - ret - -.Dude: ; 4e5da - db "DUDE@" - -.AutoInput: ; 4e5df - db NO_INPUT, $ff ; end - +INCLUDE "event/catch_tutorial.asm" INCLUDE "engine/evolution_animation.asm" InitDisplayForHallOfFame: ; 4e881 @@ -3342,7 +1187,6 @@ GetMobileOTTrainerClass: ; mobile function ret INCLUDE "data/trainers/gendered_trainers.asm" - INCLUDE "battle/sliding_intro.asm" Mobile_PrintOpponentBattleMessage: ; 4ea0a @@ -3425,7 +1269,6 @@ CheckBattleScene: ; 4ea44 ret INCLUDE "engine/gbc_only.asm" - INCLUDE "event/poke_seer.asm" @@ -3568,586 +1411,8 @@ GetPkmnSpecies: ; 508d5 ret INCLUDE "text/types.asm" - -Function50a28: ; 50a28 -; XXX - ld hl, .Strings - ld a, [TrainerClass] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, StringBuffer1 -.copy - ld a, [hli] - ld [de], a - inc de - cp "@" - jr nz, .copy - ret - -.Strings: ; 50a42 -; Untranslated trainer class names from Red. - dw .Youngster - dw .BugCatcher - dw .Lass - dw OTClassName - dw .JrTrainerM - dw .JrTrainerF - dw .Pokemaniac - dw .SuperNerd - dw OTClassName - dw OTClassName - dw .Burglar - dw .Engineer - dw .Jack - dw OTClassName - dw .Swimmer - dw OTClassName - dw OTClassName - dw .Beauty - dw OTClassName - dw .Rocker - dw .Juggler - dw OTClassName - dw OTClassName - dw .Blackbelt - dw OTClassName - dw .ProfOak - dw .Chief - dw .Scientist - dw OTClassName - dw .Rocket - dw .CooltrainerM - dw .CooltrainerF - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - dw OTClassName - -.Youngster: db "たんパン@" -.BugCatcher: db "むしとり@" -.Lass: db "ミニスカ@" -.JrTrainerM: db "ボーイ@" -.JrTrainerF: db "ガール@" -.Pokemaniac: db "マニア@" -.SuperNerd: db "りかけい@" -.Burglar: db "どろぼう@" -.Engineer: db "ォヤジ@" -.Jack: db "ジャック@" -.Swimmer: db "かいパン@" -.Beauty: db "おねえさん@" -.Rocker: db "グループ@" -.Juggler: db "ジャグラー@" -.Blackbelt: db "からて@" -.ProfOak: db "ォーキド@" -.Chief: db "チーフ@" -.Scientist: db "けんきゅういん@" -.Rocket: db "だんいん@" -.CooltrainerM: db "エりート♂@" -.CooltrainerF: db "エりート♀@" - -DrawPlayerHP: ; 50b0a - ld a, $1 - jr DrawHP - -DrawEnemyHP: ; 50b0e - ld a, $2 - -DrawHP: ; 50b10 - ld [wWhichHPBar], a - push hl - push bc - ; box mons have full HP - ld a, [MonType] - cp BOXMON - jr z, .at_least_1_hp - - ld a, [TempMonHP] - ld b, a - ld a, [TempMonHP + 1] - ld c, a - -; Any HP? - or b - jr nz, .at_least_1_hp - - xor a - ld c, a - ld e, a - ld a, 6 - ld d, a - jp .fainted - -.at_least_1_hp - ld a, [TempMonMaxHP] - ld d, a - ld a, [TempMonMaxHP + 1] - ld e, a - ld a, [MonType] - cp BOXMON - jr nz, .not_boxmon - - ld b, d - ld c, e - -.not_boxmon - predef ComputeHPBarPixels - ld a, 6 - ld d, a - ld c, a - -.fainted - ld a, c - pop bc - ld c, a - pop hl - push de - push hl - push hl - call DrawBattleHPBar - pop hl - -; Print HP - bccoord 1, 1, 0 - add hl, bc - ld de, TempMonHP - ld a, [MonType] - cp BOXMON - jr nz, .not_boxmon_2 - ld de, TempMonMaxHP -.not_boxmon_2 - lb bc, 2, 3 - call PrintNum - - ld a, "/" - ld [hli], a - -; Print max HP - ld de, TempMonMaxHP - lb bc, 2, 3 - call PrintNum - pop hl - pop de - ret - -PrintTempMonStats: ; 50b7b -; Print TempMon's stats at hl, with spacing bc. - push bc - push hl - ld de, .StatNames - call PlaceString - pop hl - pop bc - add hl, bc - ld bc, SCREEN_WIDTH - add hl, bc - ld de, TempMonAttack - lb bc, 2, 3 - call .PrintStat - ld de, TempMonDefense - call .PrintStat - ld de, TempMonSpclAtk - call .PrintStat - ld de, TempMonSpclDef - call .PrintStat - ld de, TempMonSpeed - jp PrintNum - -.PrintStat: ; 50bab - push hl - call PrintNum - pop hl - ld de, SCREEN_WIDTH * 2 - add hl, de - ret - -.StatNames: ; 50bb5 - db "ATTACK" - next "DEFENSE" - next "SPCL.ATK" - next "SPCL.DEF" - next "SPEED" - next "@" - -GetGender: ; 50bdd -; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon). -; When calling this function, a should be set to an appropriate MonType value. - -; return values: -; a = 1: f = nc|nz; male -; a = 0: f = nc|z; female -; f = c: genderless - -; This is determined by comparing the Attack and Speed DVs -; with the species' gender ratio. - -; Figure out what type of monster struct we're looking at. - -; 0: PartyMon - ld hl, PartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [MonType] - and a - jr z, .PartyMon - -; 1: OTPartyMon - ld hl, OTPartyMon1DVs - dec a - jr z, .PartyMon - -; 2: sBoxMon - ld hl, sBoxMon1DVs - ld bc, BOXMON_STRUCT_LENGTH - dec a - jr z, .sBoxMon - -; 3: Unknown - ld hl, TempMonDVs - dec a - jr z, .DVs - -; else: WildMon - ld hl, EnemyMonDVs - jr .DVs - -; Get our place in the party/box. - -.PartyMon: -.sBoxMon - ld a, [CurPartyMon] - call AddNTimes - -.DVs: - -; sBoxMon data is read directly from SRAM. - ld a, [MonType] - cp BOXMON - ld a, 1 - call z, GetSRAMBank - -; Attack DV - ld a, [hli] - and $f0 - ld b, a -; Speed DV - ld a, [hl] - and $f0 - swap a - -; Put our DVs together. - or b - ld b, a - -; Close SRAM if we were dealing with a sBoxMon. - ld a, [MonType] - cp BOXMON - call z, CloseSRAM - -; We need the gender ratio to do anything with this. - push bc - ld a, [CurPartySpecies] - dec a - ld hl, BaseData + BASE_GENDER - ld bc, BASE_DATA_SIZE - call AddNTimes - pop bc - - ld a, BANK(BaseData) - call GetFarByte - -; The higher the ratio, the more likely the monster is to be female. - - cp GENDERLESS - jr z, .Genderless - - and a ; GENDER_F0? - jr z, .Male - - cp GENDER_F100 - jr z, .Female - -; Values below the ratio are male, and vice versa. - cp b - jr c, .Male - -.Female: - xor a - ret - -.Male: - ld a, 1 - and a - ret - -.Genderless: - scf - ret - -ListMovePP: ; 50c50 - ld a, [wNumMoves] - inc a - ld c, a - ld a, NUM_MOVES - sub c - ld b, a - push hl - ld a, [Buffer1] - ld e, a - ld d, $0 - ld a, $3e ; P - call .load_loop - ld a, b - and a - jr z, .skip - ld c, a - ld a, "-" - call .load_loop - -.skip - pop hl - inc hl - inc hl - inc hl - ld d, h - ld e, l - ld hl, TempMonMoves - ld b, 0 -.loop - ld a, [hli] - and a - jr z, .done - push bc - push hl - push de - ld hl, wMenuCursorY - ld a, [hl] - push af - ld [hl], b - push hl - callab GetMaxPPOfMove - pop hl - pop af - ld [hl], a - pop de - pop hl - push hl - ld bc, TempMonPP - (TempMonMoves + 1) - add hl, bc - ld a, [hl] - and $3f - ld [StringBuffer1 + 4], a - ld h, d - ld l, e - push hl - ld de, StringBuffer1 + 4 - lb bc, 1, 2 - call PrintNum - ld a, "/" - ld [hli], a - ld de, wd265 - lb bc, 1, 2 - call PrintNum - pop hl - ld a, [Buffer1] - ld e, a - ld d, 0 - add hl, de - ld d, h - ld e, l - pop hl - pop bc - inc b - ld a, b - cp NUM_MOVES - jr nz, .loop - -.done - ret - -.load_loop ; 50cc9 - ld [hli], a - ld [hld], a - add hl, de - dec c - jr nz, .load_loop - ret - -Function50cd0: ; 50cd0 -; XXX -.loop - ld [hl], $32 - inc hl - ld [hl], $3e - dec hl - add hl, de - dec c - jr nz, .loop - ret - -Predef22: ; unreferenced predef - push hl - push hl - ld hl, PartyMonNicknames - ld a, [CurPartyMon] - call GetNick - pop hl - call PlaceString - call CopyPkmnToTempMon - pop hl - ld a, [CurPartySpecies] - cp EGG - jr z, .egg - push hl - ld bc, -12 - add hl, bc - ld b, $0 - call DrawEnemyHP - pop hl - ld bc, 5 - add hl, bc - push de - call PrintLevel - pop de - -.egg - ret - -PlaceStatusString: ; 50d0a - push de - inc de - inc de - ld a, [de] - ld b, a - inc de - ld a, [de] - or b - pop de - jr nz, PlaceNonFaintStatus - push de - ld de, FntString - call CopyStatusString - pop de - ld a, $1 - and a - ret - -FntString: ; 50d22 - db "FNT@" - -CopyStatusString: ; 50d25 - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - ret - -PlaceNonFaintStatus: ; 50d2e - push de - ld a, [de] - ld de, PsnString - bit PSN, a - jr nz, .place - ld de, BrnString - bit BRN, a - jr nz, .place - ld de, FrzString - bit FRZ, a - jr nz, .place - ld de, ParString - bit PAR, a - jr nz, .place - ld de, SlpString - and SLP - jr z, .no_status - -.place - call CopyStatusString - ld a, $1 - and a - -.no_status - pop de - ret - -SlpString: db "SLP@" -PsnString: db "PSN@" -BrnString: db "BRN@" -FrzString: db "FRZ@" -ParString: db "PAR@" - -ListMoves: ; 50d6f -; List moves at hl, spaced every [Buffer1] tiles. - ld de, wListMoves_MoveIndicesBuffer - ld b, $0 -.moves_loop - ld a, [de] - inc de - and a - jr z, .no_more_moves - push de - push hl - push hl - ld [CurSpecies], a - ld a, MOVE_NAME - ld [wNamedObjectTypeBuffer], a - call GetName - ld de, StringBuffer1 - pop hl - push bc - call PlaceString - pop bc - ld a, b - ld [wNumMoves], a - inc b - pop hl - push bc - ld a, [Buffer1] - ld c, a - ld b, 0 - add hl, bc - pop bc - pop de - ld a, b - cp NUM_MOVES - jr z, .done - jr .moves_loop - -.no_more_moves - ld a, b -.nonmove_loop - push af - ld [hl], "-" - ld a, [Buffer1] - ld c, a - ld b, 0 - add hl, bc - pop af - inc a - cp NUM_MOVES - jr nz, .nonmove_loop - -.done - ret +INCLUDE "text/unused_gen_1_trainers.asm" +INCLUDE "engine/mon_stats.asm" InitList: ; 50db9 ld a, [wInitListType] @@ -4204,168 +1469,7 @@ InitList: ; 50db9 ld [wItemAttributesPtr + 1], a ret -CalcLevel: ; 50e1b - ld a, [TempMonSpecies] - ld [CurSpecies], a - call GetBaseData - ld d, 1 -.next_level - inc d - ld a, d - cp (MAX_LEVEL + 1) % $100 - jr z, .got_level - call CalcExpAtLevel - push hl - ld hl, TempMonExp + 2 - ld a, [hProduct + 3] - ld c, a - ld a, [hld] - sub c - ld a, [hProduct + 2] - ld c, a - ld a, [hld] - sbc c - ld a, [hProduct + 1] - ld c, a - ld a, [hl] - sbc c - pop hl - jr nc, .next_level - -.got_level - dec d - ret - -CalcExpAtLevel: ; 50e47 -; (a/b)*n**3 + c*n**2 + d*n - e - ld a, [BaseGrowthRate] - add a - add a - ld c, a - ld b, 0 - ld hl, GrowthRates - add hl, bc -; Cube the level - call .LevelSquared - ld a, d - ld [hMultiplier], a - call Multiply - -; Multiply by a - ld a, [hl] - and $f0 - swap a - ld [hMultiplier], a - call Multiply -; Divide by b - ld a, [hli] - and $f - ld [hDivisor], a - ld b, 4 - call Divide -; Push the cubic term to the stack - ld a, [hQuotient + 0] - push af - ld a, [hQuotient + 1] - push af - ld a, [hQuotient + 2] - push af -; Square the level and multiply by the lower 7 bits of c - call .LevelSquared - ld a, [hl] - and $7f - ld [hMultiplier], a - call Multiply -; Push the absolute value of the quadratic term to the stack - ld a, [hProduct + 1] - push af - ld a, [hProduct + 2] - push af - ld a, [hProduct + 3] - push af - ld a, [hli] - push af -; Multiply the level by d - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, d - ld [hMultiplicand + 2], a - ld a, [hli] - ld [hMultiplier], a - call Multiply -; Subtract e - ld b, [hl] - ld a, [hProduct + 3] - sub b - ld [hMultiplicand + 2], a - ld b, $0 - ld a, [hProduct + 2] - sbc b - ld [hMultiplicand + 1], a - ld a, [hProduct + 1] - sbc b - ld [hMultiplicand], a -; If bit 7 of c is set, c is negative; otherwise, it's positive - pop af - and $80 - jr nz, .subtract -; Add c*n**2 to (d*n - e) - pop bc - ld a, [hProduct + 3] - add b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - adc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - adc b - ld [hMultiplicand], a - jr .done_quadratic - -.subtract -; Subtract c*n**2 from (d*n - e) - pop bc - ld a, [hProduct + 3] - sub b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - sbc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - sbc b - ld [hMultiplicand], a - -.done_quadratic -; Add (a/b)*n**3 to (d*n - e +/- c*n**2) - pop bc - ld a, [hProduct + 3] - add b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - adc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - adc b - ld [hMultiplicand], a - ret - -.LevelSquared: ; 50eed - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, d - ld [hMultiplicand + 2], a - ld [hMultiplier], a - jp Multiply - -INCLUDE "data/growth_rates.asm" +INCLUDE "engine/experience.asm" _SwitchPartyMons: ld a, [wd0e3] @@ -4514,11 +1618,8 @@ _SwitchPartyMons: ret INCLUDE "gfx/load_pics.asm" - INCLUDE "engine/move_mon_wo_mail.asm" - INCLUDE "data/pokemon/base_stats.asm" - INCLUDE "data/pokemon/pokemon_names.asm" Unknown_53d84: ; unreferenced @@ -4564,274 +1665,7 @@ INCLUDE "event/halloffame.asm" SECTION "bank22", ROMX INCLUDE "event/kurt.asm" - -Function88248: ; 88248 -; XXX - ld c, CAL - ld a, [PlayerGender] - bit 0, a - jr z, .okay - ld c, KAREN - -.okay - ld a, c - ld [TrainerClass], a - ret - -MovePlayerPicRight: ; 88258 - hlcoord 6, 4 - ld de, 1 - jr MovePlayerPic - -MovePlayerPicLeft: ; 88260 - hlcoord 13, 4 - ld de, -1 - ; fallthrough - -MovePlayerPic: ; 88266 -; Move player pic at hl by de * 7 tiles. - ld c, $8 -.loop - push bc - push hl - push de - xor a - ld [hBGMapMode], a - lb bc, 7, 7 - predef PlaceGraphic - xor a - ld [hBGMapThird], a - call WaitBGMap - call DelayFrame - pop de - pop hl - add hl, de - pop bc - dec c - ret z - push hl - push bc - ld a, l - sub e - ld l, a - ld a, h - sbc d - ld h, a - lb bc, 7, 7 - call ClearBox - pop bc - pop hl - jr .loop - -ShowPlayerNamingChoices: ; 88297 - ld hl, ChrisNameMenuHeader - ld a, [PlayerGender] - bit 0, a - jr z, .GotGender - ld hl, KrisNameMenuHeader -.GotGender: - call LoadMenuDataHeader - call VerticalMenu - ld a, [wMenuCursorY] - dec a - call CopyNameFromMenu - call CloseWindow - ret - -ChrisNameMenuHeader: ; 882b5 - db $40 ; flags - db 00, 00 ; start coords - db 11, 10 ; end coords - dw .MaleNames - db 1 ; ???? - db 0 ; default option - -.MaleNames: ; 882be - db $91 ; flags - db 5 ; items - db "NEW NAME@" -MalePlayerNameArray: ; 882c9 - db "CHRIS@" - db "MAT@" - db "ALLAN@" - db "JON@" - db 2 ; displacement - db " NAME @" ; title - -KrisNameMenuHeader: ; 882e5 - db $40 ; flags - db 00, 00 ; start coords - db 11, 10 ; end coords - dw .FemaleNames - db 1 ; ???? - db 0 ; default option - -.FemaleNames: ; 882ee - db $91 ; flags - db 5 ; items - db "NEW NAME@" -FemalePlayerNameArray: ; 882f9 - db "KRIS@" - db "AMANDA@" - db "JUANA@" - db "JODI@" - db 2 ; displacement - db " NAME @" ; title - -GetPlayerNameArray: ; 88318 This Function is never called - ld hl, PlayerName - ld de, MalePlayerNameArray - ld a, [PlayerGender] - bit 0, a - jr z, .done - ld de, FemalePlayerNameArray - -.done - call InitName - ret - -GetPlayerIcon: ; 8832c -; Get the player icon corresponding to gender - -; Male - ld de, ChrisSpriteGFX - ld b, BANK(ChrisSpriteGFX) - - ld a, [PlayerGender] - bit 0, a - jr z, .done - -; Female - ld de, KrisSpriteGFX - ld b, BANK(KrisSpriteGFX) - -.done - ret - -GetCardPic: ; 8833e - ld hl, ChrisCardPic - ld a, [PlayerGender] - bit 0, a - jr z, .GotClass - ld hl, KrisCardPic -.GotClass: - ld de, VTiles2 tile $00 - ld bc, $23 tiles - ld a, BANK(ChrisCardPic) ; BANK(KrisCardPic) - call FarCopyBytes - ld hl, CardGFX - ld de, VTiles2 tile $23 - ld bc, 6 tiles - ld a, BANK(CardGFX) - call FarCopyBytes - ret - -ChrisCardPic: ; 88365 -INCBIN "gfx/trainer_card/chris_card.2bpp" - -KrisCardPic: ; 88595 -INCBIN "gfx/trainer_card/kris_card.2bpp" - -CardGFX: ; 887c5 -INCBIN "gfx/trainer_card/trainer_card.2bpp" - -GetPlayerBackpic: ; 88825 - ld a, [PlayerGender] - bit 0, a - jr z, GetChrisBackpic - call GetKrisBackpic - ret - -GetChrisBackpic: ; 88830 - ld hl, ChrisBackpic - ld b, BANK(ChrisBackpic) - ld de, VTiles2 tile $31 - ld c, 7 * 7 - predef DecompressPredef - ret - -HOF_LoadTrainerFrontpic: ; 88840 - call WaitBGMap - xor a - ld [hBGMapMode], a - ld e, 0 - ld a, [PlayerGender] - bit 0, a - jr z, .GotClass - ld e, 1 - -.GotClass: - ld a, e - ld [TrainerClass], a - ld de, ChrisPic - ld a, [PlayerGender] - bit 0, a - jr z, .GotPic - ld de, KrisPic - -.GotPic: - ld hl, VTiles2 - ld b, BANK(ChrisPic) ; BANK(KrisPic) - ld c, 7 * 7 - call Get2bpp - call WaitBGMap - ld a, $1 - ld [hBGMapMode], a - ret - -DrawIntroPlayerPic: ; 88874 -; Draw the player pic at (6,4). - -; Get class - ld e, CHRIS - ld a, [PlayerGender] - bit 0, a - jr z, .GotClass - ld e, KRIS -.GotClass: - ld a, e - ld [TrainerClass], a - -; Load pic - ld de, ChrisPic - ld a, [PlayerGender] - bit 0, a - jr z, .GotPic - ld de, KrisPic -.GotPic: - ld hl, VTiles2 - ld b, BANK(ChrisPic) ; BANK(KrisPic) - ld c, 7 * 7 ; dimensions - call Get2bpp - -; Draw - xor a - ld [hGraphicStartTile], a - hlcoord 6, 4 - lb bc, 7, 7 - predef PlaceGraphic - ret - -ChrisPic: ; 888a9 -INCBIN "gfx/player/chris.2bpp" - -KrisPic: ; 88bb9 -INCBIN "gfx/player/kris.2bpp" - -GetKrisBackpic: ; 88ec9 -; Kris's backpic is uncompressed. - ld de, KrisBackpic - ld hl, VTiles2 tile $31 - lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions - call Get2bpp - ret - -KrisBackpic: ; 88ed6 -INCBIN "gfx/player/kris_back.2bpp" - -String_89116: - db "-----@" - +INCLUDE "engine/player_gfx.asm" INCLUDE "mobile/mobile_22.asm" INCLUDE "event/unown.asm" INCLUDE "event/buena.asm" @@ -4842,22 +1676,8 @@ INCLUDE "mobile/mobile_22_2.asm" SECTION "bank23", ROMX -Predef35: ; 8c000 -Predef36: - ret - INCLUDE "engine/timeofdaypals.asm" -INCLUDE "engine/battle_start.asm" - -Function8c7c9: -; XXX - ld a, $1 - ld [hBGMapMode], a - call WaitBGMap - xor a - ld [hBGMapMode], a - ret - +INCLUDE "engine/battle_transition.asm" INCLUDE "event/field_moves.asm" INCLUDE "event/magnet_train.asm" @@ -4916,39 +1736,7 @@ SECTION "bank2F", ROMX INCLUDE "engine/std_scripts.asm" INCLUDE "engine/phone_scripts.asm" - -TalkToTrainerScript:: ; 0xbe66a - faceplayer - trainerflagaction CHECK_FLAG - iftrue AlreadyBeatenTrainerScript - loadmemtrainer - encountermusic - jump StartBattleWithMapTrainerScript - -SeenByTrainerScript:: ; 0xbe675 - loadmemtrainer - encountermusic - showemote EMOTE_SHOCK, LAST_TALKED, 30 - callasm TrainerWalkToPlayer - applymovement2 MovementBuffer - writepersonxy LAST_TALKED - faceperson PLAYER, LAST_TALKED - jump StartBattleWithMapTrainerScript - -StartBattleWithMapTrainerScript: ; 0xbe68a - opentext - trainertext $0 - waitbutton - closetext - loadmemtrainer - startbattle - reloadmapafterbattle - trainerflagaction SET_FLAG - loadvar wRunningTrainerBattleScript, -1 - -AlreadyBeatenTrainerScript: - scripttalkafter - +INCLUDE "engine/trainer_scripts.asm" INCLUDE "gfx/sprites.asm" @@ -5012,114 +1800,7 @@ INCBIN "gfx/credits/theend.2bpp" SECTION "bank33", ROMX -DisplayCaughtContestMonStats: ; cc000 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call LoadFontsBattleExtra - - ld hl, Options - ld a, [hl] - push af - set 4, [hl] - - hlcoord 0, 0 - ld b, 4 - ld c, 13 - call TextBox - - hlcoord 0, 6 - ld b, 4 - ld c, 13 - call TextBox - - hlcoord 2, 0 - ld de, .Stock - call PlaceString - - hlcoord 2, 6 - ld de, .This - call PlaceString - - hlcoord 5, 4 - ld de, .Health - call PlaceString - - hlcoord 5, 10 - ld de, .Health - call PlaceString - - ld a, [wContestMon] - ld [wd265], a - call GetPokemonName - ld de, StringBuffer1 - hlcoord 1, 2 - call PlaceString - - ld h, b - ld l, c - ld a, [wContestMonLevel] - ld [TempMonLevel], a - call PrintLevel - - ld de, EnemyMonNick - hlcoord 1, 8 - call PlaceString - - ld h, b - ld l, c - ld a, [EnemyMonLevel] - ld [TempMonLevel], a - call PrintLevel - - hlcoord 11, 4 - ld de, wContestMonMaxHP - lb bc, 2, 3 - call PrintNum - - hlcoord 11, 10 - ld de, EnemyMonMaxHP - call PrintNum - - ld hl, SwitchMonText - call PrintText - - pop af - ld [Options], a - - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - ret - -.Health: - db "HEALTH@" -.Stock: - db " STOCK ", $4a, " @" -.This: - db " THIS ", $4a, " @" - -SwitchMonText: ; cc0c2 - ; Switch #MON? - text_jump UnknownText_0x1c10cf - db "@" - -DisplayAlreadyCaughtText: ; cc0c7 - call GetPokemonName - ld hl, .AlreadyCaughtText - jp PrintText - -.AlreadyCaughtText: ; 0xcc0d0 - ; You already caught a @ . - text_jump UnknownText_0x1c10dd - db "@" - -Predef2F: -Predef38: -Predef39: ; cc0d5 - ret - +INCLUDE "event/bug_contest_mon_stats.asm" INCLUDE "battle/anim_commands.asm" INCLUDE "battle/anim_objects.asm" @@ -5331,23 +2012,7 @@ INCLUDE "engine/warp_connection.asm" INCLUDE "engine/mysterygift.asm" INCLUDE "battle/used_move_text.asm" INCLUDE "mobile/mobile_41.asm" - -LoadOverworldFont:: ; 106594 - ld de, .font - ld hl, VTiles1 - lb bc, BANK(.font), $80 - call Get2bpp - ld de, .space - ld hl, VTiles2 tile $7f - lb bc, BANK(.space), 1 - call Get2bpp - ret -; 1065ad - -.font -INCBIN "gfx/font/overworld.2bpp" -.space -INCBIN "gfx/font/space.2bpp" +INCLUDE "gfx/overworld_font.asm" SECTION "mobile_42", ROMX @@ -5403,7 +2068,6 @@ _UpdateBattleHUDs: ret INCLUDE "mobile/mobile_5e.asm" - INCLUDE "mobile/mobile_5f.asm" @@ -5515,213 +2179,8 @@ String_AM: db "AM@" ; 1dd6fc String_PM: db "PM@" ; 1dd6ff INCLUDE "engine/diploma.asm" - -LoadSGBPokedexGFX: ; 1ddf1c - ld hl, SGBPokedexGFX_LZ - ld de, VTiles2 tile $31 - call Decompress - ret - -LoadSGBPokedexGFX2: ; 1ddf26 (77:5f26) - ld hl, SGBPokedexGFX_LZ - ld de, VTiles2 tile $31 - lb bc, BANK(SGBPokedexGFX_LZ), $3a - call DecompressRequest2bpp - ret - -SGBPokedexGFX_LZ: ; 1ddf33 -INCBIN "gfx/pokedex/sgb.2bpp.lz" - -LoadQuestionMarkPic: ; 1de0d7 - ld hl, .QuestionMarkLZ - ld de, sScratch - call Decompress - ret - -.QuestionMarkLZ: ; 1de0e1 -INCBIN "gfx/pics/questionmark/front.2bpp.lz" - -DrawPokedexListWindow: ; 1de171 (77:6171) - ld a, $32 - hlcoord 0, 17 - ld bc, 12 - call ByteFill - hlcoord 0, 1 - lb bc, 15, 11 - call ClearBox - ld a, $34 - hlcoord 0, 0 - ld bc, 11 - call ByteFill - ld a, $39 - hlcoord 0, 16 - ld bc, 11 - call ByteFill - hlcoord 5, 0 - ld [hl], $3f - hlcoord 5, 16 - ld [hl], $40 - ld a, [wCurrentDexMode] - cp DEXMODE_OLD - jr z, .OldMode -; scroll bar - hlcoord 11, 0 - ld [hl], $50 - ld a, $51 - hlcoord 11, 1 - ld b, SCREEN_HEIGHT - 3 - call Bank77_FillColumn - ld [hl], $52 - jr .Done - -.OldMode: -; no scroll bar - hlcoord 11, 0 - ld [hl], $66 - ld a, $67 - hlcoord 11, 1 - ld b, SCREEN_HEIGHT - 3 - call Bank77_FillColumn - ld [hl], $68 -.Done: - ret - -DrawPokedexSearchResultsWindow: ; 1de1d1 (77:61d1) - ld a, $34 - hlcoord 0, 0 - ld bc, 11 - call ByteFill - ld a, $39 - hlcoord 0, 10 - ld bc, 11 - call ByteFill - hlcoord 5, 0 - ld [hl], $3f - hlcoord 5, 10 - ld [hl], $40 - hlcoord 11, 0 - ld [hl], $66 - ld a, $67 - hlcoord 11, 1 - ld b, SCREEN_HEIGHT / 2 - call Bank77_FillColumn - ld [hl], $68 - ld a, $34 - hlcoord 0, 11 - ld bc, 11 - call ByteFill - ld a, $39 - hlcoord 0, 17 - ld bc, 11 - call ByteFill - hlcoord 11, 11 - ld [hl], $66 - ld a, $67 - hlcoord 11, 12 - ld b, 5 - call Bank77_FillColumn - ld [hl], $68 - hlcoord 0, 12 - lb bc, 5, 11 - call ClearBox - ld de, .esults_D - hlcoord 0, 12 - call PlaceString - ret - -.esults_D ; 1de23c -; (SEARCH R) - db "ESULTS" - next "" -; (### FOUN) - next "D!@" - -DrawDexEntryScreenRightEdge: ; 1de247 - ld a, [hBGMapAddress] - ld l, a - ld a, [hBGMapAddress + 1] - ld h, a - push hl - inc hl - ld a, l - ld [hBGMapAddress], a - ld a, h - ld [hBGMapAddress + 1], a - hlcoord 19, 0 - ld [hl], $66 - hlcoord 19, 1 - ld a, $67 - ld b, 15 - call Bank77_FillColumn - ld [hl], $68 - hlcoord 19, 17 - ld [hl], $3c - xor a - ld b, SCREEN_HEIGHT - hlcoord 19, 0, AttrMap - call Bank77_FillColumn - call WaitBGMap2 - pop hl - ld a, l - ld [hBGMapAddress], a - ld a, h - ld [hBGMapAddress + 1], a - ret - -Bank77_FillColumn: ; 1de27f - push de - ld de, SCREEN_WIDTH -.loop - ld [hl], a - add hl, de - dec b - jr nz, .loop - pop de - ret - -_DudeAutoInput_A:: ; 1de28a - ld hl, DudeAutoInput_A - jr _DudeAutoInput - -_DudeAutoInput_RightA: ; 1de28f - ld hl, DudeAutoInput_RightA - jr _DudeAutoInput - -_DudeAutoInput_DownA: ; 1de294 - ld hl, DudeAutoInput_DownA - jr _DudeAutoInput - -_DudeAutoInput: ; 1de299 - ld a, BANK(DudeAutoInputs) - call StartAutoInput - ret - -DudeAutoInputs: - -DudeAutoInput_A: ; 1de29f - db NO_INPUT, $50 - db A_BUTTON, $00 - db NO_INPUT, $ff ; end - -DudeAutoInput_RightA: ; 1de2a5 - db NO_INPUT, $08 - db D_RIGHT, $00 - db NO_INPUT, $08 - db A_BUTTON, $00 - db NO_INPUT, $ff ; end - -DudeAutoInput_DownA: ; 1de2af - db NO_INPUT, $fe - db NO_INPUT, $fe - db NO_INPUT, $fe - db NO_INPUT, $fe - db D_DOWN, $00 - db NO_INPUT, $fe - db NO_INPUT, $fe - db NO_INPUT, $fe - db NO_INPUT, $fe - db A_BUTTON, $00 - db NO_INPUT, $ff ; end +INCLUDE "engine/pokedex_3.asm" +INCLUDE "event/catch_tutorial_input.asm" TownMap_ConvertLineBreakCharacters: ; 1de2c5 ld hl, StringBuffer1 @@ -5748,135 +2207,7 @@ TownMap_ConvertLineBreakCharacters: ; 1de2c5 PokegearGFX: ; 1de2e4 INCBIN "gfx/pokegear/pokegear.2bpp.lz" -IsMailEuropean: ; 1de5c8 -; return 1 if French -; return 2 if German -; return 3 if Italian -; return 4 if Spanish -; return 0 if none of the above - ld c, $0 - ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail - add hl, de - ld a, [hli] - cp "E" - ret nz - ld a, [hli] - inc c - cp "F" - ret z - inc c - cp "G" - ret z - inc c - cp "I" - ret z - inc c - cp "S" - ret z - ld c, $0 - ret - -; The regular font. -StandardEnglishFont: ; 1de5e6 -INCBIN "gfx/font/english.1bpp" - -; An extended font. -FrenchGermanFont: ; 1de9e6 -INCBIN "gfx/font/french_german.1bpp" - -; An even more extended font. -SpanishItalianFont: ; 1dede6 -INCBIN "gfx/font/spanish_italian.1bpp" - -HandleFrenchGermanMail: ; 1df1e6 -; called if mail is french or german -; fix 's 't 'v - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - cp $dc ; 's in french/german font - jr nz, .check_intermediate_chars - ld a, "'s" - jr .replace - -.check_intermediate_chars - sub "'s" - jr c, .dont_replace - cp "'v" - "'s" + 1 - jr nc, .dont_replace - add $cd - -.replace - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret - -LireLeCourrierAnglais: -DeutenEnglischenPost: ; 1df203 -; Cette fonction convertit certains des caractères anglais pour -; leur équivalent dans le jeu de caractères français. -; Diese Funktion wandelt bestimmte englische Zeichen, um ihre -; Entsprechung in der Deutschen-Zeichensatz. - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - cp "'s" - jr nz, .check_intermediate_chars - ld a, $dc - jr .replace - -.check_intermediate_chars - sub $cd - jr c, .dont_replace - cp "'v" - "'s" + 1 - jr nc, .dont_replace - add "'s" - -.replace - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret - -HandleSpanishItalianMail: ; 1df220 -LeerCorreosIngleses: -LeggiPostaInglese: -; This function converts certain characters between -; the English and Spanish/Italian character sets. -; Esta función convierte ciertos caracteres entre -; el juego de caracteres Inglés y Español. -; Questa funzione converte alcuni caratteri tra -; l'inglese e il set di caratteri italiani. - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - and $f0 - cp $d0 - jr nz, .dont_replace - ld a, [hl] - add $8 - and $f - or $d0 - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret +INCLUDE "engine/european_mail.asm" SECTION "Battle Tower Text", ROMX diff --git a/maps/GoldenrodNameRater.asm b/maps/GoldenrodNameRater.asm index 216fba7c1..c785510ed 100644 --- a/maps/GoldenrodNameRater.asm +++ b/maps/GoldenrodNameRater.asm @@ -22,7 +22,7 @@ GoldenrodNameRaterBookshelf: GoldenrodNameRaterRadio: jumpstd radio2 -INCLUDE "text/sweethoney.asm" +INCLUDE "text/unused_sweet_honey.asm" GoldenrodNameRater_MapEventHeader: ; filler diff --git a/mobile/mobile_22.asm b/mobile/mobile_22.asm index 17b526586..08ba8cfd2 100644 --- a/mobile/mobile_22.asm +++ b/mobile/mobile_22.asm @@ -1,3 +1,5 @@ +String_89116: + db "-----@" String_8911c: ; 8911c db "でんわばんごうが ただしく" ; Phone number is not diff --git a/text/unused_gen_1_trainers.asm b/text/unused_gen_1_trainers.asm new file mode 100644 index 000000000..9a637d6a2 --- /dev/null +++ b/text/unused_gen_1_trainers.asm @@ -0,0 +1,92 @@ +GetGen1TrainerClassName: ; 50a28 +; XXX + ld hl, .Strings + ld a, [TrainerClass] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, StringBuffer1 +.copy + ld a, [hli] + ld [de], a + inc de + cp "@" + jr nz, .copy + ret + +.Strings: ; 50a42 +; Untranslated trainer class names from Red. + dw .Youngster + dw .BugCatcher + dw .Lass + dw OTClassName + dw .JrTrainerM + dw .JrTrainerF + dw .Pokemaniac + dw .SuperNerd + dw OTClassName + dw OTClassName + dw .Burglar + dw .Engineer + dw .Jack + dw OTClassName + dw .Swimmer + dw OTClassName + dw OTClassName + dw .Beauty + dw OTClassName + dw .Rocker + dw .Juggler + dw OTClassName + dw OTClassName + dw .Blackbelt + dw OTClassName + dw .ProfOak + dw .Chief + dw .Scientist + dw OTClassName + dw .Rocket + dw .CooltrainerM + dw .CooltrainerF + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + dw OTClassName + +.Youngster: db "たんパン@" +.BugCatcher: db "むしとり@" +.Lass: db "ミニスカ@" +.JrTrainerM: db "ボーイ@" +.JrTrainerF: db "ガール@" +.Pokemaniac: db "マニア@" +.SuperNerd: db "りかけい@" +.Burglar: db "どろぼう@" +.Engineer: db "ォヤジ@" +.Jack: db "ジャック@" +.Swimmer: db "かいパン@" +.Beauty: db "おねえさん@" +.Rocker: db "グループ@" +.Juggler: db "ジャグラー@" +.Blackbelt: db "からて@" +.ProfOak: db "ォーキド@" +.Chief: db "チーフ@" +.Scientist: db "けんきゅういん@" +.Rocket: db "だんいん@" +.CooltrainerM: db "エりート♂@" +.CooltrainerF: db "エりート♀@" diff --git a/text/sweethoney.asm b/text/unused_sweet_honey.asm similarity index 100% rename from text/sweethoney.asm rename to text/unused_sweet_honey.asm