模组:魚類數據

出自Stardew Valley Wiki
跳至導覽 跳至搜尋

目錄

此頁面解釋遊戲如何存儲和解析魚數據,包括生成機制。這是面向模組開發者的高級指南。

解析魚類生成條件

遊戲會檢查兩個位置來決定玩家釣魚時生成何種魚類。這僅適用於正常魚類;計算生成傳說魚類的概率時,在檢查這兩個位置之前還會單獨檢查地點代碼。 (由BobberBarGameLocation::getFish的逆向工程可知)

生成地點

每種魚類都歸屬於地點內的一片區域,且僅當玩家處在該區域內時才會生成。GameLocation::getFishingLocation定義了每個區域的地塊坐標。對於每個遊戲區域,它都可以被重寫。現定義了如下區域:

  • 煤礦森林:
    • 池塘(區域#1,從地塊(0, 0)(52, 42),包括邊界);
    • 河流 (區域#0,匹配森林的其他區域)
  • 島嶼西部
    • 淡水(區域#2,從地塊(36, 0)(36, 80),包括邊界);
    • 海洋(區域#0,匹配其他位置)
  • 其他所有地點只有區域-1,所以從哪裡釣魚都無影響。

可在給定地點生成的魚由Data\Locations.xnb中用斜槓分隔的數據定義(另請參閱:模組:地點數據)。具體而言,有如下的字段索引:4(春季),5(夏季),6(秋季),7(冬季)。每個字段都包含<int fishID>(匹配Data\Fish.xnb)+<int areaID>(或-1表示任何區域)整數對。例如,煤礦森林夏季的魚數據為153 -1 145 0 144 -1 138 0 132 0 706 0 704 0 702 0。其可被解析為:

區域
153 -1 綠藻 任何區域(池塘或河流)
145 0 太陽魚 河流
144 -1 狗魚 任何區域(池塘或河流)
138 0 虹鱒魚 河流
132 0 鯛魚 河流
706 0 西鯡 河流
704 0 麻哈脂鯉 河流
702 0 鰱魚 河流

魚類數據和生成規則

魚類數據和生成規則是存儲在Data\Fish.xnb中的字段。包括兩種不同格式。

若第二個字段為trap,則這種魚只能用蟹籠捕獲,且使用如下格式:

索引 語法 示例 內容
0 <name> Lobster 魚的名稱
1 <type> trap 必須為trap,以指示需要使用蟹籠
2 <chance> .05 抓到此魚的概率。介於0到1之間。只有當文件中之前列出的魚都沒有被判定選中時,才會依此概率判定此魚選中與否。
3 688 .45 689 .35 690 .35 未使用。
4 <location> ocean 能抓到此魚的水體類型。為freshwaterocean
5 <min size> 2 此魚可能的最小和最大長度,單位為英寸。用於統計釣魚數據。非英語語言下,乘2.54轉換為厘米。
6 <max size> 20

否則,該魚類可以用釣竿捕獲,且使用如下格式:

索引 語法 示例 內容
0 <name> Pufferfish 魚的名稱。
1 <chance to dart> 80 魚在釣魚小遊戲中以多高頻率猛衝;介於15(鯉魚)和100(冰川魚)之間。
2 <darting randomness> floater 釣魚小遊戲中浮標以何種模式運動;取值為mixedsmoothfloatersinker,或dart
3 <min size> 1 此魚可能的最小和最大長度,單位為英寸。用於統計釣魚數據。非英語語言下,乘2.54轉換為厘米。.
4 <max size> 36
5 [<min time> <max time>]+ 1200 1600 一天中生成該魚的時間。包括最小值,不包括最大值。可以指定多個範圍。
6 [<season>]+ summer 未使用;季節數據會從Data/Locations讀取。
7 <weather> sunny 生成該魚的天氣。sunnyrainy,或both.
8 <locations> 690 .4 685 .1 未使用;地點會從Data/Locations讀取。
9 <max depth> 4 以最大概率抓住此類型的魚的最小水深;用於計算生成率(見下文)。
10 <spawn multiplier> .3 用於計算生成率的生成率乘數(見下文)。
11 <depth multiplier> .5 用於計算生成率的深度乘數(見下文)。
12 <fishing level> 0 魚出現所需的最低釣魚等級
13 <first-catch tutorial eligible> true 可否出現在第一次釣魚教程中。

生成率

魚類生成率的計算詳見遊戲文件[1]。每次玩家投擲釣竿時,會生成一個包含該地點所有可用魚類的隊列(包括藻類、海草、垃圾、秘密紙條、齊豆等)。隨後,按照特定優先級(例如「魚王 > 普通魚類 > 秘密紙條 > 垃圾」)進行排序,再隨機打亂同一優先級的不同魚類。遊戲將按順序遍歷該隊伍,對於隊伍中的每種魚類,在經過對季節、位置、水深、釣魚等級、魔法魚餌等要素的檢查後,將進行第一次隨機性判定計算選擇此種魚類的概率。若選中,遊戲將進行一些其他判定,例如魚餌類型、是否只能釣起1條等,並進行第二次隨機性判定。此方法會根據多重因素隨機地生成true或false,以決定能否釣起此魚,其機制較為複雜,見下文。若最終未能選中釣起的物品,則在非教程模式下返回空,否則返回太陽魚

在上文中,第一次隨機性判定的概率由SpawnFishData::GetChance方法和Data/Locations.xnb中的魚類數據給出,計算公式為{概率} = ChanceModifiers({Chance} + {CuriosityLureBuff} + {當日運氣}) * {SpecificBaitMultiplier} + {SpecificBaitBuff} + {ChanceBoostPerLuckLevel} * {運氣等級},其中英文參數均為Data/Locations.xnb中的對應字段。

第二次隨機性的概率由GameLocation::CheckGenericFishRequirements方法和Data/Fish.xnb中的魚類數據給出,其計算較複雜。首先,計算{概率} = {生成率乘數} - max(0, {最小水深} - {實際水深}) * {深度乘數} * {生成率乘數} + {釣魚等級} / 50。若為訓練用釣竿,則在此基礎上乘1.1,但最高不超過0.9 。若此時概率仍小於0.25且有珍稀誘鈎增益,則判斷是否為該收益是否為默認值。若是,則採用新概率 = 原概率 * 0.17 / 0.25 + 0.17 / 2來更新概率,否則直接在原概率的基礎上增加該魚類特有的珍稀誘鈎增益(CuriosityLureBuff)。若使用針對性魚餌,則再將此概率乘1.66 。若還受每日運氣影響則加上每日運氣。最後再應用概率修飾器(若有)。

1.6版本中魚類生成的相對概率計算更為複雜。

魚缸魚類

魚缸中的魚類可通過Data/AquariumFish資源來編輯:

索引 字段 目的
0 貼圖索引 LooseSprites/AquariumFish 貼圖集中該貼圖的索引,從左上角的貼圖為0開始計數。
1 類型 魚的類型。影響魚的行為。可能的取值為:
說明
鰻魚
頭足類
爬行類
底棲類
魚類
置頂爬行類 用於貼圖延伸到底板下面的爬行類。這類魚總被貼到離玻璃最近的位置且置於其他魚類上方,以避免排序問題。U
2
3–5
空閒動畫
猛衝動畫
魚類空閒(2)或猛衝(3–5)時使用的動畫。為一系列空格分隔的幀,每個幀都是LooseSprites/AquariumFish貼圖集中的貼圖索引。每幀持續125毫秒。例如,黃貂魚的空閒動畫為70 70 70 71 71 72

衝刺動畫分列三個字段:起始(3)、保持(4)和結束(5)。

7 帽子位置 在此貼圖上放置帽子的像素位置。為包含XY值的對象。自定義的魚缸魚類也能戴帽子,就像原版遊戲中的海膽

參考

  1. 魚類上鈎的概率計算涉及:Data/Locations.xnbSpawnFishData::GetChanceData/Fish.xnbGameLocation::CheckGenericFishRequirements;通過這4個文件路徑可以得到各個地方各種魚類的基礎數據並計算出釣上的概率