gotchi-battler-game-logic 2.0.8 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.cursor/rules/cursor-rules.mdc +67 -0
  2. package/.cursor/rules/directory-structure.mdc +63 -0
  3. package/.cursor/rules/self-improvement.mdc +64 -0
  4. package/.cursor/rules/tech-stack.mdc +99 -0
  5. package/README.md +7 -3
  6. package/eslint.config.js +31 -0
  7. package/game-logic/index.js +2 -5
  8. package/game-logic/v1.4/constants.js +0 -23
  9. package/game-logic/v1.4/index.js +64 -56
  10. package/game-logic/v1.5/constants.js +0 -23
  11. package/game-logic/v1.5/index.js +27 -21
  12. package/game-logic/v1.6/constants.js +0 -23
  13. package/game-logic/v1.6/index.js +27 -21
  14. package/game-logic/v1.7/constants.js +0 -23
  15. package/game-logic/v1.7/helpers.js +18 -3
  16. package/game-logic/v1.7/index.js +24 -18
  17. package/game-logic/v1.8/constants.js +112 -0
  18. package/game-logic/v1.8/helpers.js +628 -0
  19. package/game-logic/v1.8/index.js +832 -0
  20. package/game-logic/v2.0/constants.js +112 -0
  21. package/game-logic/v2.0/helpers.js +713 -0
  22. package/game-logic/v2.0/index.js +782 -0
  23. package/game-logic/v2.0/statuses.json +439 -0
  24. package/package.json +11 -4
  25. package/schemas/crystal.js +14 -0
  26. package/schemas/effect.js +25 -0
  27. package/schemas/gotchi.js +53 -0
  28. package/schemas/ingameteam.js +14 -0
  29. package/schemas/item.js +13 -0
  30. package/schemas/leaderskill.js +15 -0
  31. package/schemas/leaderskillstatus.js +12 -0
  32. package/schemas/special.js +22 -0
  33. package/schemas/team.js +24 -0
  34. package/schemas/team.json +254 -116
  35. package/scripts/balancing/createCSV.js +1 -1
  36. package/scripts/balancing/createTrainingGotchis.js +267 -0
  37. package/scripts/balancing/extractOnchainTraits.js +61 -0
  38. package/scripts/balancing/fixTrainingGotchis.js +41 -41
  39. package/scripts/balancing/processSims.js +6 -6
  40. package/scripts/balancing/sims.js +10 -17
  41. package/scripts/balancing/v1.7/mapGotchi.js +119 -0
  42. package/scripts/balancing/v1.7/setTeamPositions.js +2 -2
  43. package/scripts/balancing/v1.7/training_gotchis_traits.json +520 -0
  44. package/scripts/balancing/v1.7.1/mapGotchi.js +119 -0
  45. package/scripts/balancing/v1.7.1/setTeamPositions.js +2 -2
  46. package/scripts/balancing/v1.7.1/training_gotchis_traits.json +520 -0
  47. package/scripts/balancing/v1.7.2/mapGotchi.js +157 -0
  48. package/scripts/balancing/v1.7.2/setTeamPositions.js +2 -2
  49. package/scripts/balancing/v1.7.2/training_gotchis_traits.json +520 -0
  50. package/scripts/balancing/v1.7.3/class_combos.js +44 -0
  51. package/scripts/balancing/v1.7.3/mapGotchi.js +164 -0
  52. package/scripts/balancing/v1.7.3/setTeamPositions.js +122 -0
  53. package/scripts/balancing/v1.7.3/training_gotchis.json +22402 -0
  54. package/scripts/balancing/v1.7.3/training_gotchis_traits.json +37 -0
  55. package/scripts/balancing/v1.7.3/trait_combos.json +10 -0
  56. package/scripts/data/dungeon_mob_1.json +87 -0
  57. package/scripts/data/dungeon_mob_2.json +87 -0
  58. package/scripts/data/immaterialTeam1.json +374 -0
  59. package/scripts/data/immaterialTeam2.json +365 -0
  60. package/scripts/data/tournaments.json +5 -0
  61. package/scripts/generateAllSpecialsLogs.js +93 -0
  62. package/scripts/generateSpecialLogs.js +94 -0
  63. package/scripts/runCampaignBattles.js +41 -0
  64. package/scripts/runLocalBattle.js +6 -3
  65. package/scripts/runLocalDungeon.js +52 -0
  66. package/scripts/runPvPBattle.js +16 -0
  67. package/scripts/runRealBattle.js +8 -8
  68. package/scripts/simRealBattle.js +8 -8
  69. package/scripts/validateBattle.js +23 -16
  70. package/scripts/validateTournament.js +9 -9
  71. package/tests/getModifiedStats.test.js +78 -0
  72. package/utils/errors.js +13 -13
  73. package/utils/transforms.js +2 -8
  74. package/scripts/output/.gitkeep +0 -0
