diff options
-rw-r--r-- | constants.asm | 1 | ||||
-rw-r--r-- | constants/map_object_constants.asm | 72 | ||||
-rw-r--r-- | home/map_objects.asm | 676 | ||||
-rw-r--r-- | macros/wram.asm | 10 | ||||
-rw-r--r-- | shim.sym | 14 | ||||
-rw-r--r-- | wram.asm | 45 |
6 files changed, 798 insertions, 20 deletions
diff --git a/constants.asm b/constants.asm index c141901..66383ba 100644 --- a/constants.asm +++ b/constants.asm @@ -32,3 +32,4 @@ INCLUDE "constants/misc_constants.asm" INCLUDE "constants/battle_anim_constants.asm" INCLUDE "constants/menu_constants.asm" INCLUDE "constants/sgb_constants.asm" +INCLUDE "constants/map_object_constants.asm" diff --git a/constants/map_object_constants.asm b/constants/map_object_constants.asm new file mode 100644 index 0000000..c9bce93 --- /dev/null +++ b/constants/map_object_constants.asm @@ -0,0 +1,72 @@ + rsreset +OBJECT_SPRITE rb 1 ; 00 +OBJECT_MAP_OBJECT_INDEX rb 1 ; 01 +OBJECT_SPRITE_TILE rb 1 ; 02 +OBJECT_MOVEMENTTYPE rb 1 ; 03 +OBJECT_FLAGS rw 1 ; 04 +OBJECT_PALETTE rb 1 ; 06 +OBJECT_DIRECTION_WALKING rb 1 ; 07 +OBJECT_FACING rb 1 ; 08 +OBJECT_STEP_TYPE rb 1 ; 09 +OBJECT_STEP_DURATION rb 1 ; 0a +OBJECT_ACTION rb 1 ; 0b +OBJECT_STEP_FRAME rb 1 ; 0c +OBJECT_FACING_STEP rb 1 ; 0d +OBJECT_NEXT_TILE rb 1 ; 0e +OBJECT_STANDING_TILE rb 1 ; 0f +OBJECT_NEXT_MAP_X rb 1 ; 10 +OBJECT_NEXT_MAP_Y rb 1 ; 11 +OBJECT_MAP_X rb 1 ; 12 +OBJECT_MAP_Y rb 1 ; 13 +OBJECT_INIT_X rb 1 ; 14 +OBJECT_INIT_Y rb 1 ; 15 +OBJECT_RADIUS rb 1 ; 16 +OBJECT_SPRITE_X rb 1 ; 17 +OBJECT_SPRITE_Y rb 1 ; 18 +OBJECT_SPRITE_X_OFFSET rb 1 ; 19 +OBJECT_SPRITE_Y_OFFSET rb 1 ; 1a +OBJECT_MOVEMENT_BYTE_INDEX rb 1 ; 1b +OBJECT_1C rb 1 ; 1c +OBJECT_1D rb 1 ; 1d +OBJECT_1E rb 1 ; 1e +OBJECT_1F rb 1 ; 1f +OBJECT_RANGE rb 1 ; 20 +OBJECT_DATA rb 7 ; 21 +OBJECT_LENGTH SET _RS + + rsreset +CMDQUEUE_UNK0 rb 16 +CMDQUEUE_ENTRY_SIZE SET _RS + + rsreset +MAPOBJECT_OBJECT_STRUCT_ID rb 1 ; 0 +MAPOBJECT_SPRITE rb 1 ; 1 +MAPOBJECT_Y_COORD rb 1 ; 2 +MAPOBJECT_X_COORD rb 1 ; 3 +MAPOBJECT_MOVEMENT rb 1 ; 4 +MAPOBJECT_RADIUS rb 1 ; 5 +MAPOBJECT_HOUR rb 1 ; 6 +MAPOBJECT_TIMEOFDAY rb 1 ; 7 +MAPOBJECT_COLOR rb 1 ; 8 +MAPOBJECT_RANGE rb 1 ; 9 +MAPOBJECT_SCRIPT_POINTER rb 1 ; a +MAPOBJECT_POINTER_HI rb 1 ; b +MAPOBJECT_EVENT_FLAG rw 1 +MAPOBJECT_E rb 1 ; unused +MAPOBJECT_F rb 1 ; unused +MAP_OBJECT_LENGTH SET _RS + + rsreset +MAPOBJECTTEMPLATE_SPRITE rb 1 ; 0 +MAPOBJECTTEMPLATE_Y_COORD rb 1 ; 1 +MAPOBJECTTEMPLATE_X_COORD rb 1 ; 2 +MAPOBJECTTEMPLATE_MOVEMENT rb 1 ; 3 +MAPOBJECTTEMPLATE_RADIUS rb 1 ; 4 +MAPOBJECTTEMPLATE_HOUR rb 1 ; 5 +MAPOBJECTTEMPLATE_TIMEOFDAY rb 1 ; 6 +MAPOBJECTTEMPLATE_COLOR rb 1 ; 7 +MAPOBJECTTEMPLATE_RANGE rb 1 ; 8 +MAPOBJECTTEMPLATE_SCRIPT_POINTER rb 1 ; 9 +MAPOBJECTTEMPLATE_POINTER_HI rb 1 ; a +MAPOBJECTTEMPLATE_EVENT_FLAG rw 1 ; b +MAP_OBJECT_TEMPLATE_LENGTH SET _RS diff --git a/home/map_objects.asm b/home/map_objects.asm new file mode 100644 index 0000000..70cba50 --- /dev/null +++ b/home/map_objects.asm @@ -0,0 +1,676 @@ +include "constants.asm" + +SECTION "Map Object Related Functions", ROM0 [$15b5] + +Function15b5:: ; 15b5 + callab Function8000 + ret + +GetMapObject:: ; 00:15be + ld hl, wMapObjects + ld bc, MAP_OBJECT_LENGTH + call AddNTimes + ld b, h + ld c, l + ret + +GetMapObjectAttrPtr:: ; 15ca + call GetMapObject + ld d, $0 + add hl, de + ret + +Function15d1:: ; 15d1 + ldh [hMapObjectIndexBuffer], a + call GetMapObject + call Function40eb + ret + +Function15da:: + ldh [hMapObjectIndexBuffer], a + callab Function8131 + ldh a, [hMapObjectIndexBuffer] + call GetMapObject + call Function40eb + ret + +Function15ed:: + ldh [hMapObjectIndexBuffer], a + call GetMapObject + ld a, $0 + ldh [hObjectStructIndexBuffer], a + ld de, wObjectStructs + callab Function813d + ret + +Function1602:: + ldh [hMapObjectIndexBuffer], a + call GetMapObject + ld a, $2 + ldh [hObjectStructIndexBuffer], a + ld de, wObject1Struct + callab Function813d + ret + +Function1617:: ; 00:1617 + ldh [hMapObjectIndexBuffer], a + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp $ff + ret z + ld [hl], $ff + push af + ld d, a + ld a, [wObjectFollow_Leader] + cp d + jr nz, .asm_1633 + ld a, $ff + ld [wObjectFollow_Leader], a +.asm_1633: ; 00:1633 + ld a, [wObjectFollow_Follower] + cp d + jr nz, .asm_163e + ld a, $0 + ld [wObjectFollow_Follower], a +.asm_163e: ; 00:163e + pop af + call GetObjectStruct + ld bc, OBJECT_LENGTH + xor a + call ByteFill + ret + +Function164a:: + call Function1617 + callab Function8125 + ret + +Function1656:: + push hl + call GetMapObject + ld d, b + ld e, c + ld a, $ff + ld [de], a + inc de + pop hl + ld bc, MAP_OBJECT_TEMPLATE_LENGTH + call CopyBytes + ret + +Function1668:: + call GetMapObject + ld a, [wXCoord] + add $4 + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld [hl], a + ld a, [wYCoord] + add $4 + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld [hl], a + ret + +Function1680:: + 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] + ldh a, [hMapObjectIndexBuffer] + call GetMapObject + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld [hl], d + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld [hl], e + and a + ret + +Function169f:: + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + push af + ld [hl], $ff + inc hl + ld bc, MAP_OBJECT_LENGTH - 1 + xor a + call ByteFill + pop af + cp $ff + ret z + cp $a + ret nc + ld b, a + ld a, [wObjectFollow_Leader] + cp b + jr nz, .asm_16c5 + ld a, $ff + ld [wObjectFollow_Leader], a +.asm_16c5: ; 00:16c5 + ld a, b + call GetObjectStruct + ld bc, OBJECT_LENGTH + xor a + call ByteFill + ret + +LoadMovementDataPointer:: + ld [wMovementObject], a + ldh a, [hROMBank] + ld [wMovementDataBank], a + ld a, l + ld [wMovementDataAddr], a + ld a, h + ld [wMovementDataAddr + 1], a + ld a, [wMovementObject] + call CheckObjectVisibility + ret c + ld hl, $3 + add hl, bc + ld [hl], $19 + ld hl, $8 + add hl, bc + ld [hl], $0 + ld hl, wVramState + set 7, [hl] + and a + ret + +Function16fb:: + ld [wMovementObject], a + ldh a, [hROMBank] + ld [wMovementDataBank], a + ld a, l + ld [wMovementDataAddr], a + ld a, h + ld [wMovementDataAddr + 1], a + ld a, [wMovementObject] + call CheckObjectVisibility + jr c, .asm_171f + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], $19 + ld hl, OBJECT_FACING + add hl, bc + ld [hl], $0 +.asm_171f: ; 00:171f + ret + +CheckObjectVisibility:: ; 00:1720 + ldh [hMapObjectIndexBuffer], a + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp $ff + jr z, .asm_1735 + ldh [hObjectStructIndexBuffer], a + call GetObjectStruct + and a + ret + +.asm_1735: ; 00:1735 + scf + ret + +PushToCmdQueue:: ; 1737 + push de + call GetCmdQueueEmptySlot + pop de + ret c + ld b, h + ld c, l + ld a, [de] + inc de + ld hl, $1 + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, $2 + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, $3 + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, $d + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, $e + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, $f + add hl, bc + ld [hl], a + ldh a, [hMapObjectIndexBuffer] + inc a + ld hl, $0 + add hl, bc + ld [hl], a + push bc + dec a + call GetObjectStruct + ld d, b + ld e, c + pop bc + ld hl, $18 + add hl, de + ld a, [hl] + ld hl, $4 + add hl, bc + ld [hl], a + ld hl, $19 + add hl, de + ld a, [hl] + ld hl, $5 + add hl, bc + ld [hl], a + ret + +GetCmdQueueEmptySlot:: ; 00:178e + ld hl, wCmdQueue + ld de, CMDQUEUE_ENTRY_SIZE + ld a, 1 +.asm_1796: ; 00:1796 + ldh [hObjectStructIndexBuffer], a + ld a, [hl] + and a + jr z, .asm_17a6 + add hl, de + ldh a, [hObjectStructIndexBuffer] + inc a + cp 4 + 1 + jr nz, .asm_1796 + scf + ret + +.asm_17a6: ; 00:17a6 + xor a + ret + +UpdateSprites:: ; 00:17a8 + ld a, [wVramState] + bit 0, a + ret z + callab Function5007 + callab Function5190 + ret + +GetObjectStruct:: ; 00:17bf + ld bc, $28 + ld hl, wObjectStructs + call AddNTimes + ld b, h + ld c, l + ret + +Function17cb:: + add $10 + ld e, a + ldh a, [hROMBank] + push af + ld a, BANK(Function862e) + call Bankswitch + call Function862e + pop af + call Bankswitch + ret + +Function17de:: + push hl + push bc + ld c, a + ld b, $ff + ld hl, .Data +.asm_17e6: ; 00:17e6 + ld a, [hli] + cp b + jr z, .asm_17ee + cp c + jr nz, .asm_17e6 + scf +.asm_17ee: ; 00:17ee + pop bc + pop hl + ret + +.Data: ; 00:17f1 + db $51, $55, $56, $57, $58, $5a, $5b, $ff + +Function17f9:: + call GetMapObject + ld hl, $0 + add hl, bc + ld a, [hl] + cp $ff + ret z + call GetObjectStruct + push bc + call Function1828 + pop bc + ld hl, $5 + add hl, bc + res 5, [hl] + ret + +Function1813:: + call GetMapObject + ld hl, $0 + add hl, bc + ld a, [hl] + cp $ff + ret z + call GetObjectStruct + ld hl, $5 + add hl, bc + set 5, [hl] + ret + +Function1828:: ; 00:1828 + ld bc, wObjectStructs + xor a +.asm_182c: ; 00:182c + push af + ld hl, OBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .asm_183b + ld hl, OBJECT_FLAGS + 1 + add hl, bc + set 5, [hl] +.asm_183b: ; 00:183b + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp 10 + jr nz, .asm_182c + ret + +Function1848:: + push bc + ld bc, wObjectStructs + xor a +.asm_184d: ; 00:184d + push af + ld hl, OBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .asm_185c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + res 5, [hl] +.asm_185c: ; 00:185c + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp 10 + jr nz, .asm_184d + pop bc + ret + +Function186a:: + call GetMapObject + ld hl, $0 + add hl, bc + ld a, [hl] + cp $ff + ret z + call GetObjectStruct + ld hl, OBJECT_FLAGS + 1 + add hl, bc + res 5, [hl] + ret + +Function187f:: + xor a +.asm_1880: ; 00:1880 + push af + push hl + ld b, a + ldh a, [hROMBank] + push af + ld c, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, c + call Bankswitch + ld a, b + call ._hl_ + pop af + call Bankswitch + pop hl + pop af + inc a + cp 16 + jr nz, .asm_1880 + ret + +._hl_: ; 00:189f + jp hl + +Function18a0:: + ld a, [wcb70] + and a + ret z + ldh a, [hROMBank] + push af + ld a, BANK(Function83e8) + call Bankswitch + call Function83e8 + pop af + call Bankswitch + ret + +Function18b4:: + ld bc, wPlayerStruct + ld hl, OBJECT_FLAGS + add hl, bc + set 3, [hl] + set 2, [hl] + set 1, [hl] + ld hl, OBJECT_FLAGS + 1 + add hl, bc + set 5, [hl] + call Function18e5 + ret + +Function18cc:: + ld hl, wPlayerFlags + res 3, [hl] + res 2, [hl] + res 1, [hl] + ld hl, wPlayerFlags + 1 + res 5, [hl] + ld hl, wPlayerMovementType + ld [hl], $10 + ld hl, wPlayerDirection + ld [hl], $0 + ret + +Function18e5:: ; 00:18e5 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + srl a + srl a + and $3 + ld e, a + ld d, $0 + ld hl, .Data + add hl, de + ld a, [hl] + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], a + ld hl, OBJECT_FACING + add hl, bc + ld [hl], $0 + ret + +.Data: + db $05, $06, $07, $08 + +Function1908:: + call CheckObjectVisibility + ret c + push bc + call Function191d + pop bc + ld hl, OBJECT_FLAGS + add hl, bc + set 7, [hl] + ldh a, [hObjectStructIndexBuffer] + ld [wCenteredObject], a + ret + +Function191d:: ; 00:191d + ld a, [wCenteredObject] + cp $ff + ret z + call GetObjectStruct + ld hl, OBJECT_FLAGS + add hl, bc + res 7, [hl] + ld a, $ff + ld [wCenteredObject], a + ret + +; 1932 + +StartFollow:: + push bc + ld a, b + call SetLeaderIfVisible + pop bc + ld a, c + call SetFollowerIfVisible + callab QueueFollowerFirstStep + ret + +SetLeaderIfVisible:: ; 00:1945 + call CheckObjectVisibility + ret c + ldh a, [hObjectStructIndexBuffer] + ld [wObjectFollow_Leader], a + ret + +ResetLeader:: + xor a + ld [wObjectFollow_Leader], a + ret + +SetFollowerIfVisible:: ; 00:1954 + push af + call ResetFollower + pop af + call CheckObjectVisibility + ret c + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], $18 + ld hl, OBJECT_FACING + add hl, bc + ld [hl], $0 + ldh a, [hObjectStructIndexBuffer] + ld [wObjectFollow_Follower], a + ret + +ResetFollower:: ; 00:196f + ld a, [wObjectFollow_Follower] + and a + ret z + cp $ff + ret z + call GetObjectStruct + call Function18e5 + ret + +Function197e:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + res 0, [hl] + ret + +Function1989:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + set 0, [hl] + ret + +Function1994:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + res 4, [hl] + ret + +Function199f:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + set 4, [hl] + ret + +Function19aa:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + set 7, [hl] + ret + +Function19b5:: + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS + 1 + add hl, bc + res 7, [hl] + ret + +Function19c0:: + push de + call CheckObjectVisibility + pop de + ret c + ld a, d + add a + add a + and $c + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], a + ret diff --git a/macros/wram.asm b/macros/wram.asm index 77fe153..96cf5e8 100644 --- a/macros/wram.asm +++ b/macros/wram.asm @@ -371,3 +371,13 @@ warp_struct: MACRO \1MapGroup:: ds 1 \1MapNumber:: ds 1 ENDM + +ptrba: MACRO +\1Bank:: db +\1Addr:: dw +ENDM + +ptrab: MACRO +\1Addr:: dw +\1Bank:: db +ENDM @@ -1,8 +1,4 @@ ; ROM0 -00:15BE GetMapObject -00:1720 CheckObjectVisibility -00:17A8 UpdateSprites -00:17BF GetObjectStruct 00:1A7C Function1a7c 00:202C Function202c 00:2117 Function2117 @@ -33,8 +29,10 @@ 00:3E2E GetMapMusic.unk_3E2E 00:3E32 Unk_3E32 - 01:4031 Function4031 +01:40EB Function40eb +01:5007 Function5007 +01:5190 Function5190 01:53CC MainMenu 01:5D27 Function5d27 01:6114 TitleScreenInputAndTimeout @@ -46,6 +44,12 @@ 02:4000 Function8000 02:4098 _InitializeVisibleSprites +02:4125 Function8125 +02:4131 Function8131 +02:413D Function813d +02:43E8 Function83e8 +02:45DF QueueFollowerFirstStep +02:462E Function862e 02:4786 Function8786 02:4856 DecompTownMapTilemap 02:48DA DecompTownMapTilemap.tilemap @@ -229,12 +229,18 @@ wVBCopyDoubleSize:: ds 1 ; cb67 wVBCopyDoubleSrc:: ds 2 ; cb68 wVBCopyDoubleDst:: ds 2 ; cb6a -SECTION "CB71", WRAM0[$CB71] +SECTION "CB71", WRAM0[$CB70] + +wcb70:: db wVBCopyFarSize:: ds 1 ; cb71 wVBCopyFarSrc:: ds 2 ; cb72 wVBCopyFarDst:: ds 2 ; cb74 wVBCopyFarSrcBank:: ds 1 ; cb76 + db + +wMovementObject:: db ; cb78 + ptrba wMovementData ; cb79 SECTION "Collision buffer", WRAM0[$CB90] @@ -541,22 +547,31 @@ wObjectFollow_Leader:: ; ce76 db wObjectFollow_Follower:: ; ce77 db - - -SECTION "Object structs", WRAM0[$CECF] - -wObjectStructs:: ; cecf -wPlayerStruct:: object_struct wPlayer -wObject1Struct:: object_struct wObject1 -wObject2Struct:: object_struct wObject2 -wObject3Struct:: object_struct wObject3 -wObject4Struct:: object_struct wObject4 -wObject5Struct:: object_struct wObject5 -wObject6Struct:: object_struct wObject6 -wObject7Struct:: object_struct wObject7 +wCenteredObject:: ; ce78 + db +wFollowerMovementQueueLength:: ; ce79 + db +wFollowMovementQueue:: ; ce7a + ds 5 + +wObjectStructs:: ; ce7f +wUnkObjectStruct:: object_struct wUnkObject ; ce7f +wPlayerStruct:: object_struct wPlayer ; cea7 +wObject1Struct:: object_struct wObject1 ; cecf +wObject2Struct:: object_struct wObject2 ; cef7 +wObject3Struct:: object_struct wObject3 ; cf1f +wObject4Struct:: object_struct wObject4 ; cf47 +wObject5Struct:: object_struct wObject5 ; cf6f +wObject6Struct:: object_struct wObject6 ; cf97 +wObject7Struct:: object_struct wObject7 ; cfbf +wObject8Struct:: object_struct wObject8 ; cfe7 wObjectStructsEnd:: ; d00f -SECTION "Objects", WRAM0[$D04F] +wCmdQueue:: ; d00f +wCmdQueueEntry1:: ds 16 +wCmdQueueEntry2:: ds 16 +wCmdQueueEntry3:: ds 16 +wCmdQueueEntry4:: ds 16 wMapObjects:: ; d04f wPlayerObject:: map_object wPlayer |