1#include "Game/Map/StageSwitch.hpp"
2#include "Game/Scene/SceneObjHolder.hpp"
3#include "Game/Util.hpp"
5bool BitFlag128::get(
int idx)
const {
6 u32 flags = mFlags[idx / 32];
7 u32 mask = (1 << (idx % 32));
8 return mask == (flags & (u32)mask);
11void BitFlag128::set(
int bit_index,
bool setTrue) {
12 u32 valIdx = bit_index / 32;
13 u32& flag = mFlags[valIdx];
16 flag |= (1 << (bit_index % 32));
19 flag &= ~(1 << (bit_index % 32));
31SwitchIdInfo::SwitchIdInfo(s32 switchID,
const JMapInfoIter &rIter) {
33 mIsGlobal = switchID >= 1000;
37s32 SwitchIdInfo::getSwitchNo()
const {
39 return mIDInfo->_0 - 1000;
45void StageSwitchContainer::createAndAddZone(
const SwitchIdInfo &rInfo) {
46 if (findZoneSwitchFromTable(rInfo)) {
52 sw.mData = rInfo.mIDInfo->mZoneID;
54 mSwitches[mCount++] = sw;
58 if (rInfo.mIsGlobal) {
59 return mGlobalSwitches;
62 return findZoneSwitchFromTable(rInfo);
66 for (
int i = 0; i < mCount; i++)
68 ContainerSwitch* s = &mSwitches[i];
70 if (s->mData == rInfo.mIDInfo->mZoneID) {
78void StageSwitchCtrl::onSwitchA() {
79 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_A);
82void StageSwitchCtrl::offSwitchA() {
83 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_A);
86bool StageSwitchCtrl::isOnSwitchA()
const {
87 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_A);
90bool StageSwitchCtrl::isValidSwitchA()
const {
94void StageSwitchCtrl::onSwitchB() {
95 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_B);
98void StageSwitchCtrl::offSwitchB() {
99 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_B);
102bool StageSwitchCtrl::isOnSwitchB()
const {
103 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_B);
106bool StageSwitchCtrl::isValidSwitchB()
const {
110bool StageSwitchCtrl::isOnSwitchAppear()
const {
111 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_Appear);
114bool StageSwitchCtrl::isValidSwitchAppear()
const {
115 return mSW_Appear != 0;
118void StageSwitchCtrl::onSwitchDead() {
119 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_Dead);
122void StageSwitchCtrl::offSwitchDead() {
123 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_Dead);
126bool StageSwitchCtrl::isValidSwitchDead()
const {
127 return mSW_Dead != 0;
132bool StageSwitchCtrl::isOnAllSwitchAfterB(
int idx)
const {
133 for (s32 i = 0; i < idx; i++) {
134 s32 switchNo = i + mSW_B->getSwitchNo();
137 if (!container->getZoneSwitch(*mSW_B)->get(switchNo)) {
148SwitchIdInfo* StageSwitchFunction::createSwitchIdInfo(
const char *pSwitchName,
const JMapInfoIter &rIter,
bool unused) {
150 bool res = rIter.getValue<s32>(pSwitchName, &switchNo);
162 if (switchNo < 0x3E8) {
165 container->createAndAddZone(*inf);
171void StageSwitchFunction::onSwitchBySwitchIdInfo(
const SwitchIdInfo &rSwitchId) {
172 s32 switchNo = rSwitchId.getSwitchNo();
176 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
178 if (zoneSwitch->get(switchNo)) {
179 zoneSwitch->set(switchNo,
true);
183void StageSwitchFunction::offSwitchBySwitchIdInfo(
const SwitchIdInfo &rSwitchId) {
184 s32 switchNo = rSwitchId.getSwitchNo();
188 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
190 if (zoneSwitch->get(switchNo)) {
191 zoneSwitch->set(switchNo,
false);
195bool StageSwitchFunction::isOnSwitchBySwitchIdInfo(
const SwitchIdInfo &rSwitchId) {
196 s32 switchNo = rSwitchId.getSwitchNo();
200 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
202 return zoneSwitch->get(switchNo);
211StageSwitchContainer::~StageSwitchContainer() {
215StageSwitchContainer::StageSwitchContainer() :
NameObj(
"ステージスイッチ") {
220StageSwitchCtrl::StageSwitchCtrl(
const JMapInfoIter &rIter)
221 : mSW_A(nullptr), mSW_B(nullptr), mSW_Appear(nullptr), mSW_Dead(nullptr) {
222 mSW_A = StageSwitchFunction::createSwitchIdInfo(
"SW_A", rIter,
true);
223 mSW_B = StageSwitchFunction::createSwitchIdInfo(
"SW_B", rIter,
true);
224 mSW_Appear = StageSwitchFunction::createSwitchIdInfo(
"SW_APPEAR", rIter,
true);
225 mSW_Dead = StageSwitchFunction::createSwitchIdInfo(
"SW_DEAD", rIter,
true);
The most basic form of an object.