Skip to content

Commit

Permalink
Merge pull request #132 from celias-stupid-team/emblem_field_use
Browse files Browse the repository at this point in the history
Add field effect for LWP emblems
  • Loading branch information
CeliaDawn authored Jan 20, 2025
2 parents 513b228 + 90f1b64 commit 513b276
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 8 deletions.
1 change: 1 addition & 0 deletions include/field_effect.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ void SpriteCB_AshLaunch(struct Sprite *sprite);
void FieldEffectActiveListClear(void);
void FieldEffectFreePaletteIfUnused(u8 paletteNum);
void FieldEffectFreeGraphicsResources(struct Sprite *sprite);
u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *timer, s16 *numTurns);

#endif //GUARD_FIELD_EFFECTS_H
1 change: 1 addition & 0 deletions include/strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -1579,5 +1579,6 @@ extern const u8 gText_PokeSum_EggOrigin_Trade[];

// csr outfits
extern const u8 gText_LWPEmblem[];
extern const u8 gText_LWPEmblemEnd[];

#endif //GUARD_STRINGS_H
6 changes: 3 additions & 3 deletions src/data/items.json
Original file line number Diff line number Diff line change
Expand Up @@ -6308,7 +6308,7 @@
"importance": 1,
"registrability": 0,
"pocket": "POCKET_KEY_ITEMS",
"type": "ITEM_TYPE_BAG_MENU",
"type": "ITEM_TYPE_FIELD",
"fieldUseFunc": "FieldUseFunc_LWPEmblem",
"battleUsage": 0,
"battleUseFunc": "NULL",
Expand All @@ -6324,7 +6324,7 @@
"importance": 1,
"registrability": 0,
"pocket": "POCKET_KEY_ITEMS",
"type": "ITEM_TYPE_BAG_MENU",
"type": "ITEM_TYPE_FIELD",
"fieldUseFunc": "FieldUseFunc_LWPEmblem",
"battleUsage": 0,
"battleUseFunc": "NULL",
Expand All @@ -6340,7 +6340,7 @@
"importance": 1,
"registrability": 0,
"pocket": "POCKET_KEY_ITEMS",
"type": "ITEM_TYPE_BAG_MENU",
"type": "ITEM_TYPE_FIELD",
"fieldUseFunc": "FieldUseFunc_LWPEmblem",
"battleUsage": 0,
"battleUseFunc": "NULL",
Expand Down
3 changes: 1 addition & 2 deletions src/field_effect.c
Original file line number Diff line number Diff line change
Expand Up @@ -2069,7 +2069,6 @@ void SpriteCB_PopOutOfAsh(struct Sprite *sprite)
static void Task_EscapeRopeWarpOut(u8 taskId);
static void EscapeRopeWarpOutEffect_Init(struct Task *task);
static void EscapeRopeWarpOutEffect_Spin(struct Task *task);
static u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *timer, s16 *numTurns);
static bool32 WarpOutObjectEventUpwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY);
static void FieldCallback_EscapeRopeExit(void);
static void Task_EscapeRopeWarpIn(u8 taskId);
Expand Down Expand Up @@ -2139,7 +2138,7 @@ static const u8 sSpinDirections[] =
[DIR_EAST] = DIR_SOUTH,
};

static u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *spinDelay, s16 *numTurns)
u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *spinDelay, s16 *numTurns)
{
if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))
{
Expand Down
98 changes: 95 additions & 3 deletions src/item_use.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ static void UseFameCheckerFromBag(void);
static void Task_UseFameCheckerFromField(u8 taskId);
static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId);
static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId);
static void LWPEmblem_EquipOutfit(void);
static void ItemUseOnFieldCB_LWPEmblem(u8 taskId);
static void Task_UseLWPEmblemOnField(u8 taskId);
static void StartLWPEmblemFieldEffect(void);
static void Task_LWPEmblemWarpOut(u8 taskId);
static void LWPEmblemWarpOutEffect_Init(struct Task *task);
static void LWPEmblemWarpOutEffect_Spin(struct Task *task);

// unknown unused data.
// It's curiously about the size of an array of values indexed by species (including padding),
Expand Down Expand Up @@ -924,7 +931,7 @@ void FieldUseFunc_OakStopsYou(u8 taskId)
PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);
}

