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)
- MOVE:每个MOVE部件使Creep每个tick移动一格。成本为50能量。
- WORK:WORK部件用于采矿、建造、攻击、修理和升级控制器。每个WORK部件的成本为100能量。
- CARRY:CARRY部件用于携带资源。每个CARRY部件可以携带50单位的资源,并且不影响Creep的移动。每个CARRY部件的成本为50能量。
- ATTACK:ATTACK部件用于近战攻击。每个部件每tick造成30点伤害。每个ATTACK部件的成本为80能量。
- RANGED_ATTACK:RANGED_ATTACK部件用于远程攻击。每个部件每tick造成10点伤害。每个RANGED_ATTACK部件的成本为150能量。
- HEAL:HEAL部件用于治疗自身或其他Creep。每个部件每tick可以治疗12点伤害。每个HEAL部件的成本为250能量。
- TOUGH:TOUGH部件提供防御。它会吸收伤害,但不会减少伤害。每个TOUGH部件的成本为10能量。
- 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:无法解锁新的建筑或Creep组件。
- 控制器等级 2:可以建造5个扩展(Extension),总能量容量为550。此外,可以建造1个Rampart和Wall,以及1个Road。
- 控制器等级 3:可以建造10个扩展,总能量容量为800。此外,可以建造1个Tower,5个Wall,以及所有的Road。
- 控制器等级 4:可以建造20个扩展,总能量容量为1300。此外,可以建造1个Storage,2个Tower,20个Wall,以及所有的Road。
- 控制器等级 5:可以建造30个扩展,总能量容量为1800。此外,可以建造1个Link,2个Tower,30个Wall,以及所有的Road。
- 控制器等级 6:可以建造40个扩展,总能量容量为2300。此外,可以建造3个Link,3个Tower,40个Wall,1个Extractor,以及所有的Road。
- 控制器等级 7:可以建造50个扩展,总能量容量为5600。此外,可以建造4个Link,4个Tower,50个Wall,2个Spawn,1个Extractor,1个Terminal,1个Lab,以及所有的Road。
- 控制器等级 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.