前端小废物系列(2)——Screeps 新手教程

2,297 阅读3分钟

新手教程(2)升级控制器

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

image.png

这个教学关里主要是关于 Room Controller 这个关键战略对象的讨论。通过控制这个无敌的建筑,玩家可以在房间里建造设施。控制器级别越高,可建造的结构就越多。(耳边响起红警里经常听到的 Construction Completed)

image.png

现在需要创建一个新的工蚁(类比)来升级我们的控制器等级。我们叫这个 「Creep」 为 Upgrader1。之后会教学怎么自动创建 「Creep」,现在还是先手动在控制台创建这个 Upgrader1,依然是拥有 [WORK, CARRY, MOVE] 三个身体部件。

文档:

Game.spawns['Spawn1'].spawnCreep( [WORK, CARRY, MOVE], 'Upgrader1' );

image.png

实际上现在这个升级者和收割者干的活是一样的,但是 「Creep」 对象名是按照实际功能来取的,所以我们需要对他们的功能作出区分。

image.png

这时候就需要用到每个 「Creep」 的 memory 属性了,可以写一些自定义的信息到每个 「Creep」 的存储里。这样就可以给 「Creep」 分配不同的角色了。

所有使用的存储都可以通过全局的 Memory 对象来访问。然后对 V8 熟悉的大佬就可以随便玩了(滑稽)。

在控制台这把性质 role = 'harvester' 写到收割者的存储里,把性质 role = 'upgrader' 写到升级者的存储里。(我对浏览器的 memory 不是很熟悉,这里的“存储”实际上就是 memory 这个词,有些资料里面是直接当内存翻译的)

文档:

Game.creeps['Harvester1'].memory.role = 'harvester';
Game.creeps['Upgrader1'].memory.role = 'upgrader';

image.png

要看 「Creep」 的存储,既可以去左边 「Creep」 的信息面板里面看,又可以去底下的 Memory 标签这里找。

现在来定义新 「Creep」 的行为。两个 「Creep」 都需要收集能量,但是 harvester 把能量带回 「Spawn」,upgrader 把能量带给控制器,并且对其应用 upgradeController(通过属性 Creep.room.controller 来找到控制器对象)。

所以现在需要创建一个新的模块,就叫 role.upgrader

文档:

var roleUpgrader = {

    /** @param {Creep} creep **/
    run: function(creep) {
	    if(creep.store[RESOURCE_ENERGY] == 0) {
            var sources = creep.room.find(FIND_SOURCES);
            if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[0]);
            }
        }
        else {
            if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) {
                creep.moveTo(creep.room.controller);
            }
        }
	}
};

module.exports = roleUpgrader;

image.png

新模块定义好了当然要引入主模块了,根据先前定义的属性 Creep.memory.role 来将对应 「Creep」 和对应模块连接,这样就能将不同 「Creep」 的行为区分开。

现在在主模块代码里将 role.upgrader 应用在角色为 upgrader 的 「Creep」 对象 Upgrader1 上。

var roleHarvester = require('role.harvester');
var roleUpgrader = require('role.upgrader');

module.exports.loop = function () {

    for(var name in Game.creeps) {
        var creep = Game.creeps[name];
        if(creep.memory.role == 'harvester') {
            roleHarvester.run(creep);
        }
        if(creep.memory.role == 'upgrader') {
            roleUpgrader.run(creep);
        }
    }
}

image.png

图片里的控制器已经升级了。

重要提示:如果在 20000 game ticks 内没有对控制器进行升级,控制器会掉一级。当等级掉到 level 0,玩家就会丧失对这个房间的控制权,其他的玩家有可能会来争夺这个房间的控制权(高玩的脚本探到或者手动操作的玩家看到一定是会来的)。要保证至少有一个 「Creep」 周期性的执行 upgradeController 函数。

第二关结束。

参考网页

screeps.com/

github.com/screeps/scr…

docs.screeps.com/

screeps-cn.github.io/

screeps.com/a/#!/sim/tu…