mirror of
https://github.com/zeldaret/tp
synced 2026-09-07 19:20:58 -04:00
d_a_andsw2 OK, d_a_player / d_a_alink cleanup, d_a_alink_hook mostly done (#1957)
* d_a_andsw2 OK * d_a_player cleanup, d_a_alink cleanup and work on d_a_alink_hook * remove asm * d_kankyo_wether almost done * some work on d_kankyo_rain
This commit is contained in:
+31
-32
@@ -39,7 +39,7 @@ public:
|
||||
/* 80125F14 */ BOOL create();
|
||||
/* 80126358 */ void update();
|
||||
/* 80126424 */ virtual void draw();
|
||||
/* 800CFE68 */ virtual ~daAlink_lockCursor_c();
|
||||
/* 800CFE68 */ virtual ~daAlink_lockCursor_c() {}
|
||||
|
||||
void initFrame() {
|
||||
field_0x4 = false;
|
||||
@@ -72,7 +72,7 @@ public:
|
||||
/* 80126710 */ void onLockFlg();
|
||||
|
||||
/* 801266C0 */ virtual void draw();
|
||||
/* 800CFDF4 */ virtual ~daAlink_sight_c();
|
||||
/* 800CFDF4 */ virtual ~daAlink_sight_c() {}
|
||||
|
||||
bool getLockFlg() { return mLockFlag; }
|
||||
void offLockFlg() { mLockFlag = false; }
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
/* 80125B0C */ void traceBlur(cXyz const*, cXyz const*, s16);
|
||||
|
||||
/* 80125BF4 */ virtual void draw();
|
||||
/* 800CFD58 */ virtual ~daAlink_blur_c();
|
||||
/* 800CFD58 */ virtual ~daAlink_blur_c() {}
|
||||
|
||||
// private:
|
||||
/* 0x010 */ void* m_blurTex;
|
||||
@@ -109,7 +109,7 @@ class dAlink_bottleWaterPcallBack_c : public JPAParticleCallBack {
|
||||
public:
|
||||
dAlink_bottleWaterPcallBack_c() { initialize(0.0f); }
|
||||
/* 80124A2C */ virtual void execute(JPABaseEmitter*, JPABaseParticle*);
|
||||
/* 800CFCF8 */ virtual ~dAlink_bottleWaterPcallBack_c();
|
||||
/* 800CFCF8 */ virtual ~dAlink_bottleWaterPcallBack_c() {}
|
||||
|
||||
void initialize(f32 minY) {
|
||||
mHitFlg = 0;
|
||||
@@ -669,7 +669,9 @@ public:
|
||||
FTANM_UNK_9F = 0x9F,
|
||||
};
|
||||
|
||||
enum daAlink_WARP_MAT_MODE {};
|
||||
enum daAlink_WARP_MAT_MODE {
|
||||
WARP_MAT_MODE_1 = 1,
|
||||
};
|
||||
|
||||
enum daAlink_WANM {
|
||||
/* 0x00 */ WANM_WAIT,
|
||||
@@ -1635,7 +1637,7 @@ public:
|
||||
/* 800CC7DC */ void initTevCustomColor();
|
||||
/* 800CC7FC */ int draw();
|
||||
/* 800CD7AC */ ~daAlink_c();
|
||||
/* 800CE294 */ void checkNoSubjectModeCamera();
|
||||
/* 800CE294 */ bool checkNoSubjectModeCamera();
|
||||
/* 800CE468 */ bool acceptSubjectModeChange();
|
||||
/* 800CE628 */ int checkSubjectAction();
|
||||
/* 800CE728 */ void checkBodyAngleX(s16);
|
||||
@@ -2392,7 +2394,7 @@ public:
|
||||
/* 801086DC */ void resetHookshotMode();
|
||||
/* 8010871C */ bool setEnemyBombHookshot(fopAc_ac_c*);
|
||||
/* 80108784 */ bool checkLv7BossRoom();
|
||||
/* 801087B0 */ bool checkHookshotStickBG(cBgS_PolyInfo&);
|
||||
/* 801087B0 */ BOOL checkHookshotStickBG(cBgS_PolyInfo&);
|
||||
/* 80108828 */ void cancelHookshotCarry();
|
||||
/* 80108864 */ void changeHookshotDrawModel();
|
||||
/* 801088A0 */ BOOL checkHookshotRoofLv7Boss();
|
||||
@@ -2413,17 +2415,17 @@ public:
|
||||
/* 80109284 */ int checkUpperItemActionHookshot();
|
||||
/* 801095C8 */ int checkNextActionHookshot();
|
||||
/* 801097A0 */ void setHookshotReturnEnd();
|
||||
/* 80109890 */ void setHookshotHangMoveBGCollect();
|
||||
/* 80109890 */ int setHookshotHangMoveBGCollect();
|
||||
/* 80109AAC */ void setHookshotTopPosFly();
|
||||
/* 80109BDC */ void setHookshotPos();
|
||||
/* 8010B2DC */ void setHookshotRoofWaitAnime();
|
||||
/* 8010B35C */ void setHookshotWallWaitAnime();
|
||||
/* 8010B3AC */ void hookshotRoofTurn();
|
||||
/* 8010B644 */ void initHookshotRoofWaitActor(fopAc_ac_c*);
|
||||
/* 8010B720 */ void checkNextHookPoint();
|
||||
/* 8010B84C */ void checkLandHookshotHang();
|
||||
/* 8010B96C */ void commonHookshotRoofWait();
|
||||
/* 8010BA6C */ void commonHookshotWallWait();
|
||||
/* 8010B720 */ int checkNextHookPoint();
|
||||
/* 8010B84C */ int checkLandHookshotHang();
|
||||
/* 8010B96C */ int commonHookshotRoofWait();
|
||||
/* 8010BA6C */ int commonHookshotWallWait();
|
||||
/* 8010BAA8 */ int procHookshotSubjectInit();
|
||||
/* 8010BB48 */ int procHookshotSubject();
|
||||
/* 8010BC08 */ int procHookshotMoveInit();
|
||||
@@ -3021,7 +3023,7 @@ public:
|
||||
virtual bool exchangeGrabActor(fopAc_ac_c*);
|
||||
virtual bool setForceGrab(fopAc_ac_c*, int, int);
|
||||
virtual void setForcePutPos(cXyz const&);
|
||||
virtual BOOL checkPlayerNoDraw();
|
||||
virtual u32 checkPlayerNoDraw();
|
||||
virtual void voiceStart(u32);
|
||||
virtual void seStartOnlyReverb(u32);
|
||||
virtual void seStartOnlyReverbLevel(u32);
|
||||
@@ -3314,6 +3316,8 @@ public:
|
||||
return i_frameCtrl->checkAnmEnd();
|
||||
}
|
||||
|
||||
const cXyz& getHsChainTopPos() const { return mHookshotTopPos; }
|
||||
|
||||
static int getBallModelIdx() { return 0x25; }
|
||||
static int getBallBtkIdx() { return 0x49; }
|
||||
static int getBallBrkIdx() { return 0x41; }
|
||||
@@ -3387,37 +3391,34 @@ private:
|
||||
/* 0x006DC */ void* field_0x06dc;
|
||||
/* 0x006E0 */ void* field_0x06e0;
|
||||
/* 0x006E4 */ J3DShape* field_0x06e4;
|
||||
/* 0x006E8 */ void* field_0x06e8;
|
||||
/* 0x006E8 */ J3DShape* field_0x06e8;
|
||||
/* 0x006EC */ J3DShape* field_0x06ec;
|
||||
/* 0x006F0 */ J3DShape* field_0x06f0;
|
||||
/* 0x006F4 */ J3DAnmBase* field_0x06f4;
|
||||
/* 0x006F4 */ J3DAnmTevRegKey* field_0x06f4;
|
||||
/* 0x006F8 */ J3DAnmBase* field_0x06f8;
|
||||
/* 0x006FC */ J3DModel* field_0x06fc; // related to human link
|
||||
/* 0x00700 */ J3DModel* field_0x0700;
|
||||
/* 0x00704 */ J3DAnmBase* field_0x0704;
|
||||
/* 0x00708 */ J3DModel* mHeldItemModel;
|
||||
/* 0x0070C */ J3DModel* field_0x070c; // related to held item
|
||||
/* 0x0070C */ J3DModel* mpHookTipModel; // related to held item
|
||||
/* 0x00710 */ J3DModel* field_0x0710; // related to held item
|
||||
/* 0x00714 */ J3DModel* field_0x0714; // related to held item
|
||||
/* 0x00718 */ J3DAnmBase* field_0x0718;
|
||||
/* 0x00718 */ J3DAnmTextureSRTKey* field_0x0718;
|
||||
/* 0x0071C */ J3DAnmBase* field_0x071c;
|
||||
/* 0x00720 */ J3DAnmBase* field_0x0720;
|
||||
/* 0x00724 */ J3DAnmTevRegKey* field_0x0724;
|
||||
/* 0x00728 */ J3DAnmBase* field_0x0728;
|
||||
/* 0x0072C */ J3DAnmBase* field_0x072c;
|
||||
/* 0x00730 */ mDoExt_bckAnm field_0x730;
|
||||
/* 0x0074C */ mDoExt_bckAnm field_0x74C;
|
||||
/* 0x00768 */ J3DModelData* field_0x0768;
|
||||
/* 0x0076C */ Z2SoundObjSimple* field_0x076c;
|
||||
/* 0x00770 */ hsChainShape_c* field_0x770;
|
||||
/* 0x00730 */ mDoExt_bckAnm mItemBck;
|
||||
/* 0x0074C */ mDoExt_bckAnm mHookTipBck;
|
||||
/* 0x00768 */ J3DModelData* mpHookKusariModelData;
|
||||
/* 0x0076C */ Z2SoundObjSimple* mpHookSound;
|
||||
/* 0x00770 */ hsChainShape_c* mpHookChain;
|
||||
/* 0x00774 */ u8 field_0x0774[0x77C - 0x774];
|
||||
/* 0x0077C */ dBgS_ObjLinChk* mpHookshotLinChk;
|
||||
/* 0x00780 */ u8 field_0x780[4];
|
||||
/* 0x00784 */ J3DModel* field_0x784[2];
|
||||
/* 0x0078C */ J3DModel* mpWlChain1Model;
|
||||
/* 0x00790 */ J3DModel* mpWlChain2Model;
|
||||
/* 0x00794 */ J3DModel* mpWlChain3Model;
|
||||
/* 0x00798 */ J3DModel* mpWlChain4Model;
|
||||
/* 0x0078C */ J3DModel* mpWlChainModels[4];
|
||||
/* 0x0079C */ J3DModel* field_0x79c; // related to wolf
|
||||
/* 0x007A0 */ J3DModel* mpWlMidnaHatModel;
|
||||
/* 0x007A4 */ J3DModel* field_0x7a4; // related to wolf
|
||||
@@ -3500,7 +3501,7 @@ private:
|
||||
/* 0x02834 */ daPy_actorKeep_c mThrowBoomerangAcKeep;
|
||||
/* 0x0283C */ daPy_actorKeep_c mCopyRodAcKeep;
|
||||
/* 0x02844 */ daPy_actorKeep_c field_0x2844;
|
||||
/* 0x0284C */ daPy_actorKeep_c field_0x284c;
|
||||
/* 0x0284C */ daPy_actorKeep_c mHookTargetAcKeep;
|
||||
/* 0x02854 */ daPy_actorKeep_c mCargoCarryAcKeep;
|
||||
/* 0x0285C */ daPy_actorKeep_c field_0x285c;
|
||||
/* 0x02864 */ dMsgFlow_c mMsgFlow;
|
||||
@@ -3643,9 +3644,7 @@ private:
|
||||
/* 0x03008 */ s16 field_0x3008;
|
||||
/* 0x0300A */ s16 field_0x300a;
|
||||
/* 0x0300C */ s16 field_0x300c; // might need more accurate name
|
||||
/* 0x0300E */ s16 field_0x300e;
|
||||
/* 0x03010 */ s16 field_0x3010;
|
||||
/* 0x03012 */ s16 field_0x3012;
|
||||
/* 0x0300E */ csXyz field_0x300e;
|
||||
/* 0x03014 */ s16 mFallVoiceInit;
|
||||
/* 0x03016 */ u8 field_0x3016[2];
|
||||
/* 0x03018 */ s16 field_0x3018;
|
||||
@@ -3814,7 +3813,7 @@ private:
|
||||
/* 0x0321C */ u32 field_0x321c;
|
||||
/* 0x03220 */ u32 field_0x3220;
|
||||
/* 0x03224 */ u32 field_0x3224;
|
||||
/* 0x03228 */ u8 field_0x3228[24];
|
||||
/* 0x03228 */ u32 field_0x3228[2][3];
|
||||
/* 0x03240 */ u32 field_0x3240;
|
||||
/* 0x03244 */ u8 field_0x3244[20];
|
||||
/* 0x03258 */ u32 field_0x3258;
|
||||
@@ -3955,7 +3954,7 @@ private:
|
||||
/* 0x037B0 */ cXyz field_0x37b0[2];
|
||||
/* 0x037C8 */ cXyz field_0x37c8;
|
||||
/* 0x037D4 */ cXyz field_0x37d4;
|
||||
/* 0x037E0 */ cXyz field_0x37e0;
|
||||
/* 0x037E0 */ cXyz mHeldItemRootPos;
|
||||
/* 0x037EC */ cXyz mHookshotTopPos;
|
||||
/* 0x037F8 */ cXyz mIronBallCenterPos;
|
||||
/* 0x03804 */ cXyz mIronBallBgChkPos;
|
||||
|
||||
+22
-16
@@ -10,7 +10,7 @@ class daPy_sightPacket_c : public dDlst_base_c {
|
||||
public:
|
||||
daPy_sightPacket_c() {}
|
||||
/* 8015F1A0 */ virtual void draw();
|
||||
/* 80140CDC */ virtual ~daPy_sightPacket_c();
|
||||
/* 80140CDC */ virtual ~daPy_sightPacket_c() {}
|
||||
|
||||
/* 8015F2FC */ void setSight();
|
||||
/* 8015F384 */ void setSightImage(ResTIMG*);
|
||||
@@ -118,7 +118,7 @@ public:
|
||||
/* 80140D80 */ daPy_frameCtrl_c();
|
||||
bool checkAnmEnd();
|
||||
void updateFrame();
|
||||
void setFrameCtrl(u8, short, short, float, float);
|
||||
void setFrameCtrl(u8, short, short, f32, f32);
|
||||
|
||||
u16 getEndFlg() { return mEndFlg; }
|
||||
u16 getNowSetFlg() { return mNowSetFlg; }
|
||||
@@ -217,6 +217,7 @@ public:
|
||||
FLG0_UNDERWATER = 0x800000,
|
||||
FLG0_UNK_100000 = 0x100000,
|
||||
FLG0_UNK_80000 = 0x80000,
|
||||
FLG0_UNK_40000 = 0x40000,
|
||||
FLG0_UNK_20000 = 0x20000,
|
||||
FLG0_UNK_8000 = 0x8000,
|
||||
FLG0_UNK_4000 = 0x4000,
|
||||
@@ -234,6 +235,7 @@ public:
|
||||
|
||||
FLG0_HVY_STATE = FLG0_UNK_40000000 | FLG0_EQUIP_HVY_BOOTS | FLG0_UNK_20000,
|
||||
FLG0_UNK_14000 = 0x14000,
|
||||
FLG0_UNK_18 = FLG0_UNK_10 | FLG0_UNK_8,
|
||||
};
|
||||
|
||||
enum daPy_FLG1 {
|
||||
@@ -275,6 +277,7 @@ public:
|
||||
FLG2_UNK_4000 = 0x4000,
|
||||
FLG2_UNK_2000 = 0x2000,
|
||||
FLG2_UNK_1000 = 0x1000,
|
||||
FLG2_UNK_400 = 0x400,
|
||||
FLG2_UNK_200 = 0x200,
|
||||
FLG2_UNK_80 = 0x80,
|
||||
FLG2_UNK_40 = 0x40,
|
||||
@@ -288,6 +291,7 @@ public:
|
||||
};
|
||||
|
||||
enum daPy_FLG3 {
|
||||
FLG3_UNK_80000000 = 0x80000000,
|
||||
FLG3_UNK_40000000 = 0x40000000,
|
||||
FLG3_UNK_20000000 = 0x20000000,
|
||||
FLG3_UNK_4000000 = 0x4000000,
|
||||
@@ -365,6 +369,7 @@ public:
|
||||
RFLG0_FRONT_ROLL_CRASH = 0x2000,
|
||||
RFLG0_ENEMY_ATTN_LOCK = 0x1000,
|
||||
RFLG0_UNK_400 = 0x400,
|
||||
RFLG0_UNK_100 = 0x100,
|
||||
RFLG0_UNK_80 = 0x80,
|
||||
RFLG0_UNK_40 = 0x40,
|
||||
RFLG0_UNK_10 = 0x10,
|
||||
@@ -459,10 +464,10 @@ public:
|
||||
static bool checkRoomRestartStart();
|
||||
static u32 checkCarryStartLightBallA();
|
||||
static u32 checkCarryStartLightBallB();
|
||||
float getSpinnerRideSpeed() const;
|
||||
f32 getSpinnerRideSpeed() const;
|
||||
bool checkSpinnerReflectEffect();
|
||||
static bool checkBoomerangCharge();
|
||||
bool checkBoomerangChargeTime();
|
||||
int checkBoomerangChargeTime();
|
||||
static daBoomerang_c* getThrowBoomerangActor();
|
||||
static void cancelBoomerangLockActor(fopAc_ac_c*);
|
||||
static void setPlayerDamage(int, int);
|
||||
@@ -565,9 +570,9 @@ public:
|
||||
virtual BOOL checkBoarRun() const;
|
||||
virtual bool checkFmChainPut() const;
|
||||
virtual bool checkHorseElecDamage() const;
|
||||
virtual float getBaseAnimeFrameRate() const;
|
||||
virtual float getBaseAnimeFrame() const;
|
||||
virtual void setAnimeFrame(float);
|
||||
virtual f32 getBaseAnimeFrameRate() const;
|
||||
virtual f32 getBaseAnimeFrame() const;
|
||||
virtual void setAnimeFrame(f32);
|
||||
virtual bool checkWolfLock(fopAc_ac_c*) const;
|
||||
virtual bool cancelWolfLock(fopAc_ac_c*);
|
||||
virtual s32 getAtnActorID() const;
|
||||
@@ -576,14 +581,14 @@ public:
|
||||
virtual bool exchangeGrabActor(fopAc_ac_c*);
|
||||
virtual bool setForceGrab(fopAc_ac_c*, int, int);
|
||||
virtual void setForcePutPos(cXyz const&);
|
||||
virtual BOOL checkPlayerNoDraw();
|
||||
virtual u32 checkPlayerNoDraw();
|
||||
virtual bool checkRopeTag();
|
||||
virtual void voiceStart(u32);
|
||||
virtual void seStartOnlyReverb(u32);
|
||||
virtual void seStartOnlyReverbLevel(u32);
|
||||
virtual void setOutPower(float, short, int);
|
||||
virtual void setGrabCollisionOffset(float, float, cBgS_PolyInfo*);
|
||||
virtual void onMagneGrab(float, float);
|
||||
virtual void setOutPower(f32, short, int);
|
||||
virtual void setGrabCollisionOffset(f32, f32, cBgS_PolyInfo*);
|
||||
virtual void onMagneGrab(f32, f32);
|
||||
virtual void onFrollCrashFlg(u8, int);
|
||||
virtual MtxP getModelJointMtx(u16);
|
||||
virtual MtxP getHeadMtx();
|
||||
@@ -596,10 +601,10 @@ public:
|
||||
virtual void setClothesChange(int);
|
||||
virtual void setPlayerPosAndAngle(cXyz const*, short, int);
|
||||
virtual void setPlayerPosAndAngle(cXyz const*, csXyz const*);
|
||||
virtual void setPlayerPosAndAngle(float (*)[4]);
|
||||
virtual bool setThrowDamage(short, float, float, int, int, int);
|
||||
virtual void setPlayerPosAndAngle(f32 (*)[4]);
|
||||
virtual bool setThrowDamage(short, f32, f32, int, int, int);
|
||||
virtual bool checkSetNpcTks(cXyz*, int, int);
|
||||
virtual int setRollJump(float, float, short);
|
||||
virtual int setRollJump(f32, f32, short);
|
||||
virtual void playerStartCollisionSE(u32, u32);
|
||||
virtual void changeTextureAnime(u16, u16, int);
|
||||
virtual void cancelChangeTextureAnime();
|
||||
@@ -631,7 +636,7 @@ public:
|
||||
virtual bool onWolfEnemyBiteAll(fopAc_ac_c*, daPy_FLG2);
|
||||
virtual bool checkWolfEnemyBiteAllOwn(fopAc_ac_c const*) const;
|
||||
virtual void setWolfEnemyHangBiteAngle(short);
|
||||
virtual void setKandelaarMtx(float (*)[4], int, int);
|
||||
virtual void setKandelaarMtx(f32 (*)[4], int, int);
|
||||
virtual bool getStickAngleFromPlayerShape(short*) const;
|
||||
virtual bool checkSpinnerPathMove();
|
||||
virtual bool checkSpinnerTriggerAttack();
|
||||
@@ -672,7 +677,7 @@ public:
|
||||
virtual BOOL checkBootsOrArmorHeavy() const;
|
||||
virtual s32 getBottleOpenAppearItem() const;
|
||||
virtual bool checkItemSwordEquip() const;
|
||||
virtual float getSinkShapeOffset() const;
|
||||
virtual f32 getSinkShapeOffset() const;
|
||||
virtual BOOL checkSinkDead() const;
|
||||
virtual BOOL checkHorseStart();
|
||||
virtual Z2WolfHowlMgr* getWolfHowlMgrP();
|
||||
@@ -708,6 +713,7 @@ public:
|
||||
bool checkSceneChangeAreaStart() const { return i_checkNoResetFlg2(FLG2_SCN_CHG_START); }
|
||||
bool checkFrontRollCrash() const { return i_checkResetFlg0(RFLG0_FRONT_ROLL_CRASH); }
|
||||
bool checkWolfAttackReverse() const { return checkResetFlg1(RFLG1_WOLF_ATTACK_REVERSE); }
|
||||
bool checkFreezeDamage() const { return i_checkNoResetFlg1(FLG1_UNK_40000000); }
|
||||
|
||||
void onForceAutoJump() { i_onEndResetFlg0(ERFLG0_FORCE_AUTO_JUMP); }
|
||||
void onNotAutoJump() { i_onEndResetFlg0(ERFLG0_NOT_AUTO_JUMP); }
|
||||
|
||||
@@ -97,8 +97,10 @@ public:
|
||||
f32 RoofChk(dBgS_RoofChk*);
|
||||
bool SplGrpChk(dBgS_SplGrpChk*);
|
||||
bool SphChk(dBgS_SphChk*, void*);
|
||||
void MoveBgCrrPos(cBgS_PolyInfo const&, bool, cXyz*, csXyz*, csXyz*, bool, bool);
|
||||
void MoveBgTransPos(cBgS_PolyInfo const&, bool, cXyz*, csXyz*, csXyz*);
|
||||
void MoveBgCrrPos(cBgS_PolyInfo const& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle,
|
||||
csXyz* i_shapeAngle, bool param_5, bool param_6);
|
||||
void MoveBgTransPos(cBgS_PolyInfo const& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle,
|
||||
csXyz* i_shapeAngle);
|
||||
void MoveBgMatrixCrrPos(cBgS_PolyInfo const&, bool, cXyz*, csXyz*, csXyz*);
|
||||
void RideCallBack(cBgS_PolyInfo const&, fopAc_ac_c*);
|
||||
void ArrowStickCallBack(cBgS_PolyInfo const&, fopAc_ac_c*, cXyz&);
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
void SetWallH(f32 h) { m_wall_h = h; }
|
||||
void ClrWallHDirect() { m_flags &= ~WALL_H_DIRECT; }
|
||||
bool ChkWallHit() { return m_flags & WALL_HIT; }
|
||||
s16 GetWallAngleY() { return m_wall_angle_y; }
|
||||
|
||||
void SetCir(cXyz& pos) { m_cir.Set(pos.x, pos.z, pos.y + GetWallH(), m_wall_r); }
|
||||
}; // Size: 0x40
|
||||
@@ -159,6 +160,7 @@ public:
|
||||
bool ChkMoveBGOnly() const { return m_flags & MOVE_BG_ONLY; }
|
||||
void SetWallHit() { m_flags |= WALL_HIT; }
|
||||
void ClrWallNone() { m_flags &= ~WALL_NONE; }
|
||||
void OnLineCheckNone() { m_flags |= LINE_CHECK_NONE; }
|
||||
cM3dGCyl* GetWallBmdCylP() { return &m_wall_cyl; }
|
||||
|
||||
// inline dupe
|
||||
@@ -204,7 +206,7 @@ class dBgS_LinkAcch : public dBgS_Acch {
|
||||
public:
|
||||
dBgS_LinkAcch() { SetLink(); }
|
||||
|
||||
/* 80140F30 */ virtual ~dBgS_LinkAcch();
|
||||
/* 80140F30 */ virtual ~dBgS_LinkAcch() {}
|
||||
};
|
||||
|
||||
class dBgS_ObjAcch : public dBgS_Acch {
|
||||
|
||||
@@ -13,14 +13,14 @@ public:
|
||||
class dBgS_LinkGndChk : public dBgS_GndChk {
|
||||
public:
|
||||
dBgS_LinkGndChk() { SetLink(); }
|
||||
/* 80140EB8 */ virtual ~dBgS_LinkGndChk();
|
||||
/* 80140EB8 */ virtual ~dBgS_LinkGndChk() {}
|
||||
};
|
||||
|
||||
class dBgS_ObjGndChk : public dBgS_GndChk {
|
||||
public:
|
||||
dBgS_ObjGndChk() { SetObj(); }
|
||||
|
||||
/* 8001E020 */ virtual ~dBgS_ObjGndChk();
|
||||
/* 8001E020 */ virtual ~dBgS_ObjGndChk(); // should be inlined
|
||||
};
|
||||
|
||||
class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk {
|
||||
|
||||
@@ -28,7 +28,7 @@ private:
|
||||
class dBgS_LinkRoofChk : public dBgS_RoofChk {
|
||||
public:
|
||||
dBgS_LinkRoofChk() { SetLink(); }
|
||||
/* 80140E40 */ virtual ~dBgS_LinkRoofChk();
|
||||
/* 80140E40 */ virtual ~dBgS_LinkRoofChk() {}
|
||||
};
|
||||
|
||||
#endif /* D_BG_D_BG_S_ROOF_CHK_H */
|
||||
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
}; // Size = 0x3C
|
||||
|
||||
class dCcD_GObjInf;
|
||||
typedef void (*dCcD_HitCallback)(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*);
|
||||
typedef void (*dCcD_HitCallback)(fopAc_ac_c* i_actorA, dCcD_GObjInf* i_objInfA, fopAc_ac_c* i_actorB, dCcD_GObjInf* i_objInfB);
|
||||
|
||||
|
||||
// Attack/Defense/Correction Collider Common Base
|
||||
@@ -206,6 +206,7 @@ public:
|
||||
u8 GetHitMark() { return mHitMark; }
|
||||
void SetRVec(cXyz& vec) { mRVec = vec; }
|
||||
void SetHitPos(cXyz& pos) { mHitPos = pos; }
|
||||
cXyz* GetHitPosP() { return &mHitPos; }
|
||||
|
||||
// private:
|
||||
/* 0x1C */ u8 mSe;
|
||||
@@ -376,6 +377,8 @@ public:
|
||||
void SetTgHitPos(cXyz& pos) { mGObjTg.SetHitPos(pos); }
|
||||
void SetAtHitPos(cXyz& pos) { mGObjAt.SetHitPos(pos); }
|
||||
u32 GetTgHitObjHitSeID(int i_soundID) { return getHitSeID(GetTgHitObjSe(),i_soundID); }
|
||||
cXyz* GetAtHitPosP() { return mGObjAt.GetHitPosP(); }
|
||||
bool ChkTgHookshotThrough() { return mGObjTg.ChkSPrm(0x80); }
|
||||
|
||||
static const Z2SoundID m_hitSeID[24];
|
||||
|
||||
|
||||
@@ -2505,6 +2505,10 @@ inline void dComIfGp_clearPlayerStatus0(int param_0, u32 flag) {
|
||||
g_dComIfG_gameInfo.play.clearPlayerStatus(param_0, 0, flag);
|
||||
}
|
||||
|
||||
inline void dComIfGp_clearPlayerStatus1(int param_0, u32 flag) {
|
||||
g_dComIfG_gameInfo.play.clearPlayerStatus(param_0, 1, flag);
|
||||
}
|
||||
|
||||
inline dStage_stageDt_c* i_dComIfGp_getStage() {
|
||||
return &g_dComIfG_gameInfo.play.getStage();
|
||||
}
|
||||
@@ -3423,6 +3427,16 @@ inline u32 dComIfGp_particle_setPolyColor(u32 param_0, u16 param_1, cBgS_PolyInf
|
||||
param_8, param_9, param_10);
|
||||
}
|
||||
|
||||
inline JPABaseEmitter* dComIfGp_particle_setPolyColor(u16 param_1, cBgS_PolyInfo& param_2,
|
||||
const cXyz* param_3, const dKy_tevstr_c* param_4,
|
||||
const csXyz* param_5, const cXyz* param_6, int param_7,
|
||||
dPa_levelEcallBack* param_8, s8 param_9,
|
||||
const cXyz* param_10) {
|
||||
return g_dComIfG_gameInfo.play.getParticle()->setPoly(param_1, param_2, param_3,
|
||||
param_4, param_5, param_6, param_7,
|
||||
param_8, param_9, param_10);
|
||||
}
|
||||
|
||||
int dComIfGd_setSimpleShadow(cXyz* pos, f32 param_1, f32 param_2, cBgS_PolyInfo& param_3, s16 angle,
|
||||
f32 param_5, _GXTexObj* tex);
|
||||
stage_camera_class* dComIfGp_getRoomCamera(int i_roomNo);
|
||||
@@ -3556,6 +3570,11 @@ inline void dComIfGd_setListIndScreen() {
|
||||
g_dComIfG_gameInfo.drawlist.setXluListP0();
|
||||
}
|
||||
|
||||
inline void dComIfGd_setListMiddle() {
|
||||
g_dComIfG_gameInfo.drawlist.setOpaListMiddle();
|
||||
g_dComIfG_gameInfo.drawlist.setXluListMiddle();
|
||||
}
|
||||
|
||||
inline void dComIfGd_setListZxlu() {
|
||||
g_dComIfG_gameInfo.drawlist.setOpaListZxlu();
|
||||
g_dComIfG_gameInfo.drawlist.setXluListZxlu();
|
||||
@@ -3565,6 +3584,10 @@ inline J3DDrawBuffer* dComIfGd_getOpaListBG() {
|
||||
return g_dComIfG_gameInfo.drawlist.getOpaListBG();
|
||||
}
|
||||
|
||||
inline J3DDrawBuffer* dComIfGd_getOpaListDark() {
|
||||
return g_dComIfG_gameInfo.drawlist.getOpaListDark();
|
||||
}
|
||||
|
||||
inline void dComIfGd_init() {
|
||||
g_dComIfG_gameInfo.drawlist.init();
|
||||
}
|
||||
@@ -3593,6 +3616,10 @@ inline void dComIfGd_entryZSortListZxlu(J3DPacket* i_packet, cXyz& param_1) {
|
||||
g_dComIfG_gameInfo.drawlist.entryZSortListZxlu(i_packet, param_1);
|
||||
}
|
||||
|
||||
inline void dComIfGd_entryZSortXluList(J3DPacket* i_packet, cXyz& param_1) {
|
||||
g_dComIfG_gameInfo.drawlist.entryZSortXluList(i_packet, param_1);
|
||||
}
|
||||
|
||||
inline void dComIfGd_drawCopy2D() {
|
||||
g_dComIfG_gameInfo.drawlist.drawCopy2D();
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ public:
|
||||
/* 801647B0 */ void onRoomChange(s32);
|
||||
/* 80164878 */ void getParamTargetActor(s32);
|
||||
/* 80164944 */ void GetCameraTypeFromMapToolID(s32, s32);
|
||||
/* 80164B64 */ void GetCameraTypeFromCameraName(char const*);
|
||||
/* 80164B64 */ int GetCameraTypeFromCameraName(char const*);
|
||||
/* 80164C10 */ void GetCameraTypeFromToolData(stage_camera2_data_class*);
|
||||
/* 80164C64 */ void pushInfo(dCamera_c::dCamInfo_c*, s16);
|
||||
/* 80164CAC */ void popInfo(dCamera_c::dCamInfo_c*);
|
||||
@@ -332,6 +332,7 @@ public:
|
||||
|
||||
bool Active() { return field_0x24 == 0; }
|
||||
f32 TrimHeight() { return mTrimHeight; }
|
||||
int Type() { return mCurType; }
|
||||
|
||||
static u8 engine_tbl[240];
|
||||
|
||||
|
||||
@@ -312,8 +312,9 @@ public:
|
||||
J3DDrawBuffer* getOpaListP0() { return mDrawBuffers[DB_LIST_P0]; }
|
||||
J3DDrawBuffer* getOpaListPacket() { return mDrawBuffers[DB_OPA_LIST_PACKET]; }
|
||||
J3DDrawBuffer* getOpaListBG() { return mDrawBuffers[DB_OPA_LIST_BG]; }
|
||||
void setXluDrawList(J3DDrawBuffer* buffer) { j3dSys.setDrawBuffer(buffer, XLU_BUFFER); }
|
||||
void setOpaDrawList(J3DDrawBuffer* buffer) { j3dSys.setDrawBuffer(buffer, OPA_BUFFER); }
|
||||
J3DDrawBuffer* getOpaListDark() { return mDrawBuffers[DB_OPA_LIST_DARK]; }
|
||||
void setXluDrawList(J3DDrawBuffer* buffer) { j3dSys.setDrawBuffer(buffer, J3DSys_XLU_BUFFER_e); }
|
||||
void setOpaDrawList(J3DDrawBuffer* buffer) { j3dSys.setDrawBuffer(buffer, J3DSys_OPA_BUFFER_e); }
|
||||
void setXluListSky() { setXluDrawList(mDrawBuffers[DB_XLU_LIST_SKY]); }
|
||||
void setOpaListSky() { setOpaDrawList(mDrawBuffers[DB_OPA_LIST_SKY]); }
|
||||
void setXluListDark() { setXluDrawList(mDrawBuffers[DB_XLU_LIST_DARK]); }
|
||||
@@ -333,6 +334,8 @@ public:
|
||||
void setXluList2DScreen() { setXluDrawList(mDrawBuffers[DB_LIST_2D_SCREEN]); }
|
||||
void setXluListP0() { setXluDrawList(mDrawBuffers[DB_LIST_P0]); }
|
||||
void setOpaListP0() { setOpaDrawList(mDrawBuffers[DB_LIST_P0]); }
|
||||
void setXluListMiddle() { setXluDrawList(mDrawBuffers[DB_LIST_MIDDLE]); }
|
||||
void setOpaListMiddle() { setOpaDrawList(mDrawBuffers[DB_LIST_MIDDLE]); }
|
||||
void setOpaListZxlu() { setOpaDrawList(mDrawBuffers[DB_LIST_Z_XLU]); }
|
||||
void setXluListZxlu() { setXluDrawList(mDrawBuffers[DB_LIST_Z_XLU]); }
|
||||
|
||||
@@ -341,6 +344,10 @@ public:
|
||||
entryZSortXluDrawList(mDrawBuffers[DB_LIST_Z_XLU], i_packet, param_1);
|
||||
}
|
||||
|
||||
void entryZSortXluList(J3DPacket* i_packet, cXyz& param_1) {
|
||||
entryZSortXluDrawList(mDrawBuffers[DB_XLU_LIST], i_packet, param_1);
|
||||
}
|
||||
|
||||
int setSimpleShadow(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, s16 param_4,
|
||||
f32 param_5, _GXTexObj* param_6) {
|
||||
return mShadowControl.setSimple(param_0, param_1, param_2, param_3, param_4, param_5,
|
||||
|
||||
+8
-10
@@ -13,17 +13,10 @@ public:
|
||||
/* 8009CB14 */ static void entry(dEyeHL_c*);
|
||||
/* 8009CB34 */ static void remove(dEyeHL_c*);
|
||||
|
||||
static dEyeHL_mng_c* m_obj;
|
||||
|
||||
/* 0x00 */ u8 field_0x0[4];
|
||||
/* 0x04 */ ResTIMG* m_timg;
|
||||
/* 0x08 */ s16 m_lodBias;
|
||||
/* 0x0A */ u8 field_0x0a[2];
|
||||
/* 0x0C */ dEyeHL_mng_c* m_pre;
|
||||
/* 0x10 */ dEyeHL_mng_c* m_next;
|
||||
static dEyeHL_c* m_obj;
|
||||
};
|
||||
|
||||
class dEyeHL_c : public dEyeHL_mng_c {
|
||||
class dEyeHL_c {
|
||||
public:
|
||||
dEyeHL_c() {
|
||||
m_timg = NULL;
|
||||
@@ -33,7 +26,12 @@ public:
|
||||
|
||||
/* 8009C964 */ void entry(J3DModelData*, char const*);
|
||||
/* 8009CA28 */ void remove();
|
||||
/* 80140C80 */ ~dEyeHL_c();
|
||||
/* 80140C80 */ virtual ~dEyeHL_c() { remove(); }
|
||||
|
||||
/* 0x04 */ ResTIMG* m_timg;
|
||||
/* 0x08 */ s16 m_lodBias;
|
||||
/* 0x0C */ dEyeHL_c* m_pre;
|
||||
/* 0x10 */ dEyeHL_c* m_next;
|
||||
};
|
||||
|
||||
#endif /* D_D_EYE_HL_H */
|
||||
|
||||
@@ -11,6 +11,7 @@ class JKRAramArchive;
|
||||
u32 dLib_getExpandSizeFromAramArchive(JKRAramArchive* arc, char const* resName);
|
||||
BOOL dLib_checkActorInRectangle(fopAc_ac_c* param_0, fopAc_ac_c* param_1, cXyz const* param_2,
|
||||
cXyz const* param_3);
|
||||
u8 dLib_getEventSwitchNo(int param_0);
|
||||
|
||||
class STControl {
|
||||
public:
|
||||
|
||||
+24
-1
@@ -299,8 +299,15 @@ struct dStage_FloorInfo_c {
|
||||
// FLOR
|
||||
};
|
||||
|
||||
class dStage_Lbnk_dt_c {
|
||||
public:
|
||||
/* 0x0 */ u8 field_0x0[0x2 - 0x0];
|
||||
/* 0x2 */ u8 field_0x2;
|
||||
};
|
||||
|
||||
struct dStage_Lbnk_c {
|
||||
// LBNK
|
||||
/* 0x0 */ int num;
|
||||
/* 0x4 */ dStage_Lbnk_dt_c* entries;
|
||||
};
|
||||
|
||||
struct dStage_Elst_data {
|
||||
@@ -1095,6 +1102,14 @@ inline f32 dStage_FileList_dt_SeaLevel(dStage_FileList_dt_c* p_fList) {
|
||||
return p_fList->mSeaLevel;
|
||||
}
|
||||
|
||||
inline int dStage_FileList_dt_GlobalWindLevel(dStage_FileList_dt_c* i_fili) {
|
||||
return (i_fili->mParameters >> 0x12) & 3;
|
||||
}
|
||||
|
||||
inline int dStage_FileList_dt_GlobalWindDir(dStage_FileList_dt_c* i_fili) {
|
||||
return (i_fili->mParameters >> 0xF) & 7;
|
||||
}
|
||||
|
||||
inline f32 dStage_FileList2_dt_GetLeftRmX(dStage_FileList2_dt_c* p_fList2) {
|
||||
return p_fList2->mLeftRmX;
|
||||
}
|
||||
@@ -1127,4 +1142,12 @@ inline int dStage_MapEvent_dt_c_getEventSCutType(dStage_MapEvent_dt_c* event) {
|
||||
return event->field_0x8 >> 1 & 3;
|
||||
}
|
||||
|
||||
inline int dStage_lbnkWIND(dStage_Lbnk_dt_c* i_data) {
|
||||
return (i_data->field_0x2 >> 3) & 7;
|
||||
}
|
||||
|
||||
inline int dStage_lbnkWlevel(dStage_Lbnk_dt_c* i_data) {
|
||||
return (i_data->field_0x2 >> 6) & 3;
|
||||
}
|
||||
|
||||
#endif /* D_D_STAGE_H */
|
||||
|
||||
@@ -127,7 +127,7 @@ struct BOSS_LIGHT {
|
||||
|
||||
struct GB_WIND_INFLUENCE {
|
||||
/* 0x00 */ cXyz vec;
|
||||
/* 0x0C */ int field_0xc;
|
||||
/* 0x0C */ cXyz* vec_override;
|
||||
/* 0x10 */ f32 pow;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#ifndef D_KANKYO_D_KANKYO_RAIN_H
|
||||
#define D_KANKYO_D_KANKYO_RAIN_H
|
||||
|
||||
#include "dolphin/types.h"
|
||||
#include "dolphin/mtx/mtx.h"
|
||||
|
||||
struct cXyz;
|
||||
struct _GXColor;
|
||||
|
||||
void dKyr_drawSun(f32 (*param_0)[4], cXyz* param_1, _GXColor& param_2, u8** param_3);
|
||||
void dKyr_drawLenzflare(f32 (*param_0)[4], cXyz* param_1, _GXColor& param_2, u8** param_3);
|
||||
void dKyr_drawSibuki(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_drawRain(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_drawSnow(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_drawStar(f32 (*param_0)[4], u8** param_1);
|
||||
void drawCloudShadow(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_drawHousi(f32 (*param_0)[4], u8** param_1);
|
||||
void drawVrkumo(f32 (*param_0)[4], _GXColor& param_1, u8** param_2);
|
||||
void dKyr_odour_draw(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_mud_draw(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_evil_draw(f32 (*param_0)[4], u8** param_1);
|
||||
void dKyr_drawSun(Mtx param_0, cXyz* param_1, _GXColor& param_2, u8** param_3);
|
||||
void dKyr_drawLenzflare(Mtx param_0, cXyz* param_1, _GXColor& param_2, u8** param_3);
|
||||
void dKyr_drawSibuki(Mtx param_0, u8** param_1);
|
||||
void dKyr_drawRain(Mtx param_0, u8** param_1);
|
||||
void dKyr_drawSnow(Mtx param_0, u8** param_1);
|
||||
void dKyr_drawStar(Mtx param_0, u8** param_1);
|
||||
void drawCloudShadow(Mtx param_0, u8** param_1);
|
||||
void dKyr_drawHousi(Mtx param_0, u8** param_1);
|
||||
void drawVrkumo(Mtx param_0, _GXColor& param_1, u8** param_2);
|
||||
void dKyr_odour_draw(Mtx param_0, u8** param_1);
|
||||
void dKyr_mud_draw(Mtx param_0, u8** param_1);
|
||||
void dKyr_evil_draw(Mtx param_0, u8** param_1);
|
||||
void dKyr_thunder_init();
|
||||
void dKyr_thunder_move();
|
||||
void dKyr_snow_init();
|
||||
@@ -39,6 +39,7 @@ void dKyr_star_init();
|
||||
void dKyr_shstar_init();
|
||||
void dKyr_star_move();
|
||||
void dKyr_shstar_move();
|
||||
void vrkumo_move();
|
||||
void dKyr_get_vectle_calc(cXyz* param_0, cXyz* param_1, cXyz* param_2);
|
||||
|
||||
#endif /* D_KANKYO_D_KANKYO_RAIN_H */
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
#include "JSystem/J3DGraphBase/J3DPacket.h"
|
||||
#include "SSystem/SComponent/c_sxyz.h"
|
||||
#include "SSystem/SComponent/c_xyz.h"
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class WIND_INFLUENCE;
|
||||
|
||||
void dKyw_wether_draw();
|
||||
void dKyw_wether_delete();
|
||||
@@ -28,6 +29,8 @@ void dKyw_custom_windpower(f32 pow);
|
||||
void dKyw_evt_wind_set_go();
|
||||
void dKyw_wether_proc();
|
||||
void dKyw_get_AllWind_vec(cXyz* param_0, cXyz* param_1, f32* param_2);
|
||||
void dKyw_pntwind_cut(WIND_INFLUENCE* i_pntwind);
|
||||
cXyz dKyw_pntwind_get_vecpow(cXyz* param_0);
|
||||
|
||||
class dKankyo_sun_Packet : public J3DPacket {
|
||||
public:
|
||||
@@ -79,7 +82,7 @@ struct RAIN_EFF {
|
||||
/* 80056CD0 */ ~RAIN_EFF();
|
||||
/* 80056D0C */ RAIN_EFF();
|
||||
|
||||
/* 0x00 */ u8 mStatus;
|
||||
/* 0x00 */ s8 mStatus;
|
||||
/* 0x04 */ cXyz mPosition;
|
||||
/* 0x10 */ cXyz mBasePos;
|
||||
/* 0x1C */ f32 field_0x1c;
|
||||
@@ -176,14 +179,18 @@ struct HOUSI_EFF {
|
||||
/* 80056EA8 */ ~HOUSI_EFF();
|
||||
/* 80056EE4 */ HOUSI_EFF();
|
||||
|
||||
/* 0x00 */ u8 mStatus;
|
||||
/* 0x00 */ s8 mStatus;
|
||||
/* 0x04 */ cXyz mPosition;
|
||||
/* 0x10 */ cXyz mBasePos;
|
||||
/* 0x1C */ cXyz mSpeed;
|
||||
/* 0x28 */ cXyz mScale;
|
||||
/* 0x34 */ u8 field_0x34[0x40 - 0x34];
|
||||
/* 0x34 */ f32 field_0x34;
|
||||
/* 0x38 */ f32 field_0x38;
|
||||
/* 0x3C */ u16 field_0x3c;
|
||||
/* 0x40 */ f32 mAlpha;
|
||||
/* 0x44 */ u8 field_0x44[0x50 - 0x44];
|
||||
/* 0x44 */ f32 field_0x44;
|
||||
/* 0x48 */ f32 field_0x48;
|
||||
/* 0x4C */ u16 field_0x4c;
|
||||
}; // Size: 0x50
|
||||
|
||||
class dKankyo_housi_Packet : public J3DPacket {
|
||||
@@ -196,7 +203,7 @@ public:
|
||||
/* 0x0020 */ HOUSI_EFF mHousiEff[300];
|
||||
/* 0x5DE0 */ u8 field_0x5de0[8];
|
||||
/* 0x5DE8 */ f32 field_0x5de8;
|
||||
/* 0x5DEC */ u8 field_0x5dec[4];
|
||||
/* 0x5DEC */ s16 field_0x5dec;
|
||||
}; // Size: 0x5DF0
|
||||
|
||||
struct CLOUD_EFF {
|
||||
|
||||
@@ -16,7 +16,7 @@ class fopAc_ac_c;
|
||||
|
||||
class dPa_levelEcallBack : public JPAEmitterCallBack {
|
||||
public:
|
||||
/* 8004FB18 */ virtual ~dPa_levelEcallBack();
|
||||
/* 8004FB18 */ virtual ~dPa_levelEcallBack(); /* { cleanup(); } */ // should be inlined
|
||||
virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) = 0;
|
||||
/* 8004FB8C */ virtual void cleanup();
|
||||
};
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
|
||||
/* 8004F6B8 */ void setOldPosP(cXyz const*, cXyz const*);
|
||||
|
||||
/* 8004FCC8 */ virtual ~dPa_hermiteEcallBack_c();
|
||||
/* 8004FCC8 */ virtual ~dPa_hermiteEcallBack_c(); // should be inlined
|
||||
/* 8004F6C4 */ virtual void executeAfter(JPABaseEmitter*);
|
||||
/* 8004FABC */ virtual void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user