diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2022-03-23 11:05:34 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-23 11:05:34 -0700 |
| commit | fc3dc169519bc30da79d89ac9afaff7ca71b8eed (patch) | |
| tree | e95982c237db55850670f1170bfe24dc5dc9b601 /src/scroll.c | |
| parent | 8986a26008b182d734acc534010ad3f52ea64378 (diff) | |
| parent | 60eb3e1d9201ad07fb184dd0de6c51bc3c136817 (diff) | |
Merge pull request #462 from hatal175/scroll
Diffstat (limited to 'src/scroll.c')
| -rw-r--r-- | src/scroll.c | 282 |
1 files changed, 249 insertions, 33 deletions
diff --git a/src/scroll.c b/src/scroll.c index e751a412..e1f2050e 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -7,23 +7,58 @@ #include "asm.h" #include "common.h" #include "fileselect.h" +#include "screen.h" extern void sub_08080BC4(void); +extern void sub_080197D4(const void*); +extern void sub_0807C8B0(u8*, u32, u32); +extern void sub_0801AB08(u8*, u8*); +extern void sub_0807C810(); +extern void DeleteSleepingEntities(void); +extern void sub_0807BBE4(); +extern void sub_0807BC84(); +extern void sub_0805E248(); extern u8 gUpdateVisibleTiles; - -extern void (*const gUnk_0811E768[])(RoomControls*); - +extern u16 gUnk_0200B640; +extern u32** gUnk_08109194[]; +extern u8 gMapDataTop[]; +extern u8 gMapDataBottom[]; +extern u8 gUnk_02022830[]; +extern u8 gUnk_020246B0[]; + +void sub_0807FC64(RoomControls*); void sub_0807FC7C(RoomControls*); -void sub_080805F8(void); - -extern void (*const gUnk_0811E780[])(RoomControls*); - -extern void (*const gUnk_0811E794[])(RoomControls*); +void sub_0807FDB0(RoomControls*); +void sub_0807FEF0(RoomControls*); +void sub_0807FF54(RoomControls*); +void sub_0807FDC8(RoomControls*); +void sub_0807FDE4(RoomControls*); +void sub_0807FDF8(RoomControls*); +void sub_0807FEC8(RoomControls*); +void sub_0807FF08(RoomControls*); +void sub_0807FF1C(RoomControls*); + +void sub_0807FF6C(RoomControls*); +void sub_0807FFE4(RoomControls*); +void sub_08080040(RoomControls*); +void sub_08080108(RoomControls*); +void sub_08080198(RoomControls*); +void sub_080801BC(RoomControls*); +void UpdateIsDiggingCave(void); +u32 sub_080803D0(); +u32 sub_08080278(); +void sub_08080C80(u32*); +void sub_08080368(); +void sub_08080B60(u8*); extern u8 gMapDataTopSpecial[]; void UpdateScroll(void) { + static void (*const gUnk_0811E768[])(RoomControls*) = { + sub_0807FC64, sub_0807FC7C, sub_0807FDB0, NULL, sub_0807FEF0, sub_0807FF54, + }; + gRoomControls.scroll_flags &= 0xfb; gUnk_0811E768[gRoomControls.unk3](&gRoomControls); } @@ -33,12 +68,17 @@ void sub_0807FC64(RoomControls* controls) { controls->reload_flags = 0; controls->unk5 = 4; sub_0807FC7C(controls); - sub_080805F8(); + UpdateIsDiggingCave(); } ASM_FUNC("asm/non_matching/scroll/sub_0807FC7C.inc", void sub_0807FC7C(RoomControls* controls)) void sub_0807FDB0(RoomControls* controls) { + static void (*const gUnk_0811E780[])(RoomControls*) = { + sub_0807FDC8, + sub_0807FDE4, + sub_0807FDF8, + }; gUnk_0811E780[controls->unk4](controls); } @@ -55,17 +95,70 @@ void sub_0807FDE4(RoomControls* controls) { gUpdateVisibleTiles = 2; } -ASM_FUNC("asm/non_matching/scroll/sub_0807FDF8.inc", void sub_0807FDF8()) +void sub_0807FDF8(RoomControls* controls) { + u32 bVar1; + Entity* pEVar2; + int iVar3; + + gUpdateVisibleTiles = 2; + controls->filler2[0]++; + switch (controls->scroll_direction) { + case 0: + controls->scroll_y -= 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD - 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 1: + controls->scroll_x = controls->scroll_x + 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD += 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + case 2: + controls->scroll_y = controls->scroll_y + 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD + 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 3: + controls->scroll_x -= 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD -= 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + } + + controls->shake_duration = 0; + sub_08080BC4(); +} void sub_0807FEC8(RoomControls* this) { this->unk3 = 0; - MemFill32(0xffffffff, gPlayerState.path_memory, 0x40); + MemFill32(0xffffffff, gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); gPlayerState.startPosX = this->camera_target->x.HALF.HI; gPlayerState.startPosY = this->camera_target->y.HALF.HI; } void sub_0807FEF0(RoomControls* controls) { - extern void (*const gUnk_0811E78C[])(RoomControls*); + static void (*const gUnk_0811E78C[])(RoomControls*) = { + sub_0807FF08, + sub_0807FF1C, + }; gUnk_0811E78C[controls->unk4](controls); } @@ -86,16 +179,95 @@ void sub_0807FF1C(RoomControls* controls) { } void sub_0807FF54(RoomControls* controls) { + static void (*const gUnk_0811E794[])(RoomControls*) = { + sub_0807FF6C, sub_0807FFE4, sub_08080040, sub_08080108, sub_08080198, sub_080801BC, + }; gUnk_0811E794[controls->unk4](controls); } -ASM_FUNC("asm/non_matching/scroll/sub_0807FF6C.inc", void sub_0807FF6C()) +void sub_0807FF6C(RoomControls* controls) { + controls->unk4 = 1; + gScreen.lcd.displayControl |= DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl = (u8)gScreen.controls.windowInsideControl | 0x1700; + gScreen.controls.windowOutsideControl = (gScreen.controls.windowOutsideControl & 0xff00) | 7; + gScreen.controls.window1HorizontalDimensions = 0xf0; + gScreen.controls.window1VerticalDimensions = 0xf0; + ResetPlayer(); + ResetPlayerAnimationAndAction(); + if (gUnk_03004030.isDiggingCave) { + gPlayerEntity.animationState = 4; + } else { + gPlayerEntity.animationState = 0; + } + sub_080809D4(); +} -ASM_FUNC("asm/non_matching/scroll/sub_0807FFE4.inc", void sub_0807FFE4()) +void sub_0807FFE4(RoomControls* controls) { + controls->unk4 = 2; + controls->filler2[0] = sub_080803D0() + 6; + gUnk_0200B640 = sub_08080278(); + sub_080197D4(*gUnk_08109194[gUnk_03004030.unk_00->unk_03]); + sub_0807C8B0(gMapDataTop, controls->width >> 4, controls->height >> 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} -ASM_FUNC("asm/non_matching/scroll/sub_08080040.inc", void sub_08080040()) +void sub_08080040(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; + + controls->filler2[0] -= 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x2a < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]) + 8; + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0] - 8; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]) + 8; + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1] - 8; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[0] == 0) { + controls->unk4 = 3; + DeleteSleepingEntities(); + sub_0807C810(); + sub_08080C80(*(gUnk_08109194[gUnk_03004030.unk_00->unk_03] + 1)); + } else { + gUpdateVisibleTiles = 4; + } +} -ASM_FUNC("asm/non_matching/scroll/sub_08080108.inc", void sub_08080108()) +void sub_08080108(RoomControls* controls) { + controls->unk4 = 4; + MemCopy(gMapDataBottom, gMapDataBottom + 0x3000, 0x2000); + MemCopy(gMapDataTop, gMapDataTop + 0x3000, 0x2000); + sub_08080368(); + gUnk_02034480.unk_00 = gUnk_0200B640; + MemCopy(gUnk_02022830, gUnk_020246B0, 0x1800); + sub_08080B60(gMapDataBottom - 4); + sub_08080B60(gMapDataTop - 4); + sub_0807BBE4(); + sub_0807BC84(); + sub_0805E248(); + sub_0801AB08((u8*)&gMapDataBottomSpecial, gMapDataBottom - 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} void sub_08080198(RoomControls* controls) { controls->unk4 = 5; @@ -103,35 +275,79 @@ void sub_08080198(RoomControls* controls) { LoadRoom(); CallRoomProp5And7(); gUpdateVisibleTiles = 0; - sub_080805F8(); + UpdateIsDiggingCave(); } -ASM_FUNC("asm/non_matching/scroll/sub_080801BC.inc", void sub_080801BC()) +void sub_080801BC(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; + + controls->filler2[0] += 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x1e < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]); + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0]; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]); + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1]; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[2] == 0) { + controls->unk3 = 0; + controls->reload_flags = 0; + ResetSystemPriority(); + gScreen.lcd.displayControl &= ~DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl &= 0xff; + gScreen.controls.windowOutsideControl &= 0xff00; + } else { + gUpdateVisibleTiles = 4; + controls->filler2[2] = 0; + } +} -ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", void sub_08080278()) +ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", u32 sub_08080278()) ASM_FUNC("asm/non_matching/scroll/sub_08080368.inc", void sub_08080368()) -ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", void sub_080803D0()) +ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", u32 sub_080803D0()) -void sub_080805F8(void) { +void UpdateIsDiggingCave(void) { switch (gRoomControls.area) { - case 0xc: - case 0x0f: - case 0x13: - case 0x14: - case 0x16: - case 0x17: - case 0x19: - gUnk_03004030.unk_08 = 1; + case AREA_LAKE_WOODS_CAVE: + case AREA_HYRULE_DIG_CAVES: + case AREA_DIG_CAVES_1: + case AREA_CRENEL_DIG_CAVE: + case AREA_VEIL_FALLS_DIG_CAVE: + case AREA_CASTOR_WILDS_DIG_CAVE: + case AREA_HYLIA_DIG_CAVES: + gUnk_03004030.isDiggingCave = 1; return; } - gUnk_03004030.unk_08 = 0; + gUnk_03004030.isDiggingCave = 0; } void ClearTilemaps(void) { + // Is gRoomControls 4 bytes bigger? MemClear(&gRoomControls, 0x38); - MemClear(&gUnk_03004030, 0xc); + MemClear(&gUnk_03004030, sizeof(gUnk_03004030)); gRoomControls.filler3 = 0xffff; gUnk_03004030.unk_0a = 0xff; gUnk_02034480.unk_00 = 0; @@ -265,10 +481,10 @@ void sub_080809D4(void) { ASM_FUNC("asm/non_matching/scroll/UpdateDoorTransition.inc", void UpdateDoorTransition()) -ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60()) +ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60(u8* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080BC4.inc", void sub_08080BC4()) -ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80()) +ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80(u32* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080CB4.inc", void sub_08080CB4(Entity* a)) |
