Screeps 扩张 - 多房间与外矿

screeps 系列教程

简介

作为新手玩家在游戏进程中遇到的第一个”BOSS“,很多人会对如何拓展自己的疆域感到无从下手,那么本文就简单介绍一下在殖民地扩张的过程中你可能会遇到的一些问题和该怎么改写自己的代码吧。

多房间

首先来简单了解一下怎么殖民到新的房间,在游戏中有个等级叫做GCL (全局控制等级)。如果你不太了解的话可以参考 Screeps 概念介绍(下) 中的 等级 小节。每升一级GCL,都会给你解锁一个新的房间控制额度。新玩家的GCL1级。一般会在你第一个房间的RCL (房间控制等级) 达到5级半时升至2GCL,从而解锁第二个房间的控制额度。

建议在阅读完本文后再开始动手,以防出现准备不充分的情况发生。

第一步:占领新房间!

当你达到 GCL2 之后,你就可以着手开始发展你的第二块殖民地了。想占领新的房间,就要占领他的控制器。而占领控制器我们需要调用creepclaimController 方法,并传入想要占领房间的控制器即可占领该房间,如下:

// 要占领房间的 creep
const creep = Game.creeps['claimer']
// 要占领的房间
// 注意这一句有可能会获取不到 room 对象,下面会解释
const room = Game.rooms['要占领的房间名']
// 移动到房间的控制器并占领
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
    creep.moveTo(room.controller)
}

注意,执行claimController方法要求 creep 拥有CLAIM身体部分。你可以生成一个最小的身体结构[ CLAIM, MOVE ]来完成新房间的占领工作。

但是!当你执行上面代码的时候,你可能会发现下面这行代码有问题:

const room = Game.rooms['要占领的房间名, 如W1N1'] // room 的值为 undefined

这句话获取不到room对象,哪里出问题了!不用担心,你的写法没错。在作怪的是一个叫做 视野 的游戏机制。

你可能会疑惑,我点进房间里什么都可以看得到啊。没错,你是能看到,但是代码看不到。你可以在 官方 api 文档 中找到这句话:

Game.rooms 的 api 介绍

注意后面这句,当房间中有自己的 creep 或者建筑时,该房间可见。所以说,如果我们没有任何单位在房间中时,我们将无法获取那个房间的对象。现在让我们来改写一下上面的代码:

// 要占领房间的 creep
const creep = Game.creeps['claimer']
// 要占领的房间
const room = Game.rooms['要占领的房间名']
// 如果该房间不存在就先往房间走
if (!room) {
    creep.moveTo(new RoomPosition(25, 25, '要占领的房间'))
}
else {
    // 如果房间存在了就说明已经进入了该房间
    // 移动到房间的控制器并占领
    if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
        creep.moveTo(room.controller)
    }
}

这样就可以保证 creep 正确的跑到目标房间然后占领控制器,关于其中RoomPosition的文档看 这里,这里不再赘述。

当 creep 跑到控制器面前然后顶了一下控制器后,你就会发现控制器瞬间升到了1级。没错,你已经占领了这个房间。如果你并没有看到这一幕,请打印 claimController() 的返回值并查阅文档。

第二步:建造 Spawn !

当你占领了房间之后就会发现,什么都没有发生。是的,占领新房间并不会送你什么建筑,你需要手动建造。首先要建造的就是Spawn建筑。Construct建筑列表中,你可以在下方找到解锁的 Spawn(如果你没有找到的话请检查房间中是否有别人遗留下来的 Spawn,可以直接摧毁,其他建筑同理)。

现在,我们需要生产建筑工来将我们的 spawn 造好,使用如下代码将建筑工引导至新房间:

// 因为我们的 claimer 已经在房间里了
// 所以我们可以正常的获取该房间的对象。
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 距离目标越远,moveTo() 所消耗的 cpu 就会越高,你可以使用如下形式的moveTo来提高缓存的距离以节省 cpu:

// reusePath 代表缓存的距离,默认为 5
creep.moveTo(target, { reusePath: 50 })

