Don’t Starve 連線版地圖邏輯結構與地圖構成分析詳解

8 6 月

廣告

作者:LongFei_aot

來源:饑荒遊戲吧

最近和老崔合作的單機mod進度較慢,自己的時間又比較充裕,遂決定先做一個連線的pvp mod,然後就研究了一下連線版的地圖生成方式。在學習到如何創建地圖的同時,也瞭解到了饑荒本身的地圖生成機制。
感覺瞭解這些機制,對玩家提高探圖效率,節約時間還是非常有幫助的,所以就來寫一寫。
限於時間精力,只寫連線的,如果對單機的有興趣,自己類比著看下代碼也能明白。

首先,關於地圖的大部分代碼,全部都儲存在map資料夾下。不知道該怎麼用相關函數的時候,參照這個資料夾裡的代碼就好。

然後,再說一說饑荒地圖的邏輯結構。下面的專有名詞,由於我不清楚確切的中文翻譯,就全部採用其英文名行文了。
prefab,是地圖裡最基礎的東西,也就是所謂的最小元,一顆草,一塊燧石,一棵樹,都是一個prefab。這是饑荒地圖裡最小的構成元素。
room,包含了一系列prefab的一塊區域。典型的代表是豬王村,這個村子的一整塊區域就是一個room。可以為一個room設置它的地皮屬性,prefab的豐富程度,各個prefab之間出現比例,還可以直接設定出現多少個prefab。
task,包含了一系列的room的一塊非常大的區域。因為包含著地皮相似或相同的room,所以在地圖上常常以所謂地形的形態呈現出來。可以為一個task設定選取哪幾種room以及相應的數量,還可以設定作為背景的room(在room的數量不足時,偶爾會填充進來。),更為重要的,可以設置keys和locks,這決定著生成世界時,各個task之間要怎樣連接起來。
taskset和level,taskset是連線版最近才新增加的東西,單機只有level。taskset基本就是包含了一系列的task,然後level就是比taskset更高的一級,除了控制taskset之外,還可以控制世界生成的其他參數,比如說春夏秋冬的長度之類的。由於現在不是在講怎麼做mod,這一部分就不細講了。
在level之上還有一個叫遊戲類型的東西,但也和本貼關係不大,不細講。

然後有一些比較特殊的,要單獨講。
1、start location,也就是出生的區域,從各個屬性設置上,可以看作是一個room。特殊之處在於,它不歸屬於任何一個task,但有可能在生成的時候,融入到其它的task中去。如果在taskset裡設定了valid_start_tasks,它就只會融入指定的valid_start_tasks之一。同時,還可以設計出生時的set piece。那個經典的惡魔之門就是典型的set piece。如果你開永夜的話,你會發現還會多了一個火坑,這就是略微改變了出生的set piece的效果。
2、set piece,或者是static layout 或者是layout。這裡說到的這三個東西在本質上都是一樣的:都是以固定形式存在,而且可以被嵌入到世界中去的東西。典型代表就是各種奇遇了,比如蘑菇圓環啊,高鳥洞穴啊,各種前輩啊之類的。他們既可以被嵌入到room當中——比如豬王村的豬王和它周圍的方尖塔就是被嵌入到豬王村的room裡的;也可以在taskset裡設置,散佈在各個task裡——比如默認地上世界會有8個蟲洞,9個鹿鵝巢穴,1個龍蠅領地,2個復活石和10個洞穴入口,分佈在各個不同的task裡,這些分佈的task是可以自己設定的。
3、keys和locks。這兩張表是task中的屬性選項,關係著世界生成時,各個task怎麼結合。在map資料夾下的lockandkey.lua檔裡有lock和key的對應關係描述,當一個task的key和另外一個task的lock匹配的時候,他們就會結合在一起。不過有時候湊不出匹配的,那就只能胡亂結合了。需要說明的是,一個lock可以有多個key和它匹配。結合還設計到start task的選取,具體操作我已經研究實踐過了,但這不是本貼的重點,就不詳細說明了。

