Screeps新人入门指南

很久没更新博客了,放一个游戏指南吧,随便水一水

之前玩Screeps的命令和基础脚本,当然我自己玩到跨地图的时候,被跨地图整的有点崩溃,当然这个游戏拿来练手ts和js也是非常不错的

自己的TS-Screeps脚本,可以参考对应的配置
Screeps若steam不想入手,也可以玩一玩网页版

一些常用的shell

孵化creep

Game.spawns['Spawn1'].spawnCreep([WORK, CARRY, MOVE], 'Harvester1', { memory: { role: 'harvester' } });

Game.spawns['Spawn1'].spawnCreep([WORK, CARRY, MOVE], 'Upgrader1', { memory: { role: 'upgrader' } });

Game.spawns['Spawn1'].spawnCreep([WORK, CARRY, MOVE], 'Builder1', { memory: { role: 'builder' } });

// 获得对应房间的所有能量点
Game.rooms['E57N57'].find(FIND_SOURCES);

// 设置creep的role
Game.creeps['Harvester1'].memory.role = 'harvester';
Game.creeps['Upgrader1'].memory.role = 'upgrader';

// 移动creep到某点
Game.creeps['Upgrader1'].moveTo(new RoomPosition(x, y, 'W1N1'));

// 建造大家伙
Game.spawns['Spawn1'].spawnCreep( [WORK,WORK,WORK,WORK,CARRY,MOVE,MOVE],
    'Upgrader1Big',
    { memory: { role: 'upgrader' } } );
    
// 自杀一个creep
Game.creeps['Harvester1'].suicide()

二本

建造城墙(可通行)

Game.spawns["Spawn1"].room.createConstructionSite(x, y, STRUCTURE_RAMPART);

建造墙(Walls)(不可)

Game.spawns["Spawn1"].room.createConstructionSite(x, y, STRUCTURE_WALL);

建造Extensions(扩展)

Game.spawns["Spawn1"].room.createConstructionSite(x, y, STRUCTURE_EXTENSION);

建造道路

Game.spawns["Spawn1"].room.createConstructionSite(x, y, STRUCTURE_ROAD);

三本

建造Tower

Game.spawns['Spawn1'].room.createConstructionSite(x, y, STRUCTURE_TOWER);

四本

建造Storage(存储设施)

Game.rooms['roomName'].createConstructionSite(x, y, STRUCTURE_STORAGE);

Game.spawns['Spawn1'].room.createConstructionSite(x, y, STRUCTURE_STORAGE);

五本

建造一个link,link可用于传递传输能量(有能量损耗)

Game.spawns['Spawn1'].room.createConstructionSite(x, y, STRUCTURE_LINK);

六本

建造一个Extractor,一个用于自动收集矿物的设备,可以直接建在矿物所在的xy位置上

Game.spawns['Spawn1'].room.createConstructionSite(x, y, STRUCTURE_EXTRACTOR);

跨地图

使Creep移动到另一个房间

const exit = creep.room.findExitTo('W1N2');
creep.moveTo(creep.pos.findClosestByRange(exit));
[下午5:00:27][shard3]TypeError: Cannot read property 'controller' of undefined
    at Object.run  (../src/role/action/claimer.ts:12:62)
    at ErrorMapper.wrapLoop  (../src/main.ts:70:18)
    at Object.loop  (../src/utils/ErrorMapper.ts:74:8)
[下午5:00:31][shard3]

创造一个对应的creep并宣称另一个房间的controller控制权

Game.spawns['Spawn1'].spawnCreep([CLAIM, MOVE], 'Claimer1', { memory: { role: 'claimer' } });

Game.creeps['Claimer1'].moveTo(Game.rooms['目标房间名'].controller);
Game.creeps['Claimer1'].claimController(Game.rooms['目标房间名'].controller);

注意:Creep必须有CLAIM部件才能执行claimController动作,每个CLAIM部件会消耗600能量。另外,当你的Creep成功声明了一个Controller后,该Controller将被占领并开始计时,如果在1500游戏刻内没有再次使用Creep的upgradeController动作,那么你将失去对该Controller的控制权。

creep

