INCLUDE "includes.asm" SECTION "bank1", ROMX, BANK[$1] PlaceWaitingText:: ; 4000 hlcoord 3, 10 ld b, 1 ld c, 11 ld a, [wBattleMode] and a jr z, .notinbattle call TextBox jr .proceed .notinbattle predef Predef_LinkTextbox .proceed hlcoord 4, 11 ld de, .Waiting call PlaceString ld c, 50 jp DelayFrames .Waiting ; 4025 db "Waiting...!@" LoadPushOAM:: ; 4031 ld c, hPushOAM - $ff00 ld b, PushOAMEnd - PushOAM ld hl, PushOAM .loop ld a, [hli] ld [$ff00+c], a inc c dec b jr nz, .loop ret PushOAM: ; 403f ld a, Sprites / $100 ld [rDMA], a ld a, 40 .loop dec a jr nz, .loop ret PushOAMEnd INCLUDE "engine/map_objects.asm" INCLUDE "engine/intro_menu.asm" Function6454:: ; 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 .Function6473 pop af ld [hBGMapMode], a pop af ld [hOAMUpdate], a ld hl, VramState set 6, [hl] ret .Function6473 xor a ld [hFFC6], a ld [hBGMapMode], a ld a, $90 ld [hWY], a call OverworldTextModeSwitch ld a, VBGMap1 / $100 call .Function64b9 call Function2e20 callba LoadOW_BGPal7 callba ApplyPals ld a, $1 ld [hCGBPalUpdate], a xor a ld [hBGMapMode], a ld [hWY], a callba Function64db ; no need to farcall ld a, VBGMap0 / $100 call .Function64b9 xor a ld [wBGMapAnchor], a ld a, VBGMap0 / $100 ld [wBGMapAnchor + 1], a xor a ld [hSCX], a ld [hSCY], a call Function5958 ret .Function64b9: ; 64b9 ld [hBGMapAddress + 1], a xor a ld [hBGMapAddress], a ret Function64bf:: ; 64bf ld a, [hOAMUpdate] push af ld a, $1 ld [hOAMUpdate], a call .Function64cd pop af ld [hOAMUpdate], a ret .Function64cd call LoadFontsExtra ld a, $90 ld [hWY], a call Function2e31 call LoadStandardFont ret Function64db: ; 64db ld a, [rSVBK] push af ld a, $6 ld [rSVBK], a ld a, $60 ld hl, wDecompressScratch ld bc, wBackupAttrMap - 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/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 a, -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 "", $04 + 1 db "", $18 + 1 db $1d, "%" + 1 db $35, "" + 1 db "", "" + 1 db $49, "" + 1 db "", "┘" + 1 db -1 ; end INCLUDE "engine/math.asm" ItemAttributes: ; 67c1 INCLUDE "items/item_attributes.asm" INCLUDE "engine/npc_movement.asm" GetFirstPokemonHappiness: ; 718d ld hl, PartyMon1Happiness ld bc, PARTYMON_STRUCT_LENGTH ld de, PartySpecies .loop ld a, [de] cp EGG jr nz, .done inc de add hl, bc jr .loop .done ld [wd265], a ld a, [hl] ld [ScriptVar], a call GetPokemonName jp CopyPokemonName_Buffer1_Buffer3 CheckFirstMonIsEgg: ; 71ac ld a, [PartySpecies] ld [wd265], a cp EGG ld a, $1 jr z, .egg xor a .egg ld [ScriptVar], a call GetPokemonName jp CopyPokemonName_Buffer1_Buffer3 ChangeHappiness: ; 71c2 ; Perform happiness action c on CurPartyMon ld a, [CurPartyMon] inc a ld e, a ld d, 0 ld hl, PartySpecies - 1 add hl, de ld a, [hl] cp EGG ret z push bc ld hl, PartyMon1Happiness ld bc, PARTYMON_STRUCT_LENGTH ld a, [CurPartyMon] call AddNTimes pop bc ld d, h ld e, l push de ld a, [de] cp 100 ld e, 0 jr c, .ok inc e cp 200 jr c, .ok inc e .ok dec c ld b, 0 ld hl, .Actions rept 3 add hl, bc endr ld d, 0 add hl, de ld a, [hl] cp 100 pop de ld a, [de] jr nc, .negative add [hl] jr nc, .done ld a, -1 jr .done .negative add [hl] jr c, .done xor a .done ld [de], a ld a, [wBattleMode] and a ret z ld a, [CurPartyMon] ld b, a ld a, [wPartyMenuCursor] cp b ret nz ld a, [de] ld [BattleMonHappiness], a ret .Actions db +5, +3, +2 ; Gained a level db +5, +3, +2 ; Vitamin db +1, +1, +0 ; X Item db +3, +2, +1 ; Battled a Gym Leader db +1, +1, +0 ; Learned a move db -1, -1, -1 ; Lost to an enemy db -5, -5, -10 ; Fainted due to poison db -5, -5, -10 ; Lost to a much stronger enemy db +1, +1, +1 ; Haircut (Y1) db +3, +3, +1 ; Haircut (Y2) db +5, +5, +2 ; Haircut (Y3) db +1, +1, +1 ; Haircut (O1) db +3, +3, +1 ; Haircut (O2) db +10, +10, +4 ; Haircut (O3) db -5, -5, -10 ; Used Heal Powder or Energypowder (bitter) db -10, -10, -15 ; Used Energy Root (bitter) db -15, -15, -20 ; Used Revival Herb (bitter) db +3, +3, +1 ; Grooming db +10, +6, +4 ; Gained a level in the place where it was caught StepHappiness:: ; 725a ; Raise the party's happiness by 1 point every other step cycle. ld hl, wHappinessStepCount ld a, [hl] inc a and 1 ld [hl], a ret nz ld de, PartyCount ld a, [de] and a ret z ld c, a ld hl, PartyMon1Happiness .loop inc de ld a, [de] cp EGG jr z, .next inc [hl] jr nz, .next ld [hl], $ff .next push de ld de, PARTYMON_STRUCT_LENGTH add hl, de pop de dec c jr nz, .loop ret DaycareStep:: ; 7282 ld a, [wDaycareMan] bit 0, a jr z, .daycare_lady ld a, [wBreedMon1Level] ; level cp 100 jr nc, .daycare_lady ld hl, wBreedMon1Exp + 2 ; exp inc [hl] jr nz, .daycare_lady dec hl inc [hl] jr nz, .daycare_lady dec hl inc [hl] ld a, [hl] cp 5242880 / $10000 jr c, .daycare_lady ld a, 5242880 / $10000 ld [hl], a .daycare_lady ld a, [wDaycareLady] bit 0, a jr z, .check_egg ld a, [wBreedMon2Level] ; level cp 100 jr nc, .check_egg ld hl, wBreedMon2Exp + 2 ; exp inc [hl] jr nz, .check_egg dec hl inc [hl] jr nz, .check_egg dec hl inc [hl] ld a, [hl] cp 5242880 / $10000 jr c, .check_egg ld a, 5242880 / $10000 ld [hl], a .check_egg ld hl, wDaycareMan bit 5, [hl] ; egg ret z ld hl, wStepsToEgg dec [hl] ret nz call Random ld [hl], a callab CheckBreedmonCompatibility ld a, [wd265] cp 230 ld b, -1 + 32 percent jr nc, .okay ld a, [wd265] cp 170 ld b, 16 percent jr nc, .okay ld a, [wd265] cp 110 ld b, 12 percent jr nc, .okay ld b, 4 percent .okay call Random cp b ret nc ld hl, wDaycareMan res 5, [hl] set 6, [hl] ret SpecialGiveShuckle: ; 7305 ; Adding to the party. xor a ld [MonType], a ; Level 15 Shuckle. ld a, SHUCKLE ld [CurPartySpecies], a ld a, 15 ld [CurPartyLevel], a predef TryAddMonToParty jr nc, .NotGiven ; Caught data. ld b, 0 callba SetGiftPartyMonCaughtData ; Holding a Berry. ld bc, PARTYMON_STRUCT_LENGTH ld a, [PartyCount] dec a push af push bc ld hl, PartyMon1Item call AddNTimes ld [hl], BERRY pop bc pop af ; OT ID. ld hl, PartyMon1ID call AddNTimes ld a, $2 ld [hli], a ld [hl], $6 ; Nickname. ld a, [PartyCount] dec a ld hl, PartyMonNicknames call SkipNames ld de, SpecialShuckleNick call CopyName2 ; OT. ld a, [PartyCount] dec a ld hl, PartyMonOT call SkipNames ld de, SpecialShuckleOT call CopyName2 ; Engine flag for this event. ld hl, DailyFlags set 5, [hl] ; setflag ENGINE_SHUCKLE_GIVEN ld a, 1 ld [ScriptVar], a ret .NotGiven xor a ld [ScriptVar], a ret SpecialShuckleOT: db "MANIA@" SpecialShuckleNick: db "SHUCKIE@" SpecialReturnShuckle: ; 737e callba SelectMonFromParty jr c, .refused ld a, [CurPartySpecies] cp SHUCKLE jr nz, .DontReturn ld a, [CurPartyMon] ld hl, PartyMon1ID ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ; OT ID ld a, [hli] cp 00518 / $100 jr nz, .DontReturn ld a, [hl] cp 00518 % $100 jr nz, .DontReturn ; OT ld a, [CurPartyMon] ld hl, PartyMonOT call SkipNames ld de, SpecialShuckleOT .CheckOT ld a, [de] cp [hl] jr nz, .DontReturn cp "@" jr z, .done inc de inc hl jr .CheckOT .done callba CheckCurPartyMonFainted jr c, .fainted ld a, [CurPartyMon] ld hl, PartyMon1Happiness ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld a, [hl] cp 150 ld a, $3 jr nc, .HappyToStayWithYou xor a ; take from pc ld [wPokemonWithdrawDepositParameter], a callab RemoveMonFromPartyOrBox ld a, $2 .HappyToStayWithYou ld [ScriptVar], a ret .refused ld a, $1 ld [ScriptVar], a ret .DontReturn xor a ld [ScriptVar], a ret .fainted ld a, $4 ld [ScriptVar], a ret Special_BillsGrandfather: ; 73f7 callba SelectMonFromParty jr c, .cancel ld a, [CurPartySpecies] ld [ScriptVar], a ld [wNamedObjectIndexBuffer], a call GetPokemonName jp CopyPokemonName_Buffer1_Buffer3 .cancel xor a ld [ScriptVar], a ret Special_YoungerHaircutBrother: ; 7413 ld hl, Data_YoungerHaircutBrother jr MassageOrHaircut Special_OlderHaircutBrother: ; 7418 ld hl, Data_OlderHaircutBrother jr MassageOrHaircut Special_DaisyMassage: ; 741d ld hl, Data_DaisyMassage MassageOrHaircut: ; 7420 push hl callba SelectMonFromParty pop hl jr c, .nope ld a, [CurPartySpecies] cp EGG jr z, .egg push hl call GetCurNick call CopyPokemonName_Buffer1_Buffer3 pop hl call Random ; Bug: Subtracting $ff from $ff fails to set c. ; This can result in overflow into the next data array. ; In the case of getting a massage from Daisy, we bleed ; into CopyPokemonName_Buffer1_Buffer3, which passes ; $d0 to ChangeHappiness and returns $73 to the script. ; The end result is that there is a 0.4% chance your ; Pokemon's happiness will not change at all. .loop sub [hl] jr c, .ok rept 3 inc hl endr jr .loop .ok inc hl ld a, [hli] ld [ScriptVar], a ld c, [hl] call ChangeHappiness ret .nope xor a ld [ScriptVar], a ret .egg ld a, 1 ld [ScriptVar], a ret Data_YoungerHaircutBrother: ; 7459 db $4c, 2, HAPPINESS_YOUNGCUT1 ; 30% chance db $80, 3, HAPPINESS_YOUNGCUT2 ; 20% chance db $ff, 4, HAPPINESS_YOUNGCUT3 ; 50% chance Data_OlderHaircutBrother: ; 7462 db $9a, 2, HAPPINESS_OLDERCUT1 ; 60% chance db $4c, 3, HAPPINESS_OLDERCUT2 ; 10% chance db $ff, 4, HAPPINESS_OLDERCUT3 ; 30% chance Data_DaisyMassage: ; 746b db $ff, 2, HAPPINESS_MASSAGE ; 99.6% chance CopyPokemonName_Buffer1_Buffer3: ; 746e ld hl, StringBuffer1 ld de, StringBuffer3 ld bc, PKMN_NAME_LENGTH jp CopyBytes Predef1: ; 747a ; not used ret SECTION "bank2", ROMX, BANK[$2] BlankScreen: ; 8000 call DisableSpriteUpdates xor a ld [hBGMapMode], a call ClearBGPalettes call ClearSprites hlcoord 0, 0 ld bc, TileMapEnd - TileMap ld a, " " call ByteFill hlcoord 0, 0, AttrMap ld bc, AttrMapEnd - AttrMap ld a, $7 call ByteFill call WaitBGMap2 call SetPalettes ret SpawnPlayer: ; 8029 ld a, -1 ld [wObjectFollow_Leader], a ld [wObjectFollow_Follower], a ld a, $0 ld hl, PlayerObjectTemplate call CopyPlayerObjectTemplate ld b, $0 call PlayerSpawn_ConvertCoords ld a, $0 call GetMapObject ld hl, MAPOBJECT_COLOR add hl, bc ln e, (1 << 3) | PAL_OW_RED, PERSONTYPE_SCRIPT ld a, [wPlayerSpriteSetupFlags] bit 2, a jr nz, .ok ld a, [PlayerGender] bit 0, a jr z, .ok ln e, (1 << 3) | PAL_OW_BLUE, PERSONTYPE_SCRIPT .ok ld [hl], e ld a, $0 ld [hMapObjectIndexBuffer], a ld bc, MapObjects ld a, $0 ld [hObjectStructIndexBuffer], a ld de, ObjectStructs call CopyMapObjectToObjectStruct ld a, PLAYER ld [wCenteredObject], a ret PlayerObjectTemplate: ; 8071 ; A dummy map object used to initialize the player object. ; Shorter than the actual amount copied by two bytes. ; Said bytes seem to be unused. person_event SPRITE_CHRIS, -4, -4, SPRITEMOVEDATA_PLAYER, 15, 15, -1, -1, 0, PERSONTYPE_SCRIPT, 0, 0, -1 CopyDECoordsToMapObject:: ; 807e push de ld a, b call GetMapObject pop de ld hl, MAPOBJECT_X_COORD add hl, bc ld [hl], d ld hl, MAPOBJECT_Y_COORD add hl, bc ld [hl], e ret PlayerSpawn_ConvertCoords: ; 808f push bc ld a, [XCoord] add 4 ld d, a ld a, [YCoord] add 4 ld e, a pop bc call CopyDECoordsToMapObject ret WritePersonXY:: ; 80a1 ld a, b call CheckObjectVisibility ret c ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] ld a, [hMapObjectIndexBuffer] ld b, a call CopyDECoordsToMapObject and a ret RefreshPlayerCoords: ; 80b8 ld a, [XCoord] add 4 ld d, a ld hl, PlayerStandingMapX sub [hl] ld [hl], d ld hl, MapObjects + MAPOBJECT_X_COORD ld [hl], d ld hl, PlayerLastMapX ld [hl], d ld d, a ld a, [YCoord] add 4 ld e, a ld hl, PlayerStandingMapY sub [hl] ld [hl], e ld hl, MapObjects + MAPOBJECT_Y_COORD ld [hl], e ld hl, PlayerLastMapY ld [hl], e ld e, a ld a, [wObjectFollow_Leader] cp $0 ret nz ; wtf ret CopyObjectStruct:: ; 80e7 call CheckObjectMask and a ret nz ; masked ld hl, ObjectStructs + OBJECT_STRUCT_LENGTH * 1 ld a, 1 ld de, OBJECT_STRUCT_LENGTH .loop ld [hObjectStructIndexBuffer], a ld a, [hl] and a jr z, .done add hl, de ld a, [hObjectStructIndexBuffer] inc a cp NUM_OBJECT_STRUCTS jr nz, .loop scf ret ; overflow .done ld d, h ld e, l call CopyMapObjectToObjectStruct ld hl, VramState bit 7, [hl] ret z ld hl, OBJECT_FLAGS2 add hl, de set 5, [hl] ret CopyMapObjectToObjectStruct: ; 8116 call .CopyMapObjectToTempObject call CopyTempObjectToObjectStruct ret .CopyMapObjectToTempObject: ; 811d ld a, [hObjectStructIndexBuffer] ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld [hl], a ld a, [hMapObjectIndexBuffer] ld [wTempObjectCopyMapObjectIndex], a ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] ld [wTempObjectCopySprite], a call GetSpriteVTile ld [wTempObjectCopySpriteVTile], a ld a, [hl] call GetSpritePalette ld [wTempObjectCopyPalette], a ld hl, MAPOBJECT_COLOR add hl, bc ld a, [hl] and $f0 jr z, .skip_color_override swap a and $7 ; OAM_PALETTE ld [wTempObjectCopyPalette], a .skip_color_override ld hl, MAPOBJECT_MOVEMENT add hl, bc ld a, [hl] ld [wTempObjectCopyMovement], a ld hl, MAPOBJECT_RANGE add hl, bc ld a, [hl] ld [wTempObjectCopyRange], a ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] ld [wTempObjectCopyX], a ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] ld [wTempObjectCopyY], a ld hl, MAPOBJECT_RADIUS add hl, bc ld a, [hl] ld [wTempObjectCopyRadius], a ret InitializeVisibleSprites: ; 8177 ld bc, MapObjects + OBJECT_LENGTH ld a, 1 .loop ld [hMapObjectIndexBuffer], a ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a jr z, .next ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] cp -1 jr nz, .next ld a, [XCoord] ld d, a ld a, [YCoord] ld e, a ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] add 1 sub d jr c, .next cp MAPOBJECT_SCREEN_WIDTH jr nc, .next ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] add 1 sub e jr c, .next cp MAPOBJECT_SCREEN_HEIGHT jr nc, .next push bc call CopyObjectStruct pop bc jp c, .ret .next ld hl, OBJECT_LENGTH add hl, bc ld b, h ld c, l ld a, [hMapObjectIndexBuffer] inc a cp NUM_OBJECTS jr nz, .loop ret .ret: ; 81c9 ret CheckObjectEnteringVisibleRange:: ; 81ca nop ld a, [wPlayerStepDirection] cp STANDING ret z ld hl, .dw rst JumpTable ret .dw: ; 81d6 dw .Down dw .Up dw .Left dw .Right .Up: ; 81de ld a, [YCoord] sub 1 jr .Vertical .Down: ; 81e5 ld a, [YCoord] add 9 .Vertical: ; 81ea ld d, a ld a, [XCoord] ld e, a ld bc, MapObjects + OBJECT_LENGTH ld a, 1 .loop_v ld [hMapObjectIndexBuffer], a ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a jr z, .next_v ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, d cp [hl] jr nz, .next_v ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] cp -1 jr nz, .next_v ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] add 1 sub e jr c, .next_v cp MAPOBJECT_SCREEN_WIDTH jr nc, .next_v push de push bc call CopyObjectStruct pop bc pop de .next_v ld hl, OBJECT_LENGTH add hl, bc ld b, h ld c, l ld a, [hMapObjectIndexBuffer] inc a cp NUM_OBJECTS jr nz, .loop_v ret .Left: ; 8232 ld a, [XCoord] sub 1 jr .Horizontal .Right: ; 8239 ld a, [XCoord] add 10 .Horizontal: ; 823e ld e, a ld a, [YCoord] ld d, a ld bc, MapObjects + OBJECT_LENGTH ld a, 1 .loop_h ld [hMapObjectIndexBuffer], a ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a jr z, .next_h ld hl, MAPOBJECT_X_COORD add hl, bc ld a, e cp [hl] jr nz, .next_h ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] cp -1 jr nz, .next_h ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] add 1 sub d jr c, .next_h cp MAPOBJECT_SCREEN_HEIGHT jr nc, .next_h push de push bc call CopyObjectStruct pop bc pop de .next_h ld hl, OBJECT_LENGTH add hl, bc ld b, h ld c, l ld a, [hMapObjectIndexBuffer] inc a cp NUM_OBJECTS jr nz, .loop_h ret CopyTempObjectToObjectStruct: ; 8286 ld a, [wTempObjectCopyMapObjectIndex] ld hl, OBJECT_MAP_OBJECT_INDEX add hl, de ld [hl], a ld a, [wTempObjectCopyMovement] call CopySpriteMovementData ld a, [wTempObjectCopyPalette] ld hl, OBJECT_PALETTE add hl, de or [hl] ld [hl], a ld a, [wTempObjectCopyY] call .InitYCoord ld a, [wTempObjectCopyX] call .InitXCoord ld a, [wTempObjectCopySprite] ld hl, OBJECT_SPRITE add hl, de ld [hl], a ld a, [wTempObjectCopySpriteVTile] ld hl, OBJECT_SPRITE_TILE add hl, de ld [hl], a ld hl, OBJECT_STEP_TYPE add hl, de ld [hl], STEP_TYPE_00 ld hl, OBJECT_FACING_STEP add hl, de ld [hl], STANDING ld a, [wTempObjectCopyRadius] call .InitRadius ld a, [wTempObjectCopyRange] ld hl, OBJECT_RANGE add hl, de ld [hl], a and a ret .InitYCoord: ; 82d5 ld hl, OBJECT_INIT_Y add hl, de ld [hl], a ld hl, OBJECT_NEXT_MAP_Y add hl, de ld [hl], a ld hl, YCoord sub [hl] and $f swap a ld hl, wFollowNotExactPersonY sub [hl] ld hl, OBJECT_SPRITE_Y add hl, de ld [hl], a ret .InitXCoord: ; 82f1 ld hl, OBJECT_INIT_X add hl, de ld [hl], a ld hl, OBJECT_NEXT_MAP_X add hl, de ld [hl], a ld hl, XCoord sub [hl] and $f swap a ld hl, wFollowNotExactPersonX sub [hl] ld hl, OBJECT_SPRITE_X add hl, de ld [hl], a ret .InitRadius: ; 830d ld h, a inc a and $f ld l, a ld a, h add $10 and $f0 or l ld hl, OBJECT_RADIUS add hl, de ld [hl], a ret TrainerWalkToPlayer: ; 831e ld a, [hLastTalked] call InitMovementBuffer ld a, movement_step_sleep_1 call AppendToMovementBuffer ld a, [wd03f] dec a jr z, .TerminateStep ld a, [hLastTalked] ld b, a ld c, PLAYER ld d, 1 call .GetPathToPlayer call DecrementMovementBufferCount .TerminateStep ld a, movement_step_end call AppendToMovementBuffer ret .GetPathToPlayer: ; 8341 push de push bc ; get player object struct, load to de ld a, c call GetMapObject ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] call GetObjectStruct ld d, b ld e, c ; get last talked object struct, load to bc pop bc ld a, b call GetMapObject ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] call GetObjectStruct ; get last talked coords, load to bc ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a ; get player coords, load to de ld hl, OBJECT_NEXT_MAP_X add hl, de ld a, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, de ld e, [hl] ld d, a pop af call ComputePathToWalkToPlayer ret Special_SurfStartStep: ; 8379 call InitMovementBuffer call .GetMovementData call AppendToMovementBuffer ld a, movement_step_end call AppendToMovementBuffer ret .GetMovementData: ; 8388 ld a, [PlayerDirection] srl a srl a and 3 ld e, a ld d, 0 ld hl, .movement_data add hl, de ld a, [hl] ret .movement_data slow_step_down slow_step_up slow_step_left slow_step_right FollowNotExact:: ; 839e push bc ld a, c call CheckObjectVisibility ld d, b ld e, c pop bc ret c ld a, b call CheckObjectVisibility ret c ; Person 2 is now in bc, person 1 is now in de ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a ld hl, OBJECT_NEXT_MAP_X add hl, de ld a, [hl] cp b jr z, .same_x jr c, .to_the_left inc b jr .continue .to_the_left dec b jr .continue .same_x ld hl, OBJECT_NEXT_MAP_Y add hl, de ld a, [hl] cp c jr z, .continue jr c, .below inc c jr .continue .below dec c .continue ld hl, OBJECT_NEXT_MAP_X add hl, de ld [hl], b ld a, b ld hl, XCoord sub [hl] and $f swap a ld hl, wFollowNotExactPersonX sub [hl] ld hl, OBJECT_SPRITE_X add hl, de ld [hl], a ld hl, OBJECT_NEXT_MAP_Y add hl, de ld [hl], c ld a, c ld hl, YCoord sub [hl] and $f swap a ld hl, wFollowNotExactPersonY sub [hl] ld hl, OBJECT_SPRITE_Y add hl, de ld [hl], a ld a, [hObjectStructIndexBuffer] ld hl, OBJECT_RANGE add hl, de ld [hl], a ld hl, OBJECT_MOVEMENTTYPE add hl, de ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT ld hl, OBJECT_STEP_TYPE add hl, de ld [hl], STEP_TYPE_00 ret GetRelativeFacing:: ; 8417 ; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason. ld a, d call GetMapObject ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] cp NUM_OBJECT_STRUCTS jr nc, .carry ld d, a ld a, e call GetMapObject ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] cp NUM_OBJECT_STRUCTS jr nc, .carry ld e, a call .GetFacing_e_relativeto_d ret .carry scf ret .GetFacing_e_relativeto_d: ; 8439 ; Determines which way object e would have to turn to face object d. Returns carry if it's impossible. ; load the coordinates of object d into bc ld a, d call GetObjectStruct ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a push bc ; load the coordinates of object e into de ld a, e call GetObjectStruct ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] pop bc ; |x1 - x2| ld a, b sub d jr z, .same_x_1 jr nc, .b_right_of_d_1 cpl inc a .b_right_of_d_1 ; |y1 - y2| ld h, a ld a, c sub e jr z, .same_y_1 jr nc, .c_below_e_1 cpl inc a .c_below_e_1 ; |y1 - y2| - |x1 - x2| sub h jr c, .same_y_1 .same_x_1 ; compare the y coordinates ld a, c cp e jr z, .same_x_and_y jr c, .c_directly_below_e ; c directly above e ld d, DOWN and a ret .c_directly_below_e ld d, UP and a ret .same_y_1 ld a, b cp d jr z, .same_x_and_y jr c, .b_directly_right_of_d ; b directly left of d ld d, RIGHT and a ret .b_directly_right_of_d ld d, LEFT and a ret .same_x_and_y scf ret QueueFollowerFirstStep: ; 848a call .QueueFirstStep jr c, .same ld [wFollowMovementQueue], a xor a ld [wFollowerMovementQueueLength], a ret .same ld a, -1 ld [wFollowerMovementQueueLength], a ret .QueueFirstStep ld a, [wObjectFollow_Leader] call GetObjectStruct ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] ld a, [wObjectFollow_Follower] call GetObjectStruct ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, d cp [hl] jr z, .check_y jr c, .left and a ld a, movement_step_right ret .left and a ld a, movement_step_left ret .check_y ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, e cp [hl] jr z, .same_xy jr c, .up and a ld a, movement_step_down ret .up and a ld a, movement_step_up ret .same_xy scf ret _Sine:: ; 84d9 ; A simple sine function. ; Return d * sin(e) in hl. ; e is a signed 6-bit value. ld a, e and %111111 cp %100000 jr nc, .negative call .ApplySineWave ld a, h ret .negative and %011111 call .ApplySineWave ld a, h xor -1 inc a ret .ApplySineWave: ; 84ef ld e, a ld a, d ld d, 0 ld hl, .sinewave add hl, de add hl, de ld e, [hl] inc hl ld d, [hl] ld hl, 0 ; Factor amplitude .multiply srl a jr nc, .even add hl, de .even sla e rl d and a jr nz, .multiply ret .sinewave: ; 850b ; A $20-word table representing a sine wave. ; 90 degrees is index $10 at a base amplitude of $100. sine_wave $100 INCLUDE "engine/predef.asm" INCLUDE "engine/color.asm" SECTION "bank3", ROMX, BANK[$3] 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, 1 << MORN db DAY, 1 << DAY db NITE, 1 << NITE db NITE, 1 << NITE db -1 INCLUDE "engine/specials.asm" _PrintNum:: ; c4c7 ; Print c digits of the b-byte value from de to hl. ; Allows 2 to 7 digits. For 1-digit numbers, add ; the value to char "0" instead of calling PrintNum. ; Some extra flags can be given in bits 5-7 of b. ; Bit 5: money if set (unless left-aligned without leading zeros) ; Bit 6: right-aligned if set ; Bit 7: print leading zeros if set push bc bit 5, b jr z, .main bit 7, b jr nz, .moneyflag bit 6, b jr z, .main .moneyflag ; 101xxxxx or 011xxxxx ld a, "¥" ld [hli], a res 5, b ; 100xxxxx or 010xxxxx .main xor a ld [hPrintNum1], a ld [hPrintNum2], a ld [hPrintNum3], a ld a, b and $f cp 1 jr z, .byte cp 2 jr z, .word ; maximum 3 bytes .long ld a, [de] ld [hPrintNum2], a inc de ld a, [de] ld [hPrintNum3], a inc de ld a, [de] ld [hPrintNum4], a jr .start .word ld a, [de] ld [hPrintNum3], a inc de ld a, [de] ld [hPrintNum4], a jr .start .byte ld a, [de] ld [hPrintNum4], a .start push de ld d, b ld a, c swap a and $f ld e, a ld a, c and $f ld b, a ld c, 0 cp 2 jr z, .two cp 3 jr z, .three cp 4 jr z, .four cp 5 jr z, .five cp 6 jr z, .six .seven ld a, 1000000 / $10000 % $100 ld [hPrintNum5], a ld a, 1000000 / $100 % $100 ld [hPrintNum6], a ld a, 1000000 % $100 ld [hPrintNum7], a call .PrintDigit call .AdvancePointer .six ld a, 100000 / $10000 % $100 ld [hPrintNum5], a ld a, 100000 / $100 % $100 ld [hPrintNum6], a ld a, 100000 % $100 ld [hPrintNum7], a call .PrintDigit call .AdvancePointer .five xor a ld [hPrintNum5], a ld a, 10000 / $100 ld [hPrintNum6], a ld a, 10000 % $100 ld [hPrintNum7], a call .PrintDigit call .AdvancePointer .four xor a ld [hPrintNum5], a ld a, 1000 / $100 ld [hPrintNum6], a ld a, 1000 % $100 ld [hPrintNum7], a call .PrintDigit call .AdvancePointer .three xor a ld [hPrintNum5], a xor a ld [hPrintNum6], a ld a, 100 ld [hPrintNum7], a call .PrintDigit call .AdvancePointer .two dec e jr nz, .two_skip ld a, "0" ld [hPrintNum1], a .two_skip ld c, 0 ld a, [hPrintNum4] .mod_10 cp 10 jr c, .modded_10 sub 10 inc c jr .mod_10 .modded_10 ld b, a ld a, [hPrintNum1] or c jr nz, .money call .PrintLeadingZero jr .money_leading_zero .money call .PrintYen push af ld a, "0" add c ld [hl], a pop af ld [hPrintNum1], a inc e dec e jr nz, .money_leading_zero inc hl ld [hl], $f2 ; XXX .money_leading_zero call .AdvancePointer call .PrintYen ld a, "0" add b ld [hli], a pop de pop bc ret .PrintYen: ; c5ba push af ld a, [hPrintNum1] and a jr nz, .stop bit 5, d jr z, .stop ld a, "¥" ld [hli], a res 5, d .stop pop af ret .PrintDigit: ; c5cb (3:45cb) dec e jr nz, .ok ld a, "0" ld [hPrintNum1], a .ok ld c, 0 .loop ld a, [hPrintNum5] ld b, a ld a, [hPrintNum2] ld [hPrintNum8], a cp b jr c, .skip1 sub b ld [hPrintNum2], a ld a, [hPrintNum6] ld b, a ld a, [hPrintNum3] ld [hPrintNum9], a cp b jr nc, .skip2 ld a, [hPrintNum2] or 0 jr z, .skip3 dec a ld [hPrintNum2], a ld a, [hPrintNum3] .skip2 sub b ld [hPrintNum3], a ld a, [hPrintNum7] ld b, a ld a, [hPrintNum4] ld [hPrintNum10], a cp b jr nc, .skip4 ld a, [hPrintNum3] and a jr nz, .skip5 ld a, [hPrintNum2] and a jr z, .skip6 dec a ld [hPrintNum2], a xor a .skip5 dec a ld [hPrintNum3], a ld a, [hPrintNum4] .skip4 sub b ld [hPrintNum4], a inc c jr .loop .skip6 ld a, [hPrintNum9] ld [hPrintNum3], a .skip3 ld a, [hPrintNum8] ld [hPrintNum2], a .skip1 ld a, [hPrintNum1] or c jr z, .PrintLeadingZero ld a, [hPrintNum1] and a jr nz, .done bit 5, d jr z, .done ld a, "¥" ld [hli], a res 5, d .done ld a, "0" add c ld [hl], a ld [hPrintNum1], a inc e dec e ret nz inc hl ld [hl], "·" ret .PrintLeadingZero: ; c644 ; prints a leading zero unless they are turned off in the flags bit 7, d ; print leading zeroes? ret z ld [hl], "0" ret .AdvancePointer: ; c64a ; increments the pointer unless leading zeroes are not being printed, ; the number is left-aligned, and no nonzero digits have been printed yet bit 7, d ; print leading zeroes? jr nz, .inc bit 6, d ; left alignment or right alignment? jr z, .inc ld a, [hPrintNum1] and a ret z .inc inc hl ret HealParty: ; c658 xor a ld [CurPartyMon], a ld hl, PartySpecies .loop ld a, [hli] cp -1 jr z, .done cp EGG jr z, .next push hl call HealPartyMon pop hl .next ld a, [CurPartyMon] inc a ld [CurPartyMon], a jr .loop .done ret HealPartyMon: ; c677 ld a, MON_SPECIES call GetPartyParamLocation ld d, h ld e, l ld hl, MON_STATUS add hl, de xor a ld [hli], a ld [hl], a ld hl, MON_MAXHP add hl, de ; bc = MON_HP ld b, h ld c, l dec bc dec bc ld a, [hli] ld [bc], a inc bc ld a, [hl] ld [bc], a callba RestoreAllPP ret ComputeHPBarPixels: ; c699 ; bc * (6 * 8) / de ld a, b or c jr z, .zero push hl xor a ld [hMultiplicand + 0], a ld a, b ld [hMultiplicand + 1], a ld a, c ld [hMultiplicand + 2], a ld a, 6 * 8 ld [hMultiplier], a call Multiply ; We need de to be under 256 because hDivisor is only 1 byte. ld a, d and a jr z, .divide ; divide de and hProduct by 4 srl d rr e srl d rr e ld a, [hProduct + 2] ld b, a ld a, [hProduct + 3] srl b rr a srl b rr a ld [hDividend + 3], a ld a, b ld [hDividend + 2], a .divide ld a, e ld [hDivisor], a ld b, 4 call Divide ld a, [hQuotient + 2] ld e, a pop hl and a ret nz ld e, 1 ret .zero ld e, 0 ret AnimateHPBar: ; c6e0 call WaitBGMap call _AnimateHPBar call WaitBGMap ret ClearBuffer1: ; c6ea xor a ld hl, Buffer1 ld bc, 7 call ByteFill ret FieldMoveJumptable: ; c6f5 ld a, [Buffer1] rst JumpTable ld [Buffer1], a bit 7, a jr nz, .okay and a ret .okay and $7f scf ret GetPartyNick: ; c706 ; write CurPartyMon nickname to StringBuffer1-3 ld hl, PartyMonNicknames ld a, BOXMON ld [MonType], a ld a, [CurPartyMon] call GetNick call CopyName1 ; copy text from StringBuffer2 to StringBuffer3 ld de, StringBuffer2 ld hl, StringBuffer3 call CopyName2 ret CheckEngineFlag: ; c721 ; Check engine flag de ; Return carry if flag is not set ld b, CHECK_FLAG callba EngineFlagAction ld a, c and a jr nz, .isset scf ret .isset xor a ret CheckBadge: ; c731 ; Check engine flag a (ENGINE_ZEPHYRBADGE thru ENGINE_EARTHBADGE) ; Display "Badge required" text and return carry if the badge is not owned call CheckEngineFlag ret nc ld hl, .BadgeRequiredText call MenuTextBoxBackup ; push text to queue scf ret .BadgeRequiredText: ; c73d ; Sorry! A new BADGE ; is required. text_jump _BadgeRequiredText db "@" CheckPartyMove: ; c742 ; Check if a monster in your party has move d. ld e, 0 xor a ld [CurPartyMon], a .loop ld c, e ld b, 0 ld hl, PartySpecies add hl, bc ld a, [hl] and a jr z, .no cp a, -1 jr z, .no cp a, EGG jr z, .next ld bc, PARTYMON_STRUCT_LENGTH ld hl, PartyMon1Moves ld a, e call AddNTimes ld b, NUM_MOVES .check ld a, [hli] cp d jr z, .yes dec b jr nz, .check .next inc e jr .loop .yes ld a, e ld [CurPartyMon], a ; which mon has the move xor a ret .no scf ret FieldMoveFailed: ; c779 ld hl, .CantUseHere call MenuTextBoxBackup ret .CantUseHere: ; 0xc780 ; Can't use that here. text_jump UnknownText_0x1c05c8 db "@" CutFunction: ; c785 call ClearBuffer1 .loop ld hl, .Jumptable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .Jumptable: ; c796 (3:4796) dw .CheckAble dw .DoCut dw .FailCut .CheckAble: ; c79c (3:479c) ld de, ENGINE_HIVEBADGE call CheckBadge jr c, .nohivebadge call CheckMapForSomethingToCut jr c, .nothingtocut ld a, $1 ret .nohivebadge ld a, $80 ret .nothingtocut ld a, $2 ret .DoCut: ; c7b2 (3:47b2) ld hl, Script_CutFromMenu call QueueScript ld a, $81 ret .FailCut: ; c7bb (3:47bb) ld hl, Text_NothingToCut call MenuTextBoxBackup ld a, $80 ret Text_UsedCut: ; 0xc7c4 ; used CUT! text_jump UnknownText_0x1c05dd db "@" Text_NothingToCut: ; 0xc7c9 ; There's nothing to CUT here. text_jump UnknownText_0x1c05ec db "@" CheckMapForSomethingToCut: ; c7ce ; Does the collision data of the facing tile permit cutting? call GetFacingTileCoord ld c, a push de callba CheckCutCollision pop de jr nc, .fail ; Get the location of the current block in OverworldMap. call GetBlockLocation ld c, [hl] ; See if that block contains something that can be cut. push hl ld hl, CutTreeBlockPointers call CheckOverworldTileArrays pop hl jr nc, .fail ; Back up the OverworldMap address to Buffer3 ld a, l ld [Buffer3], a ld a, h ld [Buffer4], a ; Back up the replacement tile to Buffer5 ld a, b ld [Buffer5], a ; Back up the animation index to Buffer6 ld a, c ld [Buffer6], a xor a ret .fail scf ret Script_CutFromMenu: ; c7fe reloadmappart special UpdateTimePals Script_Cut: ; 0xc802 callasm GetPartyNick writetext Text_UsedCut reloadmappart callasm CutDownTreeOrGrass closetext end CutDownTreeOrGrass: ; c810 ld hl, Buffer3 ; OverworldMapTile ld a, [hli] ld h, [hl] ld l, a ld a, [Buffer5] ; ReplacementTile ld [hl], a xor a ld [hBGMapMode], a call OverworldTextModeSwitch call UpdateSprites call DelayFrame ld a, [Buffer6] ; Animation type ld e, a callba OWCutAnimation call BufferScreen call GetMovementPermissions call UpdateSprites call DelayFrame call LoadStandardFont ret CheckOverworldTileArrays: ; c840 ; Input: c contains the tile you're facing ; Output: Replacement tile in b and effect on wild encounters in c, plus carry set. ; Carry is not set if the facing tile cannot be replaced, or if the tileset ; does not contain a tile you can replace. ; Dictionary lookup for pointer to tile replacement table push bc ld a, [wTileset] ld de, 3 call IsInArray pop bc jr nc, .nope ; Load the pointer inc hl ld a, [hli] ld h, [hl] ld l, a ; Look up the tile you're facing ld de, 3 ld a, c call IsInArray jr nc, .nope ; Load the replacement to b inc hl ld b, [hl] ; Load the animation type parameter to c inc hl ld c, [hl] scf ret .nope xor a ret CutTreeBlockPointers: ; c862 ; Which tileset are we in? dbw TILESET_JOHTO_1, .johto1 dbw TILESET_JOHTO_2, .johto2 dbw TILESET_KANTO, .kanto dbw TILESET_PARK, .park dbw TILESET_ILEX_FOREST, .ilex db -1 .johto1: ; Johto OW ; Which meta tile are we facing, which should we replace it with, and which animation? db $03, $02, $01 ; grass db $5b, $3c, $00 ; tree db $5f, $3d, $00 ; tree db $63, $3f, $00 ; tree db $67, $3e, $00 ; tree db -1 .johto2: ; Goldenrod area db $03, $02, $01 ; grass db -1 .kanto: ; Kanto OW db $0b, $0a, $01 ; grass db $32, $6d, $00 ; tree db $33, $6c, $00 ; tree db $34, $6f, $00 ; tree db $35, $4c, $00 ; tree db $60, $6e, $00 ; tree db -1 .park: ; National Park db $13, $03, $01 ; grass db $03, $04, $01 ; grass db -1 .ilex: ; Ilex Forest db $0f, $17, $00 db -1 WhirlpoolBlockPointers: ; c8a4 dbw TILESET_JOHTO_1, .johto db -1 .johto: ; c8a8 db $07, $36, $00 db -1 OWFlash: ; c8ac call .CheckUseFlash and $7f ld [wFieldMoveSucceeded], a ret .CheckUseFlash: ; c8b5 ; Flash ld de, ENGINE_ZEPHYRBADGE callba CheckBadge jr c, .nozephyrbadge push hl callba SpecialAerodactylChamber pop hl jr c, .useflash ld a, [wTimeOfDayPalset] cp %11111111 ; 3, 3, 3, 3 jr nz, .notadarkcave .useflash call UseFlash ld a, $81 ret .notadarkcave call FieldMoveFailed ld a, $80 ret .nozephyrbadge ld a, $80 ret UseFlash: ; c8e0 ld hl, Script_UseFlash jp QueueScript Script_UseFlash: ; 0xc8e6 reloadmappart special UpdateTimePals writetext UnknownText_0xc8f3 callasm BlindingFlash closetext end UnknownText_0xc8f3: ; 0xc8f3 text_jump UnknownText_0x1c0609 start_asm call WaitSFX ld de, SFX_FLASH call PlaySFX call WaitSFX ld hl, .BlankText ret .BlankText: ; 0xc908 db "@" SurfFunction: ; c909 call ClearBuffer1 .loop ld hl, .Jumptable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .Jumptable: ; c91a (3:491a) dw .TrySurf dw .DoSurf dw .FailSurf dw .AlreadySurfing .TrySurf: ; c922 (3:4922) ld de, ENGINE_FOGBADGE call CheckBadge jr c, .asm_c956 ld hl, BikeFlags bit 1, [hl] ; always on bike jr nz, .cannotsurf ld a, [PlayerState] cp PLAYER_SURF jr z, .alreadyfail cp PLAYER_SURF_PIKA jr z, .alreadyfail call GetFacingTileCoord call GetTileCollision cp $1 jr nz, .cannotsurf call CheckDirection jr c, .cannotsurf callba CheckFacingObject jr c, .cannotsurf ld a, $1 ret .asm_c956 ld a, $80 ret .alreadyfail ld a, $3 ret .cannotsurf ld a, $2 ret .DoSurf: ; c95f (3:495f) call GetSurfType ld [Buffer2], a ; wd1eb (aliases: MovementType) call GetPartyNick ld hl, SurfFromMenuScript call QueueScript ld a, $81 ret .FailSurf: ; c971 (3:4971) ld hl, CantSurfText call MenuTextBoxBackup ld a, $80 ret .AlreadySurfing: ; c97a (3:497a) ld hl, AlreadySurfingText call MenuTextBoxBackup ld a, $80 ret SurfFromMenuScript: ; c983 special UpdateTimePals UsedSurfScript: ; c986 writetext UsedSurfText ; "used SURF!" waitbutton closetext callasm .empty_fn ; empty function copybytetovar Buffer2 writevarcode VAR_MOVEMENT special ReplaceKrisSprite special PlayMapMusic ; step into the water special Special_SurfStartStep ; (slow_step_x, step_end) applymovement PLAYER, MovementBuffer ; PLAYER, MovementBuffer end .empty_fn: ; c9a2 callba MobileFn_1060bb ; empty ret UsedSurfText: ; c9a9 text_jump _UsedSurfText db "@" CantSurfText: ; c9ae text_jump _CantSurfText db "@" AlreadySurfingText: ; c9b3 text_jump _AlreadySurfingText db "@" GetSurfType: ; c9b8 ; Surfing on Pikachu uses an alternate sprite. ; This is done by using a separate movement type. ld a, [CurPartyMon] ld e, a ld d, 0 ld hl, PartySpecies add hl, de ld a, [hl] cp PIKACHU ld a, PLAYER_SURF_PIKA ret z ld a, PLAYER_SURF ret CheckDirection: ; c9cb ; Return carry if a tile permission prevents you ; from moving in the direction you're facing. ; Get player direction ld a, [PlayerDirection] and a, %00001100 ; bits 2 and 3 contain direction rrca rrca ld e, a ld d, 0 ld hl, .Directions add hl, de ; Can you walk in this direction? ld a, [TilePermissions] and [hl] jr nz, .quit xor a ret .quit scf ret .Directions db FACE_DOWN db FACE_UP db FACE_LEFT db FACE_RIGHT TrySurfOW:: ; c9e7 ; Checking a tile in the overworld. ; Return carry if fail is allowed. ; Don't ask to surf if already fail. ld a, [PlayerState] cp PLAYER_SURF_PIKA jr z, .quit cp PLAYER_SURF jr z, .quit ; Must be facing water. ld a, [EngineBuffer1] call GetTileCollision cp 1 ; surfable jr nz, .quit ; Check tile permissions. call CheckDirection jr c, .quit ld de, ENGINE_FOGBADGE call CheckEngineFlag jr c, .quit ld d, SURF call CheckPartyMove jr c, .quit ld hl, BikeFlags bit 1, [hl] ; always on bike (can't surf) jr nz, .quit call GetSurfType ld [MovementType], a call GetPartyNick ld a, BANK(AskSurfScript) ld hl, AskSurfScript call CallScript scf ret .quit xor a ret AskSurfScript: ; ca2c opentext writetext AskSurfText yesorno iftrue UsedSurfScript closetext end AskSurfText: ; ca36 text_jump _AskSurfText ; The water is calm. db "@" ; Want to SURF? FlyFunction: ; ca3b call ClearBuffer1 .loop ld hl, .Jumptable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .Jumptable dw .TryFly dw .DoFly dw .FailFly .TryFly: ; ca52 ; Fly ld de, ENGINE_STORMBADGE call CheckBadge jr c, .nostormbadge call GetMapPermission call CheckOutdoorMap jr z, .outdoors jr .indoors .outdoors xor a ld [hMapAnims], a call LoadStandardMenuDataHeader call ClearSprites callba _FlyMap ld a, e cp -1 jr z, .illegal cp NUM_SPAWNS jr nc, .illegal ld [wd001], a call CloseWindow ld a, $1 ret .nostormbadge ld a, $82 ret .indoors ld a, $2 ret .illegal call CloseWindow call WaitBGMap ld a, $80 ret .DoFly: ; ca94 ld hl, .FlyScript call QueueScript ld a, $81 ret .FailFly: ; ca9d call FieldMoveFailed ld a, $82 ret .FlyScript: ; 0xcaa3 reloadmappart callasm HideSprites special UpdateTimePals callasm FlyFromAnim farscall Script_AbortBugContest special WarpToSpawnPoint callasm DelayLoadingNewSprites writecode VAR_MOVEMENT, PLAYER_NORMAL newloadmap MAPSETUP_FLY callasm FlyToAnim special WaitSFX callasm .ReturnFromFly end .ReturnFromFly: ; cacb callba Function561d call DelayFrame call ReplaceKrisSprite callba LoadOverworldFont ret WaterfallFunction: ; cade call .TryWaterfall and $7f ld [wFieldMoveSucceeded], a ret .TryWaterfall: ; cae7 ; Waterfall ld de, ENGINE_RISINGBADGE callba CheckBadge ld a, $80 ret c call CheckMapCanWaterfall jr c, .failed ld hl, Script_WaterfallFromMenu call QueueScript ld a, $81 ret .failed call FieldMoveFailed ld a, $80 ret CheckMapCanWaterfall: ; cb07 ld a, [PlayerDirection] and $c cp FACE_UP jr nz, .failed ld a, [TileUp] call CheckWaterfallTile jr nz, .failed xor a ret .failed scf ret Script_WaterfallFromMenu: ; 0xcb1c reloadmappart special UpdateTimePals Script_UsedWaterfall: ; 0xcb20 callasm GetPartyNick writetext .Text_UsedWaterfall waitbutton closetext playsound SFX_BUBBLEBEAM .loop applymovement PLAYER, .WaterfallStep callasm .CheckContinueWaterfall iffalse .loop end .CheckContinueWaterfall: ; cb38 xor a ld [ScriptVar], a ld a, [PlayerStandingTile] call CheckWaterfallTile ret z callba MobileFn_1060c1 ld a, $1 ld [ScriptVar], a ret .WaterfallStep: ; cb4f turn_waterfall_up step_end .Text_UsedWaterfall: ; 0xcb51 ; used WATERFALL! text_jump UnknownText_0x1c068e db "@" TryWaterfallOW:: ; cb56 ld d, WATERFALL call CheckPartyMove jr c, .failed ld de, ENGINE_RISINGBADGE call CheckEngineFlag jr c, .failed call CheckMapCanWaterfall jr c, .failed ld a, BANK(Script_AskWaterfall) ld hl, Script_AskWaterfall call CallScript scf ret .failed ld a, BANK(Script_CantDoWaterfall) ld hl, Script_CantDoWaterfall call CallScript scf ret Script_CantDoWaterfall: ; 0xcb7e jumptext .Text_CantDoWaterfall .Text_CantDoWaterfall: ; 0xcb81 ; Wow, it's a huge waterfall. text_jump UnknownText_0x1c06a3 db "@" Script_AskWaterfall: ; 0xcb86 opentext writetext .AskUseWaterfall yesorno iftrue Script_UsedWaterfall closetext end .AskUseWaterfall: ; 0xcb90 ; Do you want to use WATERFALL? text_jump UnknownText_0x1c06bf db "@" EscapeRopeFunction: ; cb95 call ClearBuffer1 ld a, $1 jr dig_incave DigFunction: ; cb9c call ClearBuffer1 ld a, $2 dig_incave ld [Buffer2], a .loop ld hl, .DigTable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .DigTable: ; cbb2 dw .CheckCanDig dw .DoDig dw .FailDig .CheckCanDig: ; cbb8 call GetMapPermission cp CAVE jr z, .incave cp DUNGEON jr z, .incave .fail ld a, $2 ret .incave ld hl, wDigWarp ld a, [hli] and a jr z, .fail ld a, [hli] and a jr z, .fail ld a, [hl] and a jr z, .fail ld a, $1 ret .DoDig: ; cbd8 ld hl, wDigWarp ld de, wNextWarp ld bc, 3 call CopyBytes call GetPartyNick ld a, [Buffer2] cp $2 jr nz, .escaperope ld hl, .UsedDigScript call QueueScript ld a, $81 ret .escaperope callba SpecialKabutoChamber ld hl, .UsedEscapeRopeScript call QueueScript ld a, $81 ret .FailDig: ; cc06 ld a, [Buffer2] cp $2 jr nz, .failescaperope ld hl, .Text_CantUseHere call MenuTextBox call WaitPressAorB_BlinkCursor call CloseWindow .failescaperope ld a, $80 ret .Text_UsedDig: ; 0xcc1c ; used DIG! text_jump UnknownText_0x1c06de db "@" .Text_UsedEscapeRope: ; 0xcc21 ; used an ESCAPE ROPE. text_jump UnknownText_0x1c06ed db "@" .Text_CantUseHere: ; 0xcc26 ; Can't use that here. text_jump UnknownText_0x1c0705 db "@" .UsedEscapeRopeScript: ; 0xcc2b reloadmappart special UpdateTimePals writetext .Text_UsedEscapeRope jump .UsedDigOrEscapeRopeScript .UsedDigScript: ; 0xcc35 reloadmappart special UpdateTimePals writetext .Text_UsedDig .UsedDigOrEscapeRopeScript: ; 0xcc3c waitbutton closetext playsound SFX_WARP_TO applymovement PLAYER, .DigOut farscall Script_AbortBugContest special WarpToSpawnPoint writecode VAR_MOVEMENT, PLAYER_NORMAL newloadmap MAPSETUP_DOOR playsound SFX_WARP_FROM applymovement PLAYER, .DigReturn end .DigOut: ; 0xcc59 step_dig 32 hide_person step_end .DigReturn: ; 0xcc5d show_person return_dig 32 step_end TeleportFunction: ; cc61 call ClearBuffer1 .loop ld hl, .Jumptable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .Jumptable: ; cc72 dw .TryTeleport dw .DoTeleport dw .FailTeleport .TryTeleport: ; cc78 call GetMapPermission call CheckOutdoorMap jr z, .CheckIfSpawnPoint jr .nope .CheckIfSpawnPoint ld a, [wLastSpawnMapGroup] ld d, a ld a, [wLastSpawnMapNumber] ld e, a callba IsSpawnPoint jr nc, .nope ld a, c ld [wd001], a ld a, $1 ret .nope ld a, $2 ret .DoTeleport: ; cc9c call GetPartyNick ld hl, .TeleportScript call QueueScript ld a, $81 ret .FailTeleport: ; cca8 ld hl, .Text_CantUseHere call MenuTextBoxBackup ld a, $80 ret .Text_ReturnToLastMonCenter: ; 0xccb1 ; Return to the last #MON CENTER. text_jump UnknownText_0x1c071a db "@" .Text_CantUseHere: ; 0xccb6 ; Can't use that here. text_jump UnknownText_0x1c073b db "@" .TeleportScript: ; 0xccbb reloadmappart special UpdateTimePals writetext .Text_ReturnToLastMonCenter pause 60 reloadmappart closetext playsound SFX_WARP_TO applymovement PLAYER, .TeleportFrom farscall Script_AbortBugContest special WarpToSpawnPoint writecode VAR_MOVEMENT, PLAYER_NORMAL newloadmap MAPSETUP_TELEPORT playsound SFX_WARP_FROM applymovement PLAYER, .TeleportTo end .TeleportFrom: ; cce1 teleport_from step_end .TeleportTo: ; cce3 teleport_to step_end StrengthFunction: ; cce5 call .TryStrength and $7f ld [wFieldMoveSucceeded], a ret .TryStrength: ; ccee ; Strength ld de, ENGINE_PLAINBADGE call CheckBadge jr c, .Failed jr .UseStrength .AlreadyUsing: ; unreferenced ld hl, .JumpText call MenuTextBoxBackup ld a, $80 ret .JumpText: ; 0xcd01 text_jump UnknownText_0x1c0751 db "@" .Failed: ; cd06 ld a, $80 ret .UseStrength: ; cd09 ld hl, Script_StrengthFromMenu call QueueScript ld a, $81 ret SetStrengthFlag: ; cd12 ld hl, BikeFlags set 0, [hl] ld a, [CurPartyMon] ld e, a ld d, 0 ld hl, PartySpecies add hl, de ld a, [hl] ld [Buffer6], a call GetPartyNick ret Script_StrengthFromMenu: ; 0xcd29 reloadmappart special UpdateTimePals Script_UsedStrength: ; 0xcd2d callasm SetStrengthFlag writetext .UsedStrength copybytetovar Buffer6 cry 0 pause 3 writetext .StrengthAllowedItToMoveBoulders closetext end .UsedStrength: ; 0xcd41 text_jump UnknownText_0x1c0774 db "@" .StrengthAllowedItToMoveBoulders: ; 0xcd46 text_jump UnknownText_0x1c0788 db "@" AskStrengthScript: callasm TryStrengthOW iffalse .AskStrength if_equal $1, .DontMeetRequirements jump .AlreadyUsedStrength .DontMeetRequirements: ; 0xcd59 jumptext UnknownText_0xcd73 .AlreadyUsedStrength: ; 0xcd5c jumptext UnknownText_0xcd6e .AskStrength: ; 0xcd5f opentext writetext UnknownText_0xcd69 yesorno iftrue Script_UsedStrength closetext end UnknownText_0xcd69: ; 0xcd69 ; A #MON may be able to move this. Want to use STRENGTH? text_jump UnknownText_0x1c07a0 db "@" UnknownText_0xcd6e: ; 0xcd6e ; Boulders may now be moved! text_jump UnknownText_0x1c07d8 db "@" UnknownText_0xcd73: ; 0xcd73 ; A #MON may be able to move this. text_jump UnknownText_0x1c07f4 db "@" TryStrengthOW: ; cd78 ld d, STRENGTH call CheckPartyMove jr c, .nope ld de, ENGINE_PLAINBADGE call CheckEngineFlag jr c, .nope ld hl, BikeFlags bit 0, [hl] jr z, .already_using ld a, 2 jr .done .nope ld a, 1 jr .done .already_using xor a jr .done .done ld [ScriptVar], a ret WhirlpoolFunction: ; cd9d call ClearBuffer1 .loop ld hl, Jumptable_cdae call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret Jumptable_cdae: ; cdae dw .TryWhirlpool dw .DoWhirlpool dw .FailWhirlpool .TryWhirlpool: ; cdb4 ld de, ENGINE_GLACIERBADGE call CheckBadge jr c, .noglacierbadge call TryWhirlpoolMenu jr c, .failed ld a, $1 ret .failed ld a, $2 ret .noglacierbadge ld a, $80 ret .DoWhirlpool: ; cdca ld hl, Script_WhirlpoolFromMenu call QueueScript ld a, $81 ret .FailWhirlpool: ; cdd3 call FieldMoveFailed ld a, $80 ret Text_UsedWhirlpool: ; 0xcdd9 ; used WHIRLPOOL! text_jump UnknownText_0x1c0816 db "@" TryWhirlpoolMenu: ; cdde call GetFacingTileCoord ld c, a push de call CheckWhirlpoolTile pop de jr c, .failed call GetBlockLocation ld c, [hl] push hl ld hl, WhirlpoolBlockPointers call CheckOverworldTileArrays pop hl jr nc, .failed ld a, l ld [Buffer3], a ld a, h ld [Buffer4], a ld a, b ld [Buffer5], a ld a, c ld [Buffer6], a xor a ret .failed scf ret Script_WhirlpoolFromMenu: ; 0xce0b reloadmappart special UpdateTimePals Script_UsedWhirlpool: ; 0xce0f callasm GetPartyNick writetext Text_UsedWhirlpool reloadmappart callasm DisappearWhirlpool closetext end DisappearWhirlpool: ; ce1d ld hl, Buffer3 ld a, [hli] ld h, [hl] ld l, a ld a, [Buffer5] ld [hl], a xor a ld [hBGMapMode], a call OverworldTextModeSwitch ld a, [Buffer6] ld e, a callba PlayWhirlpoolSound call BufferScreen call GetMovementPermissions ret TryWhirlpoolOW:: ; ce3e ld d, WHIRLPOOL call CheckPartyMove jr c, .failed ld de, ENGINE_GLACIERBADGE call CheckEngineFlag jr c, .failed call TryWhirlpoolMenu jr c, .failed ld a, BANK(Script_AskWhirlpoolOW) ld hl, Script_AskWhirlpoolOW call CallScript scf ret .failed ld a, BANK(Script_MightyWhirlpool) ld hl, Script_MightyWhirlpool call CallScript scf ret Script_MightyWhirlpool: ; 0xce66 jumptext .MightyWhirlpoolText .MightyWhirlpoolText: ; 0xce69 text_jump UnknownText_0x1c082b db "@" Script_AskWhirlpoolOW: ; 0xce6e opentext writetext UnknownText_0xce78 yesorno iftrue Script_UsedWhirlpool closetext end UnknownText_0xce78: ; 0xce78 text_jump UnknownText_0x1c0864 db "@" HeadbuttFunction: ; ce7d call TryHeadbuttFromMenu and $7f ld [wFieldMoveSucceeded], a ret TryHeadbuttFromMenu: ; ce86 call GetFacingTileCoord call CheckHeadbuttTreeTile jr nz, .no_tree ld hl, HeadbuttFromMenuScript call QueueScript ld a, $81 ret .no_tree call FieldMoveFailed ld a, $80 ret UnknownText_0xce9d: ; 0xce9d ; did a HEADBUTT! text_jump UnknownText_0x1c0897 db "@" UnknownText_0xcea2: ; 0xcea2 ; Nope. Nothing… text_jump UnknownText_0x1c08ac db "@" HeadbuttFromMenuScript: ; 0xcea7 reloadmappart special UpdateTimePals HeadbuttScript: ; 0xceab callasm GetPartyNick writetext UnknownText_0xce9d reloadmappart callasm ShakeHeadbuttTree callasm TreeMonEncounter iffalse .no_battle closetext randomwildmon startbattle reloadmapafterbattle end .no_battle writetext UnknownText_0xcea2 waitbutton closetext end TryHeadbuttOW:: ; cec9 ld d, HEADBUTT call CheckPartyMove jr c, .no ld a, BANK(AskHeadbuttScript) ld hl, AskHeadbuttScript call CallScript scf ret .no xor a ret AskHeadbuttScript: ; 0xcedc opentext writetext UnknownText_0xcee6 yesorno iftrue HeadbuttScript closetext end UnknownText_0xcee6: ; 0xcee6 ; A #MON could be in this tree. Want to HEADBUTT it? text_jump UnknownText_0x1c08bc db "@" RockSmashFunction: ; ceeb call TryRockSmashFromMenu and $7f ld [wFieldMoveSucceeded], a ret TryRockSmashFromMenu: ; cef4 call GetFacingObject jr c, .no_rock ld a, d cp $18 jr nz, .no_rock ld hl, RockSmashFromMenuScript call QueueScript ld a, $81 ret .no_rock call FieldMoveFailed ld a, $80 ret GetFacingObject: ; cf0d callba CheckFacingObject jr nc, .fail ld a, [hObjectStructIndexBuffer] call GetObjectStruct ld hl, OBJECT_MAP_OBJECT_INDEX add hl, bc ld a, [hl] ld [hLastTalked], a call GetMapObject ld hl, MAPOBJECT_MOVEMENT add hl, bc ld a, [hl] ld d, a and a ret .fail scf ret RockSmashFromMenuScript: ; 0xcf2e reloadmappart special UpdateTimePals RockSmashScript: ; cf32 callasm GetPartyNick writetext UnknownText_0xcf58 closetext special WaitSFX playsound SFX_STRENGTH earthquake 84 applymovement2 MovementData_0xcf55 disappear -2 callasm RockMonEncounter copybytetovar TempWildMonSpecies iffalse .done randomwildmon startbattle reloadmapafterbattle .done end MovementData_0xcf55: ; 0xcf55 rock_smash 10 step_end UnknownText_0xcf58: ; 0xcf58 text_jump UnknownText_0x1c08f0 db "@" AskRockSmashScript: ; 0xcf5d callasm HasRockSmash if_equal 1, .no opentext writetext UnknownText_0xcf77 yesorno iftrue RockSmashScript closetext end .no jumptext UnknownText_0xcf72 UnknownText_0xcf72: ; 0xcf72 ; Maybe a #MON can break this. text_jump UnknownText_0x1c0906 db "@" UnknownText_0xcf77: ; 0xcf77 ; This rock looks breakable. Want to use ROCK SMASH? text_jump UnknownText_0x1c0924 db "@" HasRockSmash: ; cf7c ld d, ROCK_SMASH call CheckPartyMove jr nc, .yes .no ld a, 1 jr .done .yes xor a jr .done .done ld [ScriptVar], a ret FishFunction: ; cf8e ld a, e push af call ClearBuffer1 pop af ld [Buffer2], a .loop ld hl, .FishTable call FieldMoveJumptable jr nc, .loop and $7f ld [wFieldMoveSucceeded], a ret .FishTable: ; cfa5 dw .TryFish dw .FishNoBite dw .FishGotSomething dw .FailFish dw .FishNoFish .TryFish: ; cfaf ld a, [PlayerState] cp PLAYER_SURF jr z, .fail cp PLAYER_SURF_PIKA jr z, .fail call GetFacingTileCoord call GetTileCollision cp $1 jr z, .facingwater .fail ld a, $3 ret .facingwater call GetFishingGroup and a jr nz, .goodtofish ld a, $4 ret .goodtofish ld d, a ld a, [Buffer2] ld e, a callba FishAction ld a, d and a jr z, .nonibble ld [TempWildMonSpecies], a ld a, e ld [CurPartyLevel], a ld a, BATTLETYPE_FISH ld [BattleType], a ld a, $2 ret .nonibble ld a, $1 ret .FailFish: ; cff1 ld a, $80 ret .FishGotSomething: ; cff4 ld a, $1 ld [Buffer6], a ld hl, Script_GotABite call QueueScript ld a, $81 ret .FishNoBite: ; d002 ld a, $2 ld [Buffer6], a ld hl, Script_NotEvenANibble call QueueScript ld a, $81 ret .FishNoFish: ; d010 ld a, $0 ld [Buffer6], a ld hl, Script_NotEvenANibble2 call QueueScript ld a, $81 ret Script_NotEvenANibble: ; 0xd01e scall Script_FishCastRod writetext UnknownText_0xd0a9 jump Script_NotEvenANibble_FallThrough Script_NotEvenANibble2: ; 0xd027 scall Script_FishCastRod writetext UnknownText_0xd0a9 Script_NotEvenANibble_FallThrough: ; 0xd02d loademote EMOTE_SHADOW callasm PutTheRodAway closetext end Script_GotABite: ; 0xd035 scall Script_FishCastRod callasm Fishing_CheckFacingUp iffalse .NotFacingUp applymovement PLAYER, .Movement_FacingUp jump .FightTheHookedPokemon .NotFacingUp: ; 0xd046 applymovement PLAYER, .Movement_NotFacingUp .FightTheHookedPokemon: ; 0xd04a pause 40 applymovement PLAYER, .Movement_RestoreRod writetext UnknownText_0xd0a4 callasm PutTheRodAway closetext randomwildmon startbattle reloadmapafterbattle end .Movement_NotFacingUp: ; d05c fish_got_bite fish_got_bite fish_got_bite fish_got_bite show_emote step_end .Movement_FacingUp: ; d062 fish_got_bite fish_got_bite fish_got_bite fish_got_bite step_sleep_1 show_emote step_end .Movement_RestoreRod: ; d069 hide_emote fish_cast_rod step_end Fishing_CheckFacingUp: ; d06c ld a, [PlayerDirection] and $c cp OW_UP ld a, $1 jr z, .up xor a .up ld [ScriptVar], a ret Script_FishCastRod: ; 0xd07c reloadmappart loadvar hBGMapMode, $0 special UpdateTimePals loademote EMOTE_ROD callasm LoadFishingGFX loademote EMOTE_SHOCK applymovement PLAYER, MovementData_0xd093 pause 40 end MovementData_0xd093: ; d093 fish_cast_rod step_end PutTheRodAway: ; d095 xor a ld [hBGMapMode], a ld a, $1 ld [PlayerAction], a call UpdateSprites call ReplaceKrisSprite ret UnknownText_0xd0a4: ; 0xd0a4 ; Oh! A bite! text_jump UnknownText_0x1c0958 db "@" UnknownText_0xd0a9: ; 0xd0a9 ; Not even a nibble! text_jump UnknownText_0x1c0965 db "@" UnknownText_0xd0ae: ; unused ; Looks like there's nothing here. text_jump UnknownText_0x1c0979 db "@" BikeFunction: ; d0b3 call .TryBike and $7f ld [wFieldMoveSucceeded], a ret .TryBike: ; d0bc call .CheckEnvironment jr c, .CannotUseBike ld a, [PlayerState] cp PLAYER_NORMAL jr z, .GetOnBike cp PLAYER_BIKE jr z, .GetOffBike jr .CannotUseBike .GetOnBike ld hl, Script_GetOnBike ld de, Script_GetOnBike_Register call .CheckIfRegistered call QueueScript xor a ld [MusicFade], a ld de, MUSIC_NONE call PlayMusic call DelayFrame call MaxVolume ld de, MUSIC_BICYCLE ld a, e ld [wMapMusic], a call PlayMusic ld a, $1 ret .GetOffBike ld hl, BikeFlags bit 1, [hl] jr nz, .CantGetOffBike ld hl, Script_GetOffBike ld de, Script_GetOffBike_Register call .CheckIfRegistered ld a, $3 jr .done .CantGetOffBike ld hl, Script_CantGetOffBike jr .done .CannotUseBike ld a, $0 ret .done call QueueScript ld a, $1 ret .CheckIfRegistered: ; d119 ld a, [wUsingItemWithSelect] and a ret z ld h, d ld l, e ret .CheckEnvironment: ; d121 call GetMapPermission call CheckOutdoorMap jr z, .ok cp CAVE jr z, .ok cp GATE jr z, .ok jr .nope .ok call GetPlayerStandingTile and $f ; can't use our bike in a wall or on water jr nz, .nope xor a ret .nope scf ret Script_GetOnBike: ; 0xd13e reloadmappart special UpdateTimePals writecode VAR_MOVEMENT, PLAYER_BIKE writetext GotOnTheBikeText waitbutton closetext special ReplaceKrisSprite end Script_GetOnBike_Register: ; 0xd14e writecode VAR_MOVEMENT, PLAYER_BIKE closetext special ReplaceKrisSprite end ; XXX nop ret Script_GetOffBike: ; 0xd158 reloadmappart special UpdateTimePals writecode VAR_MOVEMENT, PLAYER_NORMAL writetext GotOffTheBikeText waitbutton FinishGettingOffBike: closetext special ReplaceKrisSprite special PlayMapMusic end Script_GetOffBike_Register: ; 0xd16b writecode VAR_MOVEMENT, PLAYER_NORMAL jump FinishGettingOffBike Script_CantGetOffBike: ; 0xd171 writetext .CantGetOffBikeText waitbutton closetext end .CantGetOffBikeText: ; 0xd177 ; You can't get off here! text_jump UnknownText_0x1c099a db "@" GotOnTheBikeText: ; 0xd17c ; got on the @ . text_jump UnknownText_0x1c09b2 db "@" GotOffTheBikeText: ; 0xd181 ; got off the @ . text_jump UnknownText_0x1c09c7 db "@" TryCutOW:: ; d186 ld d, CUT call CheckPartyMove jr c, .cant_cut ld de, ENGINE_HIVEBADGE call CheckEngineFlag jr c, .cant_cut ld a, BANK(AskCutScript) ld hl, AskCutScript call CallScript scf ret .cant_cut ld a, BANK(CantCutScript) ld hl, CantCutScript call CallScript scf ret AskCutScript: ; 0xd1a9 opentext writetext UnknownText_0xd1c8 yesorno iffalse .script_d1b8 callasm .CheckMap iftrue Script_Cut .script_d1b8 closetext end .CheckMap: ; d1ba xor a ld [ScriptVar], a call CheckMapForSomethingToCut ret c ld a, TRUE ld [ScriptVar], a ret UnknownText_0xd1c8: ; 0xd1c8 text_jump UnknownText_0x1c09dd db "@" CantCutScript: ; 0xd1cd jumptext UnknownText_0xd1d0 UnknownText_0xd1d0: ; 0xd1d0 text_jump UnknownText_0x1c0a05 db "@" _ReceiveItem:: ; d1d5 call DoesHLEqualNumItems jp nz, PutItemInPocket push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a ld hl, .Pockets rst JumpTable ret .Pockets: ; d1e9 dw .Item dw .KeyItem dw .Ball dw .TMHM .Item: ; d1f1 ld h, d ld l, e jp PutItemInPocket .KeyItem: ; d1f6 ld h, d ld l, e jp ReceiveKeyItem .Ball: ; d1fb ld hl, NumBalls jp PutItemInPocket .TMHM: ; d201 ld h, d ld l, e ld a, [CurItem] ld c, a call GetTMHMNumber jp ReceiveTMHM _TossItem:: ; d20d call DoesHLEqualNumItems jr nz, .remove push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a ld hl, .Pockets rst JumpTable ret .Pockets dw .Item dw .KeyItem dw .Ball dw .TMHM .Ball ; d228 ld hl, NumBalls jp RemoveItemFromPocket .TMHM ; d22e ld h, d ld l, e ld a, [CurItem] ld c, a call GetTMHMNumber jp TossTMHM .KeyItem ; d23a ld h, d ld l, e jp TossKeyItem .Item ; d23f ld h, d ld l, e .remove jp RemoveItemFromPocket _CheckItem:: ; d244 call DoesHLEqualNumItems jr nz, .nope push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a ld hl, .Pockets rst JumpTable ret .Pockets dw .Item dw .KeyItem dw .Ball dw .TMHM .Ball ; d25f ld hl, NumBalls jp CheckTheItem .TMHM ; d265 ld h, d ld l, e ld a, [CurItem] ld c, a call GetTMHMNumber jp CheckTMHM .KeyItem ; d271 ld h, d ld l, e jp CheckKeyItems .Item ; d276 ld h, d ld l, e .nope jp CheckTheItem DoesHLEqualNumItems: ; d27b ld a, l cp NumItems % $100 ret nz ld a, h cp NumItems / $100 ret GetPocketCapacity: ; d283 ld c, MAX_ITEMS ld a, e cp NumItems % $100 jr nz, .not_bag ld a, d cp NumItems / $100 ret z .not_bag ld c, MAX_PC_ITEMS ld a, e cp PCItems % $100 jr nz, .not_pc ld a, d cp PCItems / $100 ret z .not_pc ld c, MAX_BALLS ret PutItemInPocket: ; d29c ld d, h ld e, l inc hl ld a, [CurItem] ld c, a ld b, 0 .loop ld a, [hli] cp -1 jr z, .terminator cp c jr nz, .next ld a, 99 sub [hl] add b ld b, a ld a, [wItemQuantityChangeBuffer] cp b jr z, .ok jr c, .ok .next inc hl jr .loop .terminator call GetPocketCapacity ld a, [de] cp c jr c, .ok and a ret .ok ld h, d ld l, e ld a, [CurItem] ld c, a ld a, [wItemQuantityChangeBuffer] ld [wItemQuantityBuffer], a .loop2 inc hl ld a, [hli] cp -1 jr z, .terminator2 cp c jr nz, .loop2 ld a, [wItemQuantityBuffer] add [hl] cp 100 jr nc, .newstack ld [hl], a jr .done .newstack ld [hl], 99 sub 99 ld [wItemQuantityBuffer], a jr .loop2 .terminator2 dec hl ld a, [CurItem] ld [hli], a ld a, [wItemQuantityBuffer] ld [hli], a ld [hl], -1 ld h, d ld l, e inc [hl] .done scf ret RemoveItemFromPocket: ; d2ff ld d, h ld e, l ld a, [hli] ld c, a ld a, [CurItemQuantity] cp c jr nc, .ok ; memory ld c, a ld b, $0 add hl, bc add hl, bc ld a, [CurItem] cp [hl] inc hl jr z, .skip ld h, d ld l, e inc hl .ok ld a, [CurItem] ld b, a .loop ld a, [hli] cp b jr z, .skip cp -1 jr z, .nope inc hl jr .loop .skip ld a, [wItemQuantityChangeBuffer] ld b, a ld a, [hl] sub b jr c, .nope ld [hl], a ld [wItemQuantityBuffer], a and a jr nz, .yup dec hl ld b, h ld c, l inc hl inc hl .loop2 ld a, [hli] ld [bc], a inc bc cp -1 jr nz, .loop2 ld h, d ld l, e dec [hl] .yup scf ret .nope and a ret CheckTheItem: ; d349 ld a, [CurItem] ld c, a .loop inc hl ld a, [hli] cp -1 jr z, .done cp c jr nz, .loop scf ret .done and a ret ReceiveKeyItem: ; d35a ld hl, NumKeyItems ld a, [hli] cp MAX_KEY_ITEMS jr nc, .nope ld c, a ld b, 0 add hl, bc ld a, [CurItem] ld [hli], a ld [hl], -1 ld hl, NumKeyItems inc [hl] scf ret .nope and a ret TossKeyItem: ; d374 ld a, [wd107] ld e, a ld d, 0 ld hl, NumKeyItems ld a, [hl] cp e jr nc, .ok call .Toss ret nc jr .ok2 .ok dec [hl] inc hl add hl, de .ok2 ld d, h ld e, l inc hl .loop ld a, [hli] ld [de], a inc de cp -1 jr nz, .loop scf ret .Toss: ; d396 ld hl, NumKeyItems ld a, [CurItem] ld c, a .loop3 inc hl ld a, [hl] cp c jr z, .ok3 cp -1 jr nz, .loop3 xor a ret .ok3 ld a, [NumKeyItems] dec a ld [NumKeyItems], a scf ret CheckKeyItems: ; d3b1 ld a, [CurItem] ld c, a ld hl, KeyItems .loop ld a, [hli] cp c jr z, .done cp -1 jr nz, .loop and a ret .done scf ret ReceiveTMHM: ; d3c4 dec c ld b, 0 ld hl, TMsHMs add hl, bc ld a, [wItemQuantityChangeBuffer] add [hl] cp 100 jr nc, .toomany ld [hl], a scf ret .toomany and a ret TossTMHM: ; d3d8 dec c ld b, 0 ld hl, TMsHMs add hl, bc ld a, [wItemQuantityChangeBuffer] ld b, a ld a, [hl] sub b jr c, .nope ld [hl], a ld [wItemQuantityBuffer], a jr nz, .yup ld a, [wTMHMPocketScrollPosition] and a jr z, .yup dec a ld [wTMHMPocketScrollPosition], a .yup scf ret .nope and a ret CheckTMHM: ; d3fb dec c ld b, $0 ld hl, TMsHMs add hl, bc ld a, [hl] and a ret z scf ret GetTMHMNumber:: ; d407 ; Return the number of a TM/HM by item id c. ld a, c ; Skip any dummy items. cp ITEM_C3 ; TM04-05 jr c, .done cp ITEM_DC ; TM28-29 jr c, .skip dec a .skip dec a .done sub TM01 inc a ld c, a ret GetNumberedTMHM: ; d417 ; Return the item id of a TM/HM by number c. ld a, c ; Skip any gaps. cp ITEM_C3 - (TM01 - 1) jr c, .done cp ITEM_DC - (TM01 - 1) - 1 jr c, .skip_one .skip_two inc a .skip_one inc a .done add TM01 dec a ld c, a ret _CheckTossableItem:: ; d427 ; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be removed from the bag. ld a, ITEMATTR_PERMISSIONS call GetItemAttr bit 7, a jr nz, ItemAttr_ReturnCarry and a ret CheckSelectableItem: ; d432 ; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be selected. ld a, ITEMATTR_PERMISSIONS call GetItemAttr bit 6, a jr nz, ItemAttr_ReturnCarry and a ret CheckItemPocket:: ; d43d ; Return the pocket for CurItem in wItemAttributeParamBuffer. ld a, ITEMATTR_POCKET call GetItemAttr and $f ld [wItemAttributeParamBuffer], a ret CheckItemContext: ; d448 ; Return the context for CurItem in wItemAttributeParamBuffer. ld a, ITEMATTR_HELP call GetItemAttr and $f ld [wItemAttributeParamBuffer], a ret CheckItemMenu: ; d453 ; Return the menu for CurItem in wItemAttributeParamBuffer. ld a, ITEMATTR_HELP call GetItemAttr swap a and $f ld [wItemAttributeParamBuffer], a ret GetItemAttr: ; d460 ; Get attribute a of CurItem. push hl push bc ld hl, ItemAttributes ld c, a ld b, 0 add hl, bc xor a ld [wItemAttributeParamBuffer], a ld a, [CurItem] dec a ld c, a ld a, NUM_ITEMATTRS call AddNTimes ld a, BANK(ItemAttributes) call GetFarByte pop bc pop hl ret ItemAttr_ReturnCarry: ; d47f ld a, 1 ld [wItemAttributeParamBuffer], a scf ret GetItemPrice: ; d486 ; Return the price of CurItem in de. push hl push bc ld a, ITEMATTR_PRICE call GetItemAttr ld e, a ld a, ITEMATTR_PRICE_HI call GetItemAttr ld d, a pop bc pop hl ret INCLUDE "engine/player_step.asm" INCLUDE "engine/anim_hp_bar.asm" INCLUDE "engine/move_mon.asm" _BillsPC: ; e3fd call .CheckCanUsePC ret c call .LogIn call .UseBillsPC jp .LogOut .CheckCanUsePC: ; e40a (3:640a) ld a, [PartyCount] and a ret nz ld hl, .Text_GottaHavePokemon call MenuTextBoxBackup scf ret .Text_GottaHavePokemon: ; 0xe417 ; You gotta have #MON to call! text_jump UnknownText_0x1c1006 db "@" .LogIn: ; e41c (3:641c) xor a ld [hBGMapMode], a call LoadStandardMenuDataHeader call ClearPCItemScreen ld hl, Options ld a, [hl] push af set NO_TEXT_SCROLL, [hl] ld hl, .Text_What call PrintText pop af ld [Options], a call LoadFontsBattleExtra ret .Text_What: ; 0xe43a ; What? text_jump UnknownText_0x1c1024 db "@" .LogOut: ; e43f (3:643f) call CloseSubmenu ret .UseBillsPC: ; e443 (3:6443) ld hl, .MenuDataHeader call LoadMenuDataHeader ld a, $1 .loop ld [wMenuCursorBuffer], a call SetPalettes xor a ld [wWhichIndexSet], a ld [hBGMapMode], a call DoNthMenu jr c, .cancel ld a, [wMenuCursorBuffer] push af ld a, [MenuSelection] ld hl, .Jumptable rst JumpTable pop bc ld a, b jr nc, .loop .cancel call CloseWindow ret .MenuDataHeader: ; 0xe46f db $40 ; flags db 00, 00 ; start coords db 17, 19 ; end coords dw .MenuData2 db 1 ; default option .MenuData2: ; 0xe477 db $80 ; flags db 0 ; items dw .items dw PlaceMenuStrings dw .strings .strings: ; e47f db "WITHDRAW @" db "DEPOSIT @" db "CHANGE BOX@" db "MOVE W/O MAIL@" db "SEE YA!@" .Jumptable: ; e4ba (3:64ba) dw BillsPC_WithdrawMenu dw BillsPC_DepositMenu dw BillsPC_ChangeBoxMenu dw BillsPC_MovePKMNMenu dw BillsPC_SeeYa .items: ; e4c4 db 5 db 0 ; WITHDRAW db 1; DEPOSIT db 2 ; CHANGE BOX db 3 ; MOVE PKMN db 4 ; SEE YA! db -1 BillsPC_SeeYa: ; e4cb scf ret BillsPC_MovePKMNMenu: ; e4cd call LoadStandardMenuDataHeader callba IsAnyMonHoldingMail jr nc, .no_mail ld hl, .Text_MonHoldingMail call PrintText jr .quit .no_mail callba StartMovePkmnWOMail_SaveGame jr c, .quit callba _MovePKMNWithoutMail call ReturnToMapFromSubmenu call ClearPCItemScreen .quit call CloseWindow and a ret .Text_MonHoldingMail: ; 0xe4f9 ; There is a #MON holding MAIL. Please remove the MAIL. text_jump UnknownText_0x1c102b db "@" BillsPC_DepositMenu: ; e4fe (3:64fe) call LoadStandardMenuDataHeader callba _DepositPKMN call ReturnToMapFromSubmenu call ClearPCItemScreen call CloseWindow and a ret Functione512: ; unused ld a, [PartyCount] and a jr z, .no_pkmn cp 2 jr c, .only_one_pkmn and a ret .no_pkmn ld hl, .Text_NoPKMN call MenuTextBoxBackup scf ret .only_one_pkmn ld hl, .Text_ItsYourLastPKMN call MenuTextBoxBackup scf ret .Text_NoPKMN: ; 0xe52e ; You don't have a single #MON! text_jump UnknownText_0x1c1062 db "@" .Text_ItsYourLastPKMN: ; 0xe533 ; You can't deposit your last #MON! text_jump UnknownText_0x1c1080 db "@" CheckCurPartyMonFainted: ; e538 ld hl, PartyMon1HP ld de, PARTYMON_STRUCT_LENGTH ld b, $0 .loop ld a, [CurPartyMon] cp b jr z, .skip ld a, [hli] or [hl] jr nz, .notfainted dec hl .skip inc b ld a, [PartyCount] cp b jr z, .done add hl, de jr .loop .done scf ret .notfainted and a ret BillsPC_WithdrawMenu: ; e559 (3:6559) call LoadStandardMenuDataHeader callba _WithdrawPKMN call ReturnToMapFromSubmenu call ClearPCItemScreen call CloseWindow and a ret Functione56d: ; unused ld a, [PartyCount] cp PARTY_LENGTH jr nc, .asm_e576 and a ret .asm_e576 ld hl, UnknownText_0xe57e call MenuTextBoxBackup scf ret UnknownText_0xe57e: ; 0xe57e ; You can't take any more #MON. text_jump UnknownText_0x1c10a2 db "@" BillsPC_ChangeBoxMenu: ; e583 (3:6583) callba _ChangeBox and a ret ClearPCItemScreen: ; e58b call DisableSpriteUpdates xor a ld [hBGMapMode], a call ClearBGPalettes call ClearSprites hlcoord 0, 0 ld bc, SCREEN_HEIGHT * SCREEN_WIDTH ld a, " " call ByteFill hlcoord 0,0 lb bc, 10, 18 call TextBox hlcoord 0,12 lb bc, 4, 18 call TextBox call WaitBGMap2 call SetPalettes ; load regular palettes? ret CopyBoxmonToTempMon: ; e5bb ld a, [CurPartyMon] ld hl, sBoxMon1Species ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld de, TempMonSpecies ld bc, BOXMON_STRUCT_LENGTH ld a, BANK(sBoxMon1Species) call GetSRAMBank call CopyBytes call CloseSRAM ret Functione5d9: ; unreferenced ld a, [wCurBox] cp b jr z, .same_box ld a, b ld hl, .BoxAddrs ld bc, 3 call AddNTimes ld a, [hli] push af ld a, [hli] ld h, [hl] ld l, a pop af jr .okay .same_box ld a, BANK(sBoxCount) ld hl, sBoxCount .okay call GetSRAMBank ld a, [hl] ld bc, 1 + MONS_PER_BOX + 1 add hl, bc ld b, a ld c, $0 ld de, wc608 ld a, b and a jr z, .empty_box .loop push hl push bc ld a, c ld bc, 0 add hl, bc ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld a, [hl] ld [de], a inc de ld [CurSpecies], a call GetBaseData pop bc pop hl push hl push bc ld a, c ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) add hl, bc call SkipNames call CopyBytes pop bc pop hl push hl push bc ld a, c ld bc, MON_LEVEL add hl, bc ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld a, [hl] ld [de], a inc de pop bc pop hl push hl push bc ld a, c ld bc, MON_DVS add hl, bc ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld a, [hli] and $f0 ld b, a ld a, [hl] and $f0 swap a or b ld b, a ld a, [BaseGender] cp b ld a, $1 jr c, .okay2 xor a .okay2 ld [de], a inc de pop bc pop hl inc c dec b jr nz, .loop .empty_box call CloseSRAM ret .BoxAddrs: ; e66e 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 GetBreedMon1LevelGrowth: ; e698 ld hl, wBreedMon1Stats ld de, TempMon ld bc, BOXMON_STRUCT_LENGTH call CopyBytes callab CalcLevel ld a, [wBreedMon1Level] ld b, a ld a, d ld e, a sub b ld d, a ret GetBreedMon2LevelGrowth: ; e6b3 ld hl, wBreedMon2Stats ld de, TempMon ld bc, BOXMON_STRUCT_LENGTH call CopyBytes callab CalcLevel ld a, [wBreedMon2Level] ld b, a ld a, d ld e, a sub b ld d, a ret BugContest_SetCaughtContestMon: ; e6ce ld a, [wContestMon] and a jr z, .firstcatch ld [wd265], a callba DisplayAlreadyCaughtText callba DisplayCaughtContestMonStats lb bc, 14, 7 call PlaceYesNoBox ret c .firstcatch call .generatestats ld a, [TempEnemyMonSpecies] ld [wd265], a call GetPokemonName ld hl, .caughttext call PrintText ret .generatestats: ; e6fd ld a, [TempEnemyMonSpecies] ld [CurSpecies], a ld [CurPartySpecies], a call GetBaseData xor a ld bc, PARTYMON_STRUCT_LENGTH ld hl, wContestMon call ByteFill xor a ld [MonType], a ld hl, wContestMon jp GeneratePartyMonStats .caughttext: ; 0xe71d ; Caught @ ! text_jump UnknownText_0x1c10c0 db "@" INCLUDE "items/item_effects.asm" GetPokeBallWobble: ; f971 (3:7971) ; Returns whether a Poke Ball will wobble in the catch animation. ; Whether a Pokemon is caught is determined beforehand. push de ld a, [rSVBK] ld d, a push de ld a, 1 ; BANK(Buffer2) ld [rSVBK], a ld a, [Buffer2] inc a ld [Buffer2], a ; Wobble up to 3 times. cp 3 + 1 jr z, .finished ld a, [wWildMon] and a ld c, 0 ; next jr nz, .done ld hl, .WobbleProbabilities ld a, [Buffer1] ld b, a .loop ld a, [hli] cp b jr nc, .checkwobble inc hl jr .loop .checkwobble ld b, [hl] call Random cp b ld c, 0 ; next jr c, .done ld c, 2 ; escaped jr .done .finished ld a, [wWildMon] and a ld c, 1 ; caught jr nz, .done ld c, 2 ; escaped .done pop de ld e, a ld a, d ld [rSVBK], a ld a, e pop de ret .WobbleProbabilities: ; f9ba ; catch rate, chance of wobbling / 255 ; nLeft/255 = (nRight/255) ** 4 db 1, 63 db 2, 75 db 3, 84 db 4, 90 db 5, 95 db 7, 103 db 10, 113 db 15, 126 db 20, 134 db 30, 149 db 40, 160 db 50, 169 db 60, 177 db 80, 191 db 100, 201 db 120, 211 db 140, 220 db 160, 227 db 180, 234 db 200, 240 db 220, 246 db 240, 251 db 254, 253 db 255, 255 KnowsMove: ; f9ea ld a, MON_MOVES call GetPartyParamLocation ld a, [wPutativeTMHMMove] ld b, a ld c, NUM_MOVES .loop ld a, [hli] cp b jr z, .knows_move dec c jr nz, .loop and a ret .knows_move ld hl, .Text_knows call PrintText scf ret .Text_knows: ; 0xfa06 ; knows @ . text_jump UnknownText_0x1c5ea8 db "@" SECTION "bank4", ROMX, BANK[$4] INCLUDE "engine/pack.asm" INCLUDE "engine/time.asm" INCLUDE "engine/tmhm.asm" INCLUDE "engine/namingscreen.asm" Script_AbortBugContest: ; 0x122c1 checkflag ENGINE_BUG_CONTEST_TIMER iffalse .finish setflag ENGINE_DAILY_BUG_CONTEST special ContestReturnMons .finish end INCLUDE "event/itemball.asm" INCLUDE "engine/healmachineanim.asm" INCLUDE "event/whiteout.asm" INCLUDE "event/forced_movement.asm" 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 ; wd03e (aliases: MenuItemsList, CurFruitTree, CurInput) 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, .table1 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 .table1 dbw $91, magazinebookshelf dbw $93, pcscript dbw $94, radio1 dbw $95, townmap dbw $96, merchandiseshelf dbw $97, tv dbw $9d, window dbw $9f, incenseburner db -1 ; end Script_JumpStdFromRAM: ; 0x1369a jump wJumpStdScriptBuffer 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 "event/bug_contest_2.asm" INCLUDE "unknown/013a47.asm" 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 SECTION "bank5", ROMX, BANK[$5] INCLUDE "engine/rtc.asm" INCLUDE "engine/overworld.asm" INCLUDE "engine/tile_events.asm" INCLUDE "engine/save.asm" INCLUDE "engine/spawn_points.asm" INCLUDE "engine/map_setup.asm" INCLUDE "engine/pokecenter_pc.asm" INCLUDE "engine/mart.asm" INCLUDE "engine/money.asm" INCLUDE "items/marts.asm" INCLUDE "event/mom.asm" INCLUDE "event/daycare.asm" INCLUDE "event/photo.asm" INCLUDE "engine/breeding/egg.asm" SECTION "Tileset Data 1", ROMX, BANK[TILESETS_1] INCLUDE "tilesets/data_1.asm" SECTION "Roofs", ROMX, BANK[ROOFS] INCLUDE "tilesets/roofs.asm" SECTION "Tileset Data 2", ROMX, BANK[TILESETS_2] INCLUDE "tilesets/data_2.asm" SECTION "bank8", ROMX, BANK[$8] INCLUDE "engine/clock_reset.asm" SECTION "Tileset Data 3", ROMX, BANK[TILESETS_3] INCLUDE "tilesets/data_3.asm" SECTION "bank9", ROMX, BANK[$9] StringBufferPointers:: ; 24000 dw StringBuffer3 dw StringBuffer4 dw StringBuffer5 dw StringBuffer2 dw StringBuffer1 dw EnemyMonNick dw BattleMonNick INCLUDE "engine/menu.asm" UpdateItemDescription: ; 0x244c3 ld a, [MenuSelection] ld [CurSpecies], a hlcoord 0, 12 ld b, 4 ld c, SCREEN_WIDTH - 2 call TextBox ld a, [MenuSelection] cp -1 ret z decoord 1, 14 callba PrintItemDescription 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/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 Function3842 .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/mon_menu.asm" INCLUDE "battle/menu.asm" INCLUDE "engine/buy_sell_toss.asm" INCLUDE "engine/trainer_card.asm" INCLUDE "engine/prof_oaks_pc.asm" INCLUDE "engine/decorations.asm" PadCoords_de: ; 27092 ld a, d add 4 ld d, a ld a, e add 4 ld e, a call GetBlockLocation ret LevelUpHappinessMod: ; 2709e ld a, [CurPartyMon] ld hl, PartyMon1CaughtLocation call GetPartyLocation ld a, [hl] and $7f ld d, a ld a, [MapGroup] ld b, a ld a, [MapNumber] ld c, a call GetWorldMapLocation cp d ld c, HAPPINESS_GAINLEVEL jr nz, .ok ld c, HAPPINESS_GAINLEVELATHOME .ok callab ChangeHappiness ret INCLUDE "trainers/dvs.asm" _ReturnToBattle_UseBall: ; 2715c call ClearBGPalettes call ClearTileMap ld a, [BattleType] cp BATTLETYPE_TUTORIAL jr z, .gettutorialbackpic callba GetMonBackpic jr .continue .gettutorialbackpic callba GetTrainerBackpic .continue callba GetMonFrontpic callba _LoadBattleFontsHPBar call GetMemSGBLayout call CloseWindow call LoadStandardMenuDataHeader 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 "battle/moves/move_effects_pointers.asm" MoveEffects: ; 2732e INCLUDE "battle/moves/move_effects.asm" Kurt_SelectQuantity_InterpretJoypad: ; 27a28 call BuySellToss_InterpretJoypad ld b, a ret SECTION "bankA", ROMX, BANK[$A] INCLUDE "engine/link.asm" Function29fe4: ; unreferenced ld a, $0 call GetSRAMBank ld d, $0 ld b, CHECK_FLAG predef FlagPredef call CloseSRAM ld a, c and a ret INCLUDE "engine/wildmons.asm" DetermineLinkBattleResult: ; 2b930 callba UpdateEnemyMonInParty ld hl, PartyMon1HP call .CountMonsRemaining push bc ld hl, OTPartyMon1HP call .CountMonsRemaining ld a, c pop bc cp c jr z, .even_number_of_mons_remaining jr c, .defeat jr .victory .even_number_of_mons_remaining call .BothSides_CheckNumberMonsAtFullHealth jr z, .drawn ld a, e cp $1 jr z, .victory cp $2 jr z, .defeat ld hl, PartyMon1HP call .CalcPercentHPRemaining push de ld hl, OTPartyMon1HP call .CalcPercentHPRemaining pop hl ld a, d cp h jr c, .victory jr z, .compare_lo jr .defeat .compare_lo ld a, e cp l jr z, .drawn jr nc, .defeat .victory ld a, [wBattleResult] and $f0 ld [wBattleResult], a ret .defeat ld a, [wBattleResult] and $f0 add $1 ld [wBattleResult], a ret .drawn ld a, [wBattleResult] and $f0 add $2 ld [wBattleResult], a ret .CountMonsRemaining: ; 2b995 ld c, 0 ld b, 3 ld de, PARTYMON_STRUCT_LENGTH - 1 .loop ld a, [hli] or [hl] jr nz, .not_fainted inc c .not_fainted add hl, de dec b jr nz, .loop ret .CalcPercentHPRemaining: ; 2b9a6 ld de, 0 ld c, $3 .loop2 ld a, [hli] or [hl] jr z, .next dec hl xor a ld [hDividend + 0], a ld a, [hli] ld [hDividend + 1], a ld a, [hli] ld [hDividend + 2], a xor a ld [hDividend + 3], a ld a, [hli] ld b, a ld a, [hld] srl b rr a srl b rr a ld [hDivisor], a ld b, $4 call Divide ld a, [hQuotient + 2] add e ld e, a ld a, [hQuotient + 1] adc d ld d, a dec hl .next push de ld de, $2f add hl, de pop de dec c jr nz, .loop2 ret .BothSides_CheckNumberMonsAtFullHealth: ; 2b9e1 ld hl, PartyMon1HP call .CheckFaintedOrFullHealth jr nz, .finish ; we have a pokemon that's neither fainted nor at full health ld hl, OTPartyMon1HP call .CheckFaintedOrFullHealth ld e, $1 ret .finish ld hl, OTPartyMon1HP call .CheckFaintedOrFullHealth ld e, $0 ret nz ; we both have pokemon that are neither fainted nor at full health ld e, $2 ld a, $1 and a ret .CheckFaintedOrFullHealth: ; 2ba01 ld d, 3 .loop3 ld a, [hli] ld b, a ld a, [hli] ld c, a or b jr z, .fainted_or_full_health ld a, [hli] cp b ret nz ld a, [hld] cp c ret nz .fainted_or_full_health push de ld de, PARTYMON_STRUCT_LENGTH - 2 add hl, de pop de dec d jr nz, .loop3 ret ChrisBackpic: ; 2ba1a INCBIN "gfx/misc/player.6x6.2bpp.lz" DudeBackpic: ; 2bbaa INCBIN "gfx/misc/dude.6x6.2bpp.lz" SECTION "bankB", ROMX, BANK[$B] INCLUDE "battle/trainer_huds.asm" TrainerClassNames:: ; 2c1ef INCLUDE "text/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 FindFirstAliveMon: ; 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 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 4 ; 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 rept 3 ld [hli], a endr 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 PlaceGraphic: ; 2ef6e ; Fill wBoxAlignment-aligned box width b height c ; with iterating tile starting from hGraphicStartTile at hl. ; Predef $13 ld de, SCREEN_WIDTH ld a, [wBoxAlignment] and a jr nz, .right ld a, [hGraphicStartTile] .x1 push bc push hl .y1 ld [hl], a add hl, de inc a dec c jr nz, .y1 pop hl inc hl pop bc dec b jr nz, .x1 ret .right ; Right-aligned. push bc ld b, 0 dec c add hl, bc pop bc ld a, [hGraphicStartTile] .x2 push bc push hl .y2 ld [hl], a add hl, de inc a dec c jr nz, .y2 pop hl dec hl pop bc dec b jr nz, .x2 ret SECTION "Tileset Data 4", ROMX, BANK[TILESETS_4] INCLUDE "tilesets/data_4.asm" SECTION "Effect Commands", ROMX, BANK[$D] INCLUDE "battle/effect_commands.asm" SECTION "Enemy Trainers", ROMX, BANK[$E] INCLUDE "battle/ai/items.asm" AIScoring: ; 38591 INCLUDE "battle/ai/scoring.asm" GetTrainerClassName: ; 3952d ld hl, RivalName ld a, c cp RIVAL1 jr z, .rival ld [CurSpecies], a ld a, TRAINER_NAME ld [wNamedObjectTypeBuffer], a call GetName ld de, StringBuffer1 ret .rival ld de, StringBuffer1 push de ld bc, NAME_LENGTH call CopyBytes pop de ret GetOTName: ; 39550 ld hl, OTPlayerName ld a, [wLinkMode] and a jr nz, .ok ld hl, RivalName ld a, c cp RIVAL1 jr z, .ok ld [CurSpecies], a ld a, TRAINER_NAME ld [wNamedObjectTypeBuffer], a call GetName ld hl, StringBuffer1 .ok ld bc, TRAINER_CLASS_NAME_LENGTH ld de, OTClassName push de call CopyBytes pop de ret GetTrainerAttributes: ; 3957b ld a, [TrainerClass] ld c, a call GetOTName ld a, [TrainerClass] dec a ld hl, TrainerClassAttributes + TRNATTR_ITEM1 ld bc, NUM_TRAINER_ATTRIBUTES call AddNTimes ld de, wEnemyTrainerItem1 ld a, [hli] ld [de], a inc de ld a, [hli] ld [de], a ld a, [hl] ld [wEnemyTrainerBaseReward], a ret INCLUDE "trainers/attributes.asm" INCLUDE "trainers/read_party.asm" INCLUDE "trainers/trainer_pointers.asm" INCLUDE "trainers/trainers.asm" SECTION "Battle Core", ROMX, BANK[$F] INCLUDE "battle/core.asm" INCLUDE "battle/effect_command_pointers.asm" SECTION "bank10", ROMX, BANK[$10] INCLUDE "engine/pokedex.asm" INCLUDE "battle/moves/moves.asm" INCLUDE "engine/evolve.asm" SECTION "bank11", ROMX, BANK[$11] INCLUDE "engine/fruit_trees.asm" INCLUDE "battle/ai/move.asm" AnimateDexSearchSlowpoke: ; 441cf ld hl, .FrameIDs ld b, 25 .loop ld a, [hli] ; Wrap around cp $fe jr nz, .ok ld hl, .FrameIDs ld a, [hli] .ok ld [wDexSearchSlowpokeFrame], a ld a, [hli] ld c, a push bc push hl call DoDexSearchSlowpokeFrame pop hl pop bc call DelayFrames dec b jr nz, .loop xor a ld [wDexSearchSlowpokeFrame], a call DoDexSearchSlowpokeFrame ld c, 32 call DelayFrames ret .FrameIDs: ; 441fc ; frame ID, duration db 0, 7 db 1, 7 db 2, 7 db 3, 7 db 4, 7 db -2 DoDexSearchSlowpokeFrame: ; 44207 ld a, [wDexSearchSlowpokeFrame] ld hl, .SpriteData ld de, Sprites .loop ld a, [hli] cp -1 ret z ld [de], a inc de ld a, [hli] ld [de], a inc de ld a, [wDexSearchSlowpokeFrame] ld b, a add a add b add [hl] inc hl ld [de], a inc de ld a, [hli] ld [de], a inc de jr .loop .SpriteData: ; 44228 dsprite 11, 0, 9, 0, $00, $00 dsprite 11, 0, 10, 0, $01, $00 dsprite 11, 0, 11, 0, $02, $00 dsprite 12, 0, 9, 0, $10, $00 dsprite 12, 0, 10, 0, $11, $00 dsprite 12, 0, 11, 0, $12, $00 dsprite 13, 0, 9, 0, $20, $00 dsprite 13, 0, 10, 0, $21, $00 dsprite 13, 0, 11, 0, $22, $00 db -1 DisplayDexEntry: ; 4424d call GetPokemonName hlcoord 9, 3 call PlaceString ; mon species ld a, [wd265] ld b, a call GetDexEntryPointer ld a, b push af hlcoord 9, 5 call FarString ; dex species ld h, b ld l, c push de ; Print dex number hlcoord 2, 8 ld a, $5c ; No ld [hli], a ld a, $5d ; . ld [hli], a ld de, wd265 lb bc, PRINTNUM_LEADINGZEROS | 1, 3 call PrintNum ; Check to see if we caught it. Get out of here if we haven't. ld a, [wd265] dec a call CheckCaughtMon pop hl pop bc ret z ; Get the height of the Pokemon. ld a, [CurPartySpecies] ld [CurSpecies], a inc hl ld a, b push af push hl call GetFarHalfword ld d, l ld e, h pop hl inc hl inc hl ld a, d or e jr z, .skip_height push hl push de ld hl, [sp+$0] ld d, h ld e, l hlcoord 12, 7 lb bc, 2, PRINTNUM_MONEY | 4 call PrintNum hlcoord 14, 7 ld [hl], $5e ; ft symbol pop af pop hl .skip_height pop af push af inc hl push hl dec hl call GetFarHalfword ld d, l ld e, h ld a, e or d jr z, .skip_weight push de ld hl, [sp+$0] ld d, h ld e, l hlcoord 11, 9 lb bc, 2, PRINTNUM_RIGHTALIGN | 5 call PrintNum pop de .skip_weight ; Page 1 lb bc, 5, SCREEN_WIDTH - 2 hlcoord 2, 11 call ClearBox hlcoord 1, 10 ld bc, SCREEN_WIDTH - 1 ld a, $61 ; horizontal divider call ByteFill ; page number hlcoord 1, 9 ld [hl], $55 inc hl ld [hl], $55 hlcoord 1, 10 ld [hl], $56 ; P. inc hl ld [hl], $57 ; 1 pop de inc de pop af hlcoord 2, 11 push af call FarString pop bc ld a, [wPokedexStatus] or a ret z ; Page 2 push bc push de lb bc, 5, SCREEN_WIDTH - 2 hlcoord 2, 11 call ClearBox hlcoord 1, 10 ld bc, SCREEN_WIDTH - 1 ld a, $61 call ByteFill ; page number hlcoord 1, 9 ld [hl], $55 inc hl ld [hl], $55 hlcoord 1, 10 ld [hl], $56 ; P. inc hl ld [hl], $58 ; 2 pop de inc de pop af hlcoord 2, 11 call FarString ret String_44331: ; 44331 db "#@" GetDexEntryPointer: ; 44333 ; return dex entry pointer b:de push hl ld hl, PokedexDataPointerTable ld a, b dec a ld d, 0 ld e, a add hl, de add hl, de ld e, [hl] inc hl ld d, [hl] push de rlca rlca and $3 ld hl, .PokedexEntryBanks ld d, 0 ld e, a add hl, de ld b, [hl] pop de pop hl ret .PokedexEntryBanks: ; 44351 GLOBAL PokedexEntries1 GLOBAL PokedexEntries2 GLOBAL PokedexEntries3 GLOBAL PokedexEntries4 db BANK(PokedexEntries1) db BANK(PokedexEntries2) db BANK(PokedexEntries3) db BANK(PokedexEntries4) GetDexEntryPagePointer: ; 44355 call GetDexEntryPointer ; b:de push hl ld h, d ld l, e ; skip species name .loop1 ld a, b call GetFarByte inc hl cp "@" jr nz, .loop1 ; skip height and weight rept 4 inc hl endr ; if c != 1: skip entry dec c jr z, .done ; skip entry .loop2 ld a, b call GetFarByte inc hl cp "@" jr nz, .loop2 .done ld d, h ld e, l pop hl ret PokedexDataPointerTable: ; 0x44378 INCLUDE "data/pokedex/entry_pointers.asm" INCLUDE "engine/mail.asm" SECTION "Crystal Unique", ROMX, BANK[$12] INCLUDE "engine/init_gender.asm" DrawKrisPackGFX: ; 48e81 ld hl, PackFGFXPointers add hl, de add hl, de ld a, [hli] ld e, a ld d, [hl] ld hl, VTiles2 tile $50 lb bc, BANK(PackFGFX), 15 call Request2bpp ret PackFGFXPointers: ; 48e93 dw PackFGFX + (15 tiles) * 1 dw PackFGFX + (15 tiles) * 3 dw PackFGFX + (15 tiles) * 0 dw PackFGFX + (15 tiles) * 2 PackFGFX: ; 48e9b INCBIN "gfx/misc/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 "predef/crystal.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 "misc/mobile_menu.asm" INCLUDE "engine/search.asm" INCLUDE "misc/mobile_12_2.asm" ; mobile battle selection AskRememberPassword: ; 4ae12 call .DoMenu ld a, $0 jr c, .okay ld a, $1 .okay ld [ScriptVar], a ret .DoMenu: ; 4ae1f lb bc, 14, 7 push bc ld hl, YesNoMenuDataHeader call CopyMenuDataHeader pop bc ld a, b ld [wMenuBorderLeftCoord], a add $5 ld [wMenuBorderRightCoord], a ld a, c ld [wMenuBorderTopCoord], a add $4 ld [wMenuBorderBottomCoord], a call PushWindow call VerticalMenu push af ld c, 15 call DelayFrames call Buena_ExitMenu pop af jr c, .refused ld a, [wMenuCursorY] cp $2 jr z, .refused and a ret .refused ld a, $2 ld [wMenuCursorY], a scf ret Buena_ExitMenu: ; 4ae5e ld a, [hOAMUpdate] push af call ExitMenu call UpdateSprites xor a ld [hOAMUpdate], a call DelayFrame ld a, $1 ld [hOAMUpdate], a call ApplyTilemap pop af ld [hOAMUpdate], a ret SECTION "bank13", ROMX, BANK[$13] 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 "tilesets/palette_maps.asm" TileCollisionTable:: ; 4ce1f INCLUDE "tilesets/collision.asm" EmptyAllSRAMBanks: ; 4cf1f ld a, $0 call .EmptyBank ld a, $1 call .EmptyBank ld a, $2 call .EmptyBank ld a, $3 call .EmptyBank ret .EmptyBank: ; 4cf34 call GetSRAMBank ld hl, SRAM_Begin ld bc, SRAM_End - SRAM_Begin xor a call ByteFill call CloseSRAM ret SaveMenu_LoadEDTile: ; 4cf45 (13:4f45) ld a, [hCGB] and a jp z, WaitBGMap ; The following is a modified version of Function3246. ld a, [hBGMapMode] push af xor a ld [hBGMapMode], a ld a, [hMapAnims] push af xor a ld [hMapAnims], a .WaitLY ld a, [rLY] cp $60 jr c, .WaitLY di ld a, 1 ; BANK(VBGMap2) ld [rVBK], a hlcoord 0, 0, AttrMap call .LoadEDTile ld a, 0 ; BANK(VBGMap0) ld [rVBK], a hlcoord 0, 0 call .LoadEDTile .WaitLY2 ld a, [rLY] cp $60 jr c, .WaitLY2 ei pop af ld [hMapAnims], a pop af ld [hBGMapMode], a ret .LoadEDTile: ; 4cf80 (13:4f80) ld [hSPBuffer], sp ; $ffd9 ld sp, hl ld a, [hBGMapAddress + 1] ld h, a ld l, 0 ld a, SCREEN_HEIGHT ld [hTilesPerCycle], a ld b, 1 << 1 ld c, rSTAT % $100 .loop rept SCREEN_WIDTH / 2 pop de .loop\@ ld a, [$ff00+c] and b jr nz, .loop\@ ld [hl], e inc l ld [hl], d inc l endr ld de, $20 - SCREEN_WIDTH add hl, de ld a, [hTilesPerCycle] dec a ld [hTilesPerCycle], a jr nz, .loop ld a, [hSPBuffer] ld l, a ld a, [hSPBuffer + 1] ld h, a ld sp, hl ret CheckSave:: ; 4cffe ld a, BANK(s1_a008) call GetSRAMBank ld a, [s1_a008] ld b, a ld a, [s1_ad0f] ld c, a call CloseSRAM ld a, b cp 99 jr nz, .ok ld a, c cp " " jr nz, .ok ld c, $1 ret .ok ld c, $0 ret INCLUDE "engine/map_triggers.asm" _LoadMapPart:: ; 4d15b ld hl, wMisc ld a, [wMetatileStandingY] and a jr z, .top_row ld bc, WMISC_WIDTH * 2 add hl, bc .top_row ld a, [wMetatileStandingX] and a jr z, .left_column inc hl inc hl .left_column decoord 0, 0 ld b, SCREEN_HEIGHT .loop ld c, SCREEN_WIDTH .loop2 ld a, [hli] ld [de], a inc de dec c jr nz, .loop2 ld a, l add 4 ld l, a jr nc, .carry inc h .carry dec b jr nz, .loop ret PhoneRing_LoadEDTile: ; 4d188 ld a, [hCGB] and a jp z, WaitBGMap ld a, [wSpriteUpdatesEnabled] cp $0 jp z, WaitBGMap ; What follows is a modified version of Function3246 (LoadEDTile). ld a, [hBGMapMode] push af xor a ld [hBGMapMode], a ld a, [hMapAnims] push af xor a ld [hMapAnims], a .wait ld a, [rLY] cp $8f jr c, .wait di ld a, 1 ; BANK(VBGMap2) ld [rVBK], a hlcoord 0, 0, AttrMap call .LoadEDTile ld a, 0 ; BANK(VBGMap0) ld [rVBK], a hlcoord 0, 0 call .LoadEDTile .wait2 ld a, [rLY] cp $8f jr c, .wait2 ei pop af ld [hMapAnims], a pop af ld [hBGMapMode], a ret .LoadEDTile: ; 4d1cb ld [hSPBuffer], sp ld sp, hl ld a, [hBGMapAddress + 1] ld h, a ld l, 0 ld a, SCREEN_HEIGHT ld [hTilesPerCycle], a ld b, 1 << 1 ; not in v/hblank ld c, rSTAT % $100 .loop rept SCREEN_WIDTH / 2 pop de .loop\@ ld a, [$ff00+c] and b jr nz, .loop\@ ld [hl], e inc l ld [hl], d inc l endr ld de, $20 - SCREEN_WIDTH add hl, de ld a, [hTilesPerCycle] dec a ld [hTilesPerCycle], a jr nz, .loop ld a, [hSPBuffer] ld l, a ld a, [hSPBuffer + 1] ld h, a ld sp, hl ret Shrink1Pic: ; 4d249 INCBIN "gfx/shrink1.2bpp.lz" Shrink2Pic: ; 4d2d9 INCBIN "gfx/shrink2.2bpp.lz" LinkMonStatsScreen: ; 4d319 ld a, [wMenuCursorY] dec a ld [CurPartyMon], a call LowVolume predef StatsScreenInit ld a, [CurPartyMon] inc a ld [wMenuCursorY], a call ClearScreen call ClearBGPalettes call MaxVolume callba LoadTradeScreenBorder callba Link_WaitBGMap callba InitTradeSpeciesList callba Function28eff call WaitBGMap2 ret Link_WaitBGMap: ; 4d354 call WaitBGMap call WaitBGMap2 ret LinkTextbox2: ; 4d35b ld h, d ld l, e push bc push hl call .PlaceBorder pop hl pop bc ld de, AttrMap - TileMap add hl, de inc b inc b inc c inc c ld a, $7 .row push bc push hl .col ld [hli], a dec c jr nz, .col pop hl ld de, SCREEN_WIDTH add hl, de pop bc dec b jr nz, .row ret .PlaceBorder: ; 4d37e push hl ld a, $76 ld [hli], a inc a call .PlaceRow inc a ld [hl], a pop hl ld de, SCREEN_WIDTH add hl, de .loop push hl ld a, "┌" ld [hli], a ld a, " " call .PlaceRow ld [hl], "─" pop hl ld de, SCREEN_WIDTH add hl, de dec b jr nz, .loop ld a, "┐" ld [hli], a ld a, "│" call .PlaceRow ld [hl], "└" ret .PlaceRow: ; 4d3ab ld d, c .row_loop ld [hli], a dec d jr nz, .row_loop ret _ResetClock: ; 4d3b1 callba BlankScreen ld b, SCGB_08 call GetSGBLayout call LoadStandardFont call LoadFontsExtra ld de, MUSIC_MAIN_MENU call PlayMusic ld hl, .text_askreset call PrintText ld hl, .NoYes_MenuDataHeader call CopyMenuDataHeader call VerticalMenu ret c ld a, [wMenuCursorY] cp $1 ret z call ClockResetPassword jr c, .wrongpassword ld a, BANK(sRTCStatusFlags) call GetSRAMBank ld a, $80 ld [sRTCStatusFlags], a call CloseSRAM ld hl, .text_okay call PrintText ret .wrongpassword ld hl, .text_wrong call PrintText ret .text_okay: ; 0x4d3fe ; Password OK. Select CONTINUE & reset settings. text_jump UnknownText_0x1c55db db "@" .text_wrong: ; 0x4d403 ; Wrong password! text_jump UnknownText_0x1c560b db "@" .text_askreset: ; 0x4d408 ; Reset the clock? text_jump UnknownText_0x1c561c db "@" .NoYes_MenuDataHeader: ; 0x4d40d db $00 ; flags db 07, 14 ; start coords db 11, 19 ; end coords dw .NoYes_MenuData2 db 1 ; default option .NoYes_MenuData2: ; 0x4d415 db $c0 ; flags db 2 ; items db "NO@" db "YES@" ClockResetPassword: ; 4d41e call .CalculatePassword push de ld hl, StringBuffer2 ld bc, 5 xor a call ByteFill ld a, $4 ld [StringBuffer2 + 5], a ld hl, .pleaseenterpasswordtext call PrintText .loop call .updateIDdisplay .loop2 call JoyTextDelay ld a, [hJoyLast] ld b, a and A_BUTTON jr nz, .confirm ld a, b and D_PAD jr z, .loop2 call .dpadinput ld c, 3 call DelayFrames jr .loop .confirm call .ConvertDecIDToBytes pop de ld a, e cp l jr nz, .nope ld a, d cp h jr nz, .nope and a ret .nope scf ret .pleaseenterpasswordtext: ; 0x4d463 ; Please enter the password. text_jump UnknownText_0x1c562e db "@" .updateIDdisplay: ; 4d468 hlcoord 14, 15 ld de, StringBuffer2 ld c, 5 .loop3 ld a, [de] add "0" ld [hli], a inc de dec c jr nz, .loop3 hlcoord 14, 16 ld bc, 5 ld a, " " call ByteFill hlcoord 14, 16 ld a, [StringBuffer2 + 5] ld e, a ld d, $0 add hl, de ld [hl], $61 ret .dpadinput: ; 4d490 ld a, b and D_LEFT jr nz, .left ld a, b and D_RIGHT jr nz, .right ld a, b and D_UP jr nz, .up ld a, b and D_DOWN jr nz, .down ret .left ld a, [StringBuffer2 + 5] and a ret z dec a ld [StringBuffer2 + 5], a ret .right ld a, [StringBuffer2 + 5] cp $4 ret z inc a ld [StringBuffer2 + 5], a ret .up call .getcurrentdigit ld a, [hl] cp 9 jr z, .wraparound_up inc a ld [hl], a ret .wraparound_up ld [hl], $0 ret .down call .getcurrentdigit ld a, [hl] and a jr z, .wraparound_down dec a ld [hl], a ret .wraparound_down ld [hl], 9 ret .getcurrentdigit: ; 4d4d5 ld a, [StringBuffer2 + 5] ld e, a ld d, $0 ld hl, StringBuffer2 add hl, de ret .ConvertDecIDToBytes: ; 4d4e0 ld hl, 0 ld de, StringBuffer2 + 4 ld bc, 1 call .ConvertToBytes ld bc, 10 call .ConvertToBytes ld bc, 100 call .ConvertToBytes ld bc, 1000 call .ConvertToBytes ld bc, 10000 .ConvertToBytes: ; 4d501 ld a, [de] dec de push hl ld hl, 0 call AddNTimes ld c, l ld b, h pop hl add hl, bc ret .CalculatePassword: ; 4d50f ld a, BANK(sPlayerData) call GetSRAMBank ld de, 0 ld hl, sPlayerData + (PlayerID - wPlayerData) ld c, $2 call .ComponentFromNumber ld hl, sPlayerData + (PlayerName - wPlayerData) ld c, $5 ; PLAYER_NAME_LENGTH_J call .ComponentFromString ld hl, sPlayerData + (Money - wPlayerData) ld c, $3 call .ComponentFromNumber call CloseSRAM ret .ComponentFromNumber: ; 4d533 ld a, [hli] add e ld e, a ld a, $0 adc d ld d, a dec c jr nz, .ComponentFromNumber ret .ComponentFromString: ; 4d53e ld a, [hli] cp "@" ret z add e ld e, a ld a, $0 adc d ld d, a dec c jr nz, .ComponentFromString ret _DeleteSaveData: ; 4d54c callba BlankScreen ld b, SCGB_08 call GetSGBLayout call LoadStandardFont call LoadFontsExtra ld de, MUSIC_MAIN_MENU call PlayMusic ld hl, .Text_ClearAllSaveData call PrintText ld hl, .NoYesMenuDataHeader call CopyMenuDataHeader call VerticalMenu ret c ld a, [wMenuCursorY] cp $1 ret z callba EmptyAllSRAMBanks ret .Text_ClearAllSaveData: ; 0x4d580 ; Clear all save data? text_jump UnknownText_0x1c564a db "@" .NoYesMenuDataHeader: ; 0x4d585 db $00 ; flags db 07, 14 ; start coords db 11, 19 ; end coords dw .MenuData2 db 1 ; default option .MenuData2: ; 0x4d58d db $c0 ; flags db 2 ; items db "NO@" db "YES@" Tilesets:: INCLUDE "tilesets/tileset_headers.asm" FlagPredef: ; 4d7c1 ; Perform action b on flag c in flag array hl. ; If checking a flag, check flag array d:hl unless d is 0. ; For longer flag arrays, see FlagAction. push hl push bc ; Divide by 8 to get the byte we want. push bc srl c srl c srl c ld b, 0 add hl, bc pop bc ; Which bit we want from the byte ld a, c and 7 ld c, a ; Shift left until we can mask the bit ld a, 1 jr z, .shifted .shift add a dec c jr nz, .shift .shifted ld c, a ; What are we doing to this flag? dec b jr z, .set ; 1 dec b jr z, .check ; 2 .reset ld a, c cpl and [hl] ld [hl], a jr .done .set ld a, [hl] or c ld [hl], a jr .done .check ld a, d cp 0 jr nz, .farcheck ld a, [hl] and c jr .done .farcheck call GetFarByte and c .done pop bc pop hl ld c, a ret GetTrademonFrontpic: ; 4d7fd ld a, [wOTTrademonSpecies] ld hl, wOTTrademonDVs ld de, VTiles2 push de push af predef GetUnownLetter pop af ld [CurPartySpecies], a ld [CurSpecies], a call GetBaseData pop de predef FrontpicPredef ret AnimateTrademonFrontpic: ; 4d81e ld a, [wOTTrademonSpecies] call IsAPokemon ret c callba Function29549 ld a, [wOTTrademonSpecies] ld [CurPartySpecies], a ld a, [wOTTrademonDVs] ld [TempMonDVs], a ld a, [wOTTrademonDVs + 1] ld [TempMonDVs + 1], a ld b, SCGB_1A call GetSGBLayout ld a, %11100100 ; 3,2,1,0 call DmgToCgbBGPals callba TradeAnim_ShowGetmonFrontpic ld a, [wOTTrademonSpecies] ld [CurPartySpecies], a hlcoord 7, 2 ld d, $0 ld e, ANIM_MON_TRADE predef AnimateFrontpic ret CheckPokerus: ; 4d860 ; Return carry if a monster in your party has Pokerus ; Get number of monsters to iterate over ld a, [PartyCount] and a jr z, .NoPokerus ld b, a ; Check each monster in the party for Pokerus ld hl, PartyMon1PokerusStatus ld de, PARTYMON_STRUCT_LENGTH .Check ld a, [hl] and $0f ; only the bottom nybble is used jr nz, .HasPokerus ; Next PartyMon add hl, de dec b jr nz, .Check .NoPokerus and a ret .HasPokerus 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 rept 3 add hl, bc endr 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 MobileFn_1060cd 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 Function51322 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 _FindGreaterThanThatLevel: ; 4dbd2 ld hl, PartyMon1Level call FindGreaterThanThatLevel ret _FindAtLeastThatHappy: ; 4dbd9 ld hl, PartyMon1Happiness call FindAtLeastThatHappy ret _FindThatSpecies: ; 4dbe0 ld hl, PartyMon1Species jp FindThatSpecies _FindThatSpeciesYourTrainerID: ; 4dbe6 ld hl, PartyMon1Species call FindThatSpecies ret z ld a, c ld hl, PartyMon1ID ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld a, [PlayerID] cp [hl] jr nz, .nope inc hl ld a, [PlayerID + 1] cp [hl] jr nz, .nope ld a, $1 and a ret .nope xor a ret FindAtLeastThatHappy: ; 4dc0a ; Sets the bits for the Pokemon that have a happiness greater than or equal to b. ; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy. ld c, $0 ld a, [PartyCount] ld d, a .loop ld a, d dec a push hl push bc ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes pop bc ld a, b cp [hl] pop hl jr z, .greater_equal jr nc, .lower .greater_equal ld a, c or $1 ld c, a .lower sla c dec d jr nz, .loop call RetroactivelyIgnoreEggs ld a, c and a ret FindGreaterThanThatLevel: ; 4dc31 ld c, $0 ld a, [PartyCount] ld d, a .loop ld a, d dec a push hl push bc ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes pop bc ld a, b cp [hl] pop hl jr c, .greater ld a, c or $1 ld c, a .greater sla c dec d jr nz, .loop call RetroactivelyIgnoreEggs ld a, c and a ret FindThatSpecies: ; 4dc56 ; Find species b in your party. ; If you have no Pokemon, returns c = -1 and z. ; If that species is in your party, returns its location in c, and nz. ; Otherwise, returns z. ld c, -1 ld hl, PartySpecies .loop ld a, [hli] cp -1 ret z inc c cp b jr nz, .loop ld a, $1 and a ret RetroactivelyIgnoreEggs: ; 4dc67 ld e, -2 ld hl, PartySpecies .loop ld a, [hli] cp -1 ret z cp EGG jr nz, .skip_notegg ld a, c and e ld c, a .skip_notegg rlc e jr .loop 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 "engine/evolution_animation.asm" Function4e881: ; 4e881 call ClearBGPalettes call ClearTileMap call ClearSprites call DisableLCD call LoadStandardFont call LoadFontsBattleExtra hlbgcoord 0, 0 ld bc, VBGMap1 - VBGMap0 ld a, " " call ByteFill hlcoord 0, 0, AttrMap ld bc, SCREEN_WIDTH * SCREEN_HEIGHT xor a call ByteFill xor a ld [hSCY], a ld [hSCX], a call EnableLCD ld hl, .SavingRecordDontTurnOff call PrintText call WaitBGMap2 call SetPalettes ret .SavingRecordDontTurnOff: ; 0x4e8bd ; SAVING RECORD… DON'T TURN OFF! text_jump UnknownText_0x1bd39e db "@" Function4e8c2: ; 4e8c2 call ClearBGPalettes call ClearTileMap call ClearSprites call DisableLCD call LoadStandardFont call LoadFontsBattleExtra hlbgcoord 0, 0 ld bc, VBGMap1 - VBGMap0 ld a, " " call ByteFill hlcoord 0, 0, AttrMap ld bc, SCREEN_WIDTH * SCREEN_HEIGHT xor a call ByteFill ld hl, wd000 ; UnknBGPals ld c, 4 * $10 .load_white_palettes ld a, (palred 31 + palgreen 31 + palblue 31) % $100 ld [hli], a ld a, (palred 31 + palgreen 31 + palblue 31) / $100 ld [hli], a dec c jr nz, .load_white_palettes xor a ld [hSCY], a ld [hSCX], a call EnableLCD call WaitBGMap2 call SetPalettes ret Function4e906: ; 4e906 ld a, [rSVBK] push af ld a, $6 ld [rSVBK], a ld hl, wDecompressScratch ld bc, wBackupAttrMap - wDecompressScratch ld a, " " call ByteFill hlbgcoord 0, 0 ld de, wDecompressScratch ld b, $0 ld c, $40 call Request2bpp pop af ld [rSVBK], a ret Function4e929: ; mobile function ld h, b ld l, c call Function4e930 ld c, a ret Function4e930: ; 4e930 ld a, [hli] xor [hl] ld c, a jr z, .skip_male_trainers srl c srl c .male_trainer_loop srl c ld a, c cp MaleTrainersEnd - MaleTrainers - 1 jr nc, .male_trainer_loop inc c .skip_male_trainers ld a, [de] cp $1 ld hl, MaleTrainers jr nz, .finished ld hl, FemaleTrainers ld a, c and a jr z, .finished .female_trainer_loop srl c ld a, c cp FemaleTrainersEnd - FemaleTrainers - 1 jr nc, .female_trainer_loop inc c .finished ld b, $0 add hl, bc ld a, [hl] ret MaleTrainers: ; 4e95d db BURGLAR db YOUNGSTER db SCHOOLBOY db BIRD_KEEPER db POKEMANIAC db GENTLEMAN db BUG_CATCHER db FISHER db SWIMMERM db SAILOR db SUPER_NERD db GUITARIST db HIKER db FIREBREATHER db BLACKBELT_T db PSYCHIC_T db CAMPER db COOLTRAINERM db BOARDER db JUGGLER db POKEFANM db OFFICER db SAGE db BIKER db SCIENTIST MaleTrainersEnd: FemaleTrainers: ; 4e976 db MEDIUM db LASS db BEAUTY db SKIER db TEACHER db SWIMMERF db PICNICKER db KIMONO_GIRL db POKEFANF db COOLTRAINERF FemaleTrainersEnd: INCLUDE "battle/sliding_intro.asm" Function4ea0a: ; 4ea0a ld a, c push af call SpeechTextBox call MobileTextBorder pop af dec a ld bc, $c ld hl, w5_dc1a call AddNTimes ld de, wcd53 ld bc, $c ld a, $5 ; BANK(w5_dc1a) call FarCopyWRAM ld a, [rSVBK] push af ld a, $1 ld [rSVBK], a ld bc, wcd53 decoord 1, 14 callba Function11c0c6 pop af ld [rSVBK], a ld c, 180 call DelayFrames ret CheckBattleScene: ; 4ea44 ; Return carry if battle scene is turned off. ld a, 0 ld hl, wLinkMode call GetFarWRAMByte cp LINK_MOBILE jr z, .mobile ld a, [Options] bit BATTLE_SCENE, a jr nz, .off and a ret .mobile ld a, [wcd2f] and a jr nz, .asm_4ea72 ld a, $4 call GetSRAMBank ld a, [$a60c] ld c, a call CloseSRAM ld a, c bit 0, c jr z, .off and a ret .asm_4ea72 ld a, $5 ld hl, w5_dc00 call GetFarWRAMByte bit 0, a jr z, .off and a ret .off scf ret INCLUDE "misc/gbc_only.asm" INCLUDE "event/poke_seer.asm" SECTION "bank14", ROMX, BANK[$14] INCLUDE "engine/party_menu.asm" INCLUDE "event/poisonstep.asm" INCLUDE "event/sweet_scent.asm" INCLUDE "event/squirtbottle.asm" INCLUDE "event/card_key.asm" INCLUDE "event/basement_key.asm" INCLUDE "event/sacred_ash.asm" CopyPkmnToTempMon: ; 5084a ; gets the BaseData of a Pkmn ; and copys the PkmnStructure to TempMon ld a, [CurPartyMon] ld e, a call GetPkmnSpecies ld a, [CurPartySpecies] ld [CurSpecies], a call GetBaseData ld a, [MonType] ld hl, PartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH and a jr z, .copywholestruct ld hl, OTPartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH cp OTPARTYMON jr z, .copywholestruct ld bc, BOXMON_STRUCT_LENGTH callab CopyBoxmonToTempMon jr .done .copywholestruct ld a, [CurPartyMon] call AddNTimes ld de, TempMon ld bc, PARTYMON_STRUCT_LENGTH call CopyBytes .done ret CalcwBufferMonStats: ; 5088b ld bc, wBufferMon jr _TempMonStatsCalculation CalcTempmonStats: ; 50890 ld bc, TempMon _TempMonStatsCalculation: ; 50893 ld hl, MON_LEVEL add hl, bc ld a, [hl] 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 push bc ld b, $1 predef CalcPkmnStats pop bc ld hl, MON_HP add hl, bc ld d, h ld e, l ld a, [CurPartySpecies] cp EGG jr nz, .not_egg xor a ld [de], a inc de ld [de], a jr .zero_status .not_egg push bc ld hl, MON_MAXHP add hl, bc ld bc, 2 call CopyBytes pop bc .zero_status ld hl, MON_STATUS add hl, bc xor a ld [hli], a ld [hl], a ret GetPkmnSpecies: ; 508d5 ; [MonType] has the type of the Pkmn ; e = Nr. of Pkmn (i.e. [CurPartyMon]) ld a, [MonType] and a ; PARTYMON jr z, .partymon cp OTPARTYMON jr z, .otpartymon cp BOXMON jr z, .boxmon cp BREEDMON jr z, .breedmon ; WILDMON .partymon ld hl, PartySpecies jr .done .otpartymon ld hl, OTPartySpecies jr .done .boxmon ld a, BANK(sBoxSpecies) call GetSRAMBank ld hl, sBoxSpecies call .done call CloseSRAM ret .breedmon ld a, [wBreedMon1Species] jr .done2 .done ld d, 0 add hl, de ld a, [hl] .done2 ld [CurPartySpecies], a ret INCLUDE "text/types.asm" Function50a28: ; 50a28 ld hl, Strings50a42 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 Strings50a42: ; 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 ld a, [MonType] cp BOXMON jr z, .asm_50b30 ld a, [TempMonHP] ld b, a ld a, [TempMonHP + 1] ld c, a ; Any HP? or b jr nz, .asm_50b30 xor a ld c, a ld e, a ld a, 6 ld d, a jp .asm_50b4a .asm_50b30 ld a, [TempMonMaxHP] ld d, a ld a, [TempMonMaxHP + 1] ld e, a ld a, [MonType] cp BOXMON jr nz, .asm_50b41 ld b, d ld c, e .asm_50b41 predef ComputeHPBarPixels ld a, 6 ld d, a ld c, a .asm_50b4a ld a, c pop bc ld c, a pop hl push de push hl push hl call DrawBattleHPBar pop hl ; Print HP ld bc, $15 ; move (1,1) add hl, bc ld de, TempMonHP ld a, [MonType] cp BOXMON jr nz, .asm_50b66 ld de, TempMonMaxHP .asm_50b66 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 + BaseGender - CurBaseData ld bc, BaseData1 - BaseData call AddNTimes pop bc ld a, BANK(BaseData) call GetFarByte ; The higher the ratio, the more likely the monster is to be female. cp $ff jr z, .Genderless and a jr z, .Male cp $fe 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 rept 3 inc hl endr 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 .asm_50cd0 ld [hl], $32 inc hl ld [hl], $3e dec hl add hl, de dec c jr nz, .asm_50cd0 ret Function50cdb: ; 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, .asm_50d09 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 .asm_50d09 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 Function50db9: ; 50db9 ld a, [wd263] cp $1 jr nz, .check_party_ot_name ld hl, OTPartyCount ld de, OTPartyMonOT ld a, ENEMY_OT_NAME jr .done .check_party_ot_name cp $4 jr nz, .check_mon_name ld hl, PartyCount ld de, PartyMonOT ld a, PARTY_OT_NAME jr .done .check_mon_name cp $5 jr nz, .check_item_name ld hl, CurMart ld de, PokemonNames ld a, PKMN_NAME jr .done .check_item_name cp $2 jr nz, .check_ob_item_name ld hl, NumItems ld de, ItemNames ld a, ITEM_NAME jr .done .check_ob_item_name ld hl, CurMart ld de, ItemNames ld a, ITEM_NAME .done ld [wNamedObjectTypeBuffer], a ld a, l ld [wd100], a ld a, h ld [wd101], a ld a, e ld [wd102], a ld a, d ld [wd103], a ld bc, ItemAttributes ld a, c ld [wd104], a ld a, b ld [wd105], 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 GrowthRates: ; 50efa growth_rate: MACRO ; [1]/[2]*n**3 + [3]*n**2 + [4]*n - [5] dn \1, \2 if \3 & $80 ; signed db -\3 | $80 else db \3 endc db \4, \5 ENDM growth_rate 1, 1, 0, 0, 0 ; Medium Fast growth_rate 3, 4, 10, 0, 30 ; Slightly Fast growth_rate 3, 4, 20, 0, 70 ; Slightly Slow growth_rate 6, 5, -15, 100, 140 ; Medium Slow growth_rate 4, 5, 0, 0, 0 ; Fast growth_rate 5, 4, 0, 0, 0 ; Slow _SwitchPartyMons: ld a, [wd0e3] dec a ld [Buffer3], a ld b, a ld a, [wMenuCursorY] dec a ld [Buffer2], a ; wd1eb (aliases: MovementType) cp b jr z, .skip call .SwapMonAndMail ld a, [Buffer3] call .ClearSprite ld a, [Buffer2] ; wd1eb (aliases: MovementType) call .ClearSprite .skip ret .ClearSprite: ; 50f34 (14:4f34) push af hlcoord 0, 1 ld bc, 2 * SCREEN_WIDTH call AddNTimes ld bc, 2 * SCREEN_WIDTH ld a, " " call ByteFill pop af ld hl, Sprites ld bc, $10 call AddNTimes ld de, $4 ld c, $4 .gfx_loop ld [hl], $a0 add hl, de dec c jr nz, .gfx_loop ld de, SFX_SWITCH_POKEMON call WaitPlaySFX ret .SwapMonAndMail: ; 50f62 (14:4f62) push hl push de push bc ld bc, PartySpecies ld a, [Buffer2] ; wd1eb (aliases: MovementType) ld l, a ld h, $0 add hl, bc ld d, h ld e, l ld a, [Buffer3] ld l, a ld h, $0 add hl, bc ld a, [hl] push af ld a, [de] ld [hl], a pop af ld [de], a ld a, [Buffer2] ; wd1eb (aliases: MovementType) ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species) ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes push hl ld de, wd002 ld bc, PARTYMON_STRUCT_LENGTH call CopyBytes ld a, [Buffer3] ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species) ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes pop de push hl ld bc, PARTYMON_STRUCT_LENGTH call CopyBytes pop de ld hl, wd002 ld bc, PARTYMON_STRUCT_LENGTH call CopyBytes ld a, [Buffer2] ; wd1eb (aliases: MovementType) ld hl, PartyMonOT call SkipNames push hl call .CopyNameTowd002 ld a, [Buffer3] ld hl, PartyMonOT call SkipNames pop de push hl call .CopyName pop de ld hl, wd002 call .CopyName ld hl, PartyMonNicknames ld a, [Buffer2] ; wd1eb (aliases: MovementType) call SkipNames push hl call .CopyNameTowd002 ld hl, PartyMonNicknames ld a, [Buffer3] call SkipNames pop de push hl call .CopyName pop de ld hl, wd002 call .CopyName ld hl, sPartyMail ld a, [Buffer2] ; wd1eb (aliases: MovementType) ld bc, MAIL_STRUCT_LENGTH call AddNTimes push hl ld de, wd002 ld bc, MAIL_STRUCT_LENGTH ld a, BANK(sPartyMail) call GetSRAMBank call CopyBytes ld hl, sPartyMail ld a, [Buffer3] ld bc, MAIL_STRUCT_LENGTH call AddNTimes pop de push hl ld bc, MAIL_STRUCT_LENGTH call CopyBytes pop de ld hl, wd002 ld bc, MAIL_STRUCT_LENGTH call CopyBytes call CloseSRAM pop bc pop de pop hl ret .CopyNameTowd002: ; 51036 (14:5036) ld de, wd002 .CopyName: ; 51039 (14:5039) ld bc, NAME_LENGTH call CopyBytes ret INCLUDE "gfx/load_pics.asm" Function51322: ; 51322 ld a, BANK(sBoxCount) call GetSRAMBank ld hl, sBoxCount call Function513cb ld a, [sBoxCount] dec a ld [wd265], a ld hl, sBoxMonNicknames ld bc, PKMN_NAME_LENGTH ld de, wBufferMonNick call Function513e0 ld a, [sBoxCount] dec a ld [wd265], a ld hl, sBoxMonOT ld bc, NAME_LENGTH ld de, wBufferMonOT call Function513e0 ld a, [sBoxCount] dec a ld [wd265], a ld hl, sBoxMons ld bc, BOXMON_STRUCT_LENGTH ld de, wBufferMon call Function513e0 ld hl, wBufferMonMoves ld de, TempMonMoves ld bc, NUM_MOVES call CopyBytes ld hl, wBufferMonPP ld de, TempMonPP ld bc, NUM_MOVES call CopyBytes ld a, [CurPartyMon] ld b, a callba Functiondcb6 jp CloseSRAM Function5138b: ; 5138b ld hl, PartyCount call Function513cb ld a, [PartyCount] dec a ld [wd265], a ld hl, PartyMonNicknames ld bc, PKMN_NAME_LENGTH ld de, wBufferMonNick call Function513e0 ld a, [PartyCount] dec a ld [wd265], a ld hl, PartyMonOT ld bc, NAME_LENGTH ld de, wBufferMonOT call Function513e0 ld a, [PartyCount] dec a ld [wd265], a ld hl, PartyMons ld bc, PARTYMON_STRUCT_LENGTH ld de, wBufferMon call Function513e0 ret Function513cb: ; 513cb inc [hl] inc hl ld a, [CurPartyMon] ld c, a ld b, 0 add hl, bc ld a, [CurPartySpecies] ld c, a .asm_513d8 ld a, [hl] ld [hl], c inc hl inc c ld c, a jr nz, .asm_513d8 ret Function513e0: ; 513e0 push de push hl push bc ld a, [wd265] dec a call AddNTimes push hl add hl, bc ld d, h ld e, l pop hl .asm_513ef push bc ld a, [wd265] ld b, a ld a, [CurPartyMon] cp b pop bc jr z, .asm_51415 push hl push de push bc call CopyBytes pop bc pop de pop hl push hl ld a, l sub c ld l, a ld a, h sbc b ld h, a pop de ld a, [wd265] dec a ld [wd265], a jr .asm_513ef .asm_51415 pop bc pop hl ld a, [CurPartyMon] call AddNTimes ld d, h ld e, l pop hl call CopyBytes ret BaseData:: INCLUDE "data/base_stats.asm" PokemonNames:: INCLUDE "data/pokemon_names.asm" Unknown_53d84: ; unreferenced db $1a, $15 db $33, $16 db $4b, $17 db $62, $18 db $79, $19 db $90, $1a db $a8, $1b db $c4, $1c db $e0, $1d db $f6, $1e db $ff, $1f db $ff, $20 UnknownEggPic:: ; 53d9c ; Another egg pic. This is shifted up a few pixels. INCBIN "gfx/misc/unknown_egg.5x5.2bpp.lz" SECTION "bank19", ROMX, BANK[$19] INCLUDE "text/phone/extra.asm" SECTION "bank20", ROMX, BANK[$20] INCLUDE "engine/player_movement.asm" INCLUDE "engine/engine_flags.asm" INCLUDE "engine/variables.asm" BattleText:: INCLUDE "text/battle.asm" INCLUDE "engine/debug.asm" SECTION "bank21", ROMX, BANK[$21] INCLUDE "engine/printer.asm" INCLUDE "battle/anim_gfx.asm" INCLUDE "event/halloffame.asm" SECTION "bank22", ROMX, BANK[$22] INCLUDE "event/kurt.asm" Function88248: ; 88248 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/misc/chris_card.5x7.2bpp" KrisCardPic: ; 88595 INCBIN "gfx/misc/kris_card.5x7.2bpp" CardGFX: ; 887c5 INCBIN "gfx/misc/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/misc/chris.7x7.2bpp" KrisPic: ; 88bb9 INCBIN "gfx/misc/kris.7x7.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/misc/kris_back.6x6.2bpp" String_89116: db "-----@" INCLUDE "misc/mobile_22.asm" INCLUDE "event/unown.asm" INCLUDE "event/buena.asm" INCLUDE "event/dratini.asm" INCLUDE "event/battle_tower.asm" INCLUDE "misc/mobile_22_2.asm" SECTION "bank23", ROMX, BANK[$23] Predef35: ; 8c000 Predef36: ret INCLUDE "engine/timeofdaypals.asm" INCLUDE "engine/battle_start.asm" Function8c7c9: ; unreferenced ld a, $1 ld [hBGMapMode], a call WaitBGMap xor a ld [hBGMapMode], a ret INCLUDE "event/field_moves.asm" INCLUDE "event/magnet_train.asm" Function8cf4f: ; 8cf4f call Function3238 ret INCLUDE "engine/sprites.asm" INCLUDE "engine/mon_icons.asm" SECTION "bank24", ROMX, BANK[$24] INCLUDE "engine/phone.asm" INCLUDE "engine/timeset.asm" INCLUDE "engine/pokegear.asm" INCLUDE "data/wild/fish.asm" INCLUDE "engine/slot_machine.asm" SECTION "Phone Engine", ROMX, BANK[$28] INCLUDE "engine/more_phone_scripts.asm" INCLUDE "engine/buena_phone_scripts.asm" SECTION "Phone Text", ROMX, BANK[$29] INCLUDE "text/phone/anthony_overworld.asm" INCLUDE "text/phone/todd_overworld.asm" INCLUDE "text/phone/gina_overworld.asm" INCLUDE "text/phone/irwin_overworld.asm" INCLUDE "text/phone/arnie_overworld.asm" INCLUDE "text/phone/alan_overworld.asm" INCLUDE "text/phone/dana_overworld.asm" INCLUDE "text/phone/chad_overworld.asm" INCLUDE "text/phone/derek_overworld.asm" INCLUDE "text/phone/tully_overworld.asm" INCLUDE "text/phone/brent_overworld.asm" INCLUDE "text/phone/tiffany_overworld.asm" INCLUDE "text/phone/vance_overworld.asm" INCLUDE "text/phone/wilton_overworld.asm" INCLUDE "text/phone/kenji_overworld.asm" INCLUDE "text/phone/parry_overworld.asm" INCLUDE "text/phone/erin_overworld.asm" SECTION "Tileset Data 5", ROMX, BANK[TILESETS_5] INCLUDE "tilesets/data_5.asm" SECTION "bank2E", ROMX, BANK[$2E] INCLUDE "engine/events_3.asm" INCLUDE "engine/radio.asm" INCLUDE "gfx/mail.asm" SECTION "bank2F", ROMX, BANK[$2F] 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 SECTION "bank30", ROMX, BANK[$30] INCLUDE "gfx/overworld/sprites_1.asm" SECTION "bank31", ROMX, BANK[$31] INCLUDE "gfx/overworld/sprites_2.asm" SECTION "bank32", ROMX, BANK[$32] INCLUDE "battle/bg_effects.asm" INCLUDE "battle/anims.asm" LoadPoisonBGPals: ; cbcdd call .LoadPals ld a, [hCGB] and a ret nz ret .LoadPals: ; cbce5 ld a, [hCGB] and a jr nz, .cgb ld a, [TimeOfDayPal] and $3 cp $3 ld a, $0 jr z, .convert_pals ld a, $aa .convert_pals call DmgToCgbBGPals ld c, 4 call DelayFrames callba _UpdateTimePals ret .cgb ld a, [rSVBK] push af ld a, $5 ld [rSVBK], a ld hl, BGPals ld c, $20 .loop ; RGB 31, 21, 28 ld a, (palred 31 + palgreen 21 + palblue 28) % $100 ld [hli], a ld a, (palred 31 + palgreen 21 + palblue 28) / $100 ld [hli], a dec c jr nz, .loop pop af ld [rSVBK], a ld a, $1 ld [hCGBPalUpdate], a ld c, 4 call DelayFrames callba _UpdateTimePals ret TheEndGFX:: ; cbd2e INCBIN "gfx/credits/theend.2bpp" SECTION "bank33", ROMX, BANK[$33] 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_08 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 "battle/anim_commands.asm" INCLUDE "battle/anim_objects.asm" SECTION "Pic Animations 1", ROMX, BANK[$34] INCLUDE "gfx/pics/animation.asm" ; Pic animations are assembled in 3 parts: ; Top-level animations: ; frame #, duration: Frame 0 is the original pic (no change) ; setrepeat #: Sets the number of times to repeat ; dorepeat #: Repeats from command # (starting from 0) ; end ; Bitmasks: ; Layered over the pic to designate affected tiles ; Frame definitions: ; first byte is the bitmask used for this frame ; following bytes are tile ids mapped to each bit in the mask ; Main animations (played everywhere) INCLUDE "gfx/pics/anim_pointers.asm" INCLUDE "gfx/pics/anims.asm" ; Extra animations, appended to the main animation ; Used in the status screen (blinking, tail wags etc.) INCLUDE "gfx/pics/extra_pointers.asm" INCLUDE "gfx/pics/extras.asm" ; Unown has its own animation data despite having an entry in the main tables INCLUDE "gfx/pics/unown_anim_pointers.asm" INCLUDE "gfx/pics/unown_anims.asm" INCLUDE "gfx/pics/unown_extra_pointers.asm" INCLUDE "gfx/pics/unown_extras.asm" ; Bitmasks INCLUDE "gfx/pics/bitmask_pointers.asm" INCLUDE "gfx/pics/bitmasks.asm" INCLUDE "gfx/pics/unown_bitmask_pointers.asm" INCLUDE "gfx/pics/unown_bitmasks.asm" SECTION "Pic Animations 2", ROMX, BANK[$35] INCLUDE "gfx/pics/frame_pointers.asm" INCLUDE "gfx/pics/kanto_frames.asm" SECTION "bank36", ROMX, BANK[$36] FontInversed: INCBIN "gfx/misc/font_inversed.1bpp" SECTION "Pic Animations 3", ROMX, BANK[$36] INCLUDE "gfx/pics/johto_frames.asm" INCLUDE "gfx/pics/unown_frame_pointers.asm" INCLUDE "gfx/pics/unown_frames.asm" SECTION "Tileset Data 6", ROMX, BANK[TILESETS_6] INCLUDE "tilesets/data_6.asm" SECTION "bank38", ROMX, BANK[$38] Functione0000: ; e0000 ; something to do with Unown printer push de xor a call GetSRAMBank ld hl, sScratch ld bc, 0 .loop push bc push hl push bc ld de, wd002 call .Copy call .Decompress ld hl, Unknown_e008b pop bc add hl, bc add hl, bc ld a, [hli] ld e, a ld d, [hl] ld hl, wd012 call .Copy pop hl ld bc, $10 add hl, bc pop bc inc c ld a, c cp $31 jr c, .loop ld hl, OverworldMap ld de, sScratch ld bc, $31 tiles call CopyBytes pop hl ld de, sScratch ld c, $31 ld a, [hROMBank] ld b, a call Get2bpp call CloseSRAM ret .Copy: ; e004e ld c, $10 .loop_copy ld a, [hli] ld [de], a inc de dec c jr nz, .loop_copy ret .Decompress: ; e0057 ld hl, wd012 ld e, %10000000 ld d, 8 .loop_decompress push hl ld hl, wd002 call .CountSetBit pop hl ld a, b ld [hli], a push hl ld hl, wd003 call .CountSetBit pop hl ld a, b ld [hli], a srl e dec d jr nz, .loop_decompress ret .CountSetBit: ; e0078 ld b, 0 ld c, 8 .loop_count ld a, [hli] and e jr z, .clear scf jr .apply .clear and a .apply rr b inc hl dec c jr nz, .loop_count ret overworldmaptile EQUS "dw OverworldMap + $10 *" overworldmaprect: MACRO y = 0 rept \1 x = \1 * (\2 +- 1) + y rept \2 overworldmaptile x x = x +- \2 endr y = y + 1 endr endm Unknown_e008b: ; e008b overworldmaprect 7, 7 Unknown_e00ed: ; Graphics for an unused Game Corner ; game were meant to be here. ret_e00ed: ; e00ed (38:40ed) ; How many coins? ret INCLUDE "engine/card_flip.asm" INCLUDE "engine/unown_puzzle.asm" INCLUDE "engine/dummy_game.asm" INCLUDE "engine/billspc.asm" SECTION "bank39", ROMX, BANK[$39] CopyrightGFX:: ; e4000 INCBIN "gfx/misc/copyright.2bpp" INCLUDE "engine/options_menu.asm" INCLUDE "engine/crystal_intro.asm" SECTION "bank3E", ROMX, BANK[$3E] INCLUDE "gfx/font.asm" INCLUDE "engine/time_capsule/conversion.asm" INCLUDE "engine/unowndex.asm" INCLUDE "event/magikarp.asm" INCLUDE "battle/hidden_power.asm" INCLUDE "battle/misc.asm" SECTION "bank3F", ROMX, BANK[$3F] INCLUDE "tilesets/animations.asm" INCLUDE "engine/npctrade.asm" INCLUDE "event/mom_phone.asm" SECTION "bank40", ROMX, BANK[$40] INCLUDE "misc/mobile_40.asm" SECTION "bank41", ROMX, BANK[$41] INCLUDE "misc/gfx_41.asm" INCLUDE "engine/warp_connection.asm" INCLUDE "engine/mysterygift.asm" INCLUDE "battle/used_move_text.asm" INCLUDE "misc/mobile_41.asm" SECTION "bank42", ROMX, BANK[$42] INCLUDE "misc/mobile_42.asm" SECTION "Intro Logo", ROMX, BANK[$42] IntroLogoGFX: ; 109407 INCBIN "gfx/intro/logo.2bpp.lz" INCLUDE "misc/unused_title.asm" INCLUDE "engine/title.asm" INCLUDE "misc/mobile_45.asm" INCLUDE "misc/mobile_46.asm" SECTION "bank47", ROMX, BANK[$47] INCLUDE "misc/battle_tower_47.asm" SECTION "bank5B", ROMX, BANK[$5B] INCLUDE "misc/mobile_5b.asm" INCLUDE "engine/link_trade.asm" SECTION "bank5C", ROMX, BANK[$5C] INCLUDE "misc/mobile_5c.asm" SECTION "bank5D", ROMX, BANK[$5D] INCLUDE "text/phone/extra3.asm" SECTION "bank5E", ROMX, BANK[$5E] _UpdateBattleHUDs: callba DrawPlayerHUD ld hl, PlayerHPPal call SetHPPal callba DrawEnemyHUD ld hl, EnemyHPPal call SetHPPal callba FinishBattleAnim ret INCLUDE "misc/mobile_5f.asm" SECTION "Common Text 1", ROMX, BANK[$6C] INCLUDE "text/stdtext.asm" INCLUDE "text/phone/jack_overworld.asm" INCLUDE "text/phone/beverly_overworld.asm" INCLUDE "text/phone/huey_overworld.asm" INCLUDE "text/phone/gaven_overworld.asm" INCLUDE "text/phone/beth_overworld.asm" INCLUDE "text/phone/jose_overworld.asm" INCLUDE "text/phone/reena_overworld.asm" INCLUDE "text/phone/joey_overworld.asm" INCLUDE "text/phone/wade_overworld.asm" INCLUDE "text/phone/ralph_overworld.asm" INCLUDE "text/phone/liz_overworld.asm" SECTION "bank6D", ROMX, BANK[$6D] INCLUDE "text/phone/mom.asm" INCLUDE "text/phone/bill.asm" INCLUDE "text/phone/elm.asm" INCLUDE "text/phone/trainers1.asm" SECTION "bank72", ROMX, BANK[$72] ItemNames:: INCLUDE "items/item_names.asm" INCLUDE "items/item_descriptions.asm" MoveNames:: INCLUDE "battle/move_names.asm" INCLUDE "engine/landmarks.asm" SECTION "bank77", ROMX, BANK[$77] UnownFont: ; 1dc000 INCBIN "gfx/misc/unown_font.2bpp" INCLUDE "misc/printer_77.asm" MobileHPIcon: ; 1dc591 INCBIN "gfx/mobile/hp.1bpp" MobileLvIcon: ; 1dc599 INCBIN "gfx/mobile/lv.1bpp" SECTION "Tileset Data 7", ROMX, BANK[TILESETS_7] INCLUDE "tilesets/data_7.asm" SECTION "bank77_2", ROMX, BANK[$77] Function1dd6a9: ; 1dd6a9 ld a, b ld b, c ld c, a push bc push de ld hl, [sp+$2] ld d, h ld e, l pop hl lb bc, PRINTNUM_LEADINGZEROS | 2, 5 call PrintNum pop bc ret PrintHoursMins ; 1dd6bb (77:56bb) ; Hours in b, minutes in c ld a, b cp 12 push af jr c, .AM jr z, .PM sub 12 jr .PM .AM or a jr nz, .PM ld a, 12 .PM ld b, a ; Crazy stuff happening with the stack push bc ld hl, [sp+$1] push de push hl pop de pop hl ld [hl], " " lb bc, 1, 2 call PrintNum ld [hl], ":" inc hl ld d, h ld e, l ld hl, [sp+$0] push de push hl pop de pop hl lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum pop bc ld de, String_AM pop af jr c, .place_am_pm ld de, String_PM .place_am_pm inc hl call PlaceString ret String_AM: db "AM@" ; 1dd6fc String_PM: db "PM@" ; 1dd6ff INCLUDE "engine/diploma.asm" LoadSGBPokedexGFX: ; 1ddf1c ld hl, LZ_1ddf33 ld de, VTiles2 tile $31 call Decompress ret Function1ddf26: ; 1ddf26 (77:5f26) ld hl, LZ_1ddf33 ld de, VTiles2 tile $31 lb bc, BANK(LZ_1ddf33), $3a call DecompressRequest2bpp ret LZ_1ddf33: ; 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" ; (### 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 Function1de2c5: ; 1de2c5 ld hl, StringBuffer1 .loop ld a, [hl] cp "@" jr z, .end cp "%" jr z, .line_break cp "¯" jr z, .line_break inc hl jr .loop .line_break ld [hl], "" .end ld de, StringBuffer1 hlcoord 9, 0 call PlaceString ret PokegearGFX: ; 1de2e4 INCBIN "gfx/misc/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 SECTION "Tileset Data 8", ROMX, BANK[TILESETS_8] INCLUDE "tilesets/data_8.asm" SECTION "bank7B", ROMX, BANK[$7B] INCLUDE "text/battle_tower.asm" SECTION "bank7C", ROMX, BANK[$7C] INCLUDE "data/battle_tower_2.asm" SECTION "bank7D", ROMX, BANK[$7D] db $cc, $6b, $1e ; XXX Function1f4003: ; 1f4003 ld a, $6 call GetSRAMBank ld hl, Unknown_1f4018 ld de, $a000 ld bc, $1000 call CopyBytes call CloseSRAM ret Unknown_1f4018: INCBIN "unknown/1f4018.bin" Function1f4dbe: ; 1f4dbe ld a, $6 call GetSRAMBank ld hl, Unknown_1f4dd3 ld de, $a000 ld bc, $1000 call CopyBytes call CloseSRAM ret Unknown_1f4dd3: INCBIN "unknown/1f4dd3.bin" Function1f5d9f: ; 1f5d9f ld a, $6 call GetSRAMBank ld hl, Unknown_1f5db4 ld de, $a000 ld bc, $1000 call CopyBytes call CloseSRAM ret Unknown_1f5db4: INCBIN "unknown/1f5db4.bin" SECTION "bank7E", ROMX, BANK[$7E] INCLUDE "data/battle_tower.asm" INCLUDE "data/odd_eggs.asm" SECTION "bank7F", ROMX, BANK[$7F] SECTION "stadium2", ROMX[$8000-$220], BANK[$7F] IF DEF(CRYSTAL11) INCBIN "misc/stadium2_2.bin" ELSE INCBIN "misc/stadium2_1.bin" ENDC