diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/field_control_avatar.c | 2 | ||||
-rw-r--r-- | src/field_screen_effect.c | 2 | ||||
-rw-r--r-- | src/field_special_scene.c | 4 | ||||
-rw-r--r-- | src/field_specials.c | 36 | ||||
-rw-r--r-- | src/field_tasks.c | 17 | ||||
-rw-r--r-- | src/mossdeep_gym.c | 314 | ||||
-rw-r--r-- | src/overworld.c | 4 | ||||
-rw-r--r-- | src/rotating_tile_puzzle.c | 338 | ||||
-rw-r--r-- | src/scrcmd.c | 26 |
9 files changed, 384 insertions, 359 deletions
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 9a0388ae0..47246d75a 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -738,7 +738,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB } if (MetatileBehavior_IsMossdeepGymWarp(metatileBehavior) == TRUE) { - sub_80AF87C(); + DoMossdeepGymWarp(); return TRUE; } DoWarp(); diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 18faf0e60..505315539 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -556,7 +556,7 @@ void sub_80AF848(void) gFieldCallback = sub_80AF3E8; } -void sub_80AF87C(void) +void DoMossdeepGymWarp(void) { sub_8085540(1); ScriptContext2_Enable(); diff --git a/src/field_special_scene.c b/src/field_special_scene.c index dbf68e1a2..231f4dd42 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -302,7 +302,7 @@ void Task_HandlePorthole(u8 taskId) } break; case EXIT_PORTHOLE: // exit porthole. - FlagClear(FLAG_SPECIAL_FLAG_0x4001); + FlagClear(FLAG_DONT_TRANSITION_MUSIC); FlagClear(FLAG_HIDE_MAP_NAME_POPUP); SetWarpDestinationToDynamicWarp(0); DoDiveWarp(); @@ -339,7 +339,7 @@ void sub_80FB768(void) void sub_80FB7A4(void) { FlagSet(FLAG_SYS_CRUISE_MODE); - FlagSet(FLAG_SPECIAL_FLAG_0x4001); + FlagSet(FLAG_DONT_TRANSITION_MUSIC); FlagSet(FLAG_HIDE_MAP_NAME_POPUP); SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); sub_80FB59C(); diff --git a/src/field_specials.c b/src/field_specials.c index 4057cf299..b92e956d4 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -69,8 +69,8 @@ EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; EWRAM_DATA u8 gBikeCollisions = 0; static EWRAM_DATA u32 sBikeCyclingTimer = 0; -static EWRAM_DATA u8 sUnknown_0203AB5C = 0; -static EWRAM_DATA u8 sPetalburgGymSlidingDoorFrameCounter = 0; +static EWRAM_DATA u8 sSlidingDoorNextFrameCounter = 0; +static EWRAM_DATA u8 sSlidingDoorFrame = 0; static EWRAM_DATA u8 sTutorMoveAndElevatorWindowId = 0; static EWRAM_DATA u16 sLilycoveDeptStore_NeverRead = 0; static EWRAM_DATA u16 sLilycoveDeptStore_DefaultFloorChoice = 0; @@ -96,8 +96,8 @@ u16 GetNumMovedLilycoveFanClubMembers(void); static void RecordCyclingRoadResults(u32, u8); static void LoadLinkPartnerEventObjectSpritePalette(u8 graphicsId, u8 localEventId, u8 paletteNum); -static void Task_PetalburgGym(u8); -static void PetalburgGymFunc(u8, u16); +static void Task_PetalburgGymSlideOpenRoomDoors(u8 taskId); +static void PetalburgGymSetDoorMetatiles(u8 roomNumber, u16 metatileId); static void Task_PCTurnOnEffect(u8); static void PCTurnOnEffect_0(struct Task *); static void PCTurnOnEffect_1(s16, s8, s8); @@ -810,7 +810,7 @@ void MauvilleGymDeactivatePuzzle(void) } } -static const u8 gUnknown_085B2B78[] = {0, 1, 1, 1, 1}; +static const bool8 sSlidingDoorNextFrameDelay[] = {0, 1, 1, 1, 1}; static const u16 sPetalburgGymSlidingDoorMetatiles[] = { METATILE_ID(PetalburgGym, SlidingDoor_Frame0), @@ -820,21 +820,21 @@ static const u16 sPetalburgGymSlidingDoorMetatiles[] = { METATILE_ID(PetalburgGym, SlidingDoor_Frame4), }; -void PetalburgGymSpecial1(void) +void PetalburgGymSlideOpenRoomDoors(void) { - sUnknown_0203AB5C = 0; - sPetalburgGymSlidingDoorFrameCounter = 0; + sSlidingDoorNextFrameCounter = 0; + sSlidingDoorFrame = 0; PlaySE(SE_KI_GASYAN); - CreateTask(Task_PetalburgGym, 8); + CreateTask(Task_PetalburgGymSlideOpenRoomDoors, 8); } -static void Task_PetalburgGym(u8 taskId) +static void Task_PetalburgGymSlideOpenRoomDoors(u8 taskId) { - if (gUnknown_085B2B78[sPetalburgGymSlidingDoorFrameCounter] == sUnknown_0203AB5C) + if (sSlidingDoorNextFrameDelay[sSlidingDoorFrame] == sSlidingDoorNextFrameCounter) { - PetalburgGymFunc(gSpecialVar_0x8004, sPetalburgGymSlidingDoorMetatiles[sPetalburgGymSlidingDoorFrameCounter]); - sUnknown_0203AB5C = 0; - if ((++sPetalburgGymSlidingDoorFrameCounter) == ARRAY_COUNT(sPetalburgGymSlidingDoorMetatiles)) + PetalburgGymSetDoorMetatiles(gSpecialVar_0x8004, sPetalburgGymSlidingDoorMetatiles[sSlidingDoorFrame]); + sSlidingDoorNextFrameCounter = 0; + if ((++sSlidingDoorFrame) == ARRAY_COUNT(sPetalburgGymSlidingDoorMetatiles)) { DestroyTask(taskId); EnableBothScriptContexts(); @@ -842,11 +842,11 @@ static void Task_PetalburgGym(u8 taskId) } else { - sUnknown_0203AB5C++; + sSlidingDoorNextFrameCounter++; } } -static void PetalburgGymFunc(u8 roomNumber, u16 metatileId) +static void PetalburgGymSetDoorMetatiles(u8 roomNumber, u16 metatileId) { u16 doorCoordsX[4]; u16 doorCoordsY[4]; @@ -911,9 +911,9 @@ static void PetalburgGymFunc(u8 roomNumber, u16 metatileId) DrawWholeMapView(); } -void PetalburgGymSpecial2(void) +void PetalburgGymUnlockRoomDoors(void) { - PetalburgGymFunc(gSpecialVar_0x8004, sPetalburgGymSlidingDoorMetatiles[4]); + PetalburgGymSetDoorMetatiles(gSpecialVar_0x8004, sPetalburgGymSlidingDoorMetatiles[4]); } void ShowFieldMessageStringVar4(void) diff --git a/src/field_tasks.c b/src/field_tasks.c index 63539e475..21b2732c3 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -16,6 +16,7 @@ #include "secret_base.h" #include "sound.h" #include "task.h" +#include "constants/field_tasks.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/vars.h" @@ -38,14 +39,14 @@ static void Task_MuddySlope(u8 taskId); static const TaskFunc sPerStepCallbacks[] = { - DummyPerStepCallback, - AshGrassPerStepCallback, - FortreeBridgePerStepCallback, - PacifidlogBridgePerStepCallback, - SootopolisGymIcePerStepCallback, - EndTruckSequence, - SecretBasePerStepCallback, - CrackedFloorPerStepCallback + [STEP_CB_DUMMY] = DummyPerStepCallback, + [STEP_CB_ASH] = AshGrassPerStepCallback, + [STEP_CB_FORTREE_BRIDGE] = FortreeBridgePerStepCallback, + [STEP_CB_PACIFIDLOG_BRIDGE] = PacifidlogBridgePerStepCallback, + [STEP_CB_SOOTOPOLIS_ICE] = SootopolisGymIcePerStepCallback, + [STEP_CB_TRUCK] = EndTruckSequence, + [STEP_CB_SECRET_BASE] = SecretBasePerStepCallback, + [STEP_CB_CRACKED_FLOOR] = CrackedFloorPerStepCallback }; // they are in pairs but declared as 1D array diff --git a/src/mossdeep_gym.c b/src/mossdeep_gym.c deleted file mode 100644 index bc279334b..000000000 --- a/src/mossdeep_gym.c +++ /dev/null @@ -1,314 +0,0 @@ -#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" -#include "constants/event_objects.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 objects[EVENT_OBJECTS_COUNT]; - u8 count; - bool8 unk41; -}; - -// This file's functions. -static void AddEventObject(u8 eventTemplateId, u8 arg1); -static void sub_81A8D94(u8 eventTemplateId, u8 arg1); - -// EWRAM vars -EWRAM_DATA static struct MossdeepStruct *gUnknown_0203CE50 = NULL; - -// code -void InitMossdeepGymTiles(bool8 arg0) -{ - if (gUnknown_0203CE50 == NULL) - gUnknown_0203CE50 = AllocZeroed(sizeof(*gUnknown_0203CE50)); - - gUnknown_0203CE50->unk41 = arg0; -} - -void FinishMossdeepGymTiles(void) -{ - u8 id; - - if (gUnknown_0203CE50 != NULL) - FREE_AND_SET_NULL(gUnknown_0203CE50); - - id = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); - EventObjectClearHeldMovementIfFinished(&gEventObjects[id]); - ScriptMovement_UnfreezeEventObjects(); -} - -u16 MossdeepGym_MoveEvents(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) - 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) - { - AddEventObject(i, r5); - localId = events[i].localId; - ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); - } - else - { - sub_81A8D94(i, r5); - } - } - } - - return localId; -} - -void MossdeepGym_TurnEvents(void) -{ - u8 i; - s32 var; - struct EventObjectTemplate *events; - - if (gUnknown_0203CE50 == NULL) - return; - - if (!gUnknown_0203CE50->unk41) - 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->objects[i].eventTemplateId].x + 7; - s16 y = events[gUnknown_0203CE50->objects[i].eventTemplateId].y + 7; - u16 metatile = MapGridGetMetatileIdAt(x, y); - - r0 = (u8)((metatile - var) % 8); - r0 -= (gUnknown_0203CE50->objects[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->objects[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->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; - break; - case DIR_SOUTH: - movementScript = gUnknown_086126A8; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; - break; - case DIR_WEST: - movementScript = gUnknown_086126AA; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; - break; - case DIR_NORTH: - movementScript = gUnknown_086126AC; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; - break; - default: - continue; - } - ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->objects[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->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; - break; - case DIR_SOUTH: - movementScript = gUnknown_086126AC; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; - break; - case DIR_WEST: - movementScript = gUnknown_086126AE; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; - break; - case DIR_NORTH: - movementScript = gUnknown_086126A8; - events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; - break; - default: - continue; - } - ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->objects[i].eventTemplateId].localId, - gSaveBlock1Ptr->location.mapNum, - gSaveBlock1Ptr->location.mapGroup, - movementScript); - } - } - } -} - -static void AddEventObject(u8 eventTemplateId, u8 arg1) -{ - gUnknown_0203CE50->objects[gUnknown_0203CE50->count].eventTemplateId = eventTemplateId; - gUnknown_0203CE50->objects[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) - 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/overworld.c b/src/overworld.c index d796a670f..55afe2fcf 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1183,7 +1183,7 @@ void Overworld_ClearSavedMusic(void) static void sub_8085810(void) { - if (FlagGet(FLAG_SPECIAL_FLAG_0x4001) != TRUE) + if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE) { u16 newMusic = GetWarpDestinationMusic(); u16 currentMusic = GetCurrentMapMusic(); @@ -1231,7 +1231,7 @@ void TryFadeOutOldMapMusic(void) { u16 currentMusic = GetCurrentMapMusic(); u16 warpMusic = GetWarpDestinationMusic(); - if (FlagGet(FLAG_SPECIAL_FLAG_0x4001) != TRUE && warpMusic != GetCurrentMapMusic()) + if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE && warpMusic != GetCurrentMapMusic()) { if (currentMusic == MUS_NAMINORI && VarGet(VAR_SKY_PILLAR_STATE) == 2 diff --git a/src/rotating_tile_puzzle.c b/src/rotating_tile_puzzle.c new file mode 100644 index 000000000..7238ec751 --- /dev/null +++ b/src/rotating_tile_puzzle.c @@ -0,0 +1,338 @@ +#include "global.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "malloc.h" +#include "rotating_tile_puzzle.h" +#include "script_movement.h" +#include "constants/event_object_movement_constants.h" +#include "constants/event_objects.h" +#include "constants/metatile_labels.h" + +extern const u8 RotatingTilePuzzle_Movement_ShiftRight[]; +extern const u8 RotatingTilePuzzle_Movement_ShiftDown[]; +extern const u8 RotatingTilePuzzle_Movement_ShiftLeft[]; +extern const u8 RotatingTilePuzzle_Movement_ShiftUp[]; +extern const u8 RotatingTilePuzzle_Movement_FaceRight[]; +extern const u8 RotatingTilePuzzle_Movement_FaceDown[]; +extern const u8 RotatingTilePuzzle_Movement_FaceLeft[]; +extern const u8 RotatingTilePuzzle_Movement_FaceUp[]; + +#define ROTATE_COUNTERCLOCKWISE 0 +#define ROTATE_CLOCKWISE 1 +#define ROTATE_NONE 2 + +struct RotatingTileObject +{ + u8 prevPuzzleTileNum; + u8 eventTemplateId; +}; + +struct RotatingTilePuzzle +{ + struct RotatingTileObject objects[EVENT_OBJECTS_COUNT]; + u8 numObjects; + bool8 isTrickHouse; +}; + +// This file's functions. +static void SaveRotatingTileObject(u8 eventTemplateId, u8 arg1); +static void TurnUnsavedRotatingTileObject(u8 eventTemplateId, u8 arg1); + +// EWRAM vars +EWRAM_DATA static struct RotatingTilePuzzle *sRotatingTilePuzzle = NULL; + +// code +void InitRotatingTilePuzzle(bool8 isTrickHouse) +{ + if (sRotatingTilePuzzle == NULL) + sRotatingTilePuzzle = AllocZeroed(sizeof(*sRotatingTilePuzzle)); + + sRotatingTilePuzzle->isTrickHouse = isTrickHouse; +} + +void FreeRotatingTilePuzzle(void) +{ + u8 id; + + if (sRotatingTilePuzzle != NULL) + FREE_AND_SET_NULL(sRotatingTilePuzzle); + + id = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[id]); + ScriptMovement_UnfreezeEventObjects(); +} + +u16 MoveRotatingTileObjects(u8 puzzleNumber) +{ + u8 i; + struct EventObjectTemplate *eventObjects = gSaveBlock1Ptr->eventObjectTemplates; + u16 localId = 0; + + for (i = 0; i < EVENT_OBJECT_TEMPLATES_COUNT; i++) + { + s32 puzzleTileStart; + u8 puzzleTileNum; + s16 x = eventObjects[i].x + 7; + s16 y = eventObjects[i].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (!sRotatingTilePuzzle->isTrickHouse) + puzzleTileStart = METATILE_MossdeepGym_YellowArrow_Right; + else + puzzleTileStart = METATILE_TrickHousePuzzle_Arrow_YellowOnWhite_Right; + + // Object is on a metatile before the puzzle tile section + // UB: Because this is not if (metatile < puzzleTileStart), for the trick house (metatile - puzzleTileStart) below can result in casting a negative value to u8 + if (metatile < METATILE_MossdeepGym_YellowArrow_Right) + continue; + + // Object is on a metatile after the puzzle tile section (never occurs, in both cases the puzzle tiles are last) + if ((u8)((metatile - puzzleTileStart) / 8) >= 5) + continue; + + // Object is on a metatile in puzzle tile section, but not one of the currently rotating color + if ((u8)((metatile - puzzleTileStart) / 8) != puzzleNumber) + continue; + + puzzleTileNum = (u8)((metatile - puzzleTileStart) % 8); + + // First 4 puzzle tiles are the colored arrows + if (puzzleTileNum < 4) + { + s8 x = 0; + s8 y = 0; + const u8 *movementScript; + + switch (puzzleTileNum) + { + case 0: // Right Arrow + movementScript = RotatingTilePuzzle_Movement_ShiftRight; + x = 1; + break; + case 1: // Down Arrow + movementScript = RotatingTilePuzzle_Movement_ShiftDown; + y = 1; + break; + case 2: // Left Arrow + movementScript = RotatingTilePuzzle_Movement_ShiftLeft; + x = -1; + break; + case 3: // Up Arrow + movementScript = RotatingTilePuzzle_Movement_ShiftUp; + y = -1; + break; + default: + continue; + } + + eventObjects[i].x += x; + eventObjects[i].y += y; + if (GetEventObjectIdByLocalIdAndMap(eventObjects[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup) != EVENT_OBJECTS_COUNT) + { + SaveRotatingTileObject(i, puzzleTileNum); + localId = eventObjects[i].localId; + ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); + } + // Never reached in normal gameplay + else + { + TurnUnsavedRotatingTileObject(i, puzzleTileNum); + } + } + } + + return localId; +} + +void TurnRotatingTileObjects(void) +{ + u8 i; + s32 puzzleTileStart; + struct EventObjectTemplate *eventObjects; + + if (sRotatingTilePuzzle == NULL) + return; + + if (!sRotatingTilePuzzle->isTrickHouse) + puzzleTileStart = METATILE_MossdeepGym_YellowArrow_Right; + else + puzzleTileStart = METATILE_TrickHousePuzzle_Arrow_YellowOnWhite_Right; + + eventObjects = gSaveBlock1Ptr->eventObjectTemplates; + for (i = 0; i < sRotatingTilePuzzle->numObjects; i++) + { + s32 rotation; + s8 tileDifference; + u8 eventObjectId; + s16 x = eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].x + 7; + s16 y = eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + // NOTE: The following 2 assignments and if else could all be replaced with rotation = ROTATE_COUNTERCLOCKWISE + // For an object to be saved in sRotatingTilePuzzle->objects, it must have been on a colored arrow tile + // After the first assignment, tileDifference will always be a number [0-3] representing which arrow tile the object is on now (0: right, 1: down, 2: left, 3: up) + // prevPuzzleTileNum will similarly be a number [0-3] representing the arrow tile the object just moved from + // All the puzzles are oriented counter-clockwise and can only move 1 step at a time, so the difference between the current tile and the previous tile will always either be -1 or 3 (0-1, 1-2, 2-3, 3-0) + // Which means tileDifference will always either be -1 or 3 after the below subtraction, and rotation will always be ROTATE_COUNTERCLOCKWISE after the following conditionals + tileDifference = (u8)((metatile - puzzleTileStart) % 8); + tileDifference -= (sRotatingTilePuzzle->objects[i].prevPuzzleTileNum); + + // Always true, see above + if (tileDifference < 0 || tileDifference == 3) + { + // Always false, see above + if (tileDifference == -3) + rotation = ROTATE_CLOCKWISE; + else + rotation = ROTATE_COUNTERCLOCKWISE; + } + else + { + if (tileDifference > 0) + rotation = ROTATE_CLOCKWISE; + else + rotation = ROTATE_NONE; + } + + eventObjectId = GetEventObjectIdByLocalIdAndMap(eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + if (eventObjectId != EVENT_OBJECTS_COUNT) + { + const u8 *movementScript; + u8 direction = gEventObjects[eventObjectId].facingDirection; + if (rotation == ROTATE_COUNTERCLOCKWISE) + { + switch (direction) + { + case DIR_EAST: + movementScript = RotatingTilePuzzle_Movement_FaceUp; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_SOUTH: + movementScript = RotatingTilePuzzle_Movement_FaceRight; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case DIR_WEST: + movementScript = RotatingTilePuzzle_Movement_FaceDown; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_NORTH: + movementScript = RotatingTilePuzzle_Movement_FaceLeft; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + // Never reached + else if (rotation == ROTATE_CLOCKWISE) + { + switch (direction) + { + case DIR_EAST: + movementScript = RotatingTilePuzzle_Movement_FaceDown; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_SOUTH: + movementScript = RotatingTilePuzzle_Movement_FaceLeft; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case DIR_WEST: + movementScript = RotatingTilePuzzle_Movement_FaceUp; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_NORTH: + movementScript = RotatingTilePuzzle_Movement_FaceRight; + eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + } + } +} + +static void SaveRotatingTileObject(u8 eventTemplateId, u8 puzzleTileNum) +{ + sRotatingTilePuzzle->objects[sRotatingTilePuzzle->numObjects].eventTemplateId = eventTemplateId; + sRotatingTilePuzzle->objects[sRotatingTilePuzzle->numObjects].prevPuzzleTileNum = puzzleTileNum; + sRotatingTilePuzzle->numObjects++; +} + +// Functionally unused +static void TurnUnsavedRotatingTileObject(u8 eventTemplateId, u8 puzzleTileNum) +{ + s8 tileDifference; + s32 rotation; + s32 puzzleTileStart; + u16 movementType; + struct EventObjectTemplate *eventObjects = gSaveBlock1Ptr->eventObjectTemplates; + s16 x = eventObjects[eventTemplateId].x + 7; + s16 y = eventObjects[eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (!sRotatingTilePuzzle->isTrickHouse) + puzzleTileStart = METATILE_MossdeepGym_YellowArrow_Right; + else + puzzleTileStart = METATILE_TrickHousePuzzle_Arrow_YellowOnWhite_Right; + + tileDifference = (u8)((metatile - puzzleTileStart) % 8); + tileDifference -= puzzleTileNum; + + if (tileDifference < 0 || tileDifference == 3) + rotation = ROTATE_COUNTERCLOCKWISE; + else if (tileDifference > 0 || tileDifference == -3) + rotation = ROTATE_CLOCKWISE; + else + rotation = ROTATE_NONE; + + movementType = eventObjects[eventTemplateId].movementType; + if (rotation == ROTATE_COUNTERCLOCKWISE) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_DOWN: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_UP: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + break; + } + } + else if (rotation == ROTATE_CLOCKWISE) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_DOWN: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_UP: + eventObjects[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + break; + } + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index bdeee0524..d97e3de47 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -27,13 +27,13 @@ #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" #include "pokemon_storage_system.h" #include "random.h" #include "overworld.h" +#include "rotating_tile_puzzle.h" #include "rtc.h" #include "script.h" #include "script_menu.h" @@ -815,7 +815,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_warpD7(struct ScriptContext *ctx) +bool8 ScrCmd_warpmossdeepgym(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -824,7 +824,7 @@ bool8 ScrCmd_warpD7(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_80AF87C(); + DoMossdeepGymWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -2149,31 +2149,31 @@ bool8 ScrCmd_takecoins(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_mossdeepgym1(struct ScriptContext *ctx) +bool8 ScrCmd_moverotatingtileobjects(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u16 puzzleNumber = VarGet(ScriptReadHalfword(ctx)); - sMovingNpcId = MossdeepGym_MoveEvents(v1); + sMovingNpcId = MoveRotatingTileObjects(puzzleNumber); return FALSE; } -bool8 ScrCmd_mossdeepgym2(struct ScriptContext *ctx) +bool8 ScrCmd_turnrotatingtileobjects(struct ScriptContext *ctx) { - MossdeepGym_TurnEvents(); + TurnRotatingTileObjects(); return FALSE; } -bool8 ScrCmd_mossdeepgym3(struct ScriptContext *ctx) +bool8 ScrCmd_initrotatingtilepuzzle(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u16 isTrickHouse = VarGet(ScriptReadHalfword(ctx)); - InitMossdeepGymTiles(v1); + InitRotatingTilePuzzle(isTrickHouse); return FALSE; } -bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx) +bool8 ScrCmd_freerotatingtilepuzzle(struct ScriptContext *ctx) { - FinishMossdeepGymTiles(); + FreeRotatingTilePuzzle(); return FALSE; } |