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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 5015 additions and 8034 deletions

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

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"),

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>

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 {

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;

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;

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];

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];

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;

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);

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;

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];
};

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,
};

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);

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);
}

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 */

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,
};

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);
}

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 */

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,

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;

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 */

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;

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

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;
}

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);

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);

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;
}

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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 */

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()