diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/secret_base.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/secret_base.c b/src/secret_base.c index d92a035be..5f6ee5ea6 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -5,6 +5,7 @@ #include "decoration.h" #include "decoration_inventory.h" #include "fieldmap.h" +#include "field_camera.h" #include "field_player_avatar.h" #include "text.h" #include "event_data.h" @@ -26,6 +27,11 @@ EWRAM_DATA struct SecretBaseListMenuBuffer *gUnknown_0203A020 = NULL; // .rodata +extern const struct { + u16 tile1; + u16 tile2; +} gUnknown_0858CFCC[7]; + // .text void sub_80E8AF0(struct SecretBaseRecord *sbr) @@ -117,3 +123,144 @@ u8 sub_80E8BF8(void) } return 0; } + +void sub_80E8C98(void) +{ + gSpecialVar_0x8007 = sub_80E8BF8(); +} + +#ifdef NONMATCHING +// This function was refactored in some mysterious way +void sub_80E8CB0(s16 *xPtr, s16 *yPtr, u16 tile) +{ + struct MapData *mapData; + s16 x; + s16 y; + + mapData = gMapHeader.mapData; + for (y = 0; y < mapData->height; y ++) + { + for (x = 0; x < mapData->width; x ++) + { + if ((mapData->map[y * mapData->width + x] % 0x400) == tile) + { + *xPtr = x; + *yPtr = y; + return; + } + } + } +} +#else +__attribute__((naked)) void sub_80E8CB0(s16 *xPtr, s16 *yPtr, u16 tile) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x8\n" + "\tstr r0, [sp]\n" + "\tstr r1, [sp, 0x4]\n" + "\tlsls r2, 16\n" + "\tlsrs r2, 16\n" + "\tmov r10, r2\n" + "\tldr r0, =gMapHeader\n" + "\tldr r0, [r0]\n" + "\tmov r8, r0\n" + "\tmovs r0, 0\n" + "\tmov r12, r0\n" + "\tmov r1, r8\n" + "\tldr r0, [r1, 0x4]\n" + "\tcmp r12, r0\n" + "\tbge _080E8D3C\n" + "\tldr r4, [r1]\n" + "_080E8CDA:\n" + "\tmovs r2, 0\n" + "\tmov r0, r12\n" + "\tlsls r7, r0, 16\n" + "\tcmp r2, r4\n" + "\tbge _080E8D28\n" + "\tasrs r0, r7, 16\n" + "\tadds r6, r0, 0\n" + "\tmuls r6, r4\n" + "\tmov r1, r8\n" + "\tldr r5, [r1, 0xC]\n" + "\tldr r0, =0x000003ff\n" + "\tmov r9, r0\n" + "_080E8CF2:\n" + "\tlsls r0, r2, 16\n" + "\tasrs r3, r0, 16\n" + "\tadds r0, r6, r3\n" + "\tlsls r0, 1\n" + "\tadds r0, r5\n" + "\tldrh r1, [r0]\n" + "\tmov r0, r9\n" + "\tands r0, r1\n" + "\tcmp r0, r10\n" + "\tbne _080E8D1C\n" + "\tldr r1, [sp]\n" + "\tstrh r2, [r1]\n" + "\tmov r0, r12\n" + "\tldr r2, [sp, 0x4]\n" + "\tstrh r0, [r2]\n" + "\tb _080E8D3C\n" + "\t.pool\n" + "_080E8D1C:\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r2, r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r4\n" + "\tblt _080E8CF2\n" + "_080E8D28:\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 9\n" + "\tadds r1, r7, r2\n" + "\tlsrs r0, r1, 16\n" + "\tmov r12, r0\n" + "\tasrs r1, 16\n" + "\tmov r2, r8\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tblt _080E8CDA\n" + "_080E8D3C:\n" + "\tadd sp, 0x8\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +void sub_80E8D4C(void) +{ + s16 x; + s16 y; + s16 tile; + u16 i; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tile = MapGridGetMetatileIdAt(x, y); + for (i = 0; i < 7; i ++) + { + if (gUnknown_0858CFCC[i].tile1 == tile) + { + MapGridSetMetatileIdAt(x, y, gUnknown_0858CFCC[i].tile2 | 0xC00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } + for (i = 0; i < 7; i ++) + { + if (gUnknown_0858CFCC[i].tile2 == tile) + { + MapGridSetMetatileIdAt(x, y, gUnknown_0858CFCC[i].tile1 | 0xC00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } +} |