diff --git a/Stars_Without_Number_Revised/ReadMe.md b/Stars_Without_Number_Revised/ReadMe.md index 18bb4087c4..82f6f9f43a 100644 --- a/Stars_Without_Number_Revised/ReadMe.md +++ b/Stars_Without_Number_Revised/ReadMe.md @@ -42,6 +42,10 @@ on Github. ## Changelog +### 2.5.2 + +* Fix a bug preventing ship price from ever being calculated. + ### 2.5.1 * Fix a bug causing new sheets to incorrectly initialise as AI and Transhuman. diff --git a/Stars_Without_Number_Revised/Source/js/constants.js b/Stars_Without_Number_Revised/Source/js/constants.js index 21eb4a35cd..9ec95286c9 100644 --- a/Stars_Without_Number_Revised/Source/js/constants.js +++ b/Stars_Without_Number_Revised/Source/js/constants.js @@ -2,7 +2,7 @@ /* Data constants */ const sheetName = "Stars Without Number (revised)"; -const sheetVersion = "2.5.1"; +const sheetVersion = "2.5.2"; const translate = getTranslationByKey; const attributes = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"]; const effortAttributes = ["wisdom_mod", "constitution_mod", "psionics_extra_effort", diff --git a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html index d905d75bc2..768b39fdcf 100644 --- a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html +++ b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html @@ -5,4 +5,4 @@ @{shell_affinity}"/>

:
:
-

+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +

+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +

:

+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +

:
:
-

Processing Nodes

AI Routines

/
/
#

–

–

:

/
/
/
/

:(;; ;  ,  ,  ). :  / 
/

:( ,  ).

:( ,  ).

/

: ( )