@@ -0,0 +1,520 @@
1
+ {
2
+ "godlike": {
3
+ "cleaver": {
4
+ "brs": 783,
5
+ "nrg": [2,97],
6
+ "agg": [null,111],
7
+ "spk": [-2,101],
8
+ "brn": [-8,107],
9
+ "eys": [null,94],
10
+ "eyc": [null,94]
11
+ },
12
+ "cursed": {
13
+ "brs": 783,
14
+ "nrg": [2,97],
15
+ "agg": [-1,100],
16
+ "spk": [null,111],
17
+ "brn": [-9,108],
18
+ "eys": [null,94],
19
+ "eyc": [null,94]
20
+ },
21
+ "mage": {
22
+ "brs": 783,
23
+ "nrg": [1,103],
24
+ "agg": [-2,101],
25
+ "spk": [1,98],
26
+ "brn": [null,114],
27
+ "eys": [null,94],
28
+ "eyc": [null,94]
29
+ },
30
+ "ninja": {
31
+ "brs": 783,
32
+ "nrg": [null,110],
33
+ "agg": [1,98],
34
+ "spk": [-2,101],
35
+ "brn": [-8,107],
36
+ "eys": [null,94],
37
+ "eyc": [null,94]
38
+ },
39
+ "troll": {
40
+ "brs": 783,
41
+ "nrg": [-4,103],
42
+ "agg": [-2,101],
43
+ "spk": [-2,101],
44
+ "brn": [-12],
45
+ "eys": [null,94],
46
+ "eyc": [null,94]
47
+ },
48
+ "healer": {
49
+ "brs": 783,
50
+ "nrg": [-1,100],
51
+ "agg": [-2,101],
52
+ "spk": [-15],
53
+ "brn": [-2,101],
54
+ "eys": [null,94],
55
+ "eyc": [null,94]
56
+ },
57
+ "tank": {
58
+ "brs": 783,
59
+ "nrg": [0,99],
60
+ "agg": [-15],
61
+ "spk": [1,98],
62
+ "brn": [-6,105],
63
+ "eys": [null,94],
64
+ "eyc": [null,94]
65
+ },
66
+ "enlightened": {
67
+ "brs": 783,
68
+ "nrg": [-13],
69
+ "agg": [-1,100],
70
+ "spk": [-1,100],
71
+ "brn": [-5,104],
72
+ "eys": [null,94],
73
+ "eyc": [null,94]
74
+ }
75
+ },
76
+ "mythical": {
77
+ "ninja": {
78
+ "brs": 690,
79
+ "nrg": [null,108],
80
+ "agg": [0,99],
81
+ "spk": [3,96],
82
+ "brn": [1,98],
83
+ "eys": [null,91],
84
+ "eyc": [null,92]
85
+ },
86
+ "cleaver": {
87
+ "brs": 690,
88
+ "nrg": [1,101],
89
+ "agg": [null,109],
90
+ "spk": [4,95],
91
+ "brn": [3,96],
92
+ "eys": [null,91],
93
+ "eyc": [null,92]
94
+ },
95
+ "cursed": {
96
+ "brs": 690,
97
+ "nrg": [3,97],
98
+ "agg": [1,98],
99
+ "spk": [null,108],
100
+ "brn": [1,98],
101
+ "eys": [null,91],
102
+ "eyc": [null,92]
103
+ },
104
+ "mage": {
105
+ "brs": 690,
106
+ "nrg": [2,98],
107
+ "agg": [2,98],
108
+ "spk": [3,96],
109
+ "brn": [null,109],
110
+ "eys": [null,91],
111
+ "eyc": [null,92]
112
+ },
113
+ "troll": {
114
+ "brs": 690,
115
+ "nrg": [0,99],
116
+ "agg": [1,98],
117
+ "spk": [4,95],
118
+ "brn": [-10],
119
+ "eys": [null,91],
120
+ "eyc": [null,92]
121
+ },
122
+ "healer": {
123
+ "brs": 690,
124
+ "nrg": [1,98],
125
+ "agg": [4,95],
126
+ "spk": [-15],
127
+ "brn": [5,94],
128
+ "eys": [null,91],
129
+ "eyc": [null,92]
130
+ },
131
+ "tank": {
132
+ "brs": 690,
133
+ "nrg": [1,98],
134
+ "agg": [-7],
135
+ "spk": [1,98],
136
+ "brn": [0,99],
137
+ "eys": [null,91],
138
+ "eyc": [null,92]
139
+ },
140
+ "enlightened": {
141
+ "brs": 690,
142
+ "nrg": [-10],
143
+ "agg": [3,96],
144
+ "spk": [2,97],
145
+ "brn": [0,99],
146
+ "eys": [null,92],
147
+ "eyc": [null,91]
148
+ }
149
+ },
150
+ "legendary": {
151
+ "ninja": {
152
+ "brs": 638,
153
+ "nrg": [null,106],
154
+ "agg": [4,95],
155
+ "spk": [5,94],
156
+ "brn": [5,94],
157
+ "eys": [null,90],
158
+ "eyc": [null,90]
159
+ },
160
+ "cleaver": {
161
+ "brs": 638,
162
+ "nrg": [5,94],
163
+ "agg": [null,105],
164
+ "spk": [4,95],
165
+ "brn": [-1,95],
166
+ "eys": [null,90],
167
+ "eyc": [null,90]
168
+ },
169
+ "cursed": {
170
+ "brs": 638,
171
+ "nrg": [4,95],
172
+ "agg": [6,93],
173
+ "spk": [null,106],
174
+ "brn": [4,95],
175
+ "eys": [null,90],
176
+ "eyc": [null,90]
177
+ },
178
+ "mage": {
179
+ "brs": 638,
180
+ "nrg": [4,96],
181
+ "agg": [6,93],
182
+ "spk": [6,93],
183
+ "brn": [null,107],
184
+ "eys": [null,90],
185
+ "eyc": [null,90]
186
+ },
187
+ "troll": {
188
+ "brs": 638,
189
+ "nrg": [4,95],
190
+ "agg": [5,94],
191
+ "spk": [3,96],
192
+ "brn": [-5],
193
+ "eys": [null,90],
194
+ "eyc": [null,90]
195
+ },
196
+ "healer": {
197
+ "brs": 638,
198
+ "nrg": [4,95],
199
+ "agg": [6,93],
200
+ "spk": [-7],
201
+ "brn": [4,95],
202
+ "eys": [null,90],
203
+ "eyc": [null,90]
204
+ },
205
+ "tank": {
206
+ "brs": 638,
207
+ "nrg": [3,96],
208
+ "agg": [-6],
209
+ "spk": [5,94],
210
+ "brn": [5,94],
211
+ "eys": [null,90],
212
+ "eyc": [null,90]
213
+ },
214
+ "enlightened": {
215
+ "brs": 638,
216
+ "nrg": [-6],
217
+ "agg": [6,93],
218
+ "spk": [4,95],
219
+ "brn": [3,96],
220
+ "eys": [null,90],
221
+ "eyc": [null,90]
222
+ }
223
+ },
224
+ "rare": {
225
+ "ninja": {
226
+ "brs": 597,
227
+ "nrg": [null,103],
228
+ "agg": [7,92],
229
+ "spk": [8,91],
230
+ "brn": [8,91],
231
+ "eys": [null,88],
232
+ "eyc": [null,89]
233
+ },
234
+ "cleaver": {
235
+ "brs": 597,
236
+ "nrg": [9,90],
237
+ "agg": [null,105],
238
+ "spk": [8,91],
239
+ "brn": [8,91],
240
+ "eys": [null,88],
241
+ "eyc": [null,89]
242
+ },
243
+ "cursed": {
244
+ "brs": 597,
245
+ "nrg": [9,90],
246
+ "agg": [7,92],
247
+ "spk": [null,103],
248
+ "brn": [7,92],
249
+ "eys": [null,88],
250
+ "eyc": [null,89]
251
+ },
252
+ "mage": {
253
+ "brs": 597,
254
+ "nrg": [8,91],
255
+ "agg": [7,92],
256
+ "spk": [8,91],
257
+ "brn": [null,103],
258
+ "eys": [null,88],
259
+ "eyc": [null,89]
260
+ },
261
+ "troll": {
262
+ "brs": 597,
263
+ "nrg": [9,90],
264
+ "agg": [7,92],
265
+ "spk": [7,92],
266
+ "brn": [-4],
267
+ "eys": [null,88],
268
+ "eyc": [null,89]
269
+ },
270
+ "healer": {
271
+ "brs": 597,
272
+ "nrg": [8,91],
273
+ "agg": [7,92],
274
+ "spk": [-3],
275
+ "brn": [7,92],
276
+ "eys": [null,89],
277
+ "eyc": [null,88]
278
+ },
279
+ "tank": {
280
+ "brs": 597,
281
+ "nrg": [7,92],
282
+ "agg": [-3],
283
+ "spk": [8,91],
284
+ "brn": [7,92],
285
+ "eys": [null,88],
286
+ "eyc": [null,89]
287
+ },
288
+ "enlightened": {
289
+ "brs": 597,
290
+ "nrg": [-2],
291
+ "agg": [7,92],
292
+ "spk": [7,92],
293
+ "brn": [7,92],
294
+ "eys": [null,88],
295
+ "eyc": [null,89]
296
+ }
297
+ },
298
+ "uncommon": {
299
+ "ninja": {
300
+ "brs": 556,
301
+ "nrg": [null,102],
302
+ "agg": [12,87],
303
+ "spk": [13,86],
304
+ "brn": [12,87],
305
+ "eys": [null,87],
306
+ "eyc": [null,87]
307
+ },
308
+ "cleaver": {
309
+ "brs": 556,
310
+ "nrg": [12,87],
311
+ "agg": [null,102],
312
+ "spk": [13,86],
313
+ "brn": [11,88],
314
+ "eys": [null,87],
315
+ "eyc": [null,87]
316
+ },
317
+ "cursed": {
318
+ "brs": 556,
319
+ "nrg": [12,87],
320
+ "agg": [12,87],
321
+ "spk": [null,102],
322
+ "brn": [12,87],
323
+ "eys": [null,87],
324
+ "eyc": [null,87]
325
+ },
326
+ "mage": {
327
+ "brs": 556,
328
+ "nrg": [12,87],
329
+ "agg": [11,88],
330
+ "spk": [13,86],
331
+ "brn": [null,102],
332
+ "eys": [null,87],
333
+ "eyc": [null,87]
334
+ },
335
+ "troll": {
336
+ "brs": 556,
337
+ "nrg": [13,86],
338
+ "agg": [12,87],
339
+ "spk": [13,86],
340
+ "brn": [-4],
341
+ "eys": [null,87],
342
+ "eyc": [null,88]
343
+ },
344
+ "healer": {
345
+ "brs": 556,
346
+ "nrg": [13,86],
347
+ "agg": [12,87],
348
+ "spk": [-3],
349
+ "brn": [11,88],
350
+ "eys": [null,87],
351
+ "eyc": [null,87]
352
+ },
353
+ "tank": {
354
+ "brs": 556,
355
+ "nrg": [12,87],
356
+ "agg": [-3],
357
+ "spk": [12,87],
358
+ "brn": [13,87],
359
+ "eys": [null,87],
360
+ "eyc": [null,87]
361
+ },
362
+ "enlightened": {
363
+ "brs": 556,
364
+ "nrg": [-3],
365
+ "agg": [11,88],
366
+ "spk": [13,86],
367
+ "brn": [12,87],
368
+ "eys": [null,87],
369
+ "eyc": [null,87]
370
+ }
371
+ },
372
+ "common": {
373
+ "ninja": {
374
+ "brs": 501,
375
+ "nrg": [null,95],
376
+ "agg": [21,78],
377
+ "spk": [22,77],
378
+ "brn": [21,78],
379
+ "eys": [null,82],
380
+ "eyc": [null,83]
381
+ },
382
+ "cleaver": {
383
+ "brs": 501,
384
+ "nrg": [22,77],
385
+ "agg": [null,96],
386
+ "spk": [21,78],
387
+ "brn": [21,78],
388
+ "eys": [null,82],
389
+ "eyc": [null,83]
390
+ },
391
+ "cursed": {
392
+ "brs": 501,
393
+ "nrg": [22,77],
394
+ "agg": [21,78],
395
+ "spk": [null,96],
396
+ "brn": [21,78],
397
+ "eys": [null,82],
398
+ "eyc": [null,83]
399
+ },
400
+ "mage": {
401
+ "brs": 501,
402
+ "nrg": [22,77],
403
+ "agg": [21,79],
404
+ "spk": [22,77],
405
+ "brn": [null,96],
406
+ "eys": [null,82],
407
+ "eyc": [null,83]
408
+ },
409
+ "troll": {
410
+ "brs": 501,
411
+ "nrg": [22,77],
412
+ "agg": [22,77],
413
+ "spk": [22,77],
414
+ "brn": [3],
415
+ "eys": [null,83],
416
+ "eyc": [null,84]
417
+ },
418
+ "healer": {
419
+ "brs": 501,
420
+ "nrg": [22,77],
421
+ "agg": [22,77],
422
+ "spk": [3],
423
+ "brn": [21,78],
424
+ "eys": [null,83],
425
+ "eyc": [null,82]
426
+ },
427
+ "tank": {
428
+ "brs": 501,
429
+ "nrg": [22,77],
430
+ "agg": [3],
431
+ "spk": [22,77],
432
+ "brn": [21,78],
433
+ "eys": [null,83],
434
+ "eyc": [null,82]
435
+ },
436
+ "enlightened": {
437
+ "brs": 501,
438
+ "nrg": [4],
439
+ "agg": [21,78],
440
+ "spk": [22,77],
441
+ "brn": [21,78],
442
+ "eys": [null,83],
443
+ "eyc": [null,82]
444
+ }
445
+ },
446
+ "garbage": {
447
+ "ninja": {
448
+ "brs": 400,
449
+ "nrg": [null,51],
450
+ "agg": [49,50],
451
+ "spk": [49,50],
452
+ "brn": [49,50],
453
+ "eys": [null,50],
454
+ "eyc": [null,50]
455
+ },
456
+ "cleaver": {
457
+ "brs": 400,
458
+ "nrg": [49,50],
459
+ "agg": [null,50],
460
+ "spk": [49,50],
461
+ "brn": [49,50],
462
+ "eys": [null,50],
463
+ "eyc": [null,50]
464
+ },
465
+ "cursed": {
466
+ "brs": 400,
467
+ "nrg": [49,50],
468
+ "agg": [49,50],
469
+ "spk": [null,50],
470
+ "brn": [49,50],
471
+ "eys": [null,50],
472
+ "eyc": [null,50]
473
+ },
474
+ "mage": {
475
+ "brs": 400,
476
+ "nrg": [49,50],
477
+ "agg": [49,50],
478
+ "spk": [49,50],
479
+ "brn": [null,50],
480
+ "eys": [null,50],
481
+ "eyc": [null,50]
482
+ },
483
+ "troll": {
484
+ "brs": 400,
485
+ "nrg": [49,50],
486
+ "agg": [49,50],
487
+ "spk": [49,50],
488
+ "brn": [49],
489
+ "eys": [null,50],
490
+ "eyc": [null,50]
491
+ },
492
+ "healer": {
493
+ "brs": 400,
494
+ "nrg": [49,50],
495
+ "agg": [49,50],
496
+ "spk": [49],
497
+ "brn": [49,50],
498
+ "eys": [null,50],
499
+ "eyc": [null,50]
500
+ },
501
+ "tank": {
502
+ "brs": 400,
503
+ "nrg": [49,50],
504
+ "agg": [49],
505
+ "spk": [49,50],
506
+ "brn": [49,50],
507
+ "eys": [null,50],
508
+ "eyc": [null,50]
509
+ },
510
+ "enlightened": {
511
+ "brs": 400,
512
+ "nrg": [49],
513
+ "agg": [49,50],
514
+ "spk": [49,50],
515
+ "brn": [49,50],
516
+ "eys": [null,50],
517
+ "eyc": [null,50]
518
+ }
519
+ }
520
+ }
@@ -0,0 +1,44 @@
1
+ const generateClassCombinations = () => {
2
+ // Generate combinations of the 8 classes for the 4 non-leader spots
3
+ const combinations = []
4
+
5
+ for (let i = 1; i <= 8; i++) {
6
+ for (let j = 1; j <= 8; j++) {
7
+ for (let k = 1; k <= 8; k++) {
8
+ for (let l = 1; l <= 8; l++) {
9
+ combinations.push([i, j, k, l].sort())
10
+ }
11
+ }
12
+ }
13
+ }
14
+
15
+ // Remove duplicate combinations, so [1,1,1,1] is allowed but [1,1,1,2] and [1,1,2,1] are duplicates
16
+ // Keep as numbers for now, convert to strings to remove duplicates, then convert back to numbers
17
+ const uniqueCombinations = [...new Set(combinations.map((combination) => combination.join('')))].map((combination) => combination.split('').map((number) => parseInt(number)))
18
+
19
+ return uniqueCombinations
20
+ }
21
+
22
+ const getCombinationsForALeader = (leaderClass) => {
23
+ const combinations = generateClassCombinations()
24
+
25
+ const combinationsForALeader = combinations.map((combination) => {
26
+ return [leaderClass, ...combination]
27
+ })
28
+
29
+ return combinationsForALeader
30
+ }
31
+
32
+ const getAllClassCombos = () => {
33
+ const allClassCombos = []
34
+
35
+ for (let i = 1; i <= 8; i++) {
36
+ allClassCombos.push(...getCombinationsForALeader(i))
37
+ }
38
+
39
+ return allClassCombos
40
+ }
41
+
42
+ const allClassCombos = getAllClassCombos()
43
+
44
+ module.exports = allClassCombos
@@ -0,0 +1,164 @@
1
+ const mapTeam = (team) => {
2
+ for(const gotchi of team.formation.front) {
3
+ if (gotchi) mapGotchi(gotchi)
4
+ }
5
+
6
+ for(const gotchi of team.formation.back) {
7
+ if (gotchi) mapGotchi(gotchi)
8
+ }
9
+ }
10
+
11
+ // This is copied/hacked from the mapGotchi function in the backend
12
+ const mapGotchi = (gotchi) => {
13
+ const traitMaps = {
14
+ speed: {
15
+ baseValue: 85,
16
+ brsMultiplier: 0.05,
17
+ multiplier: 1,
18
+ traitKey: 0,
19
+ isNegative: false
20
+ },
21
+ health: {
22
+ baseValue: 0,
23
+ brsMultiplier: 1,
24
+ multiplier: 5,
25
+ traitKey: 0,
26
+ isNegative: true
27
+ },
28
+ crit: {
29
+ baseValue: 0,
30
+ brsMultiplier: 0.015,
31
+ multiplier: 0.3,
32
+ traitKey: 1,
33
+ isNegative: false
34
+ },
35
+ armor: {
36
+ baseValue: 0,
37
+ brsMultiplier: 0.1,
38
+ multiplier: 0.7,
39
+ traitKey: 1,
40
+ isNegative: true
41
+ },
42
+ evade: {
43
+ baseValue: 0,
44
+ brsMultiplier: 0.015,
45
+ multiplier: 0.15,
46
+ traitKey: 2,
47
+ isNegative: false
48
+ },
49
+ resist: {
50
+ baseValue: 0,
51
+ brsMultiplier: 0.05,
52
+ multiplier: 0.5,
53
+ traitKey: 2,
54
+ isNegative: true
55
+ },
56
+ magic: {
57
+ baseValue: 0,
58
+ brsMultiplier: 0.5,
59
+ multiplier: 3,
60
+ traitKey: 3,
61
+ isNegative: false
62
+ },
63
+ physical: {
64
+ baseValue: 0,
65
+ brsMultiplier: 0.5,
66
+ multiplier: 3,
67
+ traitKey: 3,
68
+ isNegative: true
69
+ },
70
+ accuracy: {
71
+ baseValue: 50,
72
+ brsMultiplier: 0,
73
+ multiplier: 0.5,
74
+ traitKey: 45,
75
+ isNegative: false
76
+ }
77
+ }
78
+
79
+ const traitValue = (trait) => {
80
+ return trait < 50 ? 50 - trait : trait - 50 + 1
81
+ }
82
+
83
+ const onchainVals = [
84
+ gotchi.nrg,
85
+ gotchi.agg,
86
+ gotchi.spk,
87
+ gotchi.brn,
88
+ gotchi.eyc,
89
+ gotchi.eys
90
+ ]
91
+ // Convert trait value to in-game value
92
+ const traitValues = onchainVals.map(x => { return traitValue(x) })
93
+
94
+ // Map traits
95
+ for(const trait in traitMaps) {
96
+ const traitMap = traitMaps[trait]
97
+ const onchainVal = onchainVals[traitMap.traitKey]
98
+
99
+ let base = traitMap.baseValue + (gotchi.brs * traitMap.brsMultiplier)
100
+
101
+ let newTrait
102
+ if (trait !== 'accuracy') {
103
+ if (traitMap.isNegative) {
104
+ newTrait = onchainVal < 50 ? base + (traitValues[traitMap.traitKey] * traitMap.multiplier) : base
105
+ } else {
106
+ newTrait = onchainVal < 50 ? base : base + (traitValues[traitMap.traitKey] * traitMap.multiplier)
107
+ }
108
+ } else {
109
+ newTrait = base + ((traitValues[4] + traitValues[5]) * traitMap.multiplier)
110
+ }
111
+
112
+ if (['speed', 'health', 'armor', 'resist', 'magic', 'physical', 'accuracy'].includes(trait)) {
113
+ newTrait = Math.round(newTrait)
114
+ } else {
115
+ // Round to 2 decimal places
116
+ newTrait = Math.round(newTrait * 100) / 100
117
+ }
118
+
119
+ gotchi[trait] = newTrait
120
+ }
121
+ }
122
+
123
+ module.exports = {
124
+ mapGotchi,
125
+ mapTeam
126
+ }
127
+
128
+ // node scripts/balancing/v1.7.3/mapGotchi.js
129
+ if (require.main === module) {
130
+ const gotchi1 = {
131
+ brs: 729,
132
+ nrg: 112,
133
+ agg: 112,
134
+ spk: 75,
135
+ brn: 112,
136
+ eyc: 97,
137
+ eys: 96
138
+ }
139
+
140
+ const gotchi2 = {
141
+ brs: 847,
142
+ nrg: 109,
143
+ agg: 102,
144
+ spk: 109,
145
+ brn: 99,
146
+ eyc: 93,
147
+ eys: 0
148
+ }
149
+
150
+ mapGotchi(gotchi1)
151
+ mapGotchi(gotchi2)
152
+
153
+ console.log({
154
+ speed: [gotchi1.speed, gotchi2.speed],
155
+ health: [gotchi1.health, gotchi2.health],
156
+ crit: [gotchi1.crit, gotchi2.crit],
157
+ armor: [gotchi1.armor, gotchi2.armor],
158
+ evade: [gotchi1.evade, gotchi2.evade],
159
+ resist: [gotchi1.resist, gotchi2.resist],
160
+ magic: [gotchi1.magic, gotchi2.magic],
161
+ physical: [gotchi1.physical, gotchi2.physical],
162
+ accuracy: [gotchi1.accuracy, gotchi2.accuracy]
163
+ })
164
+ }