summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/secret_base.s258
-rwxr-xr-xinclude/field_map_obj.h1
-rw-r--r--include/vars.h2
-rwxr-xr-xsrc/field_map_obj.c9
-rw-r--r--src/secret_base.c76
5 files changed, 84 insertions, 262 deletions
diff --git a/asm/secret_base.s b/asm/secret_base.s
index 8f32ad43b..05a832bee 100644
--- a/asm/secret_base.s
+++ b/asm/secret_base.s
@@ -5,264 +5,6 @@
.text
- thumb_func_start sub_80E933C
-sub_80E933C: @ 80E933C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x18
- bl CurrentMapIsSecretBase
- lsls r0, 24
- cmp r0, 0
- bne _080E9374
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, =0x0000271c
- adds r1, r0, r1
- str r1, [sp, 0x4]
- ldr r2, =0x00002728
- adds r2, r0, r2
- str r2, [sp, 0x8]
- movs r3, 0xC
- str r3, [sp, 0x10]
- b _080E939C
- .pool
-_080E9374:
- ldr r0, =0x00004054
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- ldr r2, =gSaveBlock1Ptr
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 5
- ldr r4, =0x00001a9c
- adds r1, r4
- ldr r0, [r2]
- adds r0, r1
- adds r1, r0, 0
- adds r1, 0x12
- str r1, [sp, 0x4]
- adds r0, 0x22
- str r0, [sp, 0x8]
- movs r2, 0x10
- str r2, [sp, 0x10]
-_080E939C:
- movs r6, 0
- b _080E955A
- .pool
-_080E93AC:
- ldr r4, [sp, 0x4]
- adds r0, r4, r6
- ldrb r1, [r0]
- mov r10, r0
- adds r0, r6, 0x1
- str r0, [sp, 0x14]
- cmp r1, 0
- bne _080E93BE
- b _080E9554
-_080E93BE:
- mov r1, r10
- ldrb r0, [r1]
- lsls r0, 5
- ldr r2, =gDecorations
- adds r0, r2
- ldrb r1, [r0, 0x11]
- ldrb r0, [r0, 0x13]
- str r0, [sp, 0xC]
- cmp r1, 0x4
- beq _080E93D4
- b _080E9554
-_080E93D4:
- movs r5, 0
- ldr r0, =gMapHeader
- ldr r3, [r0, 0x4]
- ldrb r4, [r3]
- mov r9, r0
- cmp r5, r4
- bcs _080E9412
- ldr r0, [r3, 0x4]
- ldrh r2, [r0, 0x14]
- ldr r1, =gSpecialVar_0x8004
- ldrh r0, [r1]
- adds r0, 0xAE
- adds r7, r1, 0
- cmp r2, r0
- beq _080E9412
- adds r2, r4, 0
-_080E93F4:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, r2
- bcs _080E9412
- ldr r1, [r3, 0x4]
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- ldrh r1, [r0, 0x14]
- ldrh r0, [r7]
- adds r0, 0xAE
- cmp r1, r0
- bne _080E93F4
-_080E9412:
- mov r3, r9
- ldr r0, [r3, 0x4]
- ldrb r0, [r0]
- cmp r5, r0
- bne _080E941E
- b _080E9554
-_080E941E:
- ldr r4, =gSpecialVar_0x8006
- mov r8, r4
- ldr r0, [sp, 0x8]
- adds r1, r0, r6
- ldrb r0, [r1]
- lsrs r0, 4
- strh r0, [r4]
- ldr r7, =gSpecialVar_0x8007
- ldrb r1, [r1]
- movs r0, 0xF
- ands r0, r1
- strh r0, [r7]
- ldrh r0, [r4]
- adds r0, 0x7
- ldrh r1, [r7]
- adds r1, 0x7
- bl MapGridGetMetatileBehaviorAt
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl MetatileBehavior_IsMB_B5
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _080E9462
- adds r0, r4, 0
- bl MetatileBehavior_IsMB_C3
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080E9554
-_080E9462:
- ldr r6, =gScriptResult
- mov r1, r9
- ldr r0, [r1, 0x4]
- ldr r1, [r0, 0x4]
- lsls r4, r5, 1
- adds r4, r5
- lsls r4, 3
- adds r1, r4, r1
- ldr r2, =0x00003f20
- adds r0, r2, 0
- ldrb r1, [r1, 0x1]
- adds r0, r1
- strh r0, [r6]
- ldrh r0, [r6]
- mov r3, r10
- ldrb r1, [r3]
- lsls r1, 5
- ldr r2, =gDecorations + 0x1c
- adds r1, r2
- ldr r1, [r1]
- ldrh r1, [r1]
- bl VarSet
- mov r3, r9
- ldr r0, [r3, 0x4]
- ldr r0, [r0, 0x4]
- adds r4, r0
- ldrb r0, [r4]
- strh r0, [r6]
- ldr r0, =gSpecialVar_0x8004
- ldrh r0, [r0]
- adds r0, 0xAE
- lsls r0, 16
- lsrs r0, 16
- bl FlagClear
- ldrb r0, [r6]
- ldr r5, =gSaveBlock1Ptr
- ldr r2, [r5]
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- bl show_sprite
- ldrb r0, [r6]
- ldr r2, [r5]
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- mov r4, r8
- movs r3, 0
- ldrsh r4, [r4, r3]
- mov r8, r4
- movs r4, 0
- ldrsh r7, [r7, r4]
- str r7, [sp]
- mov r3, r8
- bl sub_808EBA8
- ldrb r0, [r6]
- ldr r2, [r5]
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- bl sub_808F254
- bl CurrentMapIsSecretBase
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080E954C
- ldr r0, =0x00004054
- bl VarGet
- lsls r0, 16
- cmp r0, 0
- beq _080E954C
- ldr r0, [sp, 0xC]
- cmp r0, 0x6
- bne _080E9538
- ldrb r0, [r6]
- ldr r2, [r5]
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- movs r3, 0x6
- bl sub_808F28C
- b _080E954C
- .pool
-_080E9538:
- ldr r1, [sp, 0xC]
- cmp r1, 0x7
- bne _080E954C
- ldrb r0, [r6]
- ldr r2, [r5]
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- movs r3, 0x7
- bl sub_808F28C
-_080E954C:
- ldr r1, =gSpecialVar_0x8004
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
-_080E9554:
- ldr r2, [sp, 0x14]
- lsls r0, r2, 24
- lsrs r6, r0, 24
-_080E955A:
- ldr r3, [sp, 0x10]
- cmp r6, r3
- bcs _080E9562
- b _080E93AC
-_080E9562:
- add sp, 0x18
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_80E933C
-
thumb_func_start sub_80E9578
sub_80E9578: @ 80E9578
push {r4-r6,lr}
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index 038233fe6..0107fa10f 100755
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -36,6 +36,7 @@ void npc_load_two_palettes__and_record(u16, u8);
void sub_808EBA8(u8, u8, u8, s16, s16);
void pal_patch_for_npc(u16, u8);
void sub_808E16C(s16, s16);
+void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat);
void sub_8092FF0(s16, s16, s16 *, s16 *);
u8 FieldObjectDirectionToImageAnimId(u8);
void sub_80930E0(s16 *, s16 *, s16, s16);
diff --git a/include/vars.h b/include/vars.h
index 67c0b67fc..d5656ee5f 100644
--- a/include/vars.h
+++ b/include/vars.h
@@ -1,6 +1,8 @@
#ifndef GUARD_VARS_H
#define GUARD_VARS_H
+#define VAR_0x3F20 0x3F20
+
#define VAR_0x4000 0x4000
#define VAR_0x4001 0x4001
#define VAR_0x4002 0x4002
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index e822fc1ca..9932563f2 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -21,6 +21,7 @@
#include "field_effect_helpers.h"
#include "field_camera.h"
#include "trainer_see.h"
+#include "decoration.h"
#include "field_map_obj.h"
#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51
@@ -1755,18 +1756,18 @@ void sub_808F254(u8 localId, u8 mapNum, u8 mapGroup)
}
}
-void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 action)
+void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat)
{
u8 mapObjectId;
if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
{
- switch (action)
+ switch (decorCat)
{
- case 6:
+ case DECORCAT_DOLL:
sub_808F228(&gMapObjects[mapObjectId], gUnknown_082766A2);
break;
- case 7:
+ case DECORCAT_CUSHION:
sub_808F228(&gMapObjects[mapObjectId], gUnknown_082766A6);
break;
}
diff --git a/src/secret_base.c b/src/secret_base.c
index c55c48af7..411f2aa0f 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -12,6 +12,7 @@
#include "field_screen.h"
#include "field_weather.h"
#include "field_map_obj.h"
+#include "metatile_behavior.h"
#include "map_name_popup.h"
#include "text.h"
#include "string_util.h"
@@ -394,3 +395,78 @@ void sub_80E9238(u8 flagIn)
}
}
}
+
+void sub_80E933C(void)
+{
+ u8 *roomdecor;
+ u8 *roomdecorpos;
+ u8 decidx;
+ u8 objid;
+ u8 metatile;
+ u8 category;
+ u8 permission;
+ u8 ndecor;
+ u16 curBase;
+
+ objid = 0;
+ if (!CurrentMapIsSecretBase())
+ {
+ roomdecor = gSaveBlock1Ptr->playerRoomDecor;
+ roomdecorpos = gSaveBlock1Ptr->playerRoomDecorPos;
+ ndecor = 12;
+ }
+ else
+ {
+ curBase = VarGet(VAR_0x4054);
+ roomdecor = gSaveBlock1Ptr->secretBases[curBase].decorations;
+ roomdecorpos = gSaveBlock1Ptr->secretBases[curBase].decorationPos;
+ ndecor = 16;
+ }
+ for (decidx = 0; decidx < ndecor; decidx ++)
+ {
+ if (roomdecor[decidx] != DECOR_NONE)
+ {
+ permission = gDecorations[roomdecor[decidx]].permission;
+ category = gDecorations[roomdecor[decidx]].category;
+ if (permission == DECORPERM_SOLID_MAT)
+ {
+ for (objid = 0; objid < gMapHeader.events->mapObjectCount; objid ++)
+ {
+ if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE)
+ {
+ break;
+ }
+ }
+ if (objid == gMapHeader.events->mapObjectCount)
+ {
+ continue;
+ }
+ gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4;
+ gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF;
+ metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7);
+ if (MetatileBehavior_IsMB_B5(metatile) == TRUE || MetatileBehavior_IsMB_C3(metatile) == TRUE)
+ {
+ gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20;
+ VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]);
+ gScriptResult = gMapHeader.events->mapObjects[objid].localId;
+ FlagClear(gSpecialVar_0x8004 + 0xAE);
+ show_sprite(gScriptResult, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ sub_808EBA8(gScriptResult, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007);
+ sub_808F254(gScriptResult, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ if (CurrentMapIsSecretBase() == TRUE && VarGet(VAR_0x4054) != 0)
+ {
+ if (category == DECORCAT_DOLL)
+ {
+ sub_808F28C(gScriptResult, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, DECORCAT_DOLL);
+ }
+ else if (category == DECORCAT_CUSHION)
+ {
+ sub_808F28C(gScriptResult, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, DECORCAT_CUSHION);
+ }
+ }
+ gSpecialVar_0x8004 ++;
+ }
+ }
+ }
+ }
+}