diff --git a/docs/vtv-presets.html b/docs/vtv-presets.html index e0b4d47..067d0f7 100644 --- a/docs/vtv-presets.html +++ b/docs/vtv-presets.html @@ -154,11 +154,41 @@ h1 em { font-style: normal; color: var(--sys); } @media (max-width: 46rem) { .vtv { grid-template-columns: 1fr; } } .vtv[hidden] { display: none; } +.spec { + margin: .75rem 0 0; display: grid; grid-template-columns: 1fr auto; + gap: .2rem .8rem; font: 500 var(--step--1) var(--mono); +} +.spec div { display: contents; } +.spec dt { color: var(--ink-low); letter-spacing: .06em; } +.spec dd { + margin: 0; text-align: right; color: var(--ink); + font-variant-numeric: tabular-nums; +} +.spec__warn { + margin: .5rem 0 0; font: 400 var(--step--1)/1.5 var(--mono); + color: var(--wep); +} + .seg__n { margin-left: .45em; font-size: .85em; opacity: .55; font-variant-numeric: tabular-nums; } -.seg button[aria-pressed="true"] .seg__n { opacity: .75; } +.seg button[aria-pressed="true"] .spec { + margin: .75rem 0 0; display: grid; grid-template-columns: 1fr auto; + gap: .2rem .8rem; font: 500 var(--step--1) var(--mono); +} +.spec div { display: contents; } +.spec dt { color: var(--ink-low); letter-spacing: .06em; } +.spec dd { + margin: 0; text-align: right; color: var(--ink); + font-variant-numeric: tabular-nums; +} +.spec__warn { + margin: .5rem 0 0; font: 400 var(--step--1)/1.5 var(--mono); + color: var(--wep); +} + +.seg__n { opacity: .75; } .vtv__id { padding: 1.1rem 1.25rem; border-right: 1px solid var(--rule); } @media (max-width: 46rem) { .vtv__id { border-right: 0; border-bottom: 1px solid var(--rule); } } @@ -278,6 +308,7 @@ td.fn {

dragon

2× BOOSTCHUTERIVET 1RIVET 2SLAVER

6 subsystems38 mappings

+
Acceleration
36.00 kph/s
Top speed
514 kph
Impact speed
225 kph
Armor
300
Boosts
Chutes
Rivet Gun
×7
Rivet Gun
×7
Slaver
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1SLAVERBOOST 1CHUTE
2SLAVERBOOST 1CHUTELIFT CUT
3SLAVERBOOST 1LIFT CUT
4SLAVERBOOST 1LIFT CUT
5SLAVERBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1SLAVER
@@ -288,6 +319,7 @@ td.fn {

roadblk

2× BOOSTCHUTERIVETLASER 1DEMO PACK

6 subsystems35 mappings

+
Acceleration
17.93 kph/s
Top speed
272 kph
Impact speed
360 kph
Armor
300
Boosts
2×6
Chutes
3
Rivet Gun
×9
Laser Drill
×8
Demopacks
×11
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVETBOOST 1CHUTE
2RIVETBOOST 1CHUTELIFT CUT
3RIVETBOOST 1LIFT CUT
4RIVETBOOST 1LIFT CUTCHUTE
5RIVETLASER 1DEMO PACKLIFT CUT
6LIFT CUTBOOST 1BOOST 2RIVET
@@ -298,6 +330,7 @@ td.fn {

bttlbrg

2× BOOSTCHUTELASERDEMO PACK

5 subsystems30 mappings

+
Acceleration
20.74 kph/s
Top speed
324 kph
Impact speed
275 kph
Armor
250
Boosts
2×6
Chutes
3
Laser Drill
×9
Demopacks
×11
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASERBOOST 1CHUTE
2LASERBOOST 1CHUTELIFT CUT
3LASERBOOST 1LIFT CUT
4LASERBOOST 1LIFT CUTCHUTE
5LASERBOOST 1DEMO PACKLIFT CUT
6LIFT CUTBOOST 1BOOST 2LASER
@@ -308,6 +341,7 @@ td.fn {

gator

2× BOOSTCHUTERIVETDEMO PACK

5 subsystems30 mappings

+
Acceleration
20.74 kph/s
Top speed
324 kph
Impact speed
275 kph
Armor
250
Boosts
2×6
Chutes
3
Rivet Gun
×9
Demopacks
×11
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVETBOOST 1CHUTE
2RIVETBOOST 1CHUTELIFT CUT
3RIVETBOOST 1LIFT CUT
4RIVETBOOST 1LIFT CUTCHUTE
5RIVETBOOST 1DEMO PACKLIFT CUT
6LIFT CUTBOOST 1BOOST 2RIVET
@@ -318,6 +352,7 @@ td.fn {

mantis

2× BOOSTCHUTELASER 1LASER 2

5 subsystems32 mappings

+
Acceleration
18.79 kph/s
Top speed
285 kph
Impact speed
374 kph
Armor
300
Boosts
2×6
Chutes
3
Laser Drill
×8
Laser Drill
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASER 1BOOST 1CHUTE
2LASER 1BOOST 1CHUTELIFT CUT
3LASER 1BOOST 1LIFT CUT
4LASER 1BOOST 1LIFT CUTCHUTE
5LASER 1BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2LASER 1
@@ -328,6 +363,7 @@ td.fn {

roach

2× BOOSTCHUTERIVET 1RIVET 2

5 subsystems32 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×6
Chutes
3
Rivet Gun
×7
Rivet Gun
×7
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVET 2BOOST 1CHUTE
2RIVET 2BOOST 1CHUTELIFT CUT
3RIVET 2BOOST 1LIFT CUT
4RIVET 2BOOST 1LIFT CUT
5RIVET 2BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1RIVET 2
@@ -338,6 +374,7 @@ td.fn {

spitter

2× BOOSTCHUTERIVET 1RIVET 2

5 subsystems32 mappings

+
Acceleration
18.79 kph/s
Top speed
285 kph
Impact speed
370 kph
Armor
300
Boosts
2×6
Chutes
3
Rivet Gun
×8
Rivet Gun
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVET 2BOOST 1CHUTE
2RIVET 2BOOST 1CHUTELIFT CUT
3RIVET 2BOOST 1LIFT CUT
4RIVET 2BOOST 1LIFT CUT
5RIVET 2BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1RIVET 2
@@ -348,6 +385,7 @@ td.fn {

chigger

2× BOOSTCHUTERIVET

4 subsystems27 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×6
Chutes
3
Rivet Gun
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVETBOOST 1CHUTE
2RIVETBOOST 1CHUTELIFT CUT
3RIVETBOOST 1LIFT CUT
4RIVETBOOST 1LIFT CUTCHUTE
5RIVETBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2RIVET
@@ -358,6 +396,7 @@ td.fn {

flea

2× BOOSTCHUTEDEMO PACK

4 subsystems26 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×6
Chutes
3
Demopacks
×11
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1DEMO PACKBOOST 1CHUTE
2DEMO PACKBOOST 1CHUTELIFT CUT
3DEMO PACKBOOST 1LIFT CUT
4DEMO PACKBOOST 1LIFT CUTCHUTE
5DEMO PACKBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2DEMO PACK
@@ -368,6 +407,7 @@ td.fn {

grunt

2× BOOSTCHUTERIVET

4 subsystems27 mappings

+
Acceleration
21.17 kph/s
Top speed
331 kph
Impact speed
282 kph
Armor
250
Boosts
2×6
Chutes
3
Rivet Gun
×9
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVETBOOST 1CHUTE
2RIVETBOOST 1CHUTELIFT CUT
3RIVETBOOST 1LIFT CUT
4RIVETBOOST 1LIFT CUTCHUTE
5RIVETBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2RIVET
@@ -378,6 +418,7 @@ td.fn {

neut

4× BOOSTCHUTEEJECT

6 subsystems34 mappings

+
Acceleration
23.04 kph/s
Top speed
not credible
Impact speed
not credible
Armor
50
Boosts
4×48
Chutes
12
Demopacks
×11

Its drag is a seventh of every other Lepton’s and its impact speed is uninitialised, so the engine would give it a 2880 kph top speed. The data is wrong, not the reading.

Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 2CHUTE
2BOOST 2CHUTELIFT CUT
3BOOST 2LIFT CUT
4BOOST 2BOOST 4LIFT CUTCHUTE
5BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -388,6 +429,7 @@ td.fn {

proton

2× BOOSTCHUTERIVET

4 subsystems27 mappings

+
Acceleration
22.68 kph/s
Top speed
436 kph
Impact speed
115 kph
Armor
50
Boosts
2×6
Chutes
3
Rivet Gun
×7
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1RIVETBOOST 1CHUTE
2RIVETBOOST 1CHUTELIFT CUT
3RIVETBOOST 1LIFT CUT
4RIVETBOOST 1LIFT CUTCHUTE
5RIVETBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2RIVET
@@ -398,6 +440,7 @@ td.fn {

puck

1× BOOSTLASER 2

2 subsystems16 mappings

+
Acceleration
34.99 kph/s
Top speed
412 kph
Impact speed
425 kph
Armor
100
Boosts
1×12
Chutes
Laser Drill
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASER 2BOOST 1HORN
2LASER 2BOOST 1HORNLIFT CUT
3LASER 2BOOST 1LIFT CUT
4LASER 2BOOST 1LIFT CUTHORN
5LASER 2BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1LASER 2
@@ -408,6 +451,7 @@ td.fn {

ripper

2× BOOSTCHUTEDEMO PACK

4 subsystems26 mappings

+
Acceleration
19.44 kph/s
Top speed
295 kph
Impact speed
374 kph
Armor
300
Boosts
2×6
Chutes
3
Demopacks
×11
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1DEMO PACKBOOST 1CHUTE
2DEMO PACKBOOST 1CHUTELIFT CUT
3DEMO PACKBOOST 1LIFT CUT
4DEMO PACKBOOST 1LIFT CUTCHUTE
5DEMO PACKBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2DEMO PACK
@@ -418,6 +462,7 @@ td.fn {

skeeter

2× BOOSTCHUTELASER 2

4 subsystems26 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×6
Chutes
3
Laser Drill
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASER 2BOOST 1CHUTE
2LASER 2BOOST 1CHUTELIFT CUT
3LASER 2BOOST 1LIFT CUT
4LASER 2BOOST 1LIFT CUTCHUTE
5LASER 2BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2LASER 2
@@ -428,6 +473,7 @@ td.fn {

vole

2× BOOSTCHUTELASER

4 subsystems27 mappings

+
Acceleration
21.17 kph/s
Top speed
331 kph
Impact speed
282 kph
Armor
250
Boosts
2×6
Chutes
3
Laser Drill
×9
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASERBOOST 1CHUTE
2LASERBOOST 1CHUTELIFT CUT
3LASERBOOST 1LIFT CUT
4LASERBOOST 1LIFT CUTCHUTE
5LASERBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2LASER
@@ -438,6 +484,7 @@ td.fn {

wasp

2× BOOSTCHUTEDEMO PACK

4 subsystems26 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×6
Chutes
3
Demopacks
×51
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1DEMO PACKBOOST 1CHUTE
2DEMO PACKBOOST 1CHUTELIFT CUT
3DEMO PACKBOOST 1LIFT CUT
4DEMO PACKBOOST 1LIFT CUTCHUTE
5DEMO PACKBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2DEMO PACK
@@ -448,6 +495,7 @@ td.fn {

barge

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
22.25 kph/s
Top speed
377 kph
Impact speed
290 kph
Armor
250
Boosts
2×6
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -458,6 +506,7 @@ td.fn {

broccoli

3× BOOSTCHUTEUNARMED

4 subsystems28 mappings

+
Acceleration
22.54 kph/s
Top speed
341 kph
Impact speed
330 kph
Armor
250
Boosts
3×4
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 3LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -468,6 +517,7 @@ td.fn {

bug

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
22.68 kph/s
Top speed
372 kph
Impact speed
175 kph
Armor
200
Boosts
2×6
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -478,6 +528,7 @@ td.fn {

bull

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
19.80 kph/s
Top speed
330 kph
Impact speed
385 kph
Armor
300
Boosts
2×6
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -488,6 +539,7 @@ td.fn {

burro

1× BOOSTCHUTEUNARMED

2 subsystems17 mappings

+
Acceleration
22.54 kph/s
Top speed
354 kph
Impact speed
330 kph
Armor
250
Boosts
1×12
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 1CHUTE
2BOOST 1BOOST 1CHUTELIFT CUT
3BOOST 1BOOST 1LIFT CUT
4BOOST 1BOOST 1LIFT CUTCHUTE
5BOOST 1BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 1CHUTE
@@ -498,6 +550,7 @@ td.fn {

lepton

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
23.04 kph/s
Top speed
443 kph
Impact speed
85 kph
Armor
50
Boosts
2×10
Chutes
4
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -508,6 +561,7 @@ td.fn {

mule

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
21.60 kph/s
Top speed
360 kph
Impact speed
302 kph
Armor
250
Boosts
2×6
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -518,6 +572,7 @@ td.fn {

quark

2× BOOSTUNARMED

2 subsystems17 mappings

+
Acceleration
23.04 kph/s
Top speed
443 kph
Impact speed
85 kph
Armor
50
Boosts
2×11
Chutes
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2
2BOOST 1BOOST 2LIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUT
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2
@@ -528,6 +583,7 @@ td.fn {

speck

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
23.04 kph/s
Top speed
397 kph
Impact speed
115 kph
Armor
150
Boosts
2×8
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -538,6 +594,7 @@ td.fn {

tarntula

3× BOOSTCHUTEUNARMED

4 subsystems28 mappings

+
Acceleration
20.52 kph/s
Top speed
326 kph
Impact speed
425 kph
Armor
300
Boosts
3×4
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 3LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -548,6 +605,7 @@ td.fn {

blkrdragon

2× BOOSTCHUTERIVET 1RIVET 2SLAVER

6 subsystems38 mappings

+
Acceleration
36.00 kph/s
Top speed
514 kph
Impact speed
225 kph
Armor
300
Boosts
2×96
Chutes
Rivet Gun
×7
Rivet Gun
×7
Slaver
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1SLAVERBOOST 1CHUTE
2SLAVERBOOST 1CHUTELIFT CUT
3SLAVERBOOST 1LIFT CUT
4SLAVERBOOST 1LIFT CUT
5SLAVERBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1SLAVER
@@ -558,6 +616,7 @@ td.fn {

dark

1× BOOSTLASER 2DEMO PACKDEMOPACKDROPPER2

4 subsystems26 mappings

+
Acceleration
34.99 kph/s
Top speed
412 kph
Impact speed
500 kph
Armor
100
Boosts
1×96
Chutes
Laser Drill
×8
Demopacks
×57
Demopacks
×57
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASER 2BOOST 1HORN
2LASER 2BOOST 1HORNLIFT CUT
3LASER 2BOOST 1LIFT CUT
4LASER 2BOOST 1LIFT CUTHORN
5LASER 2BOOST 1DEMOPACKDROPPER2LIFT CUT
6LIFT CUTBOOST 1LASER 2
@@ -568,6 +627,7 @@ td.fn {

blkrpuck

1× BOOSTLASER 2

2 subsystems16 mappings

+
Acceleration
34.99 kph/s
Top speed
412 kph
Impact speed
425 kph
Armor
100
Boosts
1×96
Chutes
Laser Drill
×8
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1LASER 2BOOST 1HORN
2LASER 2BOOST 1HORNLIFT CUT
3LASER 2BOOST 1LIFT CUT
4LASER 2BOOST 1LIFT CUTHORN
5LASER 2BOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1LASER 2
@@ -578,6 +638,7 @@ td.fn {

blkrwasp

2× BOOSTCHUTEDEMO PACK

4 subsystems26 mappings

+
Acceleration
22.68 kph/s
Top speed
354 kph
Impact speed
140 kph
Armor
200
Boosts
2×48
Chutes
24
Demopacks
×51
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1DEMO PACKBOOST 1CHUTE
2DEMO PACKBOOST 1CHUTELIFT CUT
3DEMO PACKBOOST 1LIFT CUT
4DEMO PACKBOOST 1LIFT CUTCHUTE
5DEMO PACKBOOST 1HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2DEMO PACK
@@ -588,6 +649,7 @@ td.fn {

blkrbroc

3× BOOSTCHUTEUNARMED

4 subsystems28 mappings

+
Acceleration
22.54 kph/s
Top speed
341 kph
Impact speed
330 kph
Armor
250
Boosts
3×32
Chutes
24
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 3LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -598,6 +660,7 @@ td.fn {

blkrlepton

2× BOOSTCHUTEUNARMED

3 subsystems23 mappings

+
Acceleration
23.04 kph/s
Top speed
443 kph
Impact speed
85 kph
Armor
50
Boosts
2×80
Chutes
32
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -608,6 +671,7 @@ td.fn {

blkrquark

2× BOOSTUNARMED

2 subsystems17 mappings

+
Acceleration
23.04 kph/s
Top speed
443 kph
Impact speed
85 kph
Armor
50
Boosts
2×88
Chutes
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2
2BOOST 1BOOST 2LIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 2LIFT CUT
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2
@@ -618,6 +682,7 @@ td.fn {

blkrspk

3× BOOSTCHUTEUNARMED

4 subsystems28 mappings

+
Acceleration
23.04 kph/s
Top speed
397 kph
Impact speed
115 kph
Armor
150
Boosts
3×64
Chutes
24
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 3LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -628,6 +693,7 @@ td.fn {

blkrtran

4× BOOSTCHUTEUNARMED

5 subsystems33 mappings

+
Acceleration
20.52 kph/s
Top speed
326 kph
Impact speed
425 kph
Armor
300
Boosts
4×64
Chutes
48
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 2CHUTE
2BOOST 2CHUTELIFT CUT
3BOOST 2LIFT CUT
4BOOST 2BOOST 4LIFT CUTCHUTE
5BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -638,6 +704,7 @@ td.fn {

blkspk

3× BOOSTCHUTEUNARMED

4 subsystems28 mappings

+
Acceleration
23.04 kph/s
Top speed
397 kph
Impact speed
115 kph
Armor
150
Boosts
3×8
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 1BOOST 2CHUTE
2BOOST 1BOOST 2CHUTELIFT CUT
3BOOST 1BOOST 2LIFT CUT
4BOOST 1BOOST 3LIFT CUTCHUTE
5BOOST 1BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
@@ -648,6 +715,7 @@ td.fn {

blktrn

4× BOOSTCHUTEUNARMED

5 subsystems33 mappings

+
Acceleration
20.52 kph/s
Top speed
326 kph
Impact speed
425 kph
Armor
300
Boosts
4×4
Chutes
3
Preset assignments
PresetTRIGGERTHUMB HIGHTHUMB LOWPINKY
1BOOST 2CHUTE
2BOOST 2CHUTELIFT CUT
3BOOST 2LIFT CUT
4BOOST 2BOOST 4LIFT CUTCHUTE
5BOOST 2HORNLIFT CUT
6LIFT CUTBOOST 1BOOST 2CHUTE
diff --git a/tools/pages/build_page.py b/tools/pages/build_page.py index 6557f75..2a257cf 100644 --- a/tools/pages/build_page.py +++ b/tools/pages/build_page.py @@ -149,6 +149,31 @@ for name in ORDER: else: hull = '' + # Top speed is derived, not stored: terminal velocity, acceleration over + # drag. Neutrino's drag is a seventh of its siblings' and its impact + # speed is uninitialised, so its two derived figures are withheld rather + # than printed as 2880 kph. + ok = v.get('physicsSane', True) + boost = ('%d×%d' % (v['boosters'], v['boostCharges']) + if v.get('boostCharges') else + (str(v['boostTotal']) if v.get('boostTotal') else '—')) + rows = [('Acceleration', '%.2f kph/s' % v['accel']), + ('Top speed', '%d kph' % v['topSpeed'] if ok else 'not credible'), + ('Impact speed', '%d kph' % v['impact'] if ok else 'not credible'), + ('Armor', '%d' % v['armor']), + ('Boosts', boost), + ('Chutes', str(v['chuteCharges']) if v['chuteCharges'] else '—')] + for tool in v.get('tools', []): + rows.append((tool['name'], '×%d' % tool['charges'])) + spec = ('
' + + ''.join('
%s
%s
' % r for r in rows) + + '
') + if not ok: + spec += ('

Its drag is a seventh of every other ' + 'Lepton’s and its impact speed is uninitialised, so the ' + 'engine would give it a 2880 kph top speed. The data is ' + 'wrong, not the reading.

') + cards.append("""
@@ -157,13 +182,14 @@ for name in ORDER:

{key}

{chips}

{nsub} subsystems{nrec} mappings

+ {spec}
{l4}
""".format( tags=tags, hullcode=(code[:1] or '?'), search=html.escape(search), display=html.escape(display.upper()), key=html.escape(name), chips=loadout_chips(v), nsub=len(v['subsystems']), - hull=hull, nrec=v['L4']['records'], l4=table(v['L4']))) + hull=hull, nrec=v['L4']['records'], spec=spec, l4=table(v['L4']))) # Tabs by hull. The first letter of a vehicle's two-letter art code is the # hull the game actually draws it with; the console's class names are @@ -336,11 +362,41 @@ h1 em { font-style: normal; color: var(--sys); } @media (max-width: 46rem) { .vtv { grid-template-columns: 1fr; } } .vtv[hidden] { display: none; } +.spec { + margin: .75rem 0 0; display: grid; grid-template-columns: 1fr auto; + gap: .2rem .8rem; font: 500 var(--step--1) var(--mono); +} +.spec div { display: contents; } +.spec dt { color: var(--ink-low); letter-spacing: .06em; } +.spec dd { + margin: 0; text-align: right; color: var(--ink); + font-variant-numeric: tabular-nums; +} +.spec__warn { + margin: .5rem 0 0; font: 400 var(--step--1)/1.5 var(--mono); + color: var(--wep); +} + .seg__n { margin-left: .45em; font-size: .85em; opacity: .55; font-variant-numeric: tabular-nums; } -.seg button[aria-pressed="true"] .seg__n { opacity: .75; } +.seg button[aria-pressed="true"] .spec { + margin: .75rem 0 0; display: grid; grid-template-columns: 1fr auto; + gap: .2rem .8rem; font: 500 var(--step--1) var(--mono); +} +.spec div { display: contents; } +.spec dt { color: var(--ink-low); letter-spacing: .06em; } +.spec dd { + margin: 0; text-align: right; color: var(--ink); + font-variant-numeric: tabular-nums; +} +.spec__warn { + margin: .5rem 0 0; font: 400 var(--step--1)/1.5 var(--mono); + color: var(--wep); +} + +.seg__n { opacity: .75; } .vtv__id { padding: 1.1rem 1.25rem; border-right: 1px solid var(--rule); } @media (max-width: 46rem) { .vtv__id { border-right: 0; border-bottom: 1px solid var(--rule); } } diff --git a/tools/pages/extract_presets.py b/tools/pages/extract_presets.py index 5cf7f85..537e814 100644 --- a/tools/pages/extract_presets.py +++ b/tools/pages/extract_presets.py @@ -107,38 +107,72 @@ def resource_table(): TABLE = resource_table() -# ------------------------------------------------------- subsystem names -RAWNAME = re.compile(rb'([A-Za-z][A-Za-z0-9_]{2,23})\x00') -SUBNAME = re.compile(r'(Booster\d*|Chute\d*|RivetGun\d*|LaserGun\d*|' - r'Demo[Pp]ackDropper\d*|Slaver\d*|Stinger\d*|Eject\d*)$') - - -def clean(raw): - """Records are variable length; a float tail can leave printable junk - glued to the front of the next name. Longest valid suffix wins.""" - for i in range(len(raw)): - if SUBNAME.fullmatch(raw[i:]): - return raw[i:] - return None +# ------------------------------------------------------------- subsystems +# A record is name[32], then an int type id, the record's own length in +# bytes, and sixteen bytes on, how many charges it carries. Walking by the +# length reads the stream exactly, which beats hunting for printable names +# in the float tails and then guessing where each one really starts. +SUB_TYPE = {2004: 'Booster', 2005: 'Rivet Gun', 2006: 'Laser Drill', + 2007: 'Demopacks', 2008: 'Chute'} def subsystems(veh, warn): + """-> [(name, type id, charges)] in stream order.""" want = re.compile(r'^%s: Stream of (\d+) Subsystems$' % re.escape(veh)) for res in TABLE.values(): m = want.match(res['desc']) if not m: continue expect = int(m.group(1)) - body = RES[res['addr'] + 4:res['addr'] + res['size']] - names = [clean(x.group(1).decode()) for x in RAWNAME.finditer(body)] - names = [n for n in names if n] - if len(names) != expect: - warn.append('subsystem stream lists %d names, header says %d' - % (len(names), expect)) - return names + body = RES[res['addr']:res['addr'] + res['size']] + out, o = [], 4 + while len(out) < expect and o + 52 <= len(body): + length = struct.unpack_from(' len(body): + break + out.append((body[o:o + 32].split(b'\x00')[0].decode('latin1'), + struct.unpack_from('