alink_grab done (#2234)

* work on alink grab

* some grab work

* grab almost done

* finish alink grab

* alink_wolf mostly done

* fix cLib_minMaxLimit

* alink guard mostly done

* extract some embedded assets

* extract grass data. wip, alignment wrong
This commit is contained in:
TakaRikka
2024-11-03 03:47:23 -08:00
committed by GitHub
parent 21cb60624a
commit 499d4dfe74
36 changed files with 5015 additions and 8034 deletions
+97
View File
@@ -299,6 +299,79 @@ modules:
hash: 22fc05a1e8059a065914ca60d162bf8d79327455
symbols: config/GZ2E01/rels/d_a_grass/symbols.txt
splits: config/GZ2E01/rels/d_a_grass/splits.txt
extract:
- symbol: l_M_kusa05_RGBATEX
binary: assets/l_M_kusa05_RGBATEX.bin
header: assets/l_M_kusa05_RGBATEX.h
- symbol: l_M_Hijiki00TEX
binary: assets/l_M_Hijiki00TEX.bin
header: assets/l_M_Hijiki00TEX.h
- symbol: l_M_Kusa_9qDL
binary: assets/l_M_Kusa_9qDL.bin
header: assets/l_M_Kusa_9qDL.h
- symbol: l_M_Kusa_9q_cDL
binary: assets/l_M_Kusa_9q_cDL.bin
header: assets/l_M_Kusa_9q_cDL.h
- symbol: l_M_TenGusaDL
binary: assets/l_M_TenGusaDL.bin
header: assets/l_M_TenGusaDL.h
- symbol: l_Tengusa_matDL
binary: assets/l_Tengusa_matDL.bin
header: assets/l_Tengusa_matDL.h
header_type: none
custom_type: matDL
- symbol: l_kusa9q_matDL
binary: assets/l_kusa9q_matDL.bin
header: assets/l_kusa9q_matDL.h
header_type: none
custom_type: matDL
- symbol: l_kusa9q_l4_matDL
binary: assets/l_kusa9q_l4_matDL.bin
header: assets/l_kusa9q_l4_matDL.h
header_type: none
custom_type: matDL
- symbol: l_J_Ohana00_64TEX
binary: assets/l_J_Ohana00_64TEX.bin
header: assets/l_J_Ohana00_64TEX.h
- symbol: l_J_hana00DL
binary: assets/l_J_hana00DL.bin
header: assets/l_J_hana00DL.h
- symbol: l_J_hana00_cDL
binary: assets/l_J_hana00_cDL.bin
header: assets/l_J_hana00_cDL.h
- symbol: l_matDL
binary: assets/l_matDL.bin
header: assets/l_matDL.h
header_type: none
custom_type: matDL
- symbol: l_matLight4DL
binary: assets/l_matLight4DL.bin
header: assets/l_matLight4DL.h
header_type: none
custom_type: matDL
- symbol: l_J_Ohana01_64128_0419TEX
binary: assets/l_J_Ohana01_64128_0419TEX.bin
header: assets/l_J_Ohana01_64128_0419TEX.h
- symbol: l_J_hana01DL
binary: assets/l_J_hana01DL.bin
header: assets/l_J_hana01DL.h
- symbol: l_J_hana01_c_00DL
binary: assets/l_J_hana01_c_00DL.bin
header: assets/l_J_hana01_c_00DL.h
- symbol: l_J_hana01_c_01DL
binary: assets/l_J_hana01_c_01DL.bin
header: assets/l_J_hana01_c_01DL.h
- symbol: l_mat2DL
binary: assets/l_mat2DL.bin
header: assets/l_mat2DL.h
header_type: none
custom_type: matDL
- symbol: l_mat2Light4DL
binary: assets/l_mat2Light4DL.bin
header: assets/l_mat2Light4DL.h
header_type: none
custom_type: matDL
- object: files/RELS.arc:rels/amem/d_a_kytag05.rel
hash: 0765a8953491870110c7525693dd1655e18f5827
symbols: config/GZ2E01/rels/d_a_kytag05/symbols.txt
@@ -1115,6 +1188,19 @@ modules:
hash: 06ea29fcd01b9a6c6924d32a2732496e10541b24
symbols: config/GZ2E01/rels/d_a_mant/symbols.txt
splits: config/GZ2E01/rels/d_a_mant/splits.txt
extract:
- symbol: l_Egnd_mantTEX
binary: assets/l_Egnd_mantTEX.bin
header: assets/l_Egnd_mantTEX.h
- symbol: l_Egnd_mantTEX_U
binary: assets/l_Egnd_mantTEX_U.bin
header: assets/l_Egnd_mantTEX_U.h
- symbol: l_Egnd_mantPAL
binary: assets/l_Egnd_mantPAL.bin
header: assets/l_Egnd_mantPAL.h
- symbol: l_Egnd_mantDL
binary: assets/l_Egnd_mantDL.bin
header: assets/l_Egnd_mantDL.h
- object: files/rel/Final/Release/d_a_mg_fshop.rel
hash: 81bb9eef98be70c2b69a913a51b0e6a9554403f4
symbols: config/GZ2E01/rels/d_a_mg_fshop/symbols.txt
@@ -3035,3 +3121,14 @@ modules:
hash: 19eacf74625a4ce9f319a552fac89a18c616e87a
symbols: config/GZ2E01/rels/d_a_warp_bug/symbols.txt
splits: config/GZ2E01/rels/d_a_warp_bug/splits.txt
extract:
- symbol: black_tex
binary: assets/black_tex.bin
header: assets/black_tex.h
- symbol: msg_data
binary: assets/msg_data.bin
header: assets/msg_data.h
- symbol: font_data
binary: assets/font_data.bin
header: assets/font_data.h
+53
View File
@@ -13,6 +13,7 @@
###
import argparse
import json
import sys
from pathlib import Path
from typing import Any, Dict, List
@@ -2115,6 +2116,58 @@ config.libs = [
ActorRel(Matching, "d_a_warp_bug"),
]
# Define our custom asset processing scripts
config.custom_build_rules = [
{
"name": "convert_matDL",
"command": "$python tools/converters/matDL_dis.py $in $out --symbol $symbol",
"description": "CONVERT $symbol",
},
]
config.custom_build_steps = {}
# Grab the specific GameID so we can format our strings properly
version = VERSIONS[version_num]
out_dir = config.build_dir / version
# This generates the build steps needed for preprocessing
def emit_build_rule(asset):
steps = config.custom_build_steps.setdefault("pre-compile", [])
match asset.get("custom_type"):
case None:
return
case "matDL":
steps.append(
{
"rule": "convert_matDL",
"inputs": out_dir / "bin" / asset["binary"],
"outputs": out_dir / "include" / asset["header"],
"variables": {
"symbol": asset["symbol"],
},
"implicit": Path("tools/converters/matDL_dis.py"),
}
)
case _:
print("Unknown asset type: " + asset["custom_type"])
# Parse the config and create the build rules for all our assets
config_path = out_dir / "config.json"
if config_path.exists():
config_data = json.load(open(config_path))
for asset in config_data.get("extract", []):
emit_build_rule(asset)
for module in config_data.get("modules", []):
for asset in module.get("extract", []):
emit_build_rule(asset)
# Optional extra categories for progress tracking
config.progress_categories = [
ProgressCategory("game", "TP Game Code"),
+1 -22
View File
@@ -52,28 +52,7 @@ inline T cLib_checkBit(T value, T bit) {
template <typename T>
inline T cLib_minMaxLimit(T val, T min, T max) {
return (T)((T)val < (T)min ? (T)min : ((T)val > (T)max ? (T)max : (T)val));
}
// fake function, replace usages with cLib_minMaxLimit when possible
template <typename T>
inline T cLib_minMaxLimit2(T val, T min, T max) {
T ret;
T var_r30;
if (val < min) {
ret = min;
} else {
if (val > max) {
var_r30 = max;
} else {
var_r30 = val;
}
ret = var_r30;
}
return (T)ret;
return (T)(val < min ? min : (val > max ? max : val));
}
template <typename T>
+23 -36
View File
@@ -133,14 +133,13 @@ public:
/* 800CFCB8 */ ~daAlink_footData_c();
/* 800CFCF4 */ daAlink_footData_c();
/* 0x00 */ u8 field_0x00[2];
/* 0x02 */ u16 field_0x2;
/* 0x04 */ u16 field_0x4;
/* 0x06 */ u16 field_0x6;
/* 0x00 */ u8 field_0x0;
/* 0x01 */ u8 field_0x1;
/* 0x02 */ s16 field_0x2;
/* 0x04 */ s16 field_0x4;
/* 0x06 */ s16 field_0x6;
/* 0x08 */ cXyz field_0x8;
/* 0x14 */ Mtx field_0x14;
/* 0x44 */ Mtx field_0x44;
/* 0x74 */ Mtx field_0x74;
/* 0x14 */ Mtx field_0x14[3];
}; // Size: 0xA4
STATIC_ASSERT(sizeof(daAlink_footData_c) == 0xA4);
@@ -696,6 +695,8 @@ public:
FTANM_UNK_8F = 0x8F,
FTANM_UNK_90 = 0x90,
FTANM_UNK_91 = 0x91,
FTANM_UNK_92 = 0x92,
FTANM_UNK_93 = 0x93,
FTANM_UNK_95 = 0x95,
FTANM_UNK_96 = 0x96,
FTANM_UNK_97 = 0x97,
@@ -1333,7 +1334,7 @@ public:
/* 800A2710 */ void setArmMatrix();
/* 800A29DC */ void setFootMatrix();
/* 800A2C24 */ void setMatrixOffset(f32*, f32);
/* 800A2CE0 */ void setLegAngle(f32, daAlink_footData_c*, s16*, s16*, int);
/* 800A2CE0 */ int setLegAngle(f32, daAlink_footData_c*, s16*, s16*, int);
/* 800A3430 */ void footBgCheck();
/* 800A39B8 */ void handBgCheck();
/* 800A3C8C */ JKRHeap* setItemHeap();
@@ -1694,7 +1695,7 @@ public:
/* 800CE294 */ bool checkNoSubjectModeCamera();
/* 800CE468 */ bool acceptSubjectModeChange();
/* 800CE628 */ int checkSubjectAction();
/* 800CE728 */ void checkBodyAngleX(s16);
/* 800CE728 */ s16 checkBodyAngleX(s16);
/* 800CE8A0 */ BOOL setBodyAngleToCamera();
/* 800CEAF4 */ void setSubjectMode();
/* 800CEB58 */ BOOL subjectCancelTrigger();
@@ -2034,7 +2035,7 @@ public:
/* 800E794C */ s16 getChainStickAngleY(s16) const;
/* 800E7994 */ u8 checkChainEmphasys();
/* 800E79F8 */ BOOL searchFmChainPos();
/* 800E7AEC */ void setFmChainPosFromOut(fopAc_ac_c*, cXyz*, int);
/* 800E7AEC */ BOOL setFmChainPosFromOut(fopAc_ac_c*, cXyz*, int);
/* 800E7C30 */ int procFmChainUpInit();
/* 800E7CC0 */ int procFmChainUp();
/* 800E7DD8 */ int procFmChainStrongPullInit();
@@ -2044,13 +2045,13 @@ public:
/* 800E7EF4 */ BOOL wallGrabTrigger();
/* 800E7F18 */ BOOL wallGrabButton();
/* 800E7F3C */ int setPushPullKeepData(dBgW_Base::PushPullLabel, int);
/* 800E80A4 */ void checkPushPullTurnBlock();
/* 800E8148 */ void checkPullBehindWall();
/* 800E80A4 */ BOOL checkPushPullTurnBlock();
/* 800E8148 */ BOOL checkPullBehindWall();
/* 800E8298 */ void offGoatStopGame();
/* 800E82B0 */ BOOL checkGoatCatchActor(fopAc_ac_c*);
/* 800E8314 */ f32 getGoatCatchDistance2();
/* 800E8334 */ void endPushPull();
/* 800E8354 */ void getPushPullAnimeSpeed();
/* 800E8334 */ int endPushPull();
/* 800E8354 */ f32 getPushPullAnimeSpeed();
/* 800E8428 */ int procCoPushPullWaitInit(int);
/* 800E857C */ int procCoPushPullWait();
/* 800E875C */ int procCoPushMoveInit(int, int);
@@ -2259,14 +2260,14 @@ public:
/* 800F7C50 */ f32 getCrawlMoveAnmSpeed();
/* 800F7C74 */ f32 getCrawlMoveSpeed();
/* 800F7CE8 */ void setCrawlMoveDirectionArrow();
/* 800F7E48 */ void changeCrawlAutoMoveProc(cXyz*);
/* 800F7E48 */ BOOL changeCrawlAutoMoveProc(cXyz*);
/* 800F81C0 */ int getCrawlMoveVec(cXyz*, cXyz*, cXyz*, int, int, u8*);
/* 800F85C0 */ void crawlBgCheck(cXyz*, cXyz*, int);
/* 800F8700 */ void checkCrawlSideWall(cXyz*, cXyz*, cXyz*, cXyz*, s16*, s16*);
/* 800F88F8 */ void decideCrawlDoStatus();
/* 800F89E0 */ BOOL checkNotCrawlStand(cXyz*);
/* 800F8A50 */ BOOL checkNotCrawlStand(cXyz*, cXyz*);
/* 800F8B00 */ void checkCrawlInHoll(cXyz*, cXyz*, cXyz*, int);
/* 800F8B00 */ BOOL checkCrawlInHoll(cXyz*, cXyz*, cXyz*, int);
/* 800F8D04 */ void setCrawlMoveHoll();
/* 800F8DBC */ void setCrawlMoveAngle();
/* 800F8F08 */ void stopHalfMoveAnime(f32);
@@ -3458,6 +3459,7 @@ public:
BOOL checkStartFall() { return getStartMode() == 3; }
u8 getBStatus() { return dComIfGp_getAStatus(); }
void setRStatus(u8 param_0, u8 param_1) { dComIfGp_setRStatus(param_0, param_1); }
inline bool checkWindSpeedOnXZ() const;
inline void startRestartRoomFromOut(int, u32, int);
@@ -3647,7 +3649,7 @@ public:
/* 0x02900 */ u32 field_0x2900;
/* 0x02904 */ daAlink_footData_c mFootData1[2];
/* 0x02A4C */ daAlink_footData_c mFootData2[2];
/* 0x02B94 */ f32* field_0x2b94;
/* 0x02B94 */ f32 field_0x2b94;
/* 0x02B98 */ f32 field_0x2b98;
/* 0x02B98 */ f32 field_0x2b9c;
/* 0x02BA0 */ f32* field_0x2ba0;
@@ -5948,7 +5950,7 @@ public:
static daAlinkHIO_wlDamNormal_c1 const m;
};
class daAlinkHIO_wlDamLarge_c1 {
class daAlinkHIO_wlDamLaHu_c1 {
public:
/* 0x00 */ daAlinkHIO_anm_c field_0x0;
/* 0x14 */ daAlinkHIO_anm_c field_0x14;
@@ -5961,31 +5963,16 @@ public:
/* 0x60 */ f32 field_0x60;
/* 0x64 */ f32 field_0x64;
/* 0x68 */ f32 field_0x68;
}; // Size: 0x6C
};
class daAlinkHIO_wlDamLarge_c0 {
public:
static daAlinkHIO_wlDamLarge_c1 const m;
static daAlinkHIO_wlDamLaHu_c1 const m;
};
class daAlinkHIO_wlDamHuge_c1 {
public:
/* 0x00 */ daAlinkHIO_anm_c field_0x0;
/* 0x14 */ daAlinkHIO_anm_c field_0x14;
/* 0x28 */ daAlinkHIO_anm_c field_0x28;
/* 0x3C */ daAlinkHIO_anm_c field_0x3C;
/* 0x50 */ s16 field_0x50;
/* 0x54 */ f32 field_0x54;
/* 0x58 */ f32 field_0x58;
/* 0x5C */ f32 field_0x5C;
/* 0x60 */ f32 field_0x60;
/* 0x64 */ f32 field_0x64;
/* 0x68 */ f32 field_0x68;
}; // Size: 0x6C
class daAlinkHIO_wlDamHuge_c0 {
public:
static daAlinkHIO_wlDamHuge_c1 const m;
static daAlinkHIO_wlDamLaHu_c1 const m;
};
class daAlinkHIO_wlDamFall_c1 {
+5
View File
@@ -100,6 +100,11 @@ public:
void setNaderu() { field_0x568 |= 0x80; }
void setNaderuFinish() { field_0x568 |= 0x100; }
void setCrazyDash() { field_0x568 |= 4; }
void setCrazyBeforeCatch() { field_0x568 |= 1; }
void setCrazyCatch() { field_0x568 |= 2; }
void setCrazyThrowLeft() { field_0x568 |= 8; }
void setCrazyThrowRight() { field_0x568 |= 0x10; }
private:
/* 0x568 */ u16 field_0x568;
+5 -1
View File
@@ -264,6 +264,8 @@ public:
void setReinPosNormal() { (this->*mpSetReinPosNormalFn)(); }
void setReinPosHand(int param_0) { (this->*mpSetReinPosHandFn)(param_0); }
u32 getShadowID() const { return mShadowID; }
static u8 const m_footJointTable[8];
static f32 const m_callLimitDistance2;
@@ -317,7 +319,9 @@ public:
/* 0x1720 */ s16 field_0x1720;
/* 0x1722 */ u8 field_0x1722[0x1728 - 0x1722];
/* 0x1728 */ int field_0x1728;
/* 0x172C */ u8 field_0x172c[0x14];
/* 0x172C */ u8 field_0x172c[0x1734 - 0x172C];
/* 0x1734 */ u32 mShadowID;
/* 0x1738 */ u8 field_0x1738[0x1740 - 0x1738];
/* 0x1740 */ u32 field_0x1740;
/* 0x1744 */ u32 mStateFlg0;
/* 0x1748 */ u32 mResetStateFlg0;
+16 -1
View File
@@ -23,6 +23,7 @@ class daMidna_c : public fopAc_ac_c {
public:
enum daMidna_ERFLG0 {
ERFLG0_NO_SERVICE_WAIT = 0x80,
ERFLG0_FORCE_MORF_CANCEL = 0x10,
ERFLG0_FORCE_PANIC = 8,
ERFLG0_UNK_2 = 2,
};
@@ -41,7 +42,9 @@ public:
};
enum daMidna_FLG1 {
FLG1_SHADOW_NO_DRAW = 0x1000,
FLG1_UNK_100 = 0x100,
FLG1_NO_MASK_DRAW = 0x80,
FLG1_FORCE_NORMAL_COL = 8,
FLG1_FORCE_TIRED_COL = 4,
FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE = 2,
@@ -119,7 +122,7 @@ public:
BOOL checkNoInput() const { return checkStateFlg0(FLG0_NO_INPUT); }
BOOL checkWolfNoPos() const { return checkStateFlg0(FLG0_UNK_800); }
int checkMetamorphoseEnable() { return (this->*mpFunc)(); }
int checkShadowModelDrawDemoForce() const { return checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE); }
u32 checkShadowModelDrawDemoForce() const { return checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE); }
void setForceNeckAimPos(const cXyz& i_pos) {
onStateFlg0(FLG0_UNK_20000);
@@ -180,6 +183,16 @@ public:
return checkStateFlg0(FLG0_PORTAL_OBJ_CALL) && checkStateFlg0(FLG0_UNK_200);
}
BOOL checkShadowNoDraw() const {
return checkStateFlg1(FLG1_SHADOW_NO_DRAW);
}
BOOL checkNoMaskDraw() const {
return checkStateFlg1(FLG1_NO_MASK_DRAW);
}
BOOL checkDemoPortalWarpWait() const { return mDemoMode == 11; }
inline static BOOL checkMidnaRealBody();
inline static BOOL i_checkMidnaRealBody() {
@@ -197,6 +210,8 @@ public:
|| field_0x5e4[0].getIdx() == 0x1C8 || field_0x5e4[0].getIdx() == 0x1C9;
}
void onForceMorfCancel() { onEndResetStateFlg0(ERFLG0_FORCE_MORF_CANCEL); }
static u8 const m_texDataTable[84];
static u8 const m_anmDataTable[636];
+1
View File
@@ -88,6 +88,7 @@ public:
u32 checkStateFlg0(daNbomb_FLG0 i_flag) const { return mStateFlg0 & i_flag; }
u32 checkWaterBomb() const { return checkStateFlg0(FLG0_WATER_BOMB); }
u32 checkPlayerMake() const { return checkStateFlg0(FLG0_PLAYER_MAKE); }
static const char* m_arcNameList[6];
+4
View File
@@ -45,6 +45,10 @@ public:
setBackJoint(-1);
}
void setCoCancelTimer() {
mCoCancelTimer = 30;
}
private:
/* 0x0568 */ request_of_phase_process_class mPhase;
/* 0x0570 */ dCcD_Stts mCcStts;
+11 -1
View File
@@ -148,11 +148,21 @@ public:
/* 80C0F7EC */ void getAttentionPos(fopAc_ac_c*);
/* 80C0F860 */ void standWaitJump(void*);
bool checkNpcObjGra() { return field_0xa7e == 1; }
void setCrazyDash() { field_0xa48 |= 4; }
void setCrazyCatch() { field_0xa48 |= 2; }
void setCrazyThrowLeft() { field_0xa48 |= 8; }
void setCrazyThrowRight() { field_0xa48 |= 0x10; }
static u8 mBaseMotionList[264];
static u8 mFaceMotionList[168];
private:
/* 0x568 */ u8 field_0x568[0x20a4 - 0x568];
/* 0x0568 */ u8 field_0x568[0xA48 - 0x568];
/* 0x0A48 */ u16 field_0xa48;
/* 0x0A4A */ u8 field_0xa4a[0xA7E - 0xA4A];
/* 0x0A7E */ u8 field_0xa7e;
/* 0x0A7F */ u8 field_0xa7f[0x20a4 - 0xA7F];
};
STATIC_ASSERT(sizeof(daObj_GrA_c) == 0x20a4);
+2
View File
@@ -191,6 +191,8 @@ namespace daObjMovebox {
void off_switch1() const { fopAcM_offSwitch(this, prm_get_swSave1()); }
void off_switch2() const { fopAcM_offSwitch(this, prmZ_get_swSave2()); }
int getType() { return prm_get_type(); }
static const s16 M_dir_base[4];
static const char* const M_arcname[8];
static const dCcD_SrcCyl M_cyl_src;
+3
View File
@@ -35,6 +35,9 @@ public:
/* 80CFB53C */ void draw();
/* 80CFB5E8 */ void _delete();
u8 getSwbit() { return fopAcM_GetParamBit(this, 0, 8); }
BOOL checkDispEmphasis() { return fopAcM_isSwitch(this, getSwbit()) == FALSE; }
private:
/* 0x568 */ u8 field_0x568[0xaa0 - 0x568];
};
+2
View File
@@ -393,6 +393,7 @@ public:
ERFLG1_UNK_40000000 = 0x40000000,
ERFLG1_UNK_20000000 = 0x20000000,
ERFLG1_UNK_10000000 = 0x10000000,
ERFLG1_UNK_8000000 = 0x8000000,
ERFLG1_UNK_4000000 = 0x4000000,
ERFLG1_UNK_2000000 = 0x2000000,
ERFLG1_UNK_1000000 = 0x1000000,
@@ -426,6 +427,7 @@ public:
ERFLG2_UNK_40 = 0x40,
ERFLG2_UNK_20 = 0x20,
ERFLG2_UNK_10 = 0x10,
ERFLG2_UNK_8 = 8,
ERFLG2_UNK_2 = 2,
ERFLG2_UNK_1 = 1,
};
+5
View File
@@ -59,6 +59,11 @@ public:
NULL, NULL);
}
static fopAc_ac_c* createInsectBombPlayer(cXyz* i_pos) {
return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 10, i_pos, -1, NULL, NULL, -1,
NULL, NULL);
}
static fopAc_ac_c* createWaterBombExplode(cXyz* i_pos) {
return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 18, i_pos, -1, NULL, NULL, -1, NULL,
NULL);
+6
View File
@@ -520,6 +520,8 @@ public:
}
f32 getCameraZoomForcus(int i_no) { return mCameraInfo[i_no].mCameraZoomForcus; }
f32 getCameraZoomScale(int i_no) { return mCameraInfo[i_no].mCameraZoomScale; }
void setCameraZoomScale(int i_no, f32 i_scale) { mCameraInfo[i_no].mCameraZoomScale = i_scale; }
void saveCameraPosition(int i, cXyz* i_pos, cXyz* i_target, f32 i_fovy, s16 i_bank) {
@@ -2727,6 +2729,10 @@ inline void dComIfGp_setCameraZoomScale(int i_no, f32 i_scale) {
g_dComIfG_gameInfo.play.setCameraZoomScale(i_no, i_scale);
}
inline f32 dComIfGp_getCameraZoomScale(int i_no) {
return g_dComIfG_gameInfo.play.getCameraZoomScale(i_no);
}
inline f32 dComIfGp_getCameraZoomForcus(int i_no) {
return g_dComIfG_gameInfo.play.getCameraZoomForcus(i_no);
}
+2 -1
View File
@@ -796,6 +796,7 @@ typedef enum _GXCommand {
GX_CMD_LOAD_CP_REG = 0x08,
GX_CMD_LOAD_XF_REG = 0x10,
GX_CMD_LOAD_BP_REG = 0x61,
} GXCommand;
typedef enum _GXClipMode {
@@ -1940,4 +1941,4 @@ typedef enum _GXXFClr0Ctrl {
GX_XF_CLR0CTRL_LMASKLO_END = 20,
} GXXFClr0Ctrl;
#endif /* GXENUM_H */
#endif /* GXENUM_H */
+6
View File
@@ -97,6 +97,11 @@ public:
static cXyz* getCrossP() { return mLineCheck.GetCrossP(); }
static bool lineCheck(const cXyz*, const cXyz*, const fopAc_ac_c*);
static bool getTriPla(cM3dGPla* o_tri) { return dComIfG_Bgsp().GetTriPla(mLineCheck, o_tri); }
static bool checkWallHit() {
cM3dGPla poly;
getTriPla(&poly);
return cBgW_CheckBWall(poly.mNormal.y);
}
static dBgS_ObjLinChk mLineCheck;
};
@@ -203,6 +208,7 @@ enum fopAcM_CARRY {
/* 0x10 */ fopAcM_CARRY_LIGHT = 16, // guess based on context
/* 0x20 */ fopAcM_CARRY_ITEM = 32,
/* 0x30 */ fopAcM_CARRY_UNK_30 = 0x30,
/* 0x40 */ fopAcM_CARRY_UNK_40 = 0x40,
/* 0x80 */ fopAcM_CARRY_CHICKEN = 0x80,
};
+4
View File
@@ -84,6 +84,10 @@ inline void cMtx_multVec(Mtx mtx, const Vec* src, Vec* dst) {
mDoMtx_multVec(mtx, src, dst);
}
inline void cMtx_multVecSR(Mtx mtx, const Vec* src, Vec* dst) {
mDoMtx_multVecSR(mtx, src, dst);
}
inline void cMtx_lookAt(Mtx param_0, const Vec* param_1, const Vec* param_2, const Vec* param_3, s16 param_4) {
mDoMtx_lookAt(param_0,param_1,param_2,param_3,param_4);
}
+5 -6
View File
@@ -483,11 +483,9 @@ static const u16 effName_42340[] = {
};
/* 8045314C-80453150 00174C 0004+00 1/1 0/0 0/0 .sdata2 fFootJoint$44785 */
static const u8 fFootJoint[4] = {
0x00,
0x10,
0x00,
0x15,
static const u16 fFootJoint[] = {
0x0010,
0x0015,
};
/* 80453150-80453154 001750 0004+00 1/1 0/0 0/0 .sdata2 bFootJoint$44786 */
@@ -2306,9 +2304,10 @@ void daAlink_c::setMatrixOffset(f32* param_0, f32 param_1) {
/* 800A2CE0-800A3430 09D620 0750+00 3/3 0/0 0/0 .text
* setLegAngle__9daAlink_cFfP18daAlink_footData_cPsPsi */
void daAlink_c::setLegAngle(f32 param_0, daAlink_footData_c* param_1, s16* param_2,
int daAlink_c::setLegAngle(f32 param_0, daAlink_footData_c* param_1, s16* param_2,
s16* param_3, int param_4) {
// NONMATCHING
return 0;
}
/* 80391EFC-80391F08 01E55C 000C+00 0/1 0/0 0/0 .rodata localLeftFootOffset$56542 */
+2 -2
View File
@@ -2708,7 +2708,7 @@ const daAlinkHIO_wlDamNormal_c1 daAlinkHIO_wlDamNormal_c0::m = {
};
/* 8038F29C-8038F308 01B8FC 006C+00 2/4 0/0 0/0 .rodata m__24daAlinkHIO_wlDamLarge_c0 */
const daAlinkHIO_wlDamLarge_c1 daAlinkHIO_wlDamLarge_c0::m = {
const daAlinkHIO_wlDamLaHu_c1 daAlinkHIO_wlDamLarge_c0::m = {
{
49,
1.0f,
@@ -2749,7 +2749,7 @@ const daAlinkHIO_wlDamLarge_c1 daAlinkHIO_wlDamLarge_c0::m = {
/* 8038F308-8038F374 01B968 006C+00 0/2 0/0 0/0 .rodata m__23daAlinkHIO_wlDamHuge_c0 */
#pragma push
#pragma force_active on
const daAlinkHIO_wlDamHuge_c1 daAlinkHIO_wlDamHuge_c0::m = {
const daAlinkHIO_wlDamLaHu_c1 daAlinkHIO_wlDamHuge_c0::m = {
{
49,
1.1f,
-2
View File
@@ -1153,7 +1153,6 @@ int daAlink_c::procCanoeRodGrab() {
}
/* 800F6464-800F659C 0F0DA4 0138+00 6/6 0/0 0/0 .text procCanoeFishingWaitInit__9daAlink_cFv */
// NONMATCHING - cLib_minMaxLimit regalloc
int daAlink_c::procCanoeFishingWaitInit() {
if (!commonProcInitNotSameProc(PROC_CANOE_FISHING_WAIT)) {
field_0x311a = 0;
@@ -1241,7 +1240,6 @@ int daAlink_c::procCanoeFishingReelInit() {
/* 800F6874-800F69D4 0F11B4 0160+00 1/0 0/0 0/0 .text procCanoeFishingReel__9daAlink_cFv
*/
// NONMATCHING - cLib_minMaxLimit regalloc
int daAlink_c::procCanoeFishingReel() {
if (canoeCommon()) {
mItemVar0.field_0x3018 = 1;
+4 -2
View File
@@ -79,8 +79,9 @@ void daAlink_c::setCrawlMoveDirectionArrow() {
/* 800F7E48-800F81C0 0F2788 0378+00 2/2 0/0 0/0 .text changeCrawlAutoMoveProc__9daAlink_cFP4cXyz
*/
void daAlink_c::changeCrawlAutoMoveProc(cXyz* param_0) {
BOOL daAlink_c::changeCrawlAutoMoveProc(cXyz* param_0) {
// NONMATCHING
return 0;
}
/* 800F81C0-800F85C0 0F2B00 0400+00 2/2 0/0 0/0 .text
@@ -169,8 +170,9 @@ BOOL daAlink_c::checkNotCrawlStand(cXyz* param_0, cXyz* param_1) {
/* 800F8B00-800F8D04 0F3440 0204+00 2/2 0/0 0/0 .text
* checkCrawlInHoll__9daAlink_cFP4cXyzP4cXyzP4cXyzi */
void daAlink_c::checkCrawlInHoll(cXyz* param_0, cXyz* param_1, cXyz* param_2, int param_3) {
BOOL daAlink_c::checkCrawlInHoll(cXyz* param_0, cXyz* param_1, cXyz* param_2, int param_3) {
// NONMATCHING
return 0;
}
/* 800F8D04-800F8DBC 0F3644 00B8+00 2/2 0/0 0/0 .text setCrawlMoveHoll__9daAlink_cFv */
-1
View File
@@ -785,7 +785,6 @@ BOOL daAlink_c::checkDamageAction() {
/* 800D8F3C-800D9514 0D387C 05D8+00 2/2 0/0 0/0 .text procDamageInit__9daAlink_cFP12dCcD_GObjInfi
*/
// NONMATCHING - cLib_minMaxLimit appears to have issues when using s16
int daAlink_c::procDamageInit(dCcD_GObjInf* param_0, int param_1) {
BOOL freeze_player;
+23 -2
View File
@@ -4233,8 +4233,29 @@ void daAlink_c::checkWarpStart() {
/* 8011FBC0-8011FD4C 11A500 018C+00 3/3 0/0 0/0 .text warpModelTexScroll__9daAlink_cFv */
int daAlink_c::warpModelTexScroll() {
// NONMATCHING
return 0;
field_0x3478 += 0.15f;
if (field_0x3478 >= 1.0f) {
field_0x3478 -= 1.0f;
}
int temp_r30 = cLib_chaseF(&field_0x347c, field_0x3480, 0.06f);
field_0x3484 = cLib_minMaxLimit<f32>(0.5f * field_0x347c, 0.0f, 1.0f);
dRes_info_c::setWarpSRT(field_0x064C, current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mSwordModel->getModelData(), current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mShieldModel->getModelData(), current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mSheathModel->getModelData(), current.pos, field_0x3478, field_0x347c);
if (checkWolf()) {
dRes_info_c::setWarpSRT(mpWlChainModels[0]->getModelData(), current.pos, field_0x3478, field_0x347c);
} else {
dRes_info_c::setWarpSRT(mpLinkFaceModel->getModelData(), current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mpLinkHatModel->getModelData(), current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mpLinkHandModel->getModelData(), current.pos, field_0x3478, field_0x347c);
dRes_info_c::setWarpSRT(mpLinkBootModels[0]->getModelData(), current.pos, field_0x3478, field_0x347c);
}
return temp_r30;
}
/* 8011FD4C-80120124 11A68C 03D8+00 2/2 0/0 0/0 .text procCoWarpInit__9daAlink_cFii */
File diff suppressed because it is too large Load Diff
+402 -37
View File
@@ -5,6 +5,7 @@
#include "d/actor/d_a_alink.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_obj_gra2.h"
/* 800DC548-800DC5A4 0D6E88 005C+00 13/13 0/0 0/0 .text checkEnemyGroup__9daAlink_cFP10fopAc_ac_c
*/
@@ -19,14 +20,6 @@ public:
bool checkBattleMode() { return true; }
};
class daObj_GrA_c : public fopAc_ac_c {
public:
bool checkNpcObjGra() { return field_0xa7e == 1; }
u8 temp[0xA7E - 0x568];
u8 field_0xa7e;
};
/* 800DC5A4-800DC5DC 0D6EE4 0038+00 4/4 0/0 0/0 .text checkSpecialNpc__9daAlink_cFP10fopAc_ac_c */
BOOL daAlink_c::checkSpecialNpc(fopAc_ac_c* i_actor) {
s16 name = fopAcM_GetName(i_actor);
@@ -45,15 +38,10 @@ BOOL daAlink_c::checkShieldAttackEmphasys() {
}
/* 800DC678-800DC79C 0D6FB8 0124+00 5/5 0/0 0/0 .text checkGuardActionChange__9daAlink_cFv */
/* BOOL daAlink_c::checkGuardActionChange() {
return checkAttentionLock() && !checkIronBallWaitAnime() && !checkGrabAnime() &&
!checkCopyRodControllAnime() && mTargetedActor != NULL && !checkSpecialNpc(mTargetedActor) &&
(fopAcM_GetGroup(mTargetedActor) != 3 && fopAcM_GetGroup(mTargetedActor) != fopAc_NPC_e);
} */
BOOL daAlink_c::checkGuardActionChange() {
// NONMATCHING
return 0;
return checkAttentionLock() && !checkIronBallWaitAnime() && !checkGrabAnime() &&
!checkCopyRodControllAnime() && !((mTargetedActor != NULL && !checkSpecialNpc(mTargetedActor)) &&
(fopAcM_GetGroup(mTargetedActor) == 3 || fopAcM_GetGroup(mTargetedActor) == fopAc_NPC_e));
}
/* 800DC79C-800DC8C4 0D70DC 0128+00 3/3 0/0 0/0 .text stickArrowIncrement__9daAlink_cFi
@@ -246,10 +234,9 @@ void daAlink_c::setGuardSe(dCcD_GObjInf* i_objinf) {
}
/* 800DD1D4-800DD3E4 0D7B14 0210+00 1/1 0/0 0/0 .text setSmallGuard__9daAlink_cFP12dCcD_GObjInf */
// NONMATCHING
void daAlink_c::setSmallGuard(dCcD_GObjInf* i_objinf) {
setUpperAnimeBase(0x16);
cXyz* dmg_vec = (cXyz*)getDamageVec(i_objinf);
cXyz* dmg_vec = getDamageVec(i_objinf);
mBodyAngle.y = (dmg_vec->atan2sX_Z() + 0x8000) - shape_angle.y;
if (abs(mBodyAngle.y) > 0x7000) {
@@ -260,57 +247,435 @@ void daAlink_c::setSmallGuard(dCcD_GObjInf* i_objinf) {
daAlinkHIO_guard_c0::m.mSmallGuardLRAngleMax);
}
s16 max = daAlinkHIO_guard_c0::m.mSmallGuardFBAngleMax;
s16 min = -max;
mBodyAngle.x = cLib_minMaxLimit<s16>(cM_atan2s(dmg_vec->y, dmg_vec->absXZ()), min, max);
mBodyAngle.x = cLib_minMaxLimit<s16>(cM_atan2s(dmg_vec->y, dmg_vec->absXZ()), -daAlinkHIO_guard_c0::m.mSmallGuardFBAngleMax, daAlinkHIO_guard_c0::m.mSmallGuardFBAngleMax);
}
/* 800DD3E4-800DD894 0D7D24 04B0+00 1/1 0/0 0/0 .text
* procGuardSlipInit__9daAlink_cFiP12dCcD_GObjInf */
// NONMATCHING - extra useless mr
int daAlink_c::procGuardSlipInit(int param_0, dCcD_GObjInf* param_1) {
// NONMATCHING
return 0;
if (mProcID == PROC_GUARD_SLIP) {
return 0;
}
field_0x2fd5++;
if (field_0x2fd5 == 4) {
field_0x2fd5 = 0;
return procGuardBreakInit();
}
commonProcInit(PROC_GUARD_SLIP);
field_0x2fd4 = 3;
cXyz* temp_r3 = getDamageVec(param_1);
current.angle.y = temp_r3->atan2sX_Z();
if (mEquipItem == IRONBALL) {
setSingleAnimeBase(ANM_IRONBALL_DEF);
setIronBallWaitUpperAnime(1);
mNowAnmPackUpper[2].setRatio(0.0f);
mProcVar1.field_0x300a = 0;
mProcVar2.field_0x300c = 0;
mProcVar3.field_0x300e = 0;
} else {
const daAlinkHIO_guard_c1* var_r27 = &daAlinkHIO_guard_c0::m;
daAlink_ANM var_r28;
if (field_0x2f98 == 2) {
var_r28 = ANM_GUARD_LEFT;
} else {
var_r28 = ANM_GUARD_RIGHT;
}
setSingleAnimeParam(var_r28, &var_r27->mGuardHitAnm);
setUpperGuardAnime(-1.0f);
mProcVar2.field_0x300c = (current.angle.y + 0x8000) - shape_angle.y;
if (abs(mProcVar2.field_0x300c) > 0x7000) {
mProcVar2.field_0x300c = 0;
} else {
mProcVar2.field_0x300c = cLib_minMaxLimit<s16>((s16)mProcVar2.field_0x300c, -daAlinkHIO_guard_c0::m.mGuardLRAngleMax, daAlinkHIO_guard_c0::m.mGuardLRAngleMax);
}
mProcVar3.field_0x300e = cLib_minMaxLimit<s16>(cM_atan2s(temp_r3->y, temp_r3->absXZ()), -daAlinkHIO_guard_c0::m.mGuardFBAngleMax, daAlinkHIO_guard_c0::m.mGuardFBAngleMax);
mProcVar1.field_0x300a = daAlinkHIO_guard_c0::m.mGuardBodyInterpolation + 1;
mProcVar2.field_0x300c = (mProcVar2.field_0x300c - mBodyAngle.y) / mProcVar1.field_0x300a;
mProcVar3.field_0x300e = (mProcVar3.field_0x300e - mBodyAngle.x) / mProcVar1.field_0x300a;
mProcVar1.field_0x300a--;
mBodyAngle.y += mProcVar2.field_0x300c;
mBodyAngle.x += mProcVar3.field_0x300e;
}
mProcVar4.field_0x3010 = 0;
mProcVar5.field_0x3012 = 0;
if (param_1 != NULL && param_1->GetTgHitAc() != NULL && fopAcM_GetName(param_1->GetTgHitAc()) == PROC_E_MM_MT && param_1->GetTgHitAc()->subtype == 1) {
if (checkBootsOrArmorHeavy()) {
mNormalSpeed = daAlinkHIO_guard_c0::m.mMagneHvyGuardSpeed;
mProcVar5.field_0x3012 = 1;
} else {
mNormalSpeed = daAlinkHIO_guard_c0::m.mMagneGuardSpeed;
mProcVar5.field_0x3012 = 0;
}
mProcVar4.field_0x3010 = 1;
} else if (checkHugeAttack(param_0)) {
if ((!checkBootsOrArmorHeavy() && checkMiddleBossGoronRoom()) || checkStageName("D_MN07B")) {
mNormalSpeed = 40.0f;
} else {
mNormalSpeed = daAlinkHIO_guard_c0::m.mGuardSpeedHuge;
}
} else if (checkLargeAttack(param_0)) {
mNormalSpeed = daAlinkHIO_guard_c0::m.mGuardSpeedLarge;
} else {
mNormalSpeed = daAlinkHIO_guard_c0::m.mGuardSpeedNormal;
}
field_0x2f9d = 0x60;
setFootEffectProcType(1);
return 1;
}
/* 800DD894-800DDA10 0D81D4 017C+00 1/0 0/0 0/0 .text procGuardSlip__9daAlink_cFv */
int daAlink_c::procGuardSlip() {
// NONMATCHING
return 0;
if (mEquipItem != IRONBALL) {
setUpperGuardAnime(-1.0f);
}
setShapeAngleToAtnActor(0);
if (mProcVar1.field_0x300a != 0) {
mProcVar1.field_0x300a -= 1;
mBodyAngle.y += mProcVar2.field_0x300c;
mBodyAngle.x += mProcVar3.field_0x300e;
}
if (mNormalSpeed > 2.5f) {
field_0x2f9d = 0x60;
}
f32 var_f31;
if (checkBootsOrArmorHeavy() && mProcVar4.field_0x3010 == 0) {
var_f31 = 2.5f;
} else {
var_f31 = 1.25f;
}
if (mProcVar4.field_0x3010 != 0 && mProcVar5.field_0x3012 != checkBootsOrArmorHeavy()) {
mNormalSpeed = 0.0f;
}
if (cLib_chaseF(&mNormalSpeed, 0.0f, var_f31) != 0 && checkAnmEnd(&mUnderFrameCtrl[0])) {
field_0x814.SetTgApid(0);
if (!checkGuardActionChange()) {
onEndResetFlg1(ERFLG1_UNK_20);
}
if (mEquipItem == IRONBALL) {
mNowAnmPackUpper[2].setRatio(1.0f);
}
checkNextAction(0);
}
return 1;
}
/* 800DDA10-800DDBA8 0D8350 0198+00 2/1 0/0 0/0 .text procGuardAttackInit__9daAlink_cFv
*/
int daAlink_c::procGuardAttackInit() {
// NONMATCHING
return 0;
if (mDemo.getDemoMode() == 0x4B && mProcID == PROC_GUARD_ATTACK) {
return 1;
}
commonProcInit(PROC_GUARD_ATTACK);
const daAlinkHIO_guardAttack_c1* temp_r30 = &daAlinkHIO_gAtPush_c0::m;
field_0x2f98 = 3;
field_0x34d4 = l_rWaitBaseAnime;
field_0x3588 = l_rWaitBaseAnime;
setCutType(0x29);
setSingleAnimeParam(ANM_SHIELD_ATTACK, &temp_r30->mAttackAnm);
field_0x3478 = temp_r30->mAttackStartFrame;
field_0x347c = temp_r30->mAttackEndFrame;
field_0x3480 = temp_r30->mSpeed;
if (checkHeavyStateOn(1, 1) != 0) {
field_0x3480 *= mHeavySpeedMultiplier;
}
if (mDemo.getDemoMode() == 0x4B) {
field_0x3484 = 1000.0f;
field_0x3488 = 1000.0f;
} else {
field_0x3484 = temp_r30->mAttackAnm.mCheckFrame;
field_0x3488 = temp_r30->mSlashCheckFrame;
}
mNormalSpeed = 0.0f;
setSwordVoiceSe(Z2SE_AL_V_TATE_OSHI);
mGuardAtCps.ResetAtHit();
mGuardAtCps.SetAtSe(2);
mGuardAtCps.SetR(daAlinkHIO_guard_c0::m.mAttackRadius);
current.angle.y = shape_angle.y;
setUpperGuardAnime(-1.0f);
mProcVar2.field_0x300c = 0;
mProcVar3.field_0x300e = 0;
mProcVar5.field_0x3012 = 0;
mProcVar0.field_0x3008 = 0;
return 1;
}
/* 800DDBA8-800DDE58 0D84E8 02B0+00 1/0 0/0 0/0 .text procGuardAttack__9daAlink_cFv */
int daAlink_c::procGuardAttack() {
// NONMATCHING
return 0;
daPy_frameCtrl_c* temp_r30 = &mUnderFrameCtrl[0];
setUpperGuardAnime(-1.0f);
field_0x2f99 = 4;
cLib_chaseF(&mNormalSpeed, 0.0f, daAlinkHIO_move_c0::m.mDeceleration);
setShapeAngleToAtnActor(1);
current.angle.y = shape_angle.y;
if (checkForceSwordSwing()) {
mProcVar2.field_0x300c = 1;
}
BOOL var_r29;
if (mEquipItem == 0x103 && !checkMagneBootsOn()) {
var_r29 = 1;
if (doTrigger()) {
mProcVar3.field_0x300e = 1;
}
} else {
var_r29 = 0;
}
if (mProcVar0.field_0x3008 == 0 && mGuardAtCps.ChkAtHit()) {
mProcVar0.field_0x3008 = 1;
dComIfGp_getVibration().StartShock(3, 1, cXyz(0.0f, 1.0f, 0.0f));
}
if (mProcVar5.field_0x3012 != 0 && commonLineCheck(&field_0x3834, &mRightHandPos) && dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 7) {
mZ2Link.startHitItemSE(Z2SE_HIT_SHIELD_ATTACK, dKy_pol_sound_get(&mLinkLinChk), NULL, -1.0f);
return procCutReverseInit(ANM_SHIELD_ATTACK_RECOIL);
}
if (var_r29) {
if (checkCutHeadState()) {
setDoStatusEmphasys(0x77);
} else {
setDoStatus(0x86);
}
}
if (checkAnmEnd(temp_r30)) {
if (mDemo.getDemoMode() == 0x4B) {
dComIfGp_evmng_cutEnd(field_0x3184);
} else {
checkNextAction(0);
}
} else {
if (temp_r30->getFrame() > field_0x3488) {
if (mProcVar3.field_0x300e != 0) {
return checkDoCutAction();
}
if (mProcVar2.field_0x300c != 0) {
return checkCutAction();
}
}
if (temp_r30->getFrame() > field_0x3484) {
onModeFlg(4);
checkNextAction(1);
} else if (temp_r30->getFrame() >= field_0x3478 && temp_r30->getFrame() < field_0x347c) {
if (mProcVar5.field_0x3012 == 0) {
mNormalSpeed = field_0x3480;
}
mProcVar5.field_0x3012 = 1;
} else {
mProcVar5.field_0x3012 = 0;
}
}
return 1;
}
/* 800DDE58-800DDF2C 0D8798 00D4+00 2/2 0/0 0/0 .text procGuardBreakInit__9daAlink_cFv */
int daAlink_c::procGuardBreakInit() {
// NONMATCHING
return 0;
commonProcInit(PROC_GUARD_BREAK);
setSingleAnimeParam(ANM_GUARD_BREAK, &daAlinkHIO_guard_c0::m.mGuardBreakAnm);
if (mEquipItem == IRONBALL) {
deleteEquipItem(0, 0);
}
mNormalSpeed = 0.0f;
field_0x3588 = l_halfAtnWaitBaseAnime;
dComIfGp_getVibration().StartShock(5, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
voiceStart(Z2SE_AL_V_GUARD_BROKEN);
return 1;
}
/* 800DDF2C-800DE008 0D886C 00DC+00 1/0 0/0 0/0 .text procGuardBreak__9daAlink_cFv */
int daAlink_c::procGuardBreak() {
// NONMATCHING
return 0;
daPy_frameCtrl_c* temp_r30 = &mUnderFrameCtrl[0];
setUpperGuardAnime(-1.0f);
onEndResetFlg0(ERFLG0_UNK_8000000);
field_0x2f99 = 4;
if (checkAnmEnd(temp_r30)) {
if (checkGuardActionChange() == 0) {
onEndResetFlg1(ERFLG1_UNK_20);
}
checkNextAction(0);
} else if (temp_r30->getFrame() > daAlinkHIO_guard_c0::m.mGuardBreakAnm.mCheckFrame) {
if (!checkGuardActionChange()) {
onEndResetFlg1(ERFLG1_UNK_20);
}
onModeFlg(4);
checkNextAction(1);
}
return 1;
}
/* 800DE008-800DE380 0D8948 0378+00 2/2 0/0 0/0 .text procTurnMoveInit__9daAlink_cFi */
int daAlink_c::procTurnMoveInit(int param_0) {
// NONMATCHING
return 0;
BOOL temp_r27 = checkUpperGuardAnime();
fopAc_ac_c* temp_r28 = mTargetedActor;
commonProcInit(PROC_TURN_MOVE);
mNormalSpeed = 0.0f;
daAlink_ANM var_r29;
if (param_0 == 2) {
var_r29 = ANM_SIDE_ROLL_LEFT;
} else if (param_0 == 3) {
var_r29 = ANM_SIDE_ROLL_RIGHT;
} else if (checkInputOnR()) {
if ((s16)(field_0x2fe2 - shape_angle.y) >= 0) {
var_r29 = ANM_SIDE_ROLL_LEFT;
} else {
var_r29 = ANM_SIDE_ROLL_RIGHT;
}
} else {
var_r29 = ANM_SIDE_ROLL_LEFT;
}
f32 temp_f31 = daAlinkHIO_turnMove_c0::m.mTurnAnm.mSpeed;
mProcVar1.field_0x300a = daAlinkHIO_turnMove_c0::m.mMaxTurnSpeed;
if (checkNoResetFlg0(FLG0_UNDERWATER)) {
mProcVar1.field_0x300a = mProcVar1.field_0x300a * daAlinkHIO_magneBoots_c0::m.mWaterVelocityX;
}
setSingleAnime(var_r29, temp_f31, daAlinkHIO_turnMove_c0::m.mTurnAnm.mStartFrame, daAlinkHIO_turnMove_c0::m.mTurnAnm.mEndFrame, daAlinkHIO_turnMove_c0::m.mTurnAnm.mInterpolation);
if (var_r29 == ANM_SIDE_ROLL_LEFT) {
mProcVar2.field_0x300c = -0x7FF0;
field_0x2f98 = 2;
} else {
mProcVar2.field_0x300c = 0x7FF0;
field_0x2f98 = 3;
}
if (temp_r28 != NULL) {
cXyz sp8 = current.pos - temp_r28->current.pos;
shape_angle.y = fopAcM_searchActorAngleY(this, temp_r28);
field_0x3478 = sp8.absXZ();
mProcVar3.field_0x300e = sp8.atan2sX_Z();
} else {
field_0x3478 = 200.0f;
mProcVar3.field_0x300e = shape_angle.y + 0x8000;
}
field_0x347c = (field_0x3478 - 150.0f) / mProcVar2.field_0x300c;
voiceStart(Z2SE_AL_V_SOTOMO_ROLL);
if (mDemo.getDemoMode() == 0x52) {
mProcVar0.field_0x3008 = 1;
} else {
mProcVar0.field_0x3008 = 0;
}
setFootEffectProcType(0);
field_0x2f9d = 4;
dComIfGp_setPlayerStatus0(0, 4);
if (temp_r27 != 0) {
onNoResetFlg0(FLG0_UNK_2);
}
return 1;
}
/* 800DE380-800DE64C 0D8CC0 02CC+00 1/0 0/0 0/0 .text procTurnMove__9daAlink_cFv */
int daAlink_c::procTurnMove() {
// NONMATCHING
return 0;
onEndResetFlg0(ERFLG0_UNK_8000000);
s16 temp_r28 = mProcVar2.field_0x300c;
cLib_addCalcAngleS(&mProcVar2.field_0x300c, 0, daAlinkHIO_turnMove_c0::m.mTurnSpeedRate, mProcVar1.field_0x300a, daAlinkHIO_turnMove_c0::m.mMinTurnSpeed);
s16 temp_r29 = temp_r28 - mProcVar2.field_0x300c;
if (temp_r28 > 0) {
current.angle.y = mProcVar3.field_0x300e + 0x4000;
} else {
current.angle.y = mProcVar3.field_0x300e - 0x4000;
}
f32 temp_f31 = current.pos.x - (field_0x3478 * cM_ssin(mProcVar3.field_0x300e));
f32 temp_f30 = current.pos.z - (field_0x3478 * cM_scos(mProcVar3.field_0x300e));
mProcVar3.field_0x300e += temp_r29;
field_0x3478 -= field_0x347c * temp_r29;
current.pos.x = temp_f31 + (field_0x3478 * cM_ssin(mProcVar3.field_0x300e));
current.pos.z = temp_f30 + (field_0x3478 * cM_scos(mProcVar3.field_0x300e));
shape_angle.y = mProcVar3.field_0x300e + 0x8000;
mProcVar0.field_0x3008 |= checkCutFinishJumpUp();
daPy_frameCtrl_c* temp_r30 = &mUnderFrameCtrl[0];
if (checkNoResetFlg0(FLG0_UNK_2)) {
setUpperGuardAnime(-1.0f);
}
if (checkAnmEnd(temp_r30)) {
if (!checkAttentionLock()) {
offNoResetFlg2(FLG2_UNK_8000000);
}
checkNextAction(0);
} else if (mProcVar0.field_0x3008 != 0 && !checkNotJumpSinkLimit() && temp_r30->getFrame() > daAlinkHIO_turnMove_c0::m.mTwirlCutDelayF) {
procCutFinishJumpUpInit();
dComIfGp_setPlayerStatus0(0, 4);
} else {
if (temp_r30->getFrame() > daAlinkHIO_turnMove_c0::m.mTurnAnm.mCheckFrame) {
onModeFlg(4);
if (checkNextAction(1)) {
return 1;
}
}
if (temp_r30->checkPass(19.0f)) {
dComIfGp_getVibration().StartShock(1, 1, cXyz(0.0f, 1.0f, 0.0f));
}
if (abs(temp_r29) > 0x100) {
field_0x2f9d = 4;
}
}
return 1;
}
+5 -9
View File
@@ -826,7 +826,6 @@ int daAlink_c::setSyncHorse(int param_0) {
}
/* 800EE64C-800EE918 0E8F8C 02CC+00 1/1 0/0 0/0 .text setSyncBoar__9daAlink_cFi */
// NONMATCHING - regalloc, equivalent? NONMATCHING
int daAlink_c::setSyncBoar(int param_0) {
e_wb_class* e_wb_p = static_cast<e_wb_class*>(mRideAcKeep.getActor());
BOOL mode_1 = checkModeFlg(1);
@@ -1021,7 +1020,6 @@ void daAlink_c::setHorseSwordUp(int param_0) {
/* 800EEF30-800EF050 0E9870 0120+00 9/9 0/0 0/0 .text setRideSubjectAngle__9daAlink_cFs
*/
// NONMATCHING - cLib_minMaxLimit regalloc
int daAlink_c::setRideSubjectAngle(s16 param_0) {
shape_angle.y += mBodyAngle.y;
BOOL temp_r27 = setBodyAngleToCamera();
@@ -1033,11 +1031,11 @@ int daAlink_c::setRideSubjectAngle(s16 param_0) {
var_r30 = daAlinkHIO_horse_c0::m.field_0x58;
}
mBodyAngle.x = cLib_minMaxLimit<s16>(mBodyAngle.x, daAlinkHIO_horse_c0::m.field_0x5A, var_r30);
mBodyAngle.x = cLib_minMaxLimit<s16>((s16)mBodyAngle.x, daAlinkHIO_horse_c0::m.field_0x5A, var_r30);
s16 temp_r29 = shape_angle.y - param_0;
if (checkHorseZelda()) {
field_0x3190 = cLib_minMaxLimit<s16>(temp_r29, -0x4000, 0x4000);
field_0x3190 = cLib_minMaxLimit<s16>((s16)temp_r29, -0x4000, 0x4000);
} else {
field_0x3190 = temp_r29;
}
@@ -1055,15 +1053,14 @@ int daAlink_c::setRideSubjectAngle(s16 param_0) {
}
/* 800EF050-800EF0E8 0E9990 0098+00 7/7 0/0 0/0 .text setBodyAngleRideReadyAnime__9daAlink_cFv */
// NONMATCHING - missing mr, probably issue with cLib_minMaxLimit implementation
void daAlink_c::setBodyAngleRideReadyAnime() {
setBodyAngleXReadyAnime(0);
s16 angle;
if (mTargetedActor != NULL) {
angle = cLib_minMaxLimit(
(s16)(cLib_targetAngleY(&current.pos, &mTargetedActor->eyePos) - shape_angle.y),
(s16)-0x3800, (s16)0x3800);
angle = cLib_minMaxLimit<s16>(
cLib_targetAngleY(&current.pos, &mTargetedActor->eyePos) - shape_angle.y,
-0x3800, 0x3800);
} else {
angle = 0;
}
@@ -2200,7 +2197,6 @@ int daAlink_c::procHorseCutTurn() {
/* 800F1D18-800F2028 0EC658 0310+00 2/2 0/0 0/0 .text
* procHorseDamageInit__9daAlink_cFP12dCcD_GObjInf */
// NONMATCHING - cLib_minMaxLimit regalloc
int daAlink_c::procHorseDamageInit(dCcD_GObjInf* param_0) {
commonProcInit(PROC_HORSE_DAMAGE);
-1
View File
@@ -108,7 +108,6 @@ bool daAlink_c::checkKandelaarSwing(int param_0) const {
}
/* 801108EC-80110BEC 10B22C 0300+00 1/1 0/0 0/0 .text kandelaarModelCallBack__9daAlink_cFv */
// NONMATCHING - regalloc from cLib_minMaxLimit
int daAlink_c::kandelaarModelCallBack() {
cXyz sp44;
mDoMtx_multVecZero(J3DSys::mCurrentMtx, &sp44);
+232 -6
View File
@@ -273,7 +273,7 @@ int daAlink_c::procMove() {
setBlendMoveAnime(-1.0f);
if (field_0x3174 != 8) {
field_0x30a0 =
cLib_minMaxLimit2((s16)(field_0x2ff0 >> 1), daAlinkHIO_basic_c0::m.mNeckMaxUp,
cLib_minMaxLimit<s16>((s16)(field_0x2ff0 >> 1), daAlinkHIO_basic_c0::m.mNeckMaxUp,
daAlinkHIO_basic_c0::m.mNeckMaxDown);
}
}
@@ -656,7 +656,7 @@ int daAlink_c::procSlide() {
if (checkInputOnR()) {
mProcVar2.field_0x300c =
cLib_minMaxLimit2<s16>((s16)(mProcVar2.field_0x300c + sin * 256.0f), -0x1000, 0x1000);
cLib_minMaxLimit<s16>((s16)(mProcVar2.field_0x300c + sin * 256.0f), -0x1000, 0x1000);
} else {
cLib_chaseS(&mProcVar2.field_0x300c, 0, 64);
}
@@ -3677,7 +3677,160 @@ int daAlink_c::moveShadowScaleLight() {
/* 800CBC18-800CC25C 0C6558 0644+00 1/1 0/0 0/0 .text shadowDraw__9daAlink_cFv */
void daAlink_c::shadowDraw() {
// NONMATCHING
daMidna_c* temp_r3 = getMidnaActor();
if (temp_r3 != NULL && ((temp_r3->checkShadowModelDraw() && (field_0x2ff4 >= 0x3FF0 || !checkMidnaRide())) || temp_r3->checkShadowModelDrawDemoForce())) {
return;
}
if (!checkBoarRide()) {
if (mProcID == PROC_WARP) {
tevStr.field_0x344 = field_0x3484;
}
u32 var_r29;
if (checkHorseRide()) {
var_r29 = ((daHorse_c*)dComIfGp_getHorseActor())->getShadowID();
if (var_r29 != 0) {
dComIfGd_addRealShadow(var_r29, mpLinkModel);
}
} else {
f32 var_f31;
if (checkModeFlg(0x40)) {
var_f31 = field_0x33d8;
} else {
var_f31 = mLinkAcch.GetGroundH();
}
cXyz spC(field_0x3834.x, field_0x3454, field_0x3834.z);
f32 var_f30;
if (!checkWolf()) {
if (field_0x850[0].GetC().y > field_0x850[2].GetC().y) {
var_f30 = field_0x850[2].GetC().y;
} else {
var_f30 = field_0x850[0].GetC().y;
}
} else {
var_f30 = field_0x850[0].GetC().y;
}
s8 sp8;
if (mWaterY > var_f31) {
sp8 = 1;
} else {
sp8 = 0;
}
field_0x31a4 = dComIfGd_setShadow(field_0x31a4, sp8, mpLinkModel, &spC, 800.0f, 0.0f, var_f30, var_f31, mLinkAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
var_r29 = field_0x31a4;
}
if (var_r29 != 0) {
if (checkSwordDraw()) {
if (!checkNoResetFlg3(FLG3_UNK_80000000)) {
dComIfGd_addRealShadow(var_r29, mSwordModel);
}
if (!checkWoodSwordEquip()) {
dComIfGd_addRealShadow(var_r29, mSheathModel);
}
}
if (checkShieldDraw()) {
dComIfGd_addRealShadow(var_r29, mShieldModel);
}
if (checkWolf()) {
if (checkMidnaRide() && !checkCloudSea() && !temp_r3->checkShadowNoDraw() && !temp_r3->checkShadowModelDraw()) {
dComIfGd_addRealShadow(var_r29, mpWlMidnaModel);
if (!temp_r3->checkNoMaskDraw() ) {
dComIfGd_addRealShadow(var_r29, mpWlMidnaMaskModel);
}
dComIfGd_addRealShadow(var_r29, mpWlMidnaHairModel);
}
} else {
dComIfGd_addRealShadow(var_r29, mpLinkFaceModel);
dComIfGd_addRealShadow(var_r29, mpLinkHatModel);
dComIfGd_addRealShadow(var_r29, mpLinkHandModel);
if (field_0x2f92 == 0xFB) {
dComIfGd_addRealShadow(var_r29, mpDemoHLTmpModel);
}
if (field_0x2f93 == 0xFB) {
dComIfGd_addRealShadow(var_r29, mpDemoHRTmpModel);
}
if (mEquipItem == BOOMERANG) {
if (mItemAcKeep.getActor() != NULL) {
dComIfGd_addRealShadow(var_r29, mItemAcKeep.getActor()->model);
}
} else if (checkItemDraw()) {
if (mEquipItem == IRONBALL) {
if (mItemVar0.field_0x3018 == 0 || mItemVar0.field_0x3018 == 8) {
dComIfGd_addRealShadow(var_r29, mHeldItemModel);
} else {
if (fopAcM_gc_c::gndCheck(&mIronBallBgChkPos)) {
field_0x32d4 = dComIfGd_setShadow(field_0x32d4, 0, mHeldItemModel, &mIronBallCenterPos, 150.0f, 32.0f, mIronBallBgChkPos.y, fopAcM_gc_c::getGroundY(), *fopAcM_gc_c::getGroundCheck(), &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
}
}
} else {
changeHookshotDrawModel();
dComIfGd_addRealShadow(var_r29, mHeldItemModel);
if (checkHookshotItem(mEquipItem)) {
if (checkHookshotWait() && !dComIfGp_checkPlayerStatus1(0, 0x10000)) {
dComIfGd_addRealShadow(var_r29, mpHookTipModel);
}
if (mEquipItem == W_HOOKSHOT && !checkPlayerGuardAndAttack() && !checkNoResetFlg0(FLG0_UNK_2)) {
dComIfGd_addRealShadow(var_r29, field_0x0710);
if (!dComIfGp_checkPlayerStatus1(0, 0x10000)) {
dComIfGd_addRealShadow(var_r29, field_0x0714);
}
}
}
changeHookshotDrawModel();
}
}
if (checkNoResetFlg2(FLG2_UNK_1)) {
dComIfGd_addRealShadow(var_r29, mpKanteraModel);
}
if (checkEquipHeavyBoots()) {
for (int i = 0; i < 2; i++) {
dComIfGd_addRealShadow(var_r29, mpLinkBootModels[i]);
}
}
if (checkSpinnerRide()) {
fopAc_ac_c* temp_r3_6 = fopAcM_SearchByID(mRideAcKeep.getID());
if (temp_r3_6 != NULL) {
dComIfGd_addRealShadow(var_r29, temp_r3_6->model);
}
}
}
if (mGrabItemAcKeep.getID() != fpcM_ERROR_PROCESS_ID_e) {
fopAc_ac_c* temp_r3_7 = fopAcM_SearchByID(mGrabItemAcKeep.getID());
if (temp_r3_7 != NULL && temp_r3_7->model != NULL) {
dComIfGd_addRealShadow(var_r29, temp_r3_7->model);
}
}
if (dComIfGp_checkPlayerStatus1(0, 0x10000) && mCargoCarryAcKeep.getID() != fpcM_ERROR_PROCESS_ID_e) {
fopAc_ac_c* temp_r3_8 = fopAcM_SearchByID(mCargoCarryAcKeep.getID());
if (temp_r3_8 != NULL && temp_r3_8->model != NULL) {
dComIfGd_addRealShadow(var_r29, temp_r3_8->model);
}
}
}
}
}
/* 800CC25C-800CC298 0C6B9C 003C+00 3/3 0/0 0/0 .text modelCalc__9daAlink_cFP8J3DModel */
@@ -4224,13 +4377,86 @@ int daAlink_c::checkSubjectAction() {
}
/* 800CE728-800CE8A0 0C9068 0178+00 1/1 0/0 0/0 .text checkBodyAngleX__9daAlink_cFs */
void daAlink_c::checkBodyAngleX(s16 param_0) {
// NONMATCHING
s16 daAlink_c::checkBodyAngleX(s16 param_0) {
if (checkWolf() || mProcID == PROC_PEEP_SUBJECTIVITY || mProcID == PROC_HOOKSHOT_WALL_SHOOT) {
return param_0;
}
Vec sp2C = {0.0f, 0.0f, 0.0f};
sp2C.y = 0.5f * field_0x598;
cXyz sp20;
mDoMtx_multVecZero(mpLinkModel->getAnmMtx(1), &sp20);
cXyz sp14;
if (param_0 >= 0) {
sp2C.z = 25.0f;
} else {
sp2C.z = -25.0f;
}
mDoMtx_stack_c::transS(sp20);
concatMagneBootMtx();
mDoMtx_stack_c::ZXYrotM(param_0, shape_angle.y, 0);
mDoMtx_stack_c::multVec(&sp2C, &sp14);
if (commonLineCheck(&sp20, &sp14)) {
cXyz sp8 = sp14 - mLinkLinChk.i_GetCross();
multVecMagneBootInvMtx(&sp8);
current.pos.x -= sp8.x;
current.pos.z -= sp8.z;
}
return param_0;
}
/* 800CE8A0-800CEAF4 0C91E0 0254+00 15/15 0/0 0/0 .text setBodyAngleToCamera__9daAlink_cFv */
BOOL daAlink_c::setBodyAngleToCamera() {
// NONMATCHING
if (dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x10)) {
field_0x310e = field_0x310a;
field_0x3110 = field_0x310c;
onEndResetFlg2(ERFLG2_UNK_20);
s16 sp8;
if (checkInputOnR()) {
f32 var_f31 = 512.0f * field_0x33ac * field_0x33ac;
if (checkWolfEyeUp()) {
var_f31 *= 0.6f;
}
if (dComIfGp_checkPlayerStatus0(0, 0x200000)) {
var_f31 /= dComIfGp_getCameraZoomScale(field_0x317c);
}
shape_angle.y = shape_angle.y + (var_f31 * cM_ssin(mStickAngle));
sp8 = mBodyAngle.x + (var_f31 * cM_scos(mStickAngle));
if (checkNotItemSinkLimit() && sp8 > 0 && sp8 > mBodyAngle.x) {
sp8 = mBodyAngle.x;
}
} else {
sp8 = mBodyAngle.x;
}
if (checkNotItemSinkLimit() && sp8 > 0) {
cLib_addCalcAngleS(&sp8, 0, 5, 0x1000, 0x400);
}
s16 var_r29;
if (!dComIfGp_checkPlayerStatus0(0, 0x202000) && mEquipItem == IRONBALL) {
var_r29 = -10000;
} else {
var_r29 = daAlinkHIO_item_c0::m.mItemFPUpMaxUnk;
}
mBodyAngle.x = cLib_minMaxLimit<s16>((s16)sp8, var_r29, daAlinkHIO_item_c0::m.mItemFPMaxUnk);
checkBodyAngleX(mBodyAngle.x);
field_0x310a = mBodyAngle.x;
field_0x310c = shape_angle.y;
return 1;
}
return 0;
}
-1
View File
@@ -1414,7 +1414,6 @@ int daAlink_c::procSwimHookshotMove() {
/* 8010519C-80105728 0FFADC 058C+00 1/1 0/0 0/0 .text
* procSwimDamageInit__9daAlink_cFP12dCcD_GObjInf */
// NONMATCHING - cLib_minMaxLimit regalloc issue
int daAlink_c::procSwimDamageInit(dCcD_GObjInf* param_0) {
seStartOnlyReverb(Z2SE_AL_DAMAGE_NORMAL);
dComIfGp_getVibration().StartShock(2, 31, cXyz(0.0f, 1.0f, 0.0f));
File diff suppressed because it is too large Load Diff
+37 -926
View File
File diff suppressed because it is too large Load Diff
+5 -2129
View File
File diff suppressed because it is too large Load Diff
+4 -4699
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -52,7 +52,7 @@ void dEyeHL_mng_c::update() {
for (; obj != NULL; obj = obj->m_next) {
ResTIMG* timg = obj->m_timg;
timg->LODBias = obj->m_lodBias + tmp;
timg->LODBias = cLib_minMaxLimit<s16>(timg->LODBias, -400, 399);
timg->LODBias = cLib_minMaxLimit<s16>((s16)timg->LODBias, -400, 399);
}
}
}
@@ -113,4 +113,4 @@ u8 struct_80450FB8[4];
extern u8 struct_80450FBC[4];
u8 struct_80450FBC[4];
/* 8037B100-8037B100 007760 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
/* 8037B100-8037B100 007760 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+419
View File
@@ -0,0 +1,419 @@
from argparse import ArgumentParser
import struct
import os
from enum import Enum
class GXBPRegs(Enum):
GX_BP_REG_GENMODE = 0x0
GX_BP_REG_DISPCOPYFILTER0 = 0x1
GX_BP_REG_DISPCOPYFILTER1 = 0x2
GX_BP_REG_DISPCOPYFILTER2 = 0x3
GX_BP_REG_DISPCOPYFILTER3 = 0x4
GX_BP_REG_INDMTX0A = 0x6
GX_BP_REG_INDMTX0B = 0x7
GX_BP_REG_INDMTX0C = 0x8
GX_BP_REG_INDMTX1A = 0x9
GX_BP_REG_INDMTX1B = 0xA
GX_BP_REG_INDMTX1C = 0xB
GX_BP_REG_INDMTX2A = 0xC
GX_BP_REG_INDMTX2B = 0xD
GX_BP_REG_INDMTX2C = 0xE
GX_BP_REG_INDIMASK = 0xF
GX_BP_REG_INDTEVSTAGE0 = 0x10
GX_BP_REG_INDTEVSTAGE1 = 0x11
GX_BP_REG_INDTEVSTAGE2 = 0x12
GX_BP_REG_INDTEVSTAGE3 = 0x13
GX_BP_REG_INDTEVSTAGE4 = 0x14
GX_BP_REG_INDTEVSTAGE5 = 0x15
GX_BP_REG_INDTEVSTAGE6 = 0x16
GX_BP_REG_INDTEVSTAGE7 = 0x17
GX_BP_REG_INDTEVSTAGE8 = 0x18
GX_BP_REG_INDTEVSTAGE9 = 0x19
GX_BP_REG_INDTEVSTAGE10 = 0x1A
GX_BP_REG_INDTEVSTAGE11 = 0x1B
GX_BP_REG_INDTEVSTAGE12 = 0x1C
GX_BP_REG_INDTEVSTAGE13 = 0x1D
GX_BP_REG_INDTEVSTAGE14 = 0x1E
GX_BP_REG_INDTEVSTAGE15 = 0x1F
GX_BP_REG_SCISSORTL = 0x20
GX_BP_REG_SCISSORBR = 0x21
GX_BP_REG_LINEPTWIDTH = 0x22
GX_BP_REG_PERF0TRI = 0x23
GX_BP_REG_PERF0QUAD = 0x24
GX_BP_REG_RAS1_SS0 = 0x25
GX_BP_REG_RAS1_SS1 = 0x26
GX_BP_REG_RAS1_IREF = 0x27
GX_BP_REG_RAS1_TREF0 = 0x28
GX_BP_REG_RAS1_TREF1 = 0x29
GX_BP_REG_RAS1_TREF2 = 0x2A
GX_BP_REG_RAS1_TREF3 = 0x2B
GX_BP_REG_RAS1_TREF4 = 0x2C
GX_BP_REG_RAS1_TREF5 = 0x2D
GX_BP_REG_RAS1_TREF6 = 0x2E
GX_BP_REG_RAS1_TREF7 = 0x2F
GX_BP_REG_SU_SSIZE0 = 0x30
GX_BP_REG_SU_TSIZE0 = 0x31
GX_BP_REG_SU_SSIZE1 = 0x32
GX_BP_REG_SU_TSIZE1 = 0x33
GX_BP_REG_SU_SSIZE2 = 0x34
GX_BP_REG_SU_TSIZE2 = 0x35
GX_BP_REG_SU_SSIZE3 = 0x36
GX_BP_REG_SU_TSIZE3 = 0x37
GX_BP_REG_SU_SSIZE4 = 0x38
GX_BP_REG_SU_TSIZE4 = 0x39
GX_BP_REG_SU_SSIZE5 = 0x3A
GX_BP_REG_SU_TSIZE5 = 0x3B
GX_BP_REG_SU_SSIZE6 = 0x3C
GX_BP_REG_SU_TSIZE6 = 0x3D
GX_BP_REG_SU_SSIZE7 = 0x3E
GX_BP_REG_SU_TSIZE7 = 0x3F
GX_BP_REG_ZMODE = 0x40
GX_BP_REG_BLENDMODE = 0x41
GX_BP_REG_DSTALPHA = 0x42
GX_BP_REG_ZCONTROL = 0x43
GX_BP_REG_FIELDMASK = 0x44
GX_BP_REG_DRAWDONE = 0x45
GX_BP_REG_PETOKEN = 0x47
GX_BP_REG_PETOKENINT = 0x48
GX_BP_REG_TEXCOPYSRCXY = 0x49
GX_BP_REG_TEXCOPYSRCWH = 0x4A
GX_BP_REG_TEXCOPYDST = 0x4B
GX_BP_REG_DISPCOPYSTRIDE = 0x4D
GX_BP_REG_DISPCOPYSCALEY = 0x4E
GX_BP_REG_COPYCLEARAR = 0x4F
GX_BP_REG_COPYCLEARGB = 0x50
GX_BP_REG_COPYCLEARZ = 0x51
GX_BP_REG_COPYFILTER0 = 0x53
GX_BP_REG_COPYFILTER1 = 0x54
GX_BP_REG_BOUNDINGBOX0 = 0x55
GX_BP_REG_BOUNDINGBOX1 = 0x56
GX_BP_REG_SCISSOROFFSET = 0x59
GX_BP_REG_TMEMPRELOADADDR = 0x60
GX_BP_REG_TMEMPRELOADEVEN = 0x61
GX_BP_REG_TMEMPRELOADODD = 0x62
GX_BP_REG_TMEMPRELOADMODE = 0x63
GX_BP_REG_TMEMTLUTSRC = 0x64
GX_BP_REG_TMEMTLUTDST = 0x65
GX_BP_REG_TMEMTEXINVALIDATE = 0x66
GX_BP_REG_PERF1 = 0x67
GX_BP_REG_FIELDMODE = 0x68
GX_BP_REG_SETMODE0_TEX0 = 0x80
GX_BP_REG_SETMODE0_TEX1 = 0x81
GX_BP_REG_SETMODE0_TEX2 = 0x82
GX_BP_REG_SETMODE0_TEX3 = 0x83
GX_BP_REG_SETMODE1_TEX0 = 0x84
GX_BP_REG_SETMODE1_TEX1 = 0x85
GX_BP_REG_SETMODE1_TEX2 = 0x86
GX_BP_REG_SETMODE1_TEX3 = 0x87
GX_BP_REG_SETIMAGE0_TEX0 = 0x88
GX_BP_REG_SETIMAGE0_TEX1 = 0x89
GX_BP_REG_SETIMAGE0_TEX2 = 0x8A
GX_BP_REG_SETIMAGE0_TEX3 = 0x8B
GX_BP_REG_SETIMAGE1_TEX0 = 0x8C
GX_BP_REG_SETIMAGE1_TEX1 = 0x8D
GX_BP_REG_SETIMAGE1_TEX2 = 0x8E
GX_BP_REG_SETIMAGE1_TEX3 = 0x8F
GX_BP_REG_SETIMAGE2_TEX0 = 0x90
GX_BP_REG_SETIMAGE2_TEX1 = 0x91
GX_BP_REG_SETIMAGE2_TEX2 = 0x92
GX_BP_REG_SETIMAGE2_TEX3 = 0x93
GX_BP_REG_SETIMAGE3_TEX0 = 0x94
GX_BP_REG_SETIMAGE3_TEX1 = 0x95
GX_BP_REG_SETIMAGE3_TEX2 = 0x96
GX_BP_REG_SETIMAGE3_TEX3 = 0x97
GX_BP_REG_SETTLUT_TEX0 = 0x98
GX_BP_REG_SETTLUT_TEX1 = 0x99
GX_BP_REG_SETTLUT_TEX2 = 0x9A
GX_BP_REG_SETTLUT_TEX3 = 0x9B
GX_BP_REG_SETMODE0_TEX4 = 0xA0
GX_BP_REG_SETMODE0_TEX5 = 0xA1
GX_BP_REG_SETMODE0_TEX6 = 0xA2
GX_BP_REG_SETMODE0_TEX7 = 0xA3
GX_BP_REG_SETMODE1_TEX4 = 0xA4
GX_BP_REG_SETMODE1_TEX5 = 0xA5
GX_BP_REG_SETMODE1_TEX6 = 0xA6
GX_BP_REG_SETMODE1_TEX7 = 0xA7
GX_BP_REG_SETIMAGE0_TEX4 = 0xA8
GX_BP_REG_SETIMAGE0_TEX5 = 0xA9
GX_BP_REG_SETIMAGE0_TEX6 = 0xAA
GX_BP_REG_SETIMAGE0_TEX7 = 0xAB
GX_BP_REG_SETIMAGE1_TEX4 = 0xAC
GX_BP_REG_SETIMAGE1_TEX5 = 0xAD
GX_BP_REG_SETIMAGE1_TEX6 = 0xAE
GX_BP_REG_SETIMAGE1_TEX7 = 0xAF
GX_BP_REG_SETIMAGE2_TEX4 = 0xB0
GX_BP_REG_SETIMAGE2_TEX5 = 0xB1
GX_BP_REG_SETIMAGE2_TEX6 = 0xB2
GX_BP_REG_SETIMAGE2_TEX7 = 0xB3
GX_BP_REG_SETIMAGE3_TEX4 = 0xB4
GX_BP_REG_SETIMAGE3_TEX5 = 0xB5
GX_BP_REG_SETIMAGE3_TEX6 = 0xB6
GX_BP_REG_SETIMAGE3_TEX7 = 0xB7
GX_BP_REG_SETTLUT_TEX4 = 0xB8
GX_BP_REG_SETTLUT_TEX5 = 0xB9
GX_BP_REG_SETTLUT_TEX6 = 0xBA
GX_BP_REG_SETTLUT_TEX7 = 0xBB
GX_BP_REG_TEVCOLORCOMBINER0 = 0xC0
GX_BP_REG_TEVALPHACOMBINER0 = 0xC1
GX_BP_REG_TEVCOLORCOMBINER1 = 0xC2
GX_BP_REG_TEVALPHACOMBINER1 = 0xC3
GX_BP_REG_TEVCOLORCOMBINER2 = 0xC4
GX_BP_REG_TEVALPHACOMBINER2 = 0xC5
GX_BP_REG_TEVCOLORCOMBINER3 = 0xC6
GX_BP_REG_TEVALPHACOMBINER3 = 0xC7
GX_BP_REG_TEVCOLORCOMBINER4 = 0xC8
GX_BP_REG_TEVALPHACOMBINER4 = 0xC9
GX_BP_REG_TEVCOLORCOMBINER5 = 0xCA
GX_BP_REG_TEVALPHACOMBINER5 = 0xCB
GX_BP_REG_TEVCOLORCOMBINER6 = 0xCC
GX_BP_REG_TEVALPHACOMBINER6 = 0xCD
GX_BP_REG_TEVCOLORCOMBINER7 = 0xCE
GX_BP_REG_TEVALPHACOMBINER7 = 0xCF
GX_BP_REG_TEVCOLORCOMBINER8 = 0xD0
GX_BP_REG_TEVALPHACOMBINER8 = 0xD1
GX_BP_REG_TEVCOLORCOMBINER9 = 0xD2
GX_BP_REG_TEVALPHACOMBINER9 = 0xD3
GX_BP_REG_TEVCOLORCOMBINER10 = 0xD4
GX_BP_REG_TEVALPHACOMBINER10 = 0xD5
GX_BP_REG_TEVCOLORCOMBINER11 = 0xD6
GX_BP_REG_TEVALPHACOMBINER11 = 0xD7
GX_BP_REG_TEVCOLORCOMBINER12 = 0xD8
GX_BP_REG_TEVALPHACOMBINER12 = 0xD9
GX_BP_REG_TEVCOLORCOMBINER13 = 0xDA
GX_BP_REG_TEVALPHACOMBINER13 = 0xDB
GX_BP_REG_TEVCOLORCOMBINER14 = 0xDC
GX_BP_REG_TEVALPHACOMBINER14 = 0xDD
GX_BP_REG_TEVCOLORCOMBINER15 = 0xDE
GX_BP_REG_TEVALPHACOMBINER15 = 0xDF
GX_BP_REG_TEVREG0LO = 0xE0
GX_BP_REG_TEVREG0HI = 0xE1
GX_BP_REG_TEVREG1LO = 0xE2
GX_BP_REG_TEVREG1HI = 0xE3
GX_BP_REG_TEVREG2LO = 0xE4
GX_BP_REG_TEVREG2HI = 0xE5
GX_BP_REG_TEVREG3LO = 0xE6
GX_BP_REG_TEVREG3HI = 0xE7
GX_BP_REG_FOGRANGE = 0xE8
GX_BP_REG_FOGRANGEK0 = 0xE9
GX_BP_REG_FOGRANGEK1 = 0xEA
GX_BP_REG_FOGRANGEK2 = 0xEB
GX_BP_REG_FOGRANGEK3 = 0xEC
GX_BP_REG_FOGRANGEK4 = 0xED
GX_BP_REG_FOGPARAM0 = 0xEE
GX_BP_REG_FOGPARAM1 = 0xEF
GX_BP_REG_FOGPARAM2 = 0xF0
GX_BP_REG_FOGPARAM3 = 0xF1
GX_BP_REG_FOGCOLOR = 0xF2
GX_BP_REG_ALPHACOMPARE = 0xF3
GX_BP_REG_ZTEXTURE0 = 0xF4
GX_BP_REG_ZTEXTURE1 = 0xF5
GX_BP_REG_TEVKSEL0 = 0xF6
GX_BP_REG_TEVKSEL1 = 0xF7
GX_BP_REG_TEVKSEL2 = 0xF8
GX_BP_REG_TEVKSEL3 = 0xF9
GX_BP_REG_TEVKSEL4 = 0xFA
GX_BP_REG_TEVKSEL5 = 0xFB
GX_BP_REG_TEVKSEL6 = 0xFC
GX_BP_REG_TEVKSEL7 = 0xFD
GX_BP_REG_SSMASK = 0xFE
class GXXFRegs(Enum):
GX_XF_REG_ERROR = 0x1000
GX_XF_REG_DIAGNOSTICS = 0x1001
GX_XF_REG_STATE0 = 0x1002
GX_XF_REG_STATE1 = 0x1003
GX_XF_REG_CLOCK = 0x1004
GX_XF_REG_CLIPDISABLE = 0x1005
GX_XF_REG_PERF0 = 0x1006
GX_XF_REG_PERF1 = 0x1007
GX_XF_REG_INVERTEXSPEC = 0x1008
GX_XF_REG_NUMCOLORS = 0x1009
GX_XF_REG_AMBIENT0 = 0x100A
GX_XF_REG_AMBIENT1 = 0x100B
GX_XF_REG_MATERIAL0 = 0x100C
GX_XF_REG_MATERIAL1 = 0x100D
GX_XF_REG_COLOR0CNTRL = 0x100E
GX_XF_REG_COLOR1CNTRL = 0x100F
GX_XF_REG_ALPHA0CNTRL = 0x1010
GX_XF_REG_ALPHA1CNTRL = 0x1011
GX_XF_REG_DUALTEXTRAN = 0x1012
GX_XF_REG_MATRIXINDEX0 = 0x1018
GX_XF_REG_MATRIXINDEX1 = 0x1019
GX_XF_REG_SCALEX = 0x101A
GX_XF_REG_SCALEY = 0x101B
GX_XF_REG_SCALEZ = 0x101C
GX_XF_REG_OFFSETX = 0x101D
GX_XF_REG_OFFSETY = 0x101E
GX_XF_REG_OFFSETZ = 0x101F
GX_XF_REG_PROJECTIONA = 0x1020
GX_XF_REG_PROJECTIONB = 0x1021
GX_XF_REG_PROJECTIONC = 0x1022
GX_XF_REG_PROJECTIOND = 0x1023
GX_XF_REG_PROJECTIONE = 0x1024
GX_XF_REG_PROJECTIONF = 0x1025
GX_XF_REG_PROJECTORTHO = 0x1026
GX_XF_REG_NUMTEX = 0x103F
GX_XF_REG_TEX0 = 0x1040
GX_XF_REG_TEX1 = 0x1041
GX_XF_REG_TEX2 = 0x1042
GX_XF_REG_TEX3 = 0x1043
GX_XF_REG_TEX4 = 0x1044
GX_XF_REG_TEX5 = 0x1045
GX_XF_REG_TEX6 = 0x1046
GX_XF_REG_TEX7 = 0x1047
GX_XF_REG_DUALTEX0 = 0x1050
GX_XF_REG_DUALTEX1 = 0x1051
GX_XF_REG_DUALTEX2 = 0x1052
GX_XF_REG_DUALTEX3 = 0x1053
GX_XF_REG_DUALTEX4 = 0x1054
GX_XF_REG_DUALTEX5 = 0x1055
GX_XF_REG_DUALTEX6 = 0x1056
GX_XF_REG_DUALTEX7 = 0x1057
class GXCPRegs(Enum):
GX_CP_REG_MTXIDXA = 0x30
GX_CP_REG_MTXIDXB = 0x40
GX_CP_REG_VCD_LO = 0x50
GX_CP_REG_VCD_HI = 0x60
GX_CP_REG_VAT_GRP0 = 0x70
GX_CP_REG_VAT_GRP1 = 0x80
GX_CP_REG_VAT_GRP2 = 0x90
GX_CP_REG_ARRAYBASE = 0xA0
GX_CP_REG_ARRAYSTRIDE = 0xB0
def read_u8(binary_file):
chunk = binary_file.read(1)
if len(chunk) < 1:
return None
return struct.unpack(">B", chunk)[0]
def read_u16(binary_file):
chunk = binary_file.read(2)
if len(chunk) < 1:
return None
return struct.unpack(">H", chunk)[0]
def convert_binary_to_matDL_c_source(src_path, dest_path, symbol_name):
# Load data
macro_name = os.path.splitext(os.path.basename(src_path))[0]
with open(src_path, "rb") as binary_file, open(dest_path, "w") as c_file:
c_file.write("#ifndef LOAD_BP_REG\n")
c_file.write("#define U32_AS_U8(v) ((u8)((v) >> 24)), ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n")
c_file.write("#define U24_AS_U8(v) ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n")
c_file.write("#define U16_AS_U8(v) ((u8)((v) >> 8)), ((u8)((v) >> 0))\n")
c_file.write("#define IMAGE_ADDR(addr) (u32)(addr) >> 5\n")
c_file.write("#define LOAD_BP_REG(reg, value) GX_CMD_LOAD_BP_REG, reg, U24_AS_U8(value)\n")
c_file.write("#define LOAD_XF_REG(reg, num_args, ...) GX_CMD_LOAD_XF_REG, U16_AS_U8(num_args-1), U16_AS_U8(reg), __VA_ARGS__\n")
c_file.write("#define LOAD_CP_REG(reg, value) GX_CMD_LOAD_CP_REG, reg, U32_AS_U8(value)\n")
c_file.write("#endif\n\n")
def write_macro_line(line):
line_with_escape = line + (" "*(99-len(line))) + "\\\n"
c_file.write(line_with_escape)
write_macro_line(f"#define {macro_name}(TEX_NAME)")
write_macro_line(f"u8 {symbol_name}[] ALIGN_DECL(32) = {{")
while True:
print(binary_file.tell())
command_type = read_u8(binary_file)
if command_type is None:
break
line_elements = []
def add_byte_to_line(byte):
line_elements.append(f"0x{byte:02X}")
def add_string_to_line(string):
line_elements.append(string)
if command_type == 0x61:
# BP Command
register = GXBPRegs(read_u8(binary_file))
value = read_u8(binary_file) << 16 | read_u8(binary_file) << 8 | read_u8(binary_file) << 0
if register == GXBPRegs.GX_BP_REG_SETIMAGE3_TEX0:
value_string = f"IMAGE_ADDR(TEX_NAME)"
elif register == GXBPRegs.GX_BP_REG_SU_SSIZE0:
value_string = f"TEX_NAME ## __width"
elif register == GXBPRegs.GX_BP_REG_SU_TSIZE0:
value_string = f"TEX_NAME ## __height"
else:
value_string = f"0x{value:06X}"
add_string_to_line(f"LOAD_BP_REG({register.name}, {value_string})")
elif command_type == 0x10:
# XF Command
num_args = 1 + read_u16(binary_file)
assert num_args <= 0x10
register = GXXFRegs(read_u16(binary_file))
arg_bytes = []
for i in range(4 * num_args):
arg_bytes.append(read_u8(binary_file))
args_string = ", ".join(f"0x{byte:02X}" for byte in arg_bytes)
add_string_to_line(f"LOAD_XF_REG({register.name}, {num_args}, {args_string})")
elif command_type == 0x08:
# CP Command
register = GXCPRegs(read_u8(binary_file))
value = read_u8(binary_file) << 24 | read_u8(binary_file) << 16 | read_u8(binary_file) << 8 | read_u8(binary_file) << 0
add_string_to_line(f"LOAD_CP_REG({register.name}, 0x{value:08X})")
elif command_type == 0x00:
add_byte_to_line(command_type)
while len(line_elements) < 0x10:
byte = read_u8(binary_file)
assert byte == 0x00
add_byte_to_line(byte)
else:
raise Exception(f"Unknown command type: {command_type:02X}")
print(line_elements)
write_macro_line(" " + ", ".join(line_elements) + ",")
c_file.write("};\n")
def main():
parser = ArgumentParser(
description="Converts a binary file containing a material display list to a macro for defining an array of u8 type"
)
parser.add_argument("src_path", type=str, help="Binary source file path")
parser.add_argument("dest_path", type=str, help="Destination C include file path")
parser.add_argument("--symbol", type=str, help="Symbol name")
args = parser.parse_args()
convert_binary_to_matDL_c_source(args.src_path, args.dest_path, args.symbol)
if __name__ == "__main__":
main()