GameScene: Difference between revisions
imported>Leoetlino |
imported>Leoetlino No edit summary |
||
Line 167: | Line 167: | ||
=== postcalc === | === postcalc === | ||
{{empty section}} | {{empty section}} | ||
== Stage generation == | |||
* Terrain::sInstance->flags |= 0x180u | |||
* Step 0 | |||
** Reload Title.pack if the stage that needs to be generated is TitleStage (3)<ref>0x71007AC8A0</ref>. | |||
** StageSelect checks<ref>0x71007AD3AC</ref> | |||
* Step 1 | |||
** If a pack was loaded by DungeonPackMgr, wait for DungeonPack loading to finish<ref>DungeonPack読み込み待ち</ref> and switch active pack to the [[dungeon pack]]. | |||
* Step 2 | |||
** If the stage to load is TitleStage, wait for TitlePack loading to finish<ref>TitlePack読み込み待ち</ref> and switch active pack to the title pack. | |||
* Step 3: start stage generation<ref>ステージ生成開始</ref> | |||
**PlacementMgr | |||
**ActorSystem::sInstance->field_13A = 0 | |||
**Update current map flags (e.g. sIsDungeon) | |||
**Clear BaseProcMgr ActorCreate queue{{check}} | |||
**Create uking::Stage::ForBaseProcDual heap (if not already done), which will be used for actors, ActorCreator and BaseProcMgr | |||
**ActorSystem::sInstance->field_139 = 0 | |||
**If the [[#State strings|state string]] starts with 初回シーケンス, MainField, GameTestField, GameTestField2, AocField, CDungeon, MainFieldDungeonStage, GameTestDungeon, MonolithTestDungeon, SrdTestDungeon, MarioClubTestDungeon, TestField, 研修用, MonolithTest100enemy, MinimumField, or ActorViewer, call GameScene::startBgProcessing (0x71007B2054) | |||
**If "new save" was selected, initialize PauseMenuDataMgr data | |||
**If the stage to load is TitleStage, load Layout/Title.blarc for ui::LayoutResourceMgr. | |||
**If "new save" was selected and the awakening demo hasn't been played since the game was launched<ref>0x71007ADB3C</ref>, ask [[EventMgr]] to call Demo169_0. | |||
** Some PhysicsMemSys stuff (0x71007ADBE0). | |||
* Step 4 | |||
** Wait for completion of Title BG processing '''(20% of the loading bar)''' | |||
** uiManager (0x71007ACD04) | |||
** Initialize StatisticsMgr paths depending on current map type. | |||
** Update aoc2's mapType and mapName fields. | |||
* Step 5 | |||
** PhysicsMemSys stuff (0x71007ACDB8, 0x71007ACDC0, 0x71007ACDD0) | |||
** BaseProcMgr: request "PreDelete" actors<ref>0x71007ACDE4</ref> | |||
** BaseProcMgr: stop ActorCreate initializer thread and clean up internal state{{check}} | |||
** agl::lyr::Renderer and Graphics stuff | |||
* Step 6 | |||
** Load [[env.genvb]] binary (gsys::ModelSceneEnv::clearImpl + loadBinaryImpl) | |||
** If the stage binder type is 0, 1 or 2 (OpenWorldStage, IndoorStage or MainFieldDungeonStage): | |||
***'''Set loading progress to 40%.''' | |||
***Graphics stuff, again | |||
***OnUiActorMgr | |||
***GameScene::loadTera (on a separate thread) | |||
* Step 7 | |||
** If the stage binder type is 0, 1 or 2 (OpenWorldStage, IndoorStage or MainFieldDungeonStage): | |||
***Wait for Tera to load<ref>tera読み込み待ち</ref> | |||
* Step 8 | |||
**... | |||
**Wait for Tera to generate collision | |||
**... | |||
* Step 9 | |||
* Step 10 | |||
* Step 11 | |||
* Step 12 | |||
* Step 13 | |||
<hr> | <hr> |
Revision as of 10:41, 24 October 2018
Subsystem | |
---|---|
Official name | Yes |
Description | Handles the main loop and stages |
Init function |
Switch 1.5.0: 0x71007D1DD8 Wii U 1.5.0: ??? |
Debug only | No |
GameScene is a critical subsystem that is responsible for core functionality such as initialising other components, creating stages (world, title screen, etc.) and handling the game's main loop.
Unlike most other subsystems, GameScene is not a singleton: it is a member of the uking::frm::System structure[1].
Init
- GameScene::initialize (0x71007A8014)
- Load the environment graphics archive (Env.sgenvb)
- Create the GameScene heap
- Create the StageBinder heap
- Start the GameScene TaskMgr (thread)
- InitializeSubSystem (note: some of the below names are unofficial, see Subsystems for more details)
- AutoPlacementFlowMgr
- FadeProgress
- DungeonPackMgr
- PlayerInfo
- PlayerResetPosMgr
- GameSceneSubsys3
- GameSceneSubsys4
- GameSceneSubsys5
- ActorHeapUtil
- E3Mgr
- aoc2
- aoc3
- DamageInfoMgr
- CookingMgr
- GameSceneSubsys7
- ActorLimiter
- GameSceneSubsys9
- GameSceneSubsys10
- IceBlockMgr
- AmiiboMgr
- GameSceneSubsys11
- GameSceneSubsys12
- GameSceneSubsys13
- GameSceneSubsys14
- GameSceneSubsys15
- ResidentActorMgr
- Create UI heap
- uiManager
- Load the Fade screen
- OnUiActorMgr
- CreatePlayerEquipActorMgr
- CreatePlayerTrashActorMgr
- TipsMgr
- nxargs
- GameScene::initializeGraphicsLayer_
- ErrorViewerTask init
- Set Get Demo handler
- Set Check Weapon Free Slot handler (1, 2)
- ...
- SaveSystem init
- Set initial state
- nn::err::ShowUnacceptableAddOnContentVersionError if needed
-
- [Debug] StarterPackMgr: Load Title pack
- GlobalParameter
- GlobalParameter: Load actorpack
- E3Mgr: Load System/BuildTime.txt (stubbed in release versions)
- TipsMgr: Load tips
- ResidentActorMgr: Load configuration (ResidentActors.byml)
- AutoPlacementFlowMgr: Load auto placement event flows
- KingEditor: Stubbed
- E3Mgr: init
Initial state
The initial state the game launches into is determined by GameScene[2].
const bool isFirstLaunch = SaveSystem::sInstance->isFirstLaunch();
State* state = isFirstLaunch ? &state_NewSave : &state_LunchTitle;
if ( aocManager::sInstance && aocManager::sInstance->flags & 2 )
nn::err::ShowUnacceptableAddOnContentVersionError();
const bool isDemo = E3Mgr::sInstance && E3Mgr::sInstance->isDemoMode();
if (isDemo)
state = &state_LunchTitle;
if (!isDemo && isFirstLaunch)
sIsFirstNonDemoLaunch = 1;
StateMachine::changeState(&this->stateMachine, state);
State strings
Name | Description |
---|---|
1st | Demo mode [check] |
2nd | Demo mode |
初回シーケンス | Initial sequence - New save |
TitleMenu | Title menu |
Presentation | Demo mode |
E3_2016/Presentation | Demo mode |
StartupSaveCheckStage | |
Viewer | |
CDungeon | |
MainFieldDungeonStage | |
MainField | |
GameTestField | |
GameTestField2 | |
AocField | |
GameTestDungeon | |
MonolithTestDungeon | |
SrdTestDungeon | |
MarioClubTestDungeon | |
TestField | |
研修用 | |
MonolithTest100enemy | |
MinimumField | |
ActorViewer |
States
Note: when the Indoor stage binder is initialised and if the map name changes, a "dungeon" telemetry report is emitted with "leave" or "enter" as the event name and the old/new map name as additional data[4].
StageMgr
This section is empty. You can help by adding to it. |
StageSelect
This section is empty. You can help by adding to it. |
StageTransition
Entered before stage generation starts and after Fade (loading screen) has been initialised and made visible. This state machine state is a noop.
LunchTitle
This section is empty. You can help by adding to it. |
LunchTitle (sic) is entered when the game is launched. The internal state string is "TitleMenu" or (in demo mode) "2nd".
NewSave
This section needs expansion. You can help by adding to it. |
Entered on the first boot or when the new game option is selected. The associated state string is "初回シーケンス" ("initial sequence").
PatchError
This section is empty. You can help by adding to it. |
Main loop
Three GameScene functions are called in a row from RootTask (see Executable) after initialisation has completed, i.e. in the game's main loop. (Note: these 3 names are unofficial.)
precalc
This section is empty. You can help by adding to it. |
calc
This section is empty. You can help by adding to it. |
postcalc
This section is empty. You can help by adding to it. |
Stage generation
- Terrain::sInstance->flags |= 0x180u
- Step 0
- Step 1
- If a pack was loaded by DungeonPackMgr, wait for DungeonPack loading to finish[7] and switch active pack to the dungeon pack.
- Step 2
- If the stage to load is TitleStage, wait for TitlePack loading to finish[8] and switch active pack to the title pack.
- Step 3: start stage generation[9]
- PlacementMgr
- ActorSystem::sInstance->field_13A = 0
- Update current map flags (e.g. sIsDungeon)
- Clear BaseProcMgr ActorCreate queue[check]
- Create uking::Stage::ForBaseProcDual heap (if not already done), which will be used for actors, ActorCreator and BaseProcMgr
- ActorSystem::sInstance->field_139 = 0
- If the state string starts with 初回シーケンス, MainField, GameTestField, GameTestField2, AocField, CDungeon, MainFieldDungeonStage, GameTestDungeon, MonolithTestDungeon, SrdTestDungeon, MarioClubTestDungeon, TestField, 研修用, MonolithTest100enemy, MinimumField, or ActorViewer, call GameScene::startBgProcessing (0x71007B2054)
- If "new save" was selected, initialize PauseMenuDataMgr data
- If the stage to load is TitleStage, load Layout/Title.blarc for ui::LayoutResourceMgr.
- If "new save" was selected and the awakening demo hasn't been played since the game was launched[10], ask EventMgr to call Demo169_0.
- Some PhysicsMemSys stuff (0x71007ADBE0).
- Step 4
- Wait for completion of Title BG processing (20% of the loading bar)
- uiManager (0x71007ACD04)
- Initialize StatisticsMgr paths depending on current map type.
- Update aoc2's mapType and mapName fields.
- Step 5
- Step 6
- Load env.genvb binary (gsys::ModelSceneEnv::clearImpl + loadBinaryImpl)
- If the stage binder type is 0, 1 or 2 (OpenWorldStage, IndoorStage or MainFieldDungeonStage):
- Set loading progress to 40%.
- Graphics stuff, again
- OnUiActorMgr
- GameScene::loadTera (on a separate thread)
- Step 7
- If the stage binder type is 0, 1 or 2 (OpenWorldStage, IndoorStage or MainFieldDungeonStage):
- Wait for Tera to load[12]
- If the stage binder type is 0, 1 or 2 (OpenWorldStage, IndoorStage or MainFieldDungeonStage):
- Step 8
- ...
- Wait for Tera to generate collision
- ...
- Step 9
- Step 10
- Step 11
- Step 12
- Step 13
- ↑ uking::frm::System::gameScene @ 0x10 (Switch)
- ↑ GameScene::initialize, 0x71007A86CC
- ↑ The state string is a sead::FixedSafeString<0x100> stored in GameScene @ 0x720.
- ↑ StageBinder::initAndReportDungeonLeaveEnter[unofficial name] at 0x71007B79A8
- ↑ 0x71007AC8A0
- ↑ 0x71007AD3AC
- ↑ DungeonPack読み込み待ち
- ↑ TitlePack読み込み待ち
- ↑ ステージ生成開始
- ↑ 0x71007ADB3C
- ↑ 0x71007ACDE4
- ↑ tera読み込み待ち