簡(jiǎn)介
作為新手玩家在游戲進(jìn)程中遇到的第一個(gè)”BOSS“,很多人會(huì)對(duì)如何拓展自己的疆域感到無(wú)從下手兼贸,那么本文就簡(jiǎn)單介紹一下在殖民地?cái)U(kuò)張的過(guò)程中你可能會(huì)遇到的一些問(wèn)題和該怎么改寫(xiě)自己的代碼吧。
多房間
首先來(lái)簡(jiǎn)單了解一下怎么殖民到新的房間山宾,在游戲中有個(gè)等級(jí)叫做GCL
(全局控制等級(jí))烹困。如果你不太了解的話(huà)可以參考 Screeps 概念介紹(下) 中的 等級(jí) 小節(jié)罕伯。每升一級(jí)GCL
凰荚,都會(huì)給你解鎖一個(gè)新的房間控制額度燃观。新玩家的GCL
為1
級(jí)。一般會(huì)在你第一個(gè)房間的RCL
(房間控制等級(jí)) 達(dá)到5
級(jí)半時(shí)升至2
級(jí)GCL
便瑟,從而解鎖第二個(gè)房間的控制額度缆毁。
建議在閱讀完本文后再開(kāi)始動(dòng)手,以防出現(xiàn)準(zhǔn)備不充分的情況發(fā)生到涂。
第一步:占領(lǐng)新房間脊框!
當(dāng)你達(dá)到 GCL2 之后,你就可以著手開(kāi)始發(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)的房間
// 注意這一句有可能會(huì)獲取不到 room 對(duì)象嚷节,下面會(huì)解釋
const room = Game.rooms['要占領(lǐng)的房間名']
// 移動(dòng)到房間的控制器并占領(lǐng)
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(room.controller)
}
注意聂儒,執(zhí)行claimController
方法要求 creep 擁有CLAIM
身體部分。你可以生成一個(gè)最小的身體結(jié)構(gòu)[ CLAIM, MOVE ]
來(lái)完成新房間的占領(lǐng)工作硫痰。
但是衩婚!當(dāng)你執(zhí)行上面代碼的時(shí)候,你可能會(huì)發(fā)現(xiàn)下面這行代碼有問(wèn)題:
const room = Game.rooms['要占領(lǐng)的房間名, 如W1N1'] // room 的值為 undefined
這句話(huà)獲取不到room
對(duì)象效斑,哪里出問(wèn)題了非春!不用擔(dān)心,你的寫(xiě)法沒(méi)錯(cuò)缓屠。在作怪的是一個(gè)叫做 視野 的游戲機(jī)制奇昙。
你可能會(huì)疑惑,我點(diǎn)進(jìn)房間里什么都可以看得到啊敌完。沒(méi)錯(cuò)储耐,你是能看到,但是代碼看不到滨溉。你可以在 官方 api 文檔 中找到這句話(huà):
注意后面這句什湘,當(dāng)房間中有自己的 creep 或者建筑時(shí),該房間可見(jiàn)晦攒。所以說(shuō)闽撤,如果我們沒(méi)有任何單位在房間中時(shí),我們將無(wú)法獲取那個(gè)房間的對(duì)象「眨現(xiàn)在讓我們來(lái)改寫(xiě)一下上面的代碼:
// 要占領(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 {
// 如果房間存在了就說(shuō)明已經(jīng)進(jìn)入了該房間
// 移動(dòng)到房間的控制器并占領(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 跑到控制器面前然后頂了一下控制器后热幔,你就會(huì)發(fā)現(xiàn)控制器瞬間升到了1
級(jí)乐设。沒(méi)錯(cuò),你已經(jīng)占領(lǐng)了這個(gè)房間绎巨。如果你并沒(méi)有看到這一幕近尚,請(qǐng)打印 claimController()
的返回值并查閱文檔。
第二步:建造 Spawn !
當(dāng)你占領(lǐng)了房間之后就會(huì)發(fā)現(xiàn)场勤,什么都沒(méi)有發(fā)生戈锻。是的,占領(lǐng)新房間并不會(huì)送你什么建筑和媳,你需要手動(dòng)建造格遭。首先要建造的就是Spawn
建筑。在Construct
建筑列表中留瞳,你可以在下方找到解鎖的 Spawn
(如果你沒(méi)有找到的話(huà)請(qǐng)檢查房間中是否有別人遺留下來(lái)的 Spawn拒迅,可以直接摧毀,其他建筑同理)她倘。
現(xiàn)在璧微,我們需要生產(chǎn)建筑工來(lái)將我們的 spawn 造好,使用如下代碼將建筑工引導(dǎo)至新房間:
// 因?yàn)槲覀兊?claimer 已經(jīng)在房間里了
// 所以我們可以正常的獲取該房間的對(duì)象硬梁。
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 就會(huì)越高荧止,你可以使用如下形式的moveTo
來(lái)提高緩存的距離以節(jié)省 cpu:
// reusePath 代表緩存的距離屹电,默認(rèn)為 5
creep.moveTo(target, { reusePath: 50 })
上面的代碼僅為參考,你應(yīng)該結(jié)合你的 creep 數(shù)量控制模塊 以及 角色模塊 來(lái)創(chuàng)建一個(gè)通用性更高的“新房間占領(lǐng)邏輯”跃巡。
建造一個(gè) spawn 要花費(fèi) 1.5k
的能量危号,所以你應(yīng)該在你源房間的能力范圍內(nèi)生成最多身體部件的builder
來(lái)加快 spawn 的建造。當(dāng)你的新 spawn 建造完成后瓷炮,一個(gè)嶄新的殖民地就準(zhǔn)備就緒了葱色。你可以像之前一樣挖礦并升級(jí)你的房間控制器了。
小提示:1 級(jí)的房間控制器將在
20,000 ticks
后降級(jí)至 0 級(jí)娘香。屆時(shí)你將失去這個(gè)房間并需要重新占領(lǐng)苍狰。所以請(qǐng)?jiān)谄浣抵?0 級(jí)前建立起可靠的控制器升級(jí)邏輯。
ok烘绽,到目前為止我們已經(jīng)講完了如何控制一個(gè)新的房間淋昭,接下來(lái)我們就來(lái)講一下給殖民地發(fā)展增速的有效手段:外礦。
外礦
在不屬于自己的房間內(nèi)采集并收集能量的行為 被稱(chēng)為開(kāi)外礦安接。例如下圖翔忽,可以看到其只有中間一個(gè)房間有完整的基地,而周?chē)泻芏喾块g的礦(外礦 )通過(guò)道路和基地連接在一起:
我們點(diǎn)開(kāi)基地下方的房間就可以更清楚的了解到這個(gè)概念:
可以看到房間內(nèi)只有兩個(gè) creep。一個(gè)在采集能量歇式,另一個(gè)對(duì)著房間控制器不知道在做著什么驶悟,在做什么我們稍后再來(lái)討論。
很多新手玩家再?zèng)]接觸過(guò)這個(gè)玩法之前很難想象到可以這么做材失。實(shí)際上痕鳍,官方并沒(méi)有禁止甚至推薦這么做。你可以發(fā)現(xiàn)龙巨,road
和container
這兩種建筑實(shí)際上是可以在不屬于自己的房間內(nèi)建造的笼呆。所以你可以借此讓你的外礦運(yùn)作效率更高。
外礦的好處與壞處旨别?
開(kāi)外礦可以使得你基地的能量獲取更加充沛從而提高殖民地運(yùn)轉(zhuǎn)效率诗赌,或許你已經(jīng)注意到了,采礦需要時(shí)間一點(diǎn)一點(diǎn)的開(kāi)采秸弛,而從存儲(chǔ)中獲取能量在一個(gè) tick 中就可以完成铭若。所以在建立了 開(kāi)采 > 存儲(chǔ) > 使用 體系后,你會(huì)發(fā)現(xiàn)递览,開(kāi)采的很容易跟不上消耗的速度奥喻,而開(kāi)外礦則可以很好的緩解甚至解決這個(gè)問(wèn)題。
那么古爾丹非迹,代價(jià)是什么呢?
代價(jià)就是纯趋,你的 cpu 消耗可能會(huì)因此增加很多憎兽。creep 尋路會(huì)消耗 cpu。路程越長(zhǎng) cpu 消耗量越大吵冒。當(dāng)你的外礦距離比較遠(yuǎn)時(shí)纯命,使用一般的moveTo
進(jìn)行尋路可能會(huì)導(dǎo)致你的 cpu 飆升。這時(shí)候你就需要一些額外手段了痹栖,例如使用PathFinder
亿汞、room.findPath
手動(dòng)尋路并緩存路徑等。所以開(kāi)外礦實(shí)際是在 cpu 使用量和能量開(kāi)采速率之間做權(quán)衡揪阿。
提高外礦的效率
當(dāng)你隨便點(diǎn)開(kāi)一個(gè)無(wú)主房間的能量礦后疗我,你會(huì)發(fā)現(xiàn)這個(gè)礦的容量上限居然只有可憐的1500
。什么情況南捂?
我們可以在 官方 api 文檔 中找到為什么吴裤,注意紅框中最后一行,未預(yù)定的房間中容量上限為 1500溺健。:
1500 也太少了點(diǎn)麦牺,那么能不能...能!我們只需要把這個(gè)房間 預(yù)定 了即可。什么是預(yù)定呢剖膳?實(shí)際上魏颓,creep 擁有三種針對(duì)控制器的行為,預(yù)定就是其中的一種吱晒,下面我們來(lái)簡(jiǎn)單介紹一下:
-
占領(lǐng)
claimController
:將該房間占領(lǐng)甸饱,房間的所有者owner
會(huì)變成自己,同時(shí)可以對(duì)房間控制器升級(jí)枕荞,從而解鎖更高級(jí)和更多的建筑柜候,要求自己有空余的房間控制額度。占領(lǐng)房間的 creep 必須擁有CLAIM
身體躏精。 -
預(yù)定
reserveController
:強(qiáng)度稍弱一點(diǎn)的宣稱(chēng)渣刷,房間的所有者依舊為空,但是房間中能量礦的上限恢復(fù)至正常的3000
矗烛。預(yù)定時(shí)間會(huì)不斷衰減辅柴,衰減至 0 時(shí)能量礦上限重新變成1500
。預(yù)定房間的 creep 必須擁有CLAIM
身體瞭吃。 -
簽名
signController
:最弱(沒(méi)用)的宣稱(chēng)碌嘀,你可以使用任意身體部件的 creep 給任意房間 (包括敵對(duì)房間 ) 控制器簽名。簽名可以在世界地圖中看到并且不會(huì)自動(dòng)衰減消失歪架。但是不會(huì)對(duì)房間造成任何影響股冗。
這里主要介紹一下預(yù)定reserveController
,預(yù)定并不像占領(lǐng)一樣和蚪,一下就可以完成止状,而是需要有 creep 進(jìn)行持續(xù)的預(yù)定,其原因在于:每一個(gè)CLAIM
身體每次只能增加1
tick 的預(yù)定時(shí)間攒霹。也就是說(shuō)怯疤,如果你有一個(gè)[ CLAIM, MOVE ]
的 creep 每 tick 對(duì)房間控制器執(zhí)行一次reserveController
的話(huà),當(dāng) creep 死掉的時(shí)候催束,你對(duì)房間的預(yù)定會(huì)立馬結(jié)束集峦。所以為了獲得更加充裕的預(yù)定時(shí)間,請(qǐng)確保你的 creep 擁有最少兩個(gè)CLAIM
身體部件抠刺。
預(yù)定時(shí)間最長(zhǎng)為5000
ticks塔淤,可以通過(guò)controller
面板中的Reserved
屬性看到,見(jiàn)上圖速妖。
有一點(diǎn)需要注意的是凯沪,即使不對(duì)房間進(jìn)行預(yù)定,也不影響你正常開(kāi)外礦买优,只是外礦效率只有預(yù)定后的一半妨马,所以推薦先完成外礦的邏輯代碼挺举,再來(lái)考慮預(yù)定者的邏輯。
開(kāi)外礦會(huì)遇到的問(wèn)題
入侵者
只要房間內(nèi)的能量礦被開(kāi)采烘跺,那么這個(gè)房間就有會(huì)產(chǎn)生 npc 入侵者湘纵,所以在外礦中面臨的最大問(wèn)題可能就是來(lái)自入侵者的威脅了。由于無(wú)法建造 tower 進(jìn)行防御滤淳,所以你需要給外礦房間內(nèi)派遣一些守衛(wèi)(常駐或檢測(cè)到入侵者后再生成)梧喷。或者你可以采取更猥瑣一點(diǎn)的方法脖咐,例如有入侵者的話(huà)就直接撤退至安全房間直到入侵者老死铺敌。
在更新了 4.0 版本以后游戲新增了 NPC 要塞的機(jī)制,這個(gè)機(jī)制對(duì)于外礦的開(kāi)發(fā)來(lái)說(shuō)有不小的影響屁擅。NPC 會(huì)不斷的在沒(méi)有claim
的房間內(nèi)生成一個(gè)小型的核心來(lái)預(yù)定房間偿凭。所以你可能要在外礦維護(hù)的模塊中添加一些額外邏輯來(lái)清除這些惹人厭的 NPC 核心(當(dāng)然如果你懶的打的話(huà),core 一般也會(huì)在幾萬(wàn) tick 內(nèi)消失 )派歌。
需要注意的是弯囊,Creep.dismantle()
是對(duì)小型核心沒(méi)有效果的,不要想著讓外礦采集單位順手拆掉胶果。
你可以從 NPC 入侵者 - 要塞 和 原型介紹 - InvaderCore 了解到更多信息匾嘱。
基建維護(hù)
因?yàn)?road 和 container 可以在RCL 0
的房間內(nèi)建造,所以很多人都會(huì)在外礦中建造這兩者來(lái)提高效率早抠,但是這兩者都會(huì)磨損霎烙,所以對(duì)房間內(nèi)基礎(chǔ)設(shè)施的維護(hù)就成為了一個(gè)重要的問(wèn)題。你可以讓你的開(kāi)采者或運(yùn)輸者在運(yùn)能量回來(lái)時(shí)順路檢查其生命值并維修蕊连,或者其他你能想到的更好辦法吼过。
視野問(wèn)題
由于外礦房間內(nèi)屬于自己的單位并不多,所以有的時(shí)候可能會(huì)出現(xiàn)該房間沒(méi)有視野的問(wèn)題咪奖,所以請(qǐng)確保你的外礦房間有可靠的視野,或者你的代碼足夠健壯酱床,當(dāng)房間沒(méi)有視野時(shí)也不影響正常的工作羊赵。
總結(jié)
本文簡(jiǎn)單介紹了如何拓展自己的殖民地,你可以控制的房間數(shù)量和你的GCL
等級(jí)是相等的扇谣,在擁有空余的房間控制額度時(shí)昧捷,你可以通過(guò) creep 的claimController
來(lái)占領(lǐng)一個(gè)新的房間,但是要記得在占領(lǐng)新房間后及時(shí)建造spawn
罐寨。
除了占領(lǐng)新房間靡挥,你還可以通過(guò)開(kāi)外礦的形式來(lái)利用其他房間的能量礦。使用reserveController
可以預(yù)定房間鸯绿,從而使該房間的能量礦上限恢復(fù)至3000
跋破。另外還要注意 npc 入侵者簸淀、基建維護(hù)、視野以及尋路成本帶來(lái)的影響毒返。
如果你想要了解更多關(guān)于 screeps 的內(nèi)容租幕,歡迎訪(fǎng)問(wèn)我的文集《Screeps》~