講完這些基礎知識,就可以來詳細地說一下地圖的構成了,這裡只說饑荒地上世界的默認構成,地下世界或者說其他設置,構成的方式和地上世界是不一樣的。

打開map\tasksets\forest.lua
然後你可以在這個檔裡看到AddTaskSet這個函數,裡面的參數就是要詳解的內容了。這個函數使用了兩次,第一次,第一個參數為”default”的,就是我們默認世界的生成參數。

這一段結合著代碼來說,為了方便不喜歡閱讀代碼,想要直接得到結論的人,代碼的釋義放在前面,結論放在後面。不想看代碼的可以直接跳過這一樓。

tasks = {
“Make a pick”,
“Dig that rock”,
“Great Plains”,
“Squeltch”,
“Beeeees!”,
“Speak to the king”,
“Forest hunters”,
“Badlands”,
“For a nice walk”,
},
這個tasks表,就設定了每次開世界,必然會有的幾個task

numoptionaltasks = 6,
optionaltasks = {
“Befriend the pigs”,
“Kill the spiders”,
“Killer bees!”,
“Make a Beehat”,
“The hunters”,
“Magic meadow”,
“Frogs and bugs”,
“Oasis”,
“Mole Colony Deciduous”,
“Mole Colony Rocks”,
“MooseBreedingTask”,
},
numoptionaltasks 就設定了會隨機出現的task的數量,而後面的optionaltasks 表,就是所有可能會被抽取的task。

valid_start_tasks = {

“Make a pick”,
},
valid_start_tasks 就是設定可能會作為世界生成最開始的task的集合。最開始的task,是會因為它的keys和locks而影響到世界生成的樣子的。

set_pieces = {
[“ResurrectionStone”] = { count = 2, tasks={“Make a pick”, “Dig that rock”, “Great Plains”, “Squeltch”, “Beeeees!”, “Speak to the king”, “Forest hunters”, “Badlands” } },
[“WormholeGrass”] = { count = 8, tasks={“Make a pick”, “Dig that rock”, “Great Plains”, “Squeltch”, “Beeeees!”, “Speak to the king”, “Forest hunters”, “Befriend the pigs”, “For a nice walk”, “Kill the spiders”, “Killer bees!”, “Make a Beehat”, “The hunters”, “Magic meadow”, “Frogs and bugs”, “Badlands”} },
[“MooseNest”] = { count = 9, tasks={“Make a pick”, “Beeeees!”, “Speak to the king”, “Forest hunters”, “Befriend the pigs”, “For a nice walk”, “Make a Beehat”, “Magic meadow”, “Frogs and bugs”} },
[“DragonflyArena”] = { count= 1, tasks={“Badlands”}},
[“CaveEntrance”] = { count = 10, tasks={“Make a pick”, “Dig that rock”, “Great Plains”, “Squeltch”, “Beeeees!”, “Speak to the king”, “Forest hunters”, “Befriend the pigs”, “For a nice walk”, “Kill the spiders”, “Killer bees!”, “Make a Beehat”, “The hunters”, “Magic meadow”, “Frogs and bugs”} },
},

set_pieces 就是設定各個奇遇了,這裡ResurrectionStone(復活石),WormholeGrass(蟲洞),都可以算是奇遇。後面的count就是數量,tasks就是設定這些奇遇可能出現在哪些task上。

然後來對上面的代碼做分析。為了加強和遊戲的聯繫感,我們分析一下各個task對應的所謂地形。相應的代碼可以在map\tasks資料夾下查到,這裡就不多說了,直接說代碼的解析結果–也就是每個task的room組成。
room的大小,雖然不固定,但總體上是差不多的,決定一個task有多大,就看room的總數量有多少了。另外,room的數量是可以設定隨機的。不過,官方的習慣,差值不會超過2。
下面會先列出組成的room,然後解釋各個room的特點(資源的數量和種類,以及一些特殊的奇遇或者特點等等)
資源的數量,如果固定了數量的,就直接寫出數量,否則用room的參數中的distributepercent來表示
0.1以下,匱乏
0.1-0.2 適中
0.2-0.3 豐富,
0.3以上 非常豐富
資源比例的數字,只是影響資源的分佈比例,只在與其他資源相互比較時會有意義,其本身的絕對值是沒有意義的。資源的總數量,完全由distributepercent決定。

