Screeps入门教程0·机制

本文最后更新于2019/1/11,以下内容均来自官方文档。
这里只介绍了一些基本的游戏机制,具体请自行研究官方文档。

游戏机制相关

介绍

Screeps是个什么类型的游戏

Screeps是一个大型多人在线的即时战略游戏。每个玩家可以在一个由全部玩家共享的永久世界中创建自己的殖民地。这样一个殖民地可以挖掘资源,建设单位,征服领土。当你征服更多的领土,你在游戏世界的影响力会随之增长,同时你进一步扩展的能力也会增强。然而,它需要你付出很多,因为多个玩家可能会看中同一个区域。

Screeps是为具有编程技能的人而开发的。不像其他RTS游戏,Screeps中的单位可以在没有你的参与下对各种事件做出相应————如果你的程序写的合适的话。即使你没有一直参与,也不影响你玩得很好。过一段时间检查下你的殖民地发展的怎么样就足够了。

游戏世界

游戏中的世界有互相连接的房间组成。一个房间即是一个封闭的50x50的空间。这个房间可能会有1-4个通往其他房间的出口。世界中的房间数量是有限的,但当新玩家加入游戏时,房间数量会增多。所以这个游戏世界其实是巨大而且在持续扩展的,就像宇宙一样。

每个房间的地形是独一无二的。每个房间的地形类型包含一下三种:

  • Plain land (平原)———— 简单的地形,移动花费为2。
  • Swamps(沼泽)———— 移动花费提升至10。
  • Walls(墙)———— 所有Creep都无法在其上移动。

你可以通过以下几种设施来改造房间的地形:

  • Roads (公路)将移动花费降低至1。公路会随着Creep在上面的移动而损耗,需要修复。
  • Constructed Walls (人造墙)可以被玩家创建。不像自然的墙,它们可以被Creep攻击和毁坏。
  • Ramparts (壁垒)是你的防御设施之一。只有你自己的Creep能在你的壁垒上移动。除此之外,处于壁垒之中的Creep是不会被攻击到的,但其中的Creep可以攻击外面的Creep。

游戏刚开始的时候,你可以自由选择一个可用的房间来作为新的殖民地。在你放置了第一个Spawn之后,你的房间将会处于安全模式(敌对的Creep无法在激活了安全模式的房间内盗取能源,攻击Creep和破坏设施)。利用好这段时间来准备好防御方案,不然地话任何人都可能可以破坏你的殖民地!

你的殖民地

Your colony

Energy sources(能量源) 是主要的游戏资源。它们可以被带有WORK部件的Creep采集。能量源中的能量数量是有限制的,但是每隔300个游戏时刻(Game Tick)就会刷新一次。

Spawn(孵化器) 则是你殖民地的核心。它们可以积累采集到的能量并用于创建你的Creep单位。一个房间最多只有三个孵化器。因此,在一个房间里有三个孵化器就说明你已经事实上征服了它。这个只是单个房间的限制,也就是说n个房间可以有最多3n个孵化器。

孵化器自己只能创建非常基本的单位。为了创建更加复杂的单位,你需要修建更多的孵化器拓展(extension)。具体请看下一章。

Creeps

Creep是Screeps中的单位,和其它游戏不同的是,你需要通过组合七种不同的部件来构造Creep的身体,部件总数最多为50。

不同的部件可以让Creep以对应的效率执行对应的动作。

Bodyparts

记住,任何Creep都只有1500tick的寿命。

一个标准的孵化器只能生产平常的Creep,并且生产消耗最高为300。如果需要生产更大的Creep,你需要修建孵化器拓展,每个孵化器拓展可以容纳最多50能量,其中的能量也能用于生产Creep。

孵化器拓展的数量上限取决于房间内控制器的等级。

Creep技能

  • WORK 增加采集能量,修建和升级控制器的能力
  • MOVE 增加移动的能力
  • CARRY 增加运输能量的能力
  • ATTACK 增加近距离攻击的能力
  • RANGED_ATTACK 增加远距离攻击的能力
  • HEAL 增加治疗的能力
  • CLAIM 增加认领殖民地控制器的能力
  • TOUGH 增加额外的耐久

一项能力的效率取决于对应类型的部件的数量。举例来说,带有3xWORK的Creep的工作效率是带有1xWORK的Creep的三倍。

移动

每个部件都有其自己的物理重量: Creep带有越多部件就越难移动。每个部件(除了MOVE)会在Creep移动时生成疲劳点: 在公路上是1点/部件数,在平地上是2点/部件数,在沼泽上是10点/部件数。每个MOVE部件以2点/tick的速度减少疲劳点。当Creep的疲劳点大于0时是无法移动的。

为了保持最大移动速度1格/tick(Screeps中最大速度是1格/tick),Creep需要有和其它部件相同数量的MOVE部件

也就是说,一个MOVE部件可以在1tick中移动一个其它部件。如果移动部件占比较少,Creep的移动速度会成比例下降,这点可以从累计的疲劳点中看出。

