1#include "Game/Boss/SkeletalFishBossBattleDirector.hpp"
2#include "Game/Boss/SkeletalFishBoss.hpp"
3#include "Game/LiveActor/LiveActorGroup.hpp"
4#include "Game/MapObj/SubmarineVolcanoBigColumn.hpp"
5#include "Game/Map/CollisionParts.hpp"
6#include "Game/Map/HitInfo.hpp"
9SkeletalFishBossBattleDirector::SkeletalFishBossBattleDirector(
SkeletalFishBoss *pBoss) :
NameObj(
"スカルシャークボス戦指揮") {
13 MR::connectToSceneEnemyMovement(
this);
15 for (s32 i = 0; i < 0x20; i++) {
16 mColumns[i] =
nullptr;
19 for (s32 i = 0; i < 4; i++) {
20 ModelObj* guardMdl =
new ModelObj(
"デモ用スカルシャークガード",
"SkeletalFishGuard",
nullptr, 18, -2, -2,
false);
21 mGuardModels[i] = guardMdl;
23 MR::initLightCtrl(mGuardModels[i]);
24 MR::invalidateClipping(mGuardModels[i]);
25 mGuardModels[i]->makeActorDead();
29void SkeletalFishBossBattleDirector::initiate() {
32 for (s32 i = 0; i < grp->mObjectCount; i++) {
33 if (!strcmp(grp->getActor(i)->
mName,
"海底火山巨大石柱") || (!strcmp(grp->getActor(i)->
mName,
"海底火山石柱(小)"))) {
38 if (strcmp(grp->getActor(i)->
mName,
"羽虫S")) {
39 if (strcmp(grp->getActor(i)->
mName,
"羽虫L")) {
44 _94[_D4] = grp->getActor(i);
45 MR::invalidateClipping(_94[_D4]);
52void SkeletalFishBossBattleDirector::startPowerUpDemo1() {
53 playGuardAnim(
"PowerUp1", 2);
56void SkeletalFishBossBattleDirector::startPowerUpDemo2() {
57 playGuardAnim(
"PowerUp2", 4);
60void SkeletalFishBossBattleDirector::playGuardAnim(
const char *pAnimName, s32 numGuards) {
61 for (s32 i = 0; i < numGuards; i++) {
63 snprintf(buf,
sizeof(buf),
"%s%c", pAnimName, i + 0x41);
64 mGuardModels[i]->makeActorAppeared();
65 MR::requestMovementOn(mGuardModels[i]);
66 MR::startBck(mGuardModels[i], buf,
nullptr);
67 MR::startSound(mGuardModels[i],
"SE_BM_SKL_GUARD_APPEAR", -1, -1);
71void SkeletalFishBossBattleDirector::movement() {
75void SkeletalFishBossBattleDirector::tryColumnCollision(
HitSensor *pSensor) {
76 for (s32 i = 0; i < _90; i++) {
79 if (parts !=
nullptr) {
81 if (parts->checkStrikeBall(&hitInfo, 1, pSensor->mPosition, pSensor->mRadius,
false,
nullptr)) {
82 if (hitInfo.mParentTriangle.mSensor !=
nullptr) {
83 MR::sendMsgEnemyAttack(hitInfo.mParentTriangle.mSensor, pSensor);
91void SkeletalFishBossBattleDirector::pauseOffCast() {
94 for (s32 i = 0; i < group->mObjectCount; i++) {
95 MR::requestMovementOn(group->getActor(i));
96 if (MR::isExistEffectKeeper(group->getActor(i))) {
97 MR::pauseOffEffectAll(group->getActor(i));
101 for (s32 i = 0; i < _90; i++) {
102 mColumns[i]->pauseOff();
106void SkeletalFishBossBattleDirector::endPowerUpDemo1() {
110void SkeletalFishBossBattleDirector::endPowerUpDemo2() {
114void SkeletalFishBossBattleDirector::killGuard() {
115 for (s32 i = 0; i < 4; i++) {
116 mGuardModels[i]->makeActorDead();
120void SkeletalFishBossBattleDirector::appearBirdLouse() {
121 for (s32 i = 0; i < _D4; i++) {
122 _94[i]->endClipped();
126void SkeletalFishBossBattleDirector::killBirdLouse() {
127 for (s32 i = 0; i < _D4; i++) {
128 _94[i]->startClipped();
132SkeletalFishBossBattleDirector::~SkeletalFishBossBattleDirector() {
The most basic form of an object.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.
const char * mName
A string to identify the NameObj.