上面的代码仅为参考,你应该结合你的 creep 数量控制模块 以及 角色模块 来创建一个通用性更高的“新房间占领逻辑”。

建造一个 spawn 要花费 1.5k 的能量,所以你应该在你源房间的能力范围内生成最多身体部件的builder来加快 spawn 的建造。当你的新 spawn 建造完成后,一个崭新的殖民地就准备就绪了。你可以像之前一样挖矿并升级你的房间控制器了。

小提示:1 级的房间控制器将在 20,000 ticks 后降级至 0 级。届时你将失去这个房间并需要重新占领。所以请在其降至 0 级前建立起可靠的控制器升级逻辑。

ok,到目前为止我们已经讲完了如何控制一个新的房间,接下来我们就来讲一下给殖民地发展增速的有效手段:外矿。

外矿

在不属于自己的房间内采集并收集能量的行为 被称为开外矿。例如下图,可以看到其只有中间一个房间有完整的基地,而周围有很多房间的矿(外矿 )通过道路和基地连接在一起:

overmind 控制下的房间

我们点开基地下方的房间就可以更清楚的了解到这个概念:

一个外矿房间

可以看到房间内只有两个 creep。一个在采集能量,另一个对着房间控制器不知道在做着什么,在做什么我们稍后再来讨论

很多新手玩家再没接触过这个玩法之前很难想象到可以这么做。实际上,官方并没有禁止甚至推荐这么做。你可以发现,roadcontainer这两种建筑实际上是可以在不属于自己的房间内建造的。所以你可以借此让你的外矿运作效率更高。

外矿的好处与坏处?

开外矿可以使得你基地的能量获取更加充沛从而提高殖民地运转效率,或许你已经注意到了,采矿需要时间一点一点的开采,而从存储中获取能量在一个 tick 中就可以完成。所以在建立了 开采 > 存储 > 使用 体系后,你会发现,开采的很容易跟不上消耗的速度,而开外矿则可以很好的缓解甚至解决这个问题。

那么古尔丹,代价是什么呢?

代价就是,你的 cpu 消耗可能会因此增加很多。creep 寻路会消耗 cpu。路程越长 cpu 消耗量越大。当你的外矿距离比较远时,使用一般的moveTo进行寻路可能会导致你的 cpu 飙升。这时候你就需要一些额外手段了,例如使用PathFinderroom.findPath手动寻路并缓存路径等。所以开外矿实际是在 cpu 使用量和能量开采速率之间做权衡。

提高外矿的效率

当你随便点开一个无主房间的能量矿后,你会发现这个矿的容量上限居然只有可怜的1500。什么情况?

容量只有 1500 的能量矿

我们可以在 官方 api 文档 中找到为什么,注意红框中最后一行,未预定的房间中容量上限为 1500。:

source 的官方介绍

1500 也太少了点,那么能不能...能!我们只需要把这个房间 预定 了即可。什么是预定呢?实际上,creep 拥有三种针对控制器的行为,预定就是其中的一种,下面我们来简单介绍一下:

  • 占领claimController:将该房间占领,房间的所有者owner会变成自己,同时可以对房间控制器升级,从而解锁更高级和更多的建筑,要求自己有空余的房间控制额度。占领房间的 creep 必须拥有CLAIM身体。
  • 预定reserveController:强度稍弱一点的宣称,房间的所有者依旧为空,但是房间中能量矿的上限恢复至正常的3000。预定时间会不断衰减,衰减至 0 时能量矿上限重新变成 1500。预定房间的 creep 必须拥有CLAIM身体。
  • 签名signController:最弱(没用)的宣称,你可以使用任意身体部件的 creep 给任意房间 (包括敌对房间 ) 控制器签名。签名可以在世界地图中看到并且不会自动衰减消失。但是不会对房间造成任何影响。
一个被同时预定和签名的房间