首先是必然會出現的9個task。

1、Make a pick 背景地皮-草地
Forest 2-4個 :
地皮-森林
資源豐富(0.3)
資源比例:
螢火蟲=0.2
石樹=0.015
卵石=0.05
草=0.05
小樹苗=0.8
樹枝樹=0.8
地上的樹枝=0.06
漿果叢=0.03,
多汁漿果叢 = 0.015,
紅蘑姑 = .03,
綠蘑菇 = .02,
松樹或粗壯松樹 = 6

Clearing 1個:
地皮-森林
資源匱乏(0.1)
資源比例:
豬人房=0.015,
螢火蟲 = 1,
松樹 = 1.5,
草= .1,
小樹苗=0.8,
樹枝樹 = 0.8,
地上的樹枝 = 0.06,
漿果叢=.1,
多汁漿果叢 = 0.05,
蜂巢=0.05,
紅蘑姑 = 0.01,
綠蘑菇 = .02,
特別資源:
出生點 固定1個(這個出生點會在荒野模式中用到)
1.5%概率出現大蘑菇圈,蘑菇顏色隨機,數量為15

Plain 2-4個 :
地皮-草原
資源適中(0.2)
資源比例:
石樹= 0.15,
卵石 = 0.05,
草 = 0.5,
兔子洞= 0.25,
綠蘑菇 = 0.005,

BarePlain 1個:
資源匱乏(0.1)
資源比例:
草= 0.8,
兔子洞=0.4,

以上這個task就是十分典型的出生點地形,大家如果平時有注意留心的話,就會發現,連線生存模式,出生點一定是在森林地皮上,夾雜著草原,一般都只有兔子沒有牛。

2、Dig that rock 背景地皮-岩石
Graveyard(墳墓群) 1個:
地皮-森林
固定資源:
松樹3棵,
金子1-5個
墓碑5-8個
墳墓5-8個
Rocky 2-4個:
地皮-荒漠
資源匱乏(0.1)
資源比率
卵石= 2,
石樹 = 6,
金礦 = 2,
冰山 = 1,
高鳥巢=0.1,
蜘蛛巢=0.01,
藍蘑菇 = 0.002,
草蜥 = 0.3,
特別資源:
meteorspawner(隕石雨發動器)

此task還有Forest 1-3個,Clearing1-3個,這兩個room在上一節裡已經介紹過了,就不多說了。
這就是典型的混合地形了,隕石雨只會出現在這個區域。所以想要挖墳的,當你遇到了隕石雨的時候,就可以在附近搜索墳墓群了。另外,此地形會有霧出現。
這裡特別說一下隕石雨。
隕石雨是由一個叫meteorspawner的prefab觸發的,它本身不可見的,但確實存在,存在於名為”Rocky”的room中,也就是礦石地形,但是和其它礦石地形不同的是,它的地皮是荒漠,即被草叉挖開之後的地皮。所以當你看到地皮是荒漠,而且有較多岩石分佈的地區時,就要注意不要在這附近建家了,不然就要遭受隕石雨的襲擊。

3、Great Plains 背景地皮-草原
BeefalowPlain2-4個:
地皮-草原
資源匱乏(0.05)
資源比例:
草= .01,
牛 = 0.02,
另有Plain 2-4個,Clearing2個,介紹看1、Make a pick
就是一個普通的草原,有一些牛,數量不多,少的可能只有1-2頭。區域不算大,有時候在森林裡突然看到了一片草原,多半是這個task。

