mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-03 19:10:19 -04:00
a169aac99f
* obj_iceleaf almost done * fix up d_a_alink procvars * more d_a_alink work * some d_a_alink error cleanup * some more cleanup
317 lines
10 KiB
C++
317 lines
10 KiB
C++
/**
|
|
* d_a_alink_guard.inc
|
|
* Player Shield action handling
|
|
*/
|
|
|
|
#include "d/actor/d_a_alink.h"
|
|
#include "d/d_com_inf_game.h"
|
|
|
|
/* 800DC548-800DC5A4 0D6E88 005C+00 13/13 0/0 0/0 .text checkEnemyGroup__9daAlink_cFP10fopAc_ac_c
|
|
*/
|
|
BOOL daAlink_c::checkEnemyGroup(fopAc_ac_c* i_actor) {
|
|
return i_actor != NULL && (fopAcM_GetGroup(i_actor) == fopAc_ENEMY_e ||
|
|
fopAcM_GetName(i_actor) == PROC_E_ZH || checkSpecialNpc(i_actor));
|
|
}
|
|
|
|
// properly setup later
|
|
class daNpc_Kn_c : public fopAc_ac_c {
|
|
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);
|
|
|
|
return ((name == PROC_NPC_KAKASHI || name == PROC_NPC_KN) &&
|
|
static_cast<daNpc_Kn_c*>(i_actor)->checkBattleMode()) ||
|
|
(name == PROC_OBJ_GRA && !static_cast<daObj_GrA_c*>(i_actor)->checkNpcObjGra());
|
|
}
|
|
|
|
/* 800DC5DC-800DC678 0D6F1C 009C+00 1/1 0/0 0/0 .text checkShieldAttackEmphasys__9daAlink_cFv */
|
|
BOOL daAlink_c::checkShieldAttackEmphasys() {
|
|
return mTargetedActor != NULL && (mTargetedActor->attention_info.flags & 0x200000) &&
|
|
!checkCutHeadState() &&
|
|
(fopAcM_GetGroup(mTargetedActor) != fopAc_ENEMY_e ||
|
|
!static_cast<fopEn_enemy_c*>(mTargetedActor)->checkDownFlg());
|
|
}
|
|
|
|
/* 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;
|
|
}
|
|
|
|
/* 800DC79C-800DC8C4 0D70DC 0128+00 3/3 0/0 0/0 .text stickArrowIncrement__9daAlink_cFi
|
|
*/
|
|
void daAlink_c::stickArrowIncrement(int param_0) {
|
|
if (!checkNoResetFlg2(FLG2_STATUS_WINDOW_DRAW)) {
|
|
s16 arrow_num = 0;
|
|
|
|
for (int i = 0; i < 16; i++) {
|
|
if (mShieldArrowIDs[i] != -1) {
|
|
if (field_0x2f7c[i] == 0 || param_0) {
|
|
arrow_num++;
|
|
mShieldArrowIDs[i] = -1;
|
|
field_0x2f7c[i] = 0;
|
|
} else {
|
|
field_0x2f7c[i]--;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (arrow_num != 0) {
|
|
if (i_checkShieldGet() && checkItemGet(BOW, true)) {
|
|
int arrow_type = arrow_num == 1 ? ARROW_1 : ARROW_10;
|
|
|
|
dComIfGp_setItemArrowNumCount(arrow_num);
|
|
fopAcM_createItemForSimpleDemo(¤t.pos, arrow_type, -1, NULL, NULL, 0.0f,
|
|
0.0f);
|
|
}
|
|
|
|
onResetFlg0(RFLG0_UNK_1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* 800DC8C4-800DCA2C 0D7204 0168+00 0/0 0/0 1/1 .text
|
|
* setArrowShieldActor__9daAlink_cFP10fopAc_ac_ci */
|
|
void daAlink_c::setArrowShieldActor(fopAc_ac_c* i_actor, int param_1) {
|
|
fpc_ProcID new_arrow_id = fopAcM_GetID(i_actor);
|
|
|
|
int arrow_num = 0;
|
|
for (; arrow_num < 16; arrow_num++) {
|
|
if (mShieldArrowIDs[arrow_num] == -1) {
|
|
mShieldArrowIDs[arrow_num] = new_arrow_id;
|
|
field_0x2f7c[arrow_num] = 10;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (arrow_num == 16) {
|
|
fopAc_ac_c* first_arrow = fopAcM_SearchByID(mShieldArrowIDs[0]);
|
|
if (first_arrow != NULL) {
|
|
fopAcM_delete(first_arrow);
|
|
}
|
|
|
|
int i = 0;
|
|
for (; i < 15; i++) {
|
|
mShieldArrowIDs[i] = mShieldArrowIDs[i + 1];
|
|
field_0x2f7c[i] = field_0x2f7c[i + 1];
|
|
}
|
|
|
|
mShieldArrowIDs[i] = new_arrow_id;
|
|
field_0x2f7c[i] = 10;
|
|
|
|
dComIfGp_setItemArrowNumCount(1);
|
|
fopAcM_createItemForSimpleDemo(¤t.pos, ARROW_10, -1, NULL, NULL, 0.0f, 0.0f);
|
|
}
|
|
|
|
if (param_1 && field_0x2fcb == 0 && !checkMagicArmorNoDamage()) {
|
|
field_0x2fcb = 120;
|
|
}
|
|
}
|
|
|
|
|
|
/* 800DCA2C-800DCA80 0D736C 0054+00 1/1 0/0 2/2 .text
|
|
* checkWoodShieldEquipNotIronBall__9daAlink_cCFv */
|
|
BOOL daAlink_c::checkWoodShieldEquipNotIronBall() const {
|
|
return checkWoodShieldEquip() && !checkIronBallEquip();
|
|
}
|
|
|
|
/* 800DCA80-800DCD74 0D73C0 02F4+00 0/0 0/0 1/1 .text
|
|
* getArrowShieldOffset__9daAlink_cCFPC4cXyzPC5csXyzP4cXyzP4cXyz */
|
|
void daAlink_c::getArrowShieldOffset(cXyz const* param_0, csXyz const* param_1, cXyz* param_2,
|
|
cXyz* param_3) const {
|
|
cXyz sp54;
|
|
mDoMtx_stack_c::ZXYrotS(param_1->x + cM_rndFX(0x1000), param_1->y + cM_rndFX(0x1000), 0);
|
|
mDoMtx_stack_c::multVec(&cXyz::BaseZ, &sp54);
|
|
mDoMtx_stack_c::copy(getShieldMtx());
|
|
mDoMtx_stack_c::inverse();
|
|
mDoMtx_stack_c::multVecSR(&sp54, param_3);
|
|
|
|
cXyz sp60;
|
|
mDoMtx_multVec(getShieldMtx(), &localCenter, &sp60);
|
|
|
|
cM3dGPla plane(&field_0x351c, -field_0x351c.inprod(sp60));
|
|
|
|
cXyz sp6C;
|
|
cXyz sp78 = *param_0 + sp54;
|
|
plane.crossInfLin(*param_0, sp78, sp6C);
|
|
|
|
if (sp6C.abs(sp60) > 20.0f) {
|
|
sp6C = sp6C - sp60;
|
|
sp6C.normalize();
|
|
sp6C *= 20.0f;
|
|
sp6C += sp60;
|
|
}
|
|
|
|
mDoMtx_stack_c::multVec(&sp6C, param_2);
|
|
}
|
|
|
|
|
|
/* 800DCD74-800DCDF0 0D76B4 007C+00 0/0 0/0 2/2 .text
|
|
* setArrowShieldPos__9daAlink_cCFP4cXyzP5csXyzPC4cXyzPC4cXyz */
|
|
void daAlink_c::setArrowShieldPos(cXyz* param_0, csXyz* param_1, cXyz const* param_2,
|
|
cXyz const* param_3) const {
|
|
cXyz sp1C;
|
|
|
|
mDoMtx_multVecSR(getShieldMtx(), param_3, &sp1C);
|
|
param_1->x = sp1C.atan2sY_XZ();
|
|
param_1->y = sp1C.atan2sX_Z();
|
|
|
|
mDoMtx_multVec(getShieldMtx(), param_2, param_0);
|
|
}
|
|
|
|
/* 800DCDF0-800DCE6C 0D7730 007C+00 17/17 0/0 0/0 .text checkUpperGuardAnime__9daAlink_cCFv */
|
|
BOOL daAlink_c::checkUpperGuardAnime() const {
|
|
return checkNoResetFlg2(FLG2_UNK_8000000) && !checkEventRun() &&
|
|
!checkNoResetFlg0(FLG0_UNK_2) && mProcID != PROC_GUARD_BREAK &&
|
|
mProcID != PROC_CUT_REVERSE && mProcID != PROC_GUARD_ATTACK;
|
|
}
|
|
|
|
/* 800DCE6C-800DCF04 0D77AC 0098+00 1/0 0/0 0/0 .text checkPlayerGuard__9daAlink_cCFv */
|
|
BOOL daAlink_c::checkPlayerGuard() const {
|
|
return (checkSmallUpperGuardAnime() || (i_checkShieldGet() && checkHorseLieAnime())) ||
|
|
checkUpperGuardAnime();
|
|
}
|
|
|
|
/* 800DCF04-800DCF64 0D7844 0060+00 5/5 0/0 0/0 .text checkPlayerGuardAndAttack__9daAlink_cCFv */
|
|
BOOL daAlink_c::checkPlayerGuardAndAttack() const {
|
|
return checkPlayerGuard() || mProcID == PROC_GUARD_ATTACK;
|
|
}
|
|
|
|
/* 800DCF64-800DD008 0D78A4 00A4+00 2/2 0/0 0/0 .text checkGuardAccept__9daAlink_cFv */
|
|
BOOL daAlink_c::checkGuardAccept() {
|
|
return checkModeFlg(0x80) && i_checkShieldGet() && !checkFmChainGrabAnime() &&
|
|
!checkNotBattleStage();
|
|
}
|
|
|
|
/* 800DD008-800DD018 0D7948 0010+00 11/11 0/0 0/0 .text setUpperGuardAnime__9daAlink_cFf
|
|
*/
|
|
void daAlink_c::setUpperGuardAnime(f32) {
|
|
onNoResetFlg2(FLG2_UNK_8000000);
|
|
}
|
|
|
|
/* 800DD018-800DD114 0D7958 00FC+00 1/1 0/0 0/0 .text setShieldGuard__9daAlink_cFv */
|
|
void daAlink_c::setShieldGuard() {
|
|
if ((mProcID == PROC_GUARD_SLIP && mEquipItem != IRONBALL) || checkSmallUpperGuardAnime() ||
|
|
(checkGuardAccept() && !checkGrabAnime() && !checkUpperReadyThrowAnime() &&
|
|
!checkDkCaught2Anime() && !checkKandelaarSwingAnime() && !checkCutDashAnime() &&
|
|
!checkCutDashChargeAnime() && (!checkEquipAnime() || checkUpperGuardAnime()) &&
|
|
!checkRideOn() && checkGuardActionChange()))
|
|
{
|
|
onNoResetFlg2(FLG2_UNK_8000000);
|
|
} else {
|
|
offNoResetFlg2(FLG2_UNK_8000000);
|
|
}
|
|
}
|
|
|
|
/* 800DD114-800DD1D4 0D7A54 00C0+00 1/1 0/0 0/0 .text setGuardSe__9daAlink_cFP12dCcD_GObjInf */
|
|
void daAlink_c::setGuardSe(dCcD_GObjInf* i_objinf) {
|
|
int var_r31;
|
|
int var_r30;
|
|
|
|
if (checkWoodShieldEquipNotIronBall() && !checkMagicArmorNoDamage()) {
|
|
var_r31 = 0x29;
|
|
var_r30 = 0;
|
|
} else {
|
|
var_r31 = 0x28;
|
|
var_r30 = 1;
|
|
}
|
|
|
|
u32 hit_se;
|
|
if (i_objinf->GetTgHitGObj() != NULL && i_objinf->GetTgHitGObj()->GetAtType() == AT_TYPE_BOMB) {
|
|
hit_se = Z2SE_HIT_METAL_WEAPON;
|
|
} else {
|
|
hit_se = i_objinf->GetTgHitObjHitSeID(var_r30);
|
|
}
|
|
|
|
mZ2Link.startCollisionSE(hit_se, var_r31);
|
|
}
|
|
|
|
/* 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);
|
|
|
|
mBodyAngle.y = (dmg_vec->atan2sX_Z() + 0x8000) - shape_angle.y;
|
|
if (abs(mBodyAngle.y) > 0x7000) {
|
|
mBodyAngle.y = 0;
|
|
} else {
|
|
mBodyAngle.y =
|
|
cLib_minMaxLimit<s16>((s16)mBodyAngle.y, -daAlinkHIO_guard_c0::m.mSmallGuardLRAngleMax,
|
|
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);
|
|
}
|
|
|
|
/* 800DD3E4-800DD894 0D7D24 04B0+00 1/1 0/0 0/0 .text
|
|
* procGuardSlipInit__9daAlink_cFiP12dCcD_GObjInf */
|
|
int daAlink_c::procGuardSlipInit(int param_0, dCcD_GObjInf* param_1) {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 800DD894-800DDA10 0D81D4 017C+00 1/0 0/0 0/0 .text procGuardSlip__9daAlink_cFv */
|
|
int daAlink_c::procGuardSlip() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 800DDA10-800DDBA8 0D8350 0198+00 2/1 0/0 0/0 .text procGuardAttackInit__9daAlink_cFv
|
|
*/
|
|
int daAlink_c::procGuardAttackInit() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 800DDBA8-800DDE58 0D84E8 02B0+00 1/0 0/0 0/0 .text procGuardAttack__9daAlink_cFv */
|
|
int daAlink_c::procGuardAttack() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 800DDE58-800DDF2C 0D8798 00D4+00 2/2 0/0 0/0 .text procGuardBreakInit__9daAlink_cFv */
|
|
int daAlink_c::procGuardBreakInit() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 800DDF2C-800DE008 0D886C 00DC+00 1/0 0/0 0/0 .text procGuardBreak__9daAlink_cFv */
|
|
int daAlink_c::procGuardBreak() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|
|
|
|
/* 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;
|
|
}
|
|
|
|
/* 800DE380-800DE64C 0D8CC0 02CC+00 1/0 0/0 0/0 .text procTurnMove__9daAlink_cFv */
|
|
int daAlink_c::procTurnMove() {
|
|
// NONMATCHING
|
|
return 0;
|
|
}
|