部件(body parts)

  1. MOVE:每个MOVE部件使Creep每个tick移动一格。成本为50能量。
  2. WORK:WORK部件用于采矿、建造、攻击、修理和升级控制器。每个WORK部件的成本为100能量。
  3. CARRY:CARRY部件用于携带资源。每个CARRY部件可以携带50单位的资源,并且不影响Creep的移动。每个CARRY部件的成本为50能量。
  4. ATTACK:ATTACK部件用于近战攻击。每个部件每tick造成30点伤害。每个ATTACK部件的成本为80能量。
  5. RANGED_ATTACK:RANGED_ATTACK部件用于远程攻击。每个部件每tick造成10点伤害。每个RANGED_ATTACK部件的成本为150能量。
  6. HEAL:HEAL部件用于治疗自身或其他Creep。每个部件每tick可以治疗12点伤害。每个HEAL部件的成本为250能量。
  7. TOUGH:TOUGH部件提供防御。它会吸收伤害,但不会减少伤害。每个TOUGH部件的成本为10能量。
  8. CLAIM:CLAIM部件用于占领、攻击或保护控制器。每个CLAIM部件的成本为600能量。

请注意,每个Creep的部件总数(包括所有类型的部件)不能超过50个。

建筑

  • Spawn:Spawn是用于生成新的creep的建筑。
  • Extension:Extension用于存储能量,供Spawn和Tower使用。
  • Tower:Tower是防御建筑,可以攻击敌人,修复建筑,或者治疗creep。
  • Storage:Storage是用于存储资源的建筑。
  • Container:Container也是用于存储资源的建筑,但容量较小。
  • Road:Road用于加快creep的移动速度。
  • Wall:Wall是防御建筑,用于阻挡敌人的进攻。
  • Rampart:Rampart也是防御建筑,但是可以让友方的creep穿过。
  • Extractor:Extractor是用于从矿场中提取矿物的建筑。
  • Factory:Factory是用于生产复合资源的建筑。
  • Invader Core:Invader Core是NPC的建筑,玩家不能建造。
  • Link:Link是能量传输设备,可以在矿场和主基地之间传输能量,或者在主基地内部进行能量转移。
  • Terminal:Terminal是一个全局市场交易中心,玩家可以在这里买卖资源,或者在自己的房间之间发送资源。
  • Lab:Lab是进行化学反应的地方,玩家可以在这里合成和分解各种化合物。
  • Observer:Observer用于远程观察其他房间的情况,可以提供视野以便进行侦查或者预警。
  • Power Spawn:Power Spawn是用于生成和存储Power资源的建筑,Power资源可以用于激活creep的POWER部位。
  • Nuker:Nuker是一种重型攻击设备,可以发射核弹攻击远处的房间,造成大范围的破坏。
控制器等级对应的建筑解锁和上限
  1. 控制器等级 1:无法解锁新的建筑或Creep组件。
  2. 控制器等级 2:可以建造5个扩展(Extension),总能量容量为550。此外,可以建造1个Rampart和Wall,以及1个Road。
  3. 控制器等级 3:可以建造10个扩展,总能量容量为800。此外,可以建造1个Tower,5个Wall,以及所有的Road。
  4. 控制器等级 4:可以建造20个扩展,总能量容量为1300。此外,可以建造1个Storage,2个Tower,20个Wall,以及所有的Road。
  5. 控制器等级 5:可以建造30个扩展,总能量容量为1800。此外,可以建造1个Link,2个Tower,30个Wall,以及所有的Road。
  6. 控制器等级 6:可以建造40个扩展,总能量容量为2300。此外,可以建造3个Link,3个Tower,40个Wall,1个Extractor,以及所有的Road。
  7. 控制器等级 7:可以建造50个扩展,总能量容量为5600。此外,可以建造4个Link,4个Tower,50个Wall,2个Spawn,1个Extractor,1个Terminal,1个Lab,以及所有的Road。
  8. 控制器等级 8:可以建造60个扩展,总能量容量为12900。此外,可以建造6个Link,6个Tower,250个Wall,3个Spawn,1个Extractor,1个Terminal,3个Lab,1个Observer,1个Power Spawn,1个Nuker,以及所有的Road。

教程2

shell

孵化一个身体为 [WORK,CARRY,MOVE] 且名称为 Upgrader1 的 creep。

Game.spawns['Spawn1'].spawnCreep( [WORK, CARRY, MOVE], 'Upgrader1' );
Game.spawns['Spawn1'].spawnCreep([WORK, CARRY, MOVE], 'Harvester1', { memory: { role: 'harvester' } });

