-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsymbolContainer.roomObject.js
133 lines (118 loc) · 6.15 KB
/
symbolContainer.roomObject.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
const _ = require('lodash');
const maxDecay = 5000;
module.exports = function(config) {
if(config.common) {
config.common.constants.FIND_SYMBOL_CONTAINERS = 10021;
config.common.constants.LOOK_SYMBOL_CONTAINERS = "symbolContainer";
config.common.constants.SYMBOL_CONTAINER_SPAWN_CHANCE = 0.01;
config.common.constants.SYMBOL_CONTAINER_SPAWN_INTERVAL_TICKS = 250; // ticks
}
if (config.backend) {
config.backend.customObjectTypes.symbolContainer = {
sidepanel: '<div><label class="body-header">Store:</label>' +
'<div ng-if="!Room.calcResources(Room.selectedObject)"> Empty </div>' +
'<div ng-if="Room.calcResources(Room.selectedObject)">' +
'<table ng-repeat="(resourceType, amount) in Room.selectedObject.store" ng-if="amount > 0">' +
'<td>{{amount | number}} × </td>' +
'<td><img class="resource-type" ng-src="https://s3.amazonaws.com/static.screeps.com/upload/mineral-icons/{{Room.selectedObject.resourceType}}.png" uib-tooltip="{{Room.selectedObject.resourceType}}"></td>' +
'</table>' +
'</div>' +
'</div>' +
'<div><label>Decay in:</label><span>{{object.decayTime - Room.gameTime}}</span></div>'
};
require('./symbolContainer.renderer')(config);
}
if(config.engine) {
config.engine.registerCustomObjectPrototype('symbolContainer', 'SymbolContainer', {
properties: {
resourceType: object => object.resourceType
},
prototypeExtender (prototype, scope, {utils}) {
const data = id => {
if (!scope.runtimeData.roomObjects[id]) {
throw new Error("Could not find an object with ID " + id);
}
return scope.runtimeData.roomObjects[id];
};
utils.defineGameObjectProperties(prototype, data, {
store: o => new scope.globals.Store(o),
ticksToDecay: o => o.decayTime - scope.runtimeData.time
});
prototype.toString = function() { return `[symbolContainer #${this.id}]` };
},
findConstant: config.common.constants.FIND_SYMBOL_CONTAINERS,
lookConstant: config.common.constants.LOOK_SYMBOL_CONTAINERS
});
config.engine.on('processObject', function (object, roomObjects, roomTerrain, gameTime, roomInfo, objectsUpdate, usersUpdate) {
if (object.type == 'symbolContainer') {
if (!_.sum(object.store) || (object.decayTime <= gameTime)) {
objectsUpdate.remove(object._id);
delete roomObjects[object._id]
}
roomInfo.active = true;
}
});
config.engine.on('processRoom', function(roomId, roomInfo, roomObjects, roomTerrain, gameTime, bulk, bulkUsers, eventLog) {
for(let event of eventLog) {
if((event.event == config.common.constants.EVENT_TRANSFER) &&
roomObjects[event.objectId] &&
(roomObjects[event.objectId].type == 'symbolContainer') &&
event.data.targetId &&
roomObjects[event.data.targetId] &&
roomObjects[event.data.targetId].user)
{
roomInfo.symbols = roomInfo.symbols || {};
roomInfo.symbols[event.data.resourceType] = (roomInfo.symbols[event.data.resourceType] || 0) + event.data.amount;
}
}
});
}
if(config.cronjobs) {
config.cronjobs.genSymbolContainers = [60, async ({utils}) => {
const { db, env } = config.common.storage;
const gameTime = parseInt(await env.get(env.keys.GAMETIME));
if(!gameTime || (gameTime <= 1)) {
return;
}
const lastSymbolContainersSpawnTick = parseInt(await env.get('lastSymbolContainersSpawnTick'));
if((gameTime - lastSymbolContainersSpawnTick) < config.common.constants.SYMBOL_CONTAINER_SPAWN_INTERVAL_TICKS) {
return;
}
const rooms = await db.rooms.find({status: {$ne: 'out of borders'}});
for(let room of rooms) {
if(Math.random() < config.common.constants.SYMBOL_CONTAINER_SPAWN_CHANCE) {
const freePos = await utils.findFreePos(room._id, 0);
if(!freePos) {
console.log(`No free position for score source in ${room._id}`);
return;
}
const densityRoll = 100*Math.random();
let amount = 500 + Math.round(2000*Math.random());
let decay = 500 + Math.round(2000*Math.random());
if(densityRoll <= 47) {
amount = 3500 + Math.round(3000*Math.random());
decay = 3500 + Math.round(3000*Math.random());
}
if(densityRoll <= 18) {
amount = 8500 + Math.round(3000*Math.random());
decay = 8500 + Math.round(3000*Math.random());
}
const decayTime = gameTime + Math.min(maxDecay, decay);
const resourceType = _.sample(config.common.constants.SYMBOLS);
await db['rooms.objects'].insert({
type: 'symbolContainer',
room: room._id,
x: freePos.x,
y: freePos.y,
resourceType,
store: {[resourceType]: amount},
decayTime
});
await utils.activateRoom(room._id);
console.log(`Spawned symbol container in ${freePos.x}:${freePos.y}@${room._id} (${resourceType}: ${amount}, roll ${densityRoll})`);
}
}
await env.set('lastSymbolContainersSpawnTick', gameTime);
}];
}
};