mirror of
https://github.com/zeldaret/ss
synced 2026-05-25 15:25:13 -04:00
d_linkage is largely done (#176)
This commit is contained in:
@@ -48,7 +48,7 @@ g_profile_OBJ_RING = .data:0x00000000; // type:object size:0x10 data:4byte
|
||||
lbl_193_data_10 = .data:0x00000010; // type:object size:0x8 scope:local
|
||||
lbl_193_data_18 = .data:0x00000018; // type:object size:0x10 scope:local
|
||||
lbl_193_data_28 = .data:0x00000028; // type:object size:0x18 scope:local data:string
|
||||
ROT_PER_TICK__10dAcOring_c = .data:0x00000040; // type:object size:0x4 data:4byte
|
||||
lbl_193_data_40 = .data:0x00000040; // type:object size:0x4 scope:local data:4byte
|
||||
__vt__10dAcOring_c = .data:0x00000048; // type:object size:0x80
|
||||
__vt__49sFStateMgr_c<10dAcOring_c,20sStateMethodUsr_FI_c> = .data:0x000000C8; // type:object size:0x30
|
||||
__vt__79sStateMgr_c<10dAcOring_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F8; // type:object size:0x30
|
||||
|
||||
@@ -9,6 +9,6 @@ draw__15dTgHeatResist_cFv = .text:0x000001B0; // type:function size:0x8
|
||||
__dt__15dTgHeatResist_cFv = .text:0x000001C0; // type:function size:0x5C
|
||||
_ctors = .ctors:0x00000000; // type:label scope:global
|
||||
_dtors = .dtors:0x00000000; // type:label scope:global
|
||||
@19473 = .rodata:0x00000000; // type:object size:0x4 data:float
|
||||
lbl_444_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float
|
||||
g_profile_TAG_HEAT_RESIST = .data:0x00000000; // type:object size:0x10
|
||||
__vt__15dTgHeatResist_c = .data:0x00000010; // type:object size:0x74
|
||||
|
||||
@@ -166,7 +166,7 @@ d/d_base.cpp:
|
||||
.data start:0x80503380 end:0x805033D0
|
||||
.sbss start:0x805750C0 end:0x805750CC
|
||||
|
||||
d/d_carry.cpp:
|
||||
d/d_linkage.cpp:
|
||||
.text start:0x80050A20 end:0x80051BF8 align:16
|
||||
.data start:0x805033D0 end:0x805033E0
|
||||
.sdata2 start:0x80576ED8 end:0x80576F20
|
||||
|
||||
+34
-34
@@ -2096,19 +2096,19 @@ unloadCallback__7dBase_cFv = .text:0x800509D0; // type:function size:0x4
|
||||
initLoader__7dBase_cFv = .text:0x800509E0; // type:function size:0x1C
|
||||
createBase__7dBase_cFUsP7dBase_cUlUc = .text:0x80050A00; // type:function size:0x4
|
||||
createRoot__7dBase_cFUsUlUc = .text:0x80050A10; // type:function size:0x4
|
||||
__ct__16ActorCarryStructFv = .text:0x80050A20; // type:function size:0x118
|
||||
__dt__16ActorCarryStructFv = .text:0x80050B40; // type:function size:0x80
|
||||
set__16ActorCarryStructFUlfffPv = .text:0x80050BC0; // type:function size:0xB4
|
||||
actorAttachingRelated = .text:0x80050C80; // type:function size:0x13C
|
||||
fn_80050DC0 = .text:0x80050DC0; // type:function size:0x34
|
||||
fn_80050E00 = .text:0x80050E00; // type:function size:0x34
|
||||
fn_80050E40 = .text:0x80050E40; // type:function size:0x60
|
||||
fn_80050EA0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EA0; // type:function size:0xC
|
||||
fn_80050EB0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140
|
||||
bushTpFunc__16ActorCarryStructFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C
|
||||
fn_80051190__16ActorCarryStructFP12dAcObjBase_c = .text:0x80051190; // type:function size:0x4C
|
||||
fn_800511E0__16ActorCarryStructFP12dAcObjBase_c = .text:0x800511E0; // type:function size:0x1D8
|
||||
isCarriedActor_NotGerock = .text:0x800513C0; // type:function size:0x78
|
||||
__ct__10dLinkage_cFv = .text:0x80050A20; // type:function size:0x118
|
||||
__dt__10dLinkage_cFv = .text:0x80050B40; // type:function size:0x80
|
||||
set__10dLinkage_cFUlfffPv = .text:0x80050BC0; // type:function size:0xB4
|
||||
tryAttach__10dLinkage_cFP12dAcObjBase_cP12dAcObjBase_cP12dAcRefBase_cQ210dLinkage_c16ConnectionType_eb = .text:0x80050C80; // type:function size:0x13C
|
||||
fn_80050DC0__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050DC0; // type:function size:0x34
|
||||
fn_80050E00__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050E00; // type:function size:0x34
|
||||
fn_80050E40__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050E40; // type:function size:0x60
|
||||
fn_80050EA0__10dLinkage_cFP12dAcObjBase_c = .text:0x80050EA0; // type:function size:0xC
|
||||
fn_80050EB0__10dLinkage_cFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140
|
||||
bushTpFunc__10dLinkage_cFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C
|
||||
fn_80051190__10dLinkage_cFP12dAcObjBase_c = .text:0x80051190; // type:function size:0x4C
|
||||
fn_800511E0__10dLinkage_cFP12dAcObjBase_c = .text:0x800511E0; // type:function size:0x1D8
|
||||
fn_800513C0__10dLinkage_cCFv = .text:0x800513C0; // type:function size:0x78
|
||||
fn_80051440 = .text:0x80051440; // type:function size:0x17C
|
||||
modifyMtx__13dAcObjRef_unkFv = .text:0x800515C0; // type:function size:0xC
|
||||
fn_800515D0 = .text:0x800515D0; // type:function size:0x60
|
||||
@@ -12227,7 +12227,7 @@ fn_801F77F0 = .text:0x801F77F0; // type:function size:0x49C
|
||||
fn_801F7C90 = .text:0x801F7C90; // type:function size:0x6C
|
||||
fn_801F7D00 = .text:0x801F7D00; // type:function size:0x28
|
||||
ActorLink__equipClawshots = .text:0x801F7D30; // type:function size:0x434
|
||||
AnimationRelated_ctor2 = .text:0x801F8170; // type:function size:0x3C
|
||||
__ct__Q23m3d8anmChr_cFv = .text:0x801F8170; // type:function size:0x3C scope:weak
|
||||
isInUsingClawsAnim = .text:0x801F81B0; // type:function size:0x20
|
||||
ActorLink__UsingClawsFromNotGrouund = .text:0x801F81D0; // type:function size:0x38
|
||||
fn_801F8210 = .text:0x801F8210; // type:function size:0xB0
|
||||
@@ -12388,7 +12388,7 @@ fn_80202D80 = .text:0x80202D80; // type:function size:0x8
|
||||
fn_80202D90__7dAcPy_cFb = .text:0x80202D90; // type:function size:0x48
|
||||
ActorLink__getTotalNumberOfBombs = .text:0x80202DE0; // type:function size:0x4
|
||||
ActorLink__changeBombCounterAndPouch = .text:0x80202DF0; // type:function size:0x8
|
||||
fn_80202E00 = .text:0x80202E00; // type:function size:0x7C
|
||||
fn_80202E00__7dAcPy_cFP13cBgS_PolyInfoff = .text:0x80202E00; // type:function size:0x7C
|
||||
fn_80202E80 = .text:0x80202E80; // type:function size:0x80
|
||||
fn_80202F00 = .text:0x80202F00; // type:function size:0x90
|
||||
isInLiftingSmallObjectAnim = .text:0x80202F90; // type:function size:0x38
|
||||
@@ -12998,7 +12998,7 @@ fn_80230220 = .text:0x80230220; // type:function size:0x24
|
||||
fn_80230250 = .text:0x80230250; // type:function size:0x60
|
||||
fn_802302B0 = .text:0x802302B0; // type:function size:0x8
|
||||
ActorLink__equipWhip = .text:0x802302C0; // type:function size:0x4B0
|
||||
fn_80230770 = .text:0x80230770; // type:function size:0x1C
|
||||
getWhippedItem__7dAcPy_cFv = .text:0x80230770; // type:function size:0x1C
|
||||
ActorLink__GetWhipTip = .text:0x80230790; // type:function size:0x44
|
||||
ActorLink__GetWhipBase = .text:0x802307E0; // type:function size:0x40
|
||||
fn_80230820 = .text:0x80230820; // type:function size:0x7C
|
||||
@@ -14043,7 +14043,7 @@ __dt__23sFState_c<10dAcArrow_c>Fv = .text:0x8025D6F0; // type:function size:0x58
|
||||
__dt__26sFStateFct_c<10dAcArrow_c>Fv = .text:0x8025D750; // type:function size:0x6C
|
||||
__dt__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8025D7C0; // type:function size:0xA0
|
||||
__dt__49sFStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x8025D860; // type:function size:0xA4
|
||||
hitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x8025D910; // type:function size:0x24
|
||||
dAcArrow_atHitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x8025D910; // type:function size:0x24
|
||||
createHeap__10dAcArrow_cFv = .text:0x8025D940; // type:function size:0x90
|
||||
create__10dAcArrow_cFv = .text:0x8025D9D0; // type:function size:0x184
|
||||
changeState__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8025DB60; // type:function size:0x10
|
||||
@@ -14099,16 +14099,16 @@ fn_80260790 = .text:0x80260790; // type:function size:0x30
|
||||
__sinit_\d_a_obj_arrow_cpp = .text:0x802607C0; // type:function size:0x490 scope:local
|
||||
__dt__25sFStateID_c<10dAcArrow_c>Fv = .text:0x80260C50; // type:function size:0x58
|
||||
isSameName__25sFStateID_c<10dAcArrow_c>CFPCc = .text:0x80260CB0; // type:function size:0x88
|
||||
AcBoomerang__ctor = .text:0x80260D40; // type:function size:0x1CC
|
||||
fn_80260F10 = .text:0x80260F10; // type:function size:0x5C
|
||||
fn_80260F70 = .text:0x80260F70; // type:function size:0x58
|
||||
fn_80260FD0 = .text:0x80260FD0; // type:function size:0x6C
|
||||
fn_80261040 = .text:0x80261040; // type:function size:0xA0
|
||||
fn_802610E0 = .text:0x802610E0; // type:function size:0xA4
|
||||
fn_80261190 = .text:0x80261190; // type:function size:0x18
|
||||
AcBoomerang__grabItem = .text:0x802611B0; // type:function size:0x290
|
||||
dAcBoomerang_c_classInit__Fv = .text:0x80260D40; // type:function size:0x1CC
|
||||
__dt__18dAcBoomerangProc_cFv = .text:0x80260F10; // type:function size:0x5C
|
||||
__dt__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80260F70; // type:function size:0x58
|
||||
__dt__30sFStateFct_c<14dAcBoomerang_c>Fv = .text:0x80260FD0; // type:function size:0x6C
|
||||
__dt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80261040; // type:function size:0xA0
|
||||
__dt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c>Fv = .text:0x802610E0; // type:function size:0xA4
|
||||
areaCallback__FP12dAcObjBase_cP7mVec3_cUl = .text:0x80261190; // type:function size:0x18
|
||||
hitCallback__14dAcBoomerang_cFP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x802611B0; // type:function size:0x290
|
||||
fn_80261440 = .text:0x80261440; // type:function size:0x10
|
||||
AcBoomerang__grabItem_func = .text:0x80261450; // type:function size:0x24
|
||||
dAcBoomerang_atHitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x80261450; // type:function size:0x24
|
||||
AcBoomerang__assignBeetleModel = .text:0x80261480; // type:function size:0x5C
|
||||
AcBoomerang__initModels = .text:0x802614E0; // type:function size:0x310
|
||||
AcBoomerang__init = .text:0x802617F0; // type:function size:0x208
|
||||
@@ -14129,7 +14129,7 @@ fn_80262AC0 = .text:0x80262AC0; // type:function size:0x120
|
||||
fn_80262BE0 = .text:0x80262BE0; // type:function size:0x1E0
|
||||
fn_80262DC0 = .text:0x80262DC0; // type:function size:0x13C
|
||||
fn_80262F00 = .text:0x80262F00; // type:function size:0x2C
|
||||
fn_80262F30 = .text:0x80262F30; // type:function size:0x154
|
||||
setChrAnimation__14dAcBoomerang_cFQ214dAcBoomerang_c14ChrAnimation_e = .text:0x80262F30; // type:function size:0x154
|
||||
fn_80263090 = .text:0x80263090; // type:function size:0xE4
|
||||
fn_80263180 = .text:0x80263180; // type:function size:0x50
|
||||
fn_802631D0 = .text:0x802631D0; // type:function size:0x8C
|
||||
@@ -14168,7 +14168,7 @@ fn_80265070 = .text:0x80265070; // type:function size:0x10
|
||||
fn_80265080 = .text:0x80265080; // type:function size:0x30
|
||||
fn_802650B0 = .text:0x802650B0; // type:function size:0x30
|
||||
fn_802650E0 = .text:0x802650E0; // type:function size:0x30
|
||||
AcBoomerang__initStates = .text:0x80265110; // type:function size:0x41C
|
||||
__sinit_\d_a_obj_boomerang_cpp = .text:0x80265110; // type:function size:0x41C
|
||||
AcBoomerang__dtor2 = .text:0x80265530; // type:function size:0x58
|
||||
fn_80265590 = .text:0x80265590; // type:function size:0x88
|
||||
dAcObjFairy_c_classInit__Fv = .text:0x80265620; // type:function size:0x144
|
||||
@@ -35811,12 +35811,12 @@ lbl_80534B1C = .data:0x80534B1C; // type:object size:0x1C data:string
|
||||
lbl_80534B38 = .data:0x80534B38; // type:object size:0xC
|
||||
lbl_80534B44 = .data:0x80534B44; // type:object size:0xC
|
||||
lbl_80534B50 = .data:0x80534B50; // type:object size:0x10
|
||||
AcBoomerang__vtable = .data:0x80534B60; // type:object size:0x80
|
||||
lbl_80534BE0 = .data:0x80534BE0; // type:object size:0x30
|
||||
lbl_80534C10 = .data:0x80534C10; // type:object size:0x30
|
||||
lbl_80534C40 = .data:0x80534C40; // type:object size:0x18
|
||||
lbl_80534C58 = .data:0x80534C58; // type:object size:0x18
|
||||
lbl_80534C70 = .data:0x80534C70; // type:object size:0x1D0
|
||||
__vt__14dAcBoomerang_c = .data:0x80534B60; // type:object size:0x80
|
||||
__vt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c> = .data:0x80534BE0; // type:object size:0x30
|
||||
__vt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80534C10; // type:object size:0x30
|
||||
__vt__30sFStateFct_c<14dAcBoomerang_c> = .data:0x80534C40; // type:object size:0x18
|
||||
__vt__27sFState_c<14dAcBoomerang_c> = .data:0x80534C58; // type:object size:0x18
|
||||
__vt__18dAcBoomerangProc_c = .data:0x80534C70; // type:object size:0x1D0
|
||||
lbl_80534E40 = .data:0x80534E40; // type:object size:0x38
|
||||
g_profile_OBJ_FAIRY = .data:0x80534E78; // type:object size:0x68
|
||||
lbl_80534EE0 = .data:0x80534EE0; // type:object size:0x30
|
||||
|
||||
+1
-1
@@ -399,7 +399,7 @@ config.libs = [
|
||||
Object(NonMatching, "d/a/npc/d_a_ordinary_npc.cpp"),
|
||||
Object(NonMatching, "d/d_ac_npc_kyui.cpp"),
|
||||
Object(Matching, "d/d_base.cpp"),
|
||||
Object(NonMatching, "d/d_carry.cpp"),
|
||||
Object(NonMatching, "d/d_linkage.cpp"),
|
||||
Object(Matching, "d/d_cc.cpp"),
|
||||
Object(Matching, "d/d_dvd.cpp"),
|
||||
Object(Matching, "d/d_dvd_drive_error.cpp"),
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#define D_A_PLAYER_H
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_item.h"
|
||||
#include "d/col/c/c_bg_s_poly_info.h"
|
||||
#include "d/d_player_mdl.h"
|
||||
#include "toBeSorted/file_manager.h"
|
||||
#include "toBeSorted/minigame_mgr.h"
|
||||
@@ -17,6 +19,9 @@ public:
|
||||
// argument is always false in existing code, true doesn't seem to make a difference
|
||||
void bonk(bool unk = false);
|
||||
bool fn_80202D90(bool);
|
||||
void fn_80202E00(cBgS_PolyInfo *, f32, f32);
|
||||
|
||||
dAcItem_c *getWhippedItem();
|
||||
|
||||
/* overrides omitted */
|
||||
/* vt 0x310 */ virtual void vt_0x310();
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#ifndef D_A_OBJ_BASE_H
|
||||
#define D_A_OBJ_BASE_H
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "d/col/c/c_m3d_g_aab.h"
|
||||
#include "d/col/c/c_m3d_g_lin.h"
|
||||
#include "d/d_jnt_col.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "egg/math/eggMath.h"
|
||||
#include "m/m3d/m_shadow.h"
|
||||
#include "m/m3d/m_smdl.h"
|
||||
@@ -16,54 +17,6 @@
|
||||
#include "m/m_vec.h"
|
||||
#include "m/types_m.h"
|
||||
|
||||
class dAcObjBase_c;
|
||||
class dBgS_Acch;
|
||||
|
||||
// Size: 0xA8
|
||||
struct ActorCarryStruct {
|
||||
/* 0x00 */ dAcRefBase_c actorLink;
|
||||
/* 0x0C */ fLiNdBa_c *carriedActor;
|
||||
/* 0x10 */ u32 carryFlags;
|
||||
/* 0x14 */ int carryType;
|
||||
/* 0x18 */ u16 field_0x18;
|
||||
/* 0x1A */ u16 field_0x1A;
|
||||
/* 0x1C */ mVec3_c field_0x1C;
|
||||
/* 0x28 */ mMtx_c carryTransMtx;
|
||||
/* 0x58 */ mMtx_c field_0x58;
|
||||
/* 0x88 */ s32 isCarried;
|
||||
/* 0x8C */ f32 field_0x8C;
|
||||
/* 0x90 */ f32 field_0x90;
|
||||
/* 0x94 */ f32 field_0x94;
|
||||
/* 0x98 */ f32 field_0x98;
|
||||
|
||||
ActorCarryStruct();
|
||||
/* vt 0x9C */
|
||||
virtual ~ActorCarryStruct();
|
||||
/* 0xA0 */ dJntCol_c *field_0xA0;
|
||||
/* 0xA4 */ u32 field_0xA4;
|
||||
|
||||
void set(u32 flags, f32 x, f32 y, f32 z, void *unk);
|
||||
|
||||
// not real name, but sure
|
||||
void bushTpFunc(dBgS_Acch &);
|
||||
|
||||
void fn_80050EA0(dAcObjBase_c *);
|
||||
void fn_800511E0(dAcObjBase_c *);
|
||||
void fn_80051190(dAcObjBase_c *);
|
||||
void fn_80050EB0(dAcObjBase_c *);
|
||||
|
||||
// This will attach pObj onto pOwner, returning if it could attach
|
||||
bool tryAttachWithRef(dAcObjBase_c *pObj, dAcObjBase_c *pOwner, dAcRefBase_c *pRefLink, int, bool);
|
||||
|
||||
bool testCarryFlag(u32 flag) {
|
||||
return (carryFlags & flag) != 0;
|
||||
}
|
||||
|
||||
bool checkCarryType(int type) const {
|
||||
return (isCarried == 1 && carryType == type);
|
||||
}
|
||||
};
|
||||
|
||||
// Ghidra has it as `unk_ActorObjectBase`
|
||||
struct LightingInfo {
|
||||
/* 0x00 */ u8 mField_0x00[0x40 - 0x00];
|
||||
@@ -121,7 +74,7 @@ public:
|
||||
/* 0x1C0 */ cCcD_Stts mStts;
|
||||
/* 0x1FC */ mVec3_c mStartingPos;
|
||||
/* 0x208 */ mAng3_c mStartingRot;
|
||||
/* 0x210 */ ActorCarryStruct mActorCarryInfo;
|
||||
/* 0x210 */ dLinkage_c mLinkage;
|
||||
/* 0x2B8 */ u32 mField_0x2B8;
|
||||
/* 0x2BC */ LightingInfo mLightingInfo;
|
||||
/* 0x32C */ u32 mField_0x32C;
|
||||
@@ -145,6 +98,10 @@ public:
|
||||
return forwardSpeed;
|
||||
}
|
||||
|
||||
f32 GetYOffset() const {
|
||||
return yoffset;
|
||||
}
|
||||
|
||||
bool isStopped() const {
|
||||
return getVelocityMag() <= EGG::Math<f32>::epsilon();
|
||||
}
|
||||
@@ -167,8 +124,15 @@ public:
|
||||
return mObjectActorFlags & property;
|
||||
}
|
||||
|
||||
dLinkage_c &GetLinkage() {
|
||||
return mLinkage;
|
||||
}
|
||||
const dLinkage_c &GetLinkage() const {
|
||||
return mLinkage;
|
||||
}
|
||||
|
||||
void SetJntCol(dJntCol_c *pCol) {
|
||||
mActorCarryInfo.field_0xA0 = pCol;
|
||||
mLinkage.field_0xA0 = pCol;
|
||||
}
|
||||
|
||||
// could be their own thing?
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
#ifndef D_A_OBJ_BOOMERANG_H
|
||||
#define D_A_OBJ_BOOMERANG_H
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/bg/d_bg_s_acch.h"
|
||||
#include "d/col/cc/d_cc_d.h"
|
||||
#include "d/d_shadow.h"
|
||||
#include "d/lyt/d_lyt_fader.h"
|
||||
#include "m/m3d/m_anmchr.h"
|
||||
#include "m/m3d/m_anmchrblend.h"
|
||||
#include "m/m3d/m_mdl.h"
|
||||
#include "m/m3d/m_proc.h"
|
||||
#include "m/m_color.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "s/s_State.hpp"
|
||||
#include "toBeSorted/actor_event.h"
|
||||
#include "toBeSorted/d_emitter.h"
|
||||
|
||||
class dAcBoomerangProcBase_c : public m3d::proc_c {
|
||||
public:
|
||||
~dAcBoomerangProcBase_c() {}
|
||||
};
|
||||
class dAcBoomerangProc_c : public dAcBoomerangProcBase_c {
|
||||
public:
|
||||
dAcBoomerangProc_c() : mColor0(0), mColor1(0xFFFFFFFF) {}
|
||||
~dAcBoomerangProc_c() {}
|
||||
|
||||
virtual void drawOpa() override;
|
||||
|
||||
mColor mColor0;
|
||||
mColor mColor1;
|
||||
};
|
||||
|
||||
class dAcBoomerang_c : public dAcObjBase_c {
|
||||
public:
|
||||
dAcBoomerang_c()
|
||||
: mStateMgr(*this),
|
||||
mEventRelated(*this, nullptr),
|
||||
mEff0(this),
|
||||
mEff1(this),
|
||||
mEff2(this),
|
||||
mEff3(this),
|
||||
mLytFader(0, dLytFader_c::FADED_OUT) {}
|
||||
virtual ~dAcBoomerang_c();
|
||||
|
||||
virtual int create() override;
|
||||
virtual int doDelete() override;
|
||||
virtual int draw() override;
|
||||
virtual void deleteReady() override;
|
||||
virtual bool createHeap() override;
|
||||
virtual int actorExecute() override;
|
||||
virtual void registerInEvent() override;
|
||||
|
||||
STATE_FUNC_DECLARE(dAcBoomerang_c, Wait);
|
||||
STATE_FUNC_DECLARE(dAcBoomerang_c, Move);
|
||||
STATE_FUNC_DECLARE(dAcBoomerang_c, MoveCancelWait);
|
||||
STATE_FUNC_DECLARE(dAcBoomerang_c, ReturnWait);
|
||||
STATE_FUNC_DECLARE(dAcBoomerang_c, EventReturnWait);
|
||||
|
||||
public: // TYPES
|
||||
struct ChrAnimation_t {
|
||||
const char *mName;
|
||||
f32 mRate;
|
||||
};
|
||||
enum ChrAnimation_e {
|
||||
RB_SET = 0,
|
||||
RB_DEFAULT = 1,
|
||||
RB_CUT = 2,
|
||||
RB_HOLD = 3,
|
||||
RB_HOLD_ED = 4,
|
||||
RB_BACK = 5,
|
||||
RB_MAX,
|
||||
};
|
||||
static const ChrAnimation_t sChrAnims[RB_MAX];
|
||||
|
||||
public: // INLINES
|
||||
bool checkField_0x8CC(u32 mask) {
|
||||
return field_0x8CC & mask;
|
||||
}
|
||||
|
||||
public: // FUNCTIONS
|
||||
void atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB);
|
||||
|
||||
bool tryGrabObject(dAcObjBase_c *pObject);
|
||||
void setChrAnimation(ChrAnimation_e requestedAnimation);
|
||||
|
||||
private:
|
||||
/* 0x0330 */ nw4r::g3d::ResFile mResFile;
|
||||
/* 0x0334 */ m3d::mdl_c mMdl;
|
||||
/* 0x0358 */ m3d::anmChrBlend_c mAnmChrBlend;
|
||||
/* 0x0380 */ m3d::anmChr_c mAnmChr[2];
|
||||
/* 0x03F0 */ dAcBoomerangProc_c mProc;
|
||||
/* 0x0410 */ dShadowCircle_c mShadow;
|
||||
/* 0x0418 */ dAcRef_c<dAcObjBase_c> mGrabbedActor;
|
||||
/* 0x0424 */ u8 _0x424[0x454 - 0x424];
|
||||
/* 0x0454 */ dBgS_Acch mAcch;
|
||||
/* 0x0804 */ dBgS_AcchCir mAcchCir;
|
||||
/* 0x0860 */ ActorEventRelated mEventRelated;
|
||||
/* 0x08B0 */ u8 mCurrentAnimation;
|
||||
/* 0x08B1 */ u8 _0x8B1[0x8B5 - 0x8B1];
|
||||
/* 0x08B5 */ u8 mWindNodeID;
|
||||
/* 0x08B6 */ u8 mLeftWingNodeID;
|
||||
/* 0x08B7 */ u8 mRightWingNodeID;
|
||||
/* 0x08B8 */ u8 _0x8B8[0x8CC - 0x8B8];
|
||||
/* 0x08B8 */ u32 field_0x8CC;
|
||||
/* 0x08D0 */ u8 _0x8D0[0x8FC - 0x8D0];
|
||||
/* 0x08FC */ dCcD_Sph mSph0;
|
||||
/* 0x0A4C */ dCcD_Sph mSph1;
|
||||
/* 0x0B9C */ EffectsStruct mEff0;
|
||||
/* 0x0BD0 */ EffectsStruct mEff1;
|
||||
/* 0x0C04 */ EffectsStruct mEff2;
|
||||
/* 0x0C38 */ EffectsStruct mEff3;
|
||||
/* 0x0C6C */ dLytFader_c mLytFader;
|
||||
/* 0x114C */ u8 _0x114C[0x115C - 0x114C];
|
||||
/* 0x115C */ STATE_MGR_DECLARE(dAcBoomerang_c);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "m/m3d/m_smdl.h"
|
||||
#include "s/s_State.hpp"
|
||||
#include "s/s_StateMgr.hpp"
|
||||
|
||||
class dAcOring_c : public dAcObjBase_c {
|
||||
public:
|
||||
@@ -24,8 +23,6 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
static u32 ROT_PER_TICK;
|
||||
|
||||
m3d::smdl_c mModel;
|
||||
STATE_MGR_DECLARE(dAcOring_c);
|
||||
u8 field_0x388;
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/bg/d_bg_w.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "m/m3d/m_mdl.h"
|
||||
#include "s/s_State.hpp"
|
||||
#include "s/s_StateMgr.hpp"
|
||||
#include "toBeSorted/time_area_mgr.h"
|
||||
|
||||
// OBJ_VSD?
|
||||
@@ -63,6 +63,10 @@ public:
|
||||
|
||||
static void rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *interactor);
|
||||
|
||||
bool checkOnFlag() {
|
||||
return mOnSceneFlag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(roomid, mOnSceneFlag);
|
||||
}
|
||||
|
||||
private:
|
||||
/* 0x330 */ m3d::mdl_c mModel;
|
||||
/* 0x354 */ dBgW mCollision;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "d/d_shadow.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "m/m3d/m_smdl.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_quat.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
|
||||
@@ -292,7 +292,7 @@ public:
|
||||
bool ChkLineCheckNone() {
|
||||
return mFlags & LINE_CHECK_NONE;
|
||||
}
|
||||
bool ChkLineCheck() {
|
||||
bool ChkLineCheck() const {
|
||||
return mFlags & LINE_CHECK;
|
||||
}
|
||||
bool Chk_0x4000000() const {
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
#ifndef D_LINKAGE_H
|
||||
#define D_LINKAGE_H
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/d_jnt_col.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_mtx.h"
|
||||
|
||||
class dAcObjBase_c;
|
||||
class dBgS_Acch;
|
||||
|
||||
// Previously Known as `ActorCarryStruct`
|
||||
// Size: 0xA8
|
||||
class dLinkage_c {
|
||||
public:
|
||||
dLinkage_c();
|
||||
|
||||
public:
|
||||
enum ConnectionType_e {
|
||||
CONNECTION_0 = 0,
|
||||
CONNECTION_1 = 1,
|
||||
CONNECTION_2 = 2,
|
||||
CONNECTION_3 = 3,
|
||||
CONNECTION_4 = 4,
|
||||
CONNECTION_5 = 5,
|
||||
CONNECTION_6 = 6,
|
||||
CONNECTION_7 = 7,
|
||||
CONNECTION_8 = 8,
|
||||
CONNECTION_9 = 9,
|
||||
};
|
||||
enum State_e {
|
||||
STATE_0 = 0,
|
||||
STATE_ACTIVE = 1,
|
||||
STATE_2 = 2, // Hold?
|
||||
STATE_3 = 3, // Roll?
|
||||
STATE_DELETE = 4,
|
||||
};
|
||||
enum Flag_e {
|
||||
};
|
||||
|
||||
public:
|
||||
void onFlag(u32 flag) {
|
||||
carryFlags |= flag;
|
||||
}
|
||||
void offFlag(u32 flag) {
|
||||
carryFlags &= ~flag;
|
||||
}
|
||||
bool checkFlag(u32 flag) const {
|
||||
return (carryFlags & flag) != 0;
|
||||
}
|
||||
|
||||
// Int Required on return -> will use enum when possible
|
||||
int getState() const {
|
||||
return mState;
|
||||
}
|
||||
|
||||
bool checkState(State_e state) const {
|
||||
return mState == state;
|
||||
}
|
||||
|
||||
bool checkType_1_3_5_6_9() const {
|
||||
return mType == CONNECTION_1 || mType == CONNECTION_3 || mType == CONNECTION_5 || mType == CONNECTION_6 ||
|
||||
mType == CONNECTION_9;
|
||||
}
|
||||
|
||||
bool checkConnection(ConnectionType_e type) const {
|
||||
return (checkState(STATE_ACTIVE) && mType == type);
|
||||
}
|
||||
|
||||
public:
|
||||
void set(u32 flags, f32, f32, f32, void *unk);
|
||||
bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool);
|
||||
void fn_80050DC0(dAcObjBase_c *, f32, f32, mAng);
|
||||
void fn_80050E00(dAcObjBase_c *, f32, f32, mAng);
|
||||
void fn_80050E40(dAcObjBase_c *, f32, f32, mAng);
|
||||
void fn_80050EA0(dAcObjBase_c *);
|
||||
void fn_800511E0(dAcObjBase_c *);
|
||||
void bushTpFunc(dBgS_Acch &);
|
||||
void fn_80051190(dAcObjBase_c *);
|
||||
void fn_80050EB0(dAcObjBase_c *);
|
||||
bool fn_800513C0() const;
|
||||
|
||||
public:
|
||||
/* 0x00 */ dAcRefBase_c mControllingActor;
|
||||
/* 0x0C */ dAcRefBase_c *pLinkedActor;
|
||||
/* 0x10 */ u32 carryFlags;
|
||||
/* 0x14 */ ConnectionType_e mType;
|
||||
/* 0x18 */ u16 field_0x18;
|
||||
/* 0x1A */ u16 field_0x1A;
|
||||
/* 0x1C */ f32 field_0x1C;
|
||||
/* 0x20 */ f32 field_0x20;
|
||||
/* 0x24 */ f32 field_0x24;
|
||||
/* 0x28 */ mMtx_c carryTransMtx;
|
||||
/* 0x58 */ mMtx_c field_0x58;
|
||||
/* 0x88 */ State_e mState;
|
||||
/* 0x8C */ f32 field_0x8C;
|
||||
/* 0x90 */ f32 field_0x90;
|
||||
/* 0x94 */ f32 field_0x94;
|
||||
/* 0x98 */ f32 field_0x98;
|
||||
/* 0x9C vt*/ virtual ~dLinkage_c(); // usually i would like functions sepearte, but this is the placement.
|
||||
/* 0xA0 */ dJntCol_c *field_0xA0;
|
||||
/* 0xA4 */ u32 field_0xA4;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -179,6 +179,10 @@ public:
|
||||
y.mVal += (s16)val;
|
||||
}
|
||||
|
||||
void addX(const s32 &fx) {
|
||||
x += fx;
|
||||
}
|
||||
|
||||
mAng x, y, z;
|
||||
|
||||
static mAng3_c Zero;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "d/col/cc/d_cc_s.h"
|
||||
#include "d/d_camera.h"
|
||||
#include "d/d_jnt_col.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "d/flag/storyflag_manager.h"
|
||||
@@ -629,7 +630,7 @@ int dAcEsm_c::actorExecute() {
|
||||
dAcBomb_c *bomb = getBombWithinRadius(lookRadius);
|
||||
|
||||
if (bomb != nullptr && std::abs(bomb->GetPosition().y - mHomePos1.y) < 0.7f * lookRadius) {
|
||||
if (bomb->mActorCarryInfo.tryAttachWithRef(bomb, this, &mBombRef, 1, false)) {
|
||||
if (bomb->GetLinkage().tryAttach(bomb, this, &mBombRef, dLinkage_c::CONNECTION_1, false)) {
|
||||
mTimer_0xBAE = 160;
|
||||
playSound(SE_ESm_BRING_IN);
|
||||
clearActorProperty(1);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#include "d/a/obj/d_a_obj_ring.h"
|
||||
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(OBJ_RING, dAcOring_c, fProfile::OBJ_RING, 0x00f2, 0, 0x103);
|
||||
@@ -10,7 +12,6 @@ STATE_DEFINE(dAcOring_c, Move);
|
||||
bool dAcOring_c::createHeap() {
|
||||
nw4r::g3d::ResFile f(getOarcResFile("PRing"));
|
||||
nw4r::g3d::ResMdl mdl = f.GetResMdl("PeehatRing");
|
||||
// This matches but in a really weird way. Maybe an inline function?
|
||||
TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x20, 1, nullptr));
|
||||
return true;
|
||||
}
|
||||
@@ -52,18 +53,11 @@ int dAcOring_c::draw() {
|
||||
|
||||
void dAcOring_c::initializeState_Move() {}
|
||||
|
||||
u32 dAcOring_c::ROT_PER_TICK = 0x1000;
|
||||
|
||||
void dAcOring_c::executeState_Move() {
|
||||
bool isCarried = false;
|
||||
if (mActorCarryInfo.isCarried == 1 && mActorCarryInfo.carryType == 7) {
|
||||
isCarried = true;
|
||||
}
|
||||
|
||||
if (isCarried) {
|
||||
if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_7)) {
|
||||
return;
|
||||
}
|
||||
rotation.x.mVal += ROT_PER_TICK;
|
||||
rotation.addX(0x1000);
|
||||
if (field_0x38C >= position.y) {
|
||||
deleteRequest();
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "d/col/c/c_m3d_g_pla.h"
|
||||
#include "d/col/cc/d_cc_s.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "d/flag/dungeonflag_manager.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "egg/math/eggMath.h"
|
||||
@@ -104,11 +105,11 @@ int dAcOtubo_c::actorCreate() {
|
||||
|
||||
mStateMgr.changeState(StateID_Wait);
|
||||
boundingBox.Set(mVec3_c(-100.f, -40.f, -100.f), mVec3_c(100.f, 80.f, 100.f));
|
||||
mActorCarryInfo.set(0xC8A0, 28.f, 50.f, 28.f, nullptr); // TODO (ActorCarry Flags)
|
||||
mActorCarryInfo.field_0x8C = 26.f;
|
||||
mActorCarryInfo.field_0x90 = 46.f;
|
||||
mActorCarryInfo.field_0x94 = 28.f;
|
||||
mActorCarryInfo.field_0x98 = 0.f;
|
||||
GetLinkage().set(0xC8A0, 28.f, 50.f, 28.f, nullptr); // TODO (ActorCarry Flags)
|
||||
GetLinkage().field_0x8C = 26.f;
|
||||
GetLinkage().field_0x90 = 46.f;
|
||||
GetLinkage().field_0x94 = 28.f;
|
||||
GetLinkage().field_0x98 = 0.f;
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
@@ -166,7 +167,7 @@ int dAcOtubo_c::actorExecute() {
|
||||
mField_0x9DC += position.y - mOldPosition.y;
|
||||
adjustRoll();
|
||||
}
|
||||
mActorCarryInfo.bushTpFunc(mObjAcch);
|
||||
GetLinkage().bushTpFunc(mObjAcch);
|
||||
}
|
||||
|
||||
if (mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Slope)) {
|
||||
@@ -175,7 +176,7 @@ int dAcOtubo_c::actorExecute() {
|
||||
mSph.SetC(getCenter());
|
||||
dCcS::GetInstance()->Set(&mSph);
|
||||
|
||||
mActorCarryInfo.fn_800511E0(this);
|
||||
GetLinkage().fn_800511E0(this);
|
||||
mField_0x8F0.modifyMtx();
|
||||
calcRoll();
|
||||
|
||||
@@ -283,28 +284,23 @@ void dAcOtubo_c::executeState_Grab() {
|
||||
dAcNpcCeLady_c *lady = mCeLady.get();
|
||||
dAcNpcCeFriend_c *ceFriend = mCeFriend.get();
|
||||
if (ceFriend && ceFriend->fn_11_17C0(this)) {
|
||||
mActorCarryInfo.fn_80050EA0(this);
|
||||
GetLinkage().fn_80050EA0(this);
|
||||
} else if (lady && lady->fn_12_1C20(this)) {
|
||||
mActorCarryInfo.fn_80050EA0(this);
|
||||
GetLinkage().fn_80050EA0(this);
|
||||
}
|
||||
}
|
||||
|
||||
if (mActorCarryInfo.checkCarryType(5) && sLib::calcTimer(&mTimer_0x9F5) == 0 &&
|
||||
if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_5) && sLib::calcTimer(&mTimer_0x9F5) == 0 &&
|
||||
(mObjAcch.ChkGndHit() || mObjAcch.ChkWallHit(nullptr) || mObjAcch.ChkRoofHit())) {
|
||||
destroy();
|
||||
} else if (dAcPy_c::LINK->getCurrentAction() == 66 /* Put Down Medium */) { // TODO (Link Action ID)
|
||||
} else if (dAcPy_c::GetLink()->getCurrentAction() == 66 /* Put Down Medium */) { // TODO (Link Action ID)
|
||||
mStateMgr.changeState(StateID_Put);
|
||||
} else {
|
||||
if (mActorCarryInfo.isCarried != 4) {
|
||||
bool isCarried = false;
|
||||
if (mActorCarryInfo.isCarried == 1 && mActorCarryInfo.carryType == 5) {
|
||||
isCarried = true;
|
||||
}
|
||||
|
||||
if (isCarried) {
|
||||
mField_0x9F6 = 0;
|
||||
if (!GetLinkage().checkState(dLinkage_c::STATE_DELETE)) {
|
||||
if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_5)) {
|
||||
mField_0x9F6 = dLinkage_c::STATE_0;
|
||||
} else {
|
||||
mField_0x9F6 = mActorCarryInfo.isCarried;
|
||||
mField_0x9F6 = GetLinkage().getState();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,7 +316,7 @@ void dAcOtubo_c::finalizeState_Grab() {
|
||||
}
|
||||
mField_0x9D4 = cM::rndF(40.f);
|
||||
mSph.ClrCo_0x400();
|
||||
if ((u8)mActorCarryInfo.isCarried == 2) {
|
||||
if ((u8)GetLinkage().mState == 2) {
|
||||
mSph.OnAtSet();
|
||||
}
|
||||
mObjAcch.ClrRoofNone();
|
||||
@@ -407,7 +403,7 @@ void dAcOtubo_c::initializeState_Rebirth() {
|
||||
mSph.ClrCoSet();
|
||||
mSph.ClrTgSet();
|
||||
setObjectProperty(0x200);
|
||||
mActorCarryInfo.fn_80050EA0(this);
|
||||
GetLinkage().fn_80050EA0(this);
|
||||
|
||||
int item_drop_table = getParams2UpperByte();
|
||||
switch (item_drop_table) {
|
||||
@@ -456,7 +452,7 @@ void dAcOtubo_c::destroy() {
|
||||
return;
|
||||
}
|
||||
fn_80022BE0(BlurAndPaletteManager::GetPInstance(), position);
|
||||
mActorCarryInfo.fn_80050EA0(this);
|
||||
GetLinkage().fn_80050EA0(this);
|
||||
|
||||
dEmitterBase_c *fx_thing = dJEffManager_c::spawnEffect(
|
||||
PARTICLE_RESOURCE_ID_MAPPING_211_, poscopy2, nullptr, nullptr, nullptr, nullptr, 0, 0
|
||||
@@ -651,7 +647,7 @@ void dAcOtubo_c::attemptDestroy() {
|
||||
mField_0x9DC = 0.f;
|
||||
}
|
||||
if (!mObjAcch.ChkGndHit() && mSph.ChkCoHit()) {
|
||||
if (mActorCarryInfo.isCarried != 1 && forwardSpeed > 0.f) {
|
||||
if (GetLinkage().mState != 1 && forwardSpeed > 0.f) {
|
||||
if (mSph.GetCoActor()->unkByteTargetFiRelated == 4) {
|
||||
destroy();
|
||||
return;
|
||||
@@ -807,7 +803,9 @@ bool dAcOtubo_c::checkOnLava() {
|
||||
}
|
||||
|
||||
bool dAcOtubo_c::checkCarryType() const {
|
||||
return mActorCarryInfo.checkCarryType(1) || mActorCarryInfo.checkCarryType(7) || mActorCarryInfo.checkCarryType(5);
|
||||
const dLinkage_c &linkage = GetLinkage();
|
||||
return linkage.checkConnection(dLinkage_c::CONNECTION_1) || linkage.checkConnection(dLinkage_c::CONNECTION_7) ||
|
||||
linkage.checkConnection(dLinkage_c::CONNECTION_5);
|
||||
}
|
||||
|
||||
bool dAcOtubo_c::checkSubmerged() {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "d/a/obj/d_a_obj_arrow.h"
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "nw4r/types_nw4r.h"
|
||||
|
||||
@@ -38,7 +37,7 @@ const dCcD_SrcSph dAcArrow_c::sCc2 = {
|
||||
|
||||
// clang-format on
|
||||
|
||||
bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
bool dAcArrow_atHitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
static_cast<dAcArrow_c *>(i_actorA)->hitCallback(i_objInfA, i_actorB, i_objInfB);
|
||||
return true;
|
||||
}
|
||||
@@ -70,7 +69,7 @@ int dAcArrow_c::create() {
|
||||
mCcCps.Set(sCc1);
|
||||
mCcCps.SetStts(mStts);
|
||||
mCcCps.SetAtFlag(0x2000);
|
||||
mCcCps.SetAtCallback(::hitCallback);
|
||||
mCcCps.SetAtCallback(dAcArrow_atHitCallback);
|
||||
mCcSph.Set(sCc2);
|
||||
mCcSph.SetStts(mStts);
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
#include "d/a/obj/d_a_obj_boomerang.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m3d/m_fanm.h"
|
||||
#include "nw4r/g3d/g3d_anmchr.h"
|
||||
#include "nw4r/g3d/res/g3d_resmdl.h"
|
||||
#include "s/s_State.hpp"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(BOOMERANG, dAcBoomerang_c, fProfile::BOOMERANG, 0x125, 0, 0x4);
|
||||
|
||||
STATE_DEFINE(dAcBoomerang_c, Wait);
|
||||
STATE_DEFINE(dAcBoomerang_c, Move);
|
||||
STATE_DEFINE(dAcBoomerang_c, MoveCancelWait);
|
||||
STATE_DEFINE(dAcBoomerang_c, ReturnWait);
|
||||
STATE_DEFINE(dAcBoomerang_c, EventReturnWait);
|
||||
|
||||
const dAcBoomerang_c::ChrAnimation_t dAcBoomerang_c::sChrAnims[dAcBoomerang_c::RB_MAX] = {
|
||||
{ "RB_Set", 0.f},
|
||||
{"RB_Default", 3.f},
|
||||
{ "RB_Cut", 3.f},
|
||||
{ "RB_Hold", 3.f},
|
||||
{"RB_Hold_ed", 3.f},
|
||||
{ "RB_Back", 3.f},
|
||||
};
|
||||
|
||||
void areaCallback(dAcObjBase_c *param0, mVec3_c *param1, u32 param2) {
|
||||
if (param2 != 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
if (i_actorB != nullptr && GetLinkage().checkFlag(0x80)) {
|
||||
if (dAcPy_c::getCurrentBeetleType() > 2) {
|
||||
if (i_actorB == mGrabbedActor.get()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mStateMgr.isState(StateID_Move)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tryGrabObject(i_actorB)) {
|
||||
setChrAnimation(RB_HOLD);
|
||||
mAnmChr[0].setRate(0.f);
|
||||
mAnmChr[0].setFrameOnly(i_actorB->GetLinkage().field_0x24);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool dAcBoomerang_atHitCallback(
|
||||
dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB
|
||||
) {
|
||||
static_cast<dAcBoomerang_c *>(i_actorA)->atHitCallback(i_objInfA, i_actorB, i_objInfB);
|
||||
return true;
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
bool dAcBoomerang_c::tryGrabObject(dAcObjBase_c *pObj) {
|
||||
dAcPy_c *player = dAcPy_c::GetLink2();
|
||||
if (checkField_0x8CC(0x1000) && GetLinkage().checkFlag(0x80)) {}
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
void dAcBoomerang_c::setChrAnimation(dAcBoomerang_c::ChrAnimation_e requestedAnimation) {
|
||||
// Do not set anim if there is no change, or the request is to cut from hold
|
||||
if (requestedAnimation == mCurrentAnimation || (mCurrentAnimation == RB_HOLD && requestedAnimation == RB_CUT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
mAnmChr[0].setAnm(mMdl, mResFile.GetResAnmChr(sChrAnims[requestedAnimation].mName), m3d::PLAY_MODE_4);
|
||||
nw4r::g3d::AnmObjChr *pAnmObj = static_cast<nw4r::g3d::AnmObjChr *>(mAnmChr[0].getAnimObj());
|
||||
|
||||
pAnmObj->Release();
|
||||
|
||||
nw4r::g3d::ResMdl mdl = mMdl.getResMdl();
|
||||
for (int i = 0; i < mWindNodeID; ++i) {
|
||||
pAnmObj->Bind(mdl, i, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
}
|
||||
|
||||
if (requestedAnimation == RB_SET) {
|
||||
pAnmObj->Bind(mdl, mLeftWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
pAnmObj->Bind(mdl, mRightWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
}
|
||||
|
||||
mCurrentAnimation = requestedAnimation;
|
||||
|
||||
mMdl.setAnm(mAnmChrBlend, sChrAnims[requestedAnimation].mRate);
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/col/bg/d_bg_s.h"
|
||||
#include "d/col/bg/d_bg_w.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "s/s_Math.h"
|
||||
@@ -42,26 +43,29 @@ void dAcOsw_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *in
|
||||
dAcPy_c *link = interactor->isActorPlayer() ? static_cast<dAcPy_c *>(interactor) : nullptr;
|
||||
dAcOsw_c *sw = static_cast<dAcOsw_c *>(actor);
|
||||
|
||||
// halp
|
||||
if (!(link == nullptr || (!link->checkActionFlags(dAcPy_c::FLG0_IN_WATER) &&
|
||||
((!link->checkFlags0x340(0x800000) ||
|
||||
((link->getCurrentCarriedActor() != nullptr &&
|
||||
link->getCurrentCarriedActor()->mActorCarryInfo.testCarryFlag(0x04)))))))) {
|
||||
if (link != nullptr) {
|
||||
if (link->checkActionFlags(dAcPy_c::FLG0_IN_WATER)) {
|
||||
return;
|
||||
}
|
||||
if (link->checkFlags0x340(0x800000) &&
|
||||
!(link->getCurrentCarriedActor() && link->getCurrentCarriedActor()->GetLinkage().checkFlag(0x04))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (interactor->GetLinkage().checkState(dLinkage_c::STATE_ACTIVE)) {
|
||||
return;
|
||||
}
|
||||
if (interactor->mActorCarryInfo.isCarried != 1) {
|
||||
if (link == nullptr || (link->checkActionFlags(0xC70852)) == 0) {
|
||||
if (!sw->someInteractCheck(link != nullptr)) {
|
||||
bool needsOnFlag = sw->mOnSceneFlag < 0xFF &&
|
||||
!SceneflagManager::sInstance->checkBoolFlag(sw->roomid, sw->mOnSceneFlag);
|
||||
if (!needsOnFlag && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 &&
|
||||
sw->mStateMgr.isState(StateID_On)) {
|
||||
link->onFlags_0x360(0x8000);
|
||||
}
|
||||
|
||||
if (!(link && link->checkActionFlags(0xC70852))) {
|
||||
if (!sw->someInteractCheck(link != nullptr)) {
|
||||
if (!sw->checkOnFlag() && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 &&
|
||||
sw->mStateMgr.isState(StateID_On)) {
|
||||
link->onFlags_0x360(0x8000);
|
||||
}
|
||||
}
|
||||
interactor->setObjectProperty(0x40);
|
||||
}
|
||||
interactor->setObjectProperty(0x40);
|
||||
}
|
||||
|
||||
bool dAcOsw_c::createHeap() {
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "m/m_mtx.h"
|
||||
|
||||
ActorCarryStruct::ActorCarryStruct()
|
||||
: actorLink(nullptr), carriedActor(nullptr), carryFlags(0), carryType(0), field_0x18(0),
|
||||
field_0x1C(0.0f, 0.0f, 0.0f), carryTransMtx(mMtx_c::Identity), field_0x58(mMtx_c::Identity), isCarried(0),
|
||||
field_0x8C(0.0f), field_0x90(0.0f), field_0x94(0.0f), field_0x98(0.0f) {}
|
||||
|
||||
ActorCarryStruct::~ActorCarryStruct() {
|
||||
fn_80051190(nullptr);
|
||||
fn_80050EB0(nullptr);
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
#include "d/d_linkage.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/bg/d_bg_s.h"
|
||||
#include "d/col/bg/d_bg_s_acch.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "rvl/MTX/mtx.h"
|
||||
|
||||
dLinkage_c::dLinkage_c()
|
||||
: mControllingActor(nullptr),
|
||||
pLinkedActor(nullptr),
|
||||
carryFlags(0),
|
||||
mType(CONNECTION_0),
|
||||
field_0x18(0),
|
||||
field_0x1C(0.0f),
|
||||
field_0x20(0.f),
|
||||
field_0x24(0.f),
|
||||
carryTransMtx(mMtx_c::Identity),
|
||||
field_0x58(mMtx_c::Identity),
|
||||
mState(STATE_0),
|
||||
field_0x8C(0.0f),
|
||||
field_0x90(0.0f),
|
||||
field_0x94(0.0f),
|
||||
field_0x98(0.0f) {}
|
||||
|
||||
dLinkage_c::~dLinkage_c() {
|
||||
fn_80051190(nullptr);
|
||||
fn_80050EB0(nullptr);
|
||||
}
|
||||
|
||||
// Ignore the parameter names. I am unsure what they are
|
||||
void dLinkage_c::set(u32 flags, f32 x, f32 y, f32 z, void *) {
|
||||
onFlag(0x8000000 | flags);
|
||||
field_0x1C = x;
|
||||
field_0x20 = y;
|
||||
field_0x24 = z;
|
||||
|
||||
if (flags & 2) {
|
||||
field_0x8C = 28.f;
|
||||
field_0x90 = 36.f;
|
||||
field_0x94 = 28.f;
|
||||
field_0x98 = 0.f;
|
||||
} else if (flags & 4) {
|
||||
field_0x8C = 18.f;
|
||||
field_0x90 = 25.f;
|
||||
field_0x94 = 18.f;
|
||||
field_0x98 = 0.f;
|
||||
} else if (flags & 8) {
|
||||
field_0x8C = 16.7f;
|
||||
field_0x90 = 25.f;
|
||||
field_0x94 = 16.7f;
|
||||
field_0x98 = 0.f;
|
||||
} else {
|
||||
field_0x8C = 18.f;
|
||||
field_0x90 = 30.f;
|
||||
field_0x94 = 18.f;
|
||||
field_0x98 = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
bool dLinkage_c::tryAttach(
|
||||
dAcObjBase_c *pActor, dAcObjBase_c *pSrc, dAcRefBase_c *pRef, dLinkage_c::ConnectionType_e type, bool replace
|
||||
) {
|
||||
if (checkState(STATE_ACTIVE)) {
|
||||
if (replace) {
|
||||
fn_80050EB0(pActor);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
pActor->clearObjectProperty(0x1000);
|
||||
pActor->clearObjectProperty(0x4);
|
||||
mControllingActor.link(pSrc);
|
||||
mState = STATE_ACTIVE;
|
||||
mType = type;
|
||||
|
||||
if (type == CONNECTION_4) {
|
||||
pActor->setObjectProperty(0x4);
|
||||
} else if (type == CONNECTION_7) {
|
||||
pActor->setObjectProperty(0x1000);
|
||||
field_0x1A = 4;
|
||||
}
|
||||
MTXIdentity(carryTransMtx);
|
||||
pLinkedActor = pRef;
|
||||
pRef->link(pActor);
|
||||
if ((pSrc == dAcPy_c::GetLink2() || type == CONNECTION_5) &&
|
||||
pActor->getConnectParent()->profile_name == fProfile::ROOM) {
|
||||
pActor->addActorToRoom(-1);
|
||||
onFlag(0x20000000);
|
||||
pActor->setActorProperty(0x2000000);
|
||||
pActor->changeLoadedEntitiesWithSet();
|
||||
}
|
||||
pActor->clearActorProperty(0x1);
|
||||
return true;
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050DC0(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
mState = STATE_2;
|
||||
fn_80050E40(pActor, speed, velocityY, rot);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050E00(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
mState = STATE_3;
|
||||
fn_80050E40(pActor, speed, velocityY, rot);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050E40(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
fn_80050EB0(pActor);
|
||||
pActor->forwardSpeed = speed;
|
||||
pActor->velocity.y = velocityY;
|
||||
pActor->angle.y = rot;
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050EA0(dAcObjBase_c *pActor) {
|
||||
mState = STATE_DELETE;
|
||||
fn_80050EB0(pActor);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050EB0(dAcObjBase_c *pActor) {
|
||||
mControllingActor.unlink();
|
||||
if (pLinkedActor) {
|
||||
pLinkedActor->unlink();
|
||||
pLinkedActor = nullptr;
|
||||
}
|
||||
|
||||
if (checkType_1_3_5_6_9()) {
|
||||
MTXConcat(carryTransMtx, field_0x58, field_0x58);
|
||||
field_0x58.fn_802F1C40(2, 0);
|
||||
field_0x18 = 5;
|
||||
MTXIdentity(carryTransMtx);
|
||||
} else if (mType == CONNECTION_4) {
|
||||
if (pActor) {
|
||||
pActor->clearObjectProperty(0x4);
|
||||
}
|
||||
} else if (mType == CONNECTION_7) {
|
||||
if (pActor) {
|
||||
pActor->clearObjectProperty(0x1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (pActor && checkFlag(0x20000000)) {
|
||||
pActor->addActorToRoom(pActor->getRoomId());
|
||||
offFlag(0x20000000);
|
||||
}
|
||||
|
||||
field_0x1A = 4;
|
||||
mType = CONNECTION_0;
|
||||
offFlag(0x10000000);
|
||||
}
|
||||
|
||||
void dLinkage_c::bushTpFunc(dBgS_Acch &acch) {
|
||||
mVec3_c *pos = acch.GetPos();
|
||||
mVec3_c origPos = *pos;
|
||||
|
||||
if (field_0x1A != 0) {
|
||||
if (field_0x1A == 4 && !acch.ChkLineCheck()) {
|
||||
acch.OnLineCheck();
|
||||
onFlag(0x4000000);
|
||||
}
|
||||
|
||||
if (--field_0x1A == 0 && checkFlag(0x4000000)) {
|
||||
acch.OffLineCheck();
|
||||
offFlag(0x4000000);
|
||||
}
|
||||
}
|
||||
|
||||
acch.CrrPos(*dBgS::GetInstance());
|
||||
if (mState == STATE_ACTIVE) {
|
||||
dAcPy_c *player = dAcPy_c::GetLink2();
|
||||
if (mType == CONNECTION_1 && mControllingActor.p_owner == player) {
|
||||
player->fn_80202E00(nullptr, pos->x - origPos.x, pos->z - origPos.z);
|
||||
}
|
||||
|
||||
if (mType == CONNECTION_7 && mControllingActor.p_owner == player) {
|
||||
if (!checkFlag(0x10000)) {
|
||||
if (acch.ChkWallHit(nullptr)) {
|
||||
fn_80050EA0(player->getWhippedItem());
|
||||
return;
|
||||
}
|
||||
field_0x1A = 3;
|
||||
}
|
||||
}
|
||||
|
||||
*pos = origPos;
|
||||
}
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80051190(dAcObjBase_c *pActor) {
|
||||
// If not active, return
|
||||
if (!checkState(STATE_ACTIVE)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If currently Linked
|
||||
if (mControllingActor.p_owner) {
|
||||
// if the actor being linked to is empty, no need to delink
|
||||
if (pLinkedActor == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the Actor is linked to itself, return?
|
||||
dAcObjBase_c *pLinked = static_cast<dAcObjBase_c *>(pLinkedActor->p_owner);
|
||||
if (pLinked && &pLinked->GetLinkage() == this) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
pLinkedActor = nullptr;
|
||||
|
||||
fn_80050EA0(pActor);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_800511E0(dAcObjBase_c *pActor) {
|
||||
bool b = checkType_1_3_5_6_9();
|
||||
|
||||
if (!(checkFlag(0x200) || b || field_0x18 == 0)) {
|
||||
field_0x58.slerpTo(mMtx_c::Identity, field_0x58, 1.f / field_0x18);
|
||||
field_0x58.fn_802F1C40(2, 0);
|
||||
field_0x18--;
|
||||
}
|
||||
mMtx_c &mtx = pActor->mWorldMtx;
|
||||
f32 y = field_0x1C * pActor->mScale.y;
|
||||
mtx.transS(pActor->GetPosition().x, pActor->GetPosition().y + pActor->GetYOffset(), pActor->GetPosition().z);
|
||||
if (mType == CONNECTION_1) {
|
||||
MTXConcat(mtx, carryTransMtx, mtx);
|
||||
}
|
||||
mMtx_c m1;
|
||||
MTXTrans(m1, 0.f, y, 0.f);
|
||||
MTXConcat(mtx, m1, mtx);
|
||||
|
||||
if (b && mType != CONNECTION_1) {
|
||||
MTXConcat(mtx, carryTransMtx, mtx);
|
||||
}
|
||||
mMtx_c m2;
|
||||
MTXConcat(mtx, field_0x58, mtx);
|
||||
MTXTrans(m2, 0.f, -y, 0.f);
|
||||
MTXConcat(mtx, m2, mtx);
|
||||
|
||||
mtx.ZXYrotM(pActor->rotation);
|
||||
if (mControllingActor.p_owner) {
|
||||
pActor->roomid = static_cast<dAcObjBase_c *>(mControllingActor.p_owner)->roomid;
|
||||
}
|
||||
}
|
||||
|
||||
bool dLinkage_c::fn_800513C0() const {
|
||||
return (mState == STATE_ACTIVE && (mType == CONNECTION_1 || mType == CONNECTION_6)) &&
|
||||
!(mControllingActor.p_owner && mControllingActor.p_owner->profile_name == fProfile::E_GEROCK);
|
||||
}
|
||||
+47
-1
@@ -1,6 +1,8 @@
|
||||
#include "m/m_mtx.h"
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "m/m_math.h"
|
||||
#include "nw4r/math.h"
|
||||
#include "m/m_vec.h"
|
||||
|
||||
void mMtx_c::toRot(mAng3_c &out) const {
|
||||
f32 t1 = 0.0f;
|
||||
@@ -10,3 +12,47 @@ void mMtx_c::toRot(mAng3_c &out) const {
|
||||
}
|
||||
s16 anglex = cM::atan2s(-m[1][2], t1);
|
||||
}
|
||||
|
||||
void mMtx_c::fn_802F1C40(s32 i, s32 j) {
|
||||
f32 *pJ = &arr[j];
|
||||
f32 *pI = &arr[i];
|
||||
|
||||
mVec3_c v0(pI[0], pI[4], pI[8]);
|
||||
mVec3_c v1(pJ[0], pJ[4], pJ[8]);
|
||||
|
||||
mVec3_c v2;
|
||||
v0.normalize();
|
||||
|
||||
f32 z, y, x;
|
||||
if (j - i == 1 || j - i == -2) {
|
||||
z = (v0.x * v1.y) - (v0.y * v1.x);
|
||||
y = (v0.z * v1.x) - (v0.x * v1.z);
|
||||
x = (v0.y * v1.z) - (v0.z * v1.y);
|
||||
v2 = mVec3_c(x, y, z);
|
||||
|
||||
z = (v2.x * v0.y) - (v2.y * v0.x);
|
||||
y = (v2.z * v0.x) - (v2.x * v0.z);
|
||||
x = (v2.y * v0.z) - (v2.z * v0.y);
|
||||
v1 = mVec3_c(x, y, z);
|
||||
} else {
|
||||
z = (v1.x * v0.y) - (v1.y * v0.x);
|
||||
y = (v1.z * v0.x) - (v1.x * v0.z);
|
||||
x = (v1.y * v0.z) - (v1.z * v0.y);
|
||||
v2 = mVec3_c(x, y, z);
|
||||
|
||||
z = (v0.x * v2.y) - (v0.y * v2.x);
|
||||
y = (v0.z * v2.x) - (v0.x * v2.z);
|
||||
x = (v0.y * v2.z) - (v0.z * v2.y);
|
||||
v1 = mVec3_c(x, y, z);
|
||||
}
|
||||
v2.normalize();
|
||||
v1.normalize();
|
||||
|
||||
f32 *pK = &arr[((3 - i) - j)];
|
||||
|
||||
// clang-format off
|
||||
pI[0] = v0.x; pI[4] = v0.y; pI[8] = v0.z;
|
||||
pJ[0] = v1.x; pJ[4] = v1.y; pJ[8] = v1.z;
|
||||
pK[0] = v2.x; pK[4] = v2.y; pK[8] = v2.z;
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user