Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions source/game/field/CollisionDirector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,47 @@ void CollisionDirector::checkCourseColNarrScLocal(f32 radius, const EGG::Vector3
ObjectDrivableDirector::Instance()->colNarScLocal(radius, pos, mask, timeOffset);
}

/// @addr{0x8078F320}
bool CollisionDirector::checkSpherePartialPush(f32 radius, const EGG::Vector3f &pos,
const EGG::Vector3f &prevPos, KCLTypeMask flags, CollisionInfoPartial *info,
KCLTypeMask *typeMaskOut, u32 timeOffset) {
if (info) {
info->bbox.setZero();
}

if (typeMaskOut) {
*typeMaskOut = KCL_NONE;
}

auto *courseColMgr = CourseColMgr::Instance();
auto *noBounceInfo = courseColMgr->noBounceWallInfo();
if (noBounceInfo) {
noBounceInfo->bbox.setZero();
noBounceInfo->dist = std::numeric_limits<f32>::min();
}

bool colliding = flags &&
courseColMgr->checkSpherePartialPush(1.0f, radius, nullptr, pos, prevPos, flags, info,
typeMaskOut);

colliding |= ObjectDrivableDirector::Instance()->checkSpherePartialPush(radius, pos, prevPos,
flags, info, typeMaskOut, timeOffset);

if (colliding) {
if (info) {
info->tangentOff = info->bbox.min + info->bbox.max;
}

if (noBounceInfo) {
noBounceInfo->tangentOff = noBounceInfo->bbox.min + noBounceInfo->bbox.max;
}
}

courseColMgr->clearNoBounceWallInfo();

return colliding;
}

/// @addr{0x8078F500}
bool CollisionDirector::checkSphereFull(f32 radius, const EGG::Vector3f &v0,
const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
Expand Down
3 changes: 3 additions & 0 deletions source/game/field/CollisionDirector.hh
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public:
void checkCourseColNarrScLocal(f32 radius, const EGG::Vector3f &pos, KCLTypeMask mask,
u32 timeOffset);

[[nodiscard]] bool checkSpherePartialPush(f32 radius, const EGG::Vector3f &pos,
const EGG::Vector3f &prevPos, KCLTypeMask flags, CollisionInfoPartial *info,
KCLTypeMask *typeMaskOut, u32 timeOffset);
[[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset);
[[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &v0,
Expand Down
3 changes: 3 additions & 0 deletions source/game/field/KCollisionTypes.hh
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,9 @@ STATIC_ASSERT(KCL_TYPE_60E8DFFF == 0x60E8DFFF);
KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER) | KCL_TYPE_BIT(COL_TYPE_FALL_BOUNDARY))
STATIC_ASSERT(KCL_TYPE_64EBDFFF == 0x64EBDFFF);

#define KCL_TYPE_64EBFFFF (KCL_TYPE_64EBDFFF | KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL))
STATIC_ASSERT(KCL_TYPE_64EBFFFF == 0x64EBFFFF);

#define KCL_TYPE_6CEBDFFF (KCL_TYPE_64EBDFFF | KCL_TYPE_BIT(COL_TYPE_ITEM_STATE_MODIFIER))
STATIC_ASSERT(KCL_TYPE_6CEBDFFF == 0x6CEBDFFF);

Expand Down
46 changes: 46 additions & 0 deletions source/game/field/jugem/JugemDirector.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include "JugemDirector.hh"

#include "game/kart/KartObjectManager.hh"

namespace Kinoko::Field {

/// @addr{0x8071E270}
JugemDirector *JugemDirector::CreateInstance() {
ASSERT(!s_instance);
s_instance = new JugemDirector;
return s_instance;
}

/// @addr{0x809C28B8}
JugemDirector *JugemDirector::Instance() {
return s_instance;
}

/// @addr{0x8071E2FC}
void JugemDirector::DestroyInstance() {
ASSERT(s_instance);
auto *instance = s_instance;
s_instance = nullptr;
delete instance;
}

/// @addr{0x8071E330}
JugemDirector::JugemDirector() : m_unit(nullptr) {}

/// @addr{0x8071E390}
JugemDirector::~JugemDirector() {
delete m_unit;
}

/// @addr{0x8071E480}
void JugemDirector::createUnits() {
// Assumes one unit
const auto *kartObj = Kart::KartObjectManager::Instance()->object(0);
m_unit = new JugemUnit(kartObj);

m_unit->createSwitchRace();
}

JugemDirector *JugemDirector::s_instance = nullptr; ///< @addr{0x809C28B8}

} // namespace Kinoko::Field
38 changes: 38 additions & 0 deletions source/game/field/jugem/JugemDirector.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#pragma once

#include "game/field/jugem/JugemUnit.hh"

namespace Kinoko::Field {

/// @brief Manager class for the lifecycle of Jugem objects for players.
class JugemDirector {
friend class Host::Context;

public:
/// @addr{0x8071E638}
void init() {
createUnits();
m_unit->init();
}

/// @addr{8071E6C0}
void calc() {
m_unit->calc();
}

static JugemDirector *CreateInstance();
[[nodiscard]] static JugemDirector *Instance();
static void DestroyInstance();

private:
JugemDirector();
~JugemDirector();

void createUnits();

JugemUnit *m_unit; ///< Assumes 1 Lakitu because 1 player

static JugemDirector *s_instance; ///< @addr{0x809C28B8}
};

} // namespace Kinoko::Field
Loading
Loading