forked from Yuandiaodiaodiao/Screeps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobserver.js
139 lines (129 loc) · 4.98 KB
/
observer.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var observer_queue = new Set()
var observerCache = undefined
function work() {
if (!observerCache) observerCache = {}
if (!observer_queue) observer_queue = new Set()
let used = new Set()
if (observer_queue.size == 0) return
let observers = []
Memory.observer.forEach(o => observers.push(Game.getObjectById(o)))
for (let roomName of observer_queue) {
const room = Game.rooms[roomName]
if (!room) {
//不可见
let flag = false
for (let obs of observers) {
if (used.has(obs.id)) continue
const act = obs.observeRoom(roomName)
if (act == OK) {
flag = true
used.add(obs.id)
break
}
}
if (flag == false) {
if (observers.every(o => Game.map.getRoomLinearDistance(o.pos.roomName, roomName) > 10)) {
observer_queue.delete(roomName)
observerCache[roomName] = {lazytime: Game.time}
}
}
if (used.size == Memory.observer.length) break
} else {
//可见
observer_queue.delete(roomName)
observerCache[roomName] = {}
const controller = room.controller
const spawn = room.spawns.length
if (controller && controller.owner && controller.level > 2 && !controller.my && spawn !== 0) {
observerCache[roomName] = {
owner: controller.owner.username,
time: Game.time
}
} else if (controller && controller.reservation && !(controller.reservation.username === 'Invader' || controller.reservation.username === 'Yuandiaodiaodiao')) {
observerCache[roomName] = {
owner: controller.reservation.username,
time: Game.time
}
} else if (!controller) {
const pb = room.powerBanks[0]
// const newWall = room.find(FIND_STRUCTURES, {filter: o => o.structureType === STRUCTURE_WALL && (!o.hits)})[0]
if (pb) {
observerCache[roomName] = {
powerBank: true,
power: pb.power,
startTime: Game.time - (5000 - pb.ticksToDecay),
time: Game.time,
pos: [pb.pos.x, pb.pos.y]
}
} else {
observerCache[roomName] = {
time: Game.time
}
}
} else {
observerCache[roomName] = {
time: Game.time
}
}
const ttl = Game.tools.roomCachettl[roomName]
if (!ttl || Game.time - ttl >= 500) {
const costs = Game.tools.getRoomCostMatrix(room)
Game.tools.roomCache[roomName] = costs
Game.tools.roomCachettl[roomName] = Game.time
}
if (Game.tools.roomCacheUse[roomName] && Game.time - Game.tools.roomCacheUse[roomName] > 4000) {
//clear costMatrix to save memory
Game.tools.roomCache[roomName] = undefined
observerCache[roomName]['lazytime'] = Game.time
observerCache[roomName]['time'] = undefined
}
}
}
}
function find() {
Memory.observer = []
for (let roomName in Memory.rooms) {
let room = Game.rooms[roomName]
let obs = room.observer
if (obs) {
Memory.observer.push(obs.id)
}
}
}
function cache() {
for (let roomName in observerCache) {
if (observerCache[roomName].time && Game.time - observerCache[roomName].time > 1000) {
observer_queue.add(roomName)
} else if (observerCache[roomName].lazytime && Game.time - observerCache[roomName].lazytime > 3000) {
observer_queue.add(roomName)
}
}
for (let roomName in require('tools').roomCache) {
if (!require('tools').roomCacheUse[roomName]) {
require('tools').roomCacheUse[roomName] = Game.time
} else if (Game.time - require('tools').roomCacheUse[roomName] > 8000) {
delete observerCache[roomName]
} else if (Game.time - require('tools').roomCacheUse[roomName] > 4000) {
require('tools').roomCache[roomName] = undefined
observerCache[roomName] = observerCache[roomName] || {}
observerCache[roomName]['lazytime'] = Game.time
observerCache[roomName]['time'] = undefined
}
}
}
function observerCacheSet(val) {
if (val) {
observerCache = val
module.exports.observerCache = observerCache||{}
} else {
return observerCache
}
}
module.exports = {
'work': work,
'find': find,
'cache': cache,
'observerCache': observerCache,
'observer_queue': observer_queue,
'observerCacheSet': observerCacheSet
};