UNPKG

7.87 kBJavaScriptView Raw
1var express = require('express'),
2 router = express.Router(),
3 q = require('q'),
4 _ = require('lodash'),
5 jsonResponse = require('q-json-response'),
6 auth = require('./auth'),
7 utils = require('../../utils'),
8 common = require('@screeps/common'),
9 db = common.storage.db,
10 env = common.storage.env,
11 C = common.configManager.config.common.constants;
12
13function calcFreePowerLevels(user, userPowerCreeps) {
14 var level = Math.floor(Math.pow((user.power || 0) / C.POWER_LEVEL_MULTIPLY, 1 / C.POWER_LEVEL_POW));
15 var used = userPowerCreeps.length + _.sum(userPowerCreeps, 'level');
16 return level - used;
17}
18
19router.get('/list', auth.tokenAuth, jsonResponse((request) => {
20 return q.all([
21 db['users.power_creeps'].find({user: request.user._id}),
22 db['rooms.objects'].find({type: 'powerCreep', user: request.user._id})
23 ])
24 .then(([userPowerCreeps, roomPowerCreeps]) => {
25 userPowerCreeps.forEach(creep => {
26 var roomObject = _.find(roomPowerCreeps, i => i._id == creep._id);
27 if(roomObject) {
28 Object.assign(creep, roomObject);
29 }
30 });
31 return {list: userPowerCreeps};
32 })
33}));
34
35router.post('/create', auth.tokenAuth, jsonResponse((request) => {
36
37 return db['users.power_creeps'].find({user: request.user._id})
38 .then(userPowerCreeps => {
39 if (calcFreePowerLevels(request.user, userPowerCreeps) <= 0) {
40 return q.reject('not enough power level');
41 }
42 if (Object.values(C.POWER_CLASS).indexOf(request.body.className) === -1) {
43 return q.reject('invalid class');
44 }
45
46 var name = ("" + request.body.name).substring(0, 50);
47
48 if (_.any(userPowerCreeps, {name})) {
49 return q.reject('name already exists');
50 }
51
52 return db['users.power_creeps'].insert({
53 name,
54 className: request.body.className,
55 user: "" + request.user._id,
56 level: 0,
57 hitsMax: 1000,
58 energyCapacity: 100,
59 spawnCooldownTime: 0,
60 powers: {}
61 });
62 });
63}));
64
65router.post('/delete', auth.tokenAuth, jsonResponse((request) => {
66 return db['users.power_creeps'].findOne({_id: request.body.id})
67 .then(creep => {
68 if(!creep || creep.user != ""+request.user._id) {
69 return q.reject('invalid id');
70 }
71 if(creep.spawnCooldownTime === null || creep.shard) {
72 return q.reject('spawned');
73 }
74 if(creep.deleteTime) {
75 return q.reject('already being deleted')
76 }
77
78 if((request.user.powerExperimentationTime || 0) > Date.now()) {
79 return db['users.power_creeps'].remove({_id: request.body.id})
80 .then(data => ({result: data.result}));
81 }
82 else {
83 return db['users.power_creeps'].update({_id: request.body.id},
84 {$set: {deleteTime: Date.now() + C.POWER_CREEP_DELETE_COOLDOWN}})
85 .then(data => ({result: data.result}));
86 }
87 })
88}));
89
90router.post('/cancel-delete', auth.tokenAuth, jsonResponse((request) => {
91 return db['users.power_creeps'].findOne({_id: request.body.id})
92 .then(creep => {
93 if(!creep || creep.user != ""+request.user._id) {
94 return q.reject('invalid id');
95 }
96 if(!creep.deleteTime) {
97 return q.reject('not being deleted')
98 }
99
100 return db['users.power_creeps'].update({_id: request.body.id},
101 {$unset: {deleteTime: true}})
102 .then(data => ({result: data.result}));
103 })
104}));
105
106router.post('/upgrade', auth.tokenAuth, jsonResponse((request) => {
107
108 return db['users.power_creeps'].find({user: request.user._id})
109 .then(userPowerCreeps => {
110
111 var creep = _.find(userPowerCreeps, i => "" + i._id == request.body.id);
112 if (!creep) {
113 return q.reject('invalid id');
114 }
115 if(!_.isObject(request.body.powers)) {
116 return q.reject('invalid powers');
117 }
118 for(var power in request.body.powers) {
119 var powerInfo = C.POWER_INFO[power];
120 if (!powerInfo) {
121 return q.reject('invalid power '+power);
122 }
123 if (powerInfo.className !== creep.className) {
124 return q.reject('invalid class for power '+power);
125 }
126 if (!creep.powers[power]) {
127 creep.powers[power] = {level: 0};
128 }
129 if(!_.isNumber(request.body.powers[power])) {
130 return q.reject('invalid value for power '+power);
131 }
132 if(request.body.powers[power] < creep.powers[power].level) {
133 return q.reject('cannot downgrade power '+power);
134 }
135 if(request.body.powers[power] > 5) {
136 return q.reject('invalid max value for power '+power);
137 }
138 }
139 for(var power in creep.powers) {
140 if((request.body.powers[power] || 0) < creep.powers[power].level) {
141 return q.reject('cannot downgrade power '+power);
142 }
143 }
144 var newLevel = _.sum(request.body.powers);
145 if (newLevel > C.POWER_CREEP_MAX_LEVEL) {
146 return q.reject('max level');
147 }
148 var $merge = {powers: {}};
149 for(var power in request.body.powers) {
150 if(request.body.powers[power] === 0) {
151 continue;
152 }
153 if(newLevel < C.POWER_INFO[power].level[request.body.powers[power]-1]) {
154 return q.reject('not enough level for power '+power);
155 }
156 $merge.powers[power] = {level: request.body.powers[power]};
157 }
158
159 if (calcFreePowerLevels(request.user, userPowerCreeps) < newLevel - creep.level) {
160 return q.reject('not enough power level');
161 }
162
163 $merge.level = newLevel;
164 $merge.hitsMax = 1000 * (newLevel + 1);
165 $merge.energyCapacity = 100 * (newLevel + 1);
166
167 return q.all([
168 db['users.power_creeps'].update({_id: request.body.id}, {$merge}),
169 db['rooms.objects'].update({_id: request.body.id}, {$merge})
170 ]);
171 });
172}));
173
174router.post('/rename', auth.tokenAuth, jsonResponse((request) => {
175 return db['users.power_creeps'].find({user: request.user._id})
176 .then(powerCreeps => {
177 var creep = _.find(powerCreeps, i => i._id == request.body.id);
178 if(!creep) {
179 return q.reject('invalid id');
180 }
181 if(creep.spawnCooldownTime === null || creep.shard) {
182 return q.reject('spawned');
183 }
184 var name = ("" + request.body.name).substring(0, 50);
185
186 if (_.any(powerCreeps, {name})) {
187 return q.reject('name already exists');
188 }
189
190 return db['users.power_creeps'].update({_id: request.body.id}, {$set: {name}})
191 .then(data => ({result: data.result}));
192 })
193}));
194
195router.post('/experimentation', auth.tokenAuth, jsonResponse(request => {
196 if((request.user.powerExperimentations || 0) <= 0) {
197 return q.reject('no power resets');
198 }
199 return db['users'].update({_id: request.user._id}, {
200 $inc: {powerExperimentations: -1}, $set: {powerExperimentationTime: Date.now() + 24*3600*1000}});
201}));
202
203
204module.exports = router;