74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import { checkPositionWalkable } from 'utils/funcs/checkPosition';
|
|
import {
|
|
createSourcePositionMatrix,
|
|
forEachMatrixSpot,
|
|
getPositionWithDelta,
|
|
PositionSpotStatus,
|
|
setSpotStatus,
|
|
} from 'utils/positions';
|
|
|
|
class RoomInspector {
|
|
public static inspectState(room: Room, state: GameState): GameState {
|
|
if (!this.stateWasInitialized(state)) {
|
|
state = this.initializeState(room, state);
|
|
}
|
|
return state;
|
|
}
|
|
|
|
private static stateWasInitialized(state: GameState): boolean {
|
|
return !!state.sourcesStates;
|
|
}
|
|
|
|
private static initializeState(room: Room, state: GameState): GameState {
|
|
state.sourcesStates = {};
|
|
state.maxHarvesters = 0;
|
|
|
|
for (const source of room.find(FIND_SOURCES)) {
|
|
this.configureSourceState(source, state);
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
private static configureSourceState(
|
|
source: Source,
|
|
state: GameState
|
|
): void {
|
|
const sourceId = source.id.toString();
|
|
|
|
if (!state.sourcesStates[sourceId]) {
|
|
state.sourcesStates[sourceId] = {
|
|
id: sourceId,
|
|
pos: source.pos,
|
|
spots: createSourcePositionMatrix(),
|
|
};
|
|
}
|
|
|
|
forEachMatrixSpot(
|
|
state.sourcesStates[sourceId].spots,
|
|
(delta, status) => {
|
|
if (status !== PositionSpotStatus.UNKNOWN) {
|
|
return; // Skip known spots
|
|
}
|
|
const pos = getPositionWithDelta(source.pos, delta);
|
|
if (checkPositionWalkable(pos)) {
|
|
setSpotStatus(
|
|
state.sourcesStates[sourceId].spots,
|
|
delta,
|
|
PositionSpotStatus.EMPTY
|
|
);
|
|
state.maxHarvesters += 1;
|
|
} else {
|
|
setSpotStatus(
|
|
state.sourcesStates[sourceId].spots,
|
|
delta,
|
|
PositionSpotStatus.INVALID
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
export default RoomInspector;
|