Completed
Push — master ( 3d2e4b...6ed0aa )
by Andres
43s
created

build_scripts/generate_achievements.js   A

Complexity

Total Complexity 30
Complexity/F 0

Size

Lines of Code 359
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 30
wmc 30
c 1
b 0
f 0
nc 6232950
mnd 3
bc 30
fnc 0
dl 0
loc 359
rs 10
bpm 0
cpm 0
noi 1
1
/* eslint-env node */
2
/*jslint node: true */
3
'use strict';
4
5
const jsonfile = require('jsonfile');
6
7
const args = process.argv.slice(2);
8
9
let achievements = jsonfile.readFileSync(args[0]+'/data/achievements.json');
10
let elements = jsonfile.readFileSync(args[0]+'/data/elements.json');
11
let resources = jsonfile.readFileSync(args[0]+'/data/resources.json');
12
let radioisotopes = jsonfile.readFileSync(args[0]+'/data/radioisotopes.json');
13
14
for(let element in elements){
15
  if(elements[element].disabled){
16
    continue;
17
  }
18
  let main = elements[element].main;
19
  let name = elements[element].name;
20
  let goals = [1e6, 1e9, 1e12, 1e15];
21
  let key = 'progress_'+element;
22
23
  // Generate production achievements
24
  achievements[key] = {
25
    name: name,
26
    description: 'Gather '+name,
27
    goals: goals,
28
    progress: 'player.resources["'+main+'"].number'
29
  };
30
31
  let isotopeNumber = Object.keys(elements[element].isotopes).length;
32
  key = 'isotopes_'+element;
33
  // Generate isotopes achievements
34
  achievements[key] = {
35
    name: name+' isotopes',
36
    description: 'Unlock all '+name+' isotopes',
37
    goals: [isotopeNumber],
38
    progress: ['(() => {',
39
      'let count = 0;',
40
      'for(let key in data.elements["'+element+'"].isotopes){',
41
      '  if (player.resources[key].unlocked) {',
42
      '    count++;',
43
      '  }',
44
      '}',
45
      'return count;',
46
      '})()'
47
    ]
48
  };
49
50
  let ionNumber = 0;
51
  for(let resource of elements[element].includes){
52
    if (resources[resource].type.indexOf('ion') !== -1) {
53
      ionNumber++;
54
    }
55
  }
56
  if(ionNumber > 0){
57
    key = 'ions_'+element;
58
    // Generate ions achievements
59
    achievements[key] = {
60
      name: name+' ions',
61
      description: 'Unlock all '+name+' ions',
62
      goals: [ionNumber],
63
      progress: ['(() => {',
64
        'let count = 0;',
65
        'for(let key of data.elements["'+element+'"].includes){',
66
        '  if (data.resources[key].type.indexOf("ion") !== -1 &&',
67
        '      player.resources[key].unlocked) {',
68
        '    count++;',
69
        '  }',
70
        '}',
71
        'return count;',
72
        '})()'
73
      ]
74
    };
75
  }
76
77
  let moleculeNumber = 0;
78
  for(let resource of elements[element].includes){
79
    if (resources[resource].type.indexOf('molecule') !== -1) {
80
      moleculeNumber++;
81
    }
82
  }
83
84
  if(moleculeNumber > 0){
85
    key = 'molecules_'+element;
86
    // Generate ions achievements
87
    achievements[key] = {
88
      name: name+' molecules',
89
      description: 'Unlock all '+name+' molecules',
90
      goals: [moleculeNumber],
91
      progress: ['(() => {',
92
        'let count = 0;',
93
        'for(let key of data.elements["'+element+'"].includes){',
94
        '  if (data.resources[key].type.indexOf("molecule") !== -1 &&',
95
        '      player.resources[key].unlocked) {',
96
        '    count++;',
97
        '  }',
98
        '}',
99
        'return count;',
100
        '})()'
101
      ]
102
    };
103
  }
104
}
105
106
// Total achievements
107
let totalElements = 0;
108
for(let element in elements){
109
  if(!elements[element].disabled){
110
    totalElements++;
111
  }
112
}
113
114
achievements.total_elements = {
115
  name: 'Elements',
116
  description: 'Unlock all elements',
117
  goals: [totalElements],
118
  progress: ['(() => {',
119
    'let count = 0;',
120
    'for(let key in state.player.elements){',
121
    '  if (state.player.elements[key].unlocked) {',
122
    '    count++;',
123
    '  }',
124
    '}',
125
    'return count;',
126
    '})()'
127
  ]
128
};
129
130
// Total isotopes
131
let totalIsotopes = 0;
132
for(let resource in resources){
133
  if(resources[resource].type.indexOf('isotope') !== -1){
134
    totalIsotopes++;
135
  }
136
}
137
138
achievements.total_isotopes = {
139
  name: 'Isotopes',
140
  description: 'Unlock all isotopes',
141
  goals: [totalIsotopes],
142
  progress: ['(() => {',
143
    'let count = 0;',
144
    'for(let key in state.player.resources){',
145
    '  if (data.resources[key].type.indexOf("isotope") !== -1 &&',
146
    '      state.player.resources[key].unlocked) {',
147
    '    count++;',
148
    '  }',
149
    '}',
150
    'return count;',
151
    '})()'
152
  ]
153
};
154
155
// Total ions
156
let totalIons = 0;
157
for(let resource in resources){
158
  if(resources[resource].type.indexOf('ion') !== -1){
159
    totalIons++;
160
  }
161
}
162
163
achievements.total_ions = {
164
  name: 'Ions',
165
  description: 'Unlock all ions',
166
  goals: [totalIons],
167
  progress: ['(() => {',
168
    'let count = 0;',
169
    'for(let key in state.player.resources){',
170
    '  if (data.resources[key].type.indexOf("ion") !== -1 &&',
171
    '      state.player.resources[key].unlocked) {',
172
    '    count++;',
173
    '  }',
174
    '}',
175
    'return count;',
176
    '})()'
177
  ]
178
};
179
180
// Total molecules
181
let totalMolecules = 0;
182
for(let resource in resources){
183
  if(resources[resource].type.indexOf('molecule') !== -1){
184
    totalMolecules++;
185
  }
186
}
187
188
achievements.total_molecules = {
189
  name: 'Molecules',
190
  description: 'Unlock all molecules',
191
  goals: [totalMolecules],
192
  progress: ['(() => {',
193
    'let count = 0;',
194
    'for(let key in state.player.resources){',
195
    '  if (data.resources[key].type.indexOf("molecule") !== -1 &&',
196
    '      player.resources[key].unlocked) {',
197
    '    count++;',
198
    '  }',
199
    '}',
200
    'return count;',
201
    '})()'
202
  ]
203
};
204
205
// Total misc
206
let totalMisc = 0;
207
for(let resource in resources){
208
  if(Object.keys(resources[resource].elements).length === 0){
209
    totalMisc++;
210
  }
211
}
212
213
achievements.total_misc = {
214
  name: 'Misc',
215
  description: 'Unlock all meta resources',
216
  goals: [totalMisc],
217
  progress: ['(() => {',
218
    'let count = 0;',
219
    'for(let key in state.player.resources){',
220
    '  if (Object.keys(data.resources[key].elements).length === 0 &&',
221
    '      player.resources[key].unlocked) {',
222
    '    count++;',
223
    '  }',
224
    '}',
225
    'return count;',
226
    '})()'
227
  ]
228
};
229
230
// Total radioisotopes
231
let totalRadioisotopes = Object.keys(radioisotopes).length;
232
233
achievements.total_radioisotopes = {
234
  name: 'Radioisotopes',
235
  description: 'Unlock all radioactive isotopes',
236
  goals: [totalRadioisotopes],
237
  progress: ['(() => {',
238
    'let count = 0;',
239
    'for(let key of '+JSON.stringify(radioisotopes)+'){',
240
    '  if (player.resources[key].unlocked) {',
241
    '    count++;',
242
    '  }',
243
    '}',
244
    'return count;',
245
    '})()'
246
  ]
247
};
248
249
// 'The most' achievements
250
let mostUnstable = '';
251
let lowestHalfLife = Infinity;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Infinity as lowestHalfLife. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
252
for(let isotope of radioisotopes){
253
  let element = Object.keys(resources[isotope].elements)[0];
254
  let halfLife = elements[element].isotopes[isotope].decay.half_life;
255
  if(halfLife < lowestHalfLife){
256
    lowestHalfLife = halfLife;
257
    mostUnstable = isotope;
258
  }
259
}
260
261
achievements.most_unstable = {
262
  name: 'Most unstable',
263
  description: 'Unlock the shortest lived isotope',
264
  goals: [1],
265
  condition: ['(() => {',
266
    'if (player.resources["'+mostUnstable+'"].unlocked) {',
267
    '  return true;',
268
    '}',
269
    'return false;',
270
    '})()'
271
  ]
272
};
273
274
let mostCharged = 0;
275
for(let resource in resources){
276
  if(resources[resource].charge > mostCharged){
277
    mostCharged = resources[resource].charge;
278
  }
279
}
280
281
let mostChargedIons = [];
282
for(let resource in resources){
283
  if(resources[resource].charge === mostCharged){
284
    mostChargedIons.push(resource);
285
  }
286
}
287
288
achievements.most_charged = {
289
  name: 'Most charged',
290
  description: 'Unlock an extremely charged ion',
291
  goals: [1],
292
  condition: ['(() => {',
293
    'let count = 0;',
294
    'for(let key of '+JSON.stringify(mostChargedIons)+'){',
295
    '  if (player.resources[key].unlocked) {',
296
    '    return true;',
297
    '  }',
298
    '}',
299
    'return false;',
300
    '})()'
301
  ]
302
};
303
304
let largestSize = 0;
305
for(let resource in resources){
306
  let size = 0;
307
  for(let element in resources[resource].elements){
308
    size += resources[resource].elements[element];
309
  }
310
  if(size >= largestSize){
311
    largestSize = size;
312
  }
313
}
314
315
let largestMolecules = [];
316
for(let resource in resources){
317
  let size = 0;
318
  for(let element in resources[resource].elements){
319
    size += resources[resource].elements[element];
320
  }
321
  if(size === largestSize){
322
    largestMolecules.push(resource);
323
  }
324
}
325
326
achievements.most_large = {
327
  name: 'Largest molecule',
328
  description: 'Unlock a gargantuan molecule',
329
  goals: [1],
330
  condition: ['(() => {',
331
    'let count = 0;',
332
    'for(let key of '+JSON.stringify(largestMolecules)+'){',
333
    '  if (player.resources[key].unlocked) {',
334
    '    return true;',
335
    '  }',
336
    '}',
337
    'return false;',
338
    '})()'
339
  ]
340
};
341
342
// All
343
achievements.resources_all = {
344
  name: 'All resources',
345
  description: 'Unlock every single resource',
346
  goals: [Object.keys(resources).length],
347
  progress: ['(() => {',
348
    'let count = 0;',
349
    'for(let key in data.resources){',
350
    '  if (player.resources[key].unlocked) {',
351
    '    count++;',
352
    '  }',
353
    '}',
354
    'return count;',
355
    '})()'
356
  ]
357
};
358
359
jsonfile.writeFileSync(args[0] + '/data/achievements.json', achievements, {
360
  spaces: 2
361
});
362