/
( ). :  / 
/
( ). :  / 
/
( ). :  / 
/
{{charname}}
{{title}}
{{#reaction}}
{{#rollLess() reaction 3}} {{/rollLess() reaction 3}}{{#rollBetween() reaction 3 5}} {{/rollBetween() reaction 3 5}}{{#rollBetween() reaction 6 8}} {{/rollBetween() reaction 6 8}}{{#rollBetween() reaction 9 11}} {{/rollBetween() reaction 9 11}}{{#rollGreater() reaction 11}} {{/rollGreater() reaction 11}}
{{reaction}}
{{/reaction}} {{#info}}
{{info}}
{{/info}} {{#rollGreater() damage 0}}
{{damage}}
{{/rollGreater() damage 0}} {{#allprops() charname title damage reaction desc info buttons}}
{{key}}
{{value}}
{{/allprops() charname title damage reaction desc info buttons}}
{{desc}}
{{buttons}}
{{charname}}
{{title}} {{#rollGreater() burst 0}}(){{/rollGreater() burst 0}} {{#rollLess() mod 0}}{{mod}}{{/rollLess() mod 0}}{{#rollGreater() mod 0}}+ {{mod}}{{/rollGreater() mod 0}}
{{attack}}
{{damage}}
{{#attack2}}
{{attack2}}
{{damage2}}
{{/attack2}}{{#attack3}}
{{attack3}}
{{damage3}}
{{/attack3}}{{#attack4}}
{{attack4}}
{{damage4}}
{{/attack4}} {{#attack5}}
{{attack5}}
{{damage5}}
{{/attack5}} {{#attack6}}
{{attack6}}
{{damage6}}
{{/attack6}} {{#attack7}}
{{attack7}}
{{damage7}}
{{/attack7}} {{#attack8}}
{{attack8}}
{{damage8}}
{{/attack8}} {{#shock}}
{{shock}}
{{/shock}}
{{#range}} {{range}}{{/range}}{{#ammo}} {{ammo}}{{/ammo}}
{{desc}}
{{charname}}
{{title}} {{attribute}} {{#rollLess() mod 0}}{{mod}}{{/rollLess() mod 0}}{{#rollGreater() mod 0}}+ {{mod}}{{/rollGreater() mod 0}}
{{dice}}
{{#save}} {{#^rollLess() dice save}}
{{charname}}
{{title}}
{{dice}}
{{save}}{{morale}}
{{/^rollLess() dice save}} {{#rollLess() dice save}}
{{charname}}
{{title}}
{{dice}}
{{save}}{{morale}}
{{/rollLess() dice save}} {{/save}} {{#morale}} {{#^rollGreater() dice morale}}
{{charname}}
{{title}}
{{dice}}
{{save}}{{morale}}
{{/^rollGreater() dice morale}} {{#rollGreater() dice morale}}
{{charname}}
{{title}}
{{dice}}
{{save}}{{morale}}
{{/rollGreater() dice morale}} {{/morale}}
\ No newline at end of file + "use strict";const sheetName="Stars Without Number (revised)",sheetVersion="2.5.2",translate=getTranslationByKey,attributes=["strength","dexterity","constitution","intelligence","wisdom","charisma"],effortAttributes=["wisdom_mod","constitution_mod","psionics_extra_effort","skill_biopsionics","skill_precognition","skill_telepathy","skill_teleportation","skill_telekinesis","skill_metapsionics","psionics_committed_effort_current","psionics_committed_effort_scene","psionics_committed_effort_day"],shipStatEvent=[...["hardpoints","power","mass"].map(e=>`change:repeating_ship-weapons:weapon_${e}`),...["power","mass"].map(e=>`change:repeating_ship-defenses:defense_${e}`),...["power","mass"].map(e=>`change:repeating_ship-fittings:fitting_${e}`),"change:ship_power","change:ship_mass","change:ship_hardpoints","remove:repeating_ship-weapons","remove:repeating_ship-defenses","remove:repeating_ship-fittings"].join(" "),weaponSkills=["skill_exert","skill_punch","skill_shoot","skill_stab","skill_combat_energy","skill_combat_gunnery","skill_combat_primitive","skill_combat_projectile","skill_combat_psitech","skill_combat_unarmed","skill_telekinesis"],weaponDisplayEvent=[...["attack","name","skill_bonus","attribute_mod","damage","shock","shock_damage","shock_ac","skill_to_damage"].map(e=>`change:repeating_weapons:weapon_${e}`),"remove:repeating_weapons","change:attack_bonus",...weaponSkills.map(e=>`change:${e}`)].join(" "),skills={revised:["administer","connect","exert","fix","heal","know","lead","notice","perform","pilot","program","punch","shoot","sneak","stab","survive","talk","trade","work"],first:["artist","athletics","bureaucracy","business","combat_energy","combat_gunnery","combat_primitive","combat_projectile","combat_psitech","combat_unarmed","computer","culture_alien","culture_criminal","culture_spacer","culture_traveller","culture_one","culture_two","culture_three","exosuit","gambling","history","instructor","language","leadership","navigation","perception","persuade","profession","religion","science","security","stealth","steward","survival","tactics","tech_astronautic","tech_maltech","tech_medical","tech_postech","tech_pretech","tech_psitech","vehicle_air","vehicle_grav","vehicle_land","vehicle_space","vehicle_water"],psionic:["biopsionics","metapsionics","precognition","telekinesis","telepathy","teleportation"]},shipStats=["ship_ac","ship_armor","ship_class","ship_crew_max","ship_crew_min","ship_hardpoints_max","ship_hp","ship_hp_max","ship_mass_max","ship_power_max","ship_speed","ship_hull_price"],reverseHullTypes={[translate("BATTLESHIP").toLowerCase()]:"battleship",[translate("BULK_FREIGHTER").toLowerCase()]:"bulk_freighter",[translate("CARRIER").toLowerCase()]:"carrier",[translate("CORVETTE").toLowerCase()]:"corvette",[translate("FLEET_CRUISER").toLowerCase()]:"fleet_cruiser",[translate("FREE_MERCHANT").toLowerCase()]:"free_merchant",[translate("HEAVY_FRIGATE").toLowerCase()]:"heavy_frigate",[translate("LARGE_STATION").toLowerCase()]:"large_station",[translate("PATROL_BOAT").toLowerCase()]:"patrol_boat",[translate("SMALL_STATION").toLowerCase()]:"small station",[translate("STRIKE_FIGHTER").toLowerCase()]:"strike_fighter",[translate("SHUTTLE").toLowerCase()]:"shuttle"},reverseClasses={[translate("ADVENTURER").toLowerCase()]:"adventurer",[translate("EXPERT").toLowerCase()]:"expert",[translate("PSYCHIC").toLowerCase()]:"psychic",[translate("WARRIOR").toLowerCase()]:"warrior"},autofillSections=["armor","cyberware","foci","gear","ship-defenses","ship-fittings","ship-weapons","techniques","weapons"],autofillData={classes:{adventurer:{class_ability:translate("ADVENTURER_CLASS_ABILITY")},expert:{class_ability:translate("EXPERT_CLASS_ABILITY")},psychic:{class_ability:translate("PSYCHIC_CLASS_ABILITY")},warrior:{attack_bonus:"1",class_ability:translate("WARRIOR_CLASS_ABILITY")}},drones:{alecto:{drone_AC:"18",drone_enc:"4",drone_HP:"30",drone_num_fittings:"4",drone_range:"5000 km",drone_price:"50000"},cuttlefish:{drone_AC:"13",drone_enc:"2",drone_HP:"10",drone_num_fittings:"5",drone_range:"1 km",drone_price:"2000"},ghostwalker:{drone_AC:"15",drone_enc:"3",drone_fitting_1_desc:translate("SENSOR_TRANSPARENCY_DESC"),drone_fitting_1_name:translate("SENSOR_TRANSPARENCY"),drone_HP:"1",drone_num_fittings:"3",drone_range:"5 km",drone_price:"3000"},pax:{drone_AC:"16",drone_enc:"4",drone_HP:"20",drone_num_fittings:"4",drone_range:"100 km",drone_price:"10000"},primitve_drone:{drone_AC:"12",drone_enc:"2",drone_HP:"1",drone_num_fittings:"1",drone_range:"500 m",drone_price:"250"},sleeper:{drone_AC:"12",drone_enc:"2",drone_fitting_1_desc:translate("STATIONKEEPING_DESC"),drone_fitting_1_name:translate("STATIONKEEPING"),drone_HP:"8",drone_num_fittings:"5",drone_range:"100 km",drone_price:"2500"},stalker:{drone_AC:"13",drone_enc:"2",drone_HP:"5",drone_num_fittings:"3",drone_range:"2 km",drone_price:"1000"},void_hawk:{drone_AC:"14",drone_enc:"6",drone_HP:"15",drone_num_fittings:"4",drone_range:"100 km",drone_price:"5000"}},droneFittings:["ammo_unit","bomber","environmental_power","expert_system","extended_flight","grav_muffles","heavy_lift","holoskin","medical_support","observation_suite","racing_gravitics","reinforced_structure","sensor_transparency","stationkeeping","suicide_charge","weapon_fitting"],hulltypes:{battleship:{ship_ac:"16",ship_armor:"20",ship_class:translate("CAPITAL"),ship_crew_max:"1000",ship_crew_min:"200",ship_hardpoints_max:"15",ship_hp:"100",ship_mass_max:"50",ship_power_max:"75",ship_speed:"0",ship_hull_price:"50000000"},bulk_freighter:{ship_ac:"11",ship_armor:"0",ship_class:translate("CRUISER"),ship_crew_max:"40",ship_crew_min:"10",ship_hardpoints_max:"2",ship_hp:"40",ship_mass_max:"25",ship_power_max:"15",ship_speed:"0",ship_hull_price:"5000000"},carrier:{ship_ac:"14",ship_armor:"10",ship_class:translate("CAPITAL"),ship_crew_max:"1500",ship_crew_min:"300",ship_hardpoints_max:"4",ship_hp:"75",ship_mass_max:"100",ship_power_max:"50",ship_speed:"0",ship_hull_price:"60000000"},corvette:{ship_ac:"13",ship_armor:"10",ship_class:translate("FRIGATE"),ship_crew_max:"40",ship_crew_min:"10",ship_hardpoints_max:"6",ship_hp:"40",ship_mass_max:"15",ship_power_max:"15",ship_speed:"2",ship_hull_price:"4000000"},fleet_cruiser:{ship_ac:"14",ship_armor:"15",ship_class:translate("CRUISER"),ship_crew_max:"200",ship_crew_min:"50",ship_hardpoints_max:"10",ship_hp:"60",ship_mass_max:"30",ship_power_max:"50",ship_speed:"1",ship_hull_price:"10000000"},free_merchant:{ship_ac:"14",ship_armor:"2",ship_class:translate("FRIGATE"),ship_crew_max:"6",ship_crew_min:"1",ship_hardpoints_max:"2",ship_hp:"20",ship_mass_max:"15",ship_power_max:"10",ship_speed:"3",ship_hull_price:"500000"},heavy_frigate:{ship_ac:"15",ship_armor:"10",ship_class:translate("FRIGATE"),ship_crew_max:"120",ship_crew_min:"30",ship_hardpoints_max:"8",ship_hp:"50",ship_mass_max:"20",ship_power_max:"25",ship_speed:"1",ship_hull_price:"7000000"},large_station:{ship_ac:"17",ship_armor:"20",ship_class:translate("CAPITAL"),ship_crew_max:"1000",ship_crew_min:"100",ship_hardpoints_max:"30",ship_hp:"120",ship_mass_max:"75",ship_power_max:"125",ship_speed:"",ship_hull_price:"40000000"},patrol_boat:{ship_ac:"14",ship_armor:"5",ship_class:translate("FRIGATE"),ship_crew_max:"20",ship_crew_min:"5",ship_hardpoints_max:"4",ship_hp:"25",ship_mass_max:"10",ship_power_max:"15",ship_speed:"4",ship_hull_price:"2500000"},small_station:{ship_ac:"11",ship_armor:"5",ship_class:translate("CRUISER"),ship_crew_max:"200",ship_crew_min:"20",ship_hardpoints_max:"10",ship_hp:"120",ship_mass_max:"40",ship_power_max:"50",ship_speed:"",ship_hull_price:"5000000"},strike_fighter:{ship_ac:"16",ship_armor:"5",ship_class:translate("FIGHTER"),ship_crew_max:"1",ship_crew_min:"1",ship_hardpoints_max:"1",ship_hp:"8",ship_mass_max:"2",ship_power_max:"5",ship_speed:"5",ship_hull_price:"200000"},shuttle:{ship_ac:"11",ship_armor:"0",ship_class:translate("FIGHTER"),ship_crew_max:"10",ship_crew_min:"1",ship_hardpoints_max:"1",ship_hp:"15",ship_mass_max:"5",ship_power_max:"3",ship_speed:"3",ship_hull_price:"200000"}},statblocks:{barbarian_hero:["6","16","8","Weapon+3","1","10m","11","3","12","PRIMITIVE"],barbarian_tribal:["1","12","2","Weapon","1","10m","8","1","15","PRIMITIVE"],civilian_security_bot:["1","15","1","1d8[Stun]","1","10m","12","1","15"],companion_bot:["1","12","0","1d2[Unarmed]","1","10m","6","1","15"],elite_fighter:["3","16","4","Weapon+1","1","10m","10","2","14","COMBAT"],gang_boss:["3","14","4","Weapon+1","1","10m","9","2","15"],gang_member:["1","12","1","Weapon","1","10m","7","1","15"],geneengineered_killer:["4","16","5","Weapon+1","1","15m","10","2","13"],geneengineered_murder_beast:["10","18","10","1d10","4","20m","12","3","10"],greater_lone_predator:["5","16","6","1d10","2","10m","9","2","12"],heavy_warbot:["6","18","8","2d8[Plasma]","2","15m","10","2","12"],heroic_fighter:["6","16","8","Weapon+3","1","10m","11","3","12","COMBAT"],industrial_work_bot:["2","15","0","1d10[Crush]","1","5","8","1","14"],janitor_bot:["1","14","0","Unarmed","1","5m","8","1","15"],large_aggressive_prey_animal:["5","13","4","1d10","1","15m","8","1","12"],large_pack_hunter:["2","14","2","1d6","1","15m","9","1","14"],legendary_fighter:["10","20","12","Weapon+4","2","10m","12","5","10","POWERED"],lesser_lone_predator:["3","14","4","1d8","2","15m","8","2","14"],martial_human:["1","10","1","Weapon","1","10m","8","1","15"],military_elite:["3","16","4","Weapon+1","1","10m","10","2","14","COMBAT"],military_soldier:["1","16","1","Weapon","1","10m","9","1","15","COMBAT"],normal_human:["1","10","0","Unarmed","1","10m","6","1","15"],peaceful_human:["1","10","0","Unarmed","1","10m","6","1","15"],pirate_king:["7","18","9","Weapon+2","1","10m","11","3","12","POWERED"],police_officer:["1","14","1","Weapon","1","10m","8","1","15"],repair_bot:["1","14","0","1d6[Tool]","1","10m","8","1","15"],serial_killer:["6","12","8","Weapon+3","1","10m","12","3","12"],skilled_professional:["1","10","0","Weapon","1","10m","6","2","15"],small_pack_hunter:["1","13","1","1d4","1","15m","8","1","15"],small_vicious_beast:["1hp","14","1","1d2","1","10m","7","1","15"],soldier_bot:["2","16","1","Weapon","1","10m","10","1","14"],terrifying_apex_predator:["8","16","8","1d10","2","20m","9","2","11"],veteran_fighter:["2","14","2","Weapon+1","1","10m","9","1","14"],warrior_tyrant:["8","20","10","Weapon+3","1","10m","11","3","11","POWERED"]},armor:{armored_undersuit:{armor_ac:"13",armor_encumbrance:"0",armor_type:"STREET",armor_price:"600"},armored_vacc_suit:{armor_ac:"13",armor_encumbrance:"2",armor_type:"STREET",armor_price:"400"},assault_suit:{armor_ac:"18",armor_encumbrance:"2",armor_type:"POWERED",armor_price:"10000"},combat_field_uniform:{armor_ac:"16",armor_encumbrance:"1",armor_type:"COMBAT",armor_price:"1000"},cuirass_brigandine_linothorax_half_plate:{armor_ac:"15",armor_encumbrance:"1",armor_type:"PRIMITIVE",armor_price:"50"},deflector_array:{armor_ac:"18",armor_encumbrance:"0",armor_type:"STREET",armor_price:"30000"},executive_security_suit:{armor_ac:"15",armor_encumbrance:"0",armor_type:"ARTIFACT"},field_emitter_panoply:{armor_ac:"20",armor_encumbrance:"1",armor_encumbrance_bonus:"4",armor_type:"POWERED",armor_price:"40000"},force_pavis:{armor_ac:"15",armor_ac_bonus:"1",armor_encumbrance:"1",armor_type:"SHIELD",armor_price:"10000"},full_plate_layered_mail:{armor_ac:"17",armor_encumbrance:"2",armor_type:"PRIMITIVE",armor_price:"100"},ghost_mantle:{armor_ac:"15",armor_encumbrance:"0",armor_type:"ARTIFACT"},icarus_harness:{armor_ac:"16",armor_encumbrance:"1",armor_type:"COMBAT",armor_price:"8000"},leather_jacks_thick_hides_quilted_armor:{armor_ac:"13",armor_encumbrance:"1",armor_type:"PRIMITIVE",armor_price:"10"},polyplast_carapace:{armor_ac:"18",armor_encumbrance:"1",armor_type:"ARTIFACT"},psitech_combat_suit:{armor_ac:"16",armor_encumbrance:"0",armor_type:"ARTIFACT"},secure_clothing:{armor_ac:"13",armor_encumbrance:"1",armor_type:"STREET",armor_price:"300"},security_armor:{armor_ac:"14",armor_encumbrance:"1",armor_type:"COMBAT",armor_price:"700"},shield:{armor_ac:"13",armor_ac_bonus:"1",armor_encumbrance:"1",armor_type:"SHIELD",armor_price:"10"},storm_armor:{armor_ac:"19",armor_encumbrance:"2",armor_encumbrance_bonus:"4",armor_type:"POWERED",armor_price:"20000"},stutterjump_suit:{armor_ac:"18",armor_encumbrance:"0",armor_type:"ARTIFACT"},tempest_assault_array:{armor_ac:"20",armor_encumbrance:"1",armor_encumbrance_bonus:"4",armor_type:"ARTIFACT"},titan_powered_armor:{armor_ac:"21",armor_encumbrance:"2",armor_encumbrance_bonus:"4",armor_type:"ARTIFACT"},vestimentum:{armor_ac:"18",armor_encumbrance:"0",armor_type:"POWERED",armor_price:"15000"},warpaint:{armor_ac:"12",armor_encumbrance:"0",armor_type:"STREET",armor_price:"300"},woven_body_armor:{armor_ac:"15",armor_encumbrance:"2",armor_type:"COMBAT",armor_price:"400"}},cyberware:{adrenal_suppression_pump:{cyberware_strain:"1",cyberware_price:"30000"},bioadaptation_augments:{cyberware_strain:"1",cyberware_price:"10000"},body_arsenal_array:{cyberware_strain:"1",cyberware_price:"10000"},body_sculpting:{cyberware_strain:"1",cyberware_price:"10000"},dermal_armor:{cyberware_strain:"2",cyberware_price:"20000"},drone_control_link:{cyberware_strain:"1",cyberware_price:"20000"},eelskin_capacitor_mesh:{cyberware_strain:"1",cyberware_price:"25000"},gecko_anchors:{cyberware_strain:"1",cyberware_price:"15000"},ghost_talker_transceiver:{cyberware_strain:"1",cyberware_price:"15000"},holdout_cavity:{cyberware_strain:"1",cyberware_price:"10000"},holoskin_emitter:{cyberware_strain:"1",cyberware_price:"15000"},identity_submersion_trigger:{cyberware_strain:"1",cyberware_price:"25000"},immunofiltration_systems:{cyberware_strain:"2",cyberware_price:"25000"},induced_coma_trigger:{cyberware_strain:"1",cyberware_price:"20000"},neurointruder_alert:{cyberware_strain:"1",cyberware_price:"50000"},panspectral_optics:{cyberware_strain:"1",cyberware_price:"15000"},pressure_sheathing:{cyberware_strain:"1",cyberware_price:"15000"},prosthetic_limb:{cyberware_strain:"1",cyberware_price:"2500"},revenant_wiring:{cyberware_strain:"3",cyberware_price:"50000"},slowtime_window:{cyberware_strain:"2",cyberware_price:"30000"},stabilization_overrides:{cyberware_strain:"2",cyberware_price:"25000"},tagger_nanites:{cyberware_strain:"1",cyberware_price:"15000"},toxin_injector:{cyberware_strain:"2",cyberware_price:"20000"},twitchlock_actuators:{cyberware_strain:"2",cyberware_price:"30000"}},foci:{alert:{},armsman:{},assassin:{},authority:{},close_combatant:{},connected:{},die_hard:{},diplomat:{},gunslinger:{},hacker:{},healer:{},henchkeeper:{},ironhide:{},psychic_training:{},savage_fray:{},shocking_assault:{},sniper:{},specialist:{},star_captain:{},starfarer:{},tinker:{},unarmed_combatant:{},unique_gift:{},wanderer:{},wild_psychic_talent:{}},gear:{ai_companion:{gear_encumbrance:"0"},ammo_20_rounds:{gear_encumbrance:"1#",gear_price:"10"},ammo_missile:{gear_encumbrance:"1",gear_price:"50"},atmofilter:{gear_encumbrance:"1",gear_price:"100"},backpack:{gear_encumbrance:"1",gear_price:"5/50"},bezoar:{gear_encumbrance:"0",gear_price:"200"},binoculars:{gear_encumbrance:"1",gear_price:"20/200"},bioscanner:{gear_encumbrance:"1",gear_price:"300"},black_slab:{gear_encumbrance:"1",gear_price:"10000"},brainwave:{gear_encumbrance:"0",gear_price:"1000"},climbing_harness:{gear_encumbrance:"1",gear_price:"50"},comm_server:{gear_encumbrance:"3",gear_price:"1000"},compad:{gear_encumbrance:"0",gear_price:"100"},data_phase_tab:{gear_encumbrance:"1",gear_price:"5000"},data_protocol:{gear_encumbrance:"0",gear_price:"1000"},dataslab:{gear_encumbrance:"1",gear_price:"300"},field_radio:{gear_encumbrance:"1",gear_price:"200"},glowbug:{gear_encumbrance:"0",gear_price:"5"},grapnel_launcher:{gear_encumbrance:"1",gear_price:"200"},grav_chute:{gear_encumbrance:"1",gear_price:"300/1000"},grav_harness:{gear_encumbrance:"3",gear_price:"5000"},hush:{gear_encumbrance:"0",gear_price:"200"},instapanel:{gear_encumbrance:"1#",gear_price:"50"},integrity_stims:{gear_encumbrance:"0"},juggernaut_stims:{gear_encumbrance:"0"},lazarus_patch:{gear_encumbrance:"1#",gear_price:"30"},lift:{gear_encumbrance:"0",gear_price:"50"},line_shunt:{gear_encumbrance:"0",gear_price:"100"},low_light_goggles:{gear_encumbrance:"1",gear_price:"200"},medkit:{gear_encumbrance:"2",gear_price:"100"},metatool:{gear_encumbrance:"1",gear_price:"200"},micropurgator_stims:{gear_encumbrance:"0"},mindwall_helmet:{gear_encumbrance:"0"},navcomp:{gear_encumbrance:"1",gear_price:"500"},polymorphic_nanites:{gear_encumbrance:"1"},portabox:{gear_encumbrance:"1",gear_price:"50"},pseudonuke:{gear_encumbrance:"1"},power_cell_type_a:{gear_encumbrance:"1#",gear_price:"10"},power_cell_type_b:{gear_encumbrance:"1",gear_price:"100"},pressure_tent:{gear_encumbrance:"4",gear_price:"100"},pretech_cosmetic:{gear_encumbrance:"0",gear_price:"1000"},psych:{gear_encumbrance:"0",gear_price:"25"},rations_1_day:{gear_encumbrance:"1#",gear_price:"5"},redivivus_sheath:{gear_encumbrance:"1"},remote_link_unit:{gear_encumbrance:"1",gear_price:"250"},reverie:{gear_encumbrance:"0",gear_price:"100"},rope_20_meters:{gear_encumbrance:"2/1",gear_price:"4/40"},scout_report:{gear_encumbrance:"0",gear_price:"200"},solar_recharger:{gear_encumbrance:"3",gear_price:"500"},spare_parts:{gear_encumbrance:"1#",gear_price:"50"},squeal:{gear_encumbrance:"0",gear_price:"300"},stiletto_charge:{gear_encumbrance:"1",gear_price:"Priceless"},storage_unit:{gear_encumbrance:"3",gear_price:"500"},survey_scanner:{gear_encumbrance:"1",gear_price:"250"},survival_kit:{gear_encumbrance:"1",gear_price:"60"},system_reset_inductor:{gear_encumbrance:"0"},tailored_antiallergens:{gear_encumbrance:"0",gear_price:"5"},telekinetic_generator:{gear_encumbrance:"2",gear_price:"250"},telescoping_pole:{gear_encumbrance:"0",gear_price:"10"},thermal_flare:{gear_encumbrance:"0",gear_price:"5"},tightbeam_link_unit:{gear_encumbrance:"1",gear_price:"1000"},toolkit_postech:{gear_encumbrance:"3",gear_price:"300"},toolkit_pretech:{gear_encumbrance:"1",gear_price:"1000"},trade_goods:{gear_encumbrance:"1#",gear_price:"50"},trade_metals:{gear_encumbrance:"1#",gear_price:"10"},translator_torc:{gear_encumbrance:"0",gear_price:"200"},tsunami:{gear_encumbrance:"0",gear_price:"50"},vacc_fresher:{gear_encumbrance:"1",gear_price:"400"},vacc_skin:{gear_encumbrance:"1",gear_price:"1000"},vacc_suit:{gear_encumbrance:"2",gear_price:"100"},wideawake_serum:{gear_encumbrance:"0"}},"ship-defenses":{ablative_hull_compartments:{class:"CAPITAL",defense_effect:`+1 ${translate("AC")}, +20 ${translate("MAXIMUM_HIT_POINTS").toLowerCase()}.`,defense_mass:"2#",defense_power:"5",defense_price:"100000*"},augmented_plating:{class:"FIGHTER",defense_effect:`+2 ${translate("AC")}, -1 ${translate("SPEED")}.`,defense_mass:"1#",defense_power:"0",defense_price:"25000*"},boarding_countermeasures:{class:"FRIGATE",defense_effect:translate("BOARDING_COUNTERMEASURES_DESC"),defense_mass:"1#",defense_power:"2",defense_price:"25000*"},burst_ecm_generator:{class:"FRIGATE",defense_effect:translate("BURST_ECM_GENERATOR_DESC"),defense_mass:"1#",defense_power:"2",defense_price:"25000*"},foxer_drones:{class:"CRUISER",defense_effect:translate("FOXER_DRONES_DESC"),defense_mass:"1#",defense_power:"2",defense_price:"10000*"},grav_eddy_displacer:{class:"FRIGATE",defense_effect:translate("GRAV_EDDY_DISPLACER_DESC"),defense_mass:"2#",defense_power:"5",defense_price:"50000*"},hardened_polyceramic_overlay:{class:"FIGHTER",defense_effect:translate("HARDENED_POLYCERAMIC_OVERLAY_DESC"),defense_mass:"1#",defense_power:"0",defense_price:"25000*"},planetary_defense_array:{class:"FRIGATE",defense_effect:translate("PLANETARY_DEFENSE_ARRAY_DESC"),defense_mass:"2#",defense_power:"4",defense_price:"50000*"},point_defense_lasers:{class:"FRIGATE",defense_effect:translate("POINT_DEFENSE_LASERS_DESC"),defense_mass:"2#",defense_power:"3",defense_price:"10000*"}},"ship-fittings":{advanced_lab:{class:"FRIGATE",fitting_mass:"2",fitting_power:"1#",fitting_price:"10000*"},advanced_nav_computer:{class:"FRIGATE",fitting_mass:"0",fitting_power:"1#",fitting_price:"10000*"},amphibious_operation:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"1",fitting_price:"25000*"},armory:{class:"FRIGATE",fitting_mass:"0",fitting_power:"0",fitting_price:"10000*"},atmospheric_configuration:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"0",fitting_price:"5000*"},auto_targeting_system:{class:"FIGHTER",fitting_mass:"0",fitting_power:"1",fitting_price:"50000"},automation_support:{class:"FIGHTER",fitting_mass:"1",fitting_power:"2",fitting_price:"10000*"},boarding_tubes:{class:"FRIGATE",fitting_mass:"1",fitting_power:"0",fitting_price:"5000*"},cargo_lighter:{class:"FRIGATE",fitting_mass:"2",fitting_power:"0",fitting_price:"25000"},cargo_space:{class:"FIGHTER",fitting_mass:"1",fitting_power:"0",fitting_price:""},cold_sleep_pods:{class:"FRIGATE",fitting_mass:"1",fitting_power:"1",fitting_price:"5000*"},colony_core:{class:"FRIGATE",fitting_mass:"2#",fitting_power:"4",fitting_price:"100000*"},drill_course_regulator:{class:"FRIGATE",fitting_mass:"1",fitting_power:"1#",fitting_price:"25000*"},spike_drive_2:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"1#",fitting_price:"10000*"},spike_drive_3:{class:"FIGHTER",fitting_mass:"2#",fitting_power:"2#",fitting_price:"20000*"},spike_drive_4:{class:"FRIGATE",fitting_mass:"3#",fitting_power:"2#",fitting_price:"40000*"},spike_drive_5:{class:"FRIGATE",fitting_mass:"3#",fitting_power:"3#",fitting_price:"100000*"},spike_drive_6:{class:"CRUISER",fitting_mass:"4#",fitting_power:"3#",fitting_price:"500000*"},drop_pod:{class:"FRIGATE",fitting_mass:"2",fitting_power:"0",fitting_price:"300000"},emissions_dampers:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"1#",fitting_price:"25000*"},exodus_bay:{class:"CRUISER",fitting_mass:"2#",fitting_power:"1#",fitting_price:"50000*"},extended_life_support:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"1#",fitting_price:"5000*"},extended_medbay:{class:"FRIGATE",fitting_mass:"1",fitting_power:"1",fitting_price:"5000*"},extended_store:{class:"FIGHTER",fitting_mass:"1#",fitting_power:"0",fitting_price:"2500*"},fuel_bunkers:{class:"FIGHTER",fitting_mass:"1",fitting_power:"0",fitting_price:"2500*"},fuel_scoops:{class:"FRIGATE",fitting_mass:"1#",fitting_power:"2",fitting_price:"5000*"},hydroponic_production:{class:"CRUISER",fitting_mass:"2#",fitting_power:"1#",fitting_price:"10000*"},lifeboats:{class:"FRIGATE",fitting_mass:"1",fitting_power:"0",fitting_price:"2500*"},luxury_cabins:{class:"FRIGATE",fitting_mass:"1#",fitting_power:"1",fitting_price:"10000*"},mobile_extractor:{class:"FRIGATE",fitting_mass:"1",fitting_power:"2",fitting_price:"50000"},mobile_factory:{class:"CRUISER",fitting_mass:"2#",fitting_power:"3",fitting_price:"50000*"},precognitive_nav_chamber:{class:"FRIGATE",fitting_mass:"0",fitting_power:"1",fitting_price:"100000*"},psionic_anchorpoint:{class:"FRIGATE",fitting_mass:"0",fitting_power:"3",fitting_price:"Special"},sensor_mask:{class:"FRIGATE",fitting_mass:"0",fitting_power:"1#",fitting_price:"10000*"},ship_bay_fighter:{class:"CRUISER",fitting_mass:"2",fitting_power:"0",fitting_price:"200000"},ship_bay_frigate:{class:"CAPITAL",fitting_mass:"4",fitting_power:"1",fitting_price:"1000000"},ships_locker:{class:"FRIGATE",fitting_mass:"0",fitting_power:"0",fitting_price:"2000*"},shiptender_mount:{class:"FRIGATE",fitting_mass:"1",fitting_power:"1",fitting_price:"25000*"},smugglers_hold:{class:"FIGHTER",fitting_mass:"1",fitting_power:"0",fitting_price:"2500*"},survey_sensor_array:{class:"FRIGATE",fitting_mass:"1",fitting_power:"2",fitting_price:"5000*"},system_drive:{class:"FIGHTER",fitting_mass:"-2#",fitting_power:"-1#",fitting_price:"Special"},teleportation_pads:{class:"FRIGATE",fitting_mass:"1",fitting_power:"1",fitting_price:"Special"},tractor_beams:{class:"FRIGATE",fitting_mass:"1",fitting_power:"2",fitting_price:"10000*"},vehicle_transport_fittings:{class:"FRIGATE",fitting_mass:"1#",fitting_power:"0",fitting_price:"2500*"},workshop:{class:"FRIGATE",fitting_mass:"0.5#",fitting_power:"1",fitting_price:"500*"}},"ship-weapons":{charged_particle_caster:{class:"FRIGATE",weapon_damage:"3d6",weapon_hardpoints:"2",weapon_mass:"1",weapon_power:"10",weapon_price:"800000",weapon_qualities:`${translate("AP")} 15, ${translate("CLUMSY")}`},flak_emitter_battery:{class:"FRIGATE",weapon_damage:"2d6",weapon_hardpoints:"1",weapon_mass:"3",weapon_power:"5",weapon_price:"500000",weapon_qualities:`${translate("AP")} 10, ${translate("FLAK")}`},fractal_impact_charge:{weapon_ammo:"4",weapon_ammo_price:"500",class:"FIGHTER",weapon_damage:"2d6",weapon_hardpoints:"1",weapon_mass:"1",weapon_power:"5",weapon_price:"200000",weapon_qualities:`${translate("AP")} 15`},gravcannon:{class:"CRUISER",weapon_damage:"4d6",weapon_hardpoints:"3",weapon_mass:"4",weapon_power:"15",weapon_price:"2000000",weapon_qualities:`${translate("AP")} 20`},lightning_charge_mantle:{class:"CAPITAL",weapon_damage:"1d20",weapon_hardpoints:"2",weapon_mass:"5",weapon_power:"15",weapon_price:"4000000",weapon_qualities:`${translate("AP")} 5, ${translate("CLOUD")}`},mag_spike_array:{weapon_ammo:"5",weapon_ammo_price:"5000",class:"FRIGATE",weapon_damage:"2d6+2",weapon_hardpoints:"2",weapon_mass:"2",weapon_power:"5",weapon_price:"1000000",weapon_qualities:`${translate("AP")} 10, ${translate("FLAK")}`},mass_cannon:{weapon_ammo:"4",weapon_ammo_price:"50000",class:"CAPITAL",weapon_damage:"2d20",weapon_hardpoints:"4",weapon_mass:"5",weapon_power:"10",weapon_price:"5000000",weapon_qualities:`${translate("AP")} 20`},multifocal_laser:{class:"FIGHTER",weapon_damage:"1d4",weapon_hardpoints:"1",weapon_mass:"1",weapon_power:"5",weapon_price:"100000",weapon_qualities:`${translate("AP")} 20`},nuclear_missiles:{weapon_ammo:"5",weapon_ammo_price:"5000",class:"FRIGATE",weapon_damage:"",weapon_hardpoints:"2",weapon_mass:"1",weapon_power:"5",weapon_price:"50000",weapon_qualities:""},plasma_beam:{class:"FRIGATE",weapon_damage:"3d6",weapon_hardpoints:"2",weapon_mass:"2",weapon_power:"5",weapon_price:"700000",weapon_qualities:`${translate("AP")} 10`},polyspectral_mes_beam:{class:"FIGHTER",weapon_damage:"2d4",weapon_hardpoints:"1",weapon_mass:"1",weapon_power:"5",weapon_price:"2000000",weapon_qualities:`${translate("AP")} 25`},reaper_battery:{class:"FIGHTER",weapon_damage:"3d4",weapon_hardpoints:"1",weapon_mass:"1",weapon_power:"4",weapon_price:"100000",weapon_qualities:translate("CLUMSY")},sandthrower:{class:"FIGHTER",weapon_damage:"2d4",weapon_hardpoints:"1",weapon_mass:"1",weapon_power:"3",weapon_price:"50000",weapon_qualities:translate("FLAK")},singularity_gun:{class:"CAPITAL",weapon_damage:"5d20",weapon_hardpoints:"5",weapon_mass:"10",weapon_power:"25",weapon_price:"20000000",weapon_qualities:`${translate("AP")} 25`},smart_cloud:{class:"CRUISER",weapon_damage:"3d10",weapon_hardpoints:"2",weapon_mass:"5",weapon_power:"10",weapon_price:"2000000",weapon_qualities:`${translate("CLOUD")}, ${translate("CLUMSY")}`},spike_inversion_projector:{class:"CRUISER",weapon_damage:"3d8",weapon_hardpoints:"3",weapon_mass:"3",weapon_power:"10",weapon_price:"2500000",weapon_qualities:`${translate("AP")} 15`},spinal_beam_cannon:{class:"CRUISER",weapon_damage:"3d10",weapon_hardpoints:"3",weapon_mass:"5",weapon_power:"10",weapon_price:"1500000",weapon_qualities:`${translate("AP")} 15, ${translate("CLUMSY")}`},torpedo_launcher:{weapon_ammo:"4",weapon_ammo_price:"2500",class:"FRIGATE",weapon_damage:"3d8",weapon_hardpoints:"1",weapon_mass:"3",weapon_power:"10",weapon_price:"500000",weapon_qualities:`${translate("AP")} 20`},vortex_tunnel_inductor:{class:"CAPITAL",weapon_damage:"3d20",weapon_hardpoints:"4",weapon_mass:"10",weapon_power:"20",weapon_price:"5000000",weapon_qualities:`${translate("AP")} 20, ${translate("CLUMSY")}`}},techniques:{accelerated_succor:{level:"3",technique_discipline:translate("BIOPSIONICS")},alternate_outcome:{level:"2",technique_discipline:translate("PRECOGNITION")},anguished_vision:{level:"3",technique_discipline:translate("PRECOGNITION")},burdened_apportation:{level:"2",technique_discipline:translate("TELEPORTATION")},cloak_powers:{level:"1",technique_discipline:translate("METAPSIONICS")},concert_of_minds:{level:"3",technique_discipline:translate("METAPSIONICS")},cursed_luck:{level:"3",technique_discipline:translate("PRECOGNITION")},deep_intrusion:{level:"4",technique_discipline:translate("TELEPORTATION")},destinys_shield:{level:"2",technique_discipline:translate("PRECOGNITION")},effortless_apportation:{level:"3",technique_discipline:translate("TELEPORTATION")},facile_mind:{level:"1",technique_discipline:translate("TELEPATHY")},far_thought:{level:"2",technique_discipline:translate("TELEPATHY")},flawless_mastery:{level:"4",technique_discipline:translate("METAPSIONICS")},force_puppetry:{level:"4",technique_discipline:translate("TELEKINESIS")},forced_outcome:{level:"3",technique_discipline:translate("PRECOGNITION")},holistic_optimization_patterning:{level:"4",technique_discipline:translate("BIOPSIONICS")},impact_sump:{level:"2",technique_discipline:translate("TELEKINESIS")},impervious_pavis_of_will:{level:"4",technique_discipline:translate("METAPSIONICS")},intuitive_response:{level:"1",technique_discipline:translate("PRECOGNITION")},invincible_stand:{level:"2",technique_discipline:translate("BIOPSIONICS")},kinetic_transversal:{level:"1",technique_discipline:translate("TELEKINESIS")},major_organ_restoration:{level:"2",technique_discipline:translate("BIOPSIONICS")},mastered_succor:{level:"1",technique_discipline:translate("BIOPSIONICS")},memory_editing:{level:"4",technique_discipline:translate("TELEPATHY")},metadimensional_friction:{level:"3",technique_discipline:translate("METAPSIONICS")},metamorph:{level:"3",technique_discipline:translate("BIOPSIONICS")},mindtracing:{level:"1",technique_discipline:translate("METAPSIONICS")},neural_trap:{level:"2",technique_discipline:translate("METAPSIONICS")},not_my_time:{level:"4",technique_discipline:translate("PRECOGNITION")},offensive_apportation:{level:"4",technique_discipline:translate("TELEPORTATION")},oracle:{level:"0",technique_discipline:translate("PRECOGNITION")},organic_purification_protocols:{level:"1",technique_discipline:translate("BIOPSIONICS")},perceptive_dislocation:{level:"2",technique_discipline:translate("TELEPORTATION")},personal_apportation:{level:"0",technique_discipline:translate("TELEPORTATION")},pressure_field:{level:"1",technique_discipline:translate("TELEKINESIS")},proficient_apportation:{level:"1",technique_discipline:translate("TELEPORTATION")},prophecy:{level:"4",technique_discipline:translate("PRECOGNITION")},psychic_refinement:{level:"0",technique_discipline:translate("METAPSIONICS")},psychic_static:{level:"2",technique_discipline:translate("METAPSIONICS")},psychic_succor:{level:"0",technique_discipline:translate("BIOPSIONICS")},psychic_tutelage:{level:"3",technique_discipline:translate("METAPSIONICS")},quintessential_reconstruction:{level:"4",technique_discipline:translate("BIOPSIONICS")},reactive_telekinesis:{level:"3",technique_discipline:translate("TELEKINESIS")},reflex_response:{level:"3",technique_discipline:translate("TELEPATHY")},remote_repair:{level:"1",technique_discipline:translate("BIOPSIONICS")},rift_reduplication:{level:"3",technique_discipline:translate("TELEPORTATION")},sense_the_need:{level:"1",technique_discipline:translate("PRECOGNITION")},slip_field:{level:"2",technique_discipline:translate("TELEKINESIS")},spatial_awareness:{level:"1",technique_discipline:translate("TELEPORTATION")},spatial_synchrony_mandala:{level:"2",technique_discipline:translate("TELEPORTATION")},stutterjump:{level:"3",technique_discipline:translate("TELEPORTATION")},suppress_cognition:{level:"2",technique_discipline:translate("TELEPATHY")},surge_momentum:{level:"3",technique_discipline:translate("METAPSIONICS")},suspended_manifestation:{level:"2",technique_discipline:translate("METAPSIONICS")},synthetic_adaptation:{level:"1",technique_discipline:translate("METAPSIONICS")},tangible_force_construct:{level:"3",technique_discipline:translate("TELEKINESIS")},telekinetic_armory:{level:"1",technique_discipline:translate("TELEKINESIS")},telekinetic_expertise:{level:"2",technique_discipline:translate("TELEKINESIS")},telekinetic_flight:{level:"4",technique_discipline:translate("TELEKINESIS")},telekinetic_manipulation:{level:"0",technique_discipline:translate("TELEKINESIS")},telekinetic_ram:{level:"3",technique_discipline:translate("TELEKINESIS")},telepathic_assault:{level:"3",technique_discipline:translate("TELEPATHY")},telepathic_contact:{level:"0",technique_discipline:translate("TELEPATHY")},teratic_overload:{level:"3",technique_discipline:translate("BIOPSIONICS")},terminal_reflection:{level:"1",technique_discipline:translate("PRECOGNITION")},thermokinesis:{level:"2",technique_discipline:translate("TELEKINESIS")},tissue_integrity_field:{level:"2",technique_discipline:translate("BIOPSIONICS")},transmit_thought:{level:"1",technique_discipline:translate("TELEPATHY")},unity_of_thought:{level:"4",technique_discipline:translate("TELEPATHY")}},weapons:{advanced_bow:{weapon_ammo:"1",weapon_damage:"1d6",weapon_encumbrance:"2",weapon_range:"100/150",weapon_price:"50"},anti_vehicle_laser:{weapon_ammo:"15",weapon_damage:"3d10",weapon_range:"2000/4000",weapon_price:"10000"},combat_rifle:{weapon_ammo:"30",weapon_burst:!0,weapon_damage:"1d12",weapon_encumbrance:"2",weapon_range:"100/300",weapon_price:"300"},combat_shotgun:{weapon_ammo:"12",weapon_burst:!0,weapon_damage:"3d4",weapon_encumbrance:"2",weapon_range:"10/30",weapon_price:"300"},conversion_bow:{weapon_ammo:"1",weapon_damage:"1d8",weapon_encumbrance:"2",weapon_range:"150/300",weapon_price:"500"},crude_pistol:{weapon_ammo:"1",weapon_damage:"1d6",weapon_encumbrance:"1",weapon_range:"5/15",weapon_price:"20"},demo_charge:{weapon_damage:"3d10",weapon_encumbrance:"1",weapon_range:"20/40",weapon_price:"250"},distortion_cannon:{weapon_attack:"1",weapon_ammo:"6",weapon_damage:"2d12",weapon_encumbrance:"2",weapon_range:"100/300",weapon_price:"1250"},grenade:{weapon_damage:"2d6",weapon_encumbrance:"1",weapon_range:"10/30",weapon_price:"25"},heavy_machine_gun:{weapon_ammo:"10",weapon_damage:"3d6",weapon_encumbrance:"3",weapon_range:"500/2000",weapon_price:"5000"},hydra_array:{weapon_ammo:"10",weapon_damage:"3d6",weapon_range:"4000/8000",weapon_price:"20000"},large_advanced_weapon:{weapon_attribute_mod:"@{strength_mod}",weapon_damage:"1d10+1",weapon_encumbrance:"2",weapon_shock_ac:"15",weapon_shock_damage:"2",weapon_skill_bonus:"@{skill_stab}",weapon_price:"80"},large_primitive_weapon:{weapon_attribute_mod:"@{strength_mod}",weapon_damage:"1d8+1",weapon_encumbrance:"2",weapon_shock_ac:"15",weapon_shock_damage:"2",weapon_skill_bonus:"@{skill_stab}",weapon_price:"30"},laser_pistol:{weapon_attack:"1",weapon_ammo:"10",weapon_damage:"1d6",weapon_encumbrance:"1",weapon_range:"100/300",weapon_price:"200"},laser_rifle:{weapon_attack:"1",weapon_ammo:"20",weapon_burst:!0,weapon_damage:"1d10",weapon_encumbrance:"2",weapon_range:"300/500",weapon_price:"300"},mag_pistol:{weapon_ammo:"6",weapon_damage:"2d6+2",weapon_encumbrance:"1",weapon_range:"100/300",weapon_price:"400"},mag_rifle:{weapon_ammo:"10",weapon_damage:"2d8+2",weapon_encumbrance:"2",weapon_range:"300/600",weapon_price:"500"},medium_advanced_weapon:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d8+1",weapon_encumbrance:"1",weapon_shock_ac:"13",weapon_shock_damage:"2",weapon_skill_bonus:"@{skill_stab}",weapon_price:"60"},medium_primitive_weapon:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d6+1",weapon_encumbrance:"1",weapon_shock_ac:"13",weapon_shock_damage:"2",weapon_skill_bonus:"@{skill_stab}",weapon_price:"20"},musket:{weapon_ammo:"1",weapon_damage:"1d12",weapon_encumbrance:"2",weapon_range:"25/50",weapon_price:"30"},plasma_projector:{weapon_attack:"1",weapon_ammo:"6",weapon_damage:"2d8",weapon_encumbrance:"2",weapon_range:"50/100",weapon_price:"400"},primitive_bow:{weapon_ammo:"1",weapon_damage:"1d6",weapon_encumbrance:"2",weapon_range:"50/75",weapon_price:"15"},punch:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d2",weapon_skill_bonus:"@{skill_punch}"},railgun:{weapon_ammo:"20",weapon_damage:"3d8",weapon_range:"4000/8000",weapon_price:"8000"},revolver:{weapon_ammo:"6",weapon_damage:"1d8",weapon_encumbrance:"1",weapon_range:"30/100",weapon_price:"50"},rifle:{weapon_ammo:"6",weapon_damage:"1d10+2",weapon_encumbrance:"2",weapon_range:"200/400",weapon_price:"75"},rocket_launcher:{weapon_ammo:"1",weapon_damage:"3d10",weapon_encumbrance:"2",weapon_range:"2000/4000",weapon_price:"4000"},semi_auto_pistol:{weapon_ammo:"12",weapon_damage:"1d6+1",weapon_encumbrance:"1",weapon_range:"30/100",weapon_price:"75"},shear_rifle:{weapon_attack:"1",weapon_ammo:"10",weapon_burst:!0,weapon_damage:"2d8",weapon_encumbrance:"2",weapon_range:"100/300",weapon_price:"600"},shotgun:{weapon_ammo:"2",weapon_damage:"3d4",weapon_encumbrance:"2",weapon_range:"10/30",weapon_price:"50"},small_advanced_weapon:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d6",weapon_encumbrance:"1",weapon_shock_ac:"15",weapon_shock_damage:"1",weapon_skill_bonus:"@{skill_stab}",weapon_price:"40"},small_primitive_weapon:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d4",weapon_encumbrance:"1",weapon_shock_ac:"15",weapon_shock_damage:"1",weapon_skill_bonus:"@{skill_stab}"},sniper_rifle:{weapon_ammo:"1",weapon_damage:"2d8",weapon_encumbrance:"2",weapon_range:"1000/2000",weapon_price:"400"},spike_thrower:{weapon_ammo:"15",weapon_burst:!0,weapon_damage:"3d8",weapon_encumbrance:"2",weapon_range:"20/40",weapon_price:"600"},stun_baton:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d8",weapon_encumbrance:"1",weapon_shock_ac:"15",weapon_shock_damage:"1",weapon_skill_bonus:"@{skill_stab}",weapon_price:"75"},submachine_gun:{weapon_ammo:"20",weapon_burst:!0,weapon_damage:"1d8",weapon_encumbrance:"1",weapon_range:"30/100",weapon_price:"200"},suit_ripper:{weapon_attribute_mod:"@{str_dex_mod}",weapon_damage:"1d6",weapon_encumbrance:"1",weapon_skill_bonus:"@{skill_stab}",weapon_price:"75"},thermal_pistol:{weapon_attack:"1",weapon_ammo:"5",weapon_damage:"2d6",weapon_encumbrance:"1",weapon_range:"25/50",weapon_price:"300"},thunder_gun:{weapon_attack:"1",weapon_ammo:"6",weapon_damage:"2d10",weapon_encumbrance:"2",weapon_range:"100/300",weapon_price:"1000"},void_carbine:{weapon_ammo:"10",weapon_damage:"2d6",weapon_encumbrance:"2",weapon_range:"100/300",weapon_price:"400"},vortex_cannon:{weapon_ammo:"5",weapon_damage:"5d12",weapon_range:"1000/2000",weapon_price:"75000"},wheatcutter_belt:{weapon_ammo:"5",weapon_damage:"2d12",weapon_range:"10/20",weapon_price:"1000"}}};const sign=e=>{const t=parseInt(e)||0;return t>=0?`+${t}`:`${t}`},sum=e=>e.reduce((e,t)=>e+(parseInt(t)||0),0),buildLink=(e,t,r)=>`[${e}${r?"":","}](~${t})`,mySetAttrs=(e,t,...r)=>{Object.keys(e).forEach(r=>{`${t[r]}`===`${e[r]}`&&delete e[r]}),setAttrs(e,...r)},fillRepeatingSectionFromData=(e,t,r)=>{r=r||(()=>{});const s=[],n=(Array.isArray(t)?t:[t]).map(t=>{const r=(()=>{for(;;){let e=generateRowID();if(!s.includes(e))return s.push(e),e}})();return Object.entries(t).reduce((t,[s,n])=>(t[`repeating_${e}_${r}_${s}`]=`${n}`,t),{})}).reduce((e,t)=>Object.assign(e,t),{});setAttrs(n,{},r)};const calculateSaves=()=>{getAttrs([...attributes.map(e=>`${e}_mod`),"level","homebrew_luck_save","save_physical","save_mental","save_evasion","save_luck"],e=>{const a=16-(parseInt(e.level)||1),t={save_physical:a-(Math.max(parseInt(e.strength_mod),parseInt(e.constitution_mod))||0),save_mental:a-(Math.max(parseInt(e.charisma_mod),parseInt(e.wisdom_mod))||0),save_evasion:a-(Math.max(parseInt(e.intelligence_mod),parseInt(e.dexterity_mod))||0)};"1"===e.homebrew_luck_save&&(t.save_luck=a),mySetAttrs(t,e)})},calculateEffort=()=>{getSectionIDs("repeating_psychic-skills",e=>{getAttrs([...effortAttributes,"psionics_total_effort",...e.map(e=>`repeating_psychic-skills_${e}_skill`)],a=>{const t=Math.max(parseInt(a.wisdom_mod),parseInt(a.constitution_mod))||0,_=Math.max(...skills.psionic.map(e=>parseInt(a[`skill_${e}`])||0),...e.map(e=>parseInt(a[`repeating_psychic-skills_${e}_skill`])||0)),r=Math.max(1+t+_,1)+parseInt(a.psionics_extra_effort)-parseInt(a.psionics_committed_effort_current)-parseInt(a.psionics_committed_effort_scene)-parseInt(a.psionics_committed_effort_day)||0;mySetAttrs({psionics_total_effort:r},a)})})},calculateMagicEffort=()=>{getAttrs(["magic_total_effort","magic_committed_effort_current","magic_committed_effort_scene","magic_committed_effort_day","magic_uncommitted_effort"],e=>{const a=parseInt(e.magic_total_effort)-(parseInt(e.magic_committed_effort_current)+parseInt(e.magic_committed_effort_scene)+parseInt(e.magic_committed_effort_day))||0;mySetAttrs({magic_uncommitted_effort:a},e)})},calculateProcessing=()=>{getSectionIDs("repeating_processing-nodes",e=>{const a=[...e.map(e=>`repeating_processing-nodes_${e}_node_value`),...e.map(e=>`repeating_processing-nodes_${e}_node_connected`),"wisdom_mod","intelligence_mod","ai_extra_processing","ai_committed_processing_current","ai_committed_processing_scene","ai_committed_processing_day","ai_total_processing"];getAttrs(a,a=>{const t=(1+Math.max(parseInt(a.wisdom_mod),parseInt(a.intelligence_mod))||0)+Math.max(...e.filter(e=>"1"===a[`repeating_processing-nodes_${e}_node_connected`]).map(e=>parseInt(a[`repeating_processing-nodes_${e}_node_value`])||0),0)+parseInt(a.ai_extra_processing)-parseInt(a.ai_committed_processing_current)-parseInt(a.ai_committed_processing_scene)-parseInt(a.ai_committed_processing_day)||0;mySetAttrs({ai_total_processing:t},a)})})},calculateAC=()=>{getSectionIDs("repeating_armor",e=>{const a=[...e.map(e=>`repeating_armor_${e}_armor_ac`),...e.map(e=>`repeating_armor_${e}_armor_active`),...e.map(e=>`repeating_armor_${e}_armor_type`),"npc","AC","innate_ac","dexterity_mod"];getAttrs(a,a=>{if("1"===a.npc)return;const t=Math.max(parseInt(a.innate_ac)||0,...e.filter(e=>"1"===a[`repeating_armor_${e}_armor_active`]).filter(e=>"SHIELD"!==a[`repeating_armor_${e}_armor_type`]).map(e=>parseInt(a[`repeating_armor_${e}_armor_ac`])||0)),_=Math.max(0,...e.filter(e=>"1"===a[`repeating_armor_${e}_armor_active`]).filter(e=>"SHIELD"===a[`repeating_armor_${e}_armor_type`]).map(e=>parseInt(a[`repeating_armor_${e}_armor_ac`])||0)),r=(_>0?_<=t?t+1:_:t)+(parseInt(a.dexterity_mod)||0);mySetAttrs({AC:r},a)})})},calculateMaxStrain=()=>{getAttrs(["constitution","strain_max"],e=>{mySetAttrs({strain_max:parseInt(e.constitution)||0},e)})},calculatePermanentStrain=()=>{getAttrs(["cyberware_strain_total","strain_permanent_extra","strain_permanent"],e=>{const a=parseInt(e.cyberware_strain_total)+parseInt(e.strain_permanent_extra)||0;mySetAttrs({strain_permanent:a},e)})},calculateCyberwareStrain=()=>{getSectionIDs("repeating_cyberware",e=>{const a=[...e.map(e=>`repeating_cyberware_${e}_cyberware_strain`),"cyberware_strain_total"];getAttrs(a,a=>{const t=e.reduce((e,t)=>e+=parseInt(a[`repeating_cyberware_${t}_cyberware_strain`])||0,0);mySetAttrs({cyberware_strain_total:t},a)})})},calculateAttr=e=>{getAttrs([e,`${e}_base`,`${e}_boosts`],a=>{const t={[`${e}`]:`${(parseInt(a[`${e}_base`])||10)+(parseInt(a[`${e}_boosts`])||0)}`};mySetAttrs(t,a,null,()=>{calculateMod(e)})})},calculateMod=e=>{getAttrs([e,`${e}_bonus`,`${e}_mod`],a=>{const t=(e=>e>=18?2:e>=14?1:e>=8?0:e>=4?-1:-2)(parseInt(a[e])||10),_={[`${e}_mod`]:`${t+(parseInt(a[`${e}_bonus`])||0)}`};mySetAttrs(_,a,null,()=>{getAttrs([...attributes.map(e=>`${e}_mod`),"level","homebrew_luck_save","save_physical","save_mental","save_evasion","save_luck"],e=>{const a=16-(parseInt(e.level)||1),t={save_physical:a-(Math.max(parseInt(e.strength_mod),parseInt(e.constitution_mod))||0),save_mental:a-(Math.max(parseInt(e.charisma_mod),parseInt(e.wisdom_mod))||0),save_evasion:a-(Math.max(parseInt(e.intelligence_mod),parseInt(e.dexterity_mod))||0)};"1"===e.homebrew_luck_save&&(t.save_luck=a),mySetAttrs(t,e)}),generateWeaponDisplay(),calculateStrDexMod(),"dexterity"===e&&getSectionIDs("repeating_armor",e=>{const a=[...e.map(e=>`repeating_armor_${e}_armor_ac`),...e.map(e=>`repeating_armor_${e}_armor_active`),...e.map(e=>`repeating_armor_${e}_armor_type`),"npc","AC","innate_ac","dexterity_mod"];getAttrs(a,a=>{if("1"===a.npc)return;const t=Math.max(parseInt(a.innate_ac)||0,...e.filter(e=>"1"===a[`repeating_armor_${e}_armor_active`]).filter(e=>"SHIELD"!==a[`repeating_armor_${e}_armor_type`]).map(e=>parseInt(a[`repeating_armor_${e}_armor_ac`])||0)),_=Math.max(0,...e.filter(e=>"1"===a[`repeating_armor_${e}_armor_active`]).filter(e=>"SHIELD"===a[`repeating_armor_${e}_armor_type`]).map(e=>parseInt(a[`repeating_armor_${e}_armor_ac`])||0)),r=(_>0?_<=t?t+1:_:t)+(parseInt(a.dexterity_mod)||0);mySetAttrs({AC:r},a)})})})})},calculateStrDexMod=()=>{getAttrs(["str_dex_mod","strength_mod","dexterity_mod"],e=>{const a=Math.max(parseInt(e.strength_mod),parseInt(e.dexterity_mod))||0;mySetAttrs({str_dex_mod:a},e)})},calculateShellAttrs=()=>{const e=["strength","dexterity","constitution"];getSectionIDs("repeating_shells",a=>{const t=[...a.map(e=>`repeating_shells_${e}_shell_active`),...a.map(e=>`repeating_shells_${e}_shell_strength`),...a.map(e=>`repeating_shells_${e}_shell_dexterity`),...a.map(e=>`repeating_shells_${e}_shell_constitution`),...e,"setting_transhuman_enable","setting_ai_enable"];getAttrs(t,t=>{if("transhuman"===t.setting_transhuman_enable||"ai"===t.setting_ai_enable){let _={};e.forEach(e=>_[e]=a.filter(e=>"1"===t[`repeating_shells_${e}_shell_active`]).map(a=>t[`repeating_shells_${a}_shell_${e}`])[0]||"None"),mySetAttrs(_,t,null,()=>{e.filter(e=>"None"!==_[e]).forEach(e=>calculateMod(e))})}else e.forEach(e=>calculateAttr(e))})})},calculateNextLevelXP=()=>{const e=[0,3,6,12,18,27,39,54,72,93];getAttrs(["level","setting_xp_scheme"],a=>{"xp"===a.setting_xp_scheme?a.level<10?setAttrs({xp_next:e[a.level]}):setAttrs({xp_next:93+24*(a.level-9)}):"money"===a.setting_xp_scheme&&setAttrs({xp_next:2*a.level*2500})})},calculateGearReadiedStowed=()=>{getSectionIDs("repeating_gear",e=>{getSectionIDs("repeating_weapons",a=>{getSectionIDs("repeating_armor",t=>((e,a,t)=>{const _=[...e.map(e=>`repeating_gear_${e}_gear_amount`),...e.map(e=>`repeating_gear_${e}_gear_encumbrance`),...e.map(e=>`repeating_gear_${e}_gear_status`),...e.map(e=>`repeating_gear_${e}_gear_bundled`),...t.map(e=>`repeating_armor_${e}_armor_encumbrance`),...t.map(e=>`repeating_armor_${e}_armor_encumbrance_bonus`),...t.map(e=>`repeating_armor_${e}_armor_status`),...a.map(e=>`repeating_weapons_${e}_weapon_encumbrance`),...a.map(e=>`repeating_weapons_${e}_weapon_status`),"gear_readied","gear_stowed","strength","gear_readied_max","gear_readied_over","gear_stowed_over","gear_stowed_max"];getAttrs(_,_=>{const[r,n]=t.reduce((e,a)=>("READIED"===_[`repeating_armor_${a}_armor_status`]?e[0]+=parseInt(_[`repeating_armor_${a}_armor_encumbrance`])||0:"STOWED"===_[`repeating_armor_${a}_armor_status`]&&(e[1]+=parseInt(_[`repeating_armor_${a}_armor_encumbrance`])||0),e),a.reduce((e,a)=>("READIED"===_[`repeating_weapons_${a}_weapon_status`]?e[0]+=parseInt(_[`repeating_weapons_${a}_weapon_encumbrance`])||0:"STOWED"===_[`repeating_weapons_${a}_weapon_status`]&&(e[1]+=parseInt(_[`repeating_weapons_${a}_weapon_encumbrance`])||0),e),e.reduce((e,a)=>{const t=parseInt(_[`repeating_gear_${a}_gear_amount`])||0;let r=1;return"on"===_[`repeating_gear_${a}_gear_bundled`]&&(r=3),"READIED"===_[`repeating_gear_${a}_gear_status`]?e[0]+=Math.ceil(t*parseFloat(_[`repeating_gear_${a}_gear_encumbrance`])/r)||0:"STOWED"===_[`repeating_gear_${a}_gear_status`]&&(e[1]+=Math.ceil(t*parseFloat(_[`repeating_gear_${a}_gear_encumbrance`])/r)||0),e},[0,0]))),s=Math.max(0,...t.filter(e=>"READIED"===_[`repeating_armor_${e}_armor_status`]).map(e=>parseInt(_[`repeating_armor_${e}_armor_encumbrance_bonus`])||0)),o=parseInt(_.strength)+s||0,i=Math.floor(o/2),p={gear_readied:r,gear_stowed:n,gear_readied_max:i,gear_stowed_max:o,gear_readied_over:parseInt(_.gear_readied)>i?"1":"0",gear_stowed_over:parseInt(_.gear_stowed)>o?"1":"0"};mySetAttrs(p,_,{silent:!0})})})(e,a,t))})})},generateWeaponDisplay=()=>{getSectionIDs("repeating_weapons",e=>{const a=e.map(e=>`repeating_weapons_${e}`),t=[...a.map(e=>`${e}_weapon_attack`),...a.map(e=>`${e}_weapon_name`),...a.map(e=>`${e}_weapon_skill_bonus`),...a.map(e=>`${e}_weapon_attribute_mod`),...a.map(e=>`${e}_weapon_damage`),...a.map(e=>`${e}_weapon_shock`),...a.map(e=>`${e}_weapon_shock_damage`),...a.map(e=>`${e}_weapon_shock_ac`),...a.map(e=>`${e}_weapon_skill_to_damage`),...a.map(e=>`${e}_weapon_attack_display`),...a.map(e=>`${e}_weapon_damage_display`),...attributes.map(e=>`${e}_mod`),...weaponSkills,"attack_bonus","str_dex_mod","macro_weapons"];getAttrs(t,e=>{const t={},_=parseInt(e.attack_bonus)||0;a.forEach(a=>{const r=parseInt(e[(e[`${a}_weapon_attribute_mod`]||"").slice(2,-1)])||0,n=parseInt(e[(e[`${a}_weapon_skill_bonus`]||"").slice(2,-1)])||parseInt(e[`${a}_weapon_skill_bonus`])||0,s=r+("@{weapon_skill_bonus}"===e[`${a}_weapon_skill_to_damage`]?n:0),o="0"===e[`${a}_weapon_damage`]?"":e[`${a}_weapon_damage`],i="0"!==e[`${a}_weapon_shock`]?`, ${(parseInt(e[`${a}_weapon_shock_damage`])||0)+s} ${translate("SHOCK").toLowerCase()}${e[`${a}_weapon_shock_ac`]?` ${translate("VS_AC_LEQ")} ${e[`${a}_weapon_shock_ac`]}`:""}`:"",p=_+(parseInt(e[`${a}_weapon_attack`])||0)+(-1===n?-2:n)+r,m=o+(o?0===s?"":s>0?` + ${s}`:` - ${-s}`:s);t[`${a}_weapon_attack_display`]=p>=0?`+${p}`:p,t[`${a}_weapon_damage_display`]=`${m||0} ${translate("DAMAGE").toLowerCase()}${i}`}),t.macro_weapons=a.map((_,r)=>{const n=`${e[`${_}_weapon_name`]} (${t[`${_}_weapon_attack_display`]})`;return buildLink(n,`${_}_attack`,r===a.length-1)}).join(" "),mySetAttrs(t,e,{silent:!0})})})},handleAmmoAPI=e=>{const a="weapons"===e?"[[-1 - @{weapon_burst}]]":"-1";getSectionIDs(`repeating_${e}`,t=>{getAttrs(["setting_use_ammo",...t.map(a=>`repeating_${e}_${a}_weapon_use_ammo`),...t.map(a=>`repeating_${e}_${a}_weapon_api`)],_=>{const r=t.reduce((t,r)=>(t[`repeating_${e}_${r}_weapon_api`]="1"===_.setting_use_ammo&&"0"!==_[`repeating_${e}_${r}_weapon_use_ammo`]?`\n!modattr --mute --charid @{character_id} --repeating_${e}_${r}_weapon_ammo|${a}`:"",t),{});mySetAttrs(r,_,{silent:!0})})})};const validateTab=()=>{getAttrs(["tab","npc"],t=>{"character"===t.tab&&"1"===t.npc&&setAttrs({tab:"npc"}),"npc"===t.tab&&"0"===t.npc&&setAttrs({tab:"character"})})},validateSuperTab=()=>{getAttrs(["setting_super_type","tab_super"],t=>{const e={};"magic"===t.setting_super_type&&(e.tab_super="magic"),"psionics"===t.setting_super_type&&(e.tab_super="psionics"),mySetAttrs(e,t)})},validateStrain=()=>{getAttrs(["strain","strain_permanent","strain_max"],t=>{const e=parseInt(t.strain)||0,s=parseInt(t.strain_permanent)||0,l=Math.min(parseInt(t.strain_max),Math.max(e,s))||0;l!==e&&setAttrs({strain:l})})},validateWeaponSkills=t=>{const e=t&&t.map(t=>`repeating_weapons_${t}`)||["repeating_weapons"];getAttrs(["homebrew_skill_list",...e.map(t=>`${t}_weapon_skill_bonus`)],t=>{const s=["@{skill_exert}","@{skill_punch}","@{skill_shoot}","@{skill_stab}","@{skill_telekinesis}","0"],l=["@{skill_combat_energy}","@{skill_combat_gunnery}","@{skill_combat_primitive}","@{skill_combat_projectile}","@{skill_combat_psitech}","@{skill_combat_unarmed}","@{skill_telekinesis}","0"],i=t.homebrew_skill_list,a={};e.forEach(e=>{"revised"!==i||s.includes(t[`${e}_weapon_skill_bonus`])||(a[`${e}_weapon_skill_bonus`]="@{skill_shoot}"),"first"!==i||l.includes(t[`${e}_weapon_skill_bonus`])||(a[`${e}_weapon_skill_bonus`]="@{skill_combat_energy}")}),setAttrs(a)})},validateShells=t=>{console.log(t.sourceAttribute),console.log(t.sourceAttribute.slice(17,-13)),console.log(t.sourceAttribute.slice(-6)),"active"===t.sourceAttribute.slice(-6)?(console.log("Changing"),getSectionIDs("repeating_shells",e=>{const s={};(e=e.filter(e=>e!==t.sourceAttribute.slice(17,-13))).forEach(t=>s[`repeating_shells_${t}_shell_active`]="0"),setAttrs(s,()=>{calculateShellAttrs()})})):(console.log("No change needed"),calculateShellAttrs())};const fillNPC=()=>{getAttrs(["npc_stat_block"],t=>{if(t.npc_stat_block&&autofillData.statblocks[t.npc_stat_block]){const[a,c,_,e,n,s,p,r,k,l]=autofillData.statblocks[t.npc_stat_block],o={AC:c,npc_attack_bonus:_,npc_move:s,npc_morale:p,npc_skills:r,npc_saves:k};if(l&&(o.npc_armor_type=l),a.includes("hp")?o.HP=a.replace("hp",""):o.npc_hd=a,setAttrs(o),"Unarmed"!==e){const t={attack_ab:_,attack_damage:e,attack_name:translate("ATTACK"),attack_number:n};fillRepeatingSectionFromData("npc-attacks",t)}}})},addNPCAttackBonus=()=>{getAttrs(["repeating_npc-attacks_attack_ab","npc_attack_bonus"],t=>{"0"===`${t["repeating_npc-attacks_attack_ab"]}`&&setAttrs({"repeating_npc-attacks_attack_ab":t.npc_attack_bonus})})},setNPCMultiAttacks=()=>{getSectionIDs("repeating_npc-attacks",t=>{const a=[...t.map(t=>`repeating_npc-attacks_${t}_attack_number`),"npc_roll_full_attack"];getAttrs(a,a=>{const c=t.reduce((t,c)=>{if("1"===a.npc_roll_full_attack){const _=parseInt(a[`repeating_npc-attacks_${c}_attack_number`])||1;t[`repeating_npc-attacks_${c}_attack_extra_macro`]=[2,3,4,5,6,7,8].map(t=>t<=_?`{{attack${t}=[[1d20 + @{attack_ab} @{attack_burst} @{modifier_query}]]}} `+`{{damage${t}=[[@{attack_damage} @{attack_burst}]]}} `:"").join("")}else t[`repeating_npc-attacks_${c}_attack_extra_macro`]="";return t},{});setAttrs(c)})})},handleNPCRollHide=()=>{const t=["hp","initiative","save","skill","morale","reaction"];getAttrs(["npc_rolls_hidden",...t.map(t=>`npc_${t}_hidden`)],a=>{const c=t.reduce((t,c)=>(t[`npc_${c}_hidden`]=a.npc_rolls_hidden,t),{});mySetAttrs(c,a)})};const skillToMacro=i=>e=>{return["culture_one","culture_two","culture_three","culture_alien","profession","magic2"].includes(e)?[`@{skill_${e}_name} (${sign(i[`skill_${e}`])})`,`skill_${e}`]:[`^{${e.toUpperCase()}} (${sign(i[`skill_${e}`])})`,`skill_${e}`]},idToSkillMacro=(i,e)=>t=>{const s=`repeating_${e}_${t}_skill`;return[`${i[`${s}_name`]} (${sign(i[s])})`,s]},buildSkillMacro=([i,e],t,s)=>buildLink(i,e,t+1===s.length),buildSaveMenu=()=>{getAttrs(["homebrew_luck_save","macro_saves"],i=>{const e=buildLink("^{PHYSICAL} (v@{save_physical})","save_physical")+" "+buildLink("^{MENTAL} (v@{save_mental})","save_mental")+" "+buildLink("^{EVASION} (v@{save_evasion})","save_evasion","1"!==i.homebrew_luck_save)+("1"===i.homebrew_luck_save?" "+buildLink("^{LUCK} (v@{save_luck})","save_luck",!0):"");mySetAttrs({macro_saves:e},i)})},buildSkillMenu=()=>{getSectionIDs("repeating_skills",i=>{const e=[...skills.revised.map(i=>`skill_${i}`),...skills.first.map(i=>`skill_${i}`),"homebrew_skill_list","setting_show_untrained_skills","macro_skills",...i.map(i=>`repeating_skills_${i}_skill_name`),...i.map(i=>`repeating_skills_${i}_skill`)];getAttrs(e,e=>{const t=skills[e.homebrew_skill_list]||[],s=t.filter(i=>"-1"!==e[`skill_${i}`]).length||i.filter(i=>"-1"!==e[`repeating_skills_${i}_skill`]).length,a=`${[...t.filter(i=>"-1"!==e[`skill_${i}`]).map(skillToMacro(e)),...i.filter(i=>"-1"!==e[`repeating_skills_${i}_skill`]).map(idToSkillMacro(e,"skills"))].map(buildSkillMacro).join(" ")}${"1"===e.setting_show_untrained_skills?`${s?"\n\n**^{UNTRAINED}**\n":""}${[...t.filter(i=>"-1"===e[`skill_${i}`]).map(skillToMacro(e)),...i.filter(i=>"-1"===e[`repeating_skills_${i}_skill`]).map(idToSkillMacro(e,"skills"))].map(buildSkillMacro).join(" ")}`:""}`;mySetAttrs({macro_skills:a},e)})})},buildPsionicsMenu=()=>{getSectionIDs("repeating_techniques",i=>{getSectionIDs("repeating_psychic-skills",e=>{const t=[...skills.psionic.map(i=>`skill_${i}`),"setting_super_type","macro_psionics",...e.map(i=>`repeating_psychic-skills_${i}_skill_name`),...e.map(i=>`repeating_psychic-skills_${i}_skill`),...i.map(i=>`repeating_techniques_${i}_technique_name`)];getAttrs(t,t=>{if("magic"===t.setting_super_type||"neither"===t.setting_super_type)return;const s=`${[...skills.psionic.filter(i=>"-1"!==t[`skill_${i}`]).map(skillToMacro(t)),...e.filter(i=>"-1"!==t[`repeating_psychic-skills_${i}_skill`]).map(idToSkillMacro(t,"psychic-skills"))].map(buildSkillMacro).join(" ")}${i.length?"\n\n":""}${i.map((i,e,s)=>buildLink(t[`repeating_techniques_${i}_technique_name`],`repeating_techniques_${i}_technique`,e+1===s.length)).join(" ")}`;mySetAttrs({macro_psionics:s},t)})})})},buildMagicMenu=()=>{getSectionIDs("repeating_spells",i=>{getSectionIDs("repeating_magic-skills",e=>{const t=["skill_magic","skill_magic2","skill_magic2_name","setting_super_type","macro_magic",...e.map(i=>`repeating_magic-skills_${i}_skill_name`),...e.map(i=>`repeating_magic-skills_${i}_skill`),...i.map(i=>`repeating_spells_${i}_spell_name`)];getAttrs(t,t=>{if("psionics"===t.setting_super_type||"neither"===t.setting_super_type)return;const s=`${[...(t.skill_magic2_name?["magic","magic2"]:["magic"]).map(skillToMacro(t)),...e.map(idToSkillMacro(t,"magic-skills"))].map(buildSkillMacro).join(" ")}${i.length?"\n\n":""}${i.map(i=>buildLink(t[`repeating_spells_${i}_spell_name`],`repeating_spells_${i}_spell`)).join(" ")}`;mySetAttrs({macro_magic:s},t)})})})},buildShipWeaponsMenu=()=>{getSectionIDs("repeating_ship-weapons",i=>{const e=[...i.map(i=>`repeating_ship-weapons_${i}_weapon_name`),...i.map(i=>`repeating_ship-weapons_${i}_weapon_attack_bonus`),"macro_ship_weapons"];getAttrs(e,e=>{const t=i.map((t,s)=>{const a=e[`repeating_ship-weapons_${t}_weapon_name`]+` ${sign(e[`repeating_ship-weapons_${t}_weapon_attack_bonus`])}`;return buildLink(a,`repeating_ship-weapons_${t}_attack`,s+1===i.length)}).join(" ");mySetAttrs({macro_ship_weapons:t},e)})})},buildAttacksMenu=()=>{getSectionIDs("repeating_npc-attacks",i=>{const e=[...i.map(i=>`repeating_npc-attacks_${i}_attack_name`),...i.map(i=>`repeating_npc-attacks_${i}_attack_ab`),...i.map(i=>`repeating_npc-attacks_${i}_attack_number`),"macro_npc_attacks"];getAttrs(e,e=>{const t=i.map((t,s)=>{const a=e[`repeating_npc-attacks_${t}_attack_name`]+` ${sign(e[`repeating_npc-attacks_${t}_attack_ab`])}`+("1"!==e[`repeating_npc-attacks_${t}_attack_number`]?` (${e[`repeating_npc-attacks_${t}_attack_number`]} attacks)`:"");return buildLink(a,`repeating_npc-attacks_${t}_attack`,s+1===i.length)}).join(" ");mySetAttrs({macro_npc_attacks:t},e)})})},buildAbilitiesMenu=()=>{getSectionIDs("repeating_npc-abilities",i=>{const e=[...i.map(i=>`repeating_npc-abilities_${i}_ability_name`),"macro_npc_abilities"];getAttrs(e,e=>{const t=i.map((t,s)=>buildLink(e[`repeating_npc-abilities_${t}_ability_name`],`repeating_npc-abilities_${t}_ability`,s+1===i.length)).join(" ");mySetAttrs({macro_npc_abilities:t},e)})})},buildStatblock=()=>{getAttrs(["npc","macro_npc_abilities","macro_npc_attacks","macro_statblock"],i=>{if("1"!==i.npc)return;const e=["[**^{SAVES}** v@{npc_saves},](~npc_save) [**^{SKILLS}** +@{npc_skills},](~npc_skill) ","[**^{MORALE}** v@{npc_morale}](~npc_morale)\n","[**^{INITIATIVE_FIXED}** d8,](~npc_initiative) [**^{REACTION}** 2d6,](~npc_reaction) ","**Move** @{npc_move}\n"];i.macro_npc_attacks&&e.push("\n**Attacks:** @{macro_npc_attacks}"),i.macro_npc_abilities&&e.push("\n**Abilities:** @{macro_npc_abilities}"),mySetAttrs({macro_statblock:e.join("")},i)})};const fillClassStats=()=>{getAttrs(["class","class_ability","attack_bonus"],e=>{const a=e.class&&reverseClasses[e.class.toLowerCase()];if(a&&autofillData.classes.hasOwnProperty(a)){const t=Object.assign({},autofillData.classes[a]);Object.keys(t).forEach(a=>{["","0"].includes(`${e[a]}`)||delete t[a]}),mySetAttrs(t,e)}})},getShipMultiplier=e=>"frigate"===(e||"").toLowerCase()?2:"cruiser"===(e||"").toLowerCase()?3:"capital"===(e||"").toLowerCase()?4:1,getShipPriceMultiplier=e=>"frigate"===(e||"").toLowerCase()?10:"cruiser"===(e||"").toLowerCase()?25:"capital"===(e||"").toLowerCase()?100:1,getAutofillData=(e,a,t,s)=>{const r=Object.assign({},t);return"ship-defenses"===e&&(s&&(r.defense_name=translate(s.toUpperCase())),r.defense_mass.includes("#")&&(r.defense_mass=`${parseInt(r.defense_mass)*a.ship_multiplier}`),r.defense_price.includes("*")&&(r.defense_price=`${parseInt(r.defense_price)*a.ship_price_multiplier}`)),"ship-fittings"===e&&(s&&(r.fitting_name=translate(s.toUpperCase()),r.fitting_effect=translate(`${s.toUpperCase()}_DESC`)),r.fitting_mass.includes("#")&&(r.fitting_mass=`${Math.round(parseFloat(r.fitting_mass)*a.ship_multiplier)}`),r.fitting_power.includes("#")&&(r.fitting_power=`${parseInt(r.fitting_power)*a.ship_multiplier}`),r.fitting_price.includes("*")&&(r.fitting_price=`${parseInt(r.fitting_price)*a.ship_price_multiplier}`)),"ship-weapons"===e&&(s&&(r.weapon_name=translate(s.toUpperCase())),r.weapon_ammo&&(r.weapon_ammo_max=r.weapon_ammo,r.weapon_use_ammo="{{ammo=[[@{weapon_ammo} - 1]] / @{weapon_ammo_max}}}")),"weapons"===e&&(s&&(r.weapon_name=translate(s.toUpperCase()),r.weapon_description=translate(`${s.toUpperCase()}_DESC`)),r.weapon_ammo&&(r.weapon_ammo_max=r.weapon_ammo,r.weapon_use_ammo="{{ammo=[[0@{weapon_ammo} - (1 @{weapon_burst})]] / @{weapon_ammo|max}}}"),r.weapon_shock_damage&&(r.weapon_shock="{{shock=[[@{weapon_shock_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill]]] ^{SHOCK_DAMAGE_AGAINST_AC_LEQ} @{weapon_shock_ac}!}}"),r.weapon_burst&&(r.weapon_burst="@{burst_query}"),r.weapon_attribute_mod||(r.weapon_attribute_mod="@{dexterity_mod}")),"armor"===e&&s&&(r.armor_name=translate(s.toUpperCase()),r.armor_description=translate(`${s.toUpperCase()}_DESC`)||""),"cyberware"===e&&s&&(r.cyberware_name=translate(s.toUpperCase()),r.cyberware_description=translate(`${s.toUpperCase()}_DESC`)),"foci"===e&&s&&(r.focus_name=translate(s.toUpperCase()),r.focus_level="1",r.focus_description=translate(`${s.toUpperCase()}_DESC`)),"techniques"===e&&s&&(r.technique_name=translate(s.toUpperCase()),r.technique_description=translate(`${s.toUpperCase()}_DESC`)),"gear"===e&&(s&&(r.gear_name=translate(s.toUpperCase()),r.gear_description=translate(`${s.toUpperCase()}_DESC`)),"1#"===r.gear_encumbrance&&(r.gear_encumbrance="1",r.gear_bundled="on")),r},getAutofillInfo=(e,a,t,s)=>{const r=getAutofillData(e,a,t,s),n=new Intl.NumberFormat;if("ship-defenses"===e)return`${translate(r.class)}+. ${translate("POWER_INIT")}: ${r.defense_power}, ${translate("MASS_INIT")}: ${r.defense_mass}, ${translate("CREDITS")}: ${n.format(r.defense_price)}. ${r.defense_effect}`;if("ship-fittings"===e)return`${translate(r.class)}+. ${translate("POWER_INIT")}: ${r.fitting_power}, ${translate("MASS_INIT")}: ${r.fitting_mass}, ${translate("CREDITS")}: ${n.format(r.fitting_price)} ${r.fitting_effect}`;if("ship-weapons"===e)return`${translate(r.class)}+. ${translate("POWER_INIT")}: ${r.weapon_power}, ${translate("MASS_INIT")}: ${r.weapon_mass}, ${translate("HARDPOINTS_INIT")}: ${r.weapon_hardpoints}, ${translate("CREDITS")}: ${n.format(r.weapon_price)}. ${translate("DAMAGE_SHORT")} ${r.weapon_damage}. ${r.weapon_qualities}${r.weapon_ammo?`, ${translate("AMMO")}: ${r.weapon_ammo}`:""}.`;if("weapons"===e){const e=e=>"@{dexterity_mod}"===e?translate("DEXTERITY_SHORT"):"@{strength_mod}"===e?translate("STRENGTH_SHORT"):"@{str_dex_mod}"===e?translate("STR_DEX"):void 0;return`${translate("DAMAGE_SHORT")} ${r.weapon_damage}${r.weapon_burst?` (${translate("BURST")})`:""}${r.weapon_ab?`, ${translate("ATTACK_BONUS_SHORT")} +${r.weapon_ab}`:""}${r.weapon_range?`, ${translate("RANGE")} ${r.weapon_range}`:""}${r.weapon_ammo?`, ${translate("AMMO")} ${r.weapon_ammo}`:""}${r.weapon_shock?`, ${r.weapon_shock_damage} ${translate("SHOCK_DAMAGE_AGAINST_AC_LEQ")} ${r.weapon_shock_ac}`:""}, +${e(r.weapon_attribute_mod)}${r.weapon_encumbrance?`, ${translate("ENCUMBRANCE_SHORT")} ${r.weapon_encumbrance}`:""}${r.weapon_price?`, ${translate("CREDITS")}: ${n.format(r.weapon_price)}`:""}.`}return"armor"===e?`${translate("AC")} ${r.armor_ac}, ${translate(r.armor_type)}, ${translate("ENCUMBRANCE_SHORT")} ${r.armor_encumbrance}, ${translate("CREDITS")}: ${n.format(r.armor_price)}.`:"cyberware"===e?`${translate("STRAIN")}: ${r.cyberware_strain}, ${translate("CREDITS")}: ${n.format(r.cyberware_price)}.`:"techniques"===e?"0"===r.level?`${translate("CORE_TECHNIQUE")}.`:`${translate("LEVEL")}-${r.level}.`:"gear"===e?`${translate("ENCUMBRANCE_SHORT")} ${r.gear_encumbrance}${"on"===r.gear_bundled?"#":""}${r.gear_price?`, ${translate("CREDITS")}: ${n.format(r.gear_price)}`:""}.`:""},generateAutofillRow=e=>{getAttrs([`generate_${e}_source`,"ship_class"],a=>{const t=a[`generate_${e}_source`];if(a.ship_multiplier=getShipMultiplier(a.ship_class),a.ship_price_multiplier=getShipPriceMultiplier(a.ship_class),t&&autofillData[e].hasOwnProperty(t)){const s=getAutofillData(e,a,autofillData[e][t],t);delete s.class,delete s.level,fillRepeatingSectionFromData(e,s)}})},generateAutofillInfo=e=>{getAttrs([`generate_${e}_source`,"ship_class"],a=>{const t=a[`generate_${e}_source`];if(a.ship_multiplier=getShipMultiplier(a.ship_class),a.ship_price_multiplier=getShipPriceMultiplier(a.ship_class),t&&autofillData[e].hasOwnProperty(t)){const s=getAutofillInfo(e,a,autofillData[e][t],t);s&&setAttrs({[`generate_${e}_info`]:s})}else setAttrs({[`generate_${e}_info`]:" "})})};const setTranslatedDefaults=()=>{const t={skill_culture_alien_name:{trans:`${translate("CULTURE_ALIEN")}/`,default:"Culture/Alien/"},skill_culture_one_name:{trans:`${translate("CULTURE")}/`,default:"Culture/"},skill_culture_two_name:{trans:`${translate("CULTURE")}/`,default:"Culture/"},skill_culture_three_name:{trans:`${translate("CULTURE")}/`,default:"Culture/"},skill_profession_name:{trans:`${translate("PROFESSION")}/`,default:"Profession/"}};getAttrs([...Object.keys(t),"homebrew_skill_list","innate_ac_name"],e=>{const r={};"first"===e.homebrew_skill_list&&Object.entries(t).forEach(([t,a])=>{e[t]===a.default&&e[t]!==a.trans&&(r[t]=a.trans)}),r.innate_ac_name=translate("INNATE_AC"),mySetAttrs(r,e)})},handleAttributeQueries=()=>{const t=attributes.map(t=>{const e=translate(t.toUpperCase());return`${e},+ @{${t}_mod}[${e}]]]}} `+`{{attribute= + ${translate(`${t.toUpperCase()}_SHORT`)}}}`});getAttrs(["attribute_query","setting_skill_query",...attributes.map(t=>`attribute_query_${t.slice(0,3)}`)],e=>{"hover"===e.setting_skill_query||"hide"===e.setting_skill_query?mySetAttrs({attribute_query:`?{${translate("ATTRIBUTE")}|${[t[0],...t.slice(1)].join("|")}}`,attribute_query_str:`+ @{strength_mod}[${translate("STRENGTH")}]]]}} {{attribute= + ${translate("STRENGTH_SHORT")}}}`,attribute_query_dex:`+ @{dexterity_mod}[${translate("DEXTERITY")}]]]}} {{attribute= + ${translate("DEXTERITY_SHORT")}}}`,attribute_query_con:`+ @{constitution_mod}[${translate("CONSTITUTION")}]]]}} {{attribute= + ${translate("CONSTITUTION_SHORT")}}}`,attribute_query_int:`+ @{intelligence_mod}[${translate("INTELLIGENCE")}]]]}} {{attribute= + ${translate("INTELLIGENCE_SHORT")}}}`,attribute_query_wis:`+ @{wisdom_mod}[${translate("WISDOM")}]]]}} {{attribute= + ${translate("WISDOM_SHORT")}}}`,attribute_query_cha:`+ @{charisma_mod}[${translate("CHARISMA")}]]]}} {{attribute= + ${translate("CHARISMA_SHORT")}}}`},e):"query"===e.setting_skill_query&&mySetAttrs({attribute_query:`?{${translate("ATTRIBUTE")}|${[t[0],...t.slice(1)].join("|")}}`,attribute_query_str:`?{${translate("ATTRIBUTE")}|${[t[0],...t.slice(1)].join("|")}}`,attribute_query_dex:`?{${translate("ATTRIBUTE")}|${[t[1],t[0],...t.slice(2)].join("|")}}`,attribute_query_con:`?{${translate("ATTRIBUTE")}|${[t[2],...t.slice(0,2),...t.slice(3)].join("|")}}`,attribute_query_int:`?{${translate("ATTRIBUTE")}|${[t[3],...t.slice(0,3),...t.slice(4)].join("|")}}`,attribute_query_wis:`?{${translate("ATTRIBUTE")}|${[t[4],...t.slice(0,4),...t.slice(5)].join("|")}}`,attribute_query_cha:`?{${translate("ATTRIBUTE")}|${[t[5],...t.slice(0,5)].join("|")}}`},e)})},handleModifierQuery=()=>{getAttrs(["modifier_query","setting_modifier_query"],t=>{"1"===`${t.setting_modifier_query}`?mySetAttrs({modifier_query:`+ ?{${translate("MODIFIER")}|0}[${translate("MODIFIER_SHORT")}]`},t):mySetAttrs({modifier_query:" "},t)})},setTranslatedQueries=()=>{getAttrs(["burst_query","extra_hp_query","translation_numdice","proficient_query","skill_name_query"],t=>{const e={burst_query:`?{${translate("BURST")}|${translate("YES")},+ 2[${translate("BURST")}]|${translate("NO")},&`+"#32;}",extra_hp_query:`?{${translate("EXTRA_HP_QUERY")}|0}[${translate("BONUS")}]`,proficient_query:`?{${translate("PROFICIENT")}|${translate("YES")}, @{npc_skills}|${translate("NO")}, 0}[${translate("SKILL")}]`,skill_name_query:`?{${translate("SKILL_NAME")}|${translate("SKILL")}}`,translation_numdice:translate("NUMBER_OF_DICE")};mySetAttrs(e,t)})};const fillShipStats=()=>{getAttrs(["ship_hulltype",...shipStats],s=>{const e=s.ship_hulltype&&reverseHullTypes[s.ship_hulltype.toLowerCase()];if(e&&autofillData.hulltypes.hasOwnProperty(e)){const p=Object.assign({},autofillData.hulltypes[e]);p.ship_hp_max=p.ship_hp,Object.keys(p).forEach(e=>{!["",0,"0"].includes(s[e])&&s.hasOwnProperty(e)&&delete p[e]}),mySetAttrs(p,s),calculateShipStats()}})},setShipClass=()=>{getAttrs(["ship_class","ship_class_normalised"],s=>{["fighter",translate("FIGHTER").toLowerCase()].includes(s.ship_class.toLowerCase())?setAttrs({ship_class_normalised:"fighter"}):["frigate",translate("FRIGATE").toLowerCase()].includes(s.ship_class.toLowerCase())?setAttrs({ship_class_normalised:"frigate"}):["cruiser",translate("CRUISER").toLowerCase()].includes(s.ship_class.toLowerCase())?setAttrs({ship_class_normalised:"cruiser"}):mySetAttrs({ship_class_normalised:""},s)})},calculateShipStats=()=>{getSectionIDs("repeating_ship-weapons",s=>getSectionIDs("repeating_ship-fittings",e=>{getSectionIDs("repeating_ship-defenses",p=>((s,e,p)=>{const i=[...s.map(s=>`repeating_ship-weapons_${s}_weapon_power`),...s.map(s=>`repeating_ship-weapons_${s}_weapon_mass`),...s.map(s=>`repeating_ship-weapons_${s}_weapon_hardpoints`),...s.map(s=>`repeating_ship-weapons_${s}_weapon_price`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_power`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_mass`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_price`),...p.map(s=>`repeating_ship-defenses_${s}_defense_power`),...p.map(s=>`repeating_ship-defenses_${s}_defense_mass`),...p.map(s=>`repeating_ship-defenses_${s}_defense_price`),"ship_power_max","ship_mass_max","ship_hardpoints_max","ship_power","ship_mass","ship_hardpoints","ship_price","ship_hull_price","ship_calculate_price"];getAttrs(i,i=>{const t={ship_power:i.ship_power_max-sum([...s.map(s=>`repeating_ship-weapons_${s}_weapon_power`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_power`),...p.map(s=>`repeating_ship-defenses_${s}_defense_power`)].map(s=>i[s])),ship_mass:i.ship_mass_max-sum([...s.map(s=>`repeating_ship-weapons_${s}_weapon_mass`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_mass`),...p.map(s=>`repeating_ship-defenses_${s}_defense_mass`)].map(s=>i[s])),ship_hardpoints:i.ship_hardpoints_max-sum(s.map(s=>i[`repeating_ship-weapons_${s}_weapon_hardpoints`]))};"1"===i.ship_calculate_price&&(t.ship_price=(new Intl.NumberFormat).format(parseInt(i.ship_hull_price)+sum([...s.map(s=>`repeating_ship-weapons_${s}_weapon_price`),...e.map(s=>`repeating_ship-fittings_${s}_fitting_price`),...p.map(s=>`repeating_ship-defenses_${s}_defense_price`)].map(s=>i[s])))),console.log(t),mySetAttrs(t,i,{silent:!0})})})(s,e,p))}))};const fillDroneStats=()=>{getAttrs(["repeating_drones_drone_model"],e=>{const t=(e.repeating_drones_drone_model||"").toLowerCase().trim().replace(/ /g,"_");if(autofillData.drones.hasOwnProperty(t)){const e=Object.entries(autofillData.drones[t]).reduce((e,[t,n])=>(e[`repeating_drones_${t}`]=n,e),{});e.repeating_drones_drone_HP_max=e.repeating_drones_drone_HP,setAttrs(e)}})},fillDroneFitting=e=>{const t=`repeating_drones_drone_fitting_${e}`;getAttrs([`${t}_desc`,`${t}_name`],e=>{const n=(e[`${t}_name`]||"").toLowerCase().trim().replace(/ /g,"_");""===e[`${t}_desc`]&&autofillData.droneFittings.includes(n)&&setAttrs({[`${t}_desc`]:translate(`${n.toUpperCase()}_DESC`)})})},calculateDroneAttack=(e,t)=>{const n=e.reduce((e,t)=>e.concat([`${t}_drone_weapon1_ab`,`${t}_drone_weapon1_active`,`${t}_drone_weapon1_attack`,`${t}_drone_weapon1_skill`,`${t}_drone_weapon2_ab`,`${t}_drone_weapon2_active`,`${t}_drone_weapon2_attack`,`${t}_drone_weapon2_skill`,`${t}_drone_weapon3_ab`,`${t}_drone_weapon3_active`,`${t}_drone_weapon3_attack`,`${t}_drone_weapon3_skill`]),["attack_bonus","intelligence_mod","skill_pilot","skill_program","npc","npc_attack_bonus"]);getAttrs(n,n=>{let _,a,o;"1"!==n.npc?(_=Math.max(parseInt(n.skill_pilot),parseInt(n.skill_program))||0,a=parseInt(n.intelligence_mod)||0,o=parseInt(n.attack_bonus)||0):(_=0,a=0,o=parseInt(n.npc_attack_bonus)||0);const r=e.reduce((e,t)=>([1,2,3].filter(e=>"1"===n[`${t}_drone_weapon${e}_active`]).forEach(r=>{e[`${t}_drone_weapon${r}_attack`]=a+o+(-1===_?-2:_)+parseInt(n[[`${t}_drone_weapon${r}_ab`]]||0),e[`${t}_drone_weapon${r}_skill`]=-1===_?-2:_}),e),{});mySetAttrs(r,n,t)})};const handleUpgrade=()=>{getAttrs(["character_sheet"],e=>{e.character_sheet&&0===e.character_sheet.indexOf(sheetName)?e.character_sheet.slice(32)!==sheetVersion&&upgradeSheet(e.character_sheet.slice(32),!0):upgradeFrom162()})},upgradeSheet=(e,a=!1,t=!1)=>{const s=e=>{const[a,t,s]=e.split(".").map(e=>parseInt(e));if(console.log(`Upgrading from version ${e}.`),2===a&&t<1){const e=_.after(4,()=>{buildShipWeaponsMenu(),buildAttacksMenu(),buildMagicMenu(),generateWeaponDisplay(),attributes.forEach(calculateMod),upgradeSheet("2.1.0")});getSectionIDs("repeating_weapons",_=>{const a=[..._.map(e=>`repeating_weapons_${e}_weapon_burst`),..._.map(e=>`repeating_weapons_${e}_weapon_shock_damage`),..._.map(e=>`repeating_weapons_${e}_weapon_ammo`)];getAttrs(a,a=>{const t=_.reduce((e,_)=>("0"===a[`repeating_weapons_${_}_weapon_burst`]?e[`repeating_weapons_${_}_weapon_burst`]="":"2"===a[`repeating_weapons_${_}_weapon_burst`]&&(e[`repeating_weapons_${_}_weapon_burst`]="+ 2[Burst]"),"0"!==a[`repeating_weapons_${_}_weapon_shock_damage`]&&(e[`repeating_weapons_${_}_weapon_shock`]="{{shock=[[@{weapon_shock_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill]]] ^{SHOCK_DAMAGE_AGAINST_AC_LEQ} @{weapon_shock_ac}!}}"),a[`repeating_weapons_${_}_weapon_ammo`]&&"0"!==a[`repeating_weapons_${_}_weapon_ammo`]&&(e[`repeating_weapons_${_}_weapon_use_ammo`]="{{ammo=[[0@{weapon_ammo} - (1 @{weapon_burst})]] / @{weapon_ammo|max}}}"),e),{});setAttrs(t,{},e)})}),getSectionIDs("repeating_ship-weapons",_=>{getAttrs(_.map(e=>`repeating_ship-weapons_${e}_weapon_ammo_max`),a=>{const t=_.reduce((e,_)=>(a[`repeating_ship-weapons_${_}_weapon_ammo_max`]&&"0"!==a[`repeating_ship-weapons_${_}_weapon_ammo_max`]&&(e[`repeating_ship-weapons_${_}_weapon_use_ammo`]="{{ammo=[[@{weapon_ammo} - 1]] / @{weapon_ammo_max}}}"),e),{});setAttrs(t,{},e)})}),getSectionIDs("repeating_npc-attacks",_=>{getAttrs(_.map(e=>`repeating_npc-attacks_${e}_attack_burst`),a=>{const t=_.reduce((e,_)=>("0"===a[`repeating_npc-attacks_${_}_attack_burst`]?e[`repeating_npc-attacks_${_}_attack_burst`]="":"2"===a[`repeating_npc-attacks_${_}_attack_burst`]&&(e[`repeating_npc-attacks_${_}_attack_burst`]="+ 2[Burst]"),e),{});setAttrs(t,{},e)})}),getSectionIDs("repeating_gear",_=>{getAttrs(_.map(e=>`repeating_gear_${e}_gear_status`),a=>{const t=_.reduce((e,_)=>(e[`repeating_gear_${_}_gear_status`]=(a[`repeating_gear_${_}_gear_status`]||"").toUpperCase(),e),{});mySetAttrs(t,a,{},e)})})}else if(2===a&&t<2){const e=_.after(2,()=>{calculateStrDexMod(),calculateEffort(),buildPsionicsMenu(),buildSkillMenu(),upgradeSheet("2.2.0")});getAttrs(["armor_name","armor_ac","armor_encumbrance","armor_type","setting_ship_tab_name"],_=>{if(_.armor_ac){const a={armor_active:"1",armor_ac:_.armor_ac,armor_encumbrance:_.armor_encumbrance||"0",armor_name:_.armor_name||"",armor_status:"READIED",armor_type:(_.armor_type||"").toUpperCase()};fillRepeatingSectionFromData("armor",a,e)}else e();"MECH"===_.setting_ship_tab_name&&setAttrs({ship_vehicle_type:"MECH"})}),getSectionIDs("repeating_skills",_=>getSectionIDs("repeating_magic-skills",a=>{getSectionIDs("repeating_psychic-skills",t=>{const s=[..._.map(e=>`repeating_skills_${e}_skill_query`),...a.map(e=>`repeating_magic-skills_${e}_skill_query`),...t.map(e=>`repeating_psychic-skills_${e}_skill_query`),...skills.revised.map(e=>`skill_${e}_query`),...skills.first.map(e=>`skill_${e}_query`),...skills.psionic.map(e=>`skill_${e}_query`),"skill_magic_query","skill_magic2_query"];getAttrs(s,_=>{const a=s.reduce((e,a)=>("@{attribute_query_none}"===_[a]&&(e[a]="@{attribute_query}"),e),{});mySetAttrs(a,_,{},e)})})}))}else if(2===a&&(t<3||3===t&&0===s)){const e=_.after(1,()=>{upgradeSheet("2.3.1")});generateWeaponDisplay(),getSectionIDs("repeating_drones",_=>{calculateDroneAttack(_.map(e=>`repeating_drones_${e}`),e)})}else 2===a&&(t<4||4===t&&s<3)?(calculateCyberwareStrain(),upgradeSheet("2.4.3")):2===a&&4===t&&s<7?(attributes.forEach(e=>{getAttrs([e,`${e}_base`],_=>{mySetAttrs({[`${e}_base`]:parseInt(_[`${e}`]||10)},_,null,()=>{calculateAttr(e)})})}),upgradeSheet("2.4.7")):2===a&&4===t&&s<12?(getSectionIDs("repeating_drones",e=>{calculateDroneAttack(e.map(e=>`repeating_drones_${e}`))}),upgradeSheet("2.4.12")):upgradeSheet(sheetVersion,!1,!0)};a?s(e):setAttrs({character_sheet:`${sheetName} v${e}`},{},()=>{t||s(e)})},upgradeFrom162=()=>{console.log("Upgrading from versionless sheet (assumed to be fresh or v1.6.2).");const e=_.after(13,()=>{upgradeSheet("2.0.1")});getAttrs([1,2,3,4,5,6,7,8].map(e=>`psionics_mastered_${e}`),e=>{const _={};for(let a=1;a<9;a++){const t=e[`psionics_mastered_${a}`];if(t){_[`repeating_techniques_${generateRowID()}_technique_name`]=t}}setAttrs(_)}),getAttrs([1,2,3,4].map(e=>`cyberware_${e}`),e=>{const _={};for(let a=1;a<5;a++){const t=e[`cyberware_${a}`];if(t){_[`repeating_cyberware_${generateRowID()}_cyberware_name`]=t}}setAttrs(_)}),getAttrs(["languages"],e=>{if(e.languages){const _={};e.languages.split(/\r?\n/).filter(e=>!!e).forEach(e=>{const a=generateRowID();_[`repeating_languages_${a}_language`]=e}),setAttrs(_)}});const a={armor_enc:"armor_encumbrance",cha:"charisma",cha_misc:"charisma_bonus",con:"constitution",con_misc:"constitution_bonus",dex:"dexterity",dex_misc:"dexterity_bonus",gender:"species_gender",hd:"npc_hd",int:"intelligence",int_misc:"intelligence_bonus",morale:"npc_morale",move:"npc_move",name:"npc_name",notes:"npc_notes",npc_ac:"AC",saves:"npc_saves",ship_hp_min:"ship_hp",ship_current_crew:"ship_crew",ship_last_maintenance_cost:"ship_last_maintenance",skills:"npc_skills",skill_biopsion:"skill_biopsionics",skill_metapsion:"skill_metapsionics",skill_points:"unspent_skill_points",str:"strength",strain_perm:"strain_permanent",str_misc:"strength_bonus",wis:"wisdom",wis_misc:"wisdom_bonus"},t=["homebrew_luck_save","homebrew_extra_skills","setting_heroic_enable"],s=["damage","homebrew_psionics_disable","npc_attacks","npc_attack_bonus","setting_space_magic_enable","ship_other_notes","ship_free_hardpoints","ship_free_mass","ship_free_power","skill_culture_alien_type","skill_culture_one_value","skill_culture_two_value","skill_culture_three_value","profession_type","tab",...[1,2,3,4].map(e=>`homebrew_custom_counter_${e}_name`),...[1,2,3,4].map(e=>`homebrew_custom_counter_${e}_counter`)];getAttrs([...Object.keys(a),...Object.values(a),...t,...s],_=>{const s=Object.entries(a).reduce((e,[a,t])=>(_[a]&&""!==_[a]&&`${_[t]}`!==`${_[a]}`&&(e[t]=_[a]),e),{});t.forEach(e=>{"on"===_[e]&&(s[e]="1")}),["one","two","three"].forEach(e=>{_[`skill_culture_${e}_value`]&&(s[`skill_culture_${e}_name`]=`Culture/${_[`skill_culture_${e}_value`]}`)}),_.profession_type&&(s.skill_profession_name=`Profession/${_.profession_type}`),_.skill_culture_alien_type&&(s.skill_culture_alien_name=`Culture/Alien/${_.skill_culture_alien_type}`),(_.ship_free_hardpoints||_.ship_free_mass||_.ship_free_power)&&(s.ship_other_notes=`\nLegacy attributes${_.ship_free_power?`\nFree Power: ${_.ship_free_power}`:""}${_.ship_free_mass?`\nFree Mass: ${_.ship_free_mass}`:""}${_.ship_free_hardpoints?`\nFree Hardpoints: ${_.ship_free_hardpoints}`:""}\n\t\t\t\t\t${_.ship_other_notes||""}`);const n=[1,2,3,4].reduce((e,a)=>(_[`homebrew_custom_counter_${a}_name`]&&e.push({resource_name:_[`homebrew_custom_counter_${a}_name`],resource_count:_[`homebrew_custom_counter_${a}_counter`]||0}),e),[]);if(fillRepeatingSectionFromData("resources",n,e),"1"!==`${_.tab}`&&"4"!==`${_.tab}`||(s.tab="character"),"2"===`${_.tab}`&&(s.tab="ship"),"3"===`${_.tab}`&&(s.tab="character",s.npc="1"),_.damage){const a={attack_damage:_.damage,attack_name:translate("ATTACK"),attack_number:_.npc_attacks||"1"};fillRepeatingSectionFromData("npc-attacks",a,e)}else e();"on"===_.setting_space_magic_enable&&"on"!==_.homebrew_psionics_disable?s.setting_super_type="both":"on"===_.setting_space_magic_enable?s.setting_super_type="magic":"on"===_.homebrew_psionics_disable&&(s.setting_super_type="neither"),setAttrs(s,{},e)}),getSectionIDs("repeating_weapons",_=>{const a=[..._.map(e=>`repeating_weapons_${e}_attribute_mod`),..._.map(e=>`repeating_weapons_${e}_add_skill`),..._.map(e=>`repeating_weapons_${e}_weapon_shock`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_name`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_power`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_ab`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_damage`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_ammo`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_special_effects`),..._.map(e=>`repeating_weapons_${e}_ship_weapon_broken`)];getAttrs(a,a=>{const t=_.reduce((e,_)=>{switch("@{weapon_skill_bonus}"===a[`repeating_weapons_${_}_add_skill`]&&(e[`repeating_weapons_${_}_weapon_skill_to_damage`]="@{weapon_skill_bonus}"),a[`repeating_weapons_${_}_weapon_shock`]&&(e[`repeating_weapons_${_}_weapon_shock_damage`]=a[`repeating_weapons_${_}_weapon_shock`]),a[`repeating_weapons_${_}_attribute_mod`]){case"@{dex_bonus}":e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{dexterity_mod}";break;case"@{con_bonus}":e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{constitution_mod}";break;case"@{int_bonus}":e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{intelligence_mod}";break;case"@{wis_bonus}":e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{wisdom_mod}";break;case"@{cha_bonus}":e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{charisma_mod}";break;default:e[`repeating_weapons_${_}_weapon_attribute_mod`]="@{strength_mod}"}return e},{}),s=_.filter(e=>a[`repeating_weapons_${e}_ship_weapon_name`]).map(e=>{const _={};return _.weapon_name=a[`repeating_weapons_${e}_ship_weapon_name`],a[`repeating_weapons_${e}_ship_weapon_power`]&&(_.weapon_power=a[`repeating_weapons_${e}_ship_weapon_power`]),a[`repeating_weapons_${e}_ship_weapon_ab`]&&(_.weapon_attack_bonus=a[`repeating_weapons_${e}_ship_weapon_ab`]),a[`repeating_weapons_${e}_ship_weapon_damage`]&&(_.weapon_damage=a[`repeating_weapons_${e}_ship_weapon_damage`]),a[`repeating_weapons_${e}_ship_weapon_ammo`]&&(_.weapon_ammo=a[`repeating_weapons_${e}_ship_weapon_ammo`]),a[`repeating_weapons_${e}_ship_weapon_special_effects`]&&(_.weapon_qualities=a[`repeating_weapons_${e}_ship_weapon_special_effects`]),"on"===a[`repeating_weapons_${e}_ship_weapon_broken`]&&(_.weapon_broken="1"),_});fillRepeatingSectionFromData("ship-weapons",s,e),setAttrs(t,null,e)})}),getSectionIDs("repeating_skills",_=>{const a=[..._.map(e=>`repeating_skills_${e}_custom_skill_1_name`),..._.map(e=>`repeating_skills_${e}_custom_skill_2_name`),..._.map(e=>`repeating_skills_${e}_custom_skill_1_level`),..._.map(e=>`repeating_skills_${e}_custom_skill_2_level`),..._.map(e=>`repeating_skills_${e}_custom_skill_1_specialist`),..._.map(e=>`repeating_skills_${e}_custom_skill_2_specialist`)];getAttrs(a,a=>{const t=_.reduce((e,_)=>([1,2].forEach(t=>{if(a[`repeating_skills_${_}_custom_skill_${t}_name`]){const s=void 0===a[`repeating_skills_${_}_custom_skill_${t}_level`]?"-1":a[`repeating_skills_${_}_custom_skill_${t}_level`];e.push({skill_name:a[`repeating_skills_${_}_custom_skill_${t}_name`],skill:s,skill_specialist:a[`repeating_skills_${_}_custom_skill_${t}_specialist`]||"2d6"})}}),e),[]);_.forEach(e=>removeRepeatingRow(`repeating_skills_${e}`)),fillRepeatingSectionFromData("skills",t,e)})}),getSectionIDs("repeating_technique",_=>{const a=[..._.map(e=>`repeating_technique_${e}_technique`),..._.map(e=>`repeating_technique_${e}_technique_description`)];getAttrs(a,a=>{const t=_.reduce((e,_)=>(a[`repeating_technique_${_}_technique`]&&e.push({technique_name:a[`repeating_technique_${_}_technique`],technique_description:a[`repeating_technique_${_}_technique_description`]||""}),e),[]);fillRepeatingSectionFromData("techniques",t,e),_.forEach(e=>removeRepeatingRow(`repeating_technique_${e}`))})}),getSectionIDs("repeating_cyberware",_=>{getAttrs(_.map(e=>`repeating_cyberware_${e}_cyberware`),a=>{const t=_.reduce((e,_)=>(a[`repeating_cyberware_${_}_cyberware`]&&(e[`repeating_cyberware_${_}_cyberware_name`]=a[`repeating_cyberware_${_}_cyberware`]),e),{});setAttrs(t,null,e)})}),getSectionIDs("repeating_goals",_=>{const a=[..._.map(e=>`repeating_goals_${e}_misc_goal`),..._.map(e=>`repeating_goals_${e}_misc_goal_xp`)];getAttrs(a,a=>{const t=_.reduce((e,_)=>(a[`repeating_goals_${_}_misc_goal`]&&(e[`repeating_goals_${_}_goal_name`]=a[`repeating_goals_${_}_misc_goal`]),a[`repeating_goals_${_}_misc_goal_xp`]&&(e[`repeating_goals_${_}_goal_xp`]=a[`repeating_goals_${_}_misc_goal_xp`]),e),{});setAttrs(t,null,e)})}),getSectionIDs("repeating_languages",_=>{getAttrs(_.map(e=>`repeating_languages_${e}_languages`),a=>{const t=_.reduce((e,_)=>(a[`repeating_languages_${_}_languages`]&&(e[`repeating_languages_${_}_language`]=a[`repeating_languages_${_}_languages`]),e),{});setAttrs(t,null,e)})}),getSectionIDs("repeating_gear",_=>{getAttrs(_.map(e=>`repeating_gear_${e}_gear_readied`),a=>{const t=_.reduce((e,_)=>("1"===`${a[`repeating_gear_${_}_gear_readied`]}`?e[`repeating_gear_${_}_gear_status`]="readied":"2"===`${a[`repeating_gear_${_}_gear_readied`]}`&&(e[`repeating_gear_${_}_gear_status`]="stowed"),e),{});setAttrs(t,null,e)})}),getSectionIDs("repeating_defenses",_=>{const a=[..._.map(e=>`repeating_defenses_${e}_ship_defense_name`),..._.map(e=>`repeating_defenses_${e}_ship_defense_special_effects`),..._.map(e=>`repeating_defenses_${e}_ship_defense_broken`)];getAttrs(a,a=>{const t=_.map(e=>{const _={};return a[`repeating_defenses_${e}_ship_defense_name`]&&(_.defense_name=a[`repeating_defenses_${e}_ship_defense_name`]),a[`repeating_defenses_${e}_ship_defense_special_effects`]&&(_.defense_effect=a[`repeating_defenses_${e}_ship_defense_special_effects`]),a[`repeating_defenses_${e}_ship_defense_broken`]&&(_.defense_broken="1"),_});fillRepeatingSectionFromData("ship-defenses",t,e)})}),getSectionIDs("repeating_fittings",_=>{const a=[..._.map(e=>`repeating_fittings_${e}_ship_fitting_name`),..._.map(e=>`repeating_fittings_${e}_ship_fitting_special_effects`),..._.map(e=>`repeating_fittings_${e}_ship_fitting_broken`)];getAttrs(a,a=>{const t=_.map(e=>{const _={};return a[`repeating_fittings_${e}_ship_fitting_name`]&&(_.fitting_name=a[`repeating_fittings_${e}_ship_fitting_name`]),a[`repeating_fittings_${e}_ship_fitting_special_effects`]&&(_.fitting_effect=a[`repeating_fittings_${e}_ship_fitting_special_effects`]),a[`repeating_fittings_${e}_ship_fitting_broken`]&&(_.fitting_broken="1"),_});fillRepeatingSectionFromData("ship-fittings",t,e)})})};on("sheet:opened",handleUpgrade),on("sheet:opened change:npc",validateTab),on("sheet:opened",setTranslatedQueries),on("sheet:opened change:setting_skill_query",handleAttributeQueries),on("sheet:opened change:setting_modifier_query",handleModifierQuery),on("change:homebrew_skill_list",setTranslatedDefaults),["weapons","ship-weapons"].forEach(e=>{on(`change:repeating_${e}:weapon_use_ammo`,()=>handleAmmoAPI(e))}),on("change:setting_use_ammo",()=>{handleAmmoAPI("weapons"),handleAmmoAPI("ship-weapons")}),on("change:class",fillClassStats),attributes.forEach(e=>on(`change:${e}_base change:${e}_boosts`,()=>calculateAttr(e))),attributes.forEach(e=>on(`change:${e} change:${e}_bonus`,()=>calculateMod(e))),on("change:repeating_shells",function(e){"player"===e.sourceType&&validateShells(e)}),on("change:setting_transhuman_enable change:setting_ai_enable",calculateShellAttrs),on(weaponDisplayEvent,generateWeaponDisplay),on("change:repeating_weapons:weapon_name",()=>validateWeaponSkills()),on("change:homebrew_skill_list",()=>getSectionIDs("repeating_weapons",validateWeaponSkills)),on("change:strain change:strain_permanent",validateStrain),on("change:constitution",calculateMaxStrain),on("change:repeating_cyberware",calculateCyberwareStrain),on("change:strain_permanent_extra change:cyberware_strain_total",calculatePermanentStrain),on("change:level",calculateSaves),on([...effortAttributes,"repeating_psychic-skills:skill"].map(e=>`change:${e}`).join(" "),calculateEffort),on("change:magic_committed_effort_current change:magic_committed_effort_scene change:magic_committed_effort_day change:magic_total_effort",calculateMagicEffort),on("change:ai_committed_processing_current change:ai_committed_processing_scene change:ai_committed_processing_day change:ai_extra_processing change:repeating_processing-nodes",calculateProcessing),on("change:repeating_armor change:innate_ac remove:repeating_armor",calculateAC),on("change:strength change:repeating_gear remove:repeating_gear change:repeating_weapons remove:repeating_weapons change:repeating_armor remove:repeating_armor",calculateGearReadiedStowed),on("change:level change:setting_xp_scheme",calculateNextLevelXP),on("change:setting_super_type",validateSuperTab),on("change:homebrew_luck_save",buildSaveMenu),on([...skills.revised.map(e=>`change:skill_${e}`),...skills.first.map(e=>`change:skill_${e}`),"change:homebrew_skill_list","change:repeating_skills","change:setting_show_untrained_skills","remove:repeating_skills"].join(" "),buildSkillMenu),on([...skills.psionic.map(e=>`change:skill_${e}`),"change:setting_super_type change:repeating_techniques remove:repeating_techniques","change:repeating_psychic-skills remove:repeating_psychic-skills"].join(" "),buildPsionicsMenu),on("change:setting_super_type change:repeating_spells remove:repeating_spells change:repeating_magic-skills remove:repeating_magic-skills change:skill_magic change:skill_magic2_name change:skill_magic2",buildMagicMenu),autofillSections.forEach(e=>{on(`change:generate_${e}_source`,()=>generateAutofillInfo(e)),on(`change:generate_${e}_button`,()=>generateAutofillRow(e))}),on("change:ship_hulltype",fillShipStats),on("change:ship_calculate_price",calculateShipStats),on("change:ship_class",()=>{setShipClass(),["ship-fittings","ship-defenses"].forEach(e=>generateAutofillInfo(e))}),on(shipStatEvent,calculateShipStats),on("change:repeating_ship-weapons:weapon_name change:repeating_ship-weapons:weapon_attack_bonus remove:repeating_ship-weapons",buildShipWeaponsMenu),[1,2,3,4,5].forEach(e=>{on(`change:repeating_drones:drone_fitting_${e}_name`,()=>fillDroneFitting(e))}),on("change:repeating_drones:drone_model",fillDroneStats),on("change:attack_bonus change:intelligence_mod change:skill_pilot change:skill_program change:npc",()=>getSectionIDs("repeating_drones",e=>{calculateDroneAttack(e.map(e=>`repeating_drones_${e}`))})),on([...[1,2,3].map(e=>`change:repeating_drones:drone_weapon${e}_ab`),...[1,2,3].map(e=>`change:repeating_drones:drone_weapon${e}_active`)].join(" "),()=>calculateDroneAttack(["repeating_drones"])),on("change:npc_stat_block",fillNPC),on("change:npc_rolls_hidden",handleNPCRollHide),on("change:repeating_npc-attacks:attack_name",addNPCAttackBonus),on("change:npc_roll_full_attack change:repeating_npc-attacks:attack_number",setNPCMultiAttacks),on("change:repeating_npc-abilities:ability_name remove:repeating_npc-abilities",buildAbilitiesMenu),on("change:repeating_npc-attacks:attack_name change:repeating_npc-attacks:attack_ab change:repeating_npc-attacks:attack_number remove:repeating_npc-attacks",buildAttacksMenu),on("change:npc change:npc_armor_type change:macro_npc_attacks change:macro_npc_abilities",buildStatblock); })(); \ No newline at end of file