值得注意的是,空的CARRY部件不会生成疲劳点。

实例:

  • [CARRY, WORK, MOVE] 在没有携带能量的时候移动速度为1格/tick,携带能量时移动速度为1格/2tick
  • [TOUGH, ATTACK, ATTACK, MOVE, MOVE, MOVE] 可以以1格/tick的最大速度移动
  • [TOUGH, ATTACK, ATTACK, MOVE, MOVE] 移动速度只有1格/2tick,因为“向上取整”

伤害

Creep的耐久数取决于其部件的数量————每个部件带有100耐久(hits)。生产Creep时确定的部件顺序也会有影响。在遭受攻击时,第一个部件最先承受伤害。当一个部件的耐久数为0时,这个部件给Creep带来的技能增效将会消失。

Start Area

Novice Area

为了保护新玩家,Screeps中存在一种有时效的临时区域,称为Novice Area,在地图上以绿色高亮。

区域规则

  • 这些区域完全和外界隔离,进入该区域的方式有且只有—将初始Spawn直接放置在该区域。
  • 只允许GCL不高于3的玩家在该地区重生
  • 每个玩家只能占领(claim)最多三个该区域的房间,但reservation不受限制。
  • 多个Safe-mode之间可以无冷却激活
  • 禁止建造或使用Nukers(核弹)

Novice Area内置计数器(天数),当计数器归零时,该区域消失,绿色标记消失,所有限制取消。

Novice Area内部规模1010,细分为四个44的小区块,小区块之间也存在隔离区,这些隔离区会在Novice Area失效前一段时间消失。

所以在这个区域存在时,你只会面对和同等水平的“新玩家”,在Novice Area时效到了之后,你就会面对其它所有玩家了。

Respawn Area

类似地与其它区域隔离开的还有Respawn Area,在地图上以蓝色高亮。

这个区域里只有对Nuker的限制。

参考Start Areas

cpu限制

在模拟和在线两种模式中,Screeps引擎的计算平台有所不同。在模拟模式中,其基于且只影响当前浏览器。而在线模式中,脚本的计算和执行会影响服务器。

每tick会计算所有脚本提交的更改,并在当前tick结束时应用至数据库。因为执行完所有脚本后,当前tick的运算才算结束,所以为了避免滥用,Screeps引入了cpu subscription的机制,使得每份脚本的执行时间都是有限的。

100cpu的限制意味着计算该玩家的脚本提交内容不会超过100ms,当计算时间达到100ms时,服务器会中止计算当前脚本,无论其是否执行完毕。

考虑到cpu并不会总是被用完,Screeps也加入了cpu bucket,它会将每tick剩余的cpu存入bucket以备不时之需。

bucket中cpu存储上限为10000cpu,而每tick可从bucket取出最多500cpu来参与该tick的计算。

当cpu subscription过期后,玩家的cpu上限不再取决于GCL,其值固定为20cpu。私服不受限制。

参考How does CPU limit work

tick

Screeps是基于现实时间的游戏,游戏时间是一个数字,代表已进行游戏的ticks(或回合数或循环数)

当分析其实际运行情况时,每tick可分为前中后三期。

前期,所有Object的状态都是确定的。所有对Object的数据更改、创建和移除都只会发生在下一tick的前期。

中期,服务器基于前期的状态计算脚本的提交内容。

后期,所有对Object的数据更改、创建和移除提交给服务器,解决冲突后,将于下一tick的前期更新。

参考Understanding game loop, time and ticks

respawn

游戏右上角点开后能够看到这一功能。

选择重生(respawn)会立刻unclaim所有控制器并使其等级归零,所有creep和设施(不包括道路、墙体)的拥有者都会变成官方账户Screeps。

随后就和一开始进行游戏时一样,可以选择一个房间来放置初始Spawn。

全局对象

Game对象

玩家通过全局的Game对象来操作游戏中的设施、Creep等。通过这个对象,我们可以获取到完整的Creep列表,获得房间的信息和传递命令等。

1
2
3
4
var target = Game.spawns.Spawn1;
for(var i in Game.creeps) {
Game.creeps[i].moveTo(target);
}

对Game对象的任何更改都不会在Tick与Tick之间传递。只能通过游戏对象的特殊方法来改变属性和发送命令。

每一Tick,Game对象都会被重新创建并填充最新的数据。为了能够记住并在Tick与Tick之间传递,我们需要用到Memory对象。

Memory对象

Memory是一个全局对象,默认情况下所有更改都会自动通过JSON.stringify方法转换为字符串并在每个tick之间传递。(序列化/反序列化)

每个玩家可使用的存储空间为2MB。

一些游戏对象会拥有memory属性,其实质是一个快捷链接。例如Game.creeps.benjm.memory其实是Memory.creeps.benjm的链接。

存储游戏对象

不应该将对象直接写入Memory(这样做是无法在下一tick重新得到该对象的),而是写入其id属性,并在需要对象时使用Game.getObjectById方法得到对象。

关于自定义序列化请看原文(下方有链接)

参考Global Objects

下一篇