4、Squeltch 背景地皮-沼澤
Marsh 6-8 個:
地皮-沼澤
資源匱乏(0.1)
資源比例:
松樹 = 1.0,
觸手= 3,
蚊子池塘 = 1,
蘆葦 = 4,
蜘蛛巢 = 0.01,
藍蘑菇 = 0.01,
綠蘑菇 = 2.02,
特別資源:
1.5%概率出現中蘑菇圈,顏色隨機,數量10個。

SlightlyMermySwamp 1個:
地皮-沼澤
資源匱乏(0.1)
資源比例:
魚人廢墟= 0.1,
豬人頭 = 0.01,
觸手 = 1,
枯樹 = 2,
荊棘= 1.5,

這個task是典型的沼澤地形,觸手很多,摻雜著零星的蜘蛛巢穴,魚人廢墟少量甚至沒有。

5、Beeeees! 背景地皮-草地
BeeClearing 1個:
地皮-草地
固定資源
螢火蟲1個
花6朵
蜂巢1個

FlowerPatch 1個:
地皮-草地
資源匱乏
資源比例:
螢火蟲 = 1,
花=2,
蜂巢=1,
另有Forest 1個,介紹見1、Make a pick
這是很常見的空曠草地地形。

6、Speak to the king 背景地皮-樺樹林
(看名字很容易就明白,這個就是豬王所在的task)
PigKingdom1個:
地皮-草地
固定資源:
豬人房5-9個
豬王1個
50%概率會有作物可收,數量15,種類隨機為以下之一:胡蘿蔔,草,花,細漿果叢(也就是第二類漿果叢)
3%概率出現樹農場,出現時隨機出現1-2個,樹農場固定為16棵松樹。

MagicalDeciduous 1個:
地皮-落葉林
資源豐富(0.3)
資源比例:
草 = 0.03,
小樹苗=1,
漿果=3,
多汁漿果 = 1.5,
紅蘑菇 = 2,
藍蘑菇 = 2,
綠蘑菇 = 2,
螢火蟲 = 4,
花=5,
鼴鼠洞 = 2,
貓洞 = 0.25

DeepDeciduous 4-6個:
地皮-落葉林
資源非常豐富(0.4)
資源比例:
草 = .03,
小樹苗=1,
漿果=.1,
多汁漿果 = 0.05,
樺樹 = 10,
貓洞 = 0.05,
紅蘑姑 = 0.15,
藍蘑菇 = 0.15,
綠蘑菇 = 0.15,
螢火蟲 = 3,

豬王村所在之地,風水寶地,資源很豐富,如果不考慮位置,是非常適合建家的地點。

7、Forest hunters 背景地皮-森林
WalrusHut_Grassy 1個:
地皮-草地
資源適中(0.275)
資源比例:
花=0.112,
草=0.2,
胡蘿蔔=0.05,
燧石=0.05,
樹苗=0.2,
松樹=0.3,
池塘=0.005,
固定資源:
海象營地 1個

ForestMole 2個:
地皮-森林
資源豐富(0.3)
資源比例:
螢火蟲 = 0.2,
石樹 = 0.015,
卵石 = 0.05,
草 = 0.05,
小樹苗=0.8,
樹枝樹 = 0.8,
地上的樹枝 = 0.06,
鼴鼠洞=0.3,
漿果=0.03,
多汁漿果 = 0.015,
紅蘑菇 = 0.03,
綠蘑菇 = 0.02,
松樹或粗壯松樹 =6

DeepForest 1個:
地皮-森林
資源極度豐富(0.8)
資源比例:
螢火蟲 = 0.1,
草 = .05,
小樹苗 =.5,
樹枝樹 = 0.5,
地上的樹枝 = 0.3,
漿果=.02,
多汁漿果 = 0.01,
藍蘑菇 = 0.02,
松樹或粗壯松樹 =6
特殊資源:
45%幾率出現“完全正常的樹”

