Object respawning/zh: Difference between revisions
(Created page with "RevivalRandomForDrop policy 底下包含的物件會在隨機時間點重生。此時間長短與紅月無關。這一類主要是打壞木箱後掉出來的東西(水果等...") |
No edit summary |
||
(5 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
''曠野之息''裡的材料、武器、跟敵人會在一段時間後重生。這個機制是為了防止遊戲世界變得「太空曠」。確切的重生規則取決於每種東西的特性。 | |||
GameData 裡用來追蹤每個東西應該如何重生的 flag 叫做 "revival flags"(復活標籤)。這些 revival flags 無時無刻都存在遊戲的記憶體裡,即使是相應的物件可能並不存在。 | GameData 裡用來追蹤每個東西應該如何重生的 flag 叫做 "revival flags"(復活標籤)。這些 revival flags 無時無刻都存在遊戲的記憶體裡,即使是相應的物件可能並不存在。 | ||
Line 49: | Line 49: | ||
This grid is shown on the object map. It is also possible to show the no-revival area for an object by right clicking on it. | This grid is shown on the object map. It is also possible to show the no-revival area for an object by right clicking on it. | ||
== | == 血月後重生的物件 (RevivalBloodyMoon) == | ||
血月 [[blood moon]] 是大部分武器跟敵人重生的關鍵。每次血月出現後,所有跟血月有關的 revival flags 都會被重設為預設值。 | 血月 [[blood moon]] 是大部分武器跟敵人重生的關鍵。每次血月出現後,所有跟血月有關的 revival flags 都會被重設為預設值。 | ||
Line 847: | Line 847: | ||
RevivalRandomForDrop policy 底下包含的物件會在隨機時間點重生。此時間長短與紅月無關。這一類主要是打壞木箱後掉出來的東西(水果等)。 | RevivalRandomForDrop policy 底下包含的物件會在隨機時間點重生。此時間長短與紅月無關。這一類主要是打壞木箱後掉出來的東西(水果等)。 | ||
這些物件的 [[ResetType]] 是 0,and the position of the object on the main map is stored in the upper 7 bits of the initial flag value。 | |||
{{actor list|label='''Actors under the RevivalRandomForDrop policy'''|content= | {{actor list|label='''Actors under the RevivalRandomForDrop policy'''|content= | ||
Line 890: | Line 890: | ||
}} | }} | ||
== | == 和山林霸主一起出現的物件 (RevivalUnderGodTim) == | ||
RevivalUnderGodTime policy 底下的物件會和山林霸主一起出現,也就是當 AnimalMaster_Appearance flag 被 [[WorldMgr]] 設成 true 的時候。 | |||
對這類物件而言,[[ResetType]] 的值是 4。 | |||
{{actor list|label='''Actors under the RevivalUnderGodTime policy'''|content= | {{actor list|label='''Actors under the RevivalUnderGodTime policy'''|content= |
Latest revision as of 00:43, 29 May 2020
旷野之息里的材料、武器、跟敌人会在一段时间后重生。这个机制是为了防止游戏世界变得“太空旷”。确切的重生规则取决于每种东西的特性。
GameData 里用来追踪每个东西应该如何重生的 flag 叫做 "revival flags"(复活标签)。这些 revival flags 无时无刻都存在游戏的内存里,即使是相应的物件可能并不存在。
商品
商店里卖的东西会在子夜时更新(商店会补货),但是必须满足下面这些条件:
- 每件商品都会对应到一块区域,玩家在补货的当下不能处在个范围内。
- 箭类的物品只有在玩家持有少于 50 [1] 个时才会补货。
[1.3.1+] 检查玩家持有多少箭的函数会检查玩家“真正的”口袋。所谓“假的”口袋则是指玩家在剑之考验之类的特殊任务里,物品栏会被暂时清空。换句话说,故意进入这些特殊任务不再会让 GameDataMgr 误以为玩家箭很少,进而补货。
商品的 Revival flags 里,GameDataMgr 这一项被设成 3。(意思是凡是设成 3 的物品都会遵守上面讲的商店补货的逻辑。)
重生用地图网格
上面提到的商品和另一类随机重生的物件(下面会详述)使用的地图网格和正常的地图网格有一点点不同。这里用到的地图网格有 10 columns (从 0 到 9)和 8 rows(从 0 到 7)。
假设一件商品(或一个随机重生的物件)位在第 itemCol
个 column 跟第 itemRow
个 row 里,那么玩家“不在指定区域内”的意思是
- itemCol < playerCol1
- 或 itemCol > playerCol2
- 或 itemRow < playerRow1
- 或 itemRow > playerRow2
玩家的位置(playerCol1、playerCol2、playerRow1、playerRow2)是这样计算的:
int col = std::clamp(((signed int)x + 5000) / 1000, 0, 9);
int row = std::clamp(((signed int)z + 4000) / 1000, 0, 7);
if ( (col + 0.5) * 1000.0 + -5000.0 >= x ) {
*col1 = col - 1;
*col2 = col;
} else {
*col1 = col;
*col2 = col + 1;
}
if ( (row + 0.5) * 1000.0 + -4000.0 >= z ) {
*row1 = row - 1;
*row2 = row;
} else {
*row1 = row;
*row2 = row + 1;
}
This grid is shown on the object map. It is also possible to show the no-revival area for an object by right clicking on it.
血月后重生的物件 (RevivalBloodyMoon)
血月 blood moon 是大部分武器跟敌人重生的关键。每次血月出现后,所有跟血月有关的 revival flags 都会被重设为预设值。
对于这一类的物品,GameDataMgr 这一项的值是 1。(换句话说,所有 ResetType 是 1 的物品都会在血月后复活。)
不自动重生的物件 (RevivalNone)
遵守 RevivalNone policy 的物件不会自动重生。这些物件的列表如下。
不重复掉落的物件 (RevivalNoneForDrop)
遵守 RevivalNoneForDrop policy 的物件也不会再次出现。这个类别主要包含了坏掉的守护者(眼睛不会亮的)底下的材料。
不重复使用的物件 (RevivalNoneForUsed)
这一类的物件主要包含勇导石(林克拿希卡石去碰的东西),这些物件只能使用一次。
随机重生的物件 (RevivalRandom)
RevivalRandom policy 底下包含的物件会在随机时间点重生。此时间长短与红月无关。这一类的物件主要是素材(植物、水果、石头等)。
这些物件的 GameDataMgr 是 0,and the position of the object on the main map is stored in the upper 7 bits of the initial flag value。
随机重生跟随机掉落的逻辑
每隔六十秒[2],RadarMgr 会计算玩家在重生用网格上的位置。
如果玩家在 AocField(剑之考验)里:
- 某些特殊的 flags (with the reset data set to 127) 会被忽略而不重生.
- 其他物件有 1% 几率重生。
如果玩家不在剑之考验里,那么检查:
- 如果玩家在主世界里,上面讲到的特殊的 flags 有 1% 几率重生。
- 如果玩家不在主世界里不特殊的 flags 也有 1% 几率重生。
- 若以上皆非,那么每个 flag 还是有 1% 几率重生,前提是玩家跟该物件不处在同一个网格里。
随机掉落的物件 (RevivalRandomForDrop)
RevivalRandomForDrop policy 底下包含的物件会在随机时间点重生。此时间长短与红月无关。这一类主要是打坏木箱后掉出来的东西(水果等)。
这些物件的 GameDataMgr 是 0,and the position of the object on the main map is stored in the upper 7 bits of the initial flag value。
和山林霸主一起出现的物件 (RevivalUnderGodTim)
RevivalUnderGodTime policy 底下的物件会和山林霸主一起出现,也就是当 AnimalMaster_Appearance flag 被 WorldMgr 设成 true 的时候。
对这类物件而言,GameDataMgr 的值是 4。
- ↑ This is configured by ActorInfo.product.sbyml (itemSaleRevivalCount property) .
- ↑ Time spent in menus and cutscenes does not count