将属性 role='harvester' 写入采集单位的内存,将 role='upgrader' 写入升级单位的内存。

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

教程3

shell

孵化一个身体部件为 [WORK,CARRY,MOVE],名字为 Builder1,并且内存为 {role:'builder'} 的 creep。

Game.spawns['Spawn1'].spawnCreep( [WORK, CARRY, MOVE], 'Builder1',
    { memory: { role: 'builder' } } );

builder角色逻辑

var roleBuilder = {

    /** @param {Creep} creep **/
    run: function(creep) {

	    if(creep.memory.building && creep.store[RESOURCE_ENERGY] == 0) {
            creep.memory.building = false;
            creep.say('🔄 harvest');
	    }
	    if(!creep.memory.building && creep.store.getFreeCapacity() == 0) {
	        creep.memory.building = true;
	        creep.say('🚧 build');
	    }

	    if(creep.memory.building) {
	        var targets = creep.room.find(FIND_CONSTRUCTION_SITES);
            if(targets.length) {
                if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) {
                    creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}});
                }
            }
	    }
	    else {
	        var sources = creep.room.find(FIND_SOURCES);
            if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[0], {visualizePathStyle: {stroke: '#ffaa00'}});
            }
	    }
	}
};

module.exports = roleBuilder;

main

var roleHarvester = require('role.harvester');
var roleBuilder = require('role.builder');

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 == 'builder') {
            roleBuilder.run(creep);
        }
    }
}

harvester角色逻辑

var roleHarvester = {

    /** @param {Creep} creep **/
    run: function(creep) {
	    if(creep.store.getFreeCapacity() > 0) {
            var sources = creep.room.find(FIND_SOURCES);
            if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[0], {visualizePathStyle: {stroke: '#ffaa00'}});
            }
        }
        else {
            var targets = creep.room.find(FIND_STRUCTURES, {
                    filter: (structure) => {
                        return (structure.structureType == STRUCTURE_EXTENSION || structure.structureType == STRUCTURE_SPAWN) &&
                            structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0;
                    }
            });
            if(targets.length > 0) {
                if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
                    creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}});
                }
            }
        }
	}
};

module.exports = roleHarvester;

找到全部的 5 个 extension 以及 spawn 并填充能量。 main

var roleHarvester = require('role.harvester');
var roleBuilder = require('role.builder');

module.exports.loop = function () {

    for(var name in Game.rooms) {
        console.log('Room "'+name+'" has '+Game.rooms[name].energyAvailable+' energy');
    }

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

孵化一个身体部件为 [WORK,WORK,WORK,CARRY,MOVE,MOVE],名称为 HarvesterBig 的 creep 并且设为 harvester 角色。

Game.spawns['Spawn1'].spawnCreep( [WORK,WORK,WORK,WORK,CARRY,MOVE,MOVE],
    'HarvesterBig',
    { memory: { role: 'harvester' } } );

教程4

假设我们最少需要维持两个采集单位(harvester),最简单的办法就是:每当我们发现它们的数量小于这个值时,就执行 StructureSpawn.spawnCreep 方法。您可能还没想好它们应该叫什么(这一步我们会自动给它们起名字),但是不要忘了给他们设置需要的角色(role)。

添加StructureSpawn.spawnCreep

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

module.exports.loop = function () {

    var harvesters = _.filter(Game.creeps, (creep) => creep.memory.role == 'harvester');
    console.log('Harvesters: ' + harvesters.length);

    if(harvesters.length < 2) {
        var newName = 'Harvester' + Game.time;
        console.log('Spawning new harvester: ' + newName);
        Game.spawns['Spawn1'].spawnCreep([WORK,CARRY,MOVE], newName, 
            {memory: {role: 'harvester'}});        
    }
    
    if(Game.spawns['Spawn1'].spawning) { 
        var spawningCreep = Game.creeps[Game.spawns['Spawn1'].spawning.name];
        Game.spawns['Spawn1'].room.visual.text(
            '🛠️' + spawningCreep.memory.role,
            Game.spawns['Spawn1'].pos.x + 1, 
            Game.spawns['Spawn1'].pos.y, 
            {align: 'left', opacity: 0.8});
    }

    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);
        }
    }
}

自杀一个screeps

Game.creeps['Harvester1'].suicide()

Q.E.D.


一个平凡人的追梦之旅