-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathConstruction_Tower.js
92 lines (87 loc) · 3.55 KB
/
Construction_Tower.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const logger = require('utils.log').getLogger("Tower");
const CONFIG = require('config');
const SYS_CONFIG = require('config.system.setting');
function towerWork() {
if (!CONFIG.CLAIM_ROOM) {
logger.info("缺少配置文件信息!");
return;
}
// 直接遍历房间列表,检测每个房间内是否有需要攻击/维护的目标,避免使用每个 Tower 反复在同一房间内搜索以提升效率
for (let room of CONFIG.CLAIM_ROOM) {
if (Game.rooms[room].controller.level < 3) {
logger.debug(`房间[${room}] Controller 等级未达3级,无法建造 Tower`);
continue;
}
if (!Game.rooms[room].getTowerList() || Game.rooms[room].getTowerList().length === 0) {
logger.info(`房间[${room}] Controller 等级已达3级,请及时建造 Tower!`);
continue;
}
// 检测是否有敌人
const enemas = Game.rooms[room].find(FIND_HOSTILE_CREEPS);
if (enemas.length) {
towerAttack(room, enemas);
} else {
// 检测是否有建筑需要维护
const repairTargets = Game.rooms[room].find(FIND_STRUCTURES, {
filter: (structure) => (structure.hits < structure.hitsMax - 200 && structure.structureType !== STRUCTURE_RAMPART && structure.structureType !== STRUCTURE_WALL) || (structure.structureType === STRUCTURE_RAMPART &&
structure.hits / structure.hitsMax <= SYS_CONFIG.DEFENSE_CONSTRUCTION_HITS_LIMITS)
});
if (repairTargets.length) {
towerRepair(room, repairTargets);
} else {
// 检测是否有受伤 Creep
const injuredCreeps = Game.rooms[room].find(FIND_MY_CREEPS, {
filter: (creep) => creep.hits < creep.hitsMax
});
if (injuredCreeps.length) {
towerHeal(room, injuredCreeps);
}
}
}
}
}
//检测到进入范围的敌人自动攻击
function towerAttack(room, targets) {
for (let towerId of Game.rooms[room].getTowerList()) {
const tower = Game.getObjectById(towerId);
if (tower.store[RESOURCE_ENERGY] > 0) {
// for(let target of targets){
// for(let bodyPart of target.body){
// if(bodyPart === HEAL){
// break;
// }
// }
// }
tower.attack(targets[0]);
} else {
logger.info(`房间[${room}]中的Tower[${towerId}]能量储量为空,无法工作!`)
}
}
}
//检测到范围内需要维修、保养的劳工自动进行维护
function towerRepair(room, targets) {
for (let towerId of Game.rooms[room].getTowerList()) {
const tower = Game.getObjectById(towerId);
if (tower.store.getUsedCapacity(RESOURCE_ENERGY) / TOWER_CAPACITY <= 0.2) {
continue;
}
if (tower.store[RESOURCE_ENERGY] > 0) {
tower.repair(targets[0])
} else {
logger.info(`房间[${room}]中的Tower[${towerId}]能量储量为空,无法工作!`)
}
}
}
function towerHeal(room, targets) {
for (let towerId of Game.rooms[room].getTowerList()) {
const tower = Game.getObjectById(towerId);
if (tower.store[RESOURCE_ENERGY] > 0) {
tower.heal(targets[0])
} else {
logger.info(`房间[${room}]中的Tower[${towerId}]能量储量为空,无法工作!`)
}
}
}
module.exports = {
towerWork: towerWork
};