前言
很多小伙伴對(duì)于如何有效的測(cè)試自己的游戲代碼一直很苦惱拇囊,官服 Tick 太長(zhǎng)操漠;社區(qū)服還要重新練級(jí)烹笔,時(shí)間久了又怕被打;寫了 pb depo 采集代碼結(jié)果等不到目標(biāo)澄耍,怎么辦呢噪珊?其實(shí)對(duì)于測(cè)試來(lái)說(shuō),最有效的方法就是使用本地啟動(dòng)的私服齐莲,Screeps 的 Steam 客戶端支持一鍵啟動(dòng)私服痢站,非常方便,當(dāng)然你自己搭建一個(gè)也完全不是問(wèn)題选酗。
私服測(cè)試相對(duì)于其他方法來(lái)說(shuō)最大的好處就是你可以完全自定義任何東西阵难。包括地形、等級(jí)芒填、創(chuàng)建或者銷毀任何物品等呜叫。這給我們的測(cè)試提供了非常大的便利。但是官方對(duì) CLI 的幫助文檔很不詳細(xì)殿衰,為了方便大家操作朱庆,我會(huì)介紹幾個(gè)比較常用的服務(wù)器控制臺(tái)指令。
下面的操作都是基于服務(wù)器使用默認(rèn)的 lokiStorage
作為存儲(chǔ)的闷祥,如果你的服務(wù)器使用了mongoDB
的話娱颊,使用對(duì)應(yīng)的數(shù)據(jù)庫(kù)終端可以更方便的進(jìn)行查看。
啟動(dòng) CLI
如果你是用 steam 客戶端啟用的話凯砍,可以直接點(diǎn)擊下圖左側(cè)的 CLI 來(lái)進(jìn)入控制臺(tái):
而如果你是使用 docker 部署服務(wù)器的話箱硕,使用如下命令就可以進(jìn)入服務(wù)器的 CLI:
# 下面的 screeps-server 請(qǐng)?zhí)鎿Q成對(duì)應(yīng)的 docker 容器名
docker exec -it screeps-server npx screeps cli
小提示:這里也能開(kāi)本地私服 ↓
查看幫助
CLI 中有一個(gè)全局方法help()
可以用來(lái)查看幫助,如果你想查看指定對(duì)象的幫助信息的話悟衩,將其作為參數(shù)傳遞給help()
即可剧罩,如下:
help(storage)
查看玩家信息
玩家信息保存在storage.db
中,使用異步方法findOne
即可查看座泳。注意惠昔,這里findOne
方法接受一個(gè)對(duì)象作為參數(shù)幕与,而你通過(guò)該方法查詢出來(lái)的所有屬性都可以作為查詢條件。
# 將下面的 hoho 替換成想查詢的玩家名
storage.db.users.findOne({ username: 'hoho' }).then(print)
查看 RoomObject 信息
注意這里要使用storage.db['rooms.objects']
進(jìn)行查詢舰罚,使用storage.db.rooms.objects
是查不到的。這里推薦使用_id
屬性進(jìn)行查詢薛耻,其他同上营罢。
# 將下面的 _id 替換成想查詢的對(duì)象 id
storage.db['rooms.objects'].findOne({ _id: '211a0b1b1d058d1' }).then(print)
新增 RoomObject
這里我們以添加 PowerBank 為例,下面的代碼可以直接用饼齿,只需要修改中間的x
饲漾,y
,room
的值即可(你甚至可以直接創(chuàng)建到自己房里)缕溉。
# 控制臺(tái)不支持換行考传,所以只能把命令寫在一行里
storage.env.get(storage.env.keys.GAMETIME).then(time => storage.db['rooms.objects'].insert({ type: 'powerBank', x: 19, y: 29, room: 'W0N7', store: { power: 9000 }, hits: 2000000, hitsMax: 2000000, decayTime: time + 5000 }))
這個(gè)命令有點(diǎn)長(zhǎng),所以我們簡(jiǎn)單介紹一下:
- 由于 PowerBank 有
decayTime
证鸥,而這個(gè)值是要老化消失時(shí)的 tick 值僚楞。所以我們需要先獲取到storage.env.keys.GAMETIME
,然后將其 +5000枉层,再賦值給最后的decayTime
泉褐。如果你只是簡(jiǎn)單的賦值 5000 的話,那么它的decayTime
很有可能會(huì)變成負(fù)數(shù)(如果游戲已經(jīng)運(yùn)行了 5000 tick)鸟蜡。 - 創(chuàng)建新對(duì)象使用了
storage.db['rooms.objects'].insert()
方法膜赃,這個(gè)方法接受一個(gè)對(duì)象,并將其創(chuàng)建為新的 RoomObject揉忘。如果你想創(chuàng)建其他種類的游戲?qū)ο蟮脑捥彝扑]先用上面介紹的”查看 RoomObject 信息“來(lái)打印一個(gè)已有的同類型對(duì)象,然后對(duì)照著其屬性來(lái)進(jìn)行創(chuàng)建泣矛。
同理疲眷,新增 deposit 的命令如下:
storage.env.get(storage.env.keys.GAMETIME).then(time => storage.db['rooms.objects'].insert({ type: 'deposit', depositType: 'mist', x: 23, y: 12, room: 'W8N0', harvested: 0, decayTime: time + 50000 }))
修改 RoomObject
修改游戲?qū)ο蟮臓顟B(tài)需要用到update
方法,這個(gè)方法接受兩個(gè)參數(shù)您朽,第一個(gè)參數(shù)是包含查詢條件的對(duì)象咪橙,第二個(gè)參數(shù)為配置項(xiàng),其中的$set
屬性包含的對(duì)象就是我們要修改的內(nèi)容虚倒。下面這個(gè)是修改 Controller 等級(jí)的命令美侦。
# 注意修改 controller 的 id
storage.db['rooms.objects'].update({_id: 'ff7a07728e60965'}, {$set: { level: 8 }})
上面創(chuàng)建的 PowerBank 你也可以用這個(gè)方法修改,借此完成設(shè)置 pb 的hits
屬性來(lái)快速削減其生命值之類的操作魂奥。
移除 RoomObject
沒(méi)什么好說(shuō)的菠剩,想刪誰(shuí)就填誰(shuí)的 id(僅限 RoomObject )。
# 把 _id 替換成你想要?jiǎng)h除的對(duì)象 id
storage.db['rooms.objects'].removeWhere({_id: '729c0e4e771ca95'})
修改玩家等級(jí)
這個(gè)也是用update
方法實(shí)現(xiàn)的耻煤,你可以用下面這個(gè)命令快速提升自己的 GCL 和 GPL具壮。其他通過(guò)查看玩家信息能看到的屬性也都可以用這種方法修改准颓。
# 修改下面的 username,后面的 gcl 和 power 越大棺妓,你的對(duì)應(yīng)等級(jí)就越高
storage.db.users.update({ username: 'hoho' }, { $set: { gcl: 6666666, power: 66666 }})
修改存儲(chǔ)物品數(shù)量(添加戰(zhàn)備化合物)
下面這個(gè)命令用來(lái)給存儲(chǔ)建筑添加進(jìn)攻系 t3攘已。用的其實(shí)就是上面的“修改 RoomObject”的方法。這里直接貼出來(lái)方便大家使用怜跑。
# 把下面這個(gè) _id 修改為 Storage 或者 Terminal 的 id
storage.db['rooms.objects'].update({ _id: 'de191f87f95d1e1' }, {$set: { store: { XZHO2: 10000, XZH2O: 10000, XLHO2: 10000, XKHO2: 10000, XGHO2: 10000 } }})
把所有建筑工地的進(jìn)度提升至 99%
下面的命令是 .find
和 .update
的綜合應(yīng)用样勃,不需要修改即可使用。具體流程是:獲取所有的工地 > 獲取每個(gè)工地的信息 > 把每個(gè)工地的建筑進(jìn)度設(shè)置為進(jìn)度最大值 - 1
storage.db['rooms.objects'].find({ type: 'constructionSite' }).then(resp => resp.map(cs => storage.db['rooms.objects'].findOne({ _id: cs._id }).then(csDetail => storage.db['rooms.objects'].update({_id: cs._id }, {$set: { progress: csDetail.progressTotal - 1 }}))))
Bot 添加與刪除
媽媽再也不用擔(dān)心我戰(zhàn)斗代碼沒(méi)法測(cè)試?yán)?/p>
# 添加 bot 修改后面的房間名即可
bots.spawn('simplebot', 'W3N1')
# 刪除 bot性芬,后面這個(gè)改成 bot 的用戶名
bots.removeUser('AliceBot')
這里只提到了添加刪除已有的 bot(默認(rèn)只有官方自帶的simplebot
)峡眶,如果你想添加其他 bot 的話,請(qǐng)先按照 這篇文章 末尾提到的 Mod 安裝方法來(lái)安裝一個(gè) bot植锉,然后再回來(lái)添加辫樱。
房間配置
如果想配置房間的屬性,例如地形俊庇、出口狮暑、Source、Mineral 等辉饱,就需要用到map.generateRoom()
心例。注意,如果你想重新配置一個(gè)房間的話鞋囊,要先使用map.removeRoom(roomName)
將該房間徹底移除止后,然后才能重新生成:
# 先移除該房間
map.removeRoom('W1N9')
# 再生成一個(gè)資源豐富的房間
map.generateRoom('W1N9', { sources: 10, mineral: 'X' })
map.generateRoom
方法接收兩個(gè)參數(shù),第一個(gè)是要生成的房間名溜腐,第二個(gè)是一個(gè)配置對(duì)象译株,所有可用的屬性如下(你可以在控制臺(tái)中執(zhí)行help(map)
來(lái)查看最新的配置項(xiàng) )
-
exits
- 一個(gè)包含出口坐標(biāo)的數(shù)組,如:{ top: [20,21,23], right: [], bottom: [27,28,29,40,41]}
挺益。默認(rèn)隨機(jī)生成- 如果你設(shè)置的出口沒(méi)辦法匹配相鄰房間的話歉糜,控制臺(tái)會(huì)返回匹配失敗錯(cuò)誤。
- 如果你生成的房間和其他已存在房間相鄰望众,并且你也沒(méi)設(shè)置該屬性的話匪补,房間會(huì)自動(dòng)匹配生成對(duì)應(yīng)的出口。
- 所以如果你想打通一面墻的話烂翰,就需要把墻隔開(kāi)的兩個(gè)房間都移除然后重新進(jìn)行生成夯缺。
-
terrainType
- 地形生成類型,1 - 28 之間的任意數(shù)字甘耿,默認(rèn)隨機(jī) -
swampType
- 沼澤生成類型踊兜,0 - 14 之間的任意數(shù)字,默認(rèn)隨機(jī) -
sources
- 房間中 Source 的數(shù)量佳恬,默認(rèn) 1 - 2 個(gè) -
mineral
- 元素礦的類型捏境,置 false 設(shè)置為無(wú)元素礦于游,默認(rèn)隨機(jī) -
controller
- 房間是否有控制器,默認(rèn)為 true -
keeperLairs
- 是否生成 keeperLairs垫言,默認(rèn)為 false
如果在重新生成房間后你的 creep 出現(xiàn)尋路異常贰剥、不停撞墻、私服加載緩慢的問(wèn)題筷频,請(qǐng)嘗試重啟私服蚌成。
寫在最后
上面介紹這些并不是所有的 api,如果有興趣的話你可以用help()
把所有的控制臺(tái)對(duì)象都查看一遍截驮,如果還不夠的話笑陈,github - backend-local 這個(gè)項(xiàng)目 lib/cli
目錄下就是私服控制臺(tái)的實(shí)現(xiàn)际度,請(qǐng)葵袭!
了解更多 Screeps 的中文教程?歡迎訪問(wèn) Screeps - 中文系列教程乖菱!