另有Forest和Clearing各1個,特性不再贅述。
這一個task,固定有一個海象營地,是遊戲裡必定存在的。所以如果你在森林地皮上發現了完全正常的樹或者鼴鼠,那麼在附近很有可能會有海象營地。

8、Badlands 背景地皮-荒漠
Lightning 1個:
地皮-荒漠
資源匱乏(0.05)
資源比例:
荊棘 = 0.8,
草 = 0.5,
草蜥 = 0.4,
電羊 = 1,
仙人掌 = 0.8,
風滾草生成器 = 0.1,

Badlands 3個:
地皮-荒漠
資源匱乏(0.07)
資源比例:
荒漠岩 = .8,
荊棘 = 0.25,
枯樹 = 0.75,
草 = 0.5,
草蜥 = 0.6,
仙人掌 = 0.7,
狗骨 = 0.6,
風滾草生成器 = 0.1,

HoundyBadlands 2個:
地皮-荒漠
資源適中(0.2)
資源比例:
卵石 = 0.5,
金礦 = 1,
狗骨 = 0.5,
狗窩 = 0.33,

BuzzardyBadlands 2個:
地皮-荒漠
資源匱乏(0.1)
資源比例:
荊棘 = 0.66,
枯樹 = 1,
草 = 0.33,
草蜥 = 0.4,
禿鷹生成器 = 0.25,
狗骨 = 0.15,
風滾草生成器 = 0.1,
還有1個BarePlain,見前面Make a pick。

荒漠地區,特點就是資源很少,其他沒什麼可說的了。

9、For a nice walk 背景地皮-森林
MandrakeHome 2-4個:
地皮-草地
資源適中(0.2)
資源比例:
花 = 4,
螢火蟲 = 0.3,
松樹 = 6,
草 = 0.05,
小樹苗=0.5,
漿果=0.05,
多汁漿果 = 0.025,
固定資源:
1個曼德拉草
5%幾率遇見奇遇——InsanePighouse,如下圖所示

該task還有room:BeefalowPlain 1個,DeepForest 2-4個,Forest 1-3個,這些room在前面都介紹過了,不再贅述。

這個task還是非常不錯的,提供2-4棵曼德拉草,還有不小的概率弄到活木。DeepForest這個room的資源又非常豐富,實際上這個room是非常適合建家的。

今天就先介紹9個必定出現的task,明天繼續介紹隨機出現的另外9個task,以及task之間的連結關係。

在上面的9個必然會出現的task之外,預設的連線地上世界,還會隨機出現6個task,這6個task是隨機從以下task中抽取的:
“Befriend the pigs”,
“Kill the spiders”,
“Killer bees!”,
“Make a Beehat”,
“The hunters”,
“Magic meadow”,
“Frogs and bugs”,
“Oasis”,
“Mole Colony Deciduous”,
“Mole Colony Rocks”,
“MooseBreedingTask”,

下面就一一來講解這些task

10、Befriend the pigs 背景地皮-森林
(看名字也知道和豬村有關)
PigVillage 1個:
地皮-草地
資源匱乏(0.1)
資源比例:
草=0.05
漿果叢=0.05
多汁漿果從=0.025

固定資源:
豬人房4-7個
魚人頭1-3個
靜態佈局:
Farmplot 2-5個 產出可能為胡蘿蔔,花,草,細漿果叢
形式如下

3%幾率出現VillageSquare 形式如下:

另有room如下:
Forest 2-4個
Marsh 1-3個
DeepForest 1-3個
Clearing 1個

這個就是平常偶爾會遇到的沒豬王的豬村了,要是運氣好就會遇到上面那個方形豬村。總的來說資源還是蠻豐富的,也是建家的好地點。

11、Kill the spiders 背景地皮-礦區
SpiderVillage 2個:
地皮-礦區
資源匱乏(0.1)
資源比例:
石樹= 3,
卵石 = 1,
金礦 = 1,
地上的石頭= 1,
固定資源:
金子 4-6個
蜘蛛巢6-8個
在地圖生成時,每個蜘蛛巢80%幾率為1級,20幾率為2級

