WorldMgr/zh: Difference between revisions

1,584 bytes removed ,  4 years ago
Updating to match new version of source page
imported>Simple
m (月相列表)
(Updating to match new version of source page)
Line 1: Line 1:
{{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.


'''World Manager''' (WorldMgr) 是遊戲裡的一個子系統。
Because of the massive amount of state to handle, functionality is split across the main WorldMgr and 9 sub-managers.
它控制時間、血月、氣候、天氣、霧、風、閃電、雲、山林霸主的出現等等。
 
這個子系統很大/複雜,它的功能被切成九個部分。
 
譯者注:
原文是 [[WorldMgr]]。
原文的寫作方式是盡可能地忠實呈現遊戲原始碼的意圖,
譯者在原文外自行加入了遊玩過程中累積的經驗。
譯者沒辦法理解的或翻譯之後無法忠於原意的部分保留英文原文。
 


== WorldMgr ==
== 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) 由 WorldMgr::init (0x71010F43C0) 生成,
and inserted into a pointer array (@WorldMgr+0x5c0).
(注意以下名稱不是官方名稱。)


{|class="wikitable"
{|class="wikitable"
Line 25: Line 13:
! ID !! Description
! ID !! Description
|-
|-
| 0 || TimeMgr: 時間、血月、山林霸主
| 0 || TimeMgr: Handles time, blood moons, Lord of the Mountain.
|-
|-
| 1 || CloudPrMgr:
| 1 || CloudPrMgr: Handles cloud procedural generation.
|-
|-
| 2 || ShootingStarMgr: 流星跟異度神劍流星 (in 1.3.3+)
| 2 || ShootingStarMgr: Manages shooting stars and (in 1.3.3+) special shooting stars for the Xenoblade 2 quest.
|-
|-
| 3 || WeatherMgr: Handles "rain splash" and 氣候、天氣
| 3 || WeatherMgr: Handles "rain splash" and climate weathers.
|-
|-
| 4 || TempMgr: 溫度 {{check}}.
| 4 || TempMgr: Handles world temperature{{check}}.
|-
|-
| 5 || ?
| 5 || ?
|-
|-
| 6 || SkyMgr: 天空、霧 {{check}}。Holds the configuration for all EnvPalettes, EnvAttributes, WeatherInfluences, Remains palettes, Indoor palettes and dungeon fogs.
| 6 || SkyMgr: Handles sky and fog{{check}}. Holds the configuration for all EnvPalettes, EnvAttributes, WeatherInfluences, Remains palettes, Indoor palettes and dungeon fogs.
|-
|-
| 7 || DofMgr: Handles depth of field{{check}}. Holds depth of field related parameters.
| 7 || DofMgr: Handles depth of field{{check}}. Holds depth of field related parameters.
Line 44: Line 32:
|}
|}


=== 氣候 ===
=== Climate ===
 
The main WorldMgr class is responsible for keeping climate related parameters and determining which set of climate settings to use. Strangely enough, WorldMgr uses the position of the Camera actor to figure out which map area the player is in (and thus what climate to use), not the Player actor.
WorldMgr 本身(而不是小主管)負責處理氣候那一類的事情。
氣候顯然是由玩家所在的位置決定的(在火山很熱、在山上很冷),
有趣的是,它是用攝影機所在的位置而不是林克所在的位置來決定氣候的。
 


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


TimeMgr 管理所有跟時間有關的事情,例如血月何時出現,山林霸主何時出現。
Internally, time of day is stored as a float in the [0.0, 360.0] range.
遊戲內時間(小時跟分鐘)是一個 [0.0, 360.0] 範圍內的浮點數。
0.0 代表子夜,180.0 代表中午。


=== TimeMgr::init ===
=== TimeMgr::init ===
 
* Time is set to 78.75 (05:15).
(init 代表初始化設定)
* 遊戲內時間令為 78.75,早上 05:15 的意思)。
* Time for TotS environment is set to 78.75 (05:15) as well.
* Time for TotS environment is set to 78.75 (05:15) as well.
* "Bloody Moon end reserve timer" is set to 0.(這個計時器不是用來倒數血月何時出現的那個,先別管它。)
* "Bloody Moon end reserve timer" is set to 0.


=== TimeMgr::reset ===
=== TimeMgr::reset ===
 
This is called whenever a stage is unloaded (essentially every time the loading screen is shown).
This is called whenever a stage is unloaded (essentially every time the loading screen is shown).(意思是只要讀檔就會呼叫這個成員函數。)
* Blood Moon checks are delayed.
* Blood Moon checks are delayed.
* The AnimalMaster_Appearance flag is cleared.(山林霸主 flag 會被設為 false,意思是不要出現。)
* The AnimalMaster_Appearance flag is cleared, meaning the Lord of the Mountain will not appear.


