
簡介
作為新手玩家在游戲進(jìn)程中遇到的第一個”BOSS“,很多人會對如何拓展自己的疆域感到無從下手,那么本文就簡單介紹一下在殖民地擴(kuò)張的過程中你可能會遇到的一些問題和該怎么改寫自己的代碼吧。
多房間
首先來簡單了解一下怎么殖民到新的房間,在游戲中有個等級叫做GCL (全局控制等級)。如果你不太了解的話可以參考 Screeps 概念介紹(下) 中的 等級 小節(jié)。每升一級GCL,都會給你解鎖一個新的房間控制額度。新玩家的GCL為1級。一般會在你第一個房間的RCL (房間控制等級) 達(dá)到5級半時升至2級GCL,從而解鎖第二個房間的控制額度。
建議在閱讀完本文后再開始動手,以防出現(xiàn)準(zhǔn)備不充分的情況發(fā)生。
第一步:占領(lǐng)新房間!
當(dāng)你達(dá)到 GCL2 之后,你就可以著手開始發(fā)展你的第二塊殖民地了。想占領(lǐng)新的房間,就要占領(lǐng)他的控制器。而占領(lǐng)控制器我們需要調(diào)用creep的 claimController 方法,并傳入想要占領(lǐng)房間的控制器即可占領(lǐng)該房間,如下:
// 要占領(lǐng)房間的 creep
const creep = Game.creeps['claimer']
// 要占領(lǐng)的房間
// 注意這一句有可能會獲取不到 room 對象,下面會解釋
const room = Game.rooms['要占領(lǐng)的房間名']
// 移動到房間的控制器并占領(lǐng)
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(room.controller)
}
注意,執(zhí)行claimController方法要求 creep 擁有CLAIM身體部分。你可以生成一個最小的身體結(jié)構(gòu)[ CLAIM, MOVE ]來完成新房間的占領(lǐng)工作。
但是!當(dāng)你執(zhí)行上面代碼的時候,你可能會發(fā)現(xiàn)下面這行代碼有問題:
const room = Game.rooms['要占領(lǐng)的房間名, 如W1N1'] // room 的值為 undefined
這句話獲取不到room對象,哪里出問題了!不用擔(dān)心,你的寫法沒錯。在作怪的是一個叫做 視野 的游戲機(jī)制。
你可能會疑惑,我點(diǎn)進(jìn)房間里什么都可以看得到啊。沒錯,你是能看到,但是代碼看不到。你可以在 官方 api 文檔 中找到這句話:

注意后面這句,當(dāng)房間中有自己的 creep 或者建筑時,該房間可見。所以說,如果我們沒有任何單位在房間中時,我們將無法獲取那個房間的對象?,F(xiàn)在讓我們來改寫一下上面的代碼:
// 要占領(lǐng)房間的 creep
const creep = Game.creeps['claimer']
// 要占領(lǐng)的房間
const room = Game.rooms['要占領(lǐng)的房間名']
// 如果該房間不存在就先往房間走
if (!room) {
creep.moveTo(new RoomPosition(25, 25, '要占領(lǐng)的房間'))
}
else {
// 如果房間存在了就說明已經(jīng)進(jìn)入了該房間
// 移動到房間的控制器并占領(lǐng)
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(room.controller)
}
}
這樣就可以保證 creep 正確的跑到目標(biāo)房間然后占領(lǐng)控制器,關(guān)于其中RoomPosition的文檔看 這里,這里不再贅述。
當(dāng) creep 跑到控制器面前然后頂了一下控制器后,你就會發(fā)現(xiàn)控制器瞬間升到了1級。沒錯,你已經(jīng)占領(lǐng)了這個房間。如果你并沒有看到這一幕,請打印 claimController() 的返回值并查閱文檔。
第二步:建造 Spawn !
當(dāng)你占領(lǐng)了房間之后就會發(fā)現(xiàn),什么都沒有發(fā)生。是的,占領(lǐng)新房間并不會送你什么建筑,你需要手動建造。首先要建造的就是Spawn建筑。在Construct建筑列表中,你可以在下方找到解鎖的 Spawn(如果你沒有找到的話請檢查房間中是否有別人遺留下來的 Spawn,可以直接摧毀,其他建筑同理)。
現(xiàn)在,我們需要生產(chǎn)建筑工來將我們的 spawn 造好,使用如下代碼將建筑工引導(dǎo)至新房間:
// 因為我們的 claimer 已經(jīng)在房間里了
// 所以我們可以正常的獲取該房間的對象。
const target = Game.getObjectById('spawn工地的id')
const creep = Game.creeps['builder']
// 獲取能量的邏輯
// ...
// 建造 spawn
if(target) {
if(creep.build(target) == ERR_NOT_IN_RANGE) {
creep.moveTo(target)
}
}
注意,creep 距離目標(biāo)越遠(yuǎn),moveTo() 所消耗的 cpu 就會越高,你可以使用如下形式的moveTo來提高緩存的距離以節(jié)省 cpu:
// reusePath 代表緩存的距離,默認(rèn)為 5
creep.moveTo(target, { reusePath: 50 })
上面的代碼僅為參考,你應(yīng)該結(jié)合你的 creep 數(shù)量控制模塊 以及 角色模塊 來創(chuàng)建一個通用性更高的“新房間占領(lǐng)邏輯”。
建造一個 spawn 要花費(fèi) 1.5k 的能量,所以你應(yīng)該在你源房間的能力范圍內(nèi)生成最多身體部件的builder來加快 spawn 的建造。當(dāng)你的新 spawn 建造完成后,一個嶄新的殖民地就準(zhǔn)備就緒了。你可以像之前一樣挖礦并升級你的房間控制器了。
小提示:1 級的房間控制器將在
20,000 ticks后降級至 0 級。屆時你將失去這個房間并需要重新占領(lǐng)。所以請在其降至 0 級前建立起可靠的控制器升級邏輯。
ok,到目前為止我們已經(jīng)講完了如何控制一個新的房間,接下來我們就來講一下給殖民地發(fā)展增速的有效手段:外礦。
外礦
在不屬于自己的房間內(nèi)采集并收集能量的行為 被稱為開外礦。例如下圖,可以看到其只有中間一個房間有完整的基地,而周圍有很多房間的礦(外礦 )通過道路和基地連接在一起:

我們點(diǎn)開基地下方的房間就可以更清楚的了解到這個概念:

可以看到房間內(nèi)只有兩個 creep。一個在采集能量,另一個對著房間控制器不知道在做著什么,在做什么我們稍后再來討論。
很多新手玩家再沒接觸過這個玩法之前很難想象到可以這么做。實際上,官方并沒有禁止甚至推薦這么做。你可以發(fā)現(xiàn),road和container這兩種建筑實際上是可以在不屬于自己的房間內(nèi)建造的。所以你可以借此讓你的外礦運(yùn)作效率更高。
外礦的好處與壞處?
開外礦可以使得你基地的能量獲取更加充沛從而提高殖民地運(yùn)轉(zhuǎn)效率,或許你已經(jīng)注意到了,采礦需要時間一點(diǎn)一點(diǎn)的開采,而從存儲中獲取能量在一個 tick 中就可以完成。所以在建立了 開采 > 存儲 > 使用 體系后,你會發(fā)現(xiàn),開采的很容易跟不上消耗的速度,而開外礦則可以很好的緩解甚至解決這個問題。
那么古爾丹,代價是什么呢?
代價就是,你的 cpu 消耗可能會因此增加很多。creep 尋路會消耗 cpu。路程越長 cpu 消耗量越大。當(dāng)你的外礦距離比較遠(yuǎn)時,使用一般的moveTo進(jìn)行尋路可能會導(dǎo)致你的 cpu 飆升。這時候你就需要一些額外手段了,例如使用PathFinder、room.findPath手動尋路并緩存路徑等。所以開外礦實際是在 cpu 使用量和能量開采速率之間做權(quán)衡。
提高外礦的效率
當(dāng)你隨便點(diǎn)開一個無主房間的能量礦后,你會發(fā)現(xiàn)這個礦的容量上限居然只有可憐的1500。什么情況?

我們可以在 官方 api 文檔 中找到為什么,注意紅框中最后一行,未預(yù)定的房間中容量上限為 1500。:

1500 也太少了點(diǎn),那么能不能...能!我們只需要把這個房間 預(yù)定 了即可。什么是預(yù)定呢?實際上,creep 擁有三種針對控制器的行為,預(yù)定就是其中的一種,下面我們來簡單介紹一下:
-
占領(lǐng)
claimController:將該房間占領(lǐng),房間的所有者owner會變成自己,同時可以對房間控制器升級,從而解鎖更高級和更多的建筑,要求自己有空余的房間控制額度。占領(lǐng)房間的 creep 必須擁有CLAIM身體。 -
預(yù)定
reserveController:強(qiáng)度稍弱一點(diǎn)的宣稱,房間的所有者依舊為空,但是房間中能量礦的上限恢復(fù)至正常的3000。預(yù)定時間會不斷衰減,衰減至 0 時能量礦上限重新變成1500。預(yù)定房間的 creep 必須擁有CLAIM身體。 -
簽名
signController:最弱(沒用)的宣稱,你可以使用任意身體部件的 creep 給任意房間 (包括敵對房間 ) 控制器簽名。簽名可以在世界地圖中看到并且不會自動衰減消失。但是不會對房間造成任何影響。

這里主要介紹一下預(yù)定reserveController,預(yù)定并不像占領(lǐng)一樣,一下就可以完成,而是需要有 creep 進(jìn)行持續(xù)的預(yù)定,其原因在于:每一個CLAIM身體每次只能增加1tick 的預(yù)定時間。也就是說,如果你有一個[ CLAIM, MOVE ]的 creep 每 tick 對房間控制器執(zhí)行一次reserveController的話,當(dāng) creep 死掉的時候,你對房間的預(yù)定會立馬結(jié)束。所以為了獲得更加充裕的預(yù)定時間,請確保你的 creep 擁有最少兩個CLAIM身體部件。
預(yù)定時間最長為5000ticks,可以通過controller面板中的Reserved屬性看到,見上圖。
有一點(diǎn)需要注意的是,即使不對房間進(jìn)行預(yù)定,也不影響你正常開外礦,只是外礦效率只有預(yù)定后的一半,所以推薦先完成外礦的邏輯代碼,再來考慮預(yù)定者的邏輯。
開外礦會遇到的問題
入侵者
只要房間內(nèi)的能量礦被開采,那么這個房間就有會產(chǎn)生 npc 入侵者,所以在外礦中面臨的最大問題可能就是來自入侵者的威脅了。由于無法建造 tower 進(jìn)行防御,所以你需要給外礦房間內(nèi)派遣一些守衛(wèi)(常駐或檢測到入侵者后再生成)。或者你可以采取更猥瑣一點(diǎn)的方法,例如有入侵者的話就直接撤退至安全房間直到入侵者老死。
在更新了 4.0 版本以后游戲新增了 NPC 要塞的機(jī)制,這個機(jī)制對于外礦的開發(fā)來說有不小的影響。NPC 會不斷的在沒有claim的房間內(nèi)生成一個小型的核心來預(yù)定房間。所以你可能要在外礦維護(hù)的模塊中添加一些額外邏輯來清除這些惹人厭的 NPC 核心(當(dāng)然如果你懶的打的話,core 一般也會在幾萬 tick 內(nèi)消失 )。
需要注意的是,Creep.dismantle() 是對小型核心沒有效果的,不要想著讓外礦采集單位順手拆掉。

你可以從 NPC 入侵者 - 要塞 和 原型介紹 - InvaderCore 了解到更多信息。
基建維護(hù)
因為 road 和 container 可以在RCL 0的房間內(nèi)建造,所以很多人都會在外礦中建造這兩者來提高效率,但是這兩者都會磨損,所以對房間內(nèi)基礎(chǔ)設(shè)施的維護(hù)就成為了一個重要的問題。你可以讓你的開采者或運(yùn)輸者在運(yùn)能量回來時順路檢查其生命值并維修,或者其他你能想到的更好辦法。
視野問題
由于外礦房間內(nèi)屬于自己的單位并不多,所以有的時候可能會出現(xiàn)該房間沒有視野的問題,所以請確保你的外礦房間有可靠的視野,或者你的代碼足夠健壯,當(dāng)房間沒有視野時也不影響正常的工作。
總結(jié)
本文簡單介紹了如何拓展自己的殖民地,你可以控制的房間數(shù)量和你的GCL等級是相等的,在擁有空余的房間控制額度時,你可以通過 creep 的claimController來占領(lǐng)一個新的房間,但是要記得在占領(lǐng)新房間后及時建造spawn。
除了占領(lǐng)新房間,你還可以通過開外礦的形式來利用其他房間的能量礦。使用reserveController可以預(yù)定房間,從而使該房間的能量礦上限恢復(fù)至3000。另外還要注意 npc 入侵者、基建維護(hù)、視野以及尋路成本帶來的影響。
如果你想要了解更多關(guān)于 screeps 的內(nèi)容,歡迎訪問我的文集《Screeps》~