Files
tww/src/d/d_cc_s.cpp
T
LagoLunatic 3712d741ca d_cc_s OK
2024-02-12 00:52:30 -05:00

487 lines
16 KiB
C++

//
// Generated by dtk
// Translation Unit: d_cc_s.cpp
//
#include "d/d_cc_s.h"
#include "d/d_cc_d.h"
#include "d/d_com_inf_game.h"
/* 800AD5B0-800AD5E4 .text Ct__4dCcSFv */
void dCcS::Ct() {
cCcS::Ct();
mMass_Mng.Ct();
}
/* 800AD5E4-800AD604 .text Dt__4dCcSFv */
void dCcS::Dt() {
cCcS::Dt();
}
/* 800AD604-800AD748 .text ChkShieldFrontRange__4dCcSFP8cCcD_ObjP8cCcD_Obj */
bool dCcS::ChkShieldFrontRange(cCcD_Obj* obj1, cCcD_Obj* obj2) {
dCcD_GObjInf* inf1 = (dCcD_GObjInf*)obj1->GetGObjInf();
if (inf1 == NULL) { return false; }
fopAc_ac_c* ac1 = inf1->GetAc();
if (ac1 == NULL) { return false; }
dCcD_GObjInf* inf2 = (dCcD_GObjInf*)obj2->GetGObjInf();
if (inf2 == NULL) { return false; }
fopAc_ac_c* ac2 = inf2->GetAc();
if (ac2 == NULL) { return false; }
cXyz delta;
VECSubtract(&ac1->mEyePos, &ac2->mEyePos, &delta);
f32 dist = VECMag(&delta);
if (cM3d_IsZero(dist)) {
return false;
}
VECNormalize(&delta, &delta);
s16 deltaAngle = cM_atan2s(delta.x, delta.z);
s16 shieldAngle = inf2->GetTgShieldFrontRangeYAngle() ? *inf2->GetTgShieldFrontRangeYAngle() : ac2->shape_angle.y;
if (cLib_distanceAngleS(deltaAngle, shieldAngle) > 0x4000) {
return false;
}
return true;
}
/* 800AD748-800AD7D0 .text ChkShield__4dCcSFP8cCcD_ObjP8cCcD_ObjP12dCcD_GObjInfP12dCcD_GObjInf */
bool dCcS::ChkShield(cCcD_Obj* obj1, cCcD_Obj* obj2, dCcD_GObjInf* inf1, dCcD_GObjInf* inf2) {
if (inf1->ChkAtNoGuard()) {
return false;
}
if (inf2->ChkTgShield()) {
if (inf2->ChkTgShieldFrontRange()) {
return ChkShieldFrontRange(obj1, obj2);
} else {
return true;
}
} else {
return false;
}
}
/* 800AD7D0-800AD86C .text CalcTgPlusDmg__4dCcSFP8cCcD_ObjP8cCcD_ObjP9cCcD_SttsP9cCcD_Stts */
void dCcS::CalcTgPlusDmg(cCcD_Obj* obj1, cCcD_Obj* obj2, cCcD_Stts* stts1, cCcD_Stts* stts2) {
dCcD_GObjInf* inf1 = (dCcD_GObjInf*)obj1->GetGObjInf();
dCcD_GObjInf* inf2 = (dCcD_GObjInf*)obj2->GetGObjInf();
if (!ChkShield(obj1, obj2, inf1, inf2)) {
int atp = obj1->GetAtAtp();
if (stts2->GetDmg() < atp) {
stts2->PlusDmg(atp);
}
}
}
/* 800AD86C-800AD8EC .text ChkAtTgHitAfterCross__4dCcSFbbPC12cCcD_GObjInfPC12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GStts */
bool dCcS::ChkAtTgHitAfterCross(bool r4, bool r5, const cCcD_GObjInf* inf1_, const cCcD_GObjInf* inf2_,
cCcD_Stts* stts1_, cCcD_Stts* stts2_, cCcD_GStts* gstts1_, cCcD_GStts* gstts2_) {
dCcD_GObjInf* inf1 = (dCcD_GObjInf*)inf1_;
dCcD_GObjInf* inf2 = (dCcD_GObjInf*)inf2_;
dCcD_Stts* stts1 = (dCcD_Stts*)stts1_;
dCcD_Stts* stts2 = (dCcD_Stts*)stts2_;
dCcD_GStts* gstts1 = (dCcD_GStts*)gstts1_;
dCcD_GStts* gstts2 = (dCcD_GStts*)gstts2_;
unsigned int r11 = stts1->GetApid();
unsigned int r3 = stts2->GetApid();
if (r4) {
gstts1->SetAtApid(r3);
if (inf1->ChkAtNoConHit() && gstts1->GetAtOldApid() == stts2->GetApid()) {
return true;
}
}
if (r5) {
gstts2->SetTgApid(r11);
if (inf2->ChkTgNoConHit() && !inf1->ChkAtStopNoConHit() && gstts2->GetTgOldApid() == stts1->GetApid()) {
return true;
}
}
return false;
}
/* 800AD8EC-800ADA30 .text SetCoGObjInf__4dCcSFbbP12cCcD_GObjInfP12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GStts */
void dCcS::SetCoGObjInf(bool r4, bool r5, cCcD_GObjInf* inf1_, cCcD_GObjInf* inf2_, cCcD_Stts* stts1, cCcD_Stts* stts2,
cCcD_GStts* gstts1_, cCcD_GStts* gstts2_) {
dCcD_GObjInf* inf1 = (dCcD_GObjInf*)inf1_;
dCcD_GObjInf* inf2 = (dCcD_GObjInf*)inf2_;
dCcD_GStts* gstts1 = (dCcD_GStts*)gstts1_;
dCcD_GStts* gstts2 = (dCcD_GStts*)gstts2_;
if (r4) {
inf1->SetCoHitApid(stts2->GetApid());
if (gstts2->ChkNoActor())
inf1->OnCoHitNoActor();
}
if (r5) {
inf2->SetCoHitApid(stts1->GetApid());
if (gstts1->ChkNoActor())
inf2->OnCoHitNoActor();
}
if (r4) {
dCcD_HitCallback callback = inf1->GetCoHitCallback();
if (callback != NULL) {
fopAc_ac_c* ac1 = inf1->GetAc();
fopAc_ac_c* ac2 = inf2->GetAc();
callback(ac1, inf1, ac2, inf2);
}
}
if (r5) {
dCcD_HitCallback callback = inf2->GetCoHitCallback();
if (callback != NULL) {
fopAc_ac_c* ac2 = inf2->GetAc();
fopAc_ac_c* ac1 = inf1->GetAc();
callback(ac2, inf2, ac1, inf1);
}
}
}
static u8 rank_tbl[11][11] = {
{ 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 },
{ 0, 50, 100, 100, 100, 100, 100, 100, 100, 100, 100 },
{ 0, 0, 50, 75, 90, 100, 100, 100, 100, 100, 100 },
{ 0, 0, 25, 50, 75, 90, 100, 100, 100, 100, 100 },
{ 0, 0, 10, 25, 50, 75, 90, 100, 100, 100, 100 },
{ 0, 0, 0, 10, 25, 50, 75, 90, 100, 100, 100 },
{ 0, 0, 0, 0, 10, 25, 50, 75, 90, 100, 100 },
{ 0, 0, 0, 0, 0, 10, 25, 50, 75, 100, 100 },
{ 0, 0, 0, 0, 0, 0, 10, 25, 50, 100, 100 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 100 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
/* 800ADA30-800ADAD4 .text GetRank__4dCcSFUc */
int dCcS::GetRank(u8 weight) {
if (weight == 0xFF) {
return 10;
} else if (weight == 0xFE) {
return 9;
} else if (weight >= 0xD9) {
return 8;
} else if (weight >= 0xB5) {
return 7;
} else if (weight >= 0x91) {
return 6;
} else if (weight >= 0x6D) {
return 5;
} else if (weight >= 0x49) {
return 4;
} else if (weight >= 0x25) {
return 3;
} else if (weight >= 0x02) {
return 2;
} else if (weight == 0x01) {
return 1;
} else {
return 0;
}
}
/* 800ADAD4-800ADEF0 .text SetPosCorrect__4dCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf */
void dCcS::SetPosCorrect(cCcD_Obj* obj1, cXyz* ppos1, cCcD_Obj* obj2, cXyz* ppos2, f32 cross_len) {
if (obj1->ChkCoNoCrr() || obj2->ChkCoNoCrr()) {
return;
}
if (obj1->GetStts() == NULL || obj2->GetStts() == NULL) {
return;
}
if (obj1->GetStts()->GetActor() != NULL && obj1->GetStts()->GetActor() == obj2->GetStts()->GetActor()) {
return;
}
if (cM3d_IsZero(cross_len)) {
return;
}
SetCoGCorrectProc(obj1, obj2);
bool correctY = false;
if (obj1->ChkCoSph3DCrr() && obj2->ChkCoSph3DCrr()) {
correctY = true;
}
if ((obj1->GetStts()->GetWeightUc() == 0 && obj2->GetStts()->GetWeightUc() == 0) ||
(obj1->GetStts()->GetWeightUc() == 0xFF && obj2->GetStts()->GetWeightUc() == 0xFF)
) {
return;
}
int obj1WeightRank = GetRank(obj1->GetStts()->GetWeightUc());
int obj2WeightRank = GetRank(obj2->GetStts()->GetWeightUc());
u8 rank = rank_tbl[obj1WeightRank][obj2WeightRank];
u8 invRank = 100 - rank;
f32 obj2Weight = rank * 0.01f;
f32 obj1Weight = invRank * 0.01f;
f32 objDistLen;
Vec vec1;
Vec vec2;
Vec objsDist;
if (correctY) {
objsDist.x = ppos2->x - ppos1->x;
objsDist.y = ppos2->y - ppos1->y;
objsDist.z = ppos2->z - ppos1->z;
objDistLen = sqrtf(objsDist.x*objsDist.x + objsDist.y*objsDist.y + objsDist.z*objsDist.z);
} else {
objsDist.x = ppos2->x - ppos1->x;
objsDist.y = 0.0f;
objsDist.z = ppos2->z - ppos1->z;
objDistLen = sqrtf(objsDist.x*objsDist.x + objsDist.z*objsDist.z);
}
if (!cM3d_IsZero(objDistLen)) {
if (correctY) {
f32 pushFactor = cross_len / objDistLen;
objsDist.x *= pushFactor;
objsDist.y *= pushFactor;
objsDist.z *= pushFactor;
vec1.x = -objsDist.x * obj2Weight;
vec1.y = -objsDist.y * obj2Weight;
vec1.z = -objsDist.z * obj2Weight;
vec2.x = objsDist.x * obj1Weight;
vec2.y = objsDist.y * obj1Weight;
vec2.z = objsDist.z * obj1Weight;
} else {
f32 pushFactor = cross_len / objDistLen;
objsDist.x *= pushFactor;
objsDist.z *= pushFactor;
vec1.x = -objsDist.x * obj2Weight;
vec1.y = 0;
vec1.z = -objsDist.z * obj2Weight;
vec2.x = objsDist.x * obj1Weight;
vec2.y = 0;
vec2.z = objsDist.z * obj1Weight;
}
} else {
vec1.y = 0;
vec1.z = 0;
vec2.y = 0;
vec2.z = 0;
if (!cM3d_IsZero(cross_len)) {
vec1.x = -cross_len * obj2Weight;
vec2.x = cross_len * obj1Weight;
} else {
vec1.x = -obj2Weight;
vec2.x = obj1Weight;
}
}
obj1->GetStts()->PlusCcMove(vec1.x, vec1.y, vec1.z);
obj2->GetStts()->PlusCcMove(vec2.x, vec2.y, vec2.z);
(*ppos1) += vec1;
(*ppos2) += vec2;
}
/* 800ADEF0-800ADFF8 .text CalcParticleAngle__4dCcSFP12dCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP5csXyz */
void dCcS::CalcParticleAngle(dCcD_GObjInf* i_atObjInf, cCcD_Stts* i_atStts, cCcD_Stts* i_tgStts, csXyz* o_angle) {
cXyz vec(*i_atObjInf->GetAtVecP());
if (cM3d_IsZero(VECMag(&vec))) {
fopAc_ac_c* atActor = i_atStts->GetActor();
fopAc_ac_c* tgActor = i_tgStts->GetActor();
if (atActor == NULL || tgActor == NULL) {
vec.z = 0.0f;
vec.x = 0.0f;
vec.y = -1.0f;
} else {
VECSubtract(&tgActor->current.pos, &atActor->current.pos, &vec);
if (cM3d_IsZero(VECMag(&vec))) {
vec.z = 0.0f;
vec.x = 0.0f;
vec.y = -1.0f;
} else {
VECNormalize(&vec, &vec);
}
}
} else {
VECNormalize(&vec, &vec);
}
cM3d_CalcVecZAngle(vec, o_angle);
}
/* 800ADFF8-800AE308 .text ProcAtTgHitmark__4dCcSFbbP8cCcD_ObjP8cCcD_ObjP12dCcD_GObjInfP12dCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10dCcD_GSttsP10dCcD_GSttsP4cXyz */
void dCcS::ProcAtTgHitmark(bool, bool, cCcD_Obj* r6, cCcD_Obj* r7, dCcD_GObjInf* atInf, dCcD_GObjInf* tgInf,
cCcD_Stts* r10, cCcD_Stts* r30, dCcD_GStts*, dCcD_GStts* r4, cXyz* pos)
{
if (atInf->ChkAtNoHitMark()) { return; }
if (tgInf->ChkTgNoHitMark()) { return; }
if (tgInf->GetTgHitMark() == 0xFF) { return; }
if (!r4->ChkNoneActorPerfTblId()) { return; }
if (!ChkShield(r6, r7, atInf, tgInf)) {
if (atInf->GetAtHitMark() == 0) { return; }
if (atInf->GetAtHitMark() == 1 && tgInf->GetTgHitMark() == 1) {
dComIfGp_particle_set(dPa_name::ID_COMMON_STARS_BLOW, pos);
} else {
csXyz angle;
CalcParticleAngle(atInf, r10, r30, &angle);
if (atInf->GetAtHitMark() == 0xF) {
dComIfGp_particle_set(0x10, pos);
cXyz scale;
scale.x = scale.y = scale.z = 2.0f;
dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, pos, &angle, &scale);
} else if (atInf->GetAtHitMark() == 1) {
dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, pos, &angle);
} else {
dComIfGp_particle_set(atInf->GetAtHitMark(), pos, &angle);
}
dKy_SordFlush_set(*pos, 1);
}
} else {
if (tgInf->GetTgHitMark() == 0) { return; }
dKy_SordFlush_set(*pos, 0);
csXyz angle;
CalcParticleAngle(atInf, r10, r30, &angle);
dComIfGp_particle_set(tgInf->GetTgHitMark(), pos, &angle);
}
}
/* 800AE308-800AE5AC .text SetAtTgGObjInf__4dCcSFbbP8cCcD_ObjP8cCcD_ObjP12cCcD_GObjInfP12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GSttsP4cXyz */
void dCcS::SetAtTgGObjInf(bool i_setAt, bool i_setTg, cCcD_Obj* param_2, cCcD_Obj* param_3,
cCcD_GObjInf* i_atObjInf, cCcD_GObjInf* i_tgObjInf, cCcD_Stts* param_6,
cCcD_Stts* param_7, cCcD_GStts* param_8, cCcD_GStts* param_9,
cXyz* i_hitPos) {
/* Nonmatching */
dCcD_GObjInf* atObjInf = (dCcD_GObjInf*)i_atObjInf;
dCcD_GObjInf* tgObjInf = (dCcD_GObjInf*)i_tgObjInf;
dCcD_GStts* stts1 = (dCcD_GStts*)param_8;
dCcD_GStts* stts2 = (dCcD_GStts*)param_9;
bool chk_shield = ChkShield(param_2, param_3, atObjInf, tgObjInf);
if (i_setAt) {
atObjInf->SetAtHitPos(*i_hitPos);
atObjInf->SetAtRVec(*tgObjInf->GetTgVecP());
if (stts1 != NULL && stts1->GetTgSpl() == 0) {
stts1->SetTgSpl(tgObjInf->GetTgSpl());
}
atObjInf->SetAtHitApid(param_7->GetApid());
if (chk_shield) {
atObjInf->OnAtShieldHit();
}
if (stts2->ChkNoActor()) {
atObjInf->OnAtHitNoActor();
}
}
if (i_setTg) {
tgObjInf->SetTgHitPos(*i_hitPos);
tgObjInf->SetTgRVec(*atObjInf->GetAtVecP());
if (stts2 != NULL && stts1->GetAtSpl() == 0) {
stts2->SetAtSpl(atObjInf->GetAtSpl());
}
tgObjInf->SetTgHitApid(param_6->GetApid());
if (chk_shield) {
tgObjInf->OnTgShieldHit();
}
if (stts1->ChkNoActor()) {
tgObjInf->OnTgHitNoActor();
}
}
if (i_setAt) {
dCcD_HitCallback at_callback = atObjInf->GetAtHitCallback();
if (at_callback != NULL) {
fopAc_ac_c* atAc = atObjInf->GetAc();
fopAc_ac_c* tgAc = tgObjInf->GetAc();
at_callback(atAc, atObjInf, tgAc, tgObjInf);
}
}
if (i_setTg) {
dCcD_HitCallback tg_callback = tgObjInf->GetTgHitCallback();
if (tg_callback != NULL) {
fopAc_ac_c* tgAc = tgObjInf->GetAc();
fopAc_ac_c* atAc = atObjInf->GetAc();
tg_callback(tgAc, tgObjInf, atAc, atObjInf);
}
}
if (i_setAt && i_setTg && (!atObjInf->ChkAtEffCounter() || !tgObjInf->ChkTgEffCounter())) {
atObjInf->SetAtEffCounterTimer();
tgObjInf->SetTgEffCounterTimer();
ProcAtTgHitmark(i_setAt, i_setTg, param_2, param_3, atObjInf, tgObjInf, param_6, param_7,
stts1, stts2, i_hitPos);
}
}
/* 800AE5AC-800AE814 .text ChkCamera__4dCcSFR4cXyzR4cXyzfP10fopAc_ac_cP10fopAc_ac_c */
bool dCcS::ChkCamera(cXyz& start, cXyz& end, f32 radius, fopAc_ac_c* r26, fopAc_ac_c* r27) {
if (mObjCoCount <= 0)
return false;
cCcD_Obj** objCoEnd = mpObjCo + mObjCoCount;
cCcD_CpsAttr cpsAttr;
cpsAttr.Set(start, end, radius);
cpsAttr.CalcAabBox();
cCcD_DivideInfo divideInfo;
mDivideArea.CalcDivideInfoOverArea(&divideInfo, cpsAttr.GetWorkAab());
for (cCcD_Obj** pObjCo = mpObjCo; pObjCo < objCoEnd; pObjCo++) {
if (!(*pObjCo)->ChkCoSet())
continue;
if ((*pObjCo)->GetAc() == r26 || (*pObjCo)->GetAc() == r27)
continue;
if ((*pObjCo)->GetDivideInfo().Chk(divideInfo)) {
cCcD_ShapeAttr* shapeAttr = (*pObjCo)->GetShapeAttr();
if (shapeAttr == NULL)
continue;
f32 cross_len;
if (shapeAttr->CrossCo(cpsAttr, &cross_len))
return true;
}
}
return false;
}
/* 800AE814-800AE818 .text MoveAfterCheck__4dCcSFv */
void dCcS::MoveAfterCheck() {
}
/* 800AE818-800AE81C .text DrawAfter__4dCcSFv */
void dCcS::DrawAfter() {
}
/* 800AE81C-800AE83C .text Move__4dCcSFv */
void dCcS::Move() {
cCcS::Move();
}
/* 800AE83C-800AE878 .text Draw__4dCcSFv */
void dCcS::Draw() {
DrawAfter();
DrawClear();
mMass_Mng.Clear();
}
/* 800AE878-800AE89C .text MassClear__4dCcSFv */
void dCcS::MassClear() {
mMass_Mng.Clear();
}
/* 800AE89C-800AE930 .text ChkNoHitGCo__4dCcSFP8cCcD_ObjP8cCcD_Obj */
bool dCcS::ChkNoHitGCo(cCcD_Obj* obj1, cCcD_Obj* obj2) {
dCcD_GObjInf* inf1 = (dCcD_GObjInf*)obj1->GetGObjInf();
dCcD_GObjInf* inf2 = (dCcD_GObjInf*)obj2->GetGObjInf();
if ((inf1->ChkCoAtLasso() && !inf2->ChkCoTgLasso()) || (inf2->ChkCoAtLasso() && !inf1->ChkCoTgLasso())) {
return true;
}
return false;
}
/* 800AE930-800AE938 .text ChkNoHitGAtTg__4cCcSFPC12cCcD_GObjInfPC12cCcD_GObjInfP10cCcD_GSttsP10cCcD_GStts */
bool cCcS::ChkNoHitGAtTg(const cCcD_GObjInf*, const cCcD_GObjInf*, cCcD_GStts*, cCcD_GStts*) {
return false;
}