@massif/lancer-data 4.0.0-beta.22 → 4.0.0-beta.23
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.
- package/lib/actions.json +2 -2
- package/lib/frames.json +7 -7
- package/lib/mods.json +1 -1
- package/lib/reserves.json +13 -0
- package/lib/systems.json +2 -3
- package/lib/tags.json +25 -5
- package/lib/talents.json +4 -4
- package/lib/weapons.json +2 -2
- package/package.json +5 -2
- package/scripts/aptitude_export.js +0 -134
- package/scripts/build.js +0 -14
- package/scripts/output/equipment.csv +0 -86
- package/scripts/test.js +0 -19
package/lib/actions.json
CHANGED
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
"activation": "Full",
|
|
234
234
|
"terse": "Attack with a fist, rifle butt, or improvised weapon in melee.",
|
|
235
235
|
"detail": "The NPC makes a melee attack with a bonus of +1/2/3 and deals 3/4/6 damage, based on their Tier",
|
|
236
|
-
"damage": { "type": "kinetic", "val":
|
|
236
|
+
"damage": { "type": "kinetic", "val": 3, "attack": "melee" },
|
|
237
237
|
"hidden": true
|
|
238
238
|
},
|
|
239
239
|
{
|
|
@@ -310,7 +310,7 @@
|
|
|
310
310
|
"damage": [{ "type": "heat", "val": 2 }]
|
|
311
311
|
},
|
|
312
312
|
{
|
|
313
|
-
"id": "
|
|
313
|
+
"id": "act_jockey_damage",
|
|
314
314
|
"name": "Damage",
|
|
315
315
|
"activation": "Jockey",
|
|
316
316
|
"terse": "Deal 4 Kinetic Damage",
|
package/lib/frames.json
CHANGED
|
@@ -705,7 +705,7 @@
|
|
|
705
705
|
"use": "Encounter",
|
|
706
706
|
"activation": "Protocol"
|
|
707
707
|
},
|
|
708
|
-
|
|
708
|
+
|
|
709
709
|
"image_url": "https://d2c79xe1p61csc.cloudfront.net/frames/mf_vlad.png",
|
|
710
710
|
"license_id": "mf_vlad"
|
|
711
711
|
},
|
|
@@ -867,7 +867,7 @@
|
|
|
867
867
|
"use": "Encounter",
|
|
868
868
|
"activation": "Protocol"
|
|
869
869
|
},
|
|
870
|
-
|
|
870
|
+
|
|
871
871
|
"image_url": "https://d2c79xe1p61csc.cloudfront.net/frames/mf_deaths_head.png",
|
|
872
872
|
"license_id": "mf_deaths_head"
|
|
873
873
|
},
|
|
@@ -1784,7 +1784,7 @@
|
|
|
1784
1784
|
"frequency": "1/round",
|
|
1785
1785
|
"condition": "You take heat.",
|
|
1786
1786
|
"detail": "You may deal 2 AP energy damage to a character within range 3.",
|
|
1787
|
-
"damage": [{ "val":
|
|
1787
|
+
"damage": [{ "val": 2, "type": "Energy", "ap": true }],
|
|
1788
1788
|
"range": [{ "type": "Range", "val": 3 }]
|
|
1789
1789
|
}
|
|
1790
1790
|
]
|
|
@@ -1964,7 +1964,7 @@
|
|
|
1964
1964
|
"name": "Fire Omnigun",
|
|
1965
1965
|
"activation": "Free",
|
|
1966
1966
|
"frequency": "1/round",
|
|
1967
|
-
"damage": [{ "val":
|
|
1967
|
+
"damage": [{ "val": 1, "type": "Kinetic", "ap": true }],
|
|
1968
1968
|
"range": [{ "type": "Range", "val": 15 }],
|
|
1969
1969
|
"detail": "1/round, as a free action during your turn, deal 1 AP kinetic damage to a character within Range 15 and line of sight. This doesn’t count as an attack, hits automatically, ignores cover, bypasses Immunity, and its damage can’t be reduced or ignored in any way. No rule supersedes this."
|
|
1970
1970
|
}
|
|
@@ -2131,8 +2131,8 @@
|
|
|
2131
2131
|
"condition": "The next time you exceed your Heat Cap this scene",
|
|
2132
2132
|
"detail": "Clear all heat and vent a burst 3 cloud of burning matter from your mech.<br>Until the start of your next turn, all characters within the affected area count as Invisible to everyone except you, and characters other than you take 2 burn and 2 heat when they start their turn in the area or enter it for the first time in a round. Once this effect ends, characters within the affected area receive soft cover (which you ignore) until the start of your following turn, at which point the cloud disperses.",
|
|
2133
2133
|
"damage": [
|
|
2134
|
-
{ "val":
|
|
2135
|
-
{ "val":
|
|
2134
|
+
{ "val": 2, "type": "Burn", "aoe": true },
|
|
2135
|
+
{ "val": 2, "type": "Heat", "aoe": true }
|
|
2136
2136
|
],
|
|
2137
2137
|
"add_status": [
|
|
2138
2138
|
{
|
|
@@ -2218,7 +2218,7 @@
|
|
|
2218
2218
|
"name": "Death Cloud",
|
|
2219
2219
|
"condition": "Any hostile characters within range 50 make any movement other than their standard move (including involuntary movement).",
|
|
2220
2220
|
"detail": "For the rest of the scene, when hostile characters make any movement other than their standard move (including involuntary movement), they take 3 AP explosive damage. This effect can trigger any number of times, but only 1/round for each character.",
|
|
2221
|
-
"damage": [{ "val":
|
|
2221
|
+
"damage": [{ "val": 3, "type": "Explosive", "ap": true, "aoe": true }]
|
|
2222
2222
|
}
|
|
2223
2223
|
],
|
|
2224
2224
|
"use": "Encounter",
|
package/lib/mods.json
CHANGED
package/lib/reserves.json
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"id": "reserve_sp",
|
|
4
|
+
"name": "System Point",
|
|
5
|
+
"type": "Bonus",
|
|
6
|
+
"label": "Bonus",
|
|
7
|
+
"description": "Add a System Point to your active mech's Max SP value",
|
|
8
|
+
"bonuses": [
|
|
9
|
+
{
|
|
10
|
+
"id": "sp",
|
|
11
|
+
"val": 1
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
},
|
|
2
15
|
{
|
|
3
16
|
"id": "reserve_skill",
|
|
4
17
|
"name": "Skill Point",
|
package/lib/systems.json
CHANGED
|
@@ -982,7 +982,7 @@
|
|
|
982
982
|
"damage": [
|
|
983
983
|
{
|
|
984
984
|
"type": "Kinetic",
|
|
985
|
-
"val":
|
|
985
|
+
"val": 2
|
|
986
986
|
}
|
|
987
987
|
]
|
|
988
988
|
},
|
|
@@ -993,7 +993,7 @@
|
|
|
993
993
|
"damage": [
|
|
994
994
|
{
|
|
995
995
|
"type": "Kinetic",
|
|
996
|
-
"val":
|
|
996
|
+
"val": 10,
|
|
997
997
|
"ap": true
|
|
998
998
|
}
|
|
999
999
|
]
|
|
@@ -2745,7 +2745,6 @@
|
|
|
2745
2745
|
"name": "Metafold Carver",
|
|
2746
2746
|
"type": "Tech",
|
|
2747
2747
|
"sp": 2,
|
|
2748
|
-
"tags": [],
|
|
2749
2748
|
"source": "HORUS",
|
|
2750
2749
|
"license": "Minotaur",
|
|
2751
2750
|
"license_level": 2,
|
package/lib/tags.json
CHANGED
|
@@ -63,11 +63,6 @@
|
|
|
63
63
|
"name": "Loading",
|
|
64
64
|
"description": "This weapon must be reloaded after each use. Mechs can reload with Stabilize and some systems."
|
|
65
65
|
},
|
|
66
|
-
{
|
|
67
|
-
"id": "tg_loading",
|
|
68
|
-
"name": "Loading",
|
|
69
|
-
"description": "This weapon must be reloaded after each use. Mechs can reload with Stabilize and some systems."
|
|
70
|
-
},
|
|
71
66
|
{
|
|
72
67
|
"id": "tg_loading_after",
|
|
73
68
|
"name": "Loading (Multiple Uses)",
|
|
@@ -334,5 +329,30 @@
|
|
|
334
329
|
"name": "Irreducible",
|
|
335
330
|
"description": "Prohibits damage reduction from any source (HIDDEN TAG)",
|
|
336
331
|
"hidden": true
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"id": "tg_npc_system",
|
|
335
|
+
"name": "NPC System",
|
|
336
|
+
"description": "This NPC Feature is categorized as a SYSTEM"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"id": "tg_npc_weapon",
|
|
340
|
+
"name": "NPC Weapon",
|
|
341
|
+
"description": "This NPC Feature is categorized as a WEAPON"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"id": "tg_npc_trait",
|
|
345
|
+
"name": "NPC Trait",
|
|
346
|
+
"description": "This NPC Feature is categorized as a TRAIT"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"id": "tg_npc_reaction",
|
|
350
|
+
"name": "NPC Reaction",
|
|
351
|
+
"description": "This NPC Feature is categorized as a REACTION"
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"id": "tg_npc_tech",
|
|
355
|
+
"name": "NPC Tech Action",
|
|
356
|
+
"description": "This NPC Feature is categorized as a TECH ACTION"
|
|
337
357
|
}
|
|
338
358
|
]
|
package/lib/talents.json
CHANGED
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
"id": "knockback",
|
|
146
|
-
"val":
|
|
146
|
+
"val": 2,
|
|
147
147
|
"weapon_types": ["improvised"]
|
|
148
148
|
}
|
|
149
149
|
]
|
|
@@ -662,7 +662,7 @@
|
|
|
662
662
|
"name": "Invigorate",
|
|
663
663
|
"activation": "Quick",
|
|
664
664
|
"detail": "Send a pulse of energy to an allied character (including Drones) within Range 3, drawing a Line to them. You may extend the pulse from your target to another allied character, extending the Line to them, as long as they are within Range 3, and you may continue extending the pulse (and Line) like this as long as you don’t target the same character twice. Allied characters who are used as pulse targets or are in the Line’s path gain 4 Overshield; hostile characters in the Line’s path take 2 Energy damage instead.",
|
|
665
|
-
"damage": [{ "val":
|
|
665
|
+
"damage": [{ "val": 2, "type": "Energy", "aoe": true }],
|
|
666
666
|
"add_other": [{ "type": "overshield", "val": 4, "aoe": true }]
|
|
667
667
|
}
|
|
668
668
|
]
|
|
@@ -732,7 +732,7 @@
|
|
|
732
732
|
"detail": "The first time in a round that you perform a critical hit with a Heavy or Superheavy melee weapon, you deal 3 Kinetic damage to all characters and objects of your choice within Threat, other than the one you just attacked.",
|
|
733
733
|
"condition": "The first time you perform a critical hit with a Heavy or Superheavy melee weapon",
|
|
734
734
|
"frequency": "1/round",
|
|
735
|
-
"damage": [{ "val":
|
|
735
|
+
"damage": [{ "val": 3, "type": "Kinetic", "aoe": "Within Threat" }]
|
|
736
736
|
}
|
|
737
737
|
],
|
|
738
738
|
"synergies": [
|
|
@@ -973,7 +973,7 @@
|
|
|
973
973
|
"name": "SNOW_CRASH",
|
|
974
974
|
"detail": "When you hit with a tech attack that consumes Lock On, your target must choose to either take 2 Heat or be pushed 3 spaces in a direction of your choice.",
|
|
975
975
|
"condition": "You hit with a tech attack that consumes Lock On",
|
|
976
|
-
"damage": [{ "val":
|
|
976
|
+
"damage": [{ "val": 2, "type": "Heat" }]
|
|
977
977
|
}
|
|
978
978
|
],
|
|
979
979
|
"synergies": [
|
package/lib/weapons.json
CHANGED
|
@@ -2356,7 +2356,7 @@
|
|
|
2356
2356
|
"no_core_bonus": true,
|
|
2357
2357
|
"mount": "Heavy",
|
|
2358
2358
|
"type": "Rifle",
|
|
2359
|
-
|
|
2359
|
+
|
|
2360
2360
|
"range": [
|
|
2361
2361
|
{
|
|
2362
2362
|
"type": "Range",
|
|
@@ -2835,7 +2835,7 @@
|
|
|
2835
2835
|
"name": "Latch Drone",
|
|
2836
2836
|
"mount": "Main",
|
|
2837
2837
|
"type": "Launcher",
|
|
2838
|
-
|
|
2838
|
+
|
|
2839
2839
|
"range": [
|
|
2840
2840
|
{
|
|
2841
2841
|
"type": "Range",
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@massif/lancer-data",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.23",
|
|
4
4
|
"description": "Data for the LANCER TTRPG",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "node ./scripts/build.js",
|
|
8
|
-
"
|
|
8
|
+
"build:dev": "node ./scripts/build.js --dev",
|
|
9
|
+
"test": "node ./scripts/test.js",
|
|
10
|
+
"validate": "node ./scripts/validate.js",
|
|
11
|
+
"audit": "node ./scripts/audit.js"
|
|
9
12
|
},
|
|
10
13
|
"repository": {
|
|
11
14
|
"type": "git",
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
|
|
3
|
-
const weapons = require('../lib/weapons.json');
|
|
4
|
-
const systems = require('../lib/systems.json');
|
|
5
|
-
const mods = require('../lib/mods.json');
|
|
6
|
-
const frames = require('../lib/frames.json');
|
|
7
|
-
|
|
8
|
-
// const items = [weapons, systems, mods, frames]
|
|
9
|
-
const items = [weapons];
|
|
10
|
-
|
|
11
|
-
function row(x) {
|
|
12
|
-
if (x.data_type === 'weapon') return weaponRow(x);
|
|
13
|
-
return `${x.source},${x.name},0,0,0,0,0,0\n`;
|
|
14
|
-
// return `${x.data_type},${x.id},${x.source},${x.name},0,0,0,0,0,0\n`
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function weaponRow(x) {
|
|
18
|
-
// return `${x.data_type},${x.id},${x.source},${x.name},0,${rangedAp(x)},0,0,0,0\n`
|
|
19
|
-
return `${x.source},${x.name},${closeAp(x)},${rangedAp(x)},0,0,0,0\n`;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function getDamage(d, tags) {
|
|
23
|
-
let dscore = 0;
|
|
24
|
-
let guaranteed = 0;
|
|
25
|
-
let possible = 0;
|
|
26
|
-
if (typeof d.val === 'string') {
|
|
27
|
-
const dmgArr = d.val.split(/d|\+/g);
|
|
28
|
-
if (dmgArr.length === 1) guaranteed = parseInt(dmgArr[0]); // straight value, no dice
|
|
29
|
-
else {
|
|
30
|
-
if (dmgArr.length === 3) guaranteed = parseInt(dmgArr[2]); // bonus val
|
|
31
|
-
// handle dice
|
|
32
|
-
guaranteed += parseInt(dmgArr[0]); // min number we can get on the dice
|
|
33
|
-
possible = parseInt(dmgArr[0]) * parseInt(dmgArr[1]) - parseInt(dmgArr[0]);
|
|
34
|
-
}
|
|
35
|
-
// guaranteed = 1pt, possible = 0.5
|
|
36
|
-
dscore += guaranteed * (possible / 2);
|
|
37
|
-
} else {
|
|
38
|
-
guaranteed = d.val;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (tags.find((x) => x.id === 'tg_accurate')) dscore += possible * 0.25;
|
|
42
|
-
if (tags.find((x) => x.id === 'tg_inaccurate')) dscore -= possible * 0.25;
|
|
43
|
-
if (tags.find((x) => x.id === 'tg_reliable'))
|
|
44
|
-
dscore += tags.find((x) => x.id === 'tg_reliable').val * 3;
|
|
45
|
-
|
|
46
|
-
return dscore;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function closeAp(x) {
|
|
50
|
-
let score = 0;
|
|
51
|
-
const tags = x.tags || [];
|
|
52
|
-
if (x.type.toLowerCase() !== 'melee' || !x.damage || !x.damage.length) return score.toString();
|
|
53
|
-
|
|
54
|
-
x.damage.forEach((d) => {
|
|
55
|
-
score += getDamage(d, tags);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const threat = x.range.find((y) => y.type.toLowerCase() === 'threat');
|
|
59
|
-
// console.log(threat)
|
|
60
|
-
if (threat) score *= (threat.val + 1) / 2;
|
|
61
|
-
|
|
62
|
-
if (tags.find((x) => x.id === 'tg_ap')) score = score * 1.35;
|
|
63
|
-
if (tags.find((x) => x.id === 'tg_arcing')) score = score * 1.15;
|
|
64
|
-
if (tags.find((x) => x.id === 'tg_smart')) score = score * 1.15;
|
|
65
|
-
if (tags.find((x) => x.id === 'tg_overkill')) score = score * 1.15;
|
|
66
|
-
if (tags.find((x) => x.id === 'tg_loading')) score = score * 0.85;
|
|
67
|
-
|
|
68
|
-
return Math.ceil(score).toString();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function rangedAp(x) {
|
|
72
|
-
let score = 0;
|
|
73
|
-
const tags = x.tags || [];
|
|
74
|
-
if (
|
|
75
|
-
x.type.toLowerCase() === 'melee' ||
|
|
76
|
-
!x.range ||
|
|
77
|
-
!x.range.length ||
|
|
78
|
-
!x.damage ||
|
|
79
|
-
!x.damage.length
|
|
80
|
-
)
|
|
81
|
-
return score.toString();
|
|
82
|
-
x.damage.forEach((d) => {
|
|
83
|
-
score += getDamage(d, tags);
|
|
84
|
-
});
|
|
85
|
-
//collect range pts
|
|
86
|
-
x.range.forEach((r) => {
|
|
87
|
-
let rscore = 0;
|
|
88
|
-
if (typeof r.val === 'string') return 'XXXX';
|
|
89
|
-
if (r.type.toLowerCase() === 'range') {
|
|
90
|
-
if (r.val <= 10) score += r.val / 2;
|
|
91
|
-
else {
|
|
92
|
-
rscore += 5 + (r.val - 10);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (r.type.toLowerCase() === 'blast') {
|
|
96
|
-
rscore += Math.pow(r.val * 3, 2) / 2;
|
|
97
|
-
}
|
|
98
|
-
if (r.type.toLowerCase() === 'burst') {
|
|
99
|
-
rscore += Math.pow(r.val * 3, 2) / 3;
|
|
100
|
-
}
|
|
101
|
-
if (r.type.toLowerCase() === 'cone') {
|
|
102
|
-
rscore += Math.pow(r.val, 2) / 2;
|
|
103
|
-
}
|
|
104
|
-
if (r.type.toLowerCase() === 'line') {
|
|
105
|
-
rscore += r.val * 2;
|
|
106
|
-
}
|
|
107
|
-
if (r.type.toLowerCase() === 'thrown') {
|
|
108
|
-
rscore = score / 3;
|
|
109
|
-
}
|
|
110
|
-
score += rscore;
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
if (tags.find((x) => x.id === 'tg_ap')) score = score * 1.35;
|
|
114
|
-
if (tags.find((x) => x.id === 'tg_arcing')) score = score * 1.15;
|
|
115
|
-
if (tags.find((x) => x.id === 'tg_smart')) score = score * 1.15;
|
|
116
|
-
if (tags.find((x) => x.id === 'tg_overkill')) score = score * 1.15;
|
|
117
|
-
if (tags.find((x) => x.id === 'tg_loading')) score = score * 0.85;
|
|
118
|
-
|
|
119
|
-
return Math.ceil(score).toString();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// let output = 'TYPE,ID,SOURCE,NAME,CQB,RANGED,SURVIVABILITY,MANEUVERABILITY,SUPPORT,CONTROL\n'
|
|
123
|
-
let output = 'SOURCE,NAME,MELEE,RANGED,SURVIVABILITY,MANEUVERABILITY,SUPPORT,CONTROL\n';
|
|
124
|
-
|
|
125
|
-
items.forEach((e) => {
|
|
126
|
-
e.forEach((x) => {
|
|
127
|
-
output += row(x);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
fs.writeFile('./util/output/equipment.csv', output, function (err) {
|
|
132
|
-
if (err) return console.log(err);
|
|
133
|
-
console.log('Export Complete');
|
|
134
|
-
});
|
package/scripts/build.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
const zl = require('zip-lib');
|
|
2
|
-
|
|
3
|
-
const info = require('../package.json');
|
|
4
|
-
|
|
5
|
-
const filepath = './' + info.name + '-' + info.version + '.lcp';
|
|
6
|
-
|
|
7
|
-
zl.archiveFolder('./lib', filepath).then(
|
|
8
|
-
function () {
|
|
9
|
-
console.log('done');
|
|
10
|
-
},
|
|
11
|
-
function (err) {
|
|
12
|
-
console.log(err);
|
|
13
|
-
}
|
|
14
|
-
);
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
SOURCE,NAME,MELEE,RANGED,SURVIVABILITY,MANUVERABILITY,SUPPORT,CONTROL
|
|
2
|
-
GMS,ANTI-MATERIEL RIFLE,0,32,0,0,0,0
|
|
3
|
-
GMS,ASSAULT RIFLE,0,14,0,0,0,0
|
|
4
|
-
GMS,CHARGED BLADE,6,0,0,0,0,0
|
|
5
|
-
GMS,CYCLONE PULSE RIFLE,0,63,0,0,0,0
|
|
6
|
-
GMS,HEAVY CHARGED BLADE,14,0,0,0,0,0
|
|
7
|
-
GMS,HEAVY MACHINE GUN,0,32,0,0,0,0
|
|
8
|
-
GMS,HEAVY MELEE WEAPON,15,0,0,0,0,0
|
|
9
|
-
GMS,HOWITZER,0,40,0,0,0,0
|
|
10
|
-
GMS,MISSILE RACK,0,10,0,0,0,0
|
|
11
|
-
GMS,MORTAR,0,21,0,0,0,0
|
|
12
|
-
GMS,NEXUS (HUNTER-KILLER),0,9,0,0,0,0
|
|
13
|
-
GMS,NEXUS (LIGHT),0,7,0,0,0,0
|
|
14
|
-
GMS,PISTOL,0,7,0,0,0,0
|
|
15
|
-
GMS,SEGMENT KNIFE,3,0,0,0,0,0
|
|
16
|
-
GMS,ROCKET-PROPELLED GRENADE,0,24,0,0,0,0
|
|
17
|
-
GMS,SHOTGUN,0,5,0,0,0,0
|
|
18
|
-
GMS,TACTICAL KNIFE,2,0,0,0,0,0
|
|
19
|
-
GMS,TACTICAL MELEE WEAPON,8,0,0,0,0,0
|
|
20
|
-
GMS,THERMAL LANCE,0,30,0,0,0,0
|
|
21
|
-
GMS,THERMAL PISTOL,0,10,0,0,0,0
|
|
22
|
-
GMS,THERMAL RIFLE,0,8,0,0,0,0
|
|
23
|
-
IPS-N,CHAIN AXE,9,0,0,0,0,0
|
|
24
|
-
IPS-N,BRISTLECROWN FLECHETTE LAUNCHER,0,3,0,0,0,0
|
|
25
|
-
IPS-N,NANOCARBON SWORD,33,0,0,0,0,0
|
|
26
|
-
IPS-N,ASSAULT CANNON,0,14,0,0,0,0
|
|
27
|
-
IPS-N,CONCUSSION MISSILES,0,4,0,0,0,0
|
|
28
|
-
IPS-N,LEVIATHAN HEAVY ASSAULT CANNON,0,7,0,0,0,0
|
|
29
|
-
IPS-N,CUTTER MKII PLASMA TORCH,0,0,0,0,0,0
|
|
30
|
-
IPS-N,WAR PIKE,5,0,0,0,0,0
|
|
31
|
-
IPS-N,POWER KNUCKLES,2,0,0,0,0,0
|
|
32
|
-
IPS-N,HAND CANNON,0,7,0,0,0,0
|
|
33
|
-
IPS-N,BOLT THROWER,0,25,0,0,0,0
|
|
34
|
-
IPS-N,KINETIC HAMMER,32,0,0,0,0,0
|
|
35
|
-
IPS-N,DECK-SWEEPER AUTOMATIC SHOTGUN,0,9,0,0,0,0
|
|
36
|
-
IPS-N,DAISY CUTTER,0,47,0,0,0,0
|
|
37
|
-
IPS-N,CATALYTIC HAMMER,6,0,0,0,0,0
|
|
38
|
-
IPS-N,IMPACT LANCE,5,0,0,0,0,0
|
|
39
|
-
IPS-N,IMPALER NAILGUN,0,8,0,0,0,0
|
|
40
|
-
IPS-N,COMBAT DRILL,39,0,0,0,0,0
|
|
41
|
-
SSC,MAGNETIC CANNON,0,18,0,0,0,0
|
|
42
|
-
SSC,VULTURE DMR,0,19,0,0,0,0
|
|
43
|
-
SSC,RAILGUN,0,71,0,0,0,0
|
|
44
|
-
SSC,VEIL RIFLE,0,23,0,0,0,0
|
|
45
|
-
SSC,BURST LAUNCHER,0,14,0,0,0,0
|
|
46
|
-
SSC,RAIL RIFLE,0,25,0,0,0,0
|
|
47
|
-
SSC,SHOCK KNIFE,0,0,0,0,0,0
|
|
48
|
-
SSC,SHARANGA MISSILES,0,12,0,0,0,0
|
|
49
|
-
SSC,GANDIVA MISSILES,0,25,0,0,0,0
|
|
50
|
-
SSC,PINAKA MISSILES,0,34,0,0,0,0
|
|
51
|
-
SSC,FOLD KNIFE,2,0,0,0,0,0
|
|
52
|
-
SSC,VIJAYA ROCKETS,0,4,0,0,0,0
|
|
53
|
-
SSC,VARIABLE SWORD,0,0,0,0,0,0
|
|
54
|
-
SSC,ORACLE LMG-I,0,14,0,0,0,0
|
|
55
|
-
HORUS,NANOBOT WHIP,23,0,0,0,0,0
|
|
56
|
-
HORUS,SWARM/HIVE NANITES,0,3,0,0,0,0
|
|
57
|
-
HORUS,AUTOPOD,0,10,0,0,0,0
|
|
58
|
-
HORUS,VORPAL GUN,0,13,0,0,0,0
|
|
59
|
-
HORUS,GHOUL NEXUS,0,10,0,0,0,0
|
|
60
|
-
HORUS,GHAST NEXUS,0,18,0,0,0,0
|
|
61
|
-
HORUS,ANNIHILATION NEXUS,0,35,0,0,0,0
|
|
62
|
-
HORUS,CATALYST PISTOL,0,6,0,0,0,0
|
|
63
|
-
HORUS,ARC PROJECTOR,0,8,0,0,0,0
|
|
64
|
-
HORUS,SMARTGUN,0,12,0,0,0,0
|
|
65
|
-
HORUS,MIMIC GUN,0,NaN,0,0,0,0
|
|
66
|
-
HORUS,AUTOGUN,0,10,0,0,0,0
|
|
67
|
-
HA,SIEGE CANNON,0,23,0,0,0,0
|
|
68
|
-
HA,KRAKATOA THERMOBARIC FLAMETHROWER,0,13,0,0,0,0
|
|
69
|
-
HA,PLASMA THROWER,0,52,0,0,0,0
|
|
70
|
-
HA,STUB CANNON,0,3,0,0,0,0
|
|
71
|
-
HA,GRAVITY GUN,0,0,0,0,0,0
|
|
72
|
-
HA,DISPLACER,0,11,0,0,0,0
|
|
73
|
-
HA,SHATTERHEAD COLONY MISSILES,0,14,0,0,0,0
|
|
74
|
-
HA,SOL-PATTERN LASER RIFLE,0,7,0,0,0,0
|
|
75
|
-
HA,ANDROMEDA-PATTERN HEAVY LASER RIFLE,0,17,0,0,0,0
|
|
76
|
-
HA,TACHYON LANCE,0,25,0,0,0,0
|
|
77
|
-
HA,ANNIHILATOR,0,8,0,0,0,0
|
|
78
|
-
HA,TORCH,3,0,0,0,0,0
|
|
79
|
-
,Fuel Rod Gun,0,5,0,0,0,0
|
|
80
|
-
,Prototype Weapon,0,15,0,0,0,0
|
|
81
|
-
,Prototype Weapon,0,15,0,0,0,0
|
|
82
|
-
,Prototype Weapon,0,21,0,0,0,0
|
|
83
|
-
undefined,Latch Drone,0,0,0,0,0,0
|
|
84
|
-
undefined,M35 Mjolnir,0,0,0,0,0,0
|
|
85
|
-
undefined,Apocalypse Rail,0,0,0,0,0,0
|
|
86
|
-
undefined,ZF4 SOLIDCORE,0,0,0,0,0,0
|
package/scripts/test.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
var currentDir = process.cwd();
|
|
3
|
-
var files = fs.readdirSync('./lib');
|
|
4
|
-
let contents = ""
|
|
5
|
-
let valid = true
|
|
6
|
-
|
|
7
|
-
files.forEach(filename => {
|
|
8
|
-
contents = fs.readFileSync(`./lib/${filename}`, 'utf-8')
|
|
9
|
-
try {
|
|
10
|
-
JSON.parse(contents)
|
|
11
|
-
} catch (e) {
|
|
12
|
-
console.error(`invalid JSON in ${filename}`);
|
|
13
|
-
valid = false;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
if (!valid) {
|
|
18
|
-
throw "One or more JSON files are invalid."
|
|
19
|
-
}
|