Blood moon and WorldMgr: Difference between pages

From ZeldaMods (Breath of the Wild)
(Difference between pages)
Jump to navigation Jump to search
imported>Leoetlino
 
imported>Leoetlino
 
Line 1: Line 1:
The '''Blood Moon''' is a game mechanic that ensures the world stays populated with enemies and weapons. Every time a blood moon occurs, enemies that have been defeated and overworld weapons that have been picked up by the player respawn.
{{stub}}
{{Subsystem infobox|name=WorldMgr|init_addr_switch150=00000071010F2920|is_name_official=1|description=Manages world state (time, blood moons, climates, weather, etc.)}}
The '''World Manager''' (WorldMgr) is responsible for managing time, blood moons, climates, weather, fog, wind, lighting, procedural generation of clouds, whether the Lord of the Mountain appears, etc.


Blood moons are also used to reset internal state when some subsystems are running out of memory or become unresponsive. Such blood moons do not follow the regular schedule and are commonly referred to as "panic blood moons".
Because of the massive amount of state to handle, functionality is split across the main WorldMgr and 9 sub-managers.


A common misconception is that blood moons help replenish system memory by resetting enemy kill flags. This is however total nonsense, because enemy kill flags are just GameData flags, and all GameData flags are loaded at bootup and stay in memory forever<ref>Even without any code reverse engineering, anyone who has an idea of what they are talking about knows that the game never loads [[Bootup.pack]] (which holds the GameData configuration) again after init so it cannot possibly be unloading flags. Not to mention that it'd be ridiculously inefficient to unload and reload flags all the time.</ref>.
== WorldMgr ==