CrappyForest 1-3個:
地皮-森林
資源豐富(0.3)
資源比例:
螢火蟲= 0.2,
粗壯松樹 = 6,
石樹 = 0.015,
卵石 = 0.05,
草 = 0.05,
小樹苗=0.8,
樹枝樹 = 0.8,
地上的樹枝 = 0.06,
鼴鼠洞=0.05,
漿果叢=0.03,
多汁漿果叢 = 0.015,
紅蘑菇 = 0.03,
綠蘑菇 = 0.02,
固定資源:
玩家出生點 1個

CrappyDeepForest 1-3個
地皮-森林
資源極度豐富(0.8)
資源比例:
螢火蟲 = 0.1,
粗壯松樹 = 6,
蜘蛛巢 = 0.01,
草 = 0.05,
小樹苗=0.5,
樹枝樹 = 0.16,
地上的樹枝 = 0.06,
漿果叢=0.02,
多汁漿果叢= 0.01,
藍蘑菇 = 0.02,

其餘的room:Clearing 1個

這就是所謂的蜘蛛礦區了。典型特徵就是礦區的地上會有金子。

12、Killer bees! 背景地皮-草地
(殺人蜂區域)
Waspnests 1-3個:
地皮-草地
資源非常豐富(0.5)
資源比例:
花=6,
蜂巢=1,
草=2,
殺人蜂巢=1,
特別地,這個room有兩個標籤ForceConnected和RoadPoison
當這兩個標籤同時出現的時候,這塊room就會呈現出和一般的room不同的特點:整體區域面積縮小,而且很大幾率會成為連結兩塊task的room。在單機冒險模式中會經常看到這樣的room,是作為一道關卡出現的。連線的地圖裡當然也可以做同樣的。這些關卡room都統一放在blockers.lua檔下,有興趣可以查閱。

其它的room:Forest 1-3個,FlowerPatch 1-3個,介紹見前文

這就是所謂的殺人蜂區域了,通常都會以關卡的形式出現,堵著你不讓你走過去。

13、The hunters 背景地皮-草原
(喜聞樂見的海象平原來了!)
WalrusHut_Plains 1個:
地皮-草原
資源匱乏(0.1)
資源比例:
草=0.09,
花=0.003,
固定資源:
海象營地 1個

WalrusHut_Grassy 1個:
地皮-草地
資源適中(0.275)
資源比例:
花=0.112,
草=0.2,
胡蘿蔔=0.05,
燧石=0.05,
小樹苗=0.2,
松樹=0.3,
池塘=0.005,
固定資源:
海象營地 1個

WalrusHut_Rocky 1個:
地皮-礦區
資源匱乏(0.1)
資源比例:
燧石=0.5,
石樹 = 3,
卵石=1,
金礦=1,
高鳥巢=0.3,
固定資源:
海象營地1個

其餘的room:Clearing 2個 BGGrass 2個 BGRocky2個

這個地形就是喜聞樂見的海象平原了,我們探索地圖,很多時候也是希望能找到海象巢穴。
這個區域的特徵是,基礎地皮為草原,然後如果混合著一些礦區地皮和草地地皮,就幾乎可以確定是這個海象平原地形了。

14、Magic meadow 背景地皮-森林
Pondopolis 2個:
地皮-草地
資源匱乏(0.1)
資源比例:
草 = 8,
花 = 6,
小樹苗 = 1,
固定資源:
池塘6-8個

其餘room: Clearing 2個
這一塊task是典型的池塘區域。據說賈斯特眼骨經常出現在這一塊地形上,不過我沒有找到代碼來佐證這個傳聞。唯一可以確定的是Pondopolis這個room是不帶賈斯特眼骨的標籤的,只有Clearing帶標籤,而賈斯特眼骨只會生成在帶賈斯特眼骨標籤的room上。也就是說如果想要在這塊區域附近找的話,應該在池塘附近的空曠森林上找。


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。