=== TimeMgr::calc ===
=== TimeMgr::calc ===
這個函數每幀呼叫一次。
This is called every frame.


* (If field 0x14A is set to 99, WM_BloodyDay is set to true. [[AIDef:Action/SetBloodyMoonEnv]] uses this to force a Blood Moon to be scheduled. This feature appears to be unused.)(好像是沒用到的功能。)
* (If field 0x14A is set to 99, WM_BloodyDay is set to true. [[AIDef:Action/SetBloodyMoonEnv]] uses this to force a Blood Moon to be scheduled. This feature appears to be unused.)
* 如果某兩個過場動畫 [[Demo]]103_0 and Demo997_0 還沒播過的話,時間會被固定在 78.75(早上 05:15)。(那兩個過場動畫,前一個應該是林克走出復甦神廟環顧海拉魯,後一個不知道。)
* If both [[Demo]]103_0 and Demo997_0 have not been played, time of day is reset to 78.75 (05:15).
* 如果 [[AIDef:Action/AdvanceTime]] 或是其他什麼東西強制把時間定在某個值的話(在營火旁睡覺之類的),那時間就會更新。
* If [[AIDef:Action/AdvanceTime]] or anything else that changes time of day was called, the actual time is updated at this moment.
* [[#子夜檢查]]
* [[#Midnight checks]].


* '''更新時間''':有幾種更新的模式,大部分的時候是用模式 0。
* '''Update time of day''': there are several possible update modes. In most cases, the update mode is 0.
{|class="wikitable"
{|class="wikitable"
! Mode !! Description
! Mode !! Description
|-
|-
| 0 || 如果 Demo103_0 or Demo997_0 播過的話,而且不是在過場動畫裡的話:
| 0 || If Demo103_0 or Demo997_0 have been played, and if there is no active event (cutscene):
* Add (0.0083333 * elapsed frames) to 遊戲內時間. 所以遊戲裡的一分鐘是現實生活中的一小時。
* Add (0.0083333 * elapsed frames) to the Time of Day timer. Effectively, this means that 1 in-game minute = 1 real-life second.
* 如果遊戲內時間 >= 360.0, 也就是完整的一天已經過完了,那就減掉 360,然後執行子夜檢查(下面詳述)。
* If the timer is >= 360.0, which means that a day has passed, the game subtracts 360 from the timer and then performs midnight checks.
* If FindDungeon_Activated is false (if the player hasn't received the ''The Isolated Plateau'' quest) and if the current time is >= 165.0 (11:00), the time is forcefully set to 11:00. Effectively, this means that time will not get past 11:00 until the Great Plateau Tower is activated and the Old Man cutscene is triggered.
* If FindDungeon_Activated is false (if the player hasn't received the ''The Isolated Plateau'' quest) and if the current time is >= 165.0 (11:00), the time is forcefully set to 11:00. Effectively, this means that time will not get past 11:00 until the Great Plateau Tower is activated and the Old Man cutscene is triggered.
整句的意思是,遊戲從 5:15 開始跑,如果到 11:00 你還沒啟動初始之塔而且爬下來的話,遊戲時間會固定在 11:00。
* The Blood Moon timer is updated too.
* 血月計時器也會增加。
|-
|-
| 1, 13, 35 || Freeze time to 04:00
| 1, 13, 35 || Freeze time to 04:00
Line 138: Line 117:
|-
|-
| 34 ||
| 34 ||
* Add (0.0083333 * elapsed frames) to 遊戲內時間.
* Add (0.0083333 * elapsed frames) to the Time of Day timer.
* 如果遊戲內時間 >= 360.0, 也就是完整的一天已經過完了,那就減掉 360。
* If the timer is >= 360.0, which means that a day has passed, the game subtracts 360 from the timer.


'''附註''': 這個模式跟模式 0 不一樣的地方在於血月計時器不會更新。
'''Note''': In this state, the blood moon timer is never updated and its value is never checked either.
|}
|}


* 更新 [[#日夜標籤]],更新 [[#Time division, IsMorning, IsNoon, etc.]]
* Update the [[#Day/night time flag]], the [[#Time division, IsMorning, IsNoon, etc.]]
* If the "Bloody Moon end reserve timer" is non zero, decrement it. If the new value is zero, the WM_BloodyDay flag is cleared.(這個計時器不是用來倒數血月何時出現的那個,先別管它。)
* If the "Bloody Moon end reserve timer" is non zero, decrement it. If the new value is zero, the WM_BloodyDay flag is cleared.
* 更新 [[#山林霸主]] flags.
* Update [[#Lord of the Mountain]] flags.
 
=== 子夜檢查 ===
 
下面這些是子夜檢查的內容(就是每次時間從 360.0 變成 0.0 的時候做的事情)。


增加 WM_NumberOfDays(總共在遊戲裡活了幾個遊戲天)。
=== Midnight checks ===
The following actions happen every time the timer reaches 360.0 (midnight).


'''如果「血月該出現了」''' (如果 WM_BloodyDay is true):
WM_NumberOfDays is incremented.
(可以看到東方有紅色滿月就是這個狀態,雙子驛站的西納巴岡會告訴你內心有股騷動。)
* 如果沒辦法出現血月(下面有列原因),血月計時器會被設在 2880.0。
* 如果血月可以出現,呼叫 [https://eventviewer.zeldamods.org/viewer.html?data=/d/Demo011_0.json&params=1 Demo011_0] (又到了紅月出現的時刻,林克你要小心) 然後血月計時器歸零。


'''「好久沒有血月了」'''
'''If a Blood Moon is scheduled''' (WM_BloodyDay is true):
* 如果 FirstTouchdown flag is set(出台地了)而且血月計時器 > 2520.0 (遊戲內過了整整七天,營火快轉不算):
*If Blood Moons are prohibited (see conditions below), set the Blood Moon timer to 2880.0.
** WM_BloodyDay is set to true. 代表下個子夜檢查時就會執行上面的「血月該出現了」。
*If they are allowed to happen, call [https://eventviewer.zeldamods.org/viewer.html?data=/d/Demo011_0.json&params=1 Demo011_0] and set the Blood Moon timer to 0.0.
** 血月計時器歸零。
* Otherwise, the "Bloody end reserve timer" is set to 150. This ensures that the WM_BloodyDay flag is cleared 5 in-game minutes (= 5 seconds in real life) after a Blood Moon occurs. (不確定這句意思,先別管它。)


==== 阻止血月的理由 ====
'''Scheduling new Blood Moons''':
*If the FirstTouchdown flag is set (i.e. if the player has left the Great Plateau), and if the Blood Moon timer is > 2520.0 (7 in-game days):
**WM_BloodyDay is set to true, which means that a Blood Moon is scheduled for the next night.
**The Blood Moon timer is reset to 0.0.
* Otherwise, the "Bloody end reserve timer" is set to 150. This ensures that the WM_BloodyDay flag is cleared 5 in-game minutes (= 5 seconds in real life) after a Blood Moon occurs.


下面任何一件事情都會阻止血月。
==== Blood Moon inhibitors ====
If any of the following conditions are true, the Blood Moon cutscene will not be triggered.


* Not on MainField (main overworld)(在神廟裡之類的地方)
* Not on MainField (main overworld)
* IsInHyruleCastleArea is set(在城堡裡之類的地方)(不過實測食堂會有血月)
* IsInHyruleCastleArea is set
* LastBossGanonBeastGenerateFlag is set (fighting Dark Beast Ganon)(在打魔獸加儂)
* LastBossGanonBeastGenerateFlag is set (fighting Dark Beast Ganon)
* BloodyMoonProhibition is set(這是什麼?)
* BloodyMoonProhibition is set
* Wind_Relic_BattleStart is set (Vah Medoh battle)(在打瓦‧梅德)
* Wind_Relic_BattleStart is set (Vah Medoh battle)
* Electric_Relic_Battle is set (Vah Naboris battle)(在打瓦‧娜波力斯)
* Electric_Relic_Battle is set (Vah Naboris battle)
* Water_Relic_BattleTime is set (Vah Ruta battle)(在打瓦‧露塔)(咦?瓦‧魯達尼亞呢?)
* Water_Relic_BattleTime is set (Vah Ruta battle)
* SkyMgr's field_2B4 is set to 15 and field_2B8 >= 1.0(天氣很糟之類的?)
* SkyMgr's field_2B4 is set to 15 and field_2B8 >= 1.0


請注意:即使血月被阻止,血月計時器也不會歸零,還是會繼續增加。(待在神廟裡仍然會越來越接近血月。)
However, these do not prevent the Blood Moon timer from advancing, or the WM_BloodyDay flag from being set.
這些理由也不能阻止 WM_BloodyDay from being set,也就是說,「好久沒有血月了」還是會進到「血月該出現了」,只是不會真的出現。


=== 日夜標籤 ===
Note: Vah Rudania is missing from the list. This is normal and blood moons still cannot happen during the Vah Rudania battle sequence because the BloodyMoonProhibition flag is set during it.


=== Day/night time flag ===
From 00:00 to 06:00 (closed interval) and from 18:00 to 00:00 (closed interval), WM_DaytimeFlag is set to false and WM_NighttimeFlag is true.
From 00:00 to 06:00 (closed interval) and from 18:00 to 00:00 (closed interval), WM_DaytimeFlag is set to false and WM_NighttimeFlag is true.


Line 211: Line 187:
Note: all intervals include the start time and exclude the end time.
Note: all intervals include the start time and exclude the end time.


=== 月相 ===
=== Moon type ===
The moon type is calculated based on the number of in-game days (WM_NumberOfDays). The exact formula is <code>(numberOfDays + x + 1) % 8</code><ref>0x71010E8200</ref>, where x is equal to 1 if the current time is > 180.0 (noon) and % is the modulo operator.


月相取決於你在遊戲裡活了幾天 (WM_NumberOfDays)
If a moon type was set manually (for instance using [[AIDef:Action/EventSetMoonType]]), that value will be used as the moon type.
精確的式子是 <code>(numberOfDays + x + 1) % 8</code><ref>0x71010E8200</ref>,
這裡的 x 在下午的時候是 1,上午的時候是 0。
百分號是模運算(除以八的餘數)。
也就是說,每過一次正午月相就前進一格。
從 0 開始,滿月、十六夜、下弦月、殘月、新月、眉月、上弦月、十三夜。


如果有什麼東西直接設定月相的話 (例如 [[AIDef:Action/EventSetMoonType]]),那月相就會是設定過的值。
The moon type is returned by [[AIDef:Query/WhatMoonName]], which some NPC event flows use to check the current moon phase. However, the moon schedule has nothing to do with the blood moon schedule.
(不記得有什麼東西可以直接設定月相。)


這個函數 [[AIDef:Query/WhatMoonName]] 會回傳月相。
=== Lord of the Mountain ===
雙子驛站的西納巴岡在內心沒有騷動的時候會告訴你今晚的月相。
The Lord of the Mountain appears whenever the AnimalMaster_Appearance flag is set. Its value is managed by a simple state machine.
請注意:月相跟血月沒有任何關係。
血月不只會在本來應該是滿月的晚上出現,血月後也不會接到下弦月。
 
=== 山林霸主 ===
 
山林霸主會在 AnimalMaster_Appearance flag 是 true 的時候出現。
山林霸主出不出現是由一個有限狀態自動機控制的。


Note that whenever a stage is unloaded, the AnimalMaster_Appearance flag is reset to false.
Note that whenever a stage is unloaded, the AnimalMaster_Appearance flag is reset to false.
只要讀檔,山林霸主就會消失。
====State 0 沈默狀態====
如果以下全真
* [[#月相]] 是 5(眉月)
* AnimalMaster_Existence flag 是 false(山林霸主還沒出現)
* The current [[map area]] number is not 64 ("HyruleHill",就是林克處在薩托利山這個區域)
那麼遊戲會從 [0 .. 22] 這個區間生成一個隨機的數值(這個數值代表山林霸主幾點出現),
然後進到 State 1。
====State 1 蓄勢待發狀態====
如果你進到 map area 64 (薩托利山這個區域)那就回到 State 0(隨機數值也作廢)。
如果你不在 map area 64,那遊戲會一直等等到現在的時間(小時)是上面生成的出現的小時。
(請注意這個檢查是每幀都做。)
這時 AnimalMaster_Appearance 設成 true,山林霸主會出現/薩托利山會發光。
然後進到 State 2。


====State 2 發光狀態====
====State 0 - Wait for conditions====
If the following three conditions are true:
* The [[#Moon type]] is 5 (waxing crescent)
* The AnimalMaster_Existence flag is false (the LotM must not already be spawned)
* The current [[map area]] number is not 64 ("HyruleHill", presumably the Satori Mountain area)


一個遊戲內小時後,遊戲會紀錄星期幾,然後進到 State 3.
then the game generates a random "appearance hour" in the [0 .. 22] interval and goes into state 1.


====State 3 繼續發光狀態====
====State 1 - Wait for the appearance time====
If the player is in map area 64, the state is reset back to 0.


「兩天之後」 ''or'' 「『過了一天』且『現在的小時 >= 出現的小時』」,山林霸主消失。
Otherwise, the game does nothing until the current hour matches the previously generated appearance hour, at which point it sets AnimalMaster_Appearance to true (which allows the LotM to spawn) and goes into state 2.
(意思應該是山林霸主只會維持整整 24 遊戲內小時/現時分鐘。)


====State 4 熄滅狀態====
====State 2====
After one hour has elapsed, the current day of the week is stored and the state is set to 3.


等月相是 5 的時候再進到 State 0.
====State 3====
After two week day changes, ''or'' [after the in-game day of the week changes and the current hour is >= the generated appearance hour], the LotM will disappear and the state will be set to 4.


====State 4====
The game waits for the moon type to be 5, before going back to state 0.


== WeatherMgr ==
== WeatherMgr ==
826

edits