Skip to content

Commit 6d451de

Browse files
committed
scenario sync v2
1 parent 5eaa759 commit 6d451de

16 files changed

Lines changed: 448 additions & 178 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Custom Stage Builds/**
88
*.lst
99
*.disabled
1010
.github/copilot-instructions.md
11+
.gdbinit
1112

1213
lib/std
1314
build/

include/helpers.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,19 @@ __attribute__((used)) static const char* toadetteMoons[] = {"Scenario_Ending",
129129
"Other_CapThrow"};
130130

131131
// same ids as GameDataFunction::getCurrentWorldIdNoDevelop
132-
__attribute__((used)) static const char* worldNames[] = {
132+
__attribute__((used)) static const char* worldNames[17] = {
133133
"Cap Kingdom", "Cascade Kingdom", "Sand Kingdom", "Wooded Kingdom", "Lake Kingdom",
134134
"Cloud Kingdom", "Lost Kingdom", "Metro Kingdom", "Seaside Kingdom", "Snow Kingdom",
135135
"Luncheon Kingdom", "Ruined Kingdom", "Bowser's Kingdom", "Moon Kingdom", "Mushroom Kingdom",
136136
"Dark Side", "Darker Side"};
137137

138+
__attribute__((used)) static const char* homeStageNames[17] = {
139+
"CapWorldHomeStage", "WaterfallWorldHomeStage", "SandWorldHomeStage", "ForestWorldHomeStage",
140+
"LakeWorldHomeStage", "CloudWorldHomeStage", "ClashWorldHomeStage", "CityWorldHomeStage",
141+
"SeaWorldHomeStage", "SnowWorldHomeStage", "LavaWorldHomeStage", "BossRaidWorldHomeStage",
142+
"SkyWorldHomeStage", "MoonWorldHomeStage", "PeachWorldHomeStage", "Special1WorldHomeStage",
143+
"Special2WorldHomeStage"};
144+
138145
struct Transform {
139146
sead::Vector3f* position;
140147
sead::Quatf* rotation;

include/layouts/PlayerEventLog.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ constexpr s32 sNumEntries = 8;
77

88
class PlayerEventLog {
99
public:
10-
enum Event { connect, disconnect, start, shine, purple, checkpoint };
10+
enum Event { CONNECT, DISCONNECT, START, SHINE, PURPLE, CHECKPOINT, MOONROCK };
1111

1212
struct Entry {
1313
Entry();
1414
Entry(sead::FixedSafeString<16> player, Event event, sead::FixedSafeString<128> text);
1515

1616
sead::FixedSafeString<16> mPlayer;
17-
Event mEvent = shine;
17+
Event mEvent = SHINE;
1818
sead::FixedSafeString<128> mText;
1919
s32 mNumPurples = 1;
2020
s32 mLife = -1;

include/main.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
static bool isInGame = false;
77

88
static bool debugMode = false;
9-
static bool shouldResetScenario = false;
109

1110
void drawMain(al::Sequence* seq);
1211
void updatePlayerInfo(GameDataHolderAccessor holder, PlayerActorBase* playerBase, bool isYukimaru);

include/packets/GameInf.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ struct PACKED GameInf : Packet {
1515
u8 scenarioNo = -1;
1616
char stageName[0x40] = {};
1717
s8 gameMode = -1;
18-
s8 mainScenarioNo = -1;
1918

2019
bool operator==(const GameInf& rhs) const {
2120
return (is2D == rhs.is2D && scenarioNo == rhs.scenarioNo &&

include/packets/MoonRockHit.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include "Packet.h"
4+
5+
struct PACKED MoonRockHit : Packet {
6+
MoonRockHit() : Packet() {
7+
this->mType = PacketType::MOONROCKHIT;
8+
mPacketSize = sizeof(MoonRockHit) - sizeof(Packet);
9+
};
10+
int worldId = 0;
11+
};

include/packets/Packet.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ enum PacketType : short {
3636
HEALTHCOINS,
3737
COINCOLLECTCOLL,
3838
CHECKPOINTGET,
39+
MOONROCKHIT,
3940
End // end of enum for bounds checking
4041
};
4142

@@ -44,7 +45,7 @@ constexpr static const char* packetNames[] = {
4445
//"Freeze Info",
4546
"Player Connect", "Player Disconnect", "Costume Info", "Moon Collection", "Capture Info", "Change Stage",
4647
"Server Command", "Message", "UDP Initialization", "UDP Hole Punch", "Extra", "Health and Coins",
47-
"Purple Coin Collection", "Checkpoint Get"};
48+
"Purple Coin Collection", "Checkpoint Get", "Moon Rock Hit"};
4849

4950
enum SenderType { SERVER, CLIENT };
5051

@@ -76,6 +77,7 @@ struct PACKED Packet {
7677
#include "packets/HackCapInf.h"
7778
#include "packets/HealthCoins.h"
7879
#include "packets/InitPacket.h"
80+
#include "packets/MoonRockHit.h"
7981
#include "packets/PlayerConnect.h"
8082
#include "packets/PlayerDC.h"
8183
#include "packets/PlayerInfPacket.h"

include/server/Client.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "al/Library/Play/Layout/SimpleLayoutAppearWaitEnd.h"
2424
#include "al/Library/Sequence/Sequence.h"
2525
#include "al/Library/Thread/AsyncFunctorThread.h"
26+
#include "al/Library/Yaml/Writer/ByamlWriter.h"
2627

2728
// ===== GAME INCLUDES =====
2829
#include "game/Item/CoinCollect.h"
@@ -43,6 +44,7 @@
4344
#include "sead/prim/seadSafeString.h"
4445

4546
#include "container/seadPtrArray.h"
47+
#include "Library/Yaml/ByamlIter.h"
4648

4749
// ===== PROJECT INCLUDES =====
4850
#include "Keyboard.hpp"
@@ -129,6 +131,10 @@ class Client {
129131
static void tryRegisterCoinCollect(CoinCollect* coin);
130132
static void tryRegisterCoinCollect2D(CoinCollect2D* coin);
131133

134+
// ==== MOON ROCK MANAGEMENT ====
135+
void saveMoonRocks(al::ByamlWriter* writer);
136+
void readMoonRocks(const al::ByamlIter& save);
137+
132138
// ===== PACKET SENDING METHODS =====
133139
static void sendHackCapInfPacket(const HackCap* hackCap);
134140
static void sendPlayerInfPacket(const PlayerActorBase* player, bool isYukimaru);
@@ -140,6 +146,7 @@ class Client {
140146
static void sendPuppetPosInfoPacket();
141147
static void sendCoinCollectCollectPacket(const char* placeID, int worldID, const char* stage);
142148
static void sendCheckpointGetPacket(const char* objId);
149+
static void sendMoonRockHitPacket(int worldId);
143150

144151
// ===== PUPPET MANAGEMENT =====
145152
static bool tryAddPuppet(PuppetActor* puppet);
@@ -268,6 +275,7 @@ class Client {
268275
void updateHealthCoins(HealthCoins* packet);
269276
void updateCoinCollects(CoinCollectCollect* packet);
270277
void updateCheckpoints(CheckpointGet* packet);
278+
void updateMoonRocks(MoonRockHit* packet);
271279

272280
// ===== UTILITY METHODS =====
273281
PuppetInfo* findPuppetInfo(const nn::account::Uid& id, bool isFindAvailable);
@@ -322,6 +330,12 @@ class Client {
322330
sead::SafeArray<PendingCheckpoint, sMaxPendingCheckpoints> mPendingCheckpoints;
323331
s32 mPendingCheckpointCount = 0;
324332

333+
// ===== MOON ROCK PENDING QUEUE =====
334+
// Moon Rocks when players haven't beaten the game yet get stored here.
335+
// The moon rock scenario is applied when the game is beaten.
336+
static constexpr s32 SNumMoonRocks = 14;
337+
sead::SafeArray<bool, SNumMoonRocks> mPendingMoonRocks;
338+
325339
// ===== PACKET BACKUPS =====
326340
PlayerInf lastPlayerInfPacket = PlayerInf();
327341
GameInf lastGameInfPacket = GameInf();
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#pragma once
2+
3+
#include "hk/prim/traits/Integer.h"
4+
5+
#include <basis/seadTypes.h>
6+
#include <heap/seadFrameHeap.h>
7+
#include <heap/seadHeap.h>
8+
#include <heap/seadHeapMgr.h>
9+
10+
#include "fsHelper.h"
11+
#include "layouts/PlayerEventLog.h"
12+
#include "Library/Yaml/Writer/ByamlWriter.h"
13+
#include "Scene/StageSceneStateModConfig.hpp"
14+
#include "server/Client.hpp"
15+
#include "stream/seadRamStream.h"
16+
#include "stream/seadStream.h"
17+
#include "System/ByamlSave.h"
18+
19+
constexpr const char* sSettingsPath = "sd:/SMOO-Plus/settings.byml";
20+
constexpr const char* sModFolder = "sd:/SMOO-Plus";
21+
22+
namespace al {
23+
class IUseSceneObjHolder;
24+
class LayoutActor;
25+
class Scene;
26+
} // namespace al
27+
28+
class GameConfigData : public ByamlSave {
29+
public:
30+
GameConfigData();
31+
void init();
32+
bool isCameraReverseInputH() const;
33+
void onCameraReverseInputH();
34+
void offCameraReverseInputH();
35+
bool isCameraReverseInputV() const;
36+
void onCameraReverseInputV();
37+
void offCameraReverseInputV();
38+
s32 getCameraStickSensitivityLevel() const;
39+
void setCameraStickSensitivityLevel(s32 value);
40+
bool isValidCameraGyro() const;
41+
void validateCameraGyro();
42+
void invalidateCameraGyro();
43+
s32 getCameraGyroSensitivityLevel() const;
44+
void setCameraGyroSensitivityLevel(s32 value);
45+
bool isUseOpenListAdditionalButton() const;
46+
void onUseOpenListAdditionalButton();
47+
void offUseOpenListAdditionalButton();
48+
bool isValidPadRumble() const;
49+
void validatePadRumble();
50+
void invalidatePadRumble();
51+
s32 getPadRumbleLevel() const;
52+
void setPadRumbleLevel(s32 value);
53+
void write(al::ByamlWriter* writer) override;
54+
void read(const al::ByamlIter& save) override;
55+
56+
// custom function
57+
typedef void (GameConfigData::*SaveWriteThreadFunc)(void);
58+
59+
void writeToSd() {
60+
sead::FrameHeap* frameHeap =
61+
sead::FrameHeap::create(10_KB, "SaveWriteHeap", Client::getClientHeap(), 8,
62+
sead::Heap::HeapDirection::cHeapDirection_Forward, false);
63+
64+
sead::ScopedCurrentHeapSetter heapSetter(frameHeap);
65+
66+
al::ByamlWriter writer(frameHeap, false);
67+
68+
const char* serverIP = Client::getCurrentIP();
69+
const s32 serverPort = Client::getCurrentPort();
70+
const bool serverHidden = Client::isServerHidden();
71+
const bool capCollision = StageSceneStateModConfig::isCapCollisionEnabled();
72+
const bool capBounce = StageSceneStateModConfig::isCapBounceEnabled();
73+
const bool playerCollision = StageSceneStateModConfig::isPuppetCollisionEnabled();
74+
const bool playerBounce = StageSceneStateModConfig::isPuppetBounceEnabled();
75+
const bool costumeDoorsUnlocked = StageSceneStateModConfig::isCostumeDoorsUnlocked();
76+
const bool lowLatency = StageSceneStateModConfig::isLowLatencyEnabled();
77+
const s32 logLife = StageSceneStateModConfig::getSpeedrunLogLife();
78+
const bool log = PlayerEventLog::isShow();
79+
const bool shineCount = StageSceneStateModConfig::isShineCountEnabled();
80+
const bool music = !Client::isMusicDisabled();
81+
82+
writer.pushHash();
83+
writer.pushHash("SMOOData");
84+
if (serverIP) {
85+
writer.addString("ServerIP", serverIP);
86+
} else {
87+
writer.addString("ServerIP", "127.0.0.1");
88+
}
89+
90+
if (serverPort) {
91+
writer.addInt("ServerPort", serverPort);
92+
} else {
93+
writer.addInt("ServerPort", 0);
94+
}
95+
96+
writer.addBool("ServerHidden", serverHidden);
97+
writer.addBool("CapCollision", capCollision);
98+
writer.addBool("CapBounce", capBounce);
99+
writer.addBool("PlayerCollision", playerCollision);
100+
writer.addBool("PlayerBounce", playerBounce);
101+
writer.addBool("CostumeDoorsUnlocked", costumeDoorsUnlocked);
102+
writer.addBool("LowLatency", lowLatency);
103+
writer.addInt("LogLife", logLife);
104+
writer.addBool("Log", log);
105+
writer.addBool("ShineCount", shineCount);
106+
writer.addBool("Music", music);
107+
writer.pop();
108+
109+
writer.pushHash("GameConfigData");
110+
writer.addInt("CameraStickSensitivityLevel", mCameraStickSensitivityLevel);
111+
writer.addBool("IsCameraReverseInputH", mIsCameraReverseInputH);
112+
writer.addBool("IsCameraReverseInputV", mIsCameraReverseInputV);
113+
writer.addBool("IsValidCameraGyro", mIsValidCameraGyro);
114+
writer.addInt("CameraGyroSensitivityLevel", mCameraGyroSensitivityLevel);
115+
writer.addBool("IsUseOpenListAdditionalButton", mIsUseOpenListAdditionalButton);
116+
writer.addBool("IsPadRumble", mIsValidPadRumble);
117+
writer.addInt("PadRumbleLevel", mPadRumbleLevel);
118+
writer.pop();
119+
120+
writer.pop();
121+
u32 size = writer.calcPackSize();
122+
u8 buffer[size];
123+
sead::RamStreamSrc ramStream(&buffer, sizeof(buffer));
124+
sead::WriteStream writeStream;
125+
writeStream.setSrc(&ramStream);
126+
writeStream.setMode(sead::Stream::Modes::Binary);
127+
writer.write(&writeStream);
128+
FsHelper::writeFileToPath(buffer, size, sSettingsPath);
129+
130+
frameHeap->freeAll();
131+
frameHeap->destroy();
132+
}
133+
134+
public:
135+
s32 mCameraStickSensitivityLevel = -1;
136+
bool mIsCameraReverseInputH = false;
137+
bool mIsCameraReverseInputV = false;
138+
bool mIsValidCameraGyro = true;
139+
s32 mCameraGyroSensitivityLevel = -1;
140+
bool mIsUseOpenListAdditionalButton = false;
141+
bool mIsValidPadRumble = true;
142+
s32 mPadRumbleLevel = 0;
143+
};
144+
145+
namespace rs {
146+
GameConfigData* getGameConfigData(const al::LayoutActor*);
147+
void saveGameConfigData(const al::LayoutActor*);
148+
void applyGameConfigData(al::Scene*, const GameConfigData*);
149+
bool isUseOpenListAdditionalButton(const al::IUseSceneObjHolder*);
150+
} // namespace rs

lib/custom/game/System/GameDataFile.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,6 @@ class GameDataFile {
811811
GameDataHolder* getGameDataHolder() { return mGameDataHolder; }
812812
sead::FixedSafeString<128> getPlayerStartId() { return mPlayerStartId; }
813813
FixedHeapArray<s32, sNumWorlds>& getScenarioNumArr() { return mScenarioNo; }
814-
FixedHeapArray<s32, sNumWorlds>& getMainScenarioNumArr() { return mMainScenarioNo; }
815814
FixedHeapArray<CheckpointInfo*, sNumWorlds>& getCheckpointTable() { return mCheckpointTable; }
816815
FixedHeapArray<UniqObjInfo, 320>& getGotCheckpointTable() { return mGotCheckpoint; }
817816

0 commit comments

Comments
 (0)