build_scripts/generate_achievements.js   A
last analyzed

Complexity

Total Complexity 29
Complexity/F 0

Size

Lines of Code 380
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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