@massif/lancer-data 4.0.0-beta.21 → 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 +29 -2
- package/lib/frames.json +7 -7
- package/lib/mods.json +1 -1
- package/lib/reserves.json +13 -0
- package/lib/systems.json +3 -4
- package/lib/tags.json +34 -11
- package/lib/talents.json +6 -6
- 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
|
{
|
|
@@ -287,9 +287,36 @@
|
|
|
287
287
|
"name": "Jockey",
|
|
288
288
|
"activation": "Full",
|
|
289
289
|
"terse": "Attempt to attack a mech on foot as a pilot.",
|
|
290
|
-
"detail": "When you JOCKEY, you aggressively attack an enemy mech while on foot. It cannot be emphasized enough how foolhardy and dangerous this is.<br>To JOCKEY, you must be adjacent to a mech. As a full action, make a contested skill check against the mech, using GRIT (or a relevant trigger, at the GM’s discretion). The mech contests with HULL. On a success, you manage to climb onto the mech, sharing its space and moving with it. The mech can attempt to shake you off by succeeding on another contested skill check as a full action; alternatively, you can jump off as part of your movement on your turn
|
|
290
|
+
"detail": "When you JOCKEY, you aggressively attack an enemy mech while on foot. It cannot be emphasized enough how foolhardy and dangerous this is.<br>To JOCKEY, you must be adjacent to a mech. As a full action, make a contested skill check against the mech, using GRIT (or a relevant trigger, at the GM’s discretion). The mech contests with HULL. On a success, you manage to climb onto the mech, sharing its space and moving with it. The mech can attempt to shake you off by succeeding on another contested skill check as a full action; alternatively, you can jump off as part of your movement on your turn.",
|
|
291
291
|
"pilot": true
|
|
292
292
|
},
|
|
293
|
+
{
|
|
294
|
+
"id": "act_jockey_distract",
|
|
295
|
+
"name": "Distract",
|
|
296
|
+
"activation": "Jockey",
|
|
297
|
+
"terse": "IMPAIR and SLOW a mech until the end of its next turn.",
|
|
298
|
+
"detail": "IMPAIR and SLOW a mech until the end of its next turn.",
|
|
299
|
+
"add_status": [
|
|
300
|
+
{ "id": "impaired", "duration": "end_next_turn_target" },
|
|
301
|
+
{ "id": "slow", "duration": "end_next_turn_target" }
|
|
302
|
+
]
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"id": "act_jockey_shred",
|
|
306
|
+
"name": "Shred",
|
|
307
|
+
"activation": "Jockey",
|
|
308
|
+
"terse": "Deal 2 Heat",
|
|
309
|
+
"detail": "Deal 2 heat to the mech by ripping at wiring, paneling, and so on.",
|
|
310
|
+
"damage": [{ "type": "heat", "val": 2 }]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"id": "act_jockey_damage",
|
|
314
|
+
"name": "Damage",
|
|
315
|
+
"activation": "Jockey",
|
|
316
|
+
"terse": "Deal 4 Kinetic Damage",
|
|
317
|
+
"detail": "Deal 4 kinetic damage to the mech by attacking joints, hatches, and so on.",
|
|
318
|
+
"damage": [{ "type": "kinetic", "val": 4 }]
|
|
319
|
+
},
|
|
293
320
|
{
|
|
294
321
|
"id": "act_brace",
|
|
295
322
|
"name": "Brace",
|
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,
|
|
@@ -3053,7 +3052,7 @@
|
|
|
3053
3052
|
"save": "agi",
|
|
3054
3053
|
"add_special": [
|
|
3055
3054
|
{
|
|
3056
|
-
"
|
|
3055
|
+
"attribute": "Affected by Flak Launcher",
|
|
3057
3056
|
"duration": "next_turn_end_target",
|
|
3058
3057
|
"detail": "You can’t fly until the end of your next turn."
|
|
3059
3058
|
}
|
package/lib/tags.json
CHANGED
|
@@ -63,15 +63,11 @@
|
|
|
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)",
|
|
74
|
-
"description": "This weapon must be reloaded after {VAL} uses. Mechs can reload with Stabilize and some systems. The user can choose to reload this weapon at the end of their turn, allowing them to fire it again on the same turn. This is a COMP/CON-specific alias for the LOADING tag, and all rules pertaining to LOADING apply."
|
|
69
|
+
"description": "This weapon must be reloaded after {VAL} uses. Mechs can reload with Stabilize and some systems. The user can choose to reload this weapon at the end of their turn, allowing them to fire it again on the same turn. This is a COMP/CON-specific alias for the LOADING tag, and all rules pertaining to LOADING apply.",
|
|
70
|
+
"hidden": true
|
|
75
71
|
},
|
|
76
72
|
{
|
|
77
73
|
"id": "tg_ordnance",
|
|
@@ -206,17 +202,20 @@
|
|
|
206
202
|
{
|
|
207
203
|
"id": "tg_personal_armor",
|
|
208
204
|
"name": "Personal Armor",
|
|
209
|
-
"description": "This gear offers protection in combat, but it is obvious to observers and usually can’t be hidden. Only one piece of Personal Armor can be worn at a time. Putting on Personal Armor takes 10–20 minutes, and while wearing it, pilots have restricted mobility and dexterity. Nobody wears armor unless they’re expecting to go into a warzone."
|
|
205
|
+
"description": "This gear offers protection in combat, but it is obvious to observers and usually can’t be hidden. Only one piece of Personal Armor can be worn at a time. Putting on Personal Armor takes 10–20 minutes, and while wearing it, pilots have restricted mobility and dexterity. Nobody wears armor unless they’re expecting to go into a warzone.",
|
|
206
|
+
"hidden": true
|
|
210
207
|
},
|
|
211
208
|
{
|
|
212
209
|
"id": "tg_pilot_weapon",
|
|
213
210
|
"name": "Pilot Weapon",
|
|
214
|
-
"description": "On missions, pilots can take up to two weapons. All pilot weapons are pilot-scale and can’t be used by mechs."
|
|
211
|
+
"description": "On missions, pilots can take up to two weapons. All pilot weapons are pilot-scale and can’t be used by mechs.",
|
|
212
|
+
"hidden": true
|
|
215
213
|
},
|
|
216
214
|
{
|
|
217
215
|
"id": "tg_gear",
|
|
218
216
|
"name": "Gear",
|
|
219
|
-
"description": "This is a tool, piece of equipment, or another item. Pilots can have up to three of these at a time."
|
|
217
|
+
"description": "This is a tool, piece of equipment, or another item. Pilots can have up to three of these at a time.",
|
|
218
|
+
"hidden": true
|
|
220
219
|
},
|
|
221
220
|
{
|
|
222
221
|
"id": "tg_sidearm",
|
|
@@ -263,8 +262,7 @@
|
|
|
263
262
|
{
|
|
264
263
|
"id": "tg_exotic",
|
|
265
264
|
"name": "Exotic Gear",
|
|
266
|
-
"description": "EXOTIC GEAR is a general tag for equipment that exists outside the traditional licensing system."
|
|
267
|
-
"filter_ignore": true
|
|
265
|
+
"description": "EXOTIC GEAR is a general tag for equipment that exists outside the traditional licensing system."
|
|
268
266
|
},
|
|
269
267
|
{
|
|
270
268
|
"id": "tg_recharge",
|
|
@@ -331,5 +329,30 @@
|
|
|
331
329
|
"name": "Irreducible",
|
|
332
330
|
"description": "Prohibits damage reduction from any source (HIDDEN TAG)",
|
|
333
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"
|
|
334
357
|
}
|
|
335
358
|
]
|
package/lib/talents.json
CHANGED
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"detail": "As a quick action on your turn, you may spin up your thrusters. If you end your turn flying, you may nominate a character within a Range equal to your Speed and within line of sight, and gain the Supersonic reaction.",
|
|
52
52
|
"add_special": [
|
|
53
53
|
{
|
|
54
|
-
"
|
|
54
|
+
"attribute": "Supersonic Target"
|
|
55
55
|
}
|
|
56
56
|
]
|
|
57
57
|
},
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"detail": "Any mech skill checks and saves either you or your Bondmate makes while you are adjacent gain +1 Accuracy. If both characters have this talent, this increases to +2 Accuracy.",
|
|
83
83
|
"add_special": [
|
|
84
84
|
{
|
|
85
|
-
"
|
|
85
|
+
"attribute": "Bondmate",
|
|
86
86
|
"target": "ally",
|
|
87
87
|
"detail": "Any mech skill checks and saves either you or your Bondmate makes while you are adjacent gain +1 Accuracy. If both characters have this talent, this increases to +2 Accuracy."
|
|
88
88
|
}
|
|
@@ -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
|
-
}
|