diff options
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/events/overworld.asm | 20 | ||||
-rwxr-xr-x | engine/events/specials.asm | 2 | ||||
-rw-r--r-- | engine/menus/intro_menu.asm | 8 | ||||
-rw-r--r-- | engine/menus/naming_screen.asm | 6 | ||||
-rwxr-xr-x | engine/overworld/map_object_action.asm | 2 | ||||
-rw-r--r-- | engine/overworld/overworld.asm | 504 | ||||
-rwxr-xr-x | engine/overworld/player_movement.asm | 2 | ||||
-rwxr-xr-x | engine/overworld/time.asm | 4 | ||||
-rw-r--r-- | engine/rtc/rtc.asm | 210 |
9 files changed, 736 insertions, 22 deletions
diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm index 086587b2..f4e420bb 100755 --- a/engine/events/overworld.asm +++ b/engine/events/overworld.asm @@ -416,7 +416,7 @@ UsedSurfScript: closetext readmem wBuffer2 writevar VAR_MOVEMENT - special ReplacePlayerSprite + special ReplaceChrisSprite special PlayMapMusic ; step into the water (slow_step DIR, step_end) special SurfStartStep @@ -537,7 +537,7 @@ TryToFly: ld de, ENGINE_STORMBADGE call FieldMoveBadgeCheck jr c, .asm_caa4 - call GetMapPermission + call GetMapEnvironment call CheckOutdoorMap jr z, .asm_ca83 jr .asm_caa7 @@ -597,7 +597,7 @@ FlyScript: newloadmap MAPSETUP_TELEPORT callasm FlyToAnimation special WaitSFX - special ReplacePlayerSprite + special ReplaceChrisSprite callasm Function1415c end @@ -737,7 +737,7 @@ asm_cbaa: dw FailToEscapeFromDungeon TryEscapeFromDungeon: - call GetMapPermission + call GetMapEnvironment cp CAVE jr z, .asm_cbcf cp DUNGEON @@ -853,7 +853,7 @@ TeleportFunction: dw FailTeleport TryTeleport: - call GetMapPermission + call GetMapEnvironment call CheckOutdoorMap jr z, .asm_cc85 jr .asm_cc9c @@ -1556,7 +1556,7 @@ PutTheRodAway: ; d096 ld a, $1 ld [wPlayerAction], a call UpdateSprites - call ReplacePlayerSprite + call ReplaceChrisSprite ret Text_OhABite: @@ -1637,7 +1637,7 @@ ChooseScriptBasedOnWhetherBikeIsRegistered: ; d126 (3:5126) ret CheckBikePermission: ; d12e (3:512e) - call GetMapPermission + call GetMapEnvironment call CheckOutdoorMap jr z, .asm_d140 cp CAVE @@ -1664,13 +1664,13 @@ Script_GetOnBike: ; d14b writetext GotOnBikeText waitbutton closetext - special ReplacePlayerSprite + special ReplaceChrisSprite end Script_GetOnBike_Register: loadvar VAR_MOVEMENT, PLAYER_BIKE closetext - special ReplacePlayerSprite + special ReplaceChrisSprite end nop @@ -1684,7 +1684,7 @@ Script_GetOffBike: waitbutton FinishGettingOffBike: closetext - special ReplacePlayerSprite + special ReplaceChrisSprite special PlayMapMusic end diff --git a/engine/events/specials.asm b/engine/events/specials.asm index 770b8cfb..8b7243d1 100755 --- a/engine/events/specials.asm +++ b/engine/events/specials.asm @@ -85,7 +85,7 @@ SpecialsPointers: add_special UpdateTimePals add_special ClearTilemap add_special UpdateSprites - add_special ReplacePlayerSprite + add_special ReplaceChrisSprite add_special GameCornerPrizeMonCheckDex add_special UnusedSetSeenMon add_special WaitSFX, $03 diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm index 41b93708..763b4fbb 100644 --- a/engine/menus/intro_menu.asm +++ b/engine/menus/intro_menu.asm @@ -961,7 +961,7 @@ ShrinkPlayer: ; 6123 (1:6123) ld c, 3 call DelayFrames - call Intro_PlacePlayerSprite + call Intro_PlaceChrisSprite call LoadFontsExtra ld c, 50 @@ -1059,9 +1059,9 @@ ShrinkFrame: ; 61f7 (1:61f7) predef PlaceGraphic ret -Intro_PlacePlayerSprite: ; 6210 (1:6210) - ld de, PlayerSpriteGFX - lb bc, BANK(PlayerSpriteGFX), 12 +Intro_PlaceChrisSprite: ; 6210 (1:6210) + ld de, ChrisSpriteGFX + lb bc, BANK(ChrisSpriteGFX), 12 ld hl, $8000 call Request2bpp ld hl, wVirtualOAM diff --git a/engine/menus/naming_screen.asm b/engine/menus/naming_screen.asm index d5b35a8e..55c6ca82 100644 --- a/engine/menus/naming_screen.asm +++ b/engine/menus/naming_screen.asm @@ -112,7 +112,7 @@ Function11b2a: db "NICKNAME?@" Function11b79: - ld de, PlayerSpriteGFX ; $4000 + ld de, ChrisSpriteGFX ; $4000 call Function11c11 hlcoord 5, 2 ld de, .String @@ -174,7 +174,7 @@ Function11bda: Function11c11: ; 11c11 (4:5c11) push de ld hl, $8000 - lb bc, BANK(PlayerSpriteGFX), 4 + lb bc, BANK(ChrisSpriteGFX), 4 call Request2bpp pop de ld hl, $c0 @@ -182,7 +182,7 @@ Function11c11: ; 11c11 (4:5c11) ld e, l ld d, h ld hl, $8040 - lb bc, BANK(PlayerSpriteGFX), 4 + lb bc, BANK(ChrisSpriteGFX), 4 call Request2bpp xor a ld hl, wMisc diff --git a/engine/overworld/map_object_action.asm b/engine/overworld/map_object_action.asm index f895fe15..7701ec4f 100755 --- a/engine/overworld/map_object_action.asm +++ b/engine/overworld/map_object_action.asm @@ -216,7 +216,7 @@ Function4597: ret Function459e: - ld a, [wd558] + ld a, [wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS] ld d, $17 cp $33 jr z, .asm_45ad diff --git a/engine/overworld/overworld.asm b/engine/overworld/overworld.asm new file mode 100644 index 00000000..fec0b95a --- /dev/null +++ b/engine/overworld/overworld.asm @@ -0,0 +1,504 @@ +_ReplaceChrisSprite:: + call GetChrisSprite + ld a, [wUsedSprites] + ld c, a + ld a, [wUsedSprites + 1] + ld b, a + call GetUsedSprite + ret + +Function1414b:: + ld hl, wSpriteFlags + ld a, [hl] + push af + res 7, [hl] + set 6, [hl] + call LoadUsedSpritesGFX + pop af + ld [wSpriteFlags], a + ret + +Function1415c:: + ld hl, wSpriteFlags + ld a, [hl] + push af + set 7, [hl] + res 6, [hl] + call LoadUsedSpritesGFX + pop af + ld [wSpriteFlags], a + ret + +RefreshSprites:: + call .Refresh + call LoadUsedSpritesGFX + ret + +.Refresh: + xor a + ld bc, SPRITE_GFX_LIST_CAPACITY * 2 + ld hl, wUsedSprites + call ByteFill + call GetChrisSprite + call AddMapSprites + ret + +GetChrisSprite: + ld a, [wPlayerState] + ld c, a +; Get Chris's sprite. + ld hl, ChrisStateSprites +.loop + ld a, [hli] + cp c + jr z, .good + inc hl + cp -1 + jr nz, .loop + +; Any player state not in the array defaults to Chris's sprite. + xor a ; ld a, PLAYER_NORMAL + ld [wPlayerState], a + ld a, SPRITE_CHRIS + jr .finish + +.good + ld a, [hl] + +.finish + ld [wUsedSprites + 0], a + ld [wPlayerSprite], a + ld [wPlayerObjectSprite], a + ret + +INCLUDE "data/sprites/player_sprites.asm" + +AddMapSprites: + call GetMapEnvironment + call CheckOutdoorMap + jr z, .outdoor + call AddIndoorSprites + ret + +.outdoor + call AddOutdoorSprites + ret + +AddIndoorSprites: + ld hl, wMap2ObjectSprite + ld a, 2 +.loop + push af + ld a, [hl] + call AddSpriteGFX + ld de, MAPOBJECT_LENGTH + add hl, de + pop af + inc a + cp NUM_OBJECTS + jr nz, .loop + ret + +AddOutdoorSprites: + ld a, [wMapGroup] + dec a + ld c, a + ld b, 0 + ld hl, OutdoorSprites + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld c, MAX_OUTDOOR_SPRITES +.loop + push bc + ld a, [hli] + call AddSpriteGFX + pop bc + dec c + jr nz, .loop + + ld a, [wd05a] + ld c, a + ret + +AddSpriteGFX: + and a + ret z + + ld c, a + call _DoesSpriteHaveFacings + jr nc, .nope + + ld de, wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2 + ld b, 2 + call Function14212 + jr nc, .ok + +.nope: + ld de, wUsedSprites + 2 + ld b, SPRITE_GFX_LIST_CAPACITY - 3 + call Function14212 + jr .ok + +.ok: + ret + +Function14212: +.loop + ld a, [de] + and a + jr z, .new + + cp c + jr z, .exists + + inc de + inc de + dec b + jr nz, .loop + + scf + ret + +.new: + ld a, c + ld [de], a + xor a + ret + +.exists: + xor a + ret + +LoadUsedSpritesGFX: + ld a, MAPCALLBACK_SPRITES + call RunMapCallback + call GetUsedSprites + ret c + + call Function14265 + call LoadMiscTiles + ret + +GetUsedSprites: + xor a + ldh [hUsedSpriteTile], a + ld hl, wUsedSprites + ld a, $a + +.loop + push af + ld a, [hli] + ldh [hUsedSpriteIndex], a + and a + jr z, .dont_set + + call GetSprite + push hl + push bc + ldh a, [hUsedSpriteTile] + call CopyToVram + pop bc + pop hl + ldh a, [hUsedSpriteTile] + ld [hl], a + add c + ldh [hUsedSpriteTile], a + cp $80 + jr nc, .done + +.dont_set + inc hl + pop af + dec a + jr nz, .loop + + xor a + ret + +.done + pop af + scf + ret + +Function14265: + ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2] + and a + jr z, .asm_14274 + + call GetSprite + ld hl, vTiles0 tile $78 + call Get2bpp + +.asm_14274 + ld a, $78 + ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2 + 1], a + ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2] + and a + jr z, .asm_14288 + + call GetSprite + ld hl, vTiles0 tile $7c + call Get2bpp + +.asm_14288 + ld a, $7c + ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2 + 1], a + ret + +LoadMiscTiles: + ld a, [wSpriteFlags] + bit 6, a + ret nz + + ld c, EMOTE_SHADOW + farcall LoadEmote + call GetMapEnvironment + call CheckOutdoorMap + ld c, EMOTE_GRASS_RUSTLE + jr z, .outdoor + ld c, EMOTE_BOULDER_DUST +.outdoor + farcall LoadEmote + ret + +GetSprite: + call GetMonSprite + ret c + + push hl + ld hl, OverworldSprites + SPRITEDATA_ADDR + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + swap a + ld c, a + ld b, [hl] + pop hl + ret + +GetMonSprite: +; Return carry if a monster sprite was loaded. + + cp SPRITE_POKEMON + jr c, .Normal + cp SPRITE_DAY_CARE_MON_1 + jr z, .BreedMon1 + cp SPRITE_DAY_CARE_MON_2 + jr z, .BreedMon2 + cp SPRITE_VARS + jr nc, .Variable + jr .Icon + +.Normal: + and a + ret + +.Icon: + push hl + sub SPRITE_POKEMON + ld e, a + ld d, 0 + ld hl, SpriteMons + add hl, de + ld a, [hl] + pop hl + jr .Mon + +.BreedMon1 + ld a, [wBreedMon1Species] + jr .Mon + +.BreedMon2 + ld a, [wBreedMon2Species] + +.Mon: + ld e, a + and a + jr z, .NoBreedmon + + push hl + farcall LoadOverworldMonIcon + pop hl + + scf + ret + +.Variable: + push hl + sub SPRITE_VARS + ld e, a + ld d, 0 + ld hl, wVariableSprites + add hl, de + ld a, [hl] + pop hl + and a + jp nz, GetMonSprite + +.NoBreedmon: + ld a, 1 + and a + ret + +_DoesSpriteHaveFacings:: +; Checks to see whether we can apply a facing to a sprite. +; Returns carry unless the sprite is a Pokemon or a Still Sprite. + cp SPRITE_POKEMON + jr nc, .only_down + + push hl + push bc + ld hl, OverworldSprites + SPRITEDATA_TYPE + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ld a, [hl] + pop bc + pop hl + cp STILL_SPRITE + jr nz, .only_down + scf + ret + +.only_down + and a + ret + +_GetSpritePalette:: + ld a, c + call GetMonSprite + jr c, .is_pokemon + + ld hl, OverworldSprites + SPRITEDATA_PALETTE + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ld c, [hl] + ret + +.is_pokemon + xor a + ld c, a + ret + +CopyToVram: + ld l, a + ld h, 0 +rept 4 + add hl, hl +endr + ld a, l + add LOW(vTiles0) + ld l, a + ld a, h + adc HIGH(vTiles0) + ld h, a + push hl + push de + push bc + ld a, [wSpriteFlags] + bit 7, a + jr nz, .skip + call Get2bpp + +.skip: + pop bc + ld l, c + ld h, 0 +rept 4 + add hl, hl +endr + pop de + add hl, de + ld e, l + ld d, h + pop hl + ld a, h + add HIGH(vTiles1 - vTiles0) + ld h, a + ldh a, [hUsedSpriteIndex] + call _DoesSpriteHaveFacings + jr c, .done + + ld a, [wSpriteFlags] + bit 6, a + jr nz, .done + + call Get2bpp + +.done: + ret + +Function1438a: + ld a, c + jr GetUsedSprite + + ld a, c + ld b, 0 + jr GetUsedSprite + + ld a, c + ld b, 12 + jr GetUsedSprite + +GetUsedSprite: + push bc + ld a, c + ldh [hUsedSpriteIndex], a + call GetSprite + pop af + call CopyToVram + ret + +LoadEmote:: +; Get the address of the pointer to emote c. + ld a, c + ld bc, 6 ; sizeof(emote) + ld hl, Emotes + call AddNTimes +; Load the emote address into de + ld e, [hl] + inc hl + ld d, [hl] +; load the length of the emote (in tiles) into c + inc hl + ld c, [hl] + swap c +; load the emote pointer bank into b + inc hl + ld b, [hl] +; load the VRAM destination into hl + inc hl + ld a, [hli] + ld h, [hl] + ld l, a +; if the emote has a length of 0, do not proceed (error handling) + ld a, c + and a + ret z + call Get2bpp + ret + +INCLUDE "data/sprites/emotes.asm" + +INCLUDE "gfx/emotes.asm" + +INCLUDE "data/sprites/sprite_mons.asm" + +INCLUDE "data/maps/outdoor_sprites.asm" + +INCLUDE "data/sprites/sprites.asm" diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm index 579ae6f9..1ac7fc6a 100755 --- a/engine/overworld/player_movement.asm +++ b/engine/overworld/player_movement.asm @@ -700,7 +700,7 @@ Function103f9: ; 103f9 (4:43f9) push bc ld a, $0 ld [wPlayerState], a - call ReplacePlayerSprite + call ReplaceChrisSprite pop bc ret diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm index 9cce323c..6324420f 100755 --- a/engine/overworld/time.asm +++ b/engine/overworld/time.asm @@ -137,12 +137,12 @@ CheckBugContestTimer: Function118c9: ; 118c9 (4:58c9) call UpdateTime - ld hl, wStartDay + ld hl, wTimerEventStartDay call CopyDayToHL ret CheckPokerusTick: - ld hl, wStartDay + ld hl, wTimerEventStartDay call CalcDaysSince call Function119b4 and a diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm new file mode 100644 index 00000000..4f9bdcbb --- /dev/null +++ b/engine/rtc/rtc.asm @@ -0,0 +1,210 @@ +Unreferenced_StopRTC: + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + call LatchClock + ld a, RTC_DH + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + set 6, a ; halt + ld [MBC3RTC], a + call CloseSRAM + ret + +StartRTC: + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + call LatchClock + ld a, RTC_DH + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + res 6, a ; halt + ld [MBC3RTC], a + call CloseSRAM + ret + +GetTimeOfDay:: +; get time of day based on the current hour + ldh a, [hHours] ; hour + ld hl, TimesOfDay + +.check +; if we're within the given time period, +; get the corresponding time of day + cp [hl] + jr c, .match +; else, get the next entry + inc hl + inc hl +; try again + jr .check + +.match +; get time of day + inc hl + ld a, [hl] + ld [wTimeOfDay], a + ret + +TimesOfDay: +; hours for the time of day +; 0400-0959 morn | 1000-1759 day | 1800-0359 nite + db MORN_HOUR, NITE_F + db DAY_HOUR, MORN_F + db NITE_HOUR, DAY_F + db MAX_HOUR, NITE_F + db -1, MORN_F + +Unreferenced_14044: + db 20, NITE_F + db 40, MORN_F + db 60, DAY_F + db -1, MORN_F + +StageRTCTimeForSave: + call UpdateTime + ld hl, wRTC + ld a, [wCurDay] + ld [hli], a + ldh a, [hHours] + ld [hli], a + ldh a, [hMinutes] + ld [hli], a + ldh a, [hSeconds] + ld [hli], a + ret + +UnreferencedSaveRTC: + ld a, $a + ld [MBC3SRamEnable], a + call LatchClock + ld hl, MBC3RTC + ld a, $c + ld [MBC3SRamBank], a + res 7, [hl] + ld a, BANK(sRTCStatusFlags) + ld [MBC3SRamBank], a + xor a + ld [sRTCStatusFlags], a + call CloseSRAM + ret + +StartClock:: + call SaveRTC + call GetClock + call Function1409e + call FixDays + jr nc, .skip_set + ; bit 5: Day count exceeds 139 + ; bit 6: Day count exceeds 255 + call RecordRTCStatus ; set flag on sRTCStatusFlags + +.skip_set + call StartRTC + ret + +Function1409e: + ld hl, hRTCDayHi + bit 7, [hl] + jr nz, .set_bit_7 + bit 6, [hl] + jr nz, .set_bit_7 + xor a + ret + +.set_bit_7 + ; Day count exceeds 16383 + ld a, %10000000 + call RecordRTCStatus ; set bit 7 on sRTCStatusFlags + ret + +SaveRTC: + ld a, $a + ld [MBC3SRamEnable], a + call LatchClock + ld a, $c + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + push af + call CloseSRAM + pop af + bit 6, a + ret z + + ld a, BANK(sRTCStatusFlags) + call OpenSRAM + ld a, $34 + ld [s0_b7ef], a + ld a, $12 + ld [s0_b7f0], a + call CloseSRAM + ret + +ClockContinue: + call CheckRTCStatus + ld c, a + and %11000000 ; Day count exceeded 255 or 16383 + jr nz, .time_overflow + + ld a, c + and %00100000 ; Day count exceeded 139 + jr z, .dont_update + + call UpdateTime + ld a, [wRTC + 0] + ld b, a + ld a, [wCurDay] + cp b + jr c, .dont_update + +.time_overflow + farcall ClearDailyTimers + ret + +.dont_update + xor a + ret + +_InitTime:: + call GetClock + call FixDays + ld hl, hRTCSeconds + ld de, wStartSecond + + ld a, [wStringBuffer2 + 3] + sub [hl] + dec hl + jr nc, .okay_secs + add 60 +.okay_secs + ld [de], a + dec de + + ld a, [wStringBuffer2 + 2] + sbc [hl] + dec hl + jr nc, .okay_mins + add 60 +.okay_mins + ld [de], a + dec de + + ld a, [wStringBuffer2 + 1] + sbc [hl] + dec hl + jr nc, .okay_hrs + add 24 +.okay_hrs + ld [de], a + dec de + + ld a, [wStringBuffer2] + sbc [hl] + dec hl + jr nc, .okay_days + add 140 + ld c, 7 + call SimpleDivide + +.okay_days + ld [de], a + ret |