diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/contest_painting.c | 8 | ||||
-rw-r--r-- | src/mossdeep_gym.c | 313 | ||||
-rw-r--r-- | src/multiboot.c | 2 | ||||
-rw-r--r-- | src/scrcmd.c | 11 |
4 files changed, 325 insertions, 9 deletions
diff --git a/src/contest_painting.c b/src/contest_painting.c new file mode 100644 index 000000000..7950b7cac --- /dev/null +++ b/src/contest_painting.c @@ -0,0 +1,8 @@ +#include "global.h" + +// IWRAM bss +IWRAM_DATA u8 gUnknown_030011F0; +IWRAM_DATA u16 gUnknown_030011F2; +IWRAM_DATA u16 gUnknown_030011F4; +IWRAM_DATA u8 gUnknown_030011F6; +IWRAM_DATA u8 gUnknown_030011F7; diff --git a/src/mossdeep_gym.c b/src/mossdeep_gym.c new file mode 100644 index 000000000..e1fdb21db --- /dev/null +++ b/src/mossdeep_gym.c @@ -0,0 +1,313 @@ +#include "global.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "malloc.h" +#include "mossdeep_gym.h" +#include "script_movement.h" +#include "constants/event_object_movement_constants.h" + +// Movement scripts. +extern const u8 gUnknown_08612698[]; +extern const u8 gUnknown_0861269C[]; +extern const u8 gUnknown_086126A0[]; +extern const u8 gUnknown_086126A4[]; +extern const u8 gUnknown_086126A8[]; +extern const u8 gUnknown_086126AA[]; +extern const u8 gUnknown_086126AC[]; +extern const u8 gUnknown_086126AE[]; + +struct MossdeepSubStruct +{ + u8 unk0; + u8 eventTemplateId; +}; + +struct MossdeepStruct +{ + struct MossdeepSubStruct unk0[0x10]; + u8 count; + u8 unk41; +}; + +// This file's functions. +static void sub_81A8D60(u8 eventTemplateId, u8 arg1); +static void sub_81A8D94(u8 eventTemplateId, u8 arg1); + +// EWRAM vars +EWRAM_DATA static struct MossdeepStruct *gUnknown_0203CE50 = NULL; + +// code +void sub_81A8934(u8 arg0) +{ + if (gUnknown_0203CE50 == NULL) + gUnknown_0203CE50 = AllocZeroed(sizeof(*gUnknown_0203CE50)); + + gUnknown_0203CE50->unk41 = arg0; +} + +void sub_81A895C(void) +{ + u8 id; + + if (gUnknown_0203CE50 != NULL) + FREE_AND_SET_NULL(gUnknown_0203CE50); + + id = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[id]); + sub_80D338C(); +} + +u16 sub_81A89A0(u8 arg0) +{ + u8 i; + struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates; + u16 localId = 0; + + for (i = 0; i < EVENT_OBJECT_TEMPLATES_COUNT; i++) + { + s32 var; + u8 r5; + s16 x = events[i].x + 7; + s16 y = events[i].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (gUnknown_0203CE50->unk41 == 0) + var = 0x250; + else + var = 0x298; + + if (metatile < 0x250) + continue; + + if ((u8)((metatile - var) / 8) >= 5) + continue; + if ((u8)((metatile - var) / 8) != arg0) + continue; + + r5 = (u8)((metatile - var) % 8); + if (r5 < 4) + { + s8 x = 0; + s8 y = 0; + const u8 *movementScript; + + switch (r5) + { + case 0: + movementScript = gUnknown_08612698; + x = 1; + break; + case 1: + movementScript = gUnknown_0861269C; + y = 1; + break; + case 2: + movementScript = gUnknown_086126A0; + x = -1; + break; + case 3: + movementScript = gUnknown_086126A4; + y = -1; + break; + default: + continue; + } + + events[i].x += x; + events[i].y += y; + if (GetEventObjectIdByLocalIdAndMap(events[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup) != EVENT_OBJECTS_COUNT) + { + sub_81A8D60(i, r5); + localId = events[i].localId; + ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); + } + else + { + sub_81A8D94(i, r5); + } + } + } + + return localId; +} + +void sub_81A8AF8(void) +{ + u8 i; + s32 var; + struct EventObjectTemplate *events; + + if (gUnknown_0203CE50 == NULL) + return; + + if (gUnknown_0203CE50->unk41 == 0) + var = 0x250; + else + var = 0x298; + + events = gSaveBlock1Ptr->eventObjectTemplates; + for (i = 0; i < gUnknown_0203CE50->count; i++) + { + s32 r6; + s8 r0; + u8 eventObjectId; + s16 x = events[gUnknown_0203CE50->unk0[i].eventTemplateId].x + 7; + s16 y = events[gUnknown_0203CE50->unk0[i].eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + r0 = (u8)((metatile - var) % 8); + r0 -= (gUnknown_0203CE50->unk0[i].unk0); + if (r0 < 0 || r0 == 3) + { + if (r0 == -3) + r6 = 1; + else + r6 = 0; + } + else + { + if (r0 > 0) + r6 = 1; + else + r6 = 2; + } + + eventObjectId = GetEventObjectIdByLocalIdAndMap(events[gUnknown_0203CE50->unk0[i].eventTemplateId].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + if (eventObjectId != EVENT_OBJECTS_COUNT) + { + const u8 *movementScript; + u8 direction = gEventObjects[eventObjectId].facingDirection; + if (r6 == 0) + { + switch (direction) + { + case DIR_EAST: + movementScript = gUnknown_086126AE; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_SOUTH: + movementScript = gUnknown_086126A8; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case DIR_WEST: + movementScript = gUnknown_086126AA; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_NORTH: + movementScript = gUnknown_086126AC; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->unk0[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + else if (r6 == 1) + { + switch (direction) + { + case DIR_EAST: + movementScript = gUnknown_086126AA; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_SOUTH: + movementScript = gUnknown_086126AC; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case DIR_WEST: + movementScript = gUnknown_086126AE; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_NORTH: + movementScript = gUnknown_086126A8; + events[gUnknown_0203CE50->unk0[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->unk0[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + } + } +} + +static void sub_81A8D60(u8 eventTemplateId, u8 arg1) +{ + gUnknown_0203CE50->unk0[gUnknown_0203CE50->count].eventTemplateId = eventTemplateId; + gUnknown_0203CE50->unk0[gUnknown_0203CE50->count].unk0 = arg1; + gUnknown_0203CE50->count++; +} + +static void sub_81A8D94(u8 eventTemplateId, u8 arg1) +{ + s8 r0; + s32 r6; + s32 var; + u16 movementType; + struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates; + s16 x = events[eventTemplateId].x + 7; + s16 y = events[eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (gUnknown_0203CE50->unk41 == 0) + var = 0x250; + else + var = 0x298; + + r0 = (u8)((metatile - var) % 8); + r0 -= arg1; + if (r0 < 0 || r0 == 3) + r6 = 0; + else if (r0 > 0 || r0 == -3) + r6 = 1; + else + r6 = 2; + + movementType = events[eventTemplateId].movementType; + if (r6 == 0) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_DOWN: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_UP: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + break; + } + } + else if (r6 == 1) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_DOWN: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_UP: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + break; + } + } +} diff --git a/src/multiboot.c b/src/multiboot.c index 7fd6df2d0..da90a55c0 100644 --- a/src/multiboot.c +++ b/src/multiboot.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "multiboot.h" -static u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; +IWRAM_DATA static u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; static int MultiBootSend(struct MultiBootParam *mp, u16 data); static int MultiBootHandShake(struct MultiBootParam *mp); diff --git a/src/scrcmd.c b/src/scrcmd.c index d2a6c2a17..016c0ba50 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -4,6 +4,7 @@ #include "berry.h" #include "clock.h" #include "coins.h" +#include "contest.h" #include "contest_link_80F57C4.h" #include "contest_painting.h" #include "data2.h" @@ -27,6 +28,7 @@ #include "event_obj_lock.h" #include "menu.h" #include "money.h" +#include "mossdeep_gym.h" #include "mystery_event_script.h" #include "palette.h" #include "party_menu.h" @@ -49,11 +51,6 @@ #include "tv.h" #include "window.h" -extern u16 sub_81A89A0(u8); -extern void sub_81A8AF8(void); -extern void sub_81A895C(void); -extern void sub_81A8934(u8); - typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); @@ -66,8 +63,6 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0; static EWRAM_DATA u16 sMovingNpcMapId = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; -extern u16 gSpecialVar_ContestCategory; - IWRAM_DATA u8 gUnknown_03000F30; extern const SpecialFunc gSpecials[]; @@ -2204,7 +2199,7 @@ bool8 ScrCmd_cmdD9(struct ScriptContext *ctx) } } -// This command will force the Pokémon to be obedient, you don't get to make it disobedient +// This command will force the Pokémon to be obedient, you don't get to make it disobedient. bool8 ScrCmd_setmonobedient(struct ScriptContext *ctx) { bool8 obedient = TRUE; |