Merge pull request #841 from GriffinRichards/document-gyms2
Document Petalburg, Fortree, Mossdeep, and Sootopolis Gyms
This commit is contained in:
@@ -738,7 +738,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB
|
||||
}
|
||||
if (MetatileBehavior_IsMossdeepGymWarp(metatileBehavior) == TRUE)
|
||||
{
|
||||
sub_80AF87C();
|
||||
DoMossdeepGymWarp();
|
||||
return TRUE;
|
||||
}
|
||||
DoWarp();
|
||||
|
||||
@@ -556,7 +556,7 @@ void sub_80AF848(void)
|
||||
gFieldCallback = sub_80AF3E8;
|
||||
}
|
||||
|
||||
void sub_80AF87C(void)
|
||||
void DoMossdeepGymWarp(void)
|
||||
{
|
||||
sub_8085540(1);
|
||||
ScriptContext2_Enable();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
338
src/rotating_tile_puzzle.c
Normal file
338
src/rotating_tile_puzzle.c
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
26
src/scrcmd.c
26
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user