Screeps 服务器控制台操作

screeps 系列教程

前言

很多小伙伴对于如何有效的测试自己的游戏代码一直很苦恼,官服 Tick 太长;社区服还要重新练级,时间久了又怕被打;写了 pb depo 采集代码结果等不到目标,怎么办呢?其实对于测试来说,最有效的方法就是使用本地启动的私服,Screeps 的 Steam 客户端支持一键启动私服,非常方便,当然你自己搭建一个也完全不是问题。

私服测试相对于其他方法来说最大的好处就是你可以完全自定义任何东西。包括地形、等级、创建或者销毁任何物品等。这给我们的测试提供了非常大的便利。但是官方对 CLI 的帮助文档很不详细,为了方便大家操作,我会介绍几个比较常用的服务器控制台指令。

下面的操作都是基于服务器使用默认的 lokiStorage 作为存储的,如果你的服务器使用了mongoDB的话,使用对应的数据库终端可以更方便的进行查看。

启动 CLI

如果你是用 steam 客户端启用的话,可以直接点击下图左侧的 CLI 来进入控制台:

而如果你是使用 docker 部署服务器的话,使用如下命令就可以进入服务器的 CLI:

# 下面的 screeps-server 请替换成对应的 docker 容器名
docker exec -it screeps-server npx screeps cli

小提示:这里也能开本地私服 ↓

查看帮助

CLI 中有一个全局方法help()可以用来查看帮助,如果你想查看指定对象的帮助信息的话,将其作为参数传递给help()即可,如下:

help(storage)

查看玩家信息

玩家信息保存在storage.db中,使用异步方法findOne即可查看。注意,这里findOne方法接受一个对象作为参数,而你通过该方法查询出来的所有属性都可以作为查询条件。

# 将下面的 hoho 替换成想查询的玩家名
storage.db.users.findOne({ username: 'hoho' }).then(print)

查看 RoomObject 信息

注意这里要使用storage.db['rooms.objects']进行查询,使用storage.db.rooms.objects是查不到的。这里推荐使用_id属性进行查询,其他同上。

# 将下面的 _id 替换成想查询的对象 id
storage.db['rooms.objects'].findOne({ _id: '211a0b1b1d058d1' }).then(print)

新增 RoomObject

这里我们以添加 PowerBank 为例,下面的代码可以直接用,只需要修改中间的xyroom的值即可(你甚至可以直接创建到自己房里)。

# 控制台不支持换行,所以只能把命令写在一行里
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 }))

这个命令有点长,所以我们简单介绍一下:

  • 由于 PowerBank 有decayTime,而这个值是要老化消失时的 tick 值。所以我们需要先获取到storage.env.keys.GAMETIME,然后将其 +5000,再赋值给最后的decayTime。如果你只是简单的赋值 5000 的话,那么它的decayTime很有可能会变成负数(如果游戏已经运行了 5000 tick)。
  • 创建新对象使用了storage.db['rooms.objects'].insert()方法,这个方法接受一个对象,并将其创建为新的 RoomObject。如果你想创建其他种类的游戏对象的话,我推荐先用上面介绍的”查看 RoomObject 信息“来打印一个已有的同类型对象,然后对照着其属性来进行创建。

同理,新增 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

修改游戏对象的状态需要用到update方法,这个方法接受两个参数,第一个参数是包含查询条件的对象,第二个参数为配置项,其中的$set属性包含的对象就是我们要修改的内容。下面这个是修改 Controller 等级的命令。

# 注意修改 controller 的 id
storage.db['rooms.objects'].update({_id: 'ff7a07728e60965'}, {$set: { level: 8 }})

上面创建的 PowerBank 你也可以用这个方法修改,借此完成设置 pb 的hits属性来快速削减其生命值之类的操作。

移除 RoomObject

没什么好说的,想删谁就填谁的 id(仅限 RoomObject )。

# 把 _id 替换成你想要删除的对象 id
storage.db['rooms.objects'].removeWhere({_id: '729c0e4e771ca95'})

修改玩家等级

这个也是用update方法实现的,你可以用下面这个命令快速提升自己的 GCL 和 GPL。其他通过查看玩家信息能看到的属性也都可以用这种方法修改。

# 修改下面的 username,后面的 gcl 和 power 越大,你的对应等级就越高
storage.db.users.update({ username: 'hoho' }, { $set: { gcl: 6666666, power: 66666 }})

修改存储物品数量(添加战备化合物)

下面这个命令用来给存储建筑添加进攻系 t3。用的其实就是上面的“修改 RoomObject”的方法。这里直接贴出来方便大家使用。

# 把下面这个 _id 修改为 Storage 或者 Terminal 的 id
storage.db['rooms.objects'].update({ _id: 'de191f87f95d1e1' }, {$set: { store: { XZHO2: 10000, XZH2O: 10000, XLHO2: 10000, XKHO2: 10000, XGHO2: 10000 } }})

把所有建筑工地的进度提升至 99%

下面的命令是 .find.update 的综合应用,不需要修改即可使用。具体流程是:获取所有的工地 > 获取每个工地的信息 > 把每个工地的建筑进度设置为进度最大值 - 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 添加与删除

妈妈再也不用担心我战斗代码没法测试啦

# 添加 bot 修改后面的房间名即可
bots.spawn('simplebot', 'W3N1')

# 删除 bot,后面这个改成 bot 的用户名
bots.removeUser('AliceBot') 

这里只提到了添加删除已有的 bot(默认只有官方自带的simplebot),如果你想添加其他 bot 的话,请先按照 这篇文章 末尾提到的 Mod 安装方法来安装一个 bot,然后再回来添加。

房间配置

如果想配置房间的属性,例如地形、出口、Source、Mineral 等,就需要用到map.generateRoom()。注意,如果你想重新配置一个房间的话,要先使用map.removeRoom(roomName)将该房间彻底移除,然后才能重新生成:

# 先移除该房间
map.removeRoom('W1N9')

# 再生成一个资源丰富的房间
map.generateRoom('W1N9', { sources: 10, mineral: 'X' })

map.generateRoom方法接收两个参数,第一个是要生成的房间名,第二个是一个配置对象,所有可用的属性如下(你可以在控制台中执行help(map)来查看最新的配置项

  • exits - 一个包含出口坐标的数组,如: { top: [20,21,23], right: [], bottom: [27,28,29,40,41]}。默认随机生成
    • 如果你设置的出口没办法匹配相邻房间的话,控制台会返回匹配失败错误。
    • 如果你生成的房间和其他已存在房间相邻,并且你也没设置该属性的话,房间会自动匹配生成对应的出口。
    • 所以如果你想打通一面墙的话,就需要把墙隔开的两个房间都移除然后重新进行生成。
  • terrainType - 地形生成类型,1 - 28 之间的任意数字,默认随机
  • swampType - 沼泽生成类型,0 - 14 之间的任意数字,默认随机
  • sources - 房间中 Source 的数量,默认 1 - 2 个
  • mineral - 元素矿的类型,置 false 设置为无元素矿,默认随机
  • controller - 房间是否有控制器,默认为 true
  • keeperLairs - 是否生成 keeperLairs,默认为 false

如果在重新生成房间后你的 creep 出现寻路异常、不停撞墙、私服加载缓慢的问题,请尝试重启私服。

写在最后

上面介绍这些并不是所有的 api,如果有兴趣的话你可以用help()把所有的控制台对象都查看一遍,如果还不够的话,github - backend-local 这个项目 lib/cli 目录下就是私服控制台的实现,请!

了解更多 Screeps 的中文教程?欢迎访问 Screeps - 中文系列教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容