这里主要介绍一下预定reserveController,预定并不像占领一样,一下就可以完成,而是需要有 creep 进行持续的预定,其原因在于:每一个CLAIM身体每次只能增加1tick 的预定时间。也就是说,如果你有一个[ CLAIM, MOVE ]的 creep 每 tick 对房间控制器执行一次reserveController的话,当 creep 死掉的时候,你对房间的预定会立马结束。所以为了获得更加充裕的预定时间,请确保你的 creep 拥有最少两个CLAIM身体部件。

预定时间最长为5000ticks,可以通过controller面板中的Reserved属性看到,见上图。

有一点需要注意的是,即使不对房间进行预定,也不影响你正常开外矿,只是外矿效率只有预定后的一半,所以推荐先完成外矿的逻辑代码,再来考虑预定者的逻辑。

开外矿会遇到的问题

入侵者

只要房间内的能量矿被开采,那么这个房间就有会产生 npc 入侵者,所以在外矿中面临的最大问题可能就是来自入侵者的威胁了。由于无法建造 tower 进行防御,所以你需要给外矿房间内派遣一些守卫(常驻或检测到入侵者后再生成)。或者你可以采取更猥琐一点的方法,例如有入侵者的话就直接撤退至安全房间直到入侵者老死。

在更新了 4.0 版本以后游戏新增了 NPC 要塞的机制,这个机制对于外矿的开发来说有不小的影响。NPC 会不断的在没有claim的房间内生成一个小型的核心来预定房间。所以你可能要在外矿维护的模块中添加一些额外逻辑来清除这些惹人厌的 NPC 核心(当然如果你懒的打的话,core 一般也会在几万 tick 内消失 )。

需要注意的是,Creep.dismantle() 是对小型核心没有效果的,不要想着让外矿采集单位顺手拆掉。

一个正在预定控制器的小型核心

你可以从 NPC 入侵者 - 要塞原型介绍 - InvaderCore 了解到更多信息。

基建维护

因为 road 和 container 可以在RCL 0的房间内建造,所以很多人都会在外矿中建造这两者来提高效率,但是这两者都会磨损,所以对房间内基础设施的维护就成为了一个重要的问题。你可以让你的开采者或运输者在运能量回来时顺路检查其生命值并维修,或者其他你能想到的更好办法。

视野问题

由于外矿房间内属于自己的单位并不多,所以有的时候可能会出现该房间没有视野的问题,所以请确保你的外矿房间有可靠的视野,或者你的代码足够健壮,当房间没有视野时也不影响正常的工作。

总结

本文简单介绍了如何拓展自己的殖民地,你可以控制的房间数量和你的GCL等级是相等的,在拥有空余的房间控制额度时,你可以通过 creep 的claimController来占领一个新的房间,但是要记得在占领新房间后及时建造spawn

除了占领新房间,你还可以通过开外矿的形式来利用其他房间的能量矿。使用reserveController可以预定房间,从而使该房间的能量矿上限恢复至3000。另外还要注意 npc 入侵者、基建维护、视野以及寻路成本带来的影响。

如果你想要了解更多关于 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

推荐阅读更多精彩内容

  • screeps 里会时不时的给你一个提示,平时也没怎么看过,今天特地点了一遍,把常见的 tip 都记录一下供大家参...
    HoPGoldy阅读 4,400评论 1 7
  • 这个问题可能是困扰所有萌新玩家的第一个问题了。当你打开screeps之后,看到地图上花花绿绿一大片的玩家,相信有很...
    HoPGoldy阅读 14,653评论 6 17
  • abandon, desert, forsake, leave, give up abandon :强调永远或完全...
    sunxiaohang阅读 2,308评论 0 3
  • 金田公司于2001年12月从WMC资源有限公司购买了圣伊维斯矿山。在购买后,他们立刻开始着手提高现有选矿厂的处理能...
    四方谈阅读 1,972评论 0 0
  • 我终于失去你了 还在人前装作快乐 可其实没人看我笑着 或是眼泪落了几颗 但你曾经为什么 短暂停留却让人深刻 你终于...
    夏小溪_阅读 230评论 6 3