== Scheduled Blood Moons ==
== Sub-managers ==
{{link to article|link=WorldMgr#Midnight checks}}
Sub-managers are created in WorldMgr::init (0x71010F43C0) and inserted into a pointer array (@WorldMgr+0x5c0). All names below are unofficial.
 
Scheduled Blood Moons are based on a timer that starts running as soon as the "step out of Shrine of Resurrection" (Demo103_0) has finished. When the timer reaches 7 in-game days, the WM_BloodyDay flag is set. The next time it is midnight, assuming blood moons are not inhibited, the Blood Moon cutscene will trigger. For more details, read [[WorldMgr]].
 
== Panic Blood Moons ==
Panic Blood Moons occur when the game is running out of memory<ref>Debug play reports refer to the event as a "BloodyMoon ForMemory" at 0x71007A95B4 (Switch 1.5.0)</ref> or when some tasks are taking too much time.
 
Contrary to a widespread theory, they are not used as a generic error handler or a fallback for "unhandled events". Panic blood moons can only occur in specific cases.
 
Panic conditions are checked every frame by [[GameScene]], which also keeps track of the panic reason in an unsigned 32-bit integer so that memory issues can be reported to Nintendo via the [[telemetry]] system.


{|class="wikitable"
{|class="wikitable"
|+ Panic Blood Moon reasons
|+ Sub-managers by ID
! Bit !! Description
! ID !! Description
|-
| 0 || TimeMgr
|-
| 1 || CloudPr? Handles cloud procedural generation.
|-
|-
| 0 || '''[[Resource system]]'''<ref>0x7101213144</ref>: at least one of the following is true:
| 2 || ???
* Bit 12 is set in the ResourceMgrTask's flags (indicating a problem with a resource load{{check}})<ref>0x710120C5E4</ref>
* ''An'' overlay arena's heap free size percentage is ''less than'' its configured minimum percentage.<ref>0x71011FCDE4</ref>
**The limit is 0% for the OverlayArena system itself, "Tera SZS work" (Tera decompressing buffer), Audio and [[StarterPackMgr]]. The default is 0% too.
**The limit is 5% for the "ForResourceS" (small) and "ForResourceL" (large) heaps, which is where most resources are allocated from.
|-
|-
| 1 || '''[[PhysicsMemSys]]''': Havok main heap is running out of memory (''less than'' 5% free)<ref>0x7101216C08</ref>
| 3 || Weather? Handles "rain splash" and climate weathers.
|-
|-
| 2 || '''[[PlacementMgr]]''': Actor spawning heap is running out of memory (''less than'' 5% free)<ref>0x7100D5DC40</ref>
| 4 || TemperatureMgr? (Reasonably sure about this one.)
|-
|-
| 3 || '''ResourceSystem/OverlayArena''': ForResourceS heap is running out of memory<ref>0x71011FCFF8</ref>
| 5 || ???
|-
|-
| 4 || '''ResourceSystem/OverlayArena''': ForResourceL heap is running out of memory<ref>0x71011FD000</ref>
| 6 || Sky and fog? Holds the configuration for all EnvPalettes, EnvAttributes, WeatherInfluences, Remains palettes, Indoor palettes and dungeon fogs.
|-
|-
| 5 || '''ResourceSystem/OverlayArena''': Audio heap is running out of memory<ref>0x71011FD008</ref>
| 7 || DofMgr? Holds depth of field related parameters.
|-
|-
| 6 || '''ResourceSystem/TextureHandleMgr''': Last TextureHandleMgr::calc execution took more than 60 seconds{{check}}<ref>0x710120C670</ref>
| 8 || ??? (contains a BaseProcLink, so it might have something to do with actors.)
|}
|}


A panic moon causes enemies and other respawnable objects to respawn since it calls [https://eventviewer.zeldamods.org/viewer.html?data=/d/Demo011_0.json&params=1&entry=Demo011_0&node=Event3 Demo011_0] just like the regular blood moon code. The demo contains a call to [[AIDef:Action/EventOffWaitRevivalAction]] (OffWaitRevival), which appears to be what actually resets the revival flags.
=== TimeMgr ===
 
TimeMgr handles everything to do with time, including Blood Moons and the Lord of the Mountain's apparition.
=== Panic blood moon inhibitors ===
Panic blood Moons can only occur if '''all''' of the following conditions are '''false'''<ref>Switch 1.5.0 0x71007ADFB0</ref>:
* the player is in a dungeon, AocField, GameTestField, GameTestField2, or any debug or dev map
* the Fade screen (loading screen) is opened
* some [[EventMgr]] check returns false{{check}}
* there is an active event
* the player actor does not exist
* the player is more than 0.25 distance units away from his save position (game data flag: PlayerSavePos)
 
== Notes ==
<references/>


[[Category:Game mechanics]]
[[Category:Internals]]
[[Category:Internals]]
[[Category:Subsystems (BotW)]]

Revision as of 10:38, 30 October 2018

WorldMgr
Subsystem
Official name Yes
Description Manages world state (time, blood moons, climates, weather, etc.)
Init function Switch 1.5.0: 00000071010F2920
Wii U 1.5.0: ???
Debug only No

The World Manager (WorldMgr) is responsible for managing time, blood moons, climates, weather, fog, wind, lighting, procedural generation of clouds, whether the Lord of the Mountain appears, etc.

Because of the massive amount of state to handle, functionality is split across the main WorldMgr and 9 sub-managers.

WorldMgr

Sub-managers

Sub-managers are created in WorldMgr::init (0x71010F43C0) and inserted into a pointer array (@WorldMgr+0x5c0). All names below are unofficial.

Sub-managers by ID
ID Description
0 TimeMgr
1 CloudPr? Handles cloud procedural generation.
2 ???
3 Weather? Handles "rain splash" and climate weathers.
4 TemperatureMgr? (Reasonably sure about this one.)
5 ???
6 Sky and fog? Holds the configuration for all EnvPalettes, EnvAttributes, WeatherInfluences, Remains palettes, Indoor palettes and dungeon fogs.
7 DofMgr? Holds depth of field related parameters.
8 ??? (contains a BaseProcLink, so it might have something to do with actors.)

TimeMgr

TimeMgr handles everything to do with time, including Blood Moons and the Lord of the Mountain's apparition.