__sinit_d_com_inf_game_cpp OK (#140)

* mass mng header

* d_cc_d start

* c_cc_d ok

* tmp commit

* almost, reordering of vtable functions

* progress

* more progress

* cleanup, still non matching

* mark all of d_cc_d as nonmatching to OK

* c_cc_s

* c_cc_s OK

* d_cc_mass_s OK

* cleanup

* gameinfo __sinit, not OK

* a bit of cleanup

* format

* remove asm

Co-authored-by: lepelog <lepelog@users.noreply.github.com>
This commit is contained in:
lepelog
2021-08-17 02:59:00 +02:00
committed by GitHub
parent 9765844d92
commit 38eca47ad5
114 changed files with 2085 additions and 5680 deletions
+252 -217
View File
@@ -7,106 +7,31 @@
#include "dol2asm.h"
#include "global.h"
//
// Forward References:
//
extern "C" void __ct__4cCcSFv();
extern "C" void Ct__4cCcSFv();
extern "C" void Dt__4cCcSFv();
extern "C" void GetWt__4cCcSCFUc();
extern "C" void Set__4cCcSFP8cCcD_Obj();
extern "C" void ClrCoHitInf__4cCcSFv();
extern "C" void ClrTgHitInf__4cCcSFv();
extern "C" void ClrAtHitInf__4cCcSFv();
extern "C" void ChkNoHitAtTg__4cCcSFP8cCcD_ObjP8cCcD_Obj();
extern "C" void ChkAtTg__4cCcSFv();
extern "C" void ChkNoHitCo__4cCcSFP8cCcD_ObjP8cCcD_Obj();
extern "C" void ChkCo__4cCcSFv();
extern "C" void CalcTgPlusDmg__4cCcSFP8cCcD_ObjP8cCcD_ObjP9cCcD_SttsP9cCcD_Stts();
extern "C" void SetAtTgCommonHitInf__4cCcSFP8cCcD_ObjP8cCcD_ObjP4cXyz();
extern "C" void SetCoCommonHitInf__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf();
extern "C" void SetPosCorrect__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf();
extern "C" void CalcArea__4cCcSFv();
extern "C" void Move__4cCcSFv();
extern "C" void DrawClear__4cCcSFv();
extern "C" void SetCoGCorrectProc__4cCcSFP8cCcD_ObjP8cCcD_Obj();
extern "C" void
SetCoGObjInf__4cCcSFbbP12cCcD_GObjInfP12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GStts();
extern "C" void
SetAtTgGObjInf__4cCcSFbbP8cCcD_ObjP8cCcD_ObjP12cCcD_GObjInfP12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GSttsP4cXyz();
extern "C" bool ChkNoHitGAtTg__4cCcSFPC12cCcD_GObjInfPC12cCcD_GObjInfP10cCcD_GSttsP10cCcD_GStts();
extern "C" bool
ChkAtTgHitAfterCross__4cCcSFbbPC12cCcD_GObjInfPC12cCcD_GObjInfP9cCcD_SttsP9cCcD_SttsP10cCcD_GSttsP10cCcD_GStts();
extern "C" bool ChkNoHitGCo__4cCcSFP8cCcD_ObjP8cCcD_Obj();
extern "C" void MoveAfterCheck__4cCcSFv();
//
// External References:
//
extern "C" void __dt__4cXyzFv();
extern "C" void __dt__4cCcSFv();
extern "C" void Chk__15cCcD_DivideInfoCFRC15cCcD_DivideInfo();
extern "C" void SetArea__15cCcD_DivideAreaFRC8cM3dGAab();
extern "C" void CalcDivideInfo__15cCcD_DivideAreaFP15cCcD_DivideInfoRC8cM3dGAabUl();
extern "C" void PlusCcMove__9cCcD_SttsFfff();
extern "C" void ClrCcMove__9cCcD_SttsFv();
extern "C" void PlusDmg__9cCcD_SttsFi();
extern "C" void GetWeightF__9cCcD_SttsCFv();
extern "C" void GetAc__8cCcD_ObjFv();
extern "C" void SetHit__10cCcD_ObjAtFP8cCcD_Obj();
extern "C" void SetHit__10cCcD_ObjTgFP8cCcD_Obj();
extern "C" void SetHit__10cCcD_ObjCoFP8cCcD_Obj();
extern "C" void ClearForMinMax__8cM3dGAabFv();
extern "C" void SetMinMax__8cM3dGAabFRC8cM3dGAab();
extern "C" void CalcCenter__8cM3dGAabCFP4cXyz();
extern "C" void __register_global_object();
extern "C" void _savegpr_21();
extern "C" void _savegpr_22();
extern "C" void _savegpr_25();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_21();
extern "C" void _restgpr_22();
extern "C" void _restgpr_25();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__15cCcD_DivideArea[3];
extern "C" extern void* __vt__8cM3dGAab[3];
extern "C" extern u8 data_80451158[8];
//
// Declarations:
//
/* ############################################################################################## */
/* 80451158-80451160 0008+00 s=0 e=1 z=0 None .sbss None */
u8 data_80451158[8];
/* 80264A6C-80264A94 25F3AC 0028+00 0/0 1/1 0/0 .text __ct__4cCcSFv */
cCcS::cCcS() {}
/* 80264A94-80264B60 25F3D4 00CC+00 1/1 1/1 0/0 .text Ct__4cCcSFv */
void cCcS::Ct() {
for (cCcD_Obj** obj = this->mpObjAt; obj < this->mpObjAt + ARRAY_SIZE(this->mpObjAt); ++obj) {
for (cCcD_Obj** obj = mpObjAt; obj < mpObjAt + ARRAY_SIZE(mpObjAt); ++obj) {
*obj = NULL;
}
this->mObjAtCount = 0;
for (cCcD_Obj** obj = this->mpObjTg; obj < this->mpObjTg + ARRAY_SIZE(this->mpObjTg); ++obj) {
mObjAtCount = 0;
for (cCcD_Obj** obj = mpObjTg; obj < mpObjTg + ARRAY_SIZE(mpObjTg); ++obj) {
*obj = NULL;
}
this->mObjTgCount = 0;
for (cCcD_Obj** obj = this->mpObjCo; obj < this->mpObjCo + ARRAY_SIZE(this->mpObjCo); ++obj) {
mObjTgCount = 0;
for (cCcD_Obj** obj = mpObjCo; obj < mpObjCo + ARRAY_SIZE(mpObjCo); ++obj) {
*obj = NULL;
}
this->mObjCoCount = 0;
for (cCcD_Obj** obj = this->mpObj; obj < this->mpObj + ARRAY_SIZE(this->mpObj); ++obj) {
mObjCoCount = 0;
for (cCcD_Obj** obj = mpObj; obj < mpObj + ARRAY_SIZE(mpObj); ++obj) {
*obj = NULL;
}
this->mObjCount = 0;
mObjCount = 0;
}
/* 80264B60-80264B80 25F4A0 0020+00 0/0 1/1 0/0 .text Dt__4cCcSFv */
@@ -127,19 +52,19 @@ WeightType cCcS::GetWt(u8 param_0) const {
/* 80264BA8-80264C5C 25F4E8 00B4+00 0/0 7/7 454/454 .text Set__4cCcSFP8cCcD_Obj */
void cCcS::Set(cCcD_Obj* obj) {
if (obj->GetObjAt().getSPrm() & 1) {
if (obj->ChkAtSet()) {
if (mObjAtCount < ARRAY_SIZE(mpObjAt)) {
mpObjAt[mObjAtCount] = obj;
mObjAtCount++;
}
}
if (obj->GetObjTg().getSPrm() & 1) {
if (obj->ChkTgSet()) {
if (mObjTgCount < ARRAY_SIZE(mpObjTg)) {
mpObjTg[mObjTgCount] = obj;
mObjTgCount++;
}
}
if (obj->GetObjCo().getSPrm() & 1) {
if (obj->ChkCoSet()) {
if (mObjCoCount < ARRAY_SIZE(mpObjCo)) {
mpObjCo[mObjCoCount] = obj;
mObjCoCount++;
@@ -191,166 +116,266 @@ void cCcS::ClrAtHitInf() {
}
/* 80264E2C-80264F40 25F76C 0114+00 1/1 0/0 0/0 .text ChkNoHitAtTg__4cCcSFP8cCcD_ObjP8cCcD_Obj */
#ifdef NON_MATCHING
int cCcS::ChkNoHitAtTg(cCcD_Obj* obj1, cCcD_Obj* obj2) {
bool cCcS::ChkNoHitAtTg(cCcD_Obj* obj1, cCcD_Obj* obj2) {
fopAc_ac_c* ac1 = obj1->GetAc();
fopAc_ac_c* ac2 = obj2->GetAc();
if (((ac1 != NULL && ac2 != NULL) && ac1 == ac2) ||
(obj1->GetObjAt().getSPrm() & 0x1E & obj2->GetObjTg().getSPrm() & 0x1E) == 0 ||
(obj1->GetObjAt().GetType() & obj2->GetObjTg().GetType()) == 0) {
if ((ac1 != NULL && ac2 != NULL && ac1 == ac2) || (obj1->GetAtGrp() & obj2->GetTgGrp()) == 0 ||
(obj1->GetAtType() & obj2->GetTgType()) == 0) {
return 1;
} else {
return this->ChkNoHitGAtTg(obj1->GetGObjInf(), obj2->GetGObjInf(),
obj1->GetStts()->GetGStts(), obj2->GetStts()->GetGStts());
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm int cCcS::ChkNoHitAtTg(cCcD_Obj* param_0, cCcD_Obj* param_1) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/ChkNoHitAtTg__4cCcSFP8cCcD_ObjP8cCcD_Obj.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80430CC0-80430CCC 05D9E0 000C+00 1/1 0/0 0/0 .bss @2492 */
static u8 lit_2492[12];
/* 80430CCC-80430CD8 05D9EC 000C+00 1/1 0/0 0/0 .bss cross$2491 */
static u8 cross[12];
/* 80455038-8045503C 003638 0004+00 2/2 0/0 0/0 .sdata2 @2532 */
SECTION_SDATA2 static u8 lit_2532[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 80264F40-8026515C 25F880 021C+00 1/1 0/0 0/0 .text ChkAtTg__4cCcSFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::ChkAtTg() {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/ChkAtTg__4cCcSFv.s"
void cCcS::ChkAtTg() {
cCcD_Obj** objTgEnd = mpObjTg + mObjTgCount;
this->ClrAtHitInf();
this->ClrTgHitInf();
for (cCcD_Obj** pObjAt = mpObjAt; pObjAt < mpObjAt + mObjAtCount; ++pObjAt) {
if (*pObjAt == NULL || !(*pObjAt)->ChkAtSet())
continue;
cCcD_ShapeAttr* atShapeAttr = (*pObjAt)->GetShapeAttr();
for (cCcD_Obj** pObjTg = mpObjTg; pObjTg < objTgEnd; ++pObjTg) {
if (*pObjTg == NULL || !(*pObjTg)->ChkTgSet())
continue;
if (!(*pObjAt)->GetDivideInfo().Chk((*pObjTg)->GetDivideInfo()))
continue;
if (this->ChkNoHitAtTg(*pObjAt, *pObjTg))
continue;
cCcD_ShapeAttr* tgShapeAttr = (*pObjTg)->GetShapeAttr();
static cXyz cross;
bool didCross = atShapeAttr->CrossAtTg(*tgShapeAttr, &cross);
bool anyBsRevHit = (*pObjAt)->ChkBsRevHit() || (*pObjTg)->ChkBsRevHit();
if (!anyBsRevHit && didCross) {
this->SetAtTgCommonHitInf(*pObjAt, *pObjTg, &cross);
} else if (anyBsRevHit && !didCross) {
cCcD_ShapeAttr* atShape2 = (*pObjAt)->GetShapeAttr();
if (atShape2 == NULL) {
cross.set(0.0f, 0.0f, 0.0f);
} else {
atShape2->GetWorkAab().CalcCenter(&cross);
}
this->SetAtTgCommonHitInf(*pObjAt, *pObjTg, &cross);
}
}
}
}
#pragma pop
/* 8026515C-80265230 25FA9C 00D4+00 1/1 0/0 0/0 .text ChkNoHitCo__4cCcSFP8cCcD_ObjP8cCcD_Obj */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::ChkNoHitCo(cCcD_Obj* param_0, cCcD_Obj* param_1) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/ChkNoHitCo__4cCcSFP8cCcD_ObjP8cCcD_Obj.s"
bool cCcS::ChkNoHitCo(cCcD_Obj* obj1, cCcD_Obj* obj2) {
fopAc_ac_c* ac1 = obj1->GetAc();
fopAc_ac_c* ac2 = obj2->GetAc();
if (!(((ac1 == NULL || ac2 == NULL) || ac1 != ac2 || obj1->ChkCoSameActorHit() ||
obj2->ChkCoSameActorHit()) &&
(obj1->GetCoIGrp() & (obj2->GetCoVsGrp() >> 3)) &&
((obj1->GetCoVsGrp() >> 3) & obj2->GetCoIGrp() && !this->ChkNoHitGCo(obj1, obj2)))) {
return true;
} else {
return false;
}
}
#pragma pop
/* 80265230-802653A0 25FB70 0170+00 1/1 0/0 0/0 .text ChkCo__4cCcSFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::ChkCo() {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/ChkCo__4cCcSFv.s"
void cCcS::ChkCo() {
this->ClrCoHitInf();
if (mObjCoCount <= 1)
return;
cCcD_Obj** objCoEnd = this->mpObjCo + this->mObjCoCount;
for (cCcD_Obj** objCo1 = this->mpObjCo; objCo1 < objCoEnd - 1; ++objCo1) {
if (*objCo1 == NULL || !(*objCo1)->ChkCoSet())
continue;
cCcD_ShapeAttr* co1ShapeAttr = (*objCo1)->GetShapeAttr();
for (cCcD_Obj** objCo2 = objCo1 + 1; objCo2 < objCoEnd; ++objCo2) {
if (*objCo2 == NULL || !(*objCo2)->ChkCoSet())
continue;
if (!(*objCo1)->GetDivideInfo().Chk((*objCo2)->GetDivideInfo()))
continue;
if (this->ChkNoHitCo(*objCo1, *objCo2))
continue;
cCcD_ShapeAttr* co2ShapeAttr = (*objCo2)->GetShapeAttr();
f32 crossLen;
if (co1ShapeAttr->CrossCo(*co2ShapeAttr, &crossLen)) {
cXyz& obj2CoCP = co2ShapeAttr->GetCoCP();
cXyz& obj1CoCP = co1ShapeAttr->GetCoCP();
this->SetCoCommonHitInf(*objCo1, &obj1CoCP, *objCo2, &obj2CoCP, crossLen);
}
}
}
}
#pragma pop
/* 802653A0-802653C8 25FCE0 0028+00 1/0 0/0 0/0 .text
* CalcTgPlusDmg__4cCcSFP8cCcD_ObjP8cCcD_ObjP9cCcD_SttsP9cCcD_Stts */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::CalcTgPlusDmg(cCcD_Obj* param_0, cCcD_Obj* param_1, cCcD_Stts* param_2,
cCcD_Stts* param_3) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/CalcTgPlusDmg__4cCcSFP8cCcD_ObjP8cCcD_ObjP9cCcD_SttsP9cCcD_Stts.s"
void cCcS::CalcTgPlusDmg(cCcD_Obj* obj1, cCcD_Obj* obj2, cCcD_Stts* stts1, cCcD_Stts* stts2) {
stts2->PlusDmg(obj1->GetAtAtp());
}
#pragma pop
/* 802653C8-802655E4 25FD08 021C+00 1/1 0/0 0/0 .text
* SetAtTgCommonHitInf__4cCcSFP8cCcD_ObjP8cCcD_ObjP4cXyz */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::SetAtTgCommonHitInf(cCcD_Obj* param_0, cCcD_Obj* param_1, cXyz* param_2) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/SetAtTgCommonHitInf__4cCcSFP8cCcD_ObjP8cCcD_ObjP4cXyz.s"
void cCcS::SetAtTgCommonHitInf(cCcD_Obj* obj1, cCcD_Obj* obj2, cXyz* pXyz) {
cCcD_Stts* obj1Stts = obj1->GetStts();
cCcD_Stts* obj2Stts = obj2->GetStts();
if (!this->ChkAtTgHitAfterCross(!obj2->ChkTgNoAtHitInfSet(), !obj1->ChkAtNoTgHitInfSet(),
obj1->GetGObjInf(), obj2->GetGObjInf(), obj1Stts, obj2Stts,
obj1Stts->GetGStts(), obj2Stts->GetGStts())) {
if (!obj2->ChkTgNoAtHitInfSet()) {
obj1->SetAtHit(obj2);
}
bool tmp = !(obj1->ChkAtNoTgHitInfSet() ||
(obj1->ChkAtType(0x80) && obj2->ChkTgNoSlingHitInfSet()));
if (tmp) {
obj2->SetTgHit(obj1);
this->CalcTgPlusDmg(obj1, obj2, obj1Stts, obj2Stts);
}
this->SetAtTgGObjInf(!obj2->ChkTgNoAtHitInfSet(), tmp, obj1, obj2, obj1->GetGObjInf(),
obj2->GetGObjInf(), obj1Stts, obj2Stts, obj1Stts->GetGStts(),
obj2Stts->GetGStts(), pXyz);
}
}
#pragma pop
/* 802655E4-80265750 25FF24 016C+00 1/1 0/0 0/0 .text
* SetCoCommonHitInf__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::SetCoCommonHitInf(cCcD_Obj* param_0, cXyz* param_1, cCcD_Obj* param_2, cXyz* param_3,
f32 param_4) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/SetCoCommonHitInf__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf.s"
void cCcS::SetCoCommonHitInf(cCcD_Obj* obj1, cXyz* xyz1, cCcD_Obj* obj2, cXyz* xyz2, f32 crossLen) {
bool obj2CoHitInfSet = !obj2->ChkCoNoCoHitInfSet();
bool obj1CoHitInfSet = !obj1->ChkCoNoCoHitInfSet();
if (obj2CoHitInfSet) {
obj1->SetCoHit(obj2);
}
if (obj1CoHitInfSet) {
obj2->SetCoHit(obj1);
}
if (obj2CoHitInfSet && obj1CoHitInfSet) {
this->SetPosCorrect(obj1, xyz1, obj2, xyz2, crossLen);
}
cCcD_Stts* obj1Stts = obj1->GetStts();
cCcD_Stts* obj2Stts = obj2->GetStts();
this->SetCoGObjInf(obj2CoHitInfSet, obj1CoHitInfSet, obj1->GetGObjInf(), obj2->GetGObjInf(),
obj1Stts, obj2Stts, obj1Stts->GetGStts(), obj2Stts->GetGStts());
}
#pragma pop
/* ############################################################################################## */
/* 8045503C-80455040 00363C 0004+00 1/1 0/0 0/0 .sdata2 @2759 */
SECTION_SDATA2 static f32 lit_2759 = 1.0f / 125.0f;
/* 80455040-80455044 003640 0004+00 1/1 0/0 0/0 .sdata2 @2760 */
SECTION_SDATA2 static f32 lit_2760 = 1.0f;
/* 80455044-80455048 003644 0004+00 1/1 0/0 0/0 .sdata2 @2761 */
SECTION_SDATA2 static f32 lit_2761 = 2.0f;
/* 80455048-80455050 003648 0004+04 1/1 0/1 0/0 .sdata2 @2762 */
SECTION_SDATA2 static f32 lit_2762[1 + 1 /* padding */] = {
0.5f,
/* padding */
0.0f,
};
/* 80455050-80455058 003650 0008+00 1/1 0/0 0/0 .sdata2 @2763 */
SECTION_SDATA2 static f64 lit_2763 = 0.5;
/* 80455058-80455060 003658 0008+00 1/1 0/0 0/0 .sdata2 @2764 */
SECTION_SDATA2 static f64 lit_2764 = 3.0;
/* 80455060-80455068 003660 0008+00 1/1 0/0 0/0 .sdata2 @2765 */
SECTION_SDATA2 static u8 lit_2765[8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 80455068-80455070 003668 0004+04 1/1 0/0 0/0 .sdata2 @2766 */
SECTION_SDATA2 static f32 lit_2766[1 + 1 /* padding */] = {
-1.0f,
/* padding */
0.0f,
};
/* 80265750-80265BB4 260090 0464+00 1/0 0/0 0/0 .text
* SetPosCorrect__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::SetPosCorrect(cCcD_Obj* param_0, cXyz* param_1, cCcD_Obj* param_2, cXyz* param_3,
f32 param_4) {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/SetPosCorrect__4cCcSFP8cCcD_ObjP4cXyzP8cCcD_ObjP4cXyzf.s"
void cCcS::SetPosCorrect(cCcD_Obj* obj1, cXyz* xyz1, cCcD_Obj* obj2, cXyz* xyz2, f32 crossLen) {
if (obj1->ChkCoNoCrr() || obj2->ChkCoNoCrr())
return;
if (obj1->GetStts() == NULL || obj2->GetStts() == NULL)
return;
if (obj1->GetStts()->GetAc() != NULL && obj1->GetStts()->GetAc() == obj2->GetStts()->GetAc())
return;
if (!(fabsf(crossLen) < (1.0f / 125.0f))) {
this->SetCoGCorrectProc(obj1, obj2);
bool bothCoSph3DCrr = obj1->ChkCoSph3DCrr() && obj2->ChkCoSph3DCrr();
WeightType obj1WeightType = this->GetWt(obj1->GetStts()->GetWeightUc());
WeightType obj2WeightType = this->GetWt(obj2->GetStts()->GetWeightUc());
f32 obj1SrcWeight = obj1->GetStts()->GetWeightF();
f32 obj2SrcWeight = obj2->GetStts()->GetWeightF();
f32 combinedWeight = obj1SrcWeight + obj2SrcWeight;
f32 obj2Weight, obj1Weight;
if (cM3d_IsZero(combinedWeight)) {
obj1SrcWeight = 1;
obj2SrcWeight = 1;
combinedWeight = 2;
}
f32 invCombinedWeight = 1 / combinedWeight;
if (obj1WeightType == WeightType_0) {
if (obj2WeightType == WeightType_0) {
return;
} else {
obj2Weight = 0;
obj1Weight = 1;
}
} else if (obj1WeightType == WeightType_1) {
if (obj2WeightType == WeightType_0) {
obj2Weight = 1;
obj1Weight = 0;
} else if (obj2WeightType == WeightType_1) {
obj2Weight = 0.5;
obj1Weight = 0.5;
} else {
obj2Weight = 0;
obj1Weight = 1;
}
} else {
if (obj2WeightType == WeightType_2) {
obj2Weight = obj2SrcWeight * invCombinedWeight;
obj1Weight = obj1SrcWeight * invCombinedWeight;
} else {
obj2Weight = 1;
obj1Weight = 0;
}
}
f32 objDistLen;
Vec obj1Move;
Vec obj2Move;
Vec objsDist;
if (bothCoSph3DCrr) {
PSVECSubtract(xyz2, xyz1, &objsDist);
objDistLen = PSVECMag(&objsDist);
} else {
objsDist.x = xyz2->x - xyz1->x;
objsDist.y = 0;
objsDist.z = xyz2->z - xyz1->z;
objDistLen = sqrtf(objsDist.x * objsDist.x + objsDist.z * objsDist.z);
}
if (!cM3d_IsZero(objDistLen)) {
if (bothCoSph3DCrr) {
PSVECScale(&objsDist, &objsDist, crossLen / objDistLen);
obj2Weight *= -1;
PSVECScale(&objsDist, &obj1Move, obj2Weight);
PSVECScale(&objsDist, &obj2Move, obj1Weight);
} else {
f32 pushFactor = crossLen / objDistLen;
objsDist.x *= pushFactor;
objsDist.z *= pushFactor;
obj1Move.x = -objsDist.x * obj2Weight;
obj1Move.y = 0;
obj1Move.z = -objsDist.z * obj2Weight;
obj2Move.x = objsDist.x * obj1Weight;
obj2Move.y = 0;
obj2Move.z = objsDist.z * obj1Weight;
}
} else {
obj1Move.y = 0;
obj1Move.z = 0;
obj2Move.y = 0;
obj2Move.z = 0;
if (!cM3d_IsZero(crossLen)) {
obj1Move.x = -crossLen * obj2Weight;
obj2Move.x = crossLen * obj1Weight;
} else {
obj1Move.x = -obj2Weight;
obj2Move.x = obj1Weight;
}
}
obj1->GetStts()->PlusCcMove(obj1Move.x, obj1Move.y, obj1Move.z);
obj2->GetStts()->PlusCcMove(obj2Move.x, obj2Move.y, obj2Move.z);
PSVECAdd(xyz1, &obj1Move, xyz1);
PSVECAdd(xyz2, &obj2Move, xyz2);
}
}
#pragma pop
/* 80265BB4-80265CCC 2604F4 0118+00 1/1 0/0 0/0 .text CalcArea__4cCcSFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::CalcArea() {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/CalcArea__4cCcSFv.s"
void cCcS::CalcArea() {
cM3dGAab aab;
aab.ClearForMinMax();
for (cCcD_Obj** pObj = mpObj; pObj < mpObj + mObjCount; ++pObj) {
if (*pObj != NULL) {
cCcD_ShapeAttr* objShape = (*pObj)->GetShapeAttr();
objShape->CalcAabBox();
aab.SetMinMax(objShape->GetWorkAab());
}
}
mDivideArea.SetArea(aab);
for (cCcD_Obj** pObj = mpObj; pObj < mpObj + mObjCount; ++pObj) {
if (*pObj != NULL) {
const cCcD_ShapeAttr* objShape = (*pObj)->GetShapeAttr();
cCcD_DivideInfo* divideInfo = &(*pObj)->GetDivideInfo();
mDivideArea.CalcDivideInfo(divideInfo, objShape->GetWorkAab(), (*pObj)->ChkBsRevHit());
}
}
}
#pragma pop
/* 80265CCC-80265D30 26060C 0064+00 0/0 1/1 0/0 .text Move__4cCcSFv */
void cCcS::Move() {
@@ -365,14 +390,24 @@ void cCcS::Move() {
}
/* 80265D30-80265DF4 260670 00C4+00 0/0 1/1 0/0 .text DrawClear__4cCcSFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cCcS::DrawClear() {
nofralloc
#include "asm/SSystem/SComponent/c_cc_s/DrawClear__4cCcSFv.s"
void cCcS::DrawClear() {
for (cCcD_Obj** obj = this->mpObjAt; obj < this->mpObjAt + this->mObjAtCount; ++obj) {
*obj = NULL;
}
this->mObjAtCount = 0;
for (cCcD_Obj** obj = this->mpObjTg; obj < this->mpObjTg + this->mObjTgCount; ++obj) {
*obj = NULL;
}
this->mObjTgCount = 0;
for (cCcD_Obj** obj = this->mpObjCo; obj < this->mpObjCo + this->mObjCoCount; ++obj) {
*obj = NULL;
}
this->mObjCoCount = 0;
for (cCcD_Obj** obj = this->mpObj; obj < this->mpObj + this->mObjCount; ++obj) {
*obj = NULL;
}
this->mObjCount = 0;
}
#pragma pop
/* 80265DF4-80265DF8 260734 0004+00 1/0 1/0 0/0 .text
* SetCoGCorrectProc__4cCcSFP8cCcD_ObjP8cCcD_Obj */