void FieldUseFunc_LWPEmblem(u8 taskId)
static void LWPEmblem_EquipOutfit(void)
{
u8 outfit = OUTFIT_NONE;
switch(gSpecialVar_ItemId)
Expand All @@ -941,14 +948,99 @@ void FieldUseFunc_LWPEmblem(u8 taskId)
}

TogglePlayerOutfit(outfit);
}

void FieldUseFunc_LWPEmblem(u8 taskId)
{
PlaySE(SE_SELECT);
CopyItemName(gSpecialVar_ItemId, gStringVar1);

StringExpandPlaceholders(gStringVar4, gText_LWPEmblem);
DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu);

sItemUseOnFieldCB = ItemUseOnFieldCB_LWPEmblem;
SetUpItemUseOnFieldCallback(taskId);
}

static void ItemUseOnFieldCB_LWPEmblem(u8 taskId)
{
LWPEmblem_EquipOutfit();
DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_UseLWPEmblemOnField);
}

static void Task_UseLWPEmblemOnField(u8 taskId)
{
ResetInitialPlayerAvatarState();
StartLWPEmblemFieldEffect();
DestroyTask(taskId);
}

static void StartLWPEmblemFieldEffect(void)
{
LockPlayerFieldControls();
FreezeObjectEvents();
CreateTask(Task_LWPEmblemWarpOut, 80);
}

static void (*const sLWPEmblemWarpOutEffectFuncs[])(struct Task *task) =
{
LWPEmblemWarpOutEffect_Init,
LWPEmblemWarpOutEffect_Spin
};

#define tState data[0]
#define tSpinDelay data[1]
#define tNumTurns data[2]
#define tTimer data[3]
#define tSpinEnded data[4]
#define tCurrentDir data[5]
#define tDirection data[15]

static void Task_LWPEmblemWarpOut(u8 taskId)
{
sLWPEmblemWarpOutEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]);
}

static void LWPEmblemWarpOutEffect_Init(struct Task *task)
{
task->tState++;
task->tDirection = DIR_NONE;
}

#define OBJ_EVENT_PAL_TAG_PLAYER_RED 0x1100
#define OBJ_EVENT_PAL_TAG_PLAYER_GREEN 0x1110
#define LWP_SPIN_LENGTH 60

static void LWPEmblemWarpOutEffect_Spin(struct Task *task)
{
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
s16 *data = task->data;
tCurrentDir = SpinObjectEvent(playerObj, &task->tSpinDelay, &task->tNumTurns);
if (tTimer < LWP_SPIN_LENGTH)
{
tTimer++;
if (tTimer == 5)
PlaySE(SE_M_REVERSAL);
}
else if (tTimer >= LWP_SPIN_LENGTH && tCurrentDir == DIR_EAST)
{
tSpinEnded = TRUE;
}
else if (tSpinEnded)
{
PlaySE(SE_EXP_MAX);
LoadObjectEventPalette(gSaveBlock2Ptr->playerGender == MALE ? OBJ_EVENT_PAL_TAG_PLAYER_RED : OBJ_EVENT_PAL_TAG_PLAYER_GREEN);
StringExpandPlaceholders(gStringVar4, gText_LWPEmblemEnd);
DisplayItemMessageOnField(FindTaskIdByFunc(Task_LWPEmblemWarpOut), FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField);
}
}

#undef tState
#undef tSpinDelay
#undef tNumTurns
#undef tTimer
#undef tSpinEnded
#undef tCurrentDir
#undef tDirection

void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param)
{
struct QuestLogEvent_Item *data = Alloc(sizeof(*data));
Expand Down
1 change: 1 addition & 0 deletions src/strings.c
Original file line number Diff line number Diff line change
Expand Up @@ -1371,3 +1371,4 @@ const u8 gText_Send[] = _("SEND");
const u8 gText_Toss[] = _("TOSS");
const u8 gText_DelAllCancelOk[] = _("DEL. ALL{CLEAR_TO 0x57}CANCEL{CLEAR_TO 0xA4}OK");
const u8 gText_LWPEmblem[] = _("Used the {STR_VAR_1}!{PAUSE_UNTIL_PRESS}");
const u8 gText_LWPEmblemEnd[] = _("{PLAYER} looks fabulous!{PAUSE_UNTIL_PRESS}");

0 comments on commit 513b276

Please sign in to comment.