使用全局Memory存放所有建筑ID及分配的Creep, Creep内存存放工作建筑

This commit is contained in:
JIe 2024-11-04 16:10:50 +08:00
parent 36ea81e5e2
commit 2df2a171e7
7 changed files with 102 additions and 3566 deletions

3516
dist/main.js vendored

File diff suppressed because it is too large Load Diff

1
dist/main.js.map vendored

File diff suppressed because one or more lines are too long

15
src/index.d.ts vendored
View File

@ -1,8 +1,21 @@
interface CreepMemory { interface CreepMemory {
role: string, role: string,
working?: boolean | null, working?: boolean,
source?:string,
workTarget?: Id<Structure>,
[property: string]: any, [property: string]: any,
} }
interface MemoryStructure{
id: Id<Structure>,
structureType: string,
roomName: string
creep?: Id<Creep>,
}
interface Memory{
structures?: MemoryStructure[]
}
declare type Part = WORK | MOVE | CARRY | HEAL | ATTACK | RANGED_ATTACK | TOUGH | CLAIM; declare type Part = WORK | MOVE | CARRY | HEAL | ATTACK | RANGED_ATTACK | TOUGH | CLAIM;

View File

@ -1,26 +1,25 @@
import { errorMapper } from "./modules/errorMapping"; import { errorMapper } from "./modules/errorMapping";
import { Harvest } from "./modules/harvester"; import { BigHarvest, Harvest } from "./modules/harvester";
import { Build } from "./modules/builder"; import { Build } from "./modules/builder";
import { Upgrade } from "./modules/upgrader"; import { Upgrade } from "./modules/upgrader";
import { SpawnCreep } from "./modules/spawnCreep"; import { SpawnCreep } from "./modules/spawnCreep";
import { RoleToString, UpdateGlobalMemory } from "./modules/creepApi";
import { Role } from "./modules/setting";
export const loop = errorMapper(() => { export const loop = errorMapper(() => {
let mainSpawn = Game.spawns["Spawn1"]; let mainSpawn = Game.spawns["Spawn1"];
SpawnCreep(mainSpawn); SpawnCreep(mainSpawn);
for (var name in Memory.creeps) { UpdateGlobalMemory();
if (!Game.creeps[name]) {
delete Memory.creeps[name];
console.log("clearing non-existing creep memory:", name);
}
}
for (var name in Game.creeps) { for (var name in Game.creeps) {
let creep = Game.creeps[name]; let creep = Game.creeps[name];
if (creep.memory.role == "Harvester") { if (creep.memory.role == RoleToString(Role.Harvester)) {
Harvest(creep); Harvest(creep);
} else if (creep.memory.role == "Upgrader") { } else if (creep.memory.role == RoleToString(Role.Upgrader)) {
Upgrade(creep); Upgrade(creep);
} else if (creep.memory.role == "Builder") { } else if (creep.memory.role == RoleToString(Role.Builder)) {
Build(creep); Build(creep);
}else if(creep.memory.role == RoleToString(Role.BigHarvester)){
BigHarvest(creep);
} }
} }
}) })

View File

