Scheduled system upgrade on Sunday 21 April 2024 15:00-16:00 UTC - On that day, the wiki and other services might go down for 5-15 minutes.

AIDef:AI/GuardFrequencySelect and Blood moon: Difference between pages

From ZeldaMods (Breath of the Wild)
(Difference between pages)
Jump to navigation Jump to search
imported>Leoetlino
(import AI definitions from 1.5.0)
 
imported>Leoetlino
 
Line 1: Line 1:
{{AIDef
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.
|name=GuardFrequencySelect
 
|type=AI
Blood moons are also used to reset internal state when some subsystems are running out of memory or become unresponsive. Such blood moons are commonly referred to as "panic" or "emergency blood moons".
}}
 
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 reverse engineering the code, everyone knows 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. And a quick look at the code shows that it's an absurd idea.</ref>.
 
== Scheduled Blood Moons ==
{{empty section}}
 
== Panic Blood Moons ==
Panic Blood Moons occur when the game is running out of memory or when some tasks are taking too much time.
 
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.


== Children ==
{|class="wikitable"
{|class="wikitable"
! Name !! Description
|+ Panic Blood Moon reasons
! Bit !! Description
|-
|-
| ガード ||  
| 0 || '''[[Resource system]]''': at least one of the following is true:
* Bit 12 is set in the ResourceMgrTask's flags (indicating a problem with a resource load{{check}})
* ''An'' overlay arena's heap free size percentage is ''less than or equal to'' its configured minimum percentage.
**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)
|-
|-
| 2 || '''[[PlacementMgr]]''': Actor spawning heap is running out of memory (''less than'' 5% free)
|-
| 3 || '''ResourceSystem/OverlayArena''': ForResourceS heap is running out of memory
|-
| 4 || '''ResourceSystem/OverlayArena''': ForResourceL heap is running out of memory
|-
| 5 || '''ResourceSystem/OverlayArena''': Audio heap is running out of memory
|-
| 6 || '''ResourceSystem/TextureHandleMgr''': Last TextureHandleMgr::calc execution took more than 60 seconds
|}
|}


== Derived definitions ==
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 OffWaitRevival, which appears to be what actually resets the revival flags.
=== ターン (Stal_Bokoblin_Junior_Body, 防御) ===
 
{{AIDefDerived
== Inhibitors ==
|name=ターン
{{empty section}}
|group_name=防御
 
|derived_from=GuardFrequencySelect
[[Category:Game mechanics]]
|aiprog=Stal_Bokoblin_Junior_Body
[[Category:Internals]]
}}
No overridden parameters.
=== 戦闘準備 (Stal_Bokoblin_Junior_Body, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Stal_Bokoblin_Junior_Body
}}
No overridden parameters.
=== ターン (Lizalfos, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos
}}
No overridden parameters.
=== ターン (Bokoblin_Red, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Bokoblin_Red
}}
No overridden parameters.
=== 戦闘準備 (Bokoblin_Red, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Bokoblin_Red
}}
No overridden parameters.
=== ターン (Lizalfos_Fire, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Fire
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Fire, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Fire
}}
No overridden parameters.
=== ターン (Bokoblin_Senior, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Bokoblin_Senior
}}
No overridden parameters.
=== ターン (Bokoblin_Rapid, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Bokoblin_Rapid
}}
No overridden parameters.
=== 戦闘準備 (Bokoblin_Rapid, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Bokoblin_Rapid
}}
No overridden parameters.
=== ターン (Lizalfos_Electric, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Electric
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Electric, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Electric
}}
No overridden parameters.
=== ターン (Moriblin_Senior, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Moriblin_Senior
}}
No overridden parameters.
=== 戦闘準備 (Moriblin_Senior, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Moriblin_Senior
}}
No overridden parameters.
=== ターン (Lizalfos_Bone, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Bone
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Bone, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Bone
}}
No overridden parameters.
=== ターン (Moriblin_Blue, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Moriblin_Blue
}}
No overridden parameters.
=== 戦闘準備 (Moriblin_Blue, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Moriblin_Blue
}}
No overridden parameters.
=== ターン (Stal_Moriblin_Bone, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Stal_Moriblin_Bone
}}
No overridden parameters.
=== 戦闘準備 (Stal_Moriblin_Bone, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Stal_Moriblin_Bone
}}
No overridden parameters.
=== ターン (Lizalfos_Senior, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Senior
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Senior, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Senior
}}
No overridden parameters.
=== ターン (Lizalfos_Middle, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Middle
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Middle, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Middle
}}
No overridden parameters.
=== ターン (Lizalfos_Ice, 防御) ===
{{AIDefDerived
|name=ターン
|group_name=防御
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Ice
}}
No overridden parameters.
=== 戦闘準備 (Lizalfos_Ice, 防御近接戦闘) ===
{{AIDefDerived
|name=戦闘準備
|group_name=防御近接戦闘
|derived_from=GuardFrequencySelect
|aiprog=Lizalfos_Ice
}}
No overridden parameters.

Revision as of 15:11, 27 October 2018

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.

Blood moons are also used to reset internal state when some subsystems are running out of memory or become unresponsive. Such blood moons are commonly referred to as "panic" or "emergency blood moons".

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[1].

Scheduled Blood Moons

Panic Blood Moons

Panic Blood Moons occur when the game is running out of memory or when some tasks are taking too much time.

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.

Panic Blood Moon reasons
Bit Description
0 Resource system: at least one of the following is true:
  • Bit 12 is set in the ResourceMgrTask's flags (indicating a problem with a resource load[check])
  • An overlay arena's heap free size percentage is less than or equal to its configured minimum percentage.
    • 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)
2 PlacementMgr: Actor spawning heap is running out of memory (less than 5% free)
3 ResourceSystem/OverlayArena: ForResourceS heap is running out of memory
4 ResourceSystem/OverlayArena: ForResourceL heap is running out of memory
5 ResourceSystem/OverlayArena: Audio heap is running out of memory
6 ResourceSystem/TextureHandleMgr: Last TextureHandleMgr::calc execution took more than 60 seconds

A panic moon causes enemies and other respawnable objects to respawn since it calls Demo011_0 just like the regular blood moon code. The demo contains a call to OffWaitRevival, which appears to be what actually resets the revival flags.

Inhibitors

  1. Even without reverse engineering the code, everyone knows 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. And a quick look at the code shows that it's an absurd idea.