Screeps 輕量化的模塊框架
該設(shè)計(jì)下,每個(gè)模塊(API)迹缀,需要實(shí)現(xiàn)三個(gè)方法:mount(), work(), lateWork()
// src/api/sample.ts
export const sampleAPI: APIBase = {
mount() {
// 初次載入時(shí),初始化這個(gè)模塊用到的存儲(chǔ)空間羔砾,以及在原型上掛載擴(kuò)展望艺,或者在global上掛載一些公共的方法,屬性
},
work() {
// 日常工作的入口倦春,管理歸屬于這個(gè)模塊的所有對(duì)象户敬,如果涉及creep,一般分為creep數(shù)量控制和creep運(yùn)行兩個(gè)方法
// 每個(gè)模塊之間相互獨(dú)立睁本,不依賴先后順序
},
lateWork() {
// 收尾工作的入口尿庐,運(yùn)行建筑,通用服務(wù)模塊呢堰,比如spawn模塊抄瑟,在收尾時(shí)能夠處理本tick新添加的任務(wù)
}
}
例如spawn任務(wù)處理模塊:這個(gè)模塊會(huì)處理其他模塊添加進(jìn)來(lái)的孵化任務(wù),安排spawn進(jìn)行工作枉疼,同時(shí)也會(huì)管理一些creep來(lái)填充spawn以及extension
export const spawnManagerAPI: APIBase = {
// 這是個(gè)通用的服務(wù)模塊皮假,對(duì)外提供接口,因此掛載在global上
mount() {
global.spawnManager = {
// 任務(wù)相關(guān)
clearSpawnTasks: clearSpawnTasks,
addSpawnTask: addSpawnTask,
popSpawnTask: popSpawnTask,
peekSpawnTask: peekSpawnTask,
creepNameQueueCache: {} // 初始化這個(gè)模塊本身的存儲(chǔ)空間
}
},
work() {
distributerNumberControl() // 控制填充creep的數(shù)量(包括添加孵化任務(wù))
runDistributeCreeps() // 運(yùn)行所有該模塊管轄的填充creep
},
lateWork() {
handleSpawnTasks() // 處理孵化任務(wù)
}
}
這種模式下骂维,每個(gè)模塊自行查找自己管轄的房間惹资,建筑,creep航闺,任務(wù)等對(duì)象褪测,并做對(duì)應(yīng)的操作猴誊,針對(duì)頻繁使用的對(duì)象集合(比如:我控制的房間的集合),可以掛載在global上侮措。
比如 runDistributeCreeps() 這個(gè)方法
function runDistributeCreeps() {
// 最簡(jiǎn)便的寫(xiě)法
const creeps = Object.values(Game.creeps).filter((creep) => (creep.memory.role === 'distributer'))
// 避免重復(fù)查找的方法 —— 第一次查找creep的時(shí)候懈叹,遍歷creep,按照role掛載到global上分扎,之后取global.[role]即可
// const creeps = global.distributers
creeps.forEach((creep) => {
// 處理每個(gè)creep具體的邏輯
})
}
其他封裝用的文件
// src/api/index.ts
import { sampleAPI } from './sample'
const APIs: APIBase[] = []
APIs.push(sampleAPI)
export default APIs
// src/apiHandler.ts
import APIs from './api'
export const apiHandler = {
mount: () => {
if (!global.mounted) {
console.log(`重新掛載擴(kuò)展 ${Game.time}`)
APIs.forEach((api) => {
api.mount()
})
global.mounted = true
}
},
work: () => {
APIs.forEach((api) => {
api.work()
})
},
lateWork: () => {
APIs.forEach((api) => {
api.lateWork()
})
}
}
// src/main.ts
import { apiHandler } from './apiHandler'
console.log("script reload on " + Game.time)
export const loop = () => {
apiHandler.mount()
apiHandler.work()
apiHandler.lateWork()
}