@ -1,9 +1,9 @@
import {Role} from "@/modules/setting"; import { Role } from "@/modules/setting";
export function SetRole(creep: Creep, role: Role){ export function SetRole(creep: Creep, role: Role) {
switch(role){ switch (role) {
case Role.Harvester: case Role.Harvester:
creep.memory.role ="Harvester"; creep.memory.role = "Harvester";
case Role.BigHarvester: case Role.BigHarvester:
creep.memory.role = "BigHarvester"; creep.memory.role = "BigHarvester";
case Role.Builder: case Role.Builder:
@ -14,8 +14,8 @@ export function SetRole(creep: Creep, role: Role){
creep.memory.role = "Repairer"; creep.memory.role = "Repairer";
} }
} }
export function RoleToString(role: Role) : string{ export function RoleToString(role: Role): string {
switch(role){ switch (role) {
case Role.Harvester: case Role.Harvester:
return "Harvester"; return "Harvester";
case Role.BigHarvester: case Role.BigHarvester:
@ -29,9 +29,9 @@ export function RoleToString(role: Role) : string{
} }
} }
export function SpawnCreep(spawn: StructureSpawn, body: Part[], role?:Role) : number{ export function SpawnCreep(spawn: StructureSpawn, body: Part[], opt?: SpawnOptions): number {
const name = "Creep" + Game.time; const name = "Creep" + Game.time;
return spawn.spawnCreep(body, name, {memory: {role : RoleToString(role)}}); return spawn.spawnCreep(body, name, opt);//{ memory: { role: RoleToString(role) } });
} }
export function FindCapacity(creep: Creep): AnyStructure[] { export function FindCapacity(creep: Creep): AnyStructure[] {
@ -40,7 +40,7 @@ export function FindCapacity(creep: Creep): AnyStructure[] {
let type = structure.structureType; let type = structure.structureType;
return ( return (
(type == STRUCTURE_EXTENSION || (type == STRUCTURE_EXTENSION ||
type == STRUCTURE_SPAWN|| type == STRUCTURE_SPAWN ||
type == STRUCTURE_CONTAINER) && type == STRUCTURE_CONTAINER) &&
structure.store.getFreeCapacity(RESOURCE_ENERGY) as number > 0 structure.store.getFreeCapacity(RESOURCE_ENERGY) as number > 0
) )
@ -61,25 +61,57 @@ export function GetConstructureSet(creep: Creep, structureType: string | null =
}) })
} }
export function GetConstructure(creep: Creep, structureType: string, ){ export function GetConstructure(creep: Creep | Structure, structureType: string,) {
return creep.room.find(FIND_STRUCTURES, {filter:(structure: AnyStructure)=>{ return creep.room.find(FIND_STRUCTURES, {
filter: (structure: AnyStructure) => {
return structure.structureType == structureType; return structure.structureType == structureType;
}}) }
})
} }
export function GetContainer(creep: Creep): StructureContainer[]{ export function GetContainer(creep: Creep | Structure): StructureContainer[] {
let target = GetConstructure(creep, STRUCTURE_CONTAINER) as StructureContainer[]; let target = GetConstructure(creep, STRUCTURE_CONTAINER) as StructureContainer[];
return target return target;
} }
export function GetCreeps() : Map<string, number>{ export function GetCreeps(): Map<string, number> {
let resp: Map<string, number> = new Map(); let resp: Map<string, number> = new Map();
for (var name in Game.creeps){ for (var name in Game.creeps) {
var creep = Game.creeps[name]; var creep = Game.creeps[name];
if(resp.has(creep.memory.role)) if (resp.has(creep.memory.role))
resp.set(creep.memory.role, resp.get(creep.memory.role)+1) resp.set(creep.memory.role, resp.get(creep.memory.role) + 1)
else else
resp.set(creep.memory.role, 1); resp.set(creep.memory.role, 1);
} }
return resp; return resp;
} }
export function ClearMemory(){
for(var name in Memory.creeps){
if(!Game.creeps[name]){
delete Memory.creeps[name];
for(var structureMemory of Memory.structures){
if(structureMemory.creep == Game.creeps[name].id){
//Creep死亡后, 应为各建筑重新分配Creep
structureMemory.creep = null;
}
}
console.log("clearing non-existing creepmemory:", name);
}
}
}
export function UpdateStructureMemory(){
for(var roomName in Game.rooms){
const room = Game.rooms[roomName];
var structures = room.find(FIND_STRUCTURES);
for(var structure of structures){
Memory.structures.push({"id": structure.id, structureType: structure.structureType, roomName: room.name})
}
}
}
export function UpdateGlobalMemory(){
ClearMemory();
UpdateStructureMemory();
}

View File

