Files
slaguru666andClaude Opus 5 c61700566c Shields: armour you raise, and the only armour you can defend with
A shield is the one piece of armour you hold, and it protects you exactly as much as
you are currently holding it up. Raised, its points apply to what it covers and it can
parry on a new Shield skill. Lowered, it is weight. The price of keeping it up is that
it occupies a hand and you are shooting around it: -20% to your own ranged attacks,
printed on the card like everything else. Only one shield goes up at a time.

Seven of them, 2-point buckler to 6-point ballistic shield; the pavise and barrier
plate cover legs too because they are walls you carry.

`degradation` finally does something — it has been on every armour item since the packs
were first built and was read by nothing. A blow costs the shield a point of wear for
every step it stood above an ordinary success, so an ordinary hit costs nothing, a
special 1 and a critical 2. At its limit it comes apart, drops, and will not be raised
again.

Two defects found by driving the real functions rather than reading the diff, both
introduced by this change:

- Every shield defence quietly rolled DODGE. "shield" passed through
  defenceTypeAllowed unchanged, so neither parry branch matched and it fell through.
  Invisible in the card; it showed up as eight rolls at a supposed 85% returning six
  failures. Taking a blow on the shield IS a parry, so it is now a flag on a parry
  rather than a defence type of its own.
- The wear rule was unreachable: it fired only on a clean stop, but under graded
  defences only a critical fully stops a critical, so a shield would never have taken
  a scratch. Wear is for what the shield ABSORBED — dragging a critical down to a
  special is exactly when shields splinter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 18:25:30 +01:00

200 lines
13 KiB
JavaScript

