diff options
-rw-r--r-- | asm/cable_car.s | 404 | ||||
-rw-r--r-- | src/scene/cable_car.c | 214 |
2 files changed, 157 insertions, 461 deletions
diff --git a/asm/cable_car.s b/asm/cable_car.s index 48695975f..c38b3ccb4 100644 --- a/asm/cable_car.s +++ b/asm/cable_car.s @@ -6,410 +6,6 @@ .text - thumb_func_start sub_8124118 -sub_8124118: @ 8124118 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - ldr r1, _0812422C @ =gCableCarPlayerGraphicsIDs - add r0, sp, 0x8 - movs r2, 0x2 - bl memcpy - bl Random - lsls r0, 16 - lsrs r0, 16 - mov r9, r0 - add r6, sp, 0xC - ldr r1, _08124230 @ =gMtChimneyHikerGraphicsIDs - adds r0, r6, 0 - movs r2, 0x4 - bl memcpy - add r5, sp, 0x10 - ldr r1, _08124234 @ =gMtChimneyHikerCoords - adds r0, r5, 0 - movs r2, 0x8 - bl memcpy - add r4, sp, 0x18 - ldr r1, _08124238 @ =gMtChimneyHikerMovementDelayTable - adds r0, r4, 0 - movs r2, 0x4 - bl memcpy - ldr r0, _0812423C @ =gUnknown_08401D9C - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp, 0x1C] - str r1, [sp, 0x20] - ldr r0, _08124240 @ =gSpecialVar_0x8004 - ldrh r0, [r0] - mov r8, r6 - mov r10, r5 - cmp r0, 0 - beq _08124176 - cmp r0, 0x1 - beq _08124258 -_08124176: - ldr r0, _08124244 @ =gSaveBlock2 - ldrb r0, [r0, 0x8] - add r0, sp - adds r0, 0x8 - ldrb r0, [r0] - ldr r1, _08124248 @ =sub_8123D98 - movs r2, 0x66 - str r2, [sp] - movs r2, 0xC8 - movs r3, 0x49 - bl AddPseudoFieldObject - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x40 - beq _081241BE - ldr r0, _0812424C @ =gSprites - lsls r1, r6, 4 - adds r1, r6 - lsls r1, 2 - adds r1, r0 - ldrb r2, [r1, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r2 - movs r2, 0x8 - orrs r0, r2 - strb r0, [r1, 0x5] - movs r0, 0x8 - strh r0, [r1, 0x24] - movs r0, 0x10 - strh r0, [r1, 0x26] - movs r0, 0xC8 - strh r0, [r1, 0x2E] - movs r0, 0x49 - strh r0, [r1, 0x30] -_081241BE: - ldr r4, _08124250 @ =gSpriteTemplate_8401D40 - adds r0, r4, 0 - movs r1, 0xB0 - movs r2, 0x2B - movs r3, 0x67 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - ldr r5, _0812424C @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r5 - movs r1, 0x20 - strh r1, [r0, 0x26] - strh r1, [r0, 0x24] - movs r1, 0xB0 - strh r1, [r0, 0x2E] - movs r1, 0x2B - strh r1, [r0, 0x30] - adds r4, 0x18 - adds r0, r4, 0 - movs r1, 0xC8 - movs r2, 0x63 - movs r3, 0x65 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r5 - movs r1, 0x8 - strh r1, [r0, 0x24] - movs r1, 0x4 - strh r1, [r0, 0x26] - movs r1, 0xC8 - strh r1, [r0, 0x2E] - movs r1, 0x63 - strh r1, [r0, 0x30] - ldr r2, _08124254 @ =gUnknown_02039274 - ldr r1, [r2] - movs r0, 0x7 - strb r0, [r1, 0x2] - ldr r1, [r2] - movs r0, 0xAF - lsls r0, 1 - strh r0, [r1, 0x4] - movs r0, 0x2 - bl sub_807C9B4 - b _0812431E - .align 2, 0 -_0812422C: .4byte gCableCarPlayerGraphicsIDs -_08124230: .4byte gMtChimneyHikerGraphicsIDs -_08124234: .4byte gMtChimneyHikerCoords -_08124238: .4byte gMtChimneyHikerMovementDelayTable -_0812423C: .4byte gUnknown_08401D9C -_08124240: .4byte gSpecialVar_0x8004 -_08124244: .4byte gSaveBlock2 -_08124248: .4byte sub_8123D98 -_0812424C: .4byte gSprites -_08124250: .4byte gSpriteTemplate_8401D40 -_08124254: .4byte gUnknown_02039274 -_08124258: - ldr r7, _081243EC @ =gUnknown_02039274 - ldr r0, [r7] - adds r0, 0xFC - ldr r1, _081243F0 @ =0x02019048 - movs r2, 0xC - str r2, [sp] - movs r2, 0x3 - str r2, [sp, 0x4] - movs r2, 0x18 - movs r3, 0x1A - bl sub_8124F08 - ldr r0, _081243F4 @ =gSaveBlock2 - ldrb r0, [r0, 0x8] - add r0, sp - adds r0, 0x8 - ldrb r0, [r0] - ldr r1, _081243F8 @ =sub_8123D98 - movs r2, 0x66 - str r2, [sp] - movs r2, 0x80 - movs r3, 0x27 - bl AddPseudoFieldObject - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x40 - beq _081242B8 - ldr r0, _081243FC @ =gSprites - lsls r1, r6, 4 - adds r1, r6 - lsls r1, 2 - adds r1, r0 - ldrb r2, [r1, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r2 - movs r2, 0x8 - orrs r0, r2 - strb r0, [r1, 0x5] - movs r0, 0x8 - strh r0, [r1, 0x24] - movs r0, 0x10 - strh r0, [r1, 0x26] - movs r0, 0x80 - strh r0, [r1, 0x2E] - movs r0, 0x27 - strh r0, [r1, 0x30] -_081242B8: - ldr r4, _08124400 @ =gSpriteTemplate_8401D40 - adds r0, r4, 0 - movs r1, 0x68 - movs r2, 0x9 - movs r3, 0x67 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - ldr r5, _081243FC @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r5 - movs r1, 0x20 - strh r1, [r0, 0x26] - strh r1, [r0, 0x24] - movs r1, 0x68 - strh r1, [r0, 0x2E] - movs r1, 0x9 - strh r1, [r0, 0x30] - adds r4, 0x18 - adds r0, r4, 0 - movs r1, 0x80 - movs r2, 0x41 - movs r3, 0x65 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r5 - movs r1, 0x8 - strh r1, [r0, 0x24] - movs r1, 0x4 - strh r1, [r0, 0x26] - movs r1, 0x80 - strh r1, [r0, 0x2E] - movs r1, 0x41 - strh r1, [r0, 0x30] - ldr r1, [r7] - movs r0, 0x2 - strb r0, [r1, 0x2] - ldr r1, [r7] - ldr r0, _08124404 @ =0x00000109 - strh r0, [r1, 0x4] - movs r0, 0x7 - bl sub_807C9B4 -_0812431E: - movs r4, 0 - ldr r5, _081243FC @ =gSprites -_08124322: - lsls r1, r4, 20 - movs r0, 0xC0 - lsls r0, 15 - adds r1, r0 - asrs r1, 16 - lsls r2, r4, 19 - ldr r3, _08124408 @ =0xfff80000 - adds r2, r3 - asrs r2, 16 - ldr r0, _0812440C @ =gSpriteTemplate_8401D70 - movs r3, 0x68 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r5 - movs r1, 0x8 - strh r1, [r0, 0x24] - strh r1, [r0, 0x26] - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x8 - bls _08124322 - movs r0, 0x3F - mov r4, r9 - ands r0, r4 - cmp r0, 0 - bne _08124458 - mov r0, r9 - movs r1, 0x3 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - add r0, r8 - ldrb r0, [r0] - ldr r5, _08124410 @ =gSpecialVar_0x8004 - ldrh r4, [r5] - lsls r4, 2 - add r1, sp, 0x1C - adds r1, r4, r1 - ldr r1, [r1] - mov r3, r10 - adds r2, r3, r4 - movs r3, 0 - ldrsh r2, [r2, r3] - mov r3, sp - adds r3, 0x12 - adds r3, r4 - movs r4, 0 - ldrsh r3, [r3, r4] - movs r4, 0x6A - str r4, [sp] - bl AddPseudoFieldObject - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x40 - beq _08124458 - ldr r1, _081243FC @ =gSprites - lsls r2, r6, 4 - adds r0, r2, r6 - lsls r0, 2 - adds r4, r0, r1 - ldrb r1, [r4, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r1 - movs r1, 0x8 - orrs r0, r1 - strb r0, [r4, 0x5] - adds r0, r4, 0 - adds r0, 0x28 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - negs r0, r0 - strh r0, [r4, 0x24] - adds r0, r4, 0 - adds r0, 0x29 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - negs r0, r0 - strh r0, [r4, 0x26] - ldrh r0, [r5] - mov r8, r2 - cmp r0, 0 - bne _0812441A - movs r7, 0x1 - mov r5, r9 - ands r5, r7 - cmp r5, 0 - beq _08124414 - adds r0, r4, 0 - movs r1, 0x6 - b _08124428 - .align 2, 0 -_081243EC: .4byte gUnknown_02039274 -_081243F0: .4byte 0x02019048 -_081243F4: .4byte gSaveBlock2 -_081243F8: .4byte sub_8123D98 -_081243FC: .4byte gSprites -_08124400: .4byte gSpriteTemplate_8401D40 -_08124404: .4byte 0x00000109 -_08124408: .4byte 0xfff80000 -_0812440C: .4byte gSpriteTemplate_8401D70 -_08124410: .4byte gSpecialVar_0x8004 -_08124414: - adds r0, r4, 0 - movs r1, 0x7 - b _0812443A -_0812441A: - movs r7, 0x1 - mov r5, r9 - ands r5, r7 - cmp r5, 0 - beq _08124436 - adds r0, r4, 0 - movs r1, 0x7 -_08124428: - bl StartSpriteAnim - strh r7, [r4, 0x30] - ldrh r0, [r4, 0x22] - adds r0, 0x2 - strh r0, [r4, 0x22] - b _08124440 -_08124436: - adds r0, r4, 0 - movs r1, 0x6 -_0812443A: - bl StartSpriteAnim - strh r5, [r4, 0x30] -_08124440: - ldr r0, _08124468 @ =gSprites - mov r2, r8 - adds r1, r2, r6 - lsls r1, 2 - adds r1, r0 - movs r0, 0x3 - mov r3, r9 - ands r0, r3 - add r0, sp - adds r0, 0x18 - ldrb r0, [r0] - strh r0, [r1, 0x32] -_08124458: - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08124468: .4byte gSprites - thumb_func_end sub_8124118 - thumb_func_start sub_812446C sub_812446C: @ 812446C push {r4-r7,lr} diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index d5398f262..12b2e62b3 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -3,6 +3,7 @@ #include "global.h" #include "overworld.h" #include "palette.h" +#include "rng.h" #include "main.h" #include "script.h" #include "task.h" @@ -10,6 +11,7 @@ #include "songs.h" #include "decompress.h" #include "field_weather.h" +#include "field_map_obj.h" #include "unknown_task.h" #include "event_data.h" #include "cable_car_util.h" @@ -144,63 +146,32 @@ const struct OamData gOamData_8401D38 = { .priority = 2 }; -const struct SpriteTemplate gSpriteTemplate_8401D40 = { - 1, - 1, - &gOamData_8401D28, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_8123CB8 -}; - -const struct SpriteTemplate gSpriteTemplate_8401D58 = { - 2, - 1, - &gOamData_8401D30, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_8123CB8 -}; - -const struct SpriteTemplate gSpriteTemplate_8401D70 = { - 3, - 1, - &gOamData_8401D38, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - nullsub_76 -}; - -const u8 gCableCarPlayerGraphicsIDs[] = { - MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, - MAP_OBJ_GFX_RIVAL_MAY_NORMAL -}; - -const u8 gMtChimneyHikerGraphicsIDs[] = { - MAP_OBJ_GFX_HIKER, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_POOCHYENA -}; - -const u16 gMtChimneyHikerCoords[][2] = { - { 0, 80 }, - { 240, 146 } -}; - -const u8 gMtChimneyHikerMovementDelayTable[] = { - 0, - 60, - 120, - 170 -}; - -void (*const gUnknown_08401D9C[])(struct Sprite *sprite) = { - sub_8123EB8, - sub_8123F44 +const struct SpriteTemplate gSpriteTemplate_8401D40[] = { + { + 1, + 1, + &gOamData_8401D28, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + sub_8123CB8 + }, { + 2, + 1, + &gOamData_8401D30, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + sub_8123CB8 + }, { + 3, + 1, + &gOamData_8401D38, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + nullsub_76 + } }; // .text @@ -736,3 +707,132 @@ void sub_8123FBC(bool8 which) break; } } + +void sub_8124118(void) +{ + u8 spriteId; + u8 i; + + u8 playerGraphicsIds[2] = { + MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, + MAP_OBJ_GFX_RIVAL_MAY_NORMAL + }; + u16 rval = Random(); + u8 hikerGraphicsIds[4] = { + MAP_OBJ_GFX_HIKER, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_POOCHYENA + }; + s16 hikerCoords[2][2] = { + { 0, 80 }, + { 240, 146 } + }; + u8 hikerMovementDelayTable[4] = { + 0, + 60, + 120, + 170 + }; + void (*callbacks[2])(struct Sprite *) = { + sub_8123EB8, + sub_8123F44 + }; + + switch (gSpecialVar_0x8004) + { + case 0: + default: + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data0 = 0xc8; + gSprites[spriteId].data1 = 0x49; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data0 = 0xb0; + gSprites[spriteId].data1 = 0x2b; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data0 = 0xc8; + gSprites[spriteId].data1 = 0x63; + gUnknown_02039274->unk_0002 = 7; + gUnknown_02039274->unk_0004 = 0x15e; + sub_807C9B4(2); + break; + case 1: + sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03); + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data0 = 0x80; + gSprites[spriteId].data1 = 0x27; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data0 = 0x68; + gSprites[spriteId].data1 = 0x09; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data0 = 0x80; + gSprites[spriteId].data1 = 0x41; + gUnknown_02039274->unk_0002 = 2; + gUnknown_02039274->unk_0004 = 0x109; + sub_807C9B4(7); + break; + } + for (i = 0; i < 9; i ++) + { + spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 8; + } + if ((rval % 64) == 0) + { + spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX; + gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY; + if (gSpecialVar_0x8004 == 0) + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data1 = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data1 = 0; + } + } + else + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data1 = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data1 = 0; + } + } + gSprites[spriteId].data2 = hikerMovementDelayTable[rval % 4]; + } + } +} |