Files
RingBRP/tools/icons.mjs
T
slaguru666andClaude Opus 5 2e10ecced9 Fire modes, fitted sights and lamps, and a tab rail
Selectable fire, with the modifiers on the choice
  Every weapon has carried a fireMode since the packs were first built and nothing
  read it: a musket could rip a ten-round burst and "rapid" bought a weapon nothing.
  FIRE_MODE now gates the burst rules and carries its own attack modifier — slow +10%
  and then you work for the next one, fast a second shot at -20% to both, rapid
  bursts, beam +5% and it can be held on the target for damage instead of hits. The
  gate lives in burstAttack too, so no macro can route round it. `fast` was on five
  catalogue weapons and was not in the system's list of modes at all, so re-saving one
  of them silently blanked it; the list is derived from the rule now.

  burstAttack shipped complete and was reachable from nothing. It is the resolution
  path the selector chooses, and takes the dialog's whole stack rather than charging
  the player twice for the same burst.

Sights and lamps that apply themselves
  A sight is graded by range band, so a telescopic sight is a -10% liability inside
  ten metres and worth +20% at extreme, and it only counts if it fits. The band is
  already known when the modifier is wanted, so nothing is selected and nothing is
  forgotten. The dark costs something now; a carried lamp buys it back to dim, never
  to daylight, and the card says it shows them exactly where you are. A migration
  fits gear that predates the fields, matched on the stamped key rather than by name.

The damage card
  The last card still wearing Foundry's stock dice styling — it posted a bare Roll and
  let the core template dress it. It renders through the module's own card now, with
  the Roll still on the message so dice stay inspectable.

A rail instead of a strip
  Eight tabs across an 820px sheet compressed to 11px type. They run down the side
  now, one line each, with counts as badges; the sheet is 152px wider to pay for it.

Also fixed: any weapon with a Coherence cost could not be attacked with AT ALL — the
handler re-read the weapon after an await, when currentTarget is already null, and the
attack died on a TypeError with nothing shown. And the duplicate-rule guard failed an
honest table because FIRE_MODE and speedBands share two key names; it wants a majority
now, and prints partial overlaps rather than swallowing them.

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

195 lines
12 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 ---- */
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" };