/** Item key -> [glyph, family, hue shift]. Shifts keep same-family items distinct. */
export const ICON_MAP = {
// weapons
punch:["hand","melee",0], baton:["club","melee",-8,"modern"], dagger:["blade","melee",8,"antique"],
prybar:["bar","melee",-14], machete:["sword","melee",16,"antique"], spear1h:["spear","melee",-20,"antique"],
grasp:["claw","melee",24], shortbow:["bow","weapon",30,"antique"],
pistol_light:["pistol","weapon",-6], pistol_med:["pistol","weapon",0], pistol_heavy:["pistol","weapon",6],
smg:["rifle","weapon",-12], rifle_med:["rifle","weapon",12], rifle_heavy:["rifle","weapon",18],
shotgun:["shotgun","weapon",24], cutter:["blade","device",0,"anomalous"],
lance:["beam","device",-14,"anomalous"], unmaker:["lattice","device",14,"anomalous"],
/* ---- ANTIQUE: brought back, or never left ---- */
flintlock:["flintlock","weapon",-16,"antique"], musket:["musket","weapon",-22,"antique"],
duelling_sword:["sword","melee",4,"antique"], boarding_axe:["axe","melee",-10,"antique"],
crossbow:["crossbow","weapon",34,"antique"], cudgel:["club","melee",-26,"antique"],
oil_lantern:["lantern","gear",-36,"antique"], tallow_candle:["candle","gear",-42,"antique"],
brass_compass:["compass","gear",40,"antique"], pocket_watch:["pocketwatch","gear",-46,"antique"],
spectacles:["spectacles","gear",46,"antique"], chirurgeon_kit:["syringe","gear",-52,"antique"],
oilcloth_coat:["jacket","armour",-28,"antique"], brigandine:["mail","armour",28,"antique"],
wax_tablet:["book","gear",-56,"antique"], iron_manacles:["manacles","gear",52,"antique"],
/* ---- MODERN: agency issue, already covered above, plus ---- */
revolver:["revolver","weapon",-30], carbine:["rifle","weapon",-24],
gas_mask:["mask_gas","gear",-60], evidence_tape:["tape","gear",56],
entrenching_tool:["handaxe_tool","melee",-34], dictaphone:["radio","gear",60],
/* ---- FUTURE: recovered from somewhere ahead ---- */
gauss_pistol:["gauss","weapon",-40,"future"], gauss_rifle:["gauss","weapon",44,"future"],
monoblade:["blade","melee",40,"future"], survey_drone:["drone","gear",-66,"future"],
optic_visor:["visor","gear",66,"future"], data_wafer:["chip","gear",-70,"future"],
breather:["mask_gas","gear",70,"future"], sealed_cannister:["cannister","gear",-74,"future"],
hardsuit:["suit","armour",-34,"future"], field_net:["net","gear",74,"future"],
/* ---- ANOMALOUS: should not exist ---- */
threshold_key:["aperture","device",-32,"anomalous"],
quiet_ledger:["ledger","device",34,"anomalous"],
/* ---- POWERS: the Quiet Arts ---- */
power_thread:["thread","power",0], power_echo:["echo","power",14],
power_hollow:["hollow","power",-14], power_witness:["witness","power",28],
power_unmake:["unmake","power",-28], power_ledger:["ledger","power",42],
// armour
jacket:["jacket","armour",-10], stab_vest:["vest","armour",-4], soft_armour:["vest","armour",4],
hide:["jacket","armour",12,"antique"], mail:["mail","armour",-16,"antique"], plate:["plate","armour",16,"antique"],
impact_vest:["vest","armour",10], breach_suit:["suit","armour",-20],
envsuit:["suit","armour",20], salvage_plate:["plate","device",8,"anomalous"],
// gear
field_kit:["flask","gear",-12], handset:["radio","gear",8], trauma_unit:["kit","gear",-20],
fieldmedic:["syringe","gear",14], medkit:["kit","gear",0], toolkit:["cog","gear",-6],
scanner:["scanner","gear",20], power_cell:["cell","gear",-26], cover_id:["folder","gear",26],
anchor:["ring","talent",0], key:["key","device",20,"anomalous"],
torch:["bolt","gear",34], rope:["rope","gear",-32], rations:["pack","gear",30],
water:["flask","gear",24], camera:["camera","gear",-16], sample_case:["vial","gear",-24],
restraints:["manacles","gear",16], beacon:["radio","gear",-30], binocs:["binocs","gear",32],
notebook:["book","gear",4], geiger:["geiger","gear",28], climbing_kit:["bolt","gear",-8],
spare_cells:["cell","gear",12], survey_kit:["cog","gear",34], ward:["aperture","device",-24,"anomalous"],
// device
crossing_regulator:["regulator","device",-8,"anomalous"],
// skills, by category
skill_melee:["blade","skill",-14], skill_ranged:["target","skill",-7],
skill_phys:["boot","skill",0], skill_manip:["hand","skill",7],
skill_mental:["brain","skill",14], skill_percep:["eye","skill",21],
skill_comm:["wave","skill",28],
// talents
talent_generic:["thread","talent",0], talent_species:["triune","talent",18],
talent_agency:["ledger","talent",-18], talent_field:["compass","talent",9],
portrait_b0:["figure","actor",-330],
portrait_b1:["figure","actor",-300],
portrait_b2:["figure","actor",-270],
portrait_b3:["figure","actor",-210],
portrait_b4:["figure","actor",-155],
portrait_b5:["figure","actor",-120],
portrait_b6:["figure","actor",-80],
portrait_b7:["figure","actor",-40],
portrait_b8:["figure","actor",-10],
portrait_b9:["figure","actor",15],
portrait_v0:["mask","actor",-315],
portrait_v1:["mask","actor",-240],
portrait_v2:["mask","actor",-170],
portrait_v3:["mask","actor",-100],
portrait_v4:["mask","actor",-30],
portrait_c0:["triune","actor",-285],
portrait_c1:["triune","actor",-195],
portrait_c2:["triune","actor",-130],
portrait_c3:["triune","actor",-65],
portrait_c4:["triune","actor",5],
portrait_n0:["mask","threat",-355],
portrait_n1:["mask","threat",-315],
portrait_n2:["mask","threat",-275],
portrait_n3:["mask","threat",-155],
portrait_n4:["mask","threat",-75],
// actors + misc
actor_pc:["figure","actor",0], actor_npc:["mask","threat",0],
actor_case:["folder","case",0], table:["disc","case",18],
journal:["book","case",-18], discovery:["lens","device",30],
project:["book","device",-30], material:["ring","armour",0], group:["mask","actor",20],
door:["door","device",0],
/* ---- stores: standing issue and the rest ---- */
warrant_card:["folder","gear",8], dressings:["kit","gear",-4], chalk:["bolt","gear",44],
whistle:["wave","gear",-38], carbon_book:["book","gear",-12], date_stamp:["disc","gear",18],
seals:["ring","gear",-18], cordon_kit:["tape","gear",22], clipboard:["folder","gear",-22],
uv_lamp:["lens","gear",-44], signal_mirror:["disc","gear",-30], probe:["bar","gear",38],
thermometer:["vial","gear",26], stopwatch:["pocketwatch","gear",14], specimen_jars:["vial","gear",-26],
swab_kit:["kit","gear",34], lock_rakes:["key","gear",-14], bolt_croppers:["handaxe_tool","gear",-34],
master_keys:["key","gear",20], door_wedges:["door","gear",30], groundsheet:["pack","gear",-40],
vacuum_flask:["flask","gear",10], blanket:["pack","gear",42], analgesics:["syringe","gear",6],
wake_tablets:["vial","gear",48], barrier_gloves:["hand","gear",-48], ear_defenders:["ear","gear",16],
site_overalls:["suit","gear",-10],
/* ---- antique stores ---- */
tinderbox:["candle","gear",-50,"antique"], quill_ink:["book","gear",50,"antique"],
sealing_wax:["ring","gear",-54,"antique"], spyglass:["binocs","gear",54,"antique"],
lamp_oil:["flask","gear",-58,"antique"], laudanum:["vial","gear",58,"antique"],
lodestone:["compass","gear",-62,"antique"], sand_glass:["pocketwatch","gear",62,"antique"],
/* ---- future stores ---- */
// shields — a disc for the round ones, a bar for the big square ones
buckler:["disc","armour",22,"antique"], targe:["disc","armour",-14,"antique"],
heater:["shield","armour",6,"antique"], pavise:["shield","armour",-26,"antique"],
riot_shield:["shield","armour",30], ballistic_shield:["shield","armour",-8],
barrier_field:["shield","armour",44,"future"],
wound_foam:["kit","gear",-16,"future"], cold_light:["bolt","gear",-20,"future"],
// Fitted to the weapon. Lenses for the three optical sights, so they read as a set;
// the thermal one is a future-era lens and the lamp is a bolt like the other lights.
sight_irons:["bar","gear",26], sight_reflex:["lens","gear",8],
sight_scope:["lens","gear",-8], sight_thermal:["lens","gear",44,"future"],
weapon_lamp:["bolt","gear",12],
field_slate:["chip","gear",24,"future"], locator_tags:["target","gear",-24,"future"],
density_scanner:["scanner","gear",28,"future"], seal_foam:["cannister","gear",-28,"future"],
assist_sleeve:["hand","gear",32,"future"],
/* ---- anomalous stores: transposed, and priced ---- */
black_mirror:["aperture","device",36,"anomalous"], wrong_compass:["compass","device",-36,"anomalous"],
returning_coin:["disc","device",40,"anomalous"], attendance_register:["ledger","device",-40,"anomalous"],
handbell:["wave","device",44,"anomalous"],
/* ---- transport ---- */
pool_car:["disc","gear",-6], pool_van:["pack","gear",-2], land_rover:["cog","gear",6],
site_lorry:["cannister","gear",-32], motorcycle:["bolt","gear",-44], launch:["wave","gear",12],
helicopter:["drone","gear",-12], hand_cart:["bar","gear",-60,"antique"],
trap:["rope","gear",60,"antique"], flycycle:["drone","gear",36,"future"],
lifter:["pack","gear",40,"future"], crawler:["suit","gear",-44,"future"],
stepping_frame:["door","device",48,"anomalous"], wrong_carriage:["disc","device",-48,"anomalous"],
/* ---- transport stores ---- */
tow_line:["rope","gear",18], jack_plates:["bar","gear",-38], jerry_can:["flask","gear",-42],
vehicle_spares:["cog","gear",-50], wheel_clamps:["manacles","gear",44], vehicle_log:["book","gear",30],
roof_lamp:["lens","gear",52], recovery_strop:["rope","gear",-52],
/* ---- the forward stores ---- */
stepping_disc:["aperture","device",-56,"future"], stasis_box:["cannister","gear",56,"future"],
autodoc:["kit","gear",-60,"future"], impact_suit:["vest","armour",44,"future"],
shadow_cloth:["jacket","gear",-64,"future"], grav_harness:["rope","gear",64,"future"],
sonic_probe:["wave","gear",-68,"future"], pressure_tent:["pack","gear",68,"future"],
cell_stack:["cell","gear",-72,"future"], translator_pin:["ear","gear",72,"future"],
medical_ram:["syringe","gear",-76,"future"], hull_patch:["kit","gear",76,"future"],
beacon_hard:["radio","gear",-80,"future"], sensor_stakes:["target","gear",80,"future"],
/* ---- further out, and worse for you ---- */
general_hull:["aperture","device",-20,"anomalous"], pleasure_tap:["brain","device",20,"anomalous"],
long_ledger:["ledger","device",-44,"anomalous"],
/* ---- borrowed authority ---- */
authority:["folder","device",0], authority_flagged:["folder","device",26],
authority_burned:["folder","device",-26],
/* ---- the historical range: medieval ---- */
arming_sword:["sword","melee",-4,"antique"], longsword:["sword","melee",-12,"antique"],
falchion:["sword","melee",20,"antique"], war_hammer:["club","melee",-30,"antique"],
mace:["club","melee",30,"antique"], flail:["club","melee",-36,"antique"],
poleaxe:["axe","melee",-18,"antique"], halberd:["spear","melee",-26,"antique"],
billhook:["axe","melee",26,"antique"], pike:["spear","melee",34,"antique"],
quarterstaff:["bar","melee",-22,"antique"], dirk:["blade","melee",-16,"antique"],
longbow:["bow","weapon",-30,"antique"], arbalest:["crossbow","weapon",-24,"antique"],
sling:["rope","weapon",38,"antique"], javelin:["spear","weapon",18,"antique"],
/* ---- early modern ---- */
rapier:["sword","melee",-40,"antique"], main_gauche:["blade","melee",40,"antique"],
matchlock:["musket","weapon",-34,"antique"], wheellock:["flintlock","weapon",28,"antique"],
blunderbuss:["shotgun","weapon",-44,"antique"], boarding_pike:["spear","melee",-32,"antique"],
/* ---- Napoleonic, Victorian, and the Great War ---- */
sabre:["sword","melee",44,"antique"], smallsword:["sword","melee",-48,"antique"],
cutlass:["sword","melee",48,"antique"], brown_bess:["musket","weapon",36,"antique"],
baker_rifle:["musket","weapon",-38,"antique"], bayonet:["blade","melee",32,"antique"],
martini:["rifle","weapon",-42,"antique"], webley:["revolver","weapon",42,"antique"],
lee_enfield:["rifle","weapon",46,"antique"], trench_club:["club","melee",22,"antique"],
/* ---- historical armour ---- */
gambeson:["jacket","armour",-16,"antique"], maille_shirt:["mail","armour",-22,"antique"],
coat_of_plates:["vest","armour",-30,"antique"], cuirass:["plate","armour",16,"antique"],
harness:["plate","armour",-36,"antique"], buff_coat:["jacket","armour",34,"antique"],
sallet:["mask","armour",-42,"antique"], lobster_pot:["mask","armour",42,"antique"],
jack_of_plate:["vest","armour",24,"antique"], cuirassier:["plate","armour",-48,"antique"],
brodie:["mask","armour",30,"antique"], flak_jacket:["vest","armour",-24,"antique"],
/* ---- spacecraft ---- */
cutter_ship:["drone","gear",-8,"future"], picket:["drone","gear",14,"future"],
lighter:["cannister","gear",-14,"future"], revenue_boat:["drone","gear",22,"future"],
long_hull:["aperture","device",-52,"anomalous"]
};
/** Skill category -> icon key. */
export const SKILL_ICON = { melee:"skill_melee", ranged:"skill_ranged", phys:"skill_phys",
manip:"skill_manip", mental:"skill_mental", percep:"skill_percep", comm:"skill_comm" };