diff options
author | PikalaxALT <pikalax1@gmail.com> | 2017-05-16 17:08:11 -0400 |
---|---|---|
committer | PikalaxALT <pikalax1@gmail.com> | 2017-05-16 17:08:11 -0400 |
commit | ca26346cff5ca1448896a499072255100cedeb66 (patch) | |
tree | cbbb683bbedf0e82fb822f461e987127afc541f5 | |
parent | e36852b36e79c6041059a41daec9b572f7156f7d (diff) |
sub_80BBCCC (almost matching)
-rw-r--r-- | asm/secret_base.s | 123 | ||||
-rw-r--r-- | include/decoration.h | 19 | ||||
-rw-r--r-- | include/global.h | 36 | ||||
-rw-r--r-- | include/vars.h | 1 | ||||
-rwxr-xr-x | src/secret_base_80bb4ac.c | 222 |
5 files changed, 228 insertions, 173 deletions
diff --git a/asm/secret_base.s b/asm/secret_base.s index 913f6915a..006f8c4a9 100644 --- a/asm/secret_base.s +++ b/asm/secret_base.s @@ -6,129 +6,6 @@ .section .text_b - thumb_func_start sub_80BBCCC -sub_80BBCCC: @ 80BBCCC - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - bl CurrentMapIsSecretBase - lsls r0, 24 - cmp r0, 0 - beq _080BBDBC - ldr r0, _080BBD70 @ =0x00004054 - bl VarGet - lsls r0, 16 - lsrs r5, r0, 16 - movs r1, 0 - mov r0, sp - strh r1, [r0] - ldr r6, _080BBD74 @ =gSaveBlock1 - mov r4, sp - ldr r0, _080BBD78 @ =0x00001a2a - adds r7, r6, r0 -_080BBCFC: - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 5 - ldrh r1, [r4] - adds r2, r0, r1 - ldr r1, _080BBD7C @ =0x00001a1a - adds r0, r6, r1 - adds r1, r2, r0 - ldrb r0, [r1] - subs r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x77 - bhi _080BBD3A - ldr r0, _080BBD80 @ =gDecorations - ldrb r3, [r1] - lsls r1, r3, 5 - adds r1, r0 - ldrb r0, [r1, 0x11] - cmp r0, 0x4 - beq _080BBD3A - adds r0, r2, r7 - ldrb r2, [r0] - lsrs r0, r2, 4 - adds r0, 0x7 - movs r1, 0xF - ands r1, r2 - adds r1, 0x7 - adds r2, r3, 0 - bl sub_80FF394 -_080BBD3A: - ldrh r0, [r4] - adds r0, 0x1 - lsls r0, 16 - lsrs r0, 16 - strh r0, [r4] - cmp r0, 0xF - bls _080BBCFC - cmp r5, 0 - beq _080BBD88 - mov r4, sp - adds r4, 0x2 - movs r2, 0x88 - lsls r2, 2 - mov r0, sp - adds r1, r4, 0 - bl sub_80BB764 - mov r0, sp - ldrh r0, [r0] - adds r0, 0x7 - ldrh r1, [r4] - adds r1, 0x7 - ldr r2, _080BBD84 @ =0x00000e21 - bl MapGridSetMetatileIdAt - b _080BBDBC - .align 2, 0 -_080BBD70: .4byte 0x00004054 -_080BBD74: .4byte gSaveBlock1 -_080BBD78: .4byte 0x00001a2a -_080BBD7C: .4byte 0x00001a1a -_080BBD80: .4byte gDecorations -_080BBD84: .4byte 0x00000e21 -_080BBD88: - mov r0, r8 - cmp r0, 0x1 - bne _080BBDBC - ldr r0, _080BBDC8 @ =0x00004089 - bl VarGet - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bne _080BBDBC - mov r4, sp - adds r4, 0x2 - movs r2, 0x88 - lsls r2, 2 - mov r0, sp - adds r1, r4, 0 - bl sub_80BB764 - mov r0, sp - ldrh r0, [r0] - adds r0, 0x7 - ldrh r1, [r4] - adds r1, 0x7 - ldr r2, _080BBDCC @ =0x00000e0a - bl MapGridSetMetatileIdAt -_080BBDBC: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080BBDC8: .4byte 0x00004089 -_080BBDCC: .4byte 0x00000e0a - thumb_func_end sub_80BBCCC - thumb_func_start sub_80BBDD0 sub_80BBDD0: @ 80BBDD0 push {r4-r7,lr} diff --git a/include/decoration.h b/include/decoration.h index 4bad93d1f..4f24d451d 100644 --- a/include/decoration.h +++ b/include/decoration.h @@ -3,14 +3,17 @@ struct Decoration { - u8 id; - u8 name[16]; - u8 decor_field_11; - u8 decor_field_12; - u8 decor_field_13; - u16 price; - u8 *description; - void *tiles; + /*0x00*/ u8 id; + /*0x01*/ u8 name[16]; + /*0x11*/ u8 decor_field_11; + /*0x12*/ u8 decor_field_12; + /*0x13*/ u8 decor_field_13; + /*0x14*/ u16 price; + /*0x16*/ u8 *description; + /*0x1A*/ void *tiles; }; +extern struct Decoration gDecorations[0x77]; +extern void sub_80FF394(u16 unkr0, u16 unkr1, u16 unkr2); + #endif // GUARD_DECORATION_H diff --git a/include/global.h b/include/global.h index e106e2b6f..28d7b1c96 100644 --- a/include/global.h +++ b/include/global.h @@ -94,24 +94,24 @@ struct UCoords16 struct SecretBaseRecord { - u8 sbr_field_0; // ID? - u8 sbr_field_1_0:4; - u8 gender:1; - u8 sbr_field_1_5:1; - u8 sbr_field_1_6:2; - u8 sbr_field_2[7]; // 0xFF bytes? - u8 trainerId[4]; // byte 0 is used for determining trainer class - u16 sbr_field_e; - u8 sbr_field_10; - u8 sbr_field_11; - u8 decorations[16]; - u8 sbr_field_22[16]; - u32 partyPersonality[6]; - u16 partyMoves[6 * 4]; - u16 partySpecies[6]; - u16 partyHeldItems[6]; - u8 partyLevels[6]; - u8 partyEVs[6]; + /*0x1A08*/ u8 sbr_field_0; // ID? + /*0x1A09*/ u8 sbr_field_1_0:4; + /*0x1A09*/ u8 gender:1; + /*0x1A09*/ u8 sbr_field_1_5:1; + /*0x1A09*/ u8 sbr_field_1_6:2; + /*0x1A0A*/ u8 sbr_field_2[7]; // 0xFF bytes? + /*0x1A12*/ u8 trainerId[4]; // byte 0 is used for determining trainer class + /*0x1A16*/ u16 sbr_field_e; + /*0x1A18*/ u8 sbr_field_10; + /*0x1A19*/ u8 sbr_field_11; + /*0x1A1A*/ u8 decorations[16]; + /*0x1A2A*/ u8 sbr_field_22[16]; + /*0x1A3A*/ u32 partyPersonality[6]; + /*0x1A52*/ u16 partyMoves[6 * 4]; + /*0x1A6A*/ u16 partySpecies[6]; + /*0x1A76*/ u16 partyHeldItems[6]; + /*0x1A82*/ u8 partyLevels[6]; + /*0x1A88*/ u8 partyEVs[6]; }; #include "game_stat.h" diff --git a/include/vars.h b/include/vars.h index 6a23695fb..c2bddeedc 100644 --- a/include/vars.h +++ b/include/vars.h @@ -28,6 +28,7 @@ #define VAR_0x4054 0x4054 +#define VAR_0x4089 0x4089 #define VAR_0x4097 0x4097 #define VAR_PORTHOLE 0x40B4 diff --git a/src/secret_base_80bb4ac.c b/src/secret_base_80bb4ac.c index 990da5727..a0fbb1212 100755 --- a/src/secret_base_80bb4ac.c +++ b/src/secret_base_80bb4ac.c @@ -11,13 +11,15 @@ #include "map_constants.h" #include "task.h" #include "palette.h" +#include "decoration.h" #include "field_weather.h" extern u8 gUnknown_020387DC; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8007; extern u16 gScriptResult; -extern const struct { +extern const struct +{ u16 unk_083D1358_0; u16 unk_083D1358_1; } gUnknown_083D1358[7]; @@ -26,7 +28,8 @@ extern void *gUnknown_0300485C; extern u8 sub_807D770(void); -void sub_80BB4AC(struct SecretBaseRecord *record) { // 080bb4ac +void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac +{ u16 i; u16 j; record->sbr_field_0 = 0; @@ -57,21 +60,25 @@ void sub_80BB4AC(struct SecretBaseRecord *record) { // 080bb4ac } } -void ResetSecretBase(u8 idx) { // 80bb594 +void ResetSecretBase(u8 idx) // 80bb594 +{ sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); } -void ResetSecretBases(void) { // 080bb5b4 +void ResetSecretBases(void) // 080bb5b4 +{ u16 i; for (i=0; i<20; i++) ResetSecretBase(i); } -void sub_80BB5D0(void) { // 080bb5d0 +void sub_80BB5D0(void) // 080bb5d0 +{ gUnknown_020387DC = gSpecialVar_0x8004; } -void sub_80BB5E4(void) { // 80bb5e4 +void sub_80BB5E4(void) // 80bb5e4 +{ u16 idx; gScriptResult = 0; for (idx=0; idx<20; idx++) { @@ -83,14 +90,16 @@ void sub_80BB5E4(void) { // 80bb5e4 } } -void sub_80BB63C(void) { // 80bb63c +void sub_80BB63C(void) // 80bb63c +{ if (gSaveBlock1.secretBases[0].sbr_field_0) gScriptResult = 1; else gScriptResult = 0; } -u8 sub_80BB66C(void) { // 80bb66c +u8 sub_80BB66C(void) // 80bb66c +{ s16 x, y; s16 v0; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); @@ -110,11 +119,13 @@ u8 sub_80BB66C(void) { // 80bb66c return 0; } -void sub_80BB70C(void) { // 80bb70c +void sub_80BB70C(void) // 80bb70c +{ gSpecialVar_0x8007 = sub_80BB66C(); } -s16 unref_sub_80BB724(u16 *a0, u8 a1) { +s16 unref_sub_80BB724(u16 *a0, u8 a1) +{ u16 v2; for (v2=0; v2<0x200; v2++) { if ((a0[v2] & 0xFFF) == a1) @@ -123,7 +134,8 @@ s16 unref_sub_80BB724(u16 *a0, u8 a1) { return -1; } -void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) { +void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) +{ s16 x, y; for (y=0; y<gMapHeader.mapData->height; y++) { for (x=0; x<gMapHeader.mapData->width; x++) { @@ -136,7 +148,8 @@ void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) { } } -void sub_80BB800(void) { +void sub_80BB800(void) +{ s16 x, y; s16 tile_id; u16 idx; @@ -158,7 +171,8 @@ void sub_80BB800(void) { } } -u8 sub_80BB8A8(u8 *arg1) { +u8 sub_80BB8A8(u8 *arg1) +{ u8 idx; for (idx=0; idx<7; idx++) { if (arg1[idx] == EOS) @@ -167,7 +181,8 @@ u8 sub_80BB8A8(u8 *arg1) { return 7; } -void sub_80BB8CC(void) { +void sub_80BB8CC(void) +{ u8 nameLength; u16 idx; gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; @@ -182,7 +197,8 @@ void sub_80BB8CC(void) { VarSet(VAR_SECRET_BASE_MAP, gMapHeader.name); } -void sub_80BB970(struct MapEvents *events) { +void sub_80BB970(struct MapEvents *events) +{ u16 bgevidx, idx, jdx; s16 tile_id; for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) { @@ -203,12 +219,14 @@ void sub_80BB970(struct MapEvents *events) { } } -void sub_80BBA14(void) { +void sub_80BBA14(void) +{ s8 idx = 4 * (gUnknown_020387DC / 10); warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); } -void sub_80BBA48(u8 taskid) { +void sub_80BBA48(u8 taskid) +{ u16 curbaseid; switch (gTasks[taskid].data[0]) { case 0: @@ -232,19 +250,22 @@ void sub_80BBA48(u8 taskid) { } } -void sub_80BBAF0(void) { +void sub_80BBAF0(void) +{ CreateTask(sub_80BBA48, 0); fade_screen(1, 0); saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); } -bool8 sub_80BBB24(void) { +bool8 sub_80BBB24(void) +{ if (gMapHeader.mapType == 9 && VarGet(VAR_0x4097) == 0) return FALSE; return TRUE; } -void sub_80BBB50(u8 taskid) { +void sub_80BBB50(u8 taskid) +{ FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); if (sub_807D770() == 1) { EnableBothScriptContexts(); @@ -252,7 +273,8 @@ void sub_80BBB50(u8 taskid) { } } -void sub_80BBB90(void) { +void sub_80BBB90(void) +{ s16 x, y; ScriptContext2_Enable(); HideMapNamePopup(); @@ -263,7 +285,8 @@ void sub_80BBB90(void) { CreateTask(sub_80BBB50, 0); } -void sub_80BBBEC(u8 taskid) { +void sub_80BBBEC(u8 taskid) +{ s8 idx; if (!gPaletteFade.active) { idx = 4 * (gUnknown_020387DC / 10); @@ -275,14 +298,165 @@ void sub_80BBBEC(u8 taskid) { } } -void sub_80BBC78(void) { +void sub_80BBC78(void) +{ u8 taskid = CreateTask(sub_80BBBEC, 0); gTasks[taskid].data[0] = 0; fade_screen(1, 0); } -bool8 CurrentMapIsSecretBase(void) { +bool8 CurrentMapIsSecretBase(void) +{ if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) return TRUE; return FALSE; } + +#ifdef NONMATCHING +void sub_80BBCCC(u8 flagIn) +{ + u16 curBaseId; + u16 x, y; + if (CurrentMapIsSecretBase()) { + curBaseId = VarGet(VAR_0x4054); + for (x=0; x<16; x++) { + if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { + sub_80FF394((gSaveBlock1.secretBases[0].sbr_field_22[x] >> 4) + 7, (gSaveBlock1.secretBases[0].sbr_field_22[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); + } + } + if (curBaseId != 0) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); + } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); + } + } +} +#else +__attribute__((naked)) +void sub_80BBCCC(u8 flagIn) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + bl CurrentMapIsSecretBase\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080BBDBC\n\ + ldr r0, _080BBD70 @ =0x00004054\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + movs r1, 0\n\ + mov r0, sp\n\ + strh r1, [r0]\n\ + ldr r6, _080BBD74 @ =gSaveBlock1\n\ + mov r4, sp\n\ + ldr r0, _080BBD78 @ =0x00001a2a\n\ + adds r7, r6, r0\n\ +_080BBCFC:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldrh r1, [r4]\n\ + adds r2, r0, r1\n\ + ldr r1, _080BBD7C @ =0x00001a1a\n\ + adds r0, r6, r1\n\ + adds r1, r2, r0\n\ + ldrb r0, [r1]\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x77\n\ + bhi _080BBD3A\n\ + ldr r0, _080BBD80 @ =gDecorations\n\ + ldrb r3, [r1]\n\ + lsls r1, r3, 5\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x11]\n\ + cmp r0, 0x4\n\ + beq _080BBD3A\n\ + adds r0, r2, r7\n\ + ldrb r2, [r0]\n\ + lsrs r0, r2, 4\n\ + adds r0, 0x7\n\ + movs r1, 0xF\n\ + ands r1, r2\n\ + adds r1, 0x7\n\ + adds r2, r3, 0\n\ + bl sub_80FF394\n\ +_080BBD3A:\n\ + ldrh r0, [r4]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + strh r0, [r4]\n\ + cmp r0, 0xF\n\ + bls _080BBCFC\n\ + cmp r5, 0\n\ + beq _080BBD88\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBD84 @ =0x00000e21\n\ + bl MapGridSetMetatileIdAt\n\ + b _080BBDBC\n\ + .align 2, 0\n\ +_080BBD70: .4byte 0x00004054\n\ +_080BBD74: .4byte gSaveBlock1\n\ +_080BBD78: .4byte 0x00001a2a\n\ +_080BBD7C: .4byte 0x00001a1a\n\ +_080BBD80: .4byte gDecorations\n\ +_080BBD84: .4byte 0x00000e21\n\ +_080BBD88:\n\ + mov r0, r8\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + ldr r0, _080BBDC8 @ =0x00004089\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBDCC @ =0x00000e0a\n\ + bl MapGridSetMetatileIdAt\n\ +_080BBDBC:\n\ + add sp, 0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BBDC8: .4byte 0x00004089\n\ +_080BBDCC: .4byte 0x00000e0a\n\ +.syntax divided\n"); +} +#endif |