WKLib 0.2.3
A modding library for White Knuckle
Loading...
Searching...
No Matches
GamemodeBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEngine;
6
8
14public class GamemodeBuilder
15{
16 private List<M_Region> _regions = [];
17 private string _modeName = "Custom Gamemode";
18 private string _introText = "ASCEND";
19 private bool _isEndless;
20 private bool _hasPerks;
21 private bool _hasRevives;
22 private Sprite _capsuleSprite;
23 private Sprite _screenArtSprite;
24 private List<M_Gamemode.SpawnItem> _spawnItems;
25 private M_Gamemode.GameType _gameType;
26
32 public GamemodeBuilder WithRegions(List<M_Region> regions)
33 {
34 _regions = regions ?? [];
35 return this;
36 }
37
43 public GamemodeBuilder WithName(string modeName)
44 {
45 _modeName = modeName;
46 return this;
47 }
48
55 public GamemodeBuilder WithIntroText(string introText)
56 {
57 _introText = introText;
58 return this;
59 }
60
66 public GamemodeBuilder IsEndless(bool isEndless)
67 {
68 _isEndless = isEndless;
69 return this;
70 }
71
77 public GamemodeBuilder HasPerks(bool hasPerks)
78 {
79 _hasPerks = hasPerks;
80 return this;
81 }
82
88 public GamemodeBuilder HasRevives(bool hasRevives)
89 {
90 _hasRevives = hasRevives;
91 return this;
92 }
93
99 public GamemodeBuilder WithCapsuleSprite(Sprite sprite)
100 {
101 _capsuleSprite = sprite;
102 return this;
103 }
104
110 public GamemodeBuilder WithScreenArt(Sprite sprite)
111 {
112 _screenArtSprite = sprite;
113 return this;
114 }
115
121 public GamemodeBuilder WithStartItems(List<M_Gamemode.SpawnItem> spawnItems)
122 {
123 _spawnItems = spawnItems;
124 return this;
125 }
126
136 public GamemodeBuilder WithGameType(string gameType)
137 {
138 _gameType = gameType.ToLower() switch
139 {
140 "endless" => M_Gamemode.GameType.endlessPlaylist,
141 "standard" => M_Gamemode.GameType.standard,
142 "playlist" => M_Gamemode.GameType.playlist,
143 "playlist-shuffle" => M_Gamemode.GameType.shuffledPlaylist,
144 "single" => M_Gamemode.GameType.single,
145 _ => _gameType
146 };
147
148 return this;
149 }
150
155 public M_Gamemode Build()
156 {
157 var gm = ScriptableObject.CreateInstance<M_Gamemode>();
158
159 // Core flags and settings
160 gm.allowAchievements = false;
161 gm.allowCheatedScores = false;
162 gm.allowCheats = true;
163 gm.allowLeaderboardScoring = true;
164 gm.steamLeaderboardName = "";
165 gm.allowHeightAchievements = false;
166 gm.baseGamemode = true;
167 gm.modeType = _isEndless
168 ? M_Gamemode.GameType.endlessPlaylist
169 : M_Gamemode.GameType.playlist;
170
171 gm.capsuleName = _modeName;
172 gm.gamemodeName = _modeName;
173 gm.introText = _introText;
174 gm.isEndless = _isEndless;
175 gm.hasPerks = _hasPerks;
176 gm.hasRevives = _hasRevives;
177 gm.gamemodeScene = "Game-Main";
178 gm.roachBankID = $"custom-{_modeName}";
179 gm.gamemodePanel = Resources.FindObjectsOfTypeAll<UI_GamemodeScreen_Panel>().FirstOrDefault(x => x.name == "Gamemode_Panel_Base");
180 gm.loseScreen = Resources.FindObjectsOfTypeAll<UI_ScoreScreen>().FirstOrDefault(x => x.name == "ScorePanel_Standard_Death");
181 gm.winScreen = Resources.FindObjectsOfTypeAll<UI_ScoreScreen>().FirstOrDefault(x => x.name == "ScorePanel_Standard_Win");
182 gm.modeTags = [""];
183 gm.unlockAchievement = "";
184 //gm.playlistLevels = [];
185
186 var gmStandard = new GamemodeModule_Standard
187 {
188 winScoreMultiplier = 1f
189 };
190 gm.gamemodeModule = gmStandard;
191
192 var numLevelsToLoad = 0;
193
194 _regions.ForEach(reg => reg.subregionGroups.ForEach(subRegGroup =>
195 subRegGroup.subregions.ForEach(subReg => numLevelsToLoad += subReg.levelReferences.Count)));
196
197 WKLog.Debug($"[Gamemode Builder] Will load {numLevelsToLoad} levels for {_modeName}");
198
199 switch (numLevelsToLoad)
200 {
201 case 1:
202 gm.modeType = M_Gamemode.GameType.single;
203 gm.playlistLevelAssets = [_regions[0].subregionGroups[0].subregions[0].levelReferences[0]];
204 WKLog.Debug($"[Gamemode Builder] Loading one singular level");
205 break;
206 case > 1 when _gameType == M_Gamemode.GameType.single:
207 gm.modeType = M_Gamemode.GameType.playlist;
208 _regions.ForEach(reg => reg.subregionGroups.ForEach(subRegGroup =>
209 subRegGroup.subregions.ForEach(subReg => gm.playlistLevelAssets.AddRange(subReg.levelReferences))));
210 break;
211 case > 1:
212 gm.modeType = _gameType;
213 List<M_Level.LevelAssetHolder> levels = [];
214 var loadedLevels = 0;
215
216 foreach (var level in from region in _regions
217 from subRegionGroup in region.subregionGroups
218 from subRegion in subRegionGroup.subregions
219 from level in subRegion.levelReferences
220 select level)
221 {
222 try
223 {
224 levels.Add(level);
225 loadedLevels++;
226 }
227 catch (Exception e)
228 {
229 WKLog.Error($"[Gamemode Builder] Failed to load: {e.Message}");
230 }
231 }
232 WKLog.Debug($"[Gamemode Builder] Loaded {loadedLevels}/{numLevelsToLoad} levels");
233
234 _regions.ForEach(reg => reg.subregionGroups.ForEach(subRegGroup =>
235 subRegGroup.subregions.ForEach(subReg => gm.playlistLevelAssets.AddRange(subReg.levelReferences))));
236 break;
237 }
238
239 gm.levelsToGenerate = numLevelsToLoad;
240 gm.name = _modeName;
241
242 // If a sprites were provided, assign them:
243 if (_capsuleSprite is not null)
244 gm.capsuleArt = _capsuleSprite;
245
246 if (_screenArtSprite is not null)
247 gm.screenArt = _screenArtSprite;
248
249 // Assign regions:
250 gm.regions = _regions;
251
252 // GameObjects: find “World_Root” in the currently loaded objects
253 var worldRoot = Resources.FindObjectsOfTypeAll<GameObject>()
254 .FirstOrDefault(go => go.name == "World_Root");
255 gm.gamemodeObjects = worldRoot is not null
256 ? [worldRoot]
257 : [];
258
259 // start items (hard‐coded hammer if no items specified)
260 var hammerItem = new M_Gamemode.SpawnItem { itemid = "Item_Hammer" };
261 gm.startItems = _spawnItems ?? [hammerItem];
262
263 return gm;
264 }
265}
A fluent builder class for creating and configuring an M_Gamemode instance. It allows setting variou...
GamemodeBuilder HasRevives(bool hasRevives)
Sets whether revives are available in this gamemode.
GamemodeBuilder WithGameType(string gameType)
Sets the game type for the gamemode based on a string input.
GamemodeBuilder WithIntroText(string introText)
Sets the intro text for the gamemode This text is shown when loaded into the gamemode.
GamemodeBuilder WithName(string modeName)
Sets the displayed name of the gamemode (which can also serves as the capsule name)
M_Gamemode Build()
Constructs and returns a new M_Gamemode instance based on the properties configured in this builder.
GamemodeBuilder WithScreenArt(Sprite sprite)
Provides a Sprite to use for the gamemode's screen art.
GamemodeBuilder HasPerks(bool hasPerks)
Sets whether perks are available in this gamemode.
GamemodeBuilder WithCapsuleSprite(Sprite sprite)
Provides a Sprite to use for the gamemode's capsule art.
GamemodeBuilder WithStartItems(List< M_Gamemode.SpawnItem > spawnItems)
Sets the list of items players will start with when entering this gamemode.
GamemodeBuilder IsEndless(bool isEndless)
Sets whether the gamemode should be endless.
GamemodeBuilder WithRegions(List< M_Region > regions)
Sets the list of regions for this gamemode.