1#include "ObjectBird.hh"
3#include "game/field/CollisionDirector.hh"
5#include "game/system/RaceManager.hh"
11 m_leader =
new ObjectBirdLeader(params,
this);
14 u32 count = params.setting(1);
19 m_followers = std::span<ObjectBirdFollower *>(
new ObjectBirdFollower *[count], count);
21 for (
u32 i = 0; i < count; ++i) {
22 auto *bird =
new ObjectBirdFollower(params,
this, i);
23 m_followers[i] = bird;
29ObjectBird::~ObjectBird() {
30 delete[] m_followers.data();
34void ObjectBird::calc() {
35 constexpr f32 MIN_SPACING = 300.0f;
37 for (
u32 i = 0; i < m_followers.size() - 1; ++i) {
40 for (
u32 j = i + 1; j < m_followers.size(); ++j) {
43 f32 len = posDelta.
length();
45 if (len >= MIN_SPACING) {
50 m_followers[j]->setPos(secondPos - posDelta * (MIN_SPACING - len));
57 : ObjectCollidable(params), m_bird(bird) {}
60ObjectBirdLeader::~ObjectBirdLeader() =
default;
63void ObjectBirdLeader::init() {
64 auto *anmMgr = m_drawMdl->anmMgr();
65 anmMgr->playAnim(0.0f, 1.0f, 0);
66 f32 frameCount = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
68 auto &rand = System::RaceManager::Instance()->random();
69 f32 rate = rand.getF32(
static_cast<f32
>(frameCount));
70 anmMgr->playAnim(rate, 1.0f, 0);
72 m_railInterpolator->init(0.0f, 0);
73 m_railInterpolator->calc();
74 m_pos = m_railInterpolator->curPos();
75 m_flags.setBit(eFlags::Position);
76 m_railInterpolator->setCurrVel(
static_cast<f32
>(m_mapObj->setting(0)));
80void ObjectBirdLeader::calc() {
81 m_railInterpolator->calc();
82 m_pos = m_railInterpolator->curPos();
83 m_flags.setBit(eFlags::Position);
87void ObjectBirdLeader::loadAnims() {
88 std::array<const char *, 1> names = {{
92 std::array<Render::AnmType, 1> types = {{
96 linkAnims(names, types);
102 : ObjectBirdLeader(params, bird), m_idx(idx) {}
105ObjectBirdFollower::~ObjectBirdFollower() =
default;
108void ObjectBirdFollower::init() {
109 constexpr f32 POS_DELTA_RANGE = 1000.0f;
110 constexpr f32 POS_DELTA_CENTER = 500.0f;
112 auto *anmMgr = m_drawMdl->anmMgr();
113 anmMgr->playAnim(0.0f, 1.0f, 0);
114 f32 frameCount = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
116 auto &rand = System::RaceManager::Instance()->random();
117 f32 rate = rand.getF32(
static_cast<f32
>(frameCount));
118 anmMgr->playAnim(rate, 1.0f, 0);
120 m_baseSpeed =
static_cast<f32
>(m_mapObj->setting(0));
121 m_velocity = EGG::Vector3f::ez * m_baseSpeed;
123 f32 z = rand.getF32(POS_DELTA_RANGE) - POS_DELTA_CENTER;
124 f32 y = rand.getF32(POS_DELTA_RANGE) - POS_DELTA_CENTER;
125 f32 x = rand.getF32(POS_DELTA_RANGE) - POS_DELTA_CENTER;
128 m_pos = m_bird->leader()->pos() + delta;
129 m_flags.setBit(eFlags::Position);
133void ObjectBirdFollower::calc() {
138 if (CollisionDirector::Instance()->checkSphereFull(100.0f, m_pos, EGG::Vector3f::inf,
140 m_pos += info.tangentOff;
141 m_flags.setBit(eFlags::Position);
146void ObjectBirdFollower::calcPos() {
147 constexpr f32 MAX_SPEED_FACTOR = 1.2f;
150 const auto &follower = m_bird->followers();
152 for (
u32 i = 0; i < follower.size(); ++i) {
154 pos += follower[i]->pos();
158 EGG::Vector3f posDelta = pos * (1.0f /
static_cast<f32
>(follower.size())) - m_pos;
162 m_velocity += posDelta;
164 if (m_velocity.length() > m_baseSpeed * MAX_SPEED_FACTOR) {
165 m_velocity.normalise();
166 m_velocity *= m_baseSpeed * MAX_SPEED_FACTOR;
170 m_flags.setBit(eFlags::Position);
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
f32 normalise()
Normalizes the vector and returns the original length.
f32 length() const
The square root of the vector's dot product.