summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalax1@gmail.com>2017-05-16 17:08:11 -0400
committerPikalaxALT <pikalax1@gmail.com>2017-05-16 17:08:11 -0400
commitca26346cff5ca1448896a499072255100cedeb66 (patch)
treecbbb683bbedf0e82fb822f461e987127afc541f5
parente36852b36e79c6041059a41daec9b572f7156f7d (diff)
sub_80BBCCC (almost matching)
-rw-r--r--asm/secret_base.s123
-rw-r--r--include/decoration.h19
-rw-r--r--include/global.h36
-rw-r--r--include/vars.h1
-rwxr-xr-xsrc/secret_base_80bb4ac.c222
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