Sync Colliders Final (#1718)

* ElementDamageInfoAT

* ElementDamageInfoAC

* colMaterial

* elemMaterial
This commit is contained in:
Derek Hensley
2024-10-18 05:54:54 -07:00
committed by GitHub
parent 001c6f0bff
commit 784c1724ff
329 changed files with 3222 additions and 3205 deletions
+7 -7
View File
@@ -4725,11 +4725,11 @@ void Actor_SetDropFlag(Actor* actor, ColliderElement* elem) {
if (acHitElem == NULL) {
actor->dropFlag = DROPFLAG_NONE;
} else if (acHitElem->toucher.dmgFlags & DMG_FIRE_ARROW) {
} else if (acHitElem->atDmgInfo.dmgFlags & DMG_FIRE_ARROW) {
actor->dropFlag = DROPFLAG_1;
} else if (acHitElem->toucher.dmgFlags & DMG_ICE_ARROW) {
} else if (acHitElem->atDmgInfo.dmgFlags & DMG_ICE_ARROW) {
actor->dropFlag = DROPFLAG_2;
} else if (acHitElem->toucher.dmgFlags & DMG_LIGHT_ARROW) {
} else if (acHitElem->atDmgInfo.dmgFlags & DMG_LIGHT_ARROW) {
actor->dropFlag = DROPFLAG_20;
} else {
actor->dropFlag = DROPFLAG_NONE;
@@ -4751,7 +4751,7 @@ void Actor_SetDropFlagJntSph(Actor* actor, ColliderJntSph* jntSph) {
if (acHitElem == NULL) {
flag = DROPFLAG_NONE;
} else {
s32 dmgFlags = acHitElem->toucher.dmgFlags;
s32 dmgFlags = acHitElem->atDmgInfo.dmgFlags;
if (dmgFlags & DMG_FIRE_ARROW) {
flag = DROPFLAG_1;
@@ -4804,7 +4804,7 @@ void func_800BE3D0(Actor* actor, s16 angle, Vec3s* arg2) {
void func_800BE504(Actor* actor, ColliderCylinder* cyl) {
// Checks if was hit by either DMG_NORMAL_ARROW, DMG_FIRE_ARROW, DMG_ICE_ARROW, DMG_LIGHT_ARROW or DMG_DEKU_BUBBLE
if ((cyl->elem.acHitElem->toucher.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20))) {
if ((cyl->elem.acHitElem->atDmgInfo.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20))) {
actor->world.rot.y = cyl->base.ac->shape.rot.y;
} else {
actor->world.rot.y = Actor_WorldYawTowardActor(cyl->base.ac, actor);
@@ -4812,7 +4812,7 @@ void func_800BE504(Actor* actor, ColliderCylinder* cyl) {
}
void func_800BE568(Actor* actor, ColliderSphere* sph) {
if (sph->elem.acHitElem->toucher.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20)) {
if (sph->elem.acHitElem->atDmgInfo.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20)) {
actor->world.rot.y = sph->base.ac->shape.rot.y;
} else {
actor->world.rot.y = Actor_WorldYawTowardActor(sph->base.ac, actor);
@@ -4820,7 +4820,7 @@ void func_800BE568(Actor* actor, ColliderSphere* sph) {
}
void func_800BE5CC(Actor* actor, ColliderJntSph* jntSph, s32 elemIndex) {
if (jntSph->elements[elemIndex].base.acHitElem->toucher.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20)) {
if (jntSph->elements[elemIndex].base.acHitElem->atDmgInfo.dmgFlags & (0x10000 | 0x2000 | 0x1000 | 0x800 | 0x20)) {
actor->world.rot.y = jntSph->base.ac->shape.rot.y;
} else {
actor->world.rot.y = Actor_WorldYawTowardActor(jntSph->base.ac, actor);
+182 -175
View File
@@ -109,8 +109,8 @@ TriNorm D_801EE188;
* Gets the damage and effect that should be applied for the collision between
* `at` and `ac`, referring to the ac actor's damage chart if applicable.
*/
f32 CollisionCheck_GetDamageAndEffectOnBumper(Collider* atCol, ColliderElement* atElem, Collider* acCol,
ColliderElement* acElem, u32* effect) {
f32 CollisionCheck_GetDamageAndEffectOnElementAC(Collider* atCol, ColliderElement* atElem, Collider* acCol,
ColliderElement* acElem, u32* effect) {
static f32 sDamageMultipliers[] = {
0.0f, 1.0f, 2.0f, 0.5f, 0.25f, 3.0f, 4.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
};
@@ -119,10 +119,10 @@ f32 CollisionCheck_GetDamageAndEffectOnBumper(Collider* atCol, ColliderElement*
f32 damage;
*effect = 0;
damage = CollisionCheck_GetToucherDamage(atCol, atElem, acCol, acElem);
damage = CollisionCheck_GetElementATDamage(atCol, atElem, acCol, acElem);
if (acCol->actor->colChkInfo.damageTable != NULL) {
dmgFlags = atElem->toucher.dmgFlags;
dmgFlags = atElem->atDmgInfo.dmgFlags;
for (i = 0; i < ARRAY_COUNT(acCol->actor->colChkInfo.damageTable->attack); i++) {
if (dmgFlags == 1) {
@@ -140,8 +140,8 @@ f32 CollisionCheck_GetDamageAndEffectOnBumper(Collider* atCol, ColliderElement*
/**
* Calculates damage after factoring in the ac collider's defense
*/
f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderElement* acElem) {
f32 finalDamage = damage - acElem->bumper.defense;
f32 CollisionCheck_ApplyElementATDefense(f32 damage, ColliderElement* acElem) {
f32 finalDamage = damage - acElem->acDmgInfo.defense;
return finalDamage;
}
@@ -150,18 +150,18 @@ f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderElement* acElem) {
* Gets the damage to be inflicted by `at` on `ac`, before applying other
* factors such as the ac collider's defense.
*/
s32 CollisionCheck_GetToucherDamage(Collider* atCol, ColliderElement* atElem, Collider* acCol,
ColliderElement* acElem) {
s32 CollisionCheck_GetElementATDamage(Collider* atCol, ColliderElement* atElem, Collider* acCol,
ColliderElement* acElem) {
if ((atCol->actor != NULL) && (atCol->actor->id == ACTOR_EN_BOM) && (acCol->actor != NULL) &&
(acCol->actor->id == ACTOR_PLAYER)) {
return 8;
}
return atElem->toucher.damage;
return atElem->atDmgInfo.damage;
}
s32 Collider_InitBase(struct PlayState* play, Collider* col) {
static Collider sDefaultCollider = {
NULL, NULL, NULL, NULL, AT_NONE, AC_NONE, OC1_NONE, OC2_NONE, COLTYPE_HIT3, COLSHAPE_MAX,
NULL, NULL, NULL, NULL, AT_NONE, AC_NONE, OC1_NONE, OC2_NONE, COL_MATERIAL_HIT3, COLSHAPE_MAX,
};
*col = sDefaultCollider;
@@ -173,7 +173,7 @@ s32 Collider_DestroyBase(struct PlayState* play, Collider* col) {
}
/**
* Uses default OC2_TYPE_1 and COLTYPE_HIT0
* Uses default OC2_TYPE_1 and COL_MATERIAL_HIT0
*/
s32 Collider_SetBaseToActor(struct PlayState* play, Collider* col, ColliderInitToActor* src) {
col->actor = src->actor;
@@ -190,7 +190,7 @@ s32 Collider_SetBaseToActor(struct PlayState* play, Collider* col, ColliderInitT
*/
s32 Collider_SetBaseType1(struct PlayState* play, Collider* col, Actor* actor, ColliderInitType1* src) {
col->actor = actor;
col->colType = src->colType;
col->colMaterial = src->colMaterial;
col->atFlags = src->atFlags;
col->acFlags = src->acFlags;
col->ocFlags1 = src->ocFlags1;
@@ -201,7 +201,7 @@ s32 Collider_SetBaseType1(struct PlayState* play, Collider* col, Actor* actor, C
s32 Collider_SetBase(struct PlayState* play, Collider* col, Actor* actor, ColliderInit* src) {
col->actor = actor;
col->colType = src->colType;
col->colMaterial = src->colMaterial;
col->atFlags = src->atFlags;
col->acFlags = src->acFlags;
col->ocFlags1 = src->ocFlags1;
@@ -226,72 +226,79 @@ void Collider_ResetOCBase(struct PlayState* play, Collider* col) {
col->ocFlags2 &= ~OC2_HIT_PLAYER;
}
s32 Collider_InitTouch(struct PlayState* play, ColliderTouch* touch) {
static ColliderTouch sDefaultColliderTouch = { 0x00000000, 0, 0 };
s32 Collider_InitElementDamageInfoAT(struct PlayState* play, ColliderElementDamageInfoAT* atDmgInfo) {
static ColliderElementDamageInfoAT sDefaultDamageInfoAT = { 0x00000000, 0, 0 };
*touch = sDefaultColliderTouch;
*atDmgInfo = sDefaultDamageInfoAT;
return 1;
}
s32 Collider_DestroyTouch(struct PlayState* play, ColliderTouch* touch) {
s32 Collider_DestroyElementDamageInfoAT(struct PlayState* play, ColliderElementDamageInfoAT* atDmgInfo) {
return 1;
}
s32 Collider_SetTouch(struct PlayState* play, ColliderTouch* touch, ColliderTouchInit* src) {
touch->dmgFlags = src->dmgFlags;
touch->effect = src->effect;
touch->damage = src->damage;
s32 Collider_SetElementDamageInfoAT(struct PlayState* play, ColliderElementDamageInfoAT* dest,
ColliderElementDamageInfoATInit* src) {
dest->dmgFlags = src->dmgFlags;
dest->effect = src->effect;
dest->damage = src->damage;
return 1;
}
void Collider_ResetATElementUnk(struct PlayState* play, ColliderElement* elem) {
}
s32 Collider_InitBump(struct PlayState* play, ColliderBump* bump) {
static ColliderBump sDefaultColliderBump = { 0xF7CFFFFF, 0, 0, { 0, 0, 0 } };
s32 Collider_InitElementDamageInfoAC(struct PlayState* play, ColliderElementDamageInfoAC* acDmgInfo) {
static ColliderElementDamageInfoAC sDefaultDamageInfoAC = { 0xF7CFFFFF, 0, 0, { 0, 0, 0 } };
*bump = sDefaultColliderBump;
*acDmgInfo = sDefaultDamageInfoAC;
return 1;
}
s32 Collider_DestroyBump(struct PlayState* play, ColliderBump* bump) {
s32 Collider_DestroyElementDamageInfoAC(struct PlayState* play, ColliderElementDamageInfoAC* acDmgInfo) {
return 1;
}
s32 Collider_SetBump(struct PlayState* play, ColliderBump* bump, ColliderBumpInit* src) {
bump->dmgFlags = src->dmgFlags;
bump->effect = src->effect;
bump->defense = src->defense;
s32 Collider_SetElementDamageInfoAC(struct PlayState* play, ColliderElementDamageInfoAC* dest,
ColliderElementDamageInfoACInit* src) {
dest->dmgFlags = src->dmgFlags;
dest->effect = src->effect;
dest->defense = src->defense;
return 1;
}
s32 Collider_InitElement(struct PlayState* play, ColliderElement* elem) {
static ColliderElement sDefaultColliderElement = {
{ 0, 0, 0 }, { 0xF7CFFFFF, 0, 0, { 0, 0, 0 } },
ELEMTYPE_UNK0, TOUCH_NONE,
BUMP_NONE, OCELEM_NONE,
NULL, NULL,
NULL, NULL,
{ 0, 0, 0 },
{ 0xF7CFFFFF, 0, 0, { 0, 0, 0 } },
ELEM_MATERIAL_UNK0,
ATELEM_NONE,
ACELEM_NONE,
OCELEM_NONE,
NULL,
NULL,
NULL,
NULL,
};
*elem = sDefaultColliderElement;
Collider_InitTouch(play, &elem->toucher);
Collider_InitBump(play, &elem->bumper);
Collider_InitElementDamageInfoAT(play, &elem->atDmgInfo);
Collider_InitElementDamageInfoAC(play, &elem->acDmgInfo);
return 1;
}
s32 Collider_DestroyElement(struct PlayState* play, ColliderElement* elem) {
Collider_DestroyTouch(play, &elem->toucher);
Collider_DestroyBump(play, &elem->bumper);
Collider_DestroyElementDamageInfoAT(play, &elem->atDmgInfo);
Collider_DestroyElementDamageInfoAC(play, &elem->acDmgInfo);
return 1;
}
s32 Collider_SetElement(struct PlayState* play, ColliderElement* elem, ColliderElementInit* elemInit) {
elem->elemType = elemInit->elemType;
Collider_SetTouch(play, &elem->toucher, &elemInit->toucher);
Collider_SetBump(play, &elem->bumper, &elemInit->bumper);
elem->toucherFlags = elemInit->toucherFlags;
elem->bumperFlags = elemInit->bumperFlags;
elem->elemMaterial = elemInit->elemMaterial;
Collider_SetElementDamageInfoAT(play, &elem->atDmgInfo, &elemInit->atDmgInfo);
Collider_SetElementDamageInfoAC(play, &elem->acDmgInfo, &elemInit->acDmgInfo);
elem->atElemFlags = elemInit->atElemFlags;
elem->acElemFlags = elemInit->acElemFlags;
elem->ocElemFlags = elemInit->ocElemFlags;
return 1;
}
@@ -299,15 +306,15 @@ s32 Collider_SetElement(struct PlayState* play, ColliderElement* elem, ColliderE
void Collider_ResetATElement(struct PlayState* play, ColliderElement* elem) {
elem->atHit = NULL;
elem->atHitElem = NULL;
elem->toucherFlags &= ~TOUCH_HIT;
elem->toucherFlags &= ~TOUCH_DREW_HITMARK;
elem->atElemFlags &= ~ATELEM_HIT;
elem->atElemFlags &= ~ATELEM_DREW_HITMARK;
Collider_ResetATElementUnk(play, elem);
}
void Collider_ResetACElement(struct PlayState* play, ColliderElement* elem) {
elem->bumper.hitPos.x = elem->bumper.hitPos.y = elem->bumper.hitPos.z = 0;
elem->bumperFlags &= ~BUMP_HIT;
elem->bumperFlags &= ~BUMP_DRAW_HITMARK;
elem->acDmgInfo.hitPos.x = elem->acDmgInfo.hitPos.y = elem->acDmgInfo.hitPos.z = 0;
elem->acElemFlags &= ~ACELEM_HIT;
elem->acElemFlags &= ~ACELEM_DRAW_HITMARK;
elem->acHit = NULL;
elem->acHitElem = NULL;
}
@@ -420,7 +427,7 @@ s32 Collider_DestroyJntSph(struct PlayState* play, ColliderJntSph* jntSph) {
/**
* Sets up the ColliderJntSph using the values in src, sets it to the actor specified in src, and dynamically allocates
* the element array. Uses default OC2_TYPE_1 and COLTYPE_HIT0.
* the element array. Uses default OC2_TYPE_1 and COL_MATERIAL_HIT0.
*/
s32 Collider_SetJntSphToActor(struct PlayState* play, ColliderJntSph* dest, ColliderJntSphInitToActor* src) {
ColliderJntSphElement* destElem;
@@ -583,7 +590,7 @@ s32 Collider_DestroyCylinder(struct PlayState* play, ColliderCylinder* cyl) {
/**
* Sets up the ColliderCylinder using the values in src and sets it to the actor specified in src. Uses default
* OC2_TYPE_1 and COLTYPE_0.
* OC2_TYPE_1 and COL_MATERIAL_0.
*/
s32 Collider_SetCylinderToActor(struct PlayState* play, ColliderCylinder* dest, ColliderCylinderInitToActor* src) {
Collider_SetBaseToActor(play, &dest->base, &src->base);
@@ -997,14 +1004,14 @@ s32 Collider_ResetQuadOC(struct PlayState* play, Collider* col) {
}
/**
* For quad colliders with TOUCH_NEAREST, resets the previous AC collider it hit if the current element is closer,
* For quad colliders with ATELEM_NEAREST, resets the previous AC collider it hit if the current element is closer,
* otherwise returns false. Used on player AT colliders to prevent multiple collisions from registering.
*/
s32 Collider_QuadSetNearestAC(struct PlayState* play, ColliderQuad* quad, Vec3f* hitPos) {
f32 acDist;
Vec3f dcMid;
if (!(quad->elem.toucherFlags & TOUCH_NEAREST)) {
if (!(quad->elem.atElemFlags & ATELEM_NEAREST)) {
return 1;
}
Math_Vec3s_ToVec3f(&dcMid, &quad->dim.dcMid);
@@ -1419,28 +1426,28 @@ s32 CollisionCheck_SetOCLine(struct PlayState* play, CollisionCheckContext* colC
/**
* Skips AT elements that are off.
*/
s32 CollisionCheck_SkipTouch(ColliderElement* elem) {
if (!(elem->toucherFlags & TOUCH_ON)) {
return 1;
s32 CollisionCheck_IsElementNotAT(ColliderElement* elem) {
if (!(elem->atElemFlags & ATELEM_ON)) {
return true;
}
return 0;
return false;
}
/**
* Skips AC elements that are off.
*/
s32 CollisionCheck_SkipBump(ColliderElement* elem) {
if (!(elem->bumperFlags & BUMP_ON)) {
return 1;
s32 CollisionCheck_IsElementNotAC(ColliderElement* elem) {
if (!(elem->acElemFlags & ACELEM_ON)) {
return true;
}
return 0;
return false;
}
/**
* If the AT element has no dmgFlags in common with the AC element, no collision happens.
*/
s32 CollisionCheck_NoSharedFlags(ColliderElement* atElem, ColliderElement* acElem) {
if (!(atElem->toucher.dmgFlags & acElem->bumper.dmgFlags)) {
if (!(atElem->atDmgInfo.dmgFlags & acElem->acDmgInfo.dmgFlags)) {
return true;
}
return false;
@@ -1589,30 +1596,30 @@ void CollisionCheck_RedBloodUnused(struct PlayState* play, Collider* col, Vec3f*
* Plays sound effects and displays hitmarks for solid-type AC colliders (METAL, WOOD, HARD, and TREE)
*/
void CollisionCheck_HitSolid(struct PlayState* play, ColliderElement* elem, Collider* col, Vec3f* hitPos) {
s32 flags = elem->toucherFlags & TOUCH_SFX_NONE;
s32 flags = elem->atElemFlags & ATELEM_SFX_NONE;
if ((flags == TOUCH_SFX_NORMAL) && (col->colType != COLTYPE_METAL)) {
if ((flags == ATELEM_SFX_NORMAL) && (col->colMaterial != COL_MATERIAL_METAL)) {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (col->actor == NULL) {
Audio_PlaySfx(NA_SE_IT_SHIELD_BOUND);
} else {
Audio_PlaySfx_AtPos(&col->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_NORMAL) {
} else if (flags == ATELEM_SFX_NORMAL) {
EffectSsHitmark_SpawnFixedScale(play, 3, hitPos);
if (col->actor == NULL) {
CollisionCheck_SpawnShieldParticlesMetal(play, hitPos);
} else {
CollisionCheck_SpawnShieldParticlesMetalSound(play, hitPos, &col->actor->projectedPos);
}
} else if (flags == TOUCH_SFX_HARD) {
} else if (flags == ATELEM_SFX_HARD) {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (col->actor == NULL) {
Audio_PlaySfx(NA_SE_IT_SHIELD_BOUND);
} else {
Audio_PlaySfx_AtPos(&col->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_WOOD) {
} else if (flags == ATELEM_SFX_WOOD) {
EffectSsHitmark_SpawnFixedScale(play, 1, hitPos);
if (col->actor == NULL) {
Audio_PlaySfx(NA_SE_IT_REFLECTION_WOOD);
@@ -1623,17 +1630,17 @@ void CollisionCheck_HitSolid(struct PlayState* play, ColliderElement* elem, Coll
}
/**
* Plays a hit sound effect for AT colliders attached to Player based on the AC element's elemType.
* Plays a hit sound effect for AT colliders attached to Player based on the AC element's elemMaterial.
*/
s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderElement* acElem) {
if ((at->actor != NULL) && (at->actor->category == ACTORCAT_PLAYER)) {
if (acElem->elemType == ELEMTYPE_UNK0) {
if (acElem->elemMaterial == ELEM_MATERIAL_UNK0) {
Audio_PlaySfx_AtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
} else if (acElem->elemType == ELEMTYPE_UNK1) {
} else if (acElem->elemMaterial == ELEM_MATERIAL_UNK1) {
Audio_PlaySfx_AtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
} else if (acElem->elemType == ELEMTYPE_UNK2) {
} else if (acElem->elemMaterial == ELEM_MATERIAL_UNK2) {
Audio_PlaySfx_AtPos(&at->actor->projectedPos, 0);
} else if (acElem->elemType == ELEMTYPE_UNK3) {
} else if (acElem->elemMaterial == ELEM_MATERIAL_UNK3) {
Audio_PlaySfx_AtPos(&at->actor->projectedPos, 0);
}
}
@@ -1653,34 +1660,34 @@ HitInfo sHitInfo[] = {
};
/**
* Handles hitmarks, blood, and sound effects for each AC collision, determined by the AC collider's colType
* Handles hitmarks, blood, and sound effects for each AC collision, determined by the AC collider's colMaterial
*/
void CollisionCheck_HitEffects(struct PlayState* play, Collider* at, ColliderElement* atElem, Collider* ac,
ColliderElement* acElem, Vec3f* hitPos) {
if (acElem->bumperFlags & BUMP_NO_HITMARK) {
if (acElem->acElemFlags & ACELEM_NO_HITMARK) {
return;
}
if (!(atElem->toucherFlags & TOUCH_AT_HITMARK) && (atElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if (!(atElem->atElemFlags & ATELEM_AT_HITMARK) && (atElem->atElemFlags & ATELEM_DREW_HITMARK)) {
return;
}
if (ac->actor != NULL) {
sBloodFuncs[sHitInfo[ac->colType].blood](play, ac, hitPos);
sBloodFuncs[sHitInfo[ac->colMaterial].blood](play, ac, hitPos);
}
if (ac->actor != NULL) {
if (sHitInfo[ac->colType].effect == HIT_SOLID) {
if (sHitInfo[ac->colMaterial].effect == HIT_SOLID) {
CollisionCheck_HitSolid(play, atElem, ac, hitPos);
} else if (sHitInfo[ac->colType].effect == HIT_WOOD) {
} else if (sHitInfo[ac->colMaterial].effect == HIT_WOOD) {
if (at->actor == NULL) {
CollisionCheck_SpawnShieldParticles(play, hitPos);
Audio_PlaySfx(NA_SE_IT_REFLECTION_WOOD);
} else {
CollisionCheck_SpawnShieldParticlesWood(play, hitPos, &at->actor->projectedPos);
}
} else if (sHitInfo[ac->colType].effect != HIT_NONE) {
EffectSsHitmark_SpawnFixedScale(play, sHitInfo[ac->colType].effect, hitPos);
if (!(acElem->bumperFlags & BUMP_NO_SWORD_SFX)) {
} else if (sHitInfo[ac->colMaterial].effect != HIT_NONE) {
EffectSsHitmark_SpawnFixedScale(play, sHitInfo[ac->colMaterial].effect, hitPos);
if (!(acElem->acElemFlags & ACELEM_NO_SWORD_SFX)) {
CollisionCheck_SwordHitAudio(at, acElem);
}
}
@@ -1710,32 +1717,32 @@ s32 CollisionCheck_SetATvsAC(struct PlayState* play, Collider* atCol, ColliderEl
f32 damage;
u32 effect;
if (CollisionCheck_GetToucherDamage(atCol, atElem, acCol, acElem) != 0) {
damage = CollisionCheck_GetDamageAndEffectOnBumper(atCol, atElem, acCol, acElem, &effect);
if (CollisionCheck_GetElementATDamage(atCol, atElem, acCol, acElem) != 0) {
damage = CollisionCheck_GetDamageAndEffectOnElementAC(atCol, atElem, acCol, acElem, &effect);
if (damage < 1.0f) {
if (effect == 0) {
return 0;
}
} else if ((CollisionCheck_ApplyBumperDefense(damage, acElem) < 1.0f) && (effect == 0)) {
} else if ((CollisionCheck_ApplyElementATDefense(damage, acElem) < 1.0f) && (effect == 0)) {
return 0;
}
}
if ((acCol->acFlags & AC_HARD) && (atCol->actor != NULL) && (acCol->actor != NULL)) {
CollisionCheck_SetBounce(atCol, acCol);
}
if (!(acElem->bumperFlags & BUMP_NO_AT_INFO)) {
if (!(acElem->acElemFlags & ACELEM_NO_AT_INFO)) {
atCol->atFlags |= AT_HIT;
atCol->at = acCol->actor;
atElem->atHit = acCol;
atElem->toucherFlags |= TOUCH_HIT;
atElem->atElemFlags |= ATELEM_HIT;
atElem->atHitElem = acElem;
if (!(atElem->bumperFlags & BUMP_HIT)) {
atElem->bumper.hitPos.x = hitPos->x;
atElem->bumper.hitPos.y = hitPos->y;
atElem->bumper.hitPos.z = hitPos->z;
if (!(atElem->acElemFlags & ACELEM_HIT)) {
atElem->acDmgInfo.hitPos.x = hitPos->x;
atElem->acDmgInfo.hitPos.y = hitPos->y;
atElem->acDmgInfo.hitPos.z = hitPos->z;
}
if (atCol->actor != NULL) {
atCol->actor->colChkInfo.atHitEffect = acElem->bumper.effect;
atCol->actor->colChkInfo.atHitEffect = acElem->acDmgInfo.effect;
}
}
if (!(atElem->ocElemFlags & OCELEM_UNK2)) {
@@ -1743,20 +1750,20 @@ s32 CollisionCheck_SetATvsAC(struct PlayState* play, Collider* atCol, ColliderEl
acCol->ac = atCol->actor;
acElem->acHit = atCol;
acElem->acHitElem = atElem;
acElem->bumperFlags |= BUMP_HIT;
acElem->acElemFlags |= ACELEM_HIT;
if (acCol->actor != NULL) {
acCol->actor->colChkInfo.acHitEffect = atElem->toucher.effect;
acCol->actor->colChkInfo.acHitEffect = atElem->atDmgInfo.effect;
}
acElem->bumper.hitPos.x = hitPos->x;
acElem->bumper.hitPos.y = hitPos->y;
acElem->bumper.hitPos.z = hitPos->z;
acElem->acDmgInfo.hitPos.x = hitPos->x;
acElem->acDmgInfo.hitPos.y = hitPos->y;
acElem->acDmgInfo.hitPos.z = hitPos->z;
}
if (!(atElem->toucherFlags & TOUCH_AT_HITMARK) && (acCol->colType != COLTYPE_METAL) &&
(acCol->colType != COLTYPE_WOOD) && (acCol->colType != COLTYPE_HARD)) {
acElem->bumperFlags |= BUMP_DRAW_HITMARK;
if (!(atElem->atElemFlags & ATELEM_AT_HITMARK) && (acCol->colMaterial != COL_MATERIAL_METAL) &&
(acCol->colMaterial != COL_MATERIAL_WOOD) && (acCol->colMaterial != COL_MATERIAL_HARD)) {
acElem->acElemFlags |= ACELEM_DRAW_HITMARK;
} else {
CollisionCheck_HitEffects(play, atCol, atElem, acCol, acElem, hitPos);
atElem->toucherFlags |= TOUCH_DREW_HITMARK;
atElem->atElemFlags |= ATELEM_DREW_HITMARK;
}
return 1;
}
@@ -1793,13 +1800,13 @@ void CollisionCheck_AC_JntSphVsJntSph(struct PlayState* play, CollisionCheckCont
if ((atJntSph->count > 0) && (atJntSph->elements != NULL) && (acJntSph->count > 0) &&
(acJntSph->elements != NULL)) {
for (atJntSphElem = atJntSph->elements; atJntSphElem < &atJntSph->elements[atJntSph->count]; atJntSphElem++) {
if (CollisionCheck_SkipTouch(&atJntSphElem->base)) {
if (CollisionCheck_IsElementNotAT(&atJntSphElem->base)) {
continue;
}
for (acJntSphElem = acJntSph->elements; acJntSphElem < &acJntSph->elements[acJntSph->count];
acJntSphElem++) {
if (CollisionCheck_SkipBump(&acJntSphElem->base)) {
if (CollisionCheck_IsElementNotAC(&acJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atJntSphElem->base, &acJntSphElem->base)) {
@@ -1848,11 +1855,11 @@ void CollisionCheck_AC_JntSphVsCyl(struct PlayState* play, CollisionCheckContext
f32 centerDist;
if ((atJntSph->count > 0) && (atJntSph->elements != NULL) && (acCyl->dim.radius > 0) && (acCyl->dim.height > 0)) {
if (CollisionCheck_SkipBump(&acCyl->elem)) {
if (CollisionCheck_IsElementNotAC(&acCyl->elem)) {
return;
}
for (atJntSphElem = atJntSph->elements; atJntSphElem < &atJntSph->elements[atJntSph->count]; atJntSphElem++) {
if (CollisionCheck_SkipTouch(&atJntSphElem->base)) {
if (CollisionCheck_IsElementNotAT(&atJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atJntSphElem->base, &acCyl->elem)) {
@@ -1900,11 +1907,11 @@ void CollisionCheck_AC_JntSphVsTris(struct PlayState* play, CollisionCheckContex
if ((atJntSph->count > 0) && (atJntSph->elements != NULL) && (acTris->count > 0) && (acTris->elements != NULL)) {
for (atJntSphElem = atJntSph->elements; atJntSphElem < &atJntSph->elements[atJntSph->count]; atJntSphElem++) {
if (CollisionCheck_SkipTouch(&atJntSphElem->base)) {
if (CollisionCheck_IsElementNotAT(&atJntSphElem->base)) {
continue;
}
for (acTrisElem = acTris->elements; acTrisElem < &acTris->elements[acTris->count]; acTrisElem++) {
if (CollisionCheck_SkipBump(&acTrisElem->base)) {
if (CollisionCheck_IsElementNotAC(&acTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atJntSphElem->base, &acTrisElem->base)) {
@@ -1936,14 +1943,14 @@ void CollisionCheck_AC_JntSphVsQuad(struct PlayState* play, CollisionCheckContex
ColliderJntSphElement* atJntSphElem;
if ((atJntSph->count > 0) && (atJntSph->elements != NULL)) {
if (CollisionCheck_SkipBump(&acQuad->elem)) {
if (CollisionCheck_IsElementNotAC(&acQuad->elem)) {
return;
}
Math3D_TriNorm(&D_801EF590, &acQuad->dim.quad[2], &acQuad->dim.quad[3], &acQuad->dim.quad[1]);
Math3D_TriNorm(&D_801EF5C8, &acQuad->dim.quad[1], &acQuad->dim.quad[0], &acQuad->dim.quad[2]);
for (atJntSphElem = atJntSph->elements; atJntSphElem < &atJntSph->elements[atJntSph->count]; atJntSphElem++) {
if (CollisionCheck_SkipTouch(&atJntSphElem->base)) {
if (CollisionCheck_IsElementNotAT(&atJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atJntSphElem->base, &acQuad->elem)) {
@@ -1976,11 +1983,11 @@ void CollisionCheck_AC_JntSphVsSphere(struct PlayState* play, CollisionCheckCont
f32 centerDist;
if ((atJntSph->count > 0) && (atJntSph->elements != NULL)) {
if (CollisionCheck_SkipBump(&acSph->elem)) {
if (CollisionCheck_IsElementNotAC(&acSph->elem)) {
return;
}
for (atJntSphElem = atJntSph->elements; atJntSphElem < &atJntSph->elements[atJntSph->count]; atJntSphElem++) {
if (CollisionCheck_SkipTouch(&atJntSphElem->base)) {
if (CollisionCheck_IsElementNotAT(&atJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atJntSphElem->base, &acSph->elem)) {
@@ -2022,11 +2029,11 @@ void CollisionCheck_AC_CylVsJntSph(struct PlayState* play, CollisionCheckContext
ColliderJntSphElement* acJntSphElem;
if ((acJntSph->count > 0) && (acJntSph->elements != NULL) && (atCyl->dim.radius > 0) && (atCyl->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&atCyl->elem)) {
if (CollisionCheck_IsElementNotAT(&atCyl->elem)) {
return;
}
for (acJntSphElem = acJntSph->elements; acJntSphElem < &acJntSph->elements[acJntSph->count]; acJntSphElem++) {
if (CollisionCheck_SkipBump(&acJntSphElem->base)) {
if (CollisionCheck_IsElementNotAC(&acJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atCyl->elem, &acJntSphElem->base)) {
@@ -2074,10 +2081,10 @@ void CollisionCheck_AC_CylVsCyl(struct PlayState* play, CollisionCheckContext* c
f32 centerDist;
if ((atCyl->dim.radius > 0) && (atCyl->dim.height > 0) && (acCyl->dim.radius > 0) && (acCyl->dim.height > 0)) {
if (CollisionCheck_SkipBump(&acCyl->elem)) {
if (CollisionCheck_IsElementNotAC(&acCyl->elem)) {
return;
}
if (CollisionCheck_SkipTouch(&atCyl->elem)) {
if (CollisionCheck_IsElementNotAT(&atCyl->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atCyl->elem, &acCyl->elem)) {
@@ -2128,12 +2135,12 @@ void CollisionCheck_AC_CylVsTris(struct PlayState* play, CollisionCheckContext*
Vec3f hitPos;
if ((atCyl->dim.radius > 0) && (atCyl->dim.height > 0) && (acTris->count > 0) && (acTris->elements != NULL)) {
if (CollisionCheck_SkipTouch(&atCyl->elem)) {
if (CollisionCheck_IsElementNotAT(&atCyl->elem)) {
return;
}
for (acTrisElem = acTris->elements; acTrisElem < &acTris->elements[acTris->count]; acTrisElem++) {
if (CollisionCheck_SkipBump(&acTrisElem->base)) {
if (CollisionCheck_IsElementNotAC(&acTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atCyl->elem, &acTrisElem->base)) {
@@ -2163,10 +2170,10 @@ void CollisionCheck_AC_CylVsQuad(struct PlayState* play, CollisionCheckContext*
ColliderQuad* acQuad = (ColliderQuad*)acCol;
if ((atCyl->dim.height > 0) && (atCyl->dim.radius > 0)) {
if (CollisionCheck_SkipTouch(&atCyl->elem)) {
if (CollisionCheck_IsElementNotAT(&atCyl->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acQuad->elem)) {
if (CollisionCheck_IsElementNotAC(&acQuad->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atCyl->elem, &acQuad->elem)) {
@@ -2206,10 +2213,10 @@ void CollisionCheck_AC_CylVsSphere(struct PlayState* play, CollisionCheckContext
f32 centerDist;
if ((atCyl->dim.radius > 0) && (atCyl->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&atCyl->elem)) {
if (CollisionCheck_IsElementNotAT(&atCyl->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acSph->elem)) {
if (CollisionCheck_IsElementNotAC(&acSph->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atCyl->elem, &acSph->elem)) {
@@ -2256,11 +2263,11 @@ void CollisionCheck_AC_TrisVsJntSph(struct PlayState* play, CollisionCheckContex
if ((acJntSph->count > 0) && (acJntSph->elements != NULL) && (atTris->count > 0) && (atTris->elements != NULL)) {
for (acJntSphElem = acJntSph->elements; acJntSphElem < &acJntSph->elements[acJntSph->count]; acJntSphElem++) {
if (CollisionCheck_SkipBump(&acJntSphElem->base)) {
if (CollisionCheck_IsElementNotAC(&acJntSphElem->base)) {
continue;
}
for (atTrisElem = atTris->elements; atTrisElem < &atTris->elements[atTris->count]; atTrisElem++) {
if (CollisionCheck_SkipTouch(&atTrisElem->base)) {
if (CollisionCheck_IsElementNotAT(&atTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atTrisElem->base, &acJntSphElem->base)) {
@@ -2294,11 +2301,11 @@ void CollisionCheck_AC_TrisVsCyl(struct PlayState* play, CollisionCheckContext*
ColliderTrisElement* atTrisElem;
if ((acCyl->dim.radius > 0) && (acCyl->dim.height > 0) && (atTris->count > 0) && (atTris->elements != NULL)) {
if (CollisionCheck_SkipBump(&acCyl->elem)) {
if (CollisionCheck_IsElementNotAC(&acCyl->elem)) {
return;
}
for (atTrisElem = atTris->elements; atTrisElem < &atTris->elements[atTris->count]; atTrisElem++) {
if (CollisionCheck_SkipTouch(&atTrisElem->base)) {
if (CollisionCheck_IsElementNotAT(&atTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atTrisElem->base, &acCyl->elem)) {
@@ -2330,11 +2337,11 @@ void CollisionCheck_AC_TrisVsTris(struct PlayState* play, CollisionCheckContext*
if ((acTris->count > 0) && (acTris->elements != NULL) && (atTris->count > 0) && (atTris->elements != NULL)) {
for (acTrisElem = acTris->elements; acTrisElem < &acTris->elements[acTris->count]; acTrisElem++) {
if (CollisionCheck_SkipBump(&acTrisElem->base)) {
if (CollisionCheck_IsElementNotAC(&acTrisElem->base)) {
continue;
}
for (atTrisElem = atTris->elements; atTrisElem < &atTris->elements[atTris->count]; atTrisElem++) {
if (CollisionCheck_SkipTouch(&atTrisElem->base)) {
if (CollisionCheck_IsElementNotAT(&atTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atTrisElem->base, &acTrisElem->base)) {
@@ -2365,7 +2372,7 @@ void CollisionCheck_AC_TrisVsQuad(struct PlayState* play, CollisionCheckContext*
ColliderTrisElement* atTrisElem;
if ((atTris->count > 0) && (atTris->elements != NULL)) {
if (CollisionCheck_SkipBump(&acQuad->elem)) {
if (CollisionCheck_IsElementNotAC(&acQuad->elem)) {
return;
}
@@ -2373,7 +2380,7 @@ void CollisionCheck_AC_TrisVsQuad(struct PlayState* play, CollisionCheckContext*
Math3D_TriNorm(&D_801EDE78, &acQuad->dim.quad[1], &acQuad->dim.quad[0], &acQuad->dim.quad[2]);
for (atTrisElem = atTris->elements; atTrisElem < &atTris->elements[atTris->count]; atTrisElem++) {
if (CollisionCheck_SkipTouch(&atTrisElem->base)) {
if (CollisionCheck_IsElementNotAT(&atTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atTrisElem->base, &acQuad->elem)) {
@@ -2405,11 +2412,11 @@ void CollisionCheck_AC_TrisVsSphere(struct PlayState* play, CollisionCheckContex
Vec3f hitPos;
if ((atTris->count > 0) && (atTris->elements != NULL)) {
if (CollisionCheck_SkipBump(&acSph->elem)) {
if (CollisionCheck_IsElementNotAC(&acSph->elem)) {
return;
}
for (atTrisElem = atTris->elements; atTrisElem < &atTris->elements[atTris->count]; atTrisElem++) {
if (CollisionCheck_SkipTouch(&atTrisElem->base)) {
if (CollisionCheck_IsElementNotAT(&atTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atTrisElem->base, &acSph->elem)) {
@@ -2439,14 +2446,14 @@ void CollisionCheck_AC_QuadVsJntSph(struct PlayState* play, CollisionCheckContex
ColliderJntSph* acJntSph = (ColliderJntSph*)acCol;
if ((acJntSph->count > 0) && (acJntSph->elements != NULL)) {
if (CollisionCheck_SkipTouch(&atQuad->elem)) {
if (CollisionCheck_IsElementNotAT(&atQuad->elem)) {
return;
}
Math3D_TriNorm(&D_801EDEC8, &atQuad->dim.quad[2], &atQuad->dim.quad[3], &atQuad->dim.quad[1]);
Math3D_TriNorm(&D_801EDF00, &atQuad->dim.quad[2], &atQuad->dim.quad[1], &atQuad->dim.quad[0]);
for (acJntSphElem = acJntSph->elements; acJntSphElem < &acJntSph->elements[acJntSph->count]; acJntSphElem++) {
if (CollisionCheck_SkipBump(&acJntSphElem->base)) {
if (CollisionCheck_IsElementNotAC(&acJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atQuad->elem, &acJntSphElem->base)) {
@@ -2482,10 +2489,10 @@ void CollisionCheck_AC_QuadVsCyl(struct PlayState* play, CollisionCheckContext*
ColliderCylinder* acCyl = (ColliderCylinder*)acCol;
if ((acCyl->dim.height > 0) && (acCyl->dim.radius > 0)) {
if (CollisionCheck_SkipBump(&acCyl->elem)) {
if (CollisionCheck_IsElementNotAC(&acCyl->elem)) {
return;
}
if (CollisionCheck_SkipTouch(&atQuad->elem)) {
if (CollisionCheck_IsElementNotAT(&atQuad->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atQuad->elem, &acCyl->elem)) {
@@ -2531,7 +2538,7 @@ void CollisionCheck_AC_QuadVsTris(struct PlayState* play, CollisionCheckContext*
ColliderTrisElement* acTrisElem;
if ((acTris->count > 0) && (acTris->elements != NULL)) {
if (CollisionCheck_SkipTouch(&atQuad->elem)) {
if (CollisionCheck_IsElementNotAT(&atQuad->elem)) {
return;
}
@@ -2539,7 +2546,7 @@ void CollisionCheck_AC_QuadVsTris(struct PlayState* play, CollisionCheckContext*
Math3D_TriNorm(&D_801EE038, &atQuad->dim.quad[1], &atQuad->dim.quad[0], &atQuad->dim.quad[2]);
for (acTrisElem = acTris->elements; acTrisElem < &acTris->elements[acTris->count]; acTrisElem++) {
if (CollisionCheck_SkipBump(&acTrisElem->base)) {
if (CollisionCheck_IsElementNotAC(&acTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atQuad->elem, &acTrisElem->base)) {
@@ -2573,10 +2580,10 @@ void CollisionCheck_AC_QuadVsQuad(struct PlayState* play, CollisionCheckContext*
s32 i;
s32 j;
if (CollisionCheck_SkipTouch(&atQuad->elem)) {
if (CollisionCheck_IsElementNotAT(&atQuad->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acQuad->elem)) {
if (CollisionCheck_IsElementNotAC(&acQuad->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atQuad->elem, &acQuad->elem)) {
@@ -2614,10 +2621,10 @@ void CollisionCheck_AC_QuadVsSphere(struct PlayState* play, CollisionCheckContex
Vec3f hitPos;
ColliderSphere* acSph = (ColliderSphere*)acCol;
if (CollisionCheck_SkipTouch(&atQuad->elem)) {
if (CollisionCheck_IsElementNotAT(&atQuad->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acSph->elem) || CollisionCheck_NoSharedFlags(&atQuad->elem, &acSph->elem)) {
if (CollisionCheck_IsElementNotAC(&acSph->elem) || CollisionCheck_NoSharedFlags(&atQuad->elem, &acSph->elem)) {
return;
}
@@ -2650,12 +2657,12 @@ void CollisionCheck_AC_SphereVsJntSph(struct PlayState* play, CollisionCheckCont
f32 centerDist;
if ((acJntSph->count > 0) && (acJntSph->elements != NULL)) {
if (CollisionCheck_SkipTouch(&atSph->elem)) {
if (CollisionCheck_IsElementNotAT(&atSph->elem)) {
return;
}
for (acJntSphElem = acJntSph->elements; acJntSphElem < &acJntSph->elements[acJntSph->count]; acJntSphElem++) {
if (CollisionCheck_SkipBump(&acJntSphElem->base)) {
if (CollisionCheck_IsElementNotAC(&acJntSphElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atSph->elem, &acJntSphElem->base)) {
@@ -2696,10 +2703,10 @@ void CollisionCheck_AC_SphereVsCylinder(struct PlayState* play, CollisionCheckCo
f32 overlapSize;
f32 centerDist;
if (CollisionCheck_SkipTouch(&atSph->elem)) {
if (CollisionCheck_IsElementNotAT(&atSph->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acCyl->elem)) {
if (CollisionCheck_IsElementNotAC(&acCyl->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atSph->elem, &acCyl->elem)) {
@@ -2743,12 +2750,12 @@ void CollisionCheck_AC_SphereVsTris(struct PlayState* play, CollisionCheckContex
ColliderTrisElement* acTrisElem;
Vec3f hitPos;
if (CollisionCheck_SkipTouch(&atSph->elem)) {
if (CollisionCheck_IsElementNotAT(&atSph->elem)) {
return;
}
for (acTrisElem = acTris->elements; acTrisElem < &acTris->elements[acTris->count]; acTrisElem++) {
if (CollisionCheck_SkipBump(&acTrisElem->base)) {
if (CollisionCheck_IsElementNotAC(&acTrisElem->base)) {
continue;
}
if (CollisionCheck_NoSharedFlags(&atSph->elem, &acTrisElem->base)) {
@@ -2776,10 +2783,10 @@ void CollisionCheck_AC_SphereVsQuad(struct PlayState* play, CollisionCheckContex
Vec3f hitPos;
ColliderQuad* acQuad = (ColliderQuad*)acCol;
if (CollisionCheck_SkipTouch(&atSph->elem)) {
if (CollisionCheck_IsElementNotAT(&atSph->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acQuad->elem) || CollisionCheck_NoSharedFlags(&atSph->elem, &acQuad->elem)) {
if (CollisionCheck_IsElementNotAC(&acQuad->elem) || CollisionCheck_NoSharedFlags(&atSph->elem, &acQuad->elem)) {
return;
}
@@ -2808,10 +2815,10 @@ void CollisionCheck_AC_SphereVsSphere(struct PlayState* play, CollisionCheckCont
f32 overlapSize;
f32 centerDist;
if (CollisionCheck_SkipTouch(&atSph->elem)) {
if (CollisionCheck_IsElementNotAT(&atSph->elem)) {
return;
}
if (CollisionCheck_SkipBump(&acSph->elem)) {
if (CollisionCheck_IsElementNotAC(&acSph->elem)) {
return;
}
if (CollisionCheck_NoSharedFlags(&atSph->elem, &acSph->elem)) {
@@ -2846,14 +2853,14 @@ void CollisionCheck_SetJntSphHitFX(struct PlayState* play, CollisionCheckContext
ColliderJntSphElement* jntSphElem;
for (jntSphElem = jntSph->elements; jntSphElem < &jntSph->elements[jntSph->count]; jntSphElem++) {
if ((jntSphElem->base.bumperFlags & BUMP_DRAW_HITMARK) && (jntSphElem->base.acHitElem != NULL) &&
!(jntSphElem->base.acHitElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if ((jntSphElem->base.acElemFlags & ACELEM_DRAW_HITMARK) && (jntSphElem->base.acHitElem != NULL) &&
!(jntSphElem->base.acHitElem->atElemFlags & ATELEM_DREW_HITMARK)) {
Vec3f hitPos;
Math_Vec3s_ToVec3f(&hitPos, &jntSphElem->base.bumper.hitPos);
Math_Vec3s_ToVec3f(&hitPos, &jntSphElem->base.acDmgInfo.hitPos);
CollisionCheck_HitEffects(play, jntSphElem->base.acHit, jntSphElem->base.acHitElem, &jntSph->base,
&jntSphElem->base, &hitPos);
jntSphElem->base.acHitElem->toucherFlags |= TOUCH_DREW_HITMARK;
jntSphElem->base.acHitElem->atElemFlags |= ATELEM_DREW_HITMARK;
return;
}
}
@@ -2865,13 +2872,13 @@ void CollisionCheck_SetJntSphHitFX(struct PlayState* play, CollisionCheckContext
void CollisionCheck_SetCylHitFX(struct PlayState* play, CollisionCheckContext* colChkCtx, Collider* col) {
ColliderCylinder* cyl = (ColliderCylinder*)col;
if ((cyl->elem.bumperFlags & BUMP_DRAW_HITMARK) && (cyl->elem.acHitElem != NULL) &&
!(cyl->elem.acHitElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if ((cyl->elem.acElemFlags & ACELEM_DRAW_HITMARK) && (cyl->elem.acHitElem != NULL) &&
!(cyl->elem.acHitElem->atElemFlags & ATELEM_DREW_HITMARK)) {
Vec3f hitPos;
Math_Vec3s_ToVec3f(&hitPos, &cyl->elem.bumper.hitPos);
Math_Vec3s_ToVec3f(&hitPos, &cyl->elem.acDmgInfo.hitPos);
CollisionCheck_HitEffects(play, cyl->elem.acHit, cyl->elem.acHitElem, &cyl->base, &cyl->elem, &hitPos);
cyl->elem.acHitElem->toucherFlags |= TOUCH_DREW_HITMARK;
cyl->elem.acHitElem->atElemFlags |= ATELEM_DREW_HITMARK;
}
}
@@ -2883,14 +2890,14 @@ void CollisionCheck_SetTrisHitFX(struct PlayState* play, CollisionCheckContext*
ColliderTrisElement* trisElem;
for (trisElem = tris->elements; trisElem < &tris->elements[tris->count]; trisElem++) {
if ((trisElem->base.bumperFlags & BUMP_DRAW_HITMARK) && (trisElem->base.acHitElem != NULL) &&
!(trisElem->base.acHitElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if ((trisElem->base.acElemFlags & ACELEM_DRAW_HITMARK) && (trisElem->base.acHitElem != NULL) &&
!(trisElem->base.acHitElem->atElemFlags & ATELEM_DREW_HITMARK)) {
Vec3f hitPos;
Math_Vec3s_ToVec3f(&hitPos, &trisElem->base.bumper.hitPos);
Math_Vec3s_ToVec3f(&hitPos, &trisElem->base.acDmgInfo.hitPos);
CollisionCheck_HitEffects(play, trisElem->base.acHit, trisElem->base.acHitElem, &tris->base,
&trisElem->base, &hitPos);
trisElem->base.acHitElem->toucherFlags |= TOUCH_DREW_HITMARK;
trisElem->base.acHitElem->atElemFlags |= ATELEM_DREW_HITMARK;
return;
}
}
@@ -2902,13 +2909,13 @@ void CollisionCheck_SetTrisHitFX(struct PlayState* play, CollisionCheckContext*
void CollisionCheck_SetQuadHitFX(struct PlayState* play, CollisionCheckContext* colChkCtx, Collider* col) {
ColliderQuad* quad = (ColliderQuad*)col;
if ((quad->elem.bumperFlags & BUMP_DRAW_HITMARK) && (quad->elem.acHitElem != NULL) &&
!(quad->elem.acHitElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if ((quad->elem.acElemFlags & ACELEM_DRAW_HITMARK) && (quad->elem.acHitElem != NULL) &&
!(quad->elem.acHitElem->atElemFlags & ATELEM_DREW_HITMARK)) {
Vec3f hitPos;
Math_Vec3s_ToVec3f(&hitPos, &quad->elem.bumper.hitPos);
Math_Vec3s_ToVec3f(&hitPos, &quad->elem.acDmgInfo.hitPos);
CollisionCheck_HitEffects(play, quad->elem.acHit, quad->elem.acHitElem, &quad->base, &quad->elem, &hitPos);
quad->elem.acHitElem->toucherFlags |= TOUCH_DREW_HITMARK;
quad->elem.acHitElem->atElemFlags |= ATELEM_DREW_HITMARK;
}
}
@@ -2918,13 +2925,13 @@ void CollisionCheck_SetQuadHitFX(struct PlayState* play, CollisionCheckContext*
void CollisionCheck_SetSphereHitFX(struct PlayState* play, CollisionCheckContext* colChkCtx, Collider* col) {
ColliderSphere* sph = (ColliderSphere*)col;
if ((sph->elem.bumperFlags & BUMP_DRAW_HITMARK) && (sph->elem.acHitElem != NULL) &&
!(sph->elem.acHitElem->toucherFlags & TOUCH_DREW_HITMARK)) {
if ((sph->elem.acElemFlags & ACELEM_DRAW_HITMARK) && (sph->elem.acHitElem != NULL) &&
!(sph->elem.acHitElem->atElemFlags & ATELEM_DREW_HITMARK)) {
Vec3f hitPos;
Math_Vec3s_ToVec3f(&hitPos, &sph->elem.bumper.hitPos);
Math_Vec3s_ToVec3f(&hitPos, &sph->elem.acDmgInfo.hitPos);
CollisionCheck_HitEffects(play, sph->elem.acHit, sph->elem.acHitElem, &sph->base, &sph->elem, &hitPos);
sph->elem.acHitElem->toucherFlags |= TOUCH_DREW_HITMARK;
sph->elem.acHitElem->atElemFlags |= ATELEM_DREW_HITMARK;
}
}
@@ -3024,7 +3031,7 @@ void CollisionCheck_AC(struct PlayState* play, CollisionCheckContext* colChkCtx,
* Iterates through all AT colliders, testing them for AC collisions with each AC collider, setting the info regarding
* the collision for each AC and AT collider that collided. Then spawns hitmarks and plays sound effects for each
* successful collision. To collide, an AT collider must share a type (AC_TYPE_PLAYER, AC_TYPE_ENEMY, or AC_TYPE_OTHER)
* with the AC collider and the toucher and bumper elements that overlapped must share a dmgFlag.
* with the AC collider and the atDmgInfo and acDmgInfo elements that overlapped must share a dmgFlag.
*/
void CollisionCheck_AT(struct PlayState* play, CollisionCheckContext* colChkCtx) {
Collider** acColP;
@@ -3536,7 +3543,7 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c
if ((col->actor == NULL) || !(col->acFlags & AC_HIT)) {
return;
}
if (!(elem->bumperFlags & BUMP_HIT) || (elem->bumperFlags & BUMP_NO_DAMAGE)) {
if (!(elem->acElemFlags & ACELEM_HIT) || (elem->acElemFlags & ACELEM_NO_DAMAGE)) {
return;
}
@@ -3544,16 +3551,16 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c
atElem = elem->acHitElem;
if ((atCol != NULL) && (atElem != NULL) && (col != NULL) && (elem != NULL)) {
damage = CollisionCheck_GetDamageAndEffectOnBumper(atCol, atElem, col, elem, &effect);
damage = CollisionCheck_GetDamageAndEffectOnElementAC(atCol, atElem, col, elem, &effect);
if (CollisionCheck_GetToucherDamage(atCol, atElem, col, elem) != 0) {
if (CollisionCheck_GetElementATDamage(atCol, atElem, col, elem) != 0) {
if (damage < 1.0f) {
finalDamage = 0.0f;
if (effect == 0) {
return;
}
} else {
finalDamage = CollisionCheck_ApplyBumperDefense(damage, elem);
finalDamage = CollisionCheck_ApplyElementATDefense(damage, elem);
if ((finalDamage < 1.0f) && (effect == 0)) {
return;
}
@@ -3562,7 +3569,7 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c
if (col->actor->colChkInfo.damageTable != NULL) {
col->actor->colChkInfo.damageEffect = effect;
}
if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->toucher.dmgFlags == 0x20000000))) {
if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->atDmgInfo.dmgFlags == 0x20000000))) {
if (col->actor->colChkInfo.damage < finalDamage) {
col->actor->colChkInfo.damage = finalDamage;
}
+4 -4
View File
@@ -27,7 +27,7 @@ ActorProfile En_A_Obj_Profile = {
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
COL_MATERIAL_NONE,
AT_NONE,
AC_NONE,
OC1_ON | OC1_TYPE_ALL,
@@ -35,11 +35,11 @@ static ColliderCylinderInit sCylinderInit = {
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
ELEM_MATERIAL_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE,
BUMP_NONE,
ATELEM_NONE,
ACELEM_NONE,
OCELEM_ON,
},
{ 25, 60, 0, { 0, 0, 0 } },
+4 -4
View File
@@ -39,7 +39,7 @@ ActorProfile En_Item00_Profile = {
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
COL_MATERIAL_NONE,
AT_NONE,
AC_ON | AT_TYPE_PLAYER,
OC1_NONE,
@@ -47,11 +47,11 @@ static ColliderCylinderInit sCylinderInit = {
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
ELEM_MATERIAL_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000010, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
ATELEM_NONE | ATELEM_SFX_NORMAL,
ACELEM_ON,
OCELEM_NONE,
},
{ 10, 30, 0, { 0, 0, 0 } },
+6 -6
View File
@@ -4,7 +4,7 @@
ColliderCylinderInit sFireObjCollisionInit = {
{
COLTYPE_NONE,
COL_MATERIAL_NONE,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_NONE,
@@ -12,11 +12,11 @@ ColliderCylinderInit sFireObjCollisionInit = {
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK4,
ELEM_MATERIAL_UNK4,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000820, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
ATELEM_NONE | ATELEM_SFX_NORMAL,
ACELEM_ON,
OCELEM_NONE,
},
{ 18, 67, 0, { 0, 0, 0 } },
@@ -223,13 +223,13 @@ void FireObj_Update(PlayState* play, FireObj* fire, Actor* actor) {
FireObj_UpdateStateTransitions(play, fire);
if (fire->state == FIRE_STATE_NOT_LIT) {
if ((fire->collision.base.acFlags & AC_HIT) &&
(fire->collision.elem.acHitElem->toucher.dmgFlags & DMG_FIRE_ARROW)) {
(fire->collision.elem.acHitElem->atDmgInfo.dmgFlags & DMG_FIRE_ARROW)) {
FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_GROWING);
}
} else if ((fire->collision.base.acFlags & AC_HIT) && (arrow->actor.update != NULL) &&
(arrow->actor.id == ACTOR_EN_ARROW)) {
arrow->actor.params = 0;
arrow->collider.elem.toucher.dmgFlags = DMG_FIRE_ARROW;
arrow->collider.elem.atDmgInfo.dmgFlags = DMG_FIRE_ARROW;
}
fire->collision.dim.pos.x = fire->position.x;
fire->collision.dim.pos.y = fire->position.y;
+5 -5
View File
@@ -2415,17 +2415,17 @@ s32 func_80126440(PlayState* play, ColliderQuad* collider, WeaponInfo* weaponInf
return true;
}
u8 sPlayerShieldCollisionTypes[PLAYER_SHIELD_MAX] = {
COLTYPE_METAL, // PLAYER_SHIELD_NONE
COLTYPE_METAL, // PLAYER_SHIELD_HEROS_SHIELD
COLTYPE_METAL, // PLAYER_SHIELD_MIRROR_SHIELD
u8 sPlayerShieldColMaterials[PLAYER_SHIELD_MAX] = {
COL_MATERIAL_METAL, // PLAYER_SHIELD_NONE
COL_MATERIAL_METAL, // PLAYER_SHIELD_HEROS_SHIELD
COL_MATERIAL_METAL, // PLAYER_SHIELD_MIRROR_SHIELD
};
void Player_UpdateShieldCollider(PlayState* play, Player* player, ColliderQuad* collider, Vec3f quadSrc[4]) {
if (player->stateFlags1 & PLAYER_STATE1_400000) {
Vec3f quadDest[4];
player->shieldQuad.base.colType = sPlayerShieldCollisionTypes[player->currentShield];
player->shieldQuad.base.colMaterial = sPlayerShieldColMaterials[player->currentShield];
Matrix_MultVec3f(&quadSrc[0], &quadDest[0]);
Matrix_MultVec3f(&quadSrc[1], &quadDest[1]);
Matrix_MultVec3f(&quadSrc[2], &quadDest[2]);