En_Syateki_Man (Shooting Gallery Man) documented (#894)

* Document a ton of syateki_man

* Document swamp actor lists

* Document animations

* Document player positions

* Document talk flags

* Name wave and spawn index

* Name everything involved in the swamp game

* A hex score I missed

* Some slight town game doc

* Document octorok flags

* Better way of doing octorok flags

* Macros for getting/setting high scores

* Update a variable I missed

* Name remaining struct vars

* Create enum for shootingGameState

* Remove anonymous unions

* hitState -> hitType

* Comment for values next to enums

* Name some more stuff

* Name stuff in Town-RunGame

* Name sGameStartTimer

* Name some more stuff

* Name all static variables

* One more round of comments and such

* Respond to hensldm's review

* GET_INDEX -> GET_ID

* Respond to Elliptic's review (or at least the parts I can respond to right now)

* More review responses

* Add some stuff to z64saves.h I missed
This commit is contained in:
Tom Overton
2022-07-23 11:06:11 -07:00
committed by GitHub
parent 3f49adb91d
commit 9449ced63f
14 changed files with 898 additions and 654 deletions
+2 -2
View File
@@ -199,8 +199,8 @@ void Sram_ClearHighscores(void) {
gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF) | 0x130000;
gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF0000) | 0xA;
gSaveContext.save.horseBackBalloonHighScore = 6000; // 60 seconds
gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF0000) | 0x27;
gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF) | 0xA0000;
SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
gSaveContext.save.dekuPlaygroundHighScores[0] = 7500; // 75 seconds
gSaveContext.save.dekuPlaygroundHighScores[1] = 7500; // 75 seconds
@@ -90,7 +90,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
path = &play->setupPathList[path->unk1];
}
for (i = 0; i < EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor); i++) {
for (i = 0; i < EN_SYATEKI_CROW_GET_NUMBER(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@@ -102,7 +102,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->unk_23C.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
if ((path == NULL) || (EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor) >= 0x80)) {
if ((path == NULL) || (EN_SYATEKI_CROW_GET_NUMBER(&this->actor) >= 0x80)) {
Actor_MarkForDeath(&this->actor);
return;
}
@@ -136,14 +136,14 @@ void func_809CA5D4(EnSyatekiCrow* this) {
void func_809CA67C(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->unk_26A == 1) && (this->unk_1C2 == 1) &&
(syatekiMan->unk_274 & (1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor)))) {
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_1C2 == 1) &&
(syatekiMan->guayFlags & (1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor)))) {
func_809CA71C(this);
} else if (syatekiMan->unk_26A != 1) {
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->unk_1C2 = 1;
}
if ((syatekiMan->unk_274 == 0) && (syatekiMan->unk_274 == 0)) {
if ((syatekiMan->guayFlags == 0) && (syatekiMan->guayFlags == 0)) {
this->unk_1C2 = 1;
}
}
@@ -185,7 +185,7 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
f32 sp30;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->unk_26A != 1) {
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
func_809CA5D4(this);
return;
}
@@ -207,13 +207,13 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
this->unk_1CC++;
} else {
this->unk_1C2 = 0;
syatekiMan->unk_274 &= ~(1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor));
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
func_809CA5D4(this);
}
SkelAnime_Update(&this->skelAnime);
this->actor.shape.yOffset = (fabsf(this->skelAnime.curFrame - 3.0f) * 150.0f) + 1700.0f;
if ((syatekiMan->unk_26C % 90) == 0) {
if ((syatekiMan->perGameVar1.guaySpawnTimer % 90) == 0) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KAICHO_CRY);
}
}
@@ -221,7 +221,7 @@ void func_809CA8E4(EnSyatekiCrow* this, PlayState* play) {
void func_809CAAF8(EnSyatekiCrow* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
syatekiMan->unk_280 += 60;
syatekiMan->score += 60;
this->unk_1C2 = 0;
this->actor.speedXZ *= Math_CosS(this->actor.world.rot.x);
this->actor.velocity.y = 0.0f;
@@ -245,8 +245,8 @@ void func_809CABC0(EnSyatekiCrow* this, PlayState* play) {
if (this->unk_1C4 > 20) {
func_800B3030(play, &this->actor.world.pos, &D_809CB050, &D_809CB050, this->actor.scale.x * 10000.0f, 0, 0);
syatekiMan->unk_27A++;
syatekiMan->unk_274 &= ~(1 << EN_SYATEKI_CROW_GET_PARAM_FF00(&this->actor));
syatekiMan->guayHitCounter++;
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
func_809CA5D4(this);
}
@@ -5,7 +5,8 @@
#define EN_SYATEKI_CROW_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_CROW_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_CROW_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_CROW_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_CROW_PARAMS(number, unkF0, unkF) (((number << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unkF & 0xF))
struct EnSyatekiCrow;
@@ -131,7 +131,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
}
this->unk_1E4 = Lib_SegmentedToVirtual(path->points);
this->unk_1E8 = EN_SYATEKI_DEKUNUTS_GET_PARAM_F0(&this->actor);
this->unk_1E8 = EN_SYATEKI_DEKUNUTS_GET_NUMBER(&this->actor);
this->unk_1EA = path->count;
this->unk_1D8 = 0;
this->unk_1DC = 0;
@@ -166,13 +166,14 @@ void func_80A2BE54(EnSyatekiDekunuts* this) {
void func_80A2BF18(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->unk_26A == 1) && (this->unk_1E2 == 1) && ((syatekiMan->unk_272 & (1 << this->unk_1E8)) != 0)) {
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_1E2 == 1) &&
((syatekiMan->dekuScrubFlags & (1 << this->unk_1E8)) != 0)) {
func_80A2BFC4(this);
} else if (syatekiMan->unk_26A != 1) {
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->unk_1E2 = 1;
}
if ((syatekiMan->unk_272 == 0) && (syatekiMan->unk_274 == 0) &&
if ((syatekiMan->dekuScrubFlags == 0) && (syatekiMan->guayFlags == 0) &&
(EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1)) {
this->unk_1E2 = 1;
}
@@ -189,9 +190,9 @@ void func_80A2BFC4(EnSyatekiDekunuts* this) {
this->actor.world.pos = this->actor.prevPos = sp14;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->unk_1EE = 140 - (syatekiMan->unk_27C * 20);
this->unk_1EE = 140 - (syatekiMan->currentWave * 20);
if ((syatekiMan->unk_27C & 1) != 0) {
if ((syatekiMan->currentWave & 1) != 0) {
this->unk_1F0 = 1;
this->unk_1F2 = 0;
} else {
@@ -260,7 +261,7 @@ void func_80A2C27C(EnSyatekiDekunuts* this) {
void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((this->unk_1EE < this->unk_1D8) || (syatekiMan->unk_26A != 1)) {
if ((this->unk_1EE < this->unk_1D8) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
}
@@ -270,7 +271,7 @@ void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play) {
void func_80A2C33C(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((gSaveContext.unk_3DE0[1] <= 0) || (syatekiMan->unk_26A != 1)) {
if ((gSaveContext.unk_3DE0[1] <= 0) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
}
@@ -287,7 +288,7 @@ void func_80A2C3AC(EnSyatekiDekunuts* this) {
void func_80A2C3F0(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->unk_26A == 1) {
if (syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) {
if (this->unk_1D8 > 160 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_1D8 = 0;
func_80A2C150(this);
@@ -319,12 +320,12 @@ void func_80A2C4D0(EnSyatekiDekunuts* this, PlayState* play) {
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) == 1) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 2);
syatekiMan->unk_280 += 100;
syatekiMan->unk_26E++;
syatekiMan->score += 100;
syatekiMan->perGameVar2.bonusDekuScrubHitCounter++;
} else {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 0);
syatekiMan->unk_280 += 30;
syatekiMan->unk_278++;
syatekiMan->score += 30;
syatekiMan->dekuScrubHitCounter++;
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
@@ -356,7 +357,7 @@ void func_80A2C5DC(EnSyatekiDekunuts* this, PlayState* play) {
EffectSsHahen_SpawnBurst(play, &sp40, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1) {
syatekiMan->unk_272 &= ~(1 << this->unk_1E8);
syatekiMan->dekuScrubFlags &= ~(1 << this->unk_1E8);
}
func_80A2BE54(this);
@@ -5,8 +5,9 @@
#include "objects/object_dekunuts/object_dekunuts.h"
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_DEKUNUTS_GET_NUMBER(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_DEKUNUTS_PARAMS(unkFF00, number, unkF) (((unkFF00 << 8) & 0xFF00) | ((number << 4) & 0xF0) | (unkF & 0xF))
struct EnSyatekiDekunuts;
File diff suppressed because it is too large Load Diff
@@ -4,49 +4,70 @@
#include "global.h"
#include "objects/object_shn/object_shn.h"
struct EnSyatekiMan;
typedef void (*EnSyatekiManActionFunc)(struct EnSyatekiMan*, PlayState*);
#define ENSYATEKIMAN_GET_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_MAN_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef struct {
/* 0x00 */ s16 index;
/* 0x04 */ f32 x;
/* 0x08 */ f32 y;
/* 0x0C */ f32 z;
/* 0x10 */ s32 variable;
} EnSyatekiManUnkStruct; // size = 0x14
typedef enum {
/* 0 */ SG_GAME_STATE_NONE, // None of the states below apply.
/* 1 */ SG_GAME_STATE_RUNNING, // The shooting game is in-progress.
/* 2 */ SG_GAME_STATE_EXPLAINING_RULES, // For the Town Shooting Gallery, this state is also used for explaining the current high score.
/* 3 */ SG_GAME_STATE_NOT_PLAYING, // Either the player said "No" to playing, or they said "Yes" but don't have enough rupees.
/* 4 */ SG_GAME_STATE_ONE_MORE_GAME, // The player failed to get a new high score (Town) and/or perfect score (Swamp and Town).
/* 5 */ SG_GAME_STATE_GIVING_BONUS, // The player gets bonus points at the end of the Swamp game if they get a perfect score.
/* 6 */ SG_GAME_STATE_ENDED, // The player got a new high score and/or perfect score (Town), or the game is over (Swamp).
/* 7 */ SG_GAME_STATE_MOVING_PLAYER, // The player is automatically moving towards the spot to play the game.
} ShootingGalleryGameState;
typedef enum {
/* 0 */ SG_OCTO_STATE_SPAWNING,
/* 1 */ SG_OCTO_STATE_SPAWNED,
/* 70 */ SG_OCTO_STATE_INITIAL = 70,
/* 80 */ SG_OCTO_STATE_HIDING = 80,
} ShootingGalleryOctorokState;
typedef enum {
/* 0 */ SG_OCTO_HIT_TYPE_NONE,
/* 1 */ SG_OCTO_HIT_TYPE_RED,
/* 2 */ SG_OCTO_HIT_TYPE_BLUE,
} ShootingGalleryoctorokHitType;
typedef struct EnSyatekiMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSyatekiManActionFunc actionFunc;
/* 0x18C */ Path* path;
/* 0x190 */ s32 unk_190;
/* 0x194 */ s32 unk_194;
/* 0x190 */ s32 octorokFlags;
/* 0x194 */ s32 swampTargetActorListIndex; // used but never initialized, so the value is implicitly always 0
/* 0x198 */ Vec3s jointTable[BURLY_GUY_LIMB_MAX];
/* 0x1F8 */ Vec3s morphTable[BURLY_GUY_LIMB_MAX];
/* 0x258 */ Vec3s unk_258;
/* 0x25E */ Vec3s unk_25E;
/* 0x258 */ Vec3s headRot;
/* 0x25E */ Vec3s torsoRot;
/* 0x264 */ s16 eyeIndex;
/* 0x266 */ s16 blinkTimer;
/* 0x268 */ UNK_TYPE1 unk268[0x2];
/* 0x26A */ s16 unk_26A;
/* 0x26C */ s16 unk_26C;
/* 0x26E */ s16 unk_26E;
/* 0x270 */ s16 unk_270;
/* 0x272 */ s16 unk_272;
/* 0x274 */ s16 unk_274;
/* 0x276 */ s16 unk_276;
/* 0x278 */ s16 unk_278;
/* 0x27A */ s16 unk_27A;
/* 0x27C */ s16 unk_27C;
/* 0x27E */ s16 unk_27E;
/* 0x280 */ s16 unk_280;
/* 0x282 */ s16 unk_282;
/* 0x284 */ s16 unk_284;
/* 0x26A */ s16 shootingGameState;
/* 0x26C */ union {
s16 guaySpawnTimer;
s16 octorokState;
} perGameVar1;
/* 0x26E */ union {
s16 bonusDekuScrubHitCounter;
s16 octorokHitType;
} perGameVar2;
/* 0x270 */ s16 talkWaitTimer;
/* 0x272 */ s16 dekuScrubFlags;
/* 0x274 */ s16 guayFlags;
/* 0x276 */ s16 wolfosFlags;
/* 0x278 */ s16 dekuScrubHitCounter;
/* 0x27A */ s16 guayHitCounter;
/* 0x27C */ s16 currentWave;
/* 0x27E */ s16 flagsIndex; // Used for Octoroks in Town and Guays in Swamp
/* 0x280 */ s16 score;
/* 0x282 */ s16 talkFlags;
/* 0x284 */ s16 prevTextId;
} EnSyatekiMan; // size = 0x288
extern const ActorInit En_Syateki_Man_InitVars;
@@ -137,7 +137,7 @@ s32 func_80A361F4(EnSyatekiOkuta* this) {
temp_v1 = EN_SYATEKI_OKUTA_GET_F(&this->actor);
if ((temp_v1 == 1) || (temp_v1 == 4)) {
temp_a0 = syatekiMan->unk_190;
temp_a0 = syatekiMan->octorokFlags;
temp_a1 = (temp_v1 * 2) + 6;
if ((temp_a0 >> temp_a1) & 3) {
@@ -212,7 +212,7 @@ void func_80A36444(EnSyatekiOkuta* this) {
void func_80A36488(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->unk_26C >= 0x46) {
if (syatekiMan->perGameVar1.octorokState >= SG_OCTO_STATE_INITIAL) {
func_80A364C0(this);
}
}
@@ -341,9 +341,10 @@ void func_80A36AF8(EnSyatekiOkuta* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
s16 temp_v1_2;
if ((this->actionFunc != func_80A36488) && (this->actionFunc != func_80A363B4) && (syatekiMan->unk_26A == 1) &&
(syatekiMan->unk_26C == 0)) {
temp_v1_2 = (syatekiMan->unk_190 >> (EN_SYATEKI_OKUTA_GET_F(&this->actor) * 2)) & 3;
if ((this->actionFunc != func_80A36488) && (this->actionFunc != func_80A363B4) &&
(syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) &&
(syatekiMan->perGameVar1.octorokState == SG_OCTO_STATE_SPAWNING)) {
temp_v1_2 = (syatekiMan->octorokFlags >> (EN_SYATEKI_OKUTA_GET_F(&this->actor) * 2)) & 3;
if (temp_v1_2 > 0) {
Actor_SetScale(&this->actor, 0.01f);
this->unk_2A6 = temp_v1_2;
@@ -370,11 +371,11 @@ void EnSyatekiOkuta_Update(Actor* thisx, PlayState* play) {
if (this->unk_2A6 == 1) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
play->interfaceCtx.unk_25C++;
syatekiMan->unk_280++;
syatekiMan->unk_26E = 1;
syatekiMan->score++;
syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_RED;
} else {
Actor_PlaySfxAtPos(&this->actor, NA_SE_SY_ERROR);
syatekiMan->unk_26E = 2;
syatekiMan->perGameVar2.octorokHitType = SG_OCTO_HIT_TYPE_BLUE;
}
func_80A3657C(this);
@@ -151,7 +151,7 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
path = &play->setupPathList[path->unk1];
}
for (i = 0; i < EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor); i++) {
for (i = 0; i < EN_SYATEKI_WF_GET_NUMBER(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@@ -224,7 +224,7 @@ void func_80A201CC(EnSyatekiWf* this) {
this->actor.draw = NULL;
this->unk_2A4 = 1;
this->unk_298 = 0;
syatekiMan->unk_276 &= ~(1 << EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor));
syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor));
this->actionFunc = func_80A20284;
}
@@ -233,10 +233,10 @@ void func_80A20284(EnSyatekiWf* this, PlayState* play) {
if (this->actor.parent != NULL) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->unk_26A == 1) && (this->unk_298 == 1)) {
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_298 == 1)) {
func_80A200E0(this);
func_80A2030C(this);
} else if (syatekiMan->unk_276 & (1 << EN_SYATEKI_WF_GET_PARAM_FF00(&this->actor))) {
} else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor))) {
this->unk_298 = 1;
}
}
@@ -270,7 +270,7 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
s16 temp_v0;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->unk_26A != 1) {
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
func_80A201CC(this);
}
@@ -375,7 +375,7 @@ void func_80A20858(EnSyatekiWf* this, PlayState* play) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 5, 2);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DEAD);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 6);
syatekiMan->unk_280 += 100;
syatekiMan->score += 100;
this->actionFunc = func_80A208F8;
}
@@ -5,7 +5,8 @@
#include "objects/object_wf/object_wf.h"
#define EN_SYATEKI_WF_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_WF_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_WF_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_WF_PARAMS(number, unkF0, unused) (((number << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
struct EnSyatekiWf;