物件重生

From ZeldaMods (Breath of the Wild)
Revision as of 00:12, 29 May 2020 by Simple (talk | contribs) (Created page with "對這類物件而言,GameDataMgr 的值是 4。")
Jump to navigation Jump to search
Other languages:


曠野之息裡的材料、武器、跟敵人會在一段時間後重生。這個機制是為了防止遊戲世界變得「太空曠」。確切的重生規則取決於每種東西的特性。

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 的物品都会在血月后复活。)

Actors under the RevivalBloodyMoon policy

不自动重生的物件 (RevivalNone)

遵守 RevivalNone policy 的物件不会自动重生。这些物件的列表如下。

Actors under the RevivalNone policy

不重复掉落的物件 (RevivalNoneForDrop)

遵守 RevivalNoneForDrop policy 的物件也不会再次出现。这个类别主要包含了坏掉的守护者(眼睛不会亮的)底下的材料。

Actors under the RevivalNoneForDrop policy

不重复使用的物件 (RevivalNoneForUsed)

这一类的物件主要包含勇导石(林克拿希卡石去碰的东西),这些物件只能使用一次。

Actors under the RevivalNoneForUsed policy

随机重生的物件 (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。

Actors under the RevivalRandom policy

随机重生跟随机掉落的逻辑

每隔六十秒[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。

Actors under the RevivalRandomForDrop policy

和山林霸主一起出现的物件 (RevivalUnderGodTim)

RevivalUnderGodTime policy 底下的物件会和山林霸主一起出现,也就是当 AnimalMaster_Appearance flag 被 WorldMgr 设成 true 的时候。

对这类物件而言,GameDataMgr 的值是 4。

Actors under the RevivalUnderGodTime policy
  1. This is configured by ActorInfo.product.sbyml (itemSaleRevivalCount property) .
  2. Time spent in menus and cutscenes does not count