@ -2,10 +2,7 @@ import { FindCapacity, GetContainer, GetSource } from "./creepApi"
import { MAIN_SOURCE_ID } from "./setting"; import { MAIN_SOURCE_ID } from "./setting";
export function Harvest(creep: Creep) { export function Harvest(creep: Creep) {
if (creep.store.getFreeCapacity() == null) { if (creep.store.getFreeCapacity() > 0) {
BigHarvest(creep);
}
else if (creep.store.getFreeCapacity() > 0) {
let source: Source = GetSource(MAIN_SOURCE_ID); let source: Source = GetSource(MAIN_SOURCE_ID);
if (creep.harvest(source) == ERR_NOT_IN_RANGE) { if (creep.harvest(source) == ERR_NOT_IN_RANGE) {
creep.moveTo(source, { visualizePathStyle: { stroke: "#ffaa00" } }); creep.moveTo(source, { visualizePathStyle: { stroke: "#ffaa00" } });
@ -22,9 +19,11 @@ export function Harvest(creep: Creep) {
export function BigHarvest(creep: Creep) { export function BigHarvest(creep: Creep) {
let source: Source = GetSource(MAIN_SOURCE_ID); let source: Source = GetSource(MAIN_SOURCE_ID);
let container = GetContainer(creep); let target = Game.getObjectById(creep.memory.workTarget) as StructureContainer;
if (container[0].store.getFreeCapacity(RESOURCE_ENERGY) == 0) { } if (target.store.getFreeCapacity(RESOURCE_ENERGY) == 0) {
console.log("container is full, wait for next tick, container id is:", target.id);
}
else if (creep.harvest(source) == ERR_NOT_IN_RANGE) { else if (creep.harvest(source) == ERR_NOT_IN_RANGE) {
creep.moveTo(container[0], { visualizePathStyle: { stroke: "#ffaa00" } }); creep.moveTo(target, { visualizePathStyle: { stroke: "#ffaa00" } });
} }
} }

View File

@ -2,39 +2,49 @@ import * as setting from "./setting";
import * as creepApi from "./creepApi" import * as creepApi from "./creepApi"
const createDefaultHarvester = (spawn: StructureSpawn) => { const createDefaultHarvester = (spawn: StructureSpawn) => {
return creepApi.SpawnCreep(spawn, setting.mk1Body, setting.Role.Harvester); return creepApi.SpawnCreep(spawn, setting.mk1Body, { memory: { role: creepApi.RoleToString(setting.Role.Harvester) } });
} }
const createDefaultBuilder = (spawn: StructureSpawn) => { const createDefaultBuilder = (spawn: StructureSpawn) => {
return creepApi.SpawnCreep(spawn, setting.mk1Body, setting.Role.Builder); return creepApi.SpawnCreep(spawn, setting.mk1Body, { memory: { role: creepApi.RoleToString(setting.Role.Builder) } });
}; };
const createDefaultUpgrader = (spawn: StructureSpawn) => { const createDefaultUpgrader = (spawn: StructureSpawn) => {
return creepApi.SpawnCreep(spawn, setting.mk1Body, setting.Role.Upgrader); return creepApi.SpawnCreep(spawn, setting.mk1Body, { memory: { role: creepApi.RoleToString(setting.Role.Upgrader) } });
}; };
const createMk2Harvester = (spawn: StructureSpawn) => { const createMk2Harvester = (spawn: StructureSpawn, container: StructureContainer) => {
return creepApi.SpawnCreep(spawn, setting.Mk2harvesterBody, setting.Role.BigHarvester); return creepApi.SpawnCreep(spawn, setting.Mk2harvesterBody, { memory: { role: creepApi.RoleToString(setting.Role.BigHarvester), workTarget: container.id } });
} }
export function SpawnCreep(spawn: StructureSpawn) { export function SpawnCreep(spawn: StructureSpawn) {
if (spawn.spawning) return; if (spawn.spawning) return;
let currentCreeps = creepApi.GetCreeps(); let currentCreeps = creepApi.GetCreeps();
if (currentCreeps.get(creepApi.RoleToString(setting.Role.Harvester)) > setting.HARVESTER_COUNT) { let currentContainer = creepApi.GetContainer(spawn);
if (currentCreeps.get(creepApi.RoleToString(setting.Role.Harvester)) < setting.HARVESTER_COUNT) {
if (createDefaultHarvester(spawn) == 0) { if (createDefaultHarvester(spawn) == 0) {
console.log("Spawn Harvester") console.log("Spawn Harvester")
} }
} }
if (currentCreeps.get(creepApi.RoleToString(setting.Role.Upgrader)) > setting.UPGRADER_COUNT) { if (currentCreeps.get(creepApi.RoleToString(setting.Role.Upgrader)) < setting.UPGRADER_COUNT) {
if (createDefaultUpgrader(spawn) == 0) { if (createDefaultUpgrader(spawn) == 0) {
console.log("Spawn Upgrader") console.log("Spawn Upgrader")
} }
} }
if (currentCreeps.get(creepApi.RoleToString(setting.Role.Builder)) > setting.BUILDER_COUNT) { if (currentCreeps.get(creepApi.RoleToString(setting.Role.Builder)) < setting.BUILDER_COUNT) {
if (createDefaultBuilder(spawn) == 0) { if (createDefaultBuilder(spawn) == 0) {
console.log("Spawn Builder") console.log("Spawn Builder")
} }
} }
if (currentCreeps.get(creepApi.RoleToString(setting.Role.BigHarvester)) < currentContainer.length) {
for (var structure of Memory.structures) {
if (structure.structureType == STRUCTURE_CONTAINER && structure.creep == null)
if (createMk2Harvester(spawn, Game.getObjectById(structure.id) as StructureContainer) == 0) {
structure.creep = Game.creeps[spawn.spawning.name].id;
console.log("Spawn Mk2Harvester, Set Work Target:", structure.id);
}
}
}
if (spawn.spawning) { if (spawn.spawning) {
var spawningCreep = Game.creeps[spawn.spawning.name]; var spawningCreep = Game.creeps[spawn.spawning.name];
spawn.room.visual.text( spawn.room.visual.text(