前言
很多小伙伴对于如何有效的测试自己的游戏代码一直很苦恼,官服 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 为例,下面的代码可以直接用,只需要修改中间的x
,y
,room
的值即可(你甚至可以直接创建到自己房里)。
# 控制台不支持换行,所以只能把命令写在一行里
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 - 中文系列教程!