diff --git a/Stars_Without_Number_Revised/ReadMe.md b/Stars_Without_Number_Revised/ReadMe.md index ed7af85fec..11924e27bf 100644 --- a/Stars_Without_Number_Revised/ReadMe.md +++ b/Stars_Without_Number_Revised/ReadMe.md @@ -27,10 +27,24 @@ Report any problems, suggestions, or features by [creating an issue](https://git ## Changelog +### 2.1.0 + +* Additions + * Added option to disable modifier queries globally. + * Added button to roll hit points. + * Added weapon encumbrance tracking. + * Weapon shock damage can now be toggled independent of base being 0 (for Unarmed Combatant). + * Added option for automatic ammo reduction (requires ChatSetAttr). +* Bugfixes + * Attribute modifiers are now recalculated upon conversion from v1.6.2. + * Roll templates are no longer cut off when chat avatars are disabled. + * New NPC attacks should now receive the correct attack bonus. + * Line breaks in foci/technique/spell/cyberware descriptions now render correctly. + ### 2.0.1 * Fixed a bug preventing successful conversion of NPC sheets. -* Fixed a bug that prevented extra effort from taking effect. +* Fixed a bug preventing extra effort from taking effect. ### 2.0.0 diff --git a/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.pug b/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.pug index 0a936ebb79..934b30011b 100644 --- a/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.pug +++ b/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.pug @@ -9,8 +9,9 @@ div input(type="hidden", name="attr_attribute_query_wis", value="+ @{wisdom_mod}[Wisdom]]]}} {{attribute= + WIS}}") input(type="hidden", name="attr_attribute_query_cha", value="+ @{charisma_mod}[Charisma]]]}} {{attribute= + CHA}}") input(type="hidden", name="attr_attribute_query_none", value="]]}}") - input(type="hidden", name="attr_burst_query", value="?{Burst|Yes, 2|No, 0}[Burst]") - input(type="hidden", name="attr_modifier_query", value="?{Modifier|0}[Modifier]") + input(type="hidden", name="attr_burst_query", value="?{Burst|Yes,+ 2[Burst]|No, }") + input(type="hidden", name="attr_extra_hp_query", value!="?{Extra hit points? Enter 2 for Warrior|0}[Bonus]") + input(type="hidden", name="attr_modifier_query", value="+ ?{Modifier|0}[Mod]") input(type="hidden", name="attr_proficient_query", value="?{Proficient|Yes, @{npc_skills}|No, 0}[Skill]") input(type="hidden", name="attr_skill_name_query", value="?{Skill name|Skill}") input(type="hidden", name="attr_translation_numdice", value="Number of dice") diff --git a/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.scss b/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.scss index 00ecd84e9e..d9b1655728 100644 --- a/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.scss +++ b/Stars_Without_Number_Revised/Source/Stars_Without_Number_Revised.scss @@ -165,7 +165,7 @@ h3 { opacity: 0; position: absolute; } - .sheet-logo { width: 60% } + .sheet-logo { width: 480px } .sheet-npc-chooser { cursor: pointer; margin-left: auto; @@ -234,6 +234,7 @@ h3 { display: flex; flex-wrap: wrap; align-content: flex-start; + align-items: flex-start; } .sheet-grow { flex-grow: 1 } @@ -302,6 +303,11 @@ input[type=number].sheet-inline-input { font-size: .9em; line-height: 14px; border-top: 1px solid #AAA; + + input[type="checkbox"] { + height: 14px; + margin: 0 3px 0 0; + } } input[type=text], input[type=number], textarea { background: transparent; @@ -320,7 +326,7 @@ input[type=number].sheet-inline-input { height: 20px; min-height: 20px; } - input[type=checkbox] { + > input[type=checkbox] { height: 14px; margin: 3px 0; } @@ -349,6 +355,10 @@ input[type=number].sheet-inline-input { } div { grid-column: 1/4 } } + button[type=roll].btn { + width: 100%; + &:hover { color: red } + } } .sheet-blue-button { text-align: center; @@ -369,6 +379,14 @@ input[type=number].sheet-inline-input { .sheet-colon-after::after { content: ":" } .sheet-hide-empty[value=""] + span { display: none } .sheet-add-plus:not([value^="-"]) + span::before { content: "+" } +.sheet-api { + font-size: .8em; + background: $lightbox; + border-radius: 5px; + padding: 1px; + line-height: 1; + vertical-align: super; +} /* force repeating row behaviour */ @@ -387,6 +405,7 @@ input[type=number].sheet-inline-input { .sheet-details { line-height: 1.4; text-align: justify; + white-space: pre-wrap; } } } @@ -479,7 +498,7 @@ input[type=number].sheet-inline-input { } } &.sheet-core-stats { - grid: auto / 1fr 260px 220px; + grid: auto / minmax(310px, 1fr) minmax(260px, 1fr) minmax(220px, 1fr); } .sheet-main-content { margin-top: 3px; @@ -488,10 +507,6 @@ input[type=number].sheet-inline-input { grid-row-gap: 3px; .sheet-left-margin { margin-left: 15px } } - button[type=roll].sheet-doombutton { - width: 100%; - &:hover { color: red } - } } /* Saves */ @@ -554,12 +569,12 @@ input[type=number].sheet-inline-input { .sheet-weapon-skill { width: 80px } .sheet-attribute { width: 60px } .sheet-burst { width: 65px } - .sheet-damage { width: 65px } - .sheet-shock-damage { width: 80px } + .sheet-damage { width: 70px } + .sheet-shock-damage { width: 95px } .sheet-shock-ac { width: 55px } .sheet-skill-to-damage { width: 40px } - .sheet-range { width: 65px } - .sheet-ammo { width: 50px } + .sheet-range { width: 70px } + .sheet-ammo { width: 53px } } .sheet-text-input { padding-right: 3px } @@ -757,14 +772,19 @@ input[type=number].sheet-inline-input { &[value="right"] ~ .sheet-column .sheet-foci-left { display: none } } .sheet-foci { - > .sheet-name { - border-bottom: 1px solid #777; - div { + .sheet-details-button { + position: relative; + z-index: 2; + } + .sheet-class-ability { + position: relative; + .sheet-edit .sheet-name { font-weight: bold; font-size: 1.1em; + border-bottom: 1px solid #777; } + .sheet-name,.sheet-edit textarea, .sheet-display { margin-bottom: 3px } } - > .sheet-name, > .sheet-edit textarea, > .sheet-display { margin-bottom: 3px } .sheet-edit { .sheet-name { flex-grow: 1 } .sheet-level { @@ -804,6 +824,7 @@ input[type=number].sheet-inline-input { } } .sheet-equipment { + .repcontainer[data-groupname="repeating_weapons"] + .repcontrol { display: none } .repitem { margin-bottom: 2px; input[type=text], input[type=number], select { background: transparent } @@ -986,7 +1007,15 @@ input[type=number].sheet-inline-input { } } -/* New roll templates */ +/* Roll templates */ + +.withoutavatars { + .sheet-rolltemplate-swn-default, + .sheet-rolltemplate-swn-attack, + .sheet-rolltemplate-swn-skill, + .sheet-rolltemplate-swn-save { margin-left: -11px } +} + .sheet-rolltemplate-swn-default, .sheet-rolltemplate-swn-attack, .sheet-rolltemplate-swn-skill, @@ -1081,6 +1110,10 @@ input[type=number].sheet-inline-input { font-size: 10px; line-height: 1; margin: -10px 0 5px; + .inlinerollresult { + font-size: 1em; + font-weight: normal; + } } } @@ -1108,6 +1141,11 @@ input[type=number].sheet-inline-input { font-style: italic; font-size: 10px; > span:first-child { margin-right: 10px } + .inlinerollresult { + font-weight: normal; + font-size: 1em; + margin-left: 2px; + } } .sheet-desc { font-size: 12px; diff --git a/Stars_Without_Number_Revised/Source/pug/character.pug b/Stars_Without_Number_Revised/Source/pug/character.pug index 067e651c76..7f76b855c6 100644 --- a/Stars_Without_Number_Revised/Source/pug/character.pug +++ b/Stars_Without_Number_Revised/Source/pug/character.pug @@ -22,6 +22,42 @@ psionic: ["biopsionics", "metapsionics", "precognition", "telekinesis", "telepathy", "teleportation"], }; +//- We have foci in two locations, so they are outsourced to this mixin +mixin foci + +sectionheader("show_foci", "FOCI") + .foci.simple-repsection + input(type="hidden", name="attr_show_focus_details", value="1").input-details + .class-ability + button.display.invisible-button(type="roll", name="roll_Class_ability", value!="&{template:swn-default} {{charname=@{name}}} {{title=^{CLASS_ABILITY}}} {{desc=@{class_ability}}}") + .display + .name.flex + div(data-i18n="CLASS_ABILITY") + label.details-button + input(type="checkbox", name="attr_show_focus_details", value="1", checked) + span(data-i18n="EXPAND") + .details + span(name="attr_class_ability") + .edit + .name.flex + div(data-i18n="CLASS_ABILITY") + label.details-button + input(type="checkbox", name="attr_show_focus_details", value="1", checked) + span(data-i18n="EXPAND") + .details + textarea.details(name="attr_class_ability") + fieldset.repeating_foci + button.display.invisible-button(type="roll", name="roll_Focus", value!="&{template:swn-default} {{charname=@{name}}} {{info=^{FOCUS}}} {{title=@{focus_name}}} {{desc=@{focus_description}}}") + .display + .name.flex + span(name="attr_focus_name") + span.level #[span(data-i18n="LEVEL")]-#[span(name="attr_focus_level")] + .details + span(name="attr_focus_description") + .edit.flex-wrap + input.name(type="text", name="attr_focus_name", data-i18n-placeholder="FOCUS") + input.level(type="number", min="0", name="attr_focus_level", data-i18n-placeholder="LEVEL") + textarea.details(name="attr_focus_description", data-i18n-placeholder="DESCRIPTION") + input(type="hidden", name="attr_homebrew_skill_list", value="revised").skills-type input(type="hidden", name="attr_setting_super_type", value="psionics").super-type input(type="hidden", name="attr_setting_foci_location", value="left").foci-loc @@ -48,24 +84,25 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer .menus.core-box h3(data-i18n="QUICK_MENUS") .menus-content - button(type="roll", name="roll_Initiative", data-i18n="INITIATIVE", value="&{template:swn-default} {{charname=@{name}}} {{title=^{INITIATIVE}}} {{ =[[1d8+@{dexterity_mod} &{tracker}]]}}").unstyled-button + button(type="roll", name="roll_Initiative", data-i18n="INITIATIVE", value!="&{template:swn-default} {{charname=@{name}}} {{title=^{INITIATIVE}}} {{ =[[1d8+@{dexterity_mod} &{tracker}]]}}").unstyled-button input(type="hidden", name="attr_macro_saves", value="[^{PHYSICAL} (v@{save_physical}),](~save_physical) [^{MENTAL} (v@{save_mental}),](~save_mental) [^{EVASION} (v@{save_evasion})](~save_evasion)") - button(type="roll", name="roll_Saves_macro", data-i18n="SAVES", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SAVING_THROWS}}} {{buttons=@{macro_saves}}}`).unstyled-button + button(type="roll", name="roll_Saves_macro", data-i18n="SAVES", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SAVING_THROWS}}} {{buttons=@{macro_saves}}}`).unstyled-button input(type="hidden", name="attr_macro_skills" value="[^{ADMINISTER} (-1),](~skill_administer) [^{CONNECT} (-1),](~skill_connect) [^{EXERT} (-1),](~skill_exert) [^{FIX} (-1),](~skill_fix) [^{HEAL} (-1),](~skill_heal) [^{KNOW} (-1),](~skill_know) [^{LEAD} (-1),](~skill_lead) [^{NOTICE} (-1),](~skill_notice) [^{PERFORM} (-1),](~skill_perform) [^{PILOT} (-1),](~skill_pilot) [^{PROGRAM} (-1),](~skill_program) [^{PUNCH} (-1),](~skill_punch) [^{SHOOT} (-1),](~skill_shoot) [^{SNEAK} (-1),](~skill_sneak) [^{STAB} (-1),](~skill_stab) [^{SURVIVE} (-1),](~skill_survive) [^{TALK} (-1),](~skill_talk) [^{TRADE} (-1),](~skill_trade) [^{WORK} (-1)](~skill_work)") - button(type="roll", name="roll_Skills_macro", data-i18n="SKILLS", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SKILLS}}} {{buttons=@{macro_skills}}}`).unstyled-button + button(type="roll", name="roll_Skills_macro", data-i18n="SKILLS", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SKILLS}}} {{buttons=@{macro_skills}}}`).unstyled-button input(type="hidden", name="attr_macro_weapons") - button(type="roll", name="roll_Weapons_macro", data-i18n="WEAPONS", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{WEAPONS}}} {{buttons=@{macro_weapons}}}`).unstyled-button + button(type="roll", name="roll_Weapons_macro", data-i18n="WEAPONS", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{WEAPONS}}} {{buttons=@{macro_weapons}}}`).unstyled-button input(type="hidden", name="attr_macro_psionics" value="[^{BIOPSIONICS} (-1),](~skill_biopsionics) [^{METAPSIONICS} (-1),](~skill_metapsionics) [^{PRECOGNITION} (-1),](~skill_precognition) [^{TELEKINESIS} (-1),](~skill_telekinesis) [^{TELEPATHY} (-1),](~skill_telepathy) [^{TELEPORTATION} (-1)](~skill_teleportation)") - button(type="roll", name="roll_Psionics_macro", data-i18n="PSIONICS", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{PSYCHIC_SKILLS_TECHNIQUES}}} {{buttons=@{macro_psionics}}}`).unstyled-button.super-psionics.super + button(type="roll", name="roll_Psionics_macro", data-i18n="PSIONICS", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{PSYCHIC_SKILLS_TECHNIQUES}}} {{buttons=@{macro_psionics}}}`).unstyled-button.super-psionics.super input(type="hidden", name="attr_macro_magic") - button(type="roll", name="roll_Magic_macro", data-i18n="MAGIC", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SPACE_MAGIC}}} {{buttons=@{macro_magic}}}`).unstyled-button.super-magic.super + button(type="roll", name="roll_Magic_macro", data-i18n="MAGIC", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{name}}} {{title=^{SPACE_MAGIC}}} {{buttons=@{macro_magic}}}`).unstyled-button.super-magic.super //- Stats .core.core-stats.col-1-3 .main.core-box-text h3(data-i18n="CORE_STATISTICS") .main-content - +text-input-duo("HP", "HP_max", "HIT_POINTS").important + +text-input-duo("HP", "HP_max", false, {value: "0"}).important + button.unstyled-button(type="roll", name="roll_HP", data-i18n="HIT_POINTS" value!="&{template:swn-default} {{charname=@{name}}} {{title=^{HIT_POINTS}}} {{ =[[{@{level}d6 + @{level}*@{constitution_mod}[CON] + @{level}*@{extra_hp_query}, @{hp|max} + 1d1}kh1 ]]}} {{info=^{MAXIMUM_HP_1} @{level}d6 + @{level}*[[@{constitution_mod}[CON] + @{extra_hp_query}]] ^{MAXIMUM_HP_2} [[@{hp|max} + 1]]}}") +text-input-duo("strain", "strain_max", "SYSTEM_STRAIN", {value: "10", readonly: true, "data-i18n-title": "CONSTITUTION"})(min="0", value="0") +text-input("strain_permanent", "PERMANENT_STRAIN")(type="number", min="0", value="0").center +text-input-duo("xp", "xp_next", "XP_NEXT_LEVEL", {min: "0", value: "3"})(min="0", value="0") @@ -73,7 +110,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer +text-input("attack_bonus", "ATTACK_BONUS")(type="number", min="0", value="0").center input(type="hidden", name="attr_setting_heroic_enable", value="0").hider +text-input("hp_doom")(type="number").center - button.unstyled-button.doombutton(type="roll", name="roll_Doom", data-i18n="DOOM_DAMAGE", data-i18n-title="DEFY_DOOM", value="&{template:swn-default} {{charname=@{name}}} {{title=^{DEFYING_DOOM}}} {{^{DOOM_DAMAGE}=[[@{level}d@{doom_size}]]}}") + button.unstyled-button(type="roll", name="roll_Doom", data-i18n="DOOM_DAMAGE", data-i18n-title="DEFY_DOOM", value!="&{template:swn-default} {{charname=@{name}}} {{title=^{DEFYING_DOOM}}} {{^{DOOM_DAMAGE}=[[@{level}d@{doom_size}]]}}") .attributes.core-box table thead @@ -114,9 +151,10 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer +sectionheader("show_weapons", "WEAPONS") .weapons fieldset.repeating_weapons + input(type="hidden", name="attr_weapon_api", value="") input(type="hidden", name="attr_weapon_attack_display", value="") input(type="hidden", name="attr_weapon_damage_display", value="") - button(type="roll", name="roll_Attack", value="&{template:swn-attack} {{charname=@{name}}} {{title=@{weapon_name}}} {{attack=[[1d20 + @{attack_bonus}[AB] + @{weapon_attack}[Weapon AB] + [[{{@{weapon_skill_bonus},-1}>0}*(@{weapon_skill_bonus}+2) - 2]][Skill] + @{weapon_attribute_mod}[Attribute] + @{weapon_burst}[Burst] + @{modifier_query}]]}} {{damage=[[@{weapon_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill] + @{weapon_burst}[Burst]]]}} {{burst=[[@{weapon_burst}]]}} {{shock=[[@{weapon_shock_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill]]]}} {{shock_base=[[@{weapon_shock_damage}]]}} {{shock_ac=@{weapon_shock_ac}}} {{ammo=@{weapon_ammo}}} {{range=@{weapon_range}}} {{mod=[[@{modifier_query}]]}}").invisible-button.display + button(type="roll", name="roll_Attack", value!="&{template:swn-attack} {{charname=@{name}}} {{title=@{weapon_name}}} {{attack=[[1d20 + @{attack_bonus}[AB] + @{weapon_attack}[Weapon AB] + [[{{@{weapon_skill_bonus},-1}>0}*(@{weapon_skill_bonus}+2) - 2]][Skill] + @{weapon_attribute_mod}[Attribute] @{weapon_burst} @{modifier_query}]]}} {{damage=[[@{weapon_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill] @{weapon_burst}]]}} {{burst=[[0@{weapon_burst}]]}} @{weapon_shock} {{range=@{weapon_range}}} @{weapon_use_ammo} {{mod=[[0 @{modifier_query}]]}} @{weapon_api}").invisible-button.display .display span.name.space-after span(name="attr_weapon_name").space-after @@ -127,7 +165,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer input(type="hidden", name="attr_weapon_range", value="").hide-empty span , #[span(data-i18n="RANGE")]: #[span(name="attr_weapon_range")] | ) - input(type="hidden", name="attr_weapon_ammo", value="").hide-empty + input(type="hidden", name="attr_weapon_use_ammo", value="0").hider span | . #[span(data-i18n="AMMO")]: input(type="number", name="attr_weapon_ammo").inline-input @@ -154,44 +192,24 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer option(value=`@{${attr}_mod}`, data-i18n=`${attr.toUpperCase()}_SHORT`) +fake-text-input("BURST").burst.center select(name="attr_weapon_burst") - option(value="0", data-i18n="NO") + option(value="", data-i18n="NO", selected) option(value="@{burst_query}", data-i18n="ASK") - option(value="2", data-i18n="ALWAYS") + option(value="+ 2[Burst]", data-i18n="ALWAYS") +text-input("weapon_damage", "DAMAGE")(value="0").damage.center +fake-text-input("+SKILL").skill-to-damage.center input(type="checkbox", name="attr_weapon_skill_to_damage", value="@{weapon_skill_bonus}") - +text-input("weapon_shock_damage", "SHOCK_DAMAGE")(value="0").shock-damage.center + +text-input("weapon_shock_damage")(value="0").shock-damage.center + input(type="checkbox", name="attr_weapon_shock", value!="{{shock=[[@{weapon_shock_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill]]] ^{SHOCK_DAMAGE_AGAINST_AC_LEQ} @{weapon_shock_ac}!}}") + span(data-i18n="SHOCK_DAMAGE") +text-input("weapon_shock_ac", "SHOCK_AC")(type="number", value="10").shock-ac.center +text-input("weapon_range", "RANGE").range.center - +text-input("weapon_ammo", "AMMO")(type="number").ammo.center + +text-input("weapon_ammo")(type="number").ammo.center + input(type="checkbox", name="attr_weapon_use_ammo", value!="{{ammo=[[0@{weapon_ammo} - (1 @{weapon_burst})]]}}") + span(data-i18n="AMMO") //- Foci .section.foci-left - +sectionheader("show_foci", "FOCI") - .foci.simple-repsection - input(type="hidden", name="attr_show_focus_details", value="1").input-details - .name.flex - div(data-i18n="CLASS_ABILITY") - label.details-button - input(type="checkbox", name="attr_show_focus_details", value="1", checked) - span(data-i18n="EXPAND") - .display - .details - span(name="attr_class_ability") - .edit - textarea.details(name="attr_class_ability") - fieldset.repeating_foci - button.display.invisible-button(type="roll", name="roll_Focus", value="&{template:swn-default} {{charname=@{name}}} {{info=^{FOCUS}}} {{title=@{focus_name}}} {{desc=@{focus_description}}}") - .display - .name.flex - span(name="attr_focus_name") - span.level #[span(data-i18n="LEVEL")]-#[span(name="attr_focus_level")] - .details - span(name="attr_focus_description") - .edit.flex-wrap - input.name(type="text", name="attr_focus_name", data-i18n-placeholder="FOCUS") - input.level(type="number", min="0", name="attr_focus_level", data-i18n-placeholder="LEVEL") - textarea.details(name="attr_focus_description", data-i18n-placeholder="DESCRIPTION") + +foci .section.super +sectionheader("show_psionics", false) @@ -227,7 +245,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer span(data-i18n="EXPAND") input(type="hidden", name="attr_show_technique_details", value="1").input-details fieldset.repeating_techniques - button.display.invisible-button(name="roll_Technique", type="roll", value="&{template:swn-default} {{charname=@{name}}} {{info=^{PSYCHIC_TECHNIQUE}}} {{title=@{technique_name}}} {{desc=@{technique_description}}}") + button.display.invisible-button(name="roll_Technique", type="roll", value!="&{template:swn-default} {{charname=@{name}}} {{info=^{PSYCHIC_TECHNIQUE}}} {{title=@{technique_name}}} {{desc=@{technique_description}}}") .display .name #[span(name="attr_technique_name")] .details #[span(name="attr_technique_description")] @@ -254,7 +272,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer .prepared(data-i18n="PREPARED") .damage(data-i18n="DAMAGE") fieldset.repeating_spells - button.display.invisible-button(type="roll", name="roll_Spell", value="&{template:swn-default} {{charname=@{name}}} {{title=@{spell_name}}} {{info=^{SPELL}}} {{desc=@{spell_description}}} {{damage=[[@{spell_damage}]]}}") + button.display.invisible-button(type="roll", name="roll_Spell", value!="&{template:swn-default} {{charname=@{name}}} {{title=@{spell_name}}} {{info=^{SPELL}}} {{desc=@{spell_description}}} {{damage=[[@{spell_damage}]]}}") .display .name.flex-center span(name="attr_spell_name") @@ -267,8 +285,8 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer input.damage(type="text", name="attr_spell_damage", value="0") textarea.details(name="attr_spell_description") -//- Skills .column + //- Skills .section +sectionheader("show_skills", "SKILLS") .skills @@ -300,31 +318,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer //- Foci .section.foci-right - +sectionheader("show_foci", "FOCI") - .foci.simple-repsection - input(type="hidden", name="attr_show_focus_details", value="1").input-details - .name.flex - div(data-i18n="CLASS_ABILITY") - label.details-button - input(type="checkbox", name="attr_show_focus_details", value="1", checked) - span(data-i18n="EXPAND") - .display - .details - span(name="attr_class_ability") - .edit - textarea.details(name="attr_class_ability") - fieldset.repeating_foci - button.display.invisible-button(type="roll", name="roll_Focus", value="&{template:swn-default} {{charname=@{name}}} {{title=@{focus_name}}} {{info=^{FOCUS}}} {{desc=@{focus_description}}}") - .display - .name.flex - span(name="attr_focus_name") - span.level #[span(data-i18n="LEVEL")]-#[span(name="attr_focus_level")] - .details - span(name="attr_focus_description") - .edit.flex-wrap - input.name(type="text", name="attr_focus_name", data-i18n-placeholder="FOCUS") - input.level(type="number", min="0", name="attr_focus_level", data-i18n-placeholder="LEVEL") - textarea.details(name="attr_focus_description", data-i18n-placeholder="DESCRIPTION") + +foci //- Gear .section.col-1-3 @@ -340,14 +334,22 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer +text-input("credits", "CREDITS")(value="0", min="0", type="number").center +text-input("credits_owed", "CREDITS_OWED")(value="0", min="0", type="number").center .grey-box + fieldset.repeating_weapons + .flex + input.name(type="text", name="attr_weapon_name", readonly) + input.encumbrance(type="number", min="0", value="0", name="attr_weapon_encumbrance", data-i18n-title="ENCUMBRANCE") + select.status(name="attr_weapon_status") + option(value="", data-i18n="OTHER", selected) + option(value="READIED", data-i18n="READIED") + option(value="STOWED", data-i18n="STOWED") fieldset.repeating_gear .flex input.name(type="text", name="attr_gear_name", data-i18n-placeholder="ITEM") input.encumbrance(type="number", min="0", value="0", name="attr_gear_encumbrance", data-i18n-title="ENCUMBRANCE") select.status(name="attr_gear_status") option(value="", data-i18n="OTHER", selected) - option(value="readied", data-i18n="READIED") - option(value="stowed", data-i18n="STOWED") + option(value="READIED", data-i18n="READIED") + option(value="STOWED", data-i18n="STOWED") .grey-box.other h3(data-i18n="OTHER_EQUIPMENT") textarea(name="attr_gear_other").other-gear @@ -372,7 +374,7 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer span(data-i18n="EXPAND") input(type="hidden", name="attr_show_cyberware_details", value="1").input-details fieldset.repeating_cyberware - button.display.invisible-button(name="roll_Cyberware", type="roll", value="&{template:swn-default} {{charname=@{name}}} {{title=@{cyberware_name}}} {{info=^{CYBERWARE}; @{cyberware_strain} ^{STRAIN}}} {{desc=@{cyberware_description}}}") + button.display.invisible-button(name="roll_Cyberware", type="roll", value!="&{template:swn-default} {{charname=@{name}}} {{title=@{cyberware_name}}} {{info=^{CYBERWARE}; @{cyberware_strain} ^{STRAIN}}} {{desc=@{cyberware_description}}}") .display .name.flex-between span(name="attr_cyberware_name") diff --git a/Stars_Without_Number_Revised/Source/pug/header.pug b/Stars_Without_Number_Revised/Source/pug/header.pug index 496ba0f7ac..6d135dc389 100644 --- a/Stars_Without_Number_Revised/Source/pug/header.pug +++ b/Stars_Without_Number_Revised/Source/pug/header.pug @@ -36,6 +36,14 @@ input(type="hidden", name="attr_show_settings" value="0").hider span(data-i18n="ADD_EXTRA_SKILLS").colon-after input(type="checkbox", name="attr_homebrew_extra_skills", value="1") span(data-i18n="ADD_EXTRA_SKILLS_DESC") + h2 API + p + label + span.colon + span(data-i18n="USE_AMMO_AUTOMATICALLY") + span.api API + input(type="checkbox", name="attr_setting_use_ammo", value="1") + span(data-i18n="REQUIRES_CHATSETATTR") div h2(data-i18n="CHARACTER_OPTIONS") p @@ -82,6 +90,11 @@ input(type="hidden", name="attr_show_settings" value="0").hider option(value="left", data-i18n="LEFT_COLUMN") option(value="right", data-i18n="RIGHT_COLUMN") span(data-i18n="FOCI_LOCATION_DESC") + p + label + span(data-i18n="QUERY_FOR_MODIFIERS").colon-after + input(type="checkbox", name="attr_setting_modifier_query", value="1", checked) + span(data-i18n="QUERY_FOR_MODIFIERS_DESC") p label span(data-i18n="FINE_NPC_WHISPERING").colon-after diff --git a/Stars_Without_Number_Revised/Source/pug/mixins.pug b/Stars_Without_Number_Revised/Source/pug/mixins.pug index 2baaeb7f81..e81b1773a4 100644 --- a/Stars_Without_Number_Revised/Source/pug/mixins.pug +++ b/Stars_Without_Number_Revised/Source/pug/mixins.pug @@ -74,7 +74,7 @@ mixin makeSave(name) button name, and for translation keys. .blue-button input(type="hidden", name=`attr_save_${name}`, value="15") - button(name=`roll_save_${name}`, type="roll", value=`&{template:swn-save} {{charname=@{name}}} {{title=^{${name.toUpperCase()}_SAVE}}} {{dice=[[1d20]]}} {{save=[[@{save_${name}}]]}}`) + button(name=`roll_save_${name}`, type="roll", value!=`&{template:swn-save} {{charname=@{name}}} {{title=^{${name.toUpperCase()}_SAVE}}} {{dice=[[1d20]]}} {{save=[[@{save_${name}}]]}}`) | v#[span(name=`attr_save_${name}`)] div(data-i18n=name.toUpperCase()) @@ -92,7 +92,7 @@ mixin makeSkill(skillName, custom, label) else - skillPrefix = skillName ? `skill_${skillName}` : "skill"; .skill(data-i18n-list-item=skillName) - button(type="roll", name=`roll_${skillPrefix}`, value=`&{template:swn-skill} {{title=${custom ? `@{${skillPrefix}_name}` : `^{${skillName.toUpperCase()}}`}}} {{charname=@{name}}} {{mod=[[@{modifier_query}]]}} {{dice=[[@{${skillPrefix}_specialist} + @{${skillPrefix}}[Skill] + @{modifier_query} @{${skillPrefix}_query}`).invisible-button.display + button(type="roll", name=`roll_${skillPrefix}`, value!=`&{template:swn-skill} {{title=${custom ? `@{${skillPrefix}_name}` : `^{${skillName.toUpperCase()}}`}}} {{charname=@{name}}} {{mod=[[0 @{modifier_query}]]}} {{dice=[[@{${skillPrefix}_specialist} + @{${skillPrefix}}[Skill] @{modifier_query} @{${skillPrefix}_query}`).invisible-button.display .display.flex-center input(type="hidden", name=`attr_${skillPrefix}_specialist`, value="2d6").dice if (custom) diff --git a/Stars_Without_Number_Revised/Source/pug/npc.pug b/Stars_Without_Number_Revised/Source/pug/npc.pug index 7f1ed7bbff..292516ba0f 100644 --- a/Stars_Without_Number_Revised/Source/pug/npc.pug +++ b/Stars_Without_Number_Revised/Source/pug/npc.pug @@ -4,11 +4,11 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind .menus.col-3.core-box.flex-between h3(data-i18n="QUICK_MENUS") input(type="hidden", name="attr_macro_statblock", value="") - button(type="roll", name="roll_Statblock_macro", data-i18n="STATBLOCK", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=[**^{HD}** @{npc_hd}](~npc_hp), ^{AC} @{AC}}} {{buttons=@{macro_statblock}}}`).unstyled-button + button(type="roll", name="roll_Statblock_macro", data-i18n="STATBLOCK", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=[**^{HD}** @{npc_hd}](~npc_hp), ^{AC} @{AC}}} {{buttons=@{macro_statblock}}}`).unstyled-button input(type="hidden", name="attr_macro_npc_attacks", value="") - button(type="roll", name="roll_NPC_Attack_macro", data-i18n="ATTACKS", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=^{ATTACKS}}} {{buttons=@{macro_npc_attacks}}}`).unstyled-button + button(type="roll", name="roll_NPC_Attack_macro", data-i18n="ATTACKS", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=^{ATTACKS}}} {{buttons=@{macro_npc_attacks}}}`).unstyled-button input(type="hidden", name="attr_macro_npc_abilities", value="") - button(type="roll", name="roll_NPC_Abilities_macro", data-i18n="ABILITIES", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=^{ABILITIES}}} {{buttons=@{macro_npc_abilities}}}`).unstyled-button + button(type="roll", name="roll_NPC_Abilities_macro", data-i18n="ABILITIES", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{npc_name}}} {{title=^{ABILITIES}}} {{buttons=@{macro_npc_abilities}}}`).unstyled-button //- Name etc .core-box-text.info @@ -83,27 +83,27 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind input(type="checkbox", name="attr_npc_rolls_hidden" value="/w GM") .flex-between .blue-button - button(type="roll", name="roll_NPC_HP", value="@{npc_hp_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=^{HIT_POINTS}}} {{ =[[@{npc_hd}d8]]}}") + button(type="roll", name="roll_NPC_HP", value!="@{npc_hp_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=^{HIT_POINTS}}} {{ =[[@{npc_hd}d8]]}}") span(name="attr_npc_hd") div(data-i18n="ROLL_HP") label.individual-hide input(type="checkbox", name="attr_npc_hp_hidden", value="/w GM") span(data-i18n="HIDE") .blue-button - button(type="roll", name="roll_NPC_Initiative", value="@{npc_initiative_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=^{INITIATIVE}}} {{ =[[1d8 &{tracker}]]}}") d8 + button(type="roll", name="roll_NPC_Initiative", value!="@{npc_initiative_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=^{INITIATIVE}}} {{ =[[1d8 &{tracker}]]}}") d8 div(data-i18n="INITIATIVE") label.individual-hide input(type="checkbox", name="attr_npc_initiative_hidden", value="/w GM") span(data-i18n="HIDE") .blue-button - button(type="roll", name="roll_NPC_Save", value="@{npc_save_hidden} &{template:swn-save} {{title=^{SAVING_THROW}}} {{charname=@{npc_name}}} {{save=[[@{npc_saves}]]}} {{dice=[[1d20]]}}") + button(type="roll", name="roll_NPC_Save", value!="@{npc_save_hidden} &{template:swn-save} {{title=^{SAVING_THROW}}} {{charname=@{npc_name}}} {{save=[[@{npc_saves}]]}} {{dice=[[1d20]]}}") | v#[span(name="attr_npc_saves")] div(data-i18n="SAVE") label.individual-hide input(type="checkbox", name="attr_npc_save_hidden", value="/w GM") span(data-i18n="HIDE") .blue-button - button(type="roll", name="roll_NPC_Skill", value="@{npc_skill_hidden} &{template:swn-skill} {{charname=@{npc_name}}} {{title=@{skill_name_query}}} {{dice=[[2d6 + @{proficient_query}]]}}") + button(type="roll", name="roll_NPC_Skill", value!="@{npc_skill_hidden} &{template:swn-skill} {{charname=@{npc_name}}} {{title=@{skill_name_query}}} {{dice=[[2d6 + @{proficient_query} @{modifier_query}]]}}") input(type="hidden", name="attr_npc_skills", value="0").add-plus span(name="attr_npc_skills") div(data-i18n="SKILL") @@ -111,14 +111,14 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind input(type="checkbox", name="attr_npc_skill_hidden", value="/w GM") span(data-i18n="HIDE") .blue-button - button(type="roll", name="roll_NPC_Morale", value="@{npc_morale_hidden} &{template:swn-save} {{charname=@{npc_name}}} {{title=^{MORALE}}} {{morale=[[@{npc_morale}]]}} {{dice=[[2d6]]}}") + button(type="roll", name="roll_NPC_Morale", value!="@{npc_morale_hidden} &{template:swn-save} {{charname=@{npc_name}}} {{title=^{MORALE}}} {{morale=[[@{npc_morale}]]}} {{dice=[[2d6 @{modifier_query}]]}}") | v#[span(name="attr_npc_morale")] div(data-i18n="MORALE") label.individual-hide input(type="checkbox", name="attr_npc_morale_hidden", value="/w GM") span(data-i18n="HIDE") .blue-button - button(type="roll", name="roll_NPC_Reaction", value="@{npc_reaction_hidden} &{template:swn-default} {{title=^{REACTION}}} {{charname=@{npc_name}}} {{reaction=[[2d6 + @{modifier_query}]]}}") 2d6 + button(type="roll", name="roll_NPC_Reaction", value!="@{npc_reaction_hidden} &{template:swn-default} {{title=^{REACTION}}} {{charname=@{npc_name}}} {{reaction=[[2d6 @{modifier_query}]]}}") 2d6 div(data-i18n="REACTION") label.individual-hide input(type="checkbox", name="attr_npc_reaction_hidden", value="/w GM") @@ -137,7 +137,7 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind input(type="checkbox", name="attr_npc_attacks_hidden" value="/w GM") fieldset.repeating_npc-attacks input(type="hidden", name="attr_attack_extra_macro", value="") - button(type="roll", name="roll_Attack", value="@{npc_attacks_hidden} &{template:swn-attack} {{charname=@{npc_name}}} {{title=@{attack_name}}} {{attack=[[1d20 + @{attack_ab} + @{attack_burst} + @{modifier_query}]]}} {{damage=[[@{attack_damage} + @{attack_burst}]]}} {{burst=[[@{attack_burst}]]}} @{attack_extra_macro}").invisible-button.display + button(type="roll", name="roll_Attack", value!="@{npc_attacks_hidden} &{template:swn-attack} {{charname=@{npc_name}}} {{title=@{attack_name}}} {{attack=[[1d20 + @{attack_ab} @{attack_burst} @{modifier_query}]]}} {{damage=[[@{attack_damage} @{attack_burst}]]}} {{burst=[[0@{attack_burst}]]}} @{attack_extra_macro}").invisible-button.display .display.flex-between.grey-box-bordered span.name span(name="attr_attack_name").space-after @@ -150,13 +150,13 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind span(name="attr_attack_damage") .edit.flex.grey-box-bordered +text-input("attack_name", "NAME").name - +text-input("attack_ab", "ATTACK_BONUS_SHORT")(type="number").ab.center + +text-input("attack_ab", "ATTACK_BONUS_SHORT")(type="number", value="0").ab.center +text-input("attack_damage", "DAMAGE")(value="0").damage.center +fake-text-input("BURST").burst.center select(name="attr_attack_burst") - option(value="0", data-i18n="NO") - option(value="@{burst_query}", data-i18n="ASK", selected) - option(value="2", data-i18n="ALWAYS") + option(value="", data-i18n="NO", selected) + option(value="@{burst_query}", data-i18n="ASK") + option(value="+ 2[Burst]", data-i18n="ALWAYS") +text-input("attack_number", "NUM_ATTACKS")(type="number", value="1").attacks.center //- Abilities @@ -168,7 +168,7 @@ input(type="hidden", name="attr_setting_individual_hidden", value="1").input-ind span(data-i18n="HIDDEN") input(type="checkbox", name="attr_npc_abilities_hidden" value="/w GM") fieldset.repeating_npc-abilities - button.display.invisible-button(type="roll", name="roll_Ability", value="@{npc_abilities_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=@{ability_name}}} {{desc=@{ability_description}}}") + button.display.invisible-button(type="roll", name="roll_Ability", value!="@{npc_abilities_hidden} &{template:swn-default} {{charname=@{npc_name}}} {{title=@{ability_name}}} {{desc=@{ability_description}}}") .display.grey-box-bordered span(name="attr_ability_name").name.space-after span(name="attr_ability_description").description diff --git a/Stars_Without_Number_Revised/Source/pug/rolltemplate.pug b/Stars_Without_Number_Revised/Source/pug/rolltemplate.pug index f87195b228..a4802e9ea2 100644 --- a/Stars_Without_Number_Revised/Source/pug/rolltemplate.pug +++ b/Stars_Without_Number_Revised/Source/pug/rolltemplate.pug @@ -59,9 +59,9 @@ rolltemplate.sheet-rolltemplate-swn-attack .roll {{attack4}} .rollname.damage(data-i18n="DAMAGE") .roll {{damage4}} - | {{/attack4}}{{#rollGreater() shock_base 0}} - .shock {{shock}} #[span(data-i18n="SHOCK_DAMAGE_AGAINST_AC_LEQ")] {{shock_ac}}! - | {{/rollGreater() shock_base 0}} + | {{/attack4}} {{#shock}} + .shock {{shock}} + | {{/shock}} .info | {{#range}} span #[span(data-i18n="RANGE")] {{range}} diff --git a/Stars_Without_Number_Revised/Source/pug/ship.pug b/Stars_Without_Number_Revised/Source/pug/ship.pug index 4a320bb5ee..5e3de4eadb 100644 --- a/Stars_Without_Number_Revised/Source/pug/ship.pug +++ b/Stars_Without_Number_Revised/Source/pug/ship.pug @@ -1,7 +1,7 @@ .menus.col-4.core-box.flex-between h3(data-i18n="QUICK_MENUS") input(type="hidden", name="attr_macro_ship_weapons", value="") - button(type="roll", name="roll_ship_weapon_macro", data-i18n="WEAPONS", value=`/w "@{character_name}" &{template:swn-default} {{charname=@{ship_name}}} {{title=^{WEAPONS}}} {{buttons=@{macro_ship_weapons}}}`).unstyled-button + button(type="roll", name="roll_ship_weapon_macro", data-i18n="WEAPONS", value!=`/w "@{character_name}" &{template:swn-default} {{charname=@{ship_name}}} {{title=^{WEAPONS}}} {{buttons=@{macro_ship_weapons}}}`).unstyled-button //- Ship header .info.core-box-text.flex.col-1-3 @@ -34,7 +34,8 @@ +sectionheader("show_ship_weapons", "WEAPONS") .ship-weapons fieldset.repeating_ship-weapons - button(type="roll", name="roll_Attack", value="&{template:swn-attack} {{charname=@{ship_name}}} {{title=@{weapon_name} – @{weapon_qualities}}} {{attack=[[1d20 + @{weapon_attack_bonus}[Attack Bonus] + @{modifier_query}]]}} {{damage=[[@{weapon_damage}]]}}").display.invisible-button + input(type="hidden", name="attr_weapon_api", value="") + button(type="roll", name="roll_Attack", value!="&{template:swn-attack} {{charname=@{ship_name}}} {{title=@{weapon_name} – @{weapon_qualities}}} {{attack=[[1d20 + @{weapon_attack_bonus}[Attack Bonus] @{modifier_query}]]}} {{damage=[[@{weapon_damage}]]}} @{weapon_use_ammo} @{weapon_api}").display.invisible-button .display.grey-box-bordered input(type="hidden", name="attr_weapon_broken", value="0").hider span.broken.space-after #[span(data-i18n="BROKEN")]: @@ -54,7 +55,7 @@ | , #[span(data-i18n="HARDPOINTS")] span(name="attr_weapon_hardpoints") | ) - input(type="hidden", name="attr_weapon_ammo_max", value="").hide-empty + input(type="hidden", name="attr_weapon_use_ammo", value="0").hider span | . #[span(data-i18n="AMMO")]: input(type="number", name="attr_weapon_ammo").inline-input @@ -70,7 +71,9 @@ +text-input("weapon_attack_bonus", "ATTACK_BONUS_SHORT")(type="number", value="0").center.number +text-input("weapon_damage", "DAMAGE")(value="0").center.damage +text-input("weapon_qualities", "QUALITIES").qualities - +text-input-duo("weapon_ammo", "weapon_ammo_max", "AMMO", {min: "0"})(min="0") + +text-input-duo("weapon_ammo", "weapon_ammo_max", "", {min: "0"})(min="0") + input(type="checkbox", name="attr_weapon_use_ammo", value="{{ammo=[[@{weapon_ammo} - 1]] / @{weapon_ammo_max}}}") + span(data-i18n="AMMO") //- Fittings .section.col-3-5.row-3-5 diff --git a/Stars_Without_Number_Revised/Source/workers.js b/Stars_Without_Number_Revised/Source/workers.js index 68babe52e9..cbc32d152e 100644 --- a/Stars_Without_Number_Revised/Source/workers.js +++ b/Stars_Without_Number_Revised/Source/workers.js @@ -1,16 +1,34 @@ /* global getAttrs, setAttrs, getSectionIDs, generateRowID, on ,removeRepeatingRow, _, getTranslationByKey */ (function () { - const sheetVersion = "2.0.1"; + "use strict"; + // Data constants + const sheetName = "Stars Without Number (revised)"; + const sheetVersion = "2.1.0"; + const translate = getTranslationByKey; const attributes = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"]; const effortAttributes = ["wisdom_mod", "constitution_mod", "psionics_extra_effort", "skill_biopsionics", "skill_precognition", "skill_telepathy", "skill_teleportation", "skill_telekinesis", "skill_metapsionics" ]; + const shipStatEvent = [ + ...["hardpoints", "power", "mass"].map(x => `change:repeating_ship-weapons:weapon_${x}`), + ...["power", "mass"].map(x => `change:repeating_ship-defenses:defense_${x}`), + ...["power", "mass"].map(x => `change:repeating_ship-fittings:fitting_${x}`), + "change:ship_power", "change:ship_mass", "change:ship_hardpoints", + "remove:repeating_ship-weapons", "remove:repeating_ship-defenses", + "remove:repeating_ship-fittings" + ].join(" "); const weaponSkills = [ "skill_shoot", "skill_punch", "skill_stab", "skill_combat_energy", "skill_combat_gunnery", "skill_combat_primitive", "skill_combat_projectile", "skill_combat_psitech", "skill_combat_unarmed", "skill_telekinesis" ]; + const weaponDisplayEvent = [ + ...["attack", "name", "skill_bonus", "attribute_mod", "damage", "shock","shock_damage", + "shock_ac", "skill_to_damage"].map(x => `change:repeating_weapons:weapon_${x}`), + "remove:repeating_weapons", "change:attack_bonus", + ...weaponSkills.map(name => `change:${name}`), + ].join(" "); const skills = { revised: ["administer", "connect", "exert", "fix", "heal", "know", "lead", "notice", "perform", "pilot", "program", "punch", "shoot", "sneak", "stab", @@ -27,43 +45,751 @@ }; // HD AC AB Damage #attacks move morale skills saves armor_type const statblockData = { - "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"] + 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"] }; - /* Utility */ - const translate = getTranslationByKey; + const shipData = { + defenses: { + ablative_hull_compartments: { + class: "CAPITAL", + effect: `+1 ${translate("AC")}, +20 ${translate("MAXIMUM_HIT_POINTS").toLowerCase()}.`, + mass: "2#", + name: translate("ABLATIVE_HULL_COMPARTMENTS"), + power: "5", + }, + augmented_plating: { + class: "FIGHTER", + effect: `+2 ${translate("AC")}, -1 ${translate("SPEED")}.`, + mass: "1#", + name: translate("AUGMENTED_PLATING"), + power: "0", + }, + boarding_countermeasures: { + class: "FRIGATE", + effect: translate("BOARDING_COUNTERMEASURES_DESC"), + mass: "1#", + name: translate("BOARDING_COUNTERMEASURES"), + power: "2", + }, + burst_ecm_generator: { + class: "FRIGATE", + effect: translate("BURST_ECM_GENERATOR_DESC"), + mass: "1#", + name: translate("BURST_ECM_GENERATOR"), + power: "2", + }, + foxer_drones: { + class: "CRUISER", + effect: translate("FOXER_DRONES_DESC"), + mass: "1#", + name: translate("FOXER_DRONES"), + power: "2", + }, + grav_eddy_displacer: { + class: "FRIGATE", + effect: translate("GRAV_EDDY_DISPLACER_DESC"), + mass: "2#", + name: translate("GRAV_EDDY_DISPLACER"), + power: "5", + }, + hardened_polyceramic_overlay: { + class: "FIGHTER", + effect: translate("HARDENED_POLYCERAMIC_OVERLAY_DESC"), + mass: "1#", + name: translate("HARDENED_POLYCERAMIC_OVERLAY"), + power: "0", + }, + planetary_defense_array: { + class: "FRIGATE", + effect: translate("PLANETARY_DEFENSE_ARRAY_DESC"), + mass: "2#", + name: translate("PLANETARY_DEFENSE_ARRAY"), + power: "4", + }, + point_defense_lasers: { + class: "FRIGATE", + effect: translate("POINT_DEFENSE_LASERS_DESC"), + mass: "2#", + name: translate("POINT_DEFENSE_LASERS"), + power: "3", + }, + }, + fittings: { + advanced_lab: { + class: "FRIGATE", + effect: translate("ADVANCED_LAB_DESC"), + mass: "2", + name: translate("ADVANCED_LAB"), + power: "1#", + }, + advanced_nav_computer: { + class: "FRIGATE", + effect: translate("ADVANCED_NAV_COMPUTER_DESC"), + mass: "0", + name: translate("ADVANCED_NAV_COMPUTER"), + power: "1#", + }, + amphibious_operation: { + class: "FIGHTER", + effect: translate("AMPHIBIOUS_OPERATION_DESC"), + mass: "1#", + name: translate("AMPHIBIOUS_OPERATION"), + power: "1", + }, + armory: { + class: "FRIGATE", + effect: translate("ARMORY_DESC"), + mass: "0", + name: translate("ARMORY"), + power: "0", + }, + atmospheric_configuration: { + class: "FIGHTER", + effect: translate("ATMOSPHERIC_CONFIGURATION_DESC"), + mass: "1#", + name: translate("ATMOSPHERIC_CONFIGURATION"), + power: "0", + }, + auto_targeting_system: { + class: "FIGHTER", + effect: translate("AUTO_TARGETING_SYSTEM_DESC"), + mass: "0", + name: translate("AUTO_TARGETING_SYSTEM"), + power: "1", + }, + automation_support: { + class: "FIGHTER", + effect: translate("AUTOMATION_SUPPORT_DESC"), + mass: "1", + name: translate("AUTOMATION_SUPPORT"), + power: "2", + }, + boarding_tubes: { + class: "FRIGATE", + effect: translate("BOARDING_TUBES_DESC"), + mass: "1", + name: translate("BOARDING_TUBES"), + power: "0", + }, + cargo_lighter: { + class: "FRIGATE", + effect: translate("CARGO_LIGHTER_DESC"), + mass: "2", + name: translate("CARGO_LIGHTER"), + power: "0", + }, + cargo_space: { + class: "FIGHTER", + effect: translate("CARGO_SPACE_DESC"), + mass: "1", + name: translate("CARGO_SPACE"), + power: "0", + }, + cold_sleep_pods: { + class: "FRIGATE", + effect: translate("COLD_SLEEP_PODS_DESC"), + mass: "1", + name: translate("COLD_SLEEP_PODS"), + power: "1", + }, + colony_core: { + class: "FRIGATE", + effect: translate("COLONY_CORE_DESC"), + mass: "2#", + name: translate("COLONY_CORE"), + power: "4", + }, + drill_course_regulator: { + class: "FRIGATE", + effect: translate("DRILL_COURSE_REGULATOR_DESC"), + mass: "1", + name: translate("DRILL_COURSE_REGULATOR"), + power: "1#", + }, + spike_drive_2: { + class: "FIGHTER", + effect: translate("SPIKE_DRIVE_2_DESC"), + mass: "1#", + name: translate("SPIKE_DRIVE_2"), + power: "1#", + }, + spike_drive_3: { + class: "FIGHTER", + effect: translate("SPIKE_DRIVE_3_DESC"), + mass: "2#", + name: translate("SPIKE_DRIVE_3"), + power: "2#", + }, + spike_drive_4: { + class: "FRIGATE", + effect: translate("SPIKE_DRIVE_4_DESC"), + mass: "3#", + name: translate("SPIKE_DRIVE_4"), + power: "2#", + }, + spike_drive_5: { + class: "FRIGATE", + effect: translate("SPIKE_DRIVE_5_DESC"), + mass: "3#", + name: translate("SPIKE_DRIVE_5"), + power: "3#", + }, + spike_drive_6: { + class: "CRUISER", + effect: translate("SPIKE_DRIVE_6_DESC"), + mass: "4#", + name: translate("SPIKE_DRIVE_6"), + power: "3#", + }, + drop_pod: { + class: "FRIGATE", + effect: translate("DROP_POD_DESC"), + mass: "2", + name: translate("DROP_POD"), + power: "0", + }, + emissions_dampers: { + class: "FIGHTER", + effect: translate("EMISSIONS_DAMPERS_DESC"), + mass: "1#", + name: translate("EMISSIONS_DAMPERS"), + power: "1#", + }, + exodus_bay: { + class: "CRUISER", + effect: translate("EXODUS_BAY_DESC"), + mass: "2#", + name: translate("EXODUS_BAY"), + power: "1#", + }, + extended_life_support: { + class: "FIGHTER", + effect: translate("EXTENDED_LIFE_SUPPORT_DESC"), + mass: "1#", + name: translate("EXTENDED_LIFE_SUPPORT"), + power: "1#", + }, + extended_medbay: { + class: "FRIGATE", + effect: translate("EXTENDED_MEDBAY_DESC"), + mass: "1", + name: translate("EXTENDED_MEDBAY"), + power: "1", + }, + extended_store: { + class: "FIGHTER", + effect: translate("EXTENDED_STORE_DESC"), + mass: "1#", + name: translate("EXTENDED_STORE"), + power: "0", + }, + fuel_bunkers: { + class: "FIGHTER", + effect: translate("FUEL_BUNKERS_DESC"), + mass: "1", + name: translate("FUEL_BUNKERS"), + power: "0", + }, + fuel_scoops: { + class: "FRIGATE", + effect: translate("FUEL_SCOOPS_DESC"), + mass: "1#", + name: translate("FUEL_SCOOPS"), + power: "2", + }, + hydroponic_production: { + class: "CRUISER", + effect: translate("HYDROPONIC_PRODUCTION_DESC"), + mass: "2#", + name: translate("HYDROPONIC_PRODUCTION"), + power: "1#", + }, + lifeboats: { + class: "FRIGATE", + effect: translate("LIFEBOATS_DESC"), + mass: "1", + name: translate("LIFEBOATS"), + power: "0", + }, + luxury_cabins: { + class: "FRIGATE", + effect: translate("LUXURY_CABINS_DESC"), + mass: "1#", + name: translate("LUXURY_CABINS"), + power: "1", + }, + mobile_extractor: { + class: "FRIGATE", + effect: translate("MOBILE_EXTRACTOR_DESC"), + mass: "1", + name: translate("MOBILE_EXTRACTOR"), + power: "2", + }, + mobile_factory: { + class: "CRUISER", + effect: translate("MOBILE_FACTORY_DESC"), + mass: "2#", + name: translate("MOBILE_FACTORY"), + power: "3", + }, + precognitive_nav_chamber: { + class: "FRIGATE", + effect: translate("PRECOGNITIVE_NAV_CHAMBER_DESC"), + mass: "0", + name: translate("PRECOGNITIVE_NAV_CHAMBER"), + power: "1", + }, + psionic_anchorpoint: { + class: "FRIGATE", + effect: translate("PSIONIC_ANCHORPOINT_DESC"), + mass: "0", + name: translate("PSIONIC_ANCHORPOINT"), + power: "3", + }, + sensor_mask: { + class: "FRIGATE", + effect: translate("SENSOR_MASK_DESC"), + mass: "0", + name: translate("SENSOR_MASK"), + power: "1#", + }, + ship_bay_fighter: { + class: "CRUISER", + effect: translate("SHIP_BAY_FIGHTER_DESC"), + mass: "2", + name: translate("SHIP_BAY_FIGHTER"), + power: "0", + }, + ship_bay_frigate: { + class: "CAPITAL", + effect: translate("SHIP_BAY_FRIGATE_DESC"), + mass: "4", + name: translate("SHIP_BAY_FRIGATE"), + power: "1", + }, + ships_locker: { + class: "FRIGATE", + effect: translate("SHIPS_LOCKER_DESC"), + mass: "0", + name: translate("SHIPS_LOCKER"), + power: "0", + }, + shiptender_mount: { + class: "FRIGATE", + effect: translate("SHIPTENDER_MOUNT_DESC"), + mass: "1", + name: translate("SHIPTENDER_MOUNT"), + power: "1", + }, + smugglers_hold: { + class: "FIGHTER", + effect: translate("SMUGGLERS_HOLD_DESC"), + mass: "1", + name: translate("SMUGGLERS_HOLD"), + power: "0", + }, + survey_sensor_array: { + class: "FRIGATE", + effect: translate("SURVEY_SENSOR_ARRAY_DESC"), + mass: "1", + name: translate("SURVEY_SENSOR_ARRAY"), + power: "2", + }, + system_drive: { + class: "FIGHTER", + effect: translate("SYSTEM_DRIVE_DESC"), + mass: "-2#", + name: translate("SYSTEM_DRIVE"), + power: "-1#", + }, + teleportation_pads: { + class: "FRIGATE", + effect: translate("TELEPORTATION_PADS_DESC"), + mass: "1", + name: translate("TELEPORTATION_PADS"), + power: "1", + }, + tractor_beams: { + class: "FRIGATE", + effect: translate("TRACTOR_BEAMS_DESC"), + mass: "1", + name: translate("TRACTOR_BEAMS"), + power: "2", + }, + vehicle_transport_fittings: { + class: "FRIGATE", + effect: translate("VEHICLE_TRANSPORT_FITTINGS_DESC"), + mass: "1#", + name: translate("VEHICLE_TRANSPORT_FITTINGS"), + power: "0", + }, + workshop: { + class: "FRIGATE", + effect: translate("WORKSHOP_DESC"), + mass: "0.5#", + name: translate("WORKSHOP"), + power: "1", + }, + }, + hulltypes: { + battleship: { + ship_ac: "16", + ship_armor: "20", + ship_class: "CAPITAL", + ship_crew_max: "1000", + ship_crew_min: "200", + ship_hardpoints_max: "15", + ship_hp_max: "100", + ship_mass_max: "50", + ship_power_max: "75", + ship_speed: "0", + }, + bulk_freighter: { + ship_ac: "11", + ship_armor: "0", + ship_class: "CRUISER", + ship_crew_max: "40", + ship_crew_min: "10", + ship_hardpoints_max: "2", + ship_hp_max: "40", + ship_mass_max: "25", + ship_power_max: "15", + ship_speed: "0", + }, + carrier: { + ship_ac: "14", + ship_armor: "10", + ship_class: "CAPITAL", + ship_crew_max: "1500", + ship_crew_min: "300", + ship_hardpoints_max: "4", + ship_hp_max: "75", + ship_mass_max: "100", + ship_power_max: "50", + ship_speed: "0", + }, + corvette: { + ship_ac: "13", + ship_armor: "10", + ship_class: "FRIGATE", + ship_crew_max: "40", + ship_crew_min: "10", + ship_hardpoints_max: "6", + ship_hp_max: "40", + ship_mass_max: "15", + ship_power_max: "15", + ship_speed: "2", + }, + fleet_cruiser: { + ship_ac: "14", + ship_armor: "15", + ship_class: "CRUISER", + ship_crew_max: "200", + ship_crew_min: "50", + ship_hardpoints_max: "10", + ship_hp_max: "60", + ship_mass_max: "30", + ship_power_max: "50", + ship_speed: "1", + }, + free_merchant: { + ship_ac: "14", + ship_armor: "2", + ship_class: "FRIGATE", + ship_crew_max: "6", + ship_crew_min: "1", + ship_hardpoints_max: "2", + ship_hp_max: "20", + ship_mass_max: "15", + ship_power_max: "10", + ship_speed: "3", + }, + heavy_frigate: { + ship_ac: "15", + ship_armor: "10", + ship_class: "FRIGATE", + ship_crew_max: "120", + ship_crew_min: "30", + ship_hardpoints_max: "8", + ship_hp_max: "50", + ship_mass_max: "20", + ship_power_max: "25", + ship_speed: "1", + }, + large_station: { + ship_ac: "17", + ship_armor: "20", + ship_class: "CAPITAL", + ship_crew_max: "1000", + ship_crew_min: "100", + ship_hardpoints_max: "30", + ship_hp_max: "120", + ship_mass_max: "75", + ship_power_max: "125", + ship_speed: "", + }, + patrol_boat: { + ship_ac: "14", + ship_armor: "5", + ship_class: "FRIGATE", + ship_crew_max: "20", + ship_crew_min: "5", + ship_hardpoints_max: "4", + ship_hp_max: "25", + ship_mass_max: "10", + ship_power_max: "15", + ship_speed: "4", + }, + small_station: { + ship_ac: "11", + ship_armor: "5", + ship_class: "CRUISER", + ship_crew_max: "200", + ship_crew_min: "20", + ship_hardpoints_max: "10", + ship_hp_max: "120", + ship_mass_max: "40", + ship_power_max: "50", + ship_speed: "", + }, + strike_fighter: { + ship_ac: "16", + ship_armor: "5", + ship_class: "FIGHTER", + ship_crew_max: "1", + ship_crew_min: "1", + ship_hardpoints_max: "1", + ship_hp_max: "8", + ship_mass_max: "2", + ship_power_max: "5", + ship_speed: "5", + }, + shuttle: { + ship_ac: "11", + ship_armor: "0", + ship_class: "FIGHTER", + ship_crew_max: "10", + ship_crew_min: "1", + ship_hardpoints_max: "1", + ship_hp_max: "15", + ship_mass_max: "5", + ship_power_max: "3", + ship_speed: "3", + }, + }, + weapons: { + charged_particle_caster: { + class: "FRIGATE", + damage: "3d6", + hardpoints: "2", + name: translate("CHARGED_PARTICLE_CASTER"), + mass: "1", + power: "10", + qualities: `${translate("AP")} 15, ${translate("CLUMSY")}`, + }, + flak_emitter_battery: { + class: "FRIGATE", + damage: "2d6", + hardpoints: "1", + name: translate("FLAK_EMITTER_BATTERY"), + mass: "3", + power: "5", + qualities: `${translate("AP")} 10, ${translate("FLAK")}`, + }, + fractal_impact_charge: { + ammo: "4", + class: "FIGHTER", + damage: "2d6", + hardpoints: "1", + name: translate("FRACTAL_IMPACT_CHARGE"), + mass: "1", + power: "5", + qualities: `${translate("AP")} 15`, + }, + gravcannon: { + class: "CRUISER", + damage: "4d6", + hardpoints: "3", + name: translate("GRAVCANNON"), + mass: "4", + power: "15", + qualities: `${translate("AP")} 20`, + }, + lightning_charge_mantle: { + class: "CAPITAL", + damage: "1d20", + hardpoints: "2", + name: translate("LIGHTNING_CHARGE_MANTLE"), + mass: "5", + power: "15", + qualities: `${translate("AP")} 5, ${translate("CLOUD")}`, + }, + mag_spike_array: { + ammo: "5", + class: "FRIGATE", + damage: "2d6+2", + hardpoints: "2", + name: translate("MAG_SPIKE_ARRAY"), + mass: "2", + power: "5", + qualities: `${translate("AP")} 10, ${translate("FLAK")}`, + }, + mass_cannon: { + ammo: "4", + class: "CAPITAL", + damage: "2d20", + hardpoints: "4", + name: translate("MASS_CANNON"), + mass: "5", + power: "10", + qualities: `${translate("AP")} 20`, + }, + multifocal_laser: { + class: "FIGHTER", + damage: "1d4", + hardpoints: "1", + name: translate("MULTIFOCAL_LASER"), + mass: "1", + power: "5", + qualities: `${translate("AP")} 20`, + }, + nuclear_missiles: { + ammo: "5", + class: "FRIGATE", + damage: "", + hardpoints: "2", + name: translate("NUCLEAR_MISSILES"), + mass: "1", + power: "5", + qualities: "", + }, + plasma_beam: { + class: "FRIGATE", + damage: "3d6", + hardpoints: "2", + name: translate("PLASMA_BEAM"), + mass: "2", + power: "5", + qualities: `${translate("AP")} 10`, + }, + polyspectral_mes_beam: { + class: "FIGHTER", + damage: "2d4", + hardpoints: "1", + name: translate("POLYSPECTRAL_MES_BEAM"), + mass: "1", + power: "5", + qualities: `${translate("AP")} 25`, + }, + reaper_battery: { + class: "FIGHTER", + damage: "3d4", + hardpoints: "1", + name: translate("REAPER_BATTERY"), + mass: "1", + power: "4", + qualities: translate("CLUMSY"), + }, + sandthrower: { + class: "FIGHTER", + damage: "2d4", + hardpoints: "1", + name: translate("SANDTHROWER"), + mass: "1", + power: "3", + qualities: translate("FLAK"), + }, + singularity_gun: { + class: "CAPITAL", + damage: "5d20", + hardpoints: "5", + name: translate("SINGULARITY_GUN"), + mass: "10", + power: "25", + qualities: `${translate("AP")} 25`, + }, + smart_cloud: { + class: "CRUISER", + damage: "3d10", + hardpoints: "2", + name: translate("SMART_CLOUD"), + mass: "5", + power: "10", + qualities: `${translate("CLOUD")}, ${translate("CLUMSY")}`, + }, + spike_inversion_projector: { + class: "CRUISER", + damage: "3d8", + hardpoints: "3", + name: translate("SPIKE_INVERSION_PROJECTOR"), + mass: "3", + power: "10", + qualities: `${translate("AP")} 15`, + }, + spinal_beam_cannon: { + class: "CRUISER", + damage: "3d10", + hardpoints: "3", + name: translate("SPINAL_BEAM_CANNON"), + mass: "5", + power: "10", + qualities: `${translate("AP")} 15, ${translate("CLUMSY")}`, + }, + torpedo_launcher: { + ammo: "4", + class: "FRIGATE", + damage: "3d8", + hardpoints: "1", + name: translate("TORPEDO_LAUNCHER"), + mass: "3", + power: "10", + qualities: `${translate("AP")} 20`, + }, + vortex_tunnel_inductor: { + class: "CAPITAL", + damage: "3d20", + hardpoints: "4", + name: translate("VORTEX_TUNNEL_INDUCTOR"), + mass: "10", + power: "20", + qualities: `${translate("AP")} 20, ${translate("CLUMSY")}`, + }, + }, + }; + + /* Utility functions */ const sign = (value) => { const val = parseInt(value) || 0; if (val >= 0) return `+${val}`; @@ -74,9 +800,11 @@ const mySetAttrs = (setting, values, ...rest) => { // This is a version of setAttrs that expects an extra values parameter // (as received from getAttrs). It will only set values in setting that differ - // from their current value on the sheet. + // from their current value on the sheet. The intention is to not + // set values unnecessarily (it's expensive) and to reduce bloat + // in the Attributes & Abilities tab. Object.keys(setting).forEach(k => { - if (values[k] === setting[k]) delete setting[k]; + if (String(values[k]) === String(setting[k])) delete setting[k]; }); setAttrs(setting, ...rest); }; @@ -194,32 +922,42 @@ }; const calculateGearReadiedStowed = () => { - getSectionIDs("repeating_gear", (idArray) => { - const attrs = [ - ...idArray.map(id => `repeating_gear_${id}_gear_encumbrance`), - ...idArray.map(id => `repeating_gear_${id}_gear_status`), - "armor_encumbrance", - "gear_readied", "gear_readied_max", "gear_readied_over", - "gear_stowed", "gear_stowed_max", "gear_stowed_over", - ]; - getAttrs(attrs, v => { - const [gear_readied, gear_stowed] = idArray.reduce((m, id) => { - if (v[`repeating_gear_${id}_gear_status`] === "readied") - m[0] += parseInt(v[`repeating_gear_${id}_gear_encumbrance`]) || 0; - else if (v[`repeating_gear_${id}_gear_status`] === "stowed") - m[1] += parseInt(v[`repeating_gear_${id}_gear_encumbrance`]) || 0; - return m; - }, [parseInt(v.armor_encumbrance) || 0, 0]); - const gear_readied_over = (gear_readied > parseInt(v.gear_readied_max)) ? "1" : "0"; - const gear_stowed_over = (gear_stowed > parseInt(v.gear_stowed_max)) ? "1" : "0"; - const setting = {gear_readied, gear_stowed, gear_readied_over, gear_stowed_over}; + getSectionIDs("repeating_gear", gearIDs => { + getSectionIDs("repeating_weapons", weaponIDs => { + const attrs = [ + ...gearIDs.map(id => `repeating_gear_${id}_gear_encumbrance`), + ...gearIDs.map(id => `repeating_gear_${id}_gear_status`), + ...weaponIDs.map(id => `repeating_weapons_${id}_weapon_encumbrance`), + ...weaponIDs.map(id => `repeating_weapons_${id}_weapon_status`), + "armor_encumbrance", + "gear_readied", "gear_readied_max", "gear_readied_over", + "gear_stowed", "gear_stowed_max", "gear_stowed_over", + ]; + getAttrs(attrs, v => { + const [gear_readied, gear_stowed] = weaponIDs.reduce((m, id) => { + if (v[`repeating_weapons_${id}_weapon_status`] === "READIED") + m[0] += parseInt(v[`repeating_weapons_${id}_weapon_encumbrance`]) || 0; + else if (v[`repeating_weapons_${id}_weapon_status`] === "STOWED") + m[1] += parseInt(v[`repeating_weapons_${id}_weapon_encumbrance`]) || 0; + return m; + }, gearIDs.reduce((m, id) => { + if (v[`repeating_gear_${id}_gear_status`] === "READIED") + m[0] += parseInt(v[`repeating_gear_${id}_gear_encumbrance`]) || 0; + else if (v[`repeating_gear_${id}_gear_status`] === "STOWED") + m[1] += parseInt(v[`repeating_gear_${id}_gear_encumbrance`]) || 0; + return m; + }, [parseInt(v.armor_encumbrance) || 0, 0])); + const gear_readied_over = (gear_readied > parseInt(v.gear_readied_max)) ? "1" : "0"; + const gear_stowed_over = (gear_stowed > parseInt(v.gear_stowed_max)) ? "1" : "0"; + const setting = {gear_readied, gear_stowed, gear_readied_over, gear_stowed_over}; - mySetAttrs(setting, v, {silent: true}); + mySetAttrs(setting, v, {silent: true}); + }); }); }); }; - const calculateStowedReadiedMax = () => { + const calculateGearReadiedStowedMax = () => { getAttrs(["strength", "gear_readied_max", "gear_stowed_max"], v => { if (v.strength) mySetAttrs({ @@ -240,6 +978,7 @@ ...prefixes.map(prefix => `${prefix}_weapon_skill_bonus`), ...prefixes.map(prefix => `${prefix}_weapon_attribute_mod`), ...prefixes.map(prefix => `${prefix}_weapon_damage`), + ...prefixes.map(prefix => `${prefix}_weapon_shock`), ...prefixes.map(prefix => `${prefix}_weapon_shock_damage`), ...prefixes.map(prefix => `${prefix}_weapon_shock_ac`), ...prefixes.map(prefix => `${prefix}_weapon_skill_to_damage`), @@ -260,7 +999,7 @@ const damageBonus = attrBonus + ((v[`${prefix}_weapon_skill_to_damage`] === "@{weapon_skill_bonus}") ? skillBonus : 0); const weaponDamage = (v[`${prefix}_weapon_damage`] === "0") ? "" : v[`${prefix}_weapon_damage`]; - const shockString = (v[`${prefix}_weapon_shock_damage`] !== "0") ? `, ${ + const shockString = (v[`${prefix}_weapon_shock`] !== "0") ? `, ${ (parseInt(v[`${prefix}_weapon_shock_damage`])||0) + damageBonus }\xa0${translate("SHOCK").toLowerCase()}${ v[`${prefix}_weapon_shock_ac`] ? ` ${translate("VS_AC_LEQ")} ${v[`${prefix}_weapon_shock_ac`]}` : "" @@ -285,13 +1024,23 @@ }); }); }; - - const handleSuperChange = () => { - getAttrs(["setting_super_type", "tab_super"], v => { - const setting = {}; - if (v.setting_super_type === "magic") setting.tab_super = "magic"; - if (v.setting_super_type === "psionics") setting.tab_super = "psionics"; - mySetAttrs(setting, v); + const handleAmmoAPI = (sName) => { + const formula = (sName === "weapons") ? "[[-1 - @{weapon_burst}]]" : "-1" ; + getSectionIDs(`repeating_${sName}`, idArray => { + getAttrs([ + "setting_use_ammo", + ...idArray.map(id => `repeating_${sName}_${id}_weapon_use_ammo`), + ...idArray.map(id => `repeating_${sName}_${id}_weapon_api`) + ], v => { + const setting = idArray.reduce((m, id) => { + m[`repeating_${sName}_${id}_weapon_api`] = + (v.setting_use_ammo === "1" && v[`repeating_${sName}_${id}_weapon_use_ammo`] !== "0") ? + `\n!modattr --mute --charid @{character_id} --repeating_${sName}_${id}_weapon_ammo|${formula}` + : ""; + return m; + }, {}); + mySetAttrs(setting, v, { silent: true }); + }); }); }; @@ -304,6 +1053,16 @@ if (v.tab === "npc" && v.npc === "0") setAttrs({tab: "character"}); }); }; + + const validateSuperTab = () => { + getAttrs(["setting_super_type", "tab_super"], v => { + const setting = {}; + if (v.setting_super_type === "magic") setting.tab_super = "magic"; + if (v.setting_super_type === "psionics") setting.tab_super = "psionics"; + mySetAttrs(setting, v); + }); + }; + const validateStrain = () => { getAttrs(["strain", "strain_permanent", "strain_max"], v => { const currentStrain = parseInt(v.strain) || 0, @@ -313,6 +1072,7 @@ if (strain !== currentStrain) setAttrs({ strain }); }); }; + const validateWeaponSkills = (ids) => { // Makes sure that the select for the weapon skill is never in an invalid state. const prefixes = (ids && ids.map(id => `repeating_weapons_${id}`)) || ["repeating_weapons"]; @@ -364,7 +1124,7 @@ }; const addNPCAttackBonus = () => { getAttrs(["repeating_npc-attacks_attack_ab", "npc_attack_bonus"], v => { - if (!String(v["repeating_npc-attacks_attack_ab"])) { + if (String(v["repeating_npc-attacks_attack_ab"]) === "0") { setAttrs({ ["repeating_npc-attacks_attack_ab"]: v.npc_attack_bonus }); @@ -383,8 +1143,8 @@ const num = parseInt(v[`repeating_npc-attacks_${id}_attack_number`]) || 1; const macro = [2,3,4].map(n => { if (n <= num) - return `{{attack${n}=[[1d20 + @{attack_ab} + @{attack_burst} + @{modifier_query}]]}} ` + - `{{damage${n}=[[@{attack_damage} + @{attack_burst}]]}} `; + return `{{attack${n}=[[1d20 + @{attack_ab} @{attack_burst} @{modifier_query}]]}} ` + + `{{damage${n}=[[@{attack_damage} @{attack_burst}]]}} `; else return ""; }).join(""); m[`repeating_npc-attacks_${id}_attack_extra_macro`] = macro; @@ -571,7 +1331,7 @@ "macro_statblock", ]; getAttrs(sourceAttrs, v => { - if (v.npc !== '1') return; + if (v.npc !== "1") return; const macroList = [ `[**^{SAVES}** v@{npc_saves},](~npc_save) [**^{SKILLS}** +@{npc_skills},](~npc_skill) `, `[**^{MORALE}** v@{npc_morale}](~npc_morale)\n`, @@ -588,11 +1348,11 @@ /* Translations */ const setTranslatedDefaults = () => { const specialSkills = { - "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/"}, + 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(specialSkills), "homebrew_skill_list"], v => { if (v.homebrew_skill_list === "first") { @@ -641,12 +1401,21 @@ }); }; + const handleModifierQuery = () => { + getAttrs(["modifier_query", "setting_modifier_query"], v => { + if (String(v.setting_modifier_query) === "1") { + mySetAttrs({ + modifier_query: `+ ?{${translate("MODIFIER")}|0}[${translate("MODIFIER_SHORT")}]`, + }, v); + } + else mySetAttrs({modifier_query: " "}, v); + }); + }; const setTranslatedQueries = () => { - getAttrs(["burst_query", "translation_numdice", - "modifier_query", "proficient_query", "skill_name_query"], v => { + getAttrs(["burst_query", "extra_hp_query", "translation_numdice", "proficient_query", "skill_name_query"], v => { const setting = { - burst_query: `?{${translate("BURST")}|${translate("YES")}, 2|${translate("NO")}, 0}[${translate("BURST")}]`, - modifier_query: `?{${translate("MODIFIER")}|0}[${translate("MODIFIER")}]`, + 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") @@ -700,18 +1469,102 @@ /** * Migrations */ - const handleVersioning = () => { + const handleUpgrade = () => { getAttrs(["character_sheet"], v => { - if (!v.character_sheet || - v.character_sheet.indexOf("Stars Without Number (revised)") !== 0) upgradeFrom162(); - else upgradeSheet(v.character_sheet.slice(32)); + if (!v.character_sheet || v.character_sheet.indexOf(sheetName) !== 0) + upgradeFrom162(); + else if (v.character_sheet.slice(32) !== sheetVersion) + upgradeSheet(v.character_sheet.slice(32), true); }); }; - const upgradeSheet = () => { - // Any version upgrade code should go here and set a new sheetVersion - setAttrs({ - character_sheet: `Stars Without Number (revised) v${sheetVersion}` + const upgradeSheet = (version, firstTime = false, finalTime = false) => { + // Any version upgrade code should go here + const performUpgrade = (version) => { + const [major, minor] = version.split(".").map(x => parseInt(x)); + console.log(`Upgrading from version ${version}.`); + + /** v2.1.0 + * convert old format for burst settings for weapons and attacks + * set ammo and shock checkboxes to reasonable values + * convert old format for gear readied/stowed + **/ + if (major == 2 && minor < 1) { + const upgradeFunction = _.after(4, () => upgradeSheet("2.1.0")); + + // recalculate these things just to be sure, in case the v1.6.2 update + // missed them. + buildShipWeaponsMenu(); + attributes.forEach(calculateMod); + + getSectionIDs("repeating_weapons", idArray => { + const sourceAttrs = [ + ...idArray.map(id => `repeating_weapons_${id}_weapon_burst`), + ...idArray.map(id => `repeating_weapons_${id}_weapon_shock_damage`), + ...idArray.map(id => `repeating_weapons_${id}_weapon_ammo`) + ]; + getAttrs(sourceAttrs, v => { + const setting = idArray.reduce((m, id) => { + if (v[`repeating_weapons_${id}_weapon_burst`] === "0") + m[`repeating_weapons_${id}_weapon_burst`] = ""; + else if (v[`repeating_weapons_${id}_weapon_burst`] === "2") + m[`repeating_weapons_${id}_weapon_burst`] = "+ 2[Burst]"; + if (v[`repeating_weapons_${id}_weapon_shock_damage`] !== "0") + m[`repeating_weapons_${id}_weapon_shock`] = "{{shock=[[@{weapon_shock_damage} + @{weapon_attribute_mod}[Attribute] + @{weapon_skill_to_damage}[Skill]]] ^{SHOCK_DAMAGE_AGAINST_AC_LEQ} @{weapon_shock_ac}!}}"; + if (v[`repeating_weapons_${id}_weapon_ammo`] && + v[`repeating_weapons_${id}_weapon_ammo`] !== "0") + m[`repeating_weapons_${id}_weapon_use_ammo`] = "{{ammo=[[0@{weapon_ammo} - (1 @{weapon_burst})]]}}"; + return m; + }, {}); + setAttrs(setting, {}, upgradeFunction); + }); + }); + getSectionIDs("repeating_ship-weapons", idArray => { + getAttrs(idArray.map(id => `repeating_ship-weapons_${id}_weapon_ammo_max`), v => { + console.log("SHIP WEAPONS"); + console.log(v); + const setting = idArray.reduce((m, id) => { + if (v[`repeating_ship-weapons_${id}_weapon_ammo_max`] && + v[`repeating_ship-weapons_${id}_weapon_ammo_max`] !== "0") + m[`repeating_ship-weapons_${id}_weapon_use_ammo`] = + "{{ammo=[[@{weapon_ammo} - 1]] / @{weapon_ammo_max}}}"; + return m; + }, {}); + setAttrs(setting, {}, upgradeFunction); + }); + }); + getSectionIDs("repeating_npc-attacks", idArray => { + getAttrs(idArray.map(id => `repeating_npc-attacks_${id}_attack_burst`), v => { + const setting = idArray.reduce((m, id) => { + if (v[`repeating_npc-attacks_${id}_attack_burst`] === "0") + m[`repeating_npc-attacks_${id}_attack_burst`] = ""; + else if (v[`repeating_npc-attacks_${id}_attack_burst`] === "2") + m[`repeating_npc-attacks_${id}_attack_burst`] = "+ 2[Burst]"; + return m; + }, {}); + setAttrs(setting, {}, upgradeFunction); + }); + }); + getSectionIDs("repeating_gear", idArray => { + getAttrs(idArray.map(id => `repeating_gear_${id}_gear_status`), v => { + const setting = idArray.reduce((m, id) => { + m[`repeating_gear_${id}_gear_status`] = + (v[`repeating_gear_${id}_gear_status`] || "").toUpperCase(); + return m; + }, {}); + mySetAttrs(setting, v, {}, upgradeFunction); + }); + }); + } + /** Final upgrade clause, always leave this around */ + else upgradeSheet(sheetVersion, false, true); + }; + + if (firstTime) performUpgrade(version); + else setAttrs({ + character_sheet: `${sheetName} v${version}`, + }, {}, () => { + if (!finalTime) performUpgrade(version); }); }; @@ -886,7 +1739,7 @@ else if (v.homebrew_psionics_disable === "on") setting.setting_super_type = "neither"; - setAttrs(setting, {silent: false}, upgradeFunction); + setAttrs(setting, {}, upgradeFunction); }); // convert weapon attributes, and extract ship weapons getSectionIDs("repeating_weapons", idArray => { @@ -1099,22 +1952,30 @@ /** * Register Event handlers */ + + 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); - on("sheet:opened", handleVersioning); + /* API use ammo boilerplate */ + ["weapons", "ship-weapons"].forEach(sName => { + on(`change:repeating_${sName}:weapon_use_ammo`, () => handleAmmoAPI(sName)); + }); + on("change:setting_use_ammo", () => { + handleAmmoAPI("weapons"); + handleAmmoAPI("ship-weapons"); + }); /* Character sheet */ attributes.forEach(attr => on(`change:${attr} change:${attr}_bonus`, () => calculateMod(attr))); - on("change:repeating_weapons", () => { - validateWeaponSkills(); - generateWeaponDisplay(); - }); - on(["attack_bonus", ...weaponSkills].map(name => `change:${name}`).join(" "), generateWeaponDisplay); + on(weaponDisplayEvent, generateWeaponDisplay); + on("change:repeating_weapons:weapon_name", () => validateWeaponSkills()); on("change:homebrew_skill_list", () => getSectionIDs("repeating_weapons", validateWeaponSkills)); on("change:strain change:strain_perm", validateStrain); @@ -1126,31 +1987,15 @@ on("change:armor_ac change:innate_ac", calculateAC); - on("change:strength", calculateStowedReadiedMax); - on("change:repeating_gear remove:repeating_gear change:armor_encumbrance " + - "change:gear_readied change:gear_stowed", calculateGearReadiedStowed); + on("change:strength", calculateGearReadiedStowedMax); + on("change:repeating_gear remove:repeating_gear change:armor_encumbrance change:repeating_weapons" + + " remove:repeating_weapons change:gear_readied change:gear_stowed", calculateGearReadiedStowed); on("change:level change:setting_xp_scheme", calculateNextLevelXP); - on("change:setting_super_type", handleSuperChange); + on("change:setting_super_type", validateSuperTab); - /* Ship sheet */ - on("change:repeating_ship-weapons change:repeating_ship-defenses change:repeating_ship-fittings " + - "change:ship_power change:ship_mass change:ship_hardpoints", calculateShipStats); - on("change:repeating_ship-weapons", buildShipWeaponsMenu); - - /* NPC sheet */ - on("change:npc_stat_block", fillNPC); - on("change:repeating_npc-abilities", buildAbilitiesMenu); - on("change:repeating_npc-attacks", () => { - addNPCAttackBonus(); - buildAttacksMenu(); - }); - on("change:npc_roll_full_attack change:repeating_npc-attacks:attack_number", setNPCMultiAttacks); - on("change:npc change:npc_armor_type change:macro_npc_attacks change:macro_npc_abilities", buildStatblock); - on("change:npc_rolls_hidden", handleNPCRollHide); - - /* Chat macros */ + /* Character chat macros */ on("change:homebrew_luck_save", buildSaveMenu); on([ @@ -1169,4 +2014,23 @@ 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); + + + /* Ship sheet */ + on(shipStatEvent, calculateShipStats); + on("change:repeating_ship-weapons:weapon_name change:repeating_ship-weapons:weapon_attack_bonus " + + "remove:repeating_ship-weapons", buildShipWeaponsMenu); + + + /* NPC sheet */ + 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); + })(); diff --git a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.css b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.css index 4ff28762b0..4958bb2c60 100644 --- a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.css +++ b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.css @@ -1 +1 @@ -.charsheet{background:#fff}.charsheet{background-color:white;padding:0 !important;font-size:12px;min-width:800px;color:#000}div,span,label,textarea,button[type=roll],h1,h2,h3{box-sizing:border-box}label{margin:0;padding:0;color:inherit;font-size:1em;font-weight:normal;width:auto}p{font-size:1em;margin:0 0 5px;line-height:inherit}textarea{resize:vertical;padding:1px 4px;font-size:12px;margin:0;display:block}input[type=text],input[type=number]{padding:1px 4px;font-size:12px;color:#000}input[type=number][readonly="readonly"],input[type=number].sheet-no-spinners{-moz-appearance:textfield}input[type=number][readonly="readonly"]::-webkit-inner-spin-button,input[type=number][readonly="readonly"]::-webkit-outer-spin-button,input[type=number].sheet-no-spinners::-webkit-inner-spin-button,input[type=number].sheet-no-spinners::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}select{margin:0;font-size:12px;padding:1px 2px;line-height:18px;height:22px}button[type=roll].btn{margin:0}button[type=roll].sheet-unstyled-button{text-shadow:none;box-shadow:none;color:inherit;text-align:inherit;padding:0;border:none;border-radius:0;font-size:inherit;background:transparent}button[type=roll].sheet-unstyled-button::before{content:""}button[type=roll].sheet-invisible-button{position:absolute;z-index:1;opacity:0;left:0;width:100%;height:100%;top:0}button[type=roll].sheet-invisible-button:hover+div{color:#2B3FEA;border-color:#2B3FEA}.sheet-hider[value="0"]+div,.sheet-hider[value="0"]+label,.sheet-hider[value="0"]+button,.sheet-hider[value="0"]+span{display:none}.sheet-editmode[value="0"] ~ .sheet-content .sheet-empty-hider[value=""]+div{display:none}h1{font-family:"Contrail One",sans-serif;background-color:#9B9B9B;padding-left:5px;color:#fff;font-size:1.3em;line-height:22px;font-weight:normal}h1::after{content:"";position:absolute;right:0;background-color:#223297;background-position:center;background-size:100%;width:22px;height:22px}h2{font-family:"Contrail One",sans-serif;padding-left:5px;border:2px solid #000;background-color:#ccc;color:#000;font-size:1.1em;margin:5px 0;width:175px;line-height:18px}h3{font-size:1.2em;font-family:"Contrail One",sans-serif;color:#6B6B6B;line-height:1.5;font-weight:normal}.sheet-npc-input[value="0"] ~ .sheet-tabs .sheet-npc-tab,.sheet-npc-input[value="1"] ~ .sheet-tabs .sheet-pc-tab,.sheet-tab-input:not([value="character"]) ~ .sheet-character,.sheet-tab-input:not([value="ship"]) ~ .sheet-ship,.sheet-tab-input:not([value="npc"]) ~ .sheet-npc{display:none}.sheet-content{min-width:800px;display:grid;grid-gap:5px}.sheet-editmode[value="0"] ~ .sheet-content .sheet-edit,.sheet-editmode[value="0"] ~ .sheet-content .repcontrol,.sheet-editmode[value="1"] ~ .sheet-content .sheet-display{display:none}.sheet-header{margin-bottom:10px}.sheet-header input{opacity:0;position:absolute}.sheet-header .sheet-logo{width:60%}.sheet-header .sheet-npc-chooser{cursor:pointer;margin-left:auto;color:#fff}.sheet-header .sheet-npc-chooser span{padding:3px 6px}.sheet-header .sheet-npc-chooser input:not(:checked) ~ .sheet-pc-label,.sheet-header .sheet-npc-chooser input:checked ~ .sheet-npc-label{background:#11194B}.sheet-header .sheet-npc-chooser input:checked ~ .sheet-pc-label,.sheet-header .sheet-npc-chooser input:not(:checked) ~ .sheet-npc-label{background:#223297}.sheet-header .sheet-edit-button{margin:0 5px 0 20px}.sheet-header .sheet-settings-gear,.sheet-header .sheet-edit-button{cursor:pointer;font-size:16px;font-family:pictos}.sheet-header .sheet-settings-gear input:not(:checked)+span,.sheet-header .sheet-edit-button input:not(:checked)+span{color:#888}.sheet-header .sheet-settings-gear input:checked+span,.sheet-header .sheet-edit-button input:checked+span{color:#223297}.sheet-footer{font-size:10px;border-top:1px solid #ccc;margin-top:10px;color:#666}.sheet-footer button[type="roll"].btn:hover{color:#223297}.sheet-tabs{margin-bottom:10px;width:100%;position:relative;z-index:2;border-top:1px solid #333;font-family:"Contrail One",sans-serif;flex-flow:row-reverse;justify-content:flex-end}.sheet-tabs input{opacity:0;position:absolute}.sheet-tabs input:checked+span{background:#11194B}.sheet-tabs input:not(:checked)+span{background:#223297}.sheet-tabs span{padding:1px 25px 0}.sheet-tabs label{cursor:pointer;line-height:17px;display:flex;margin:-1px -10px 0 0;color:#fff;clip-path:polygon(0 0, 100% 0, 100% 10px, calc(100% - 10px) 100%, 0 100%)}.sheet-flex{display:flex}.sheet-flex-center{display:flex;align-items:center}.sheet-flex-between{display:flex;align-items:center;justify-content:space-between}.sheet-flex-wrap{display:flex;flex-wrap:wrap;align-content:flex-start}.sheet-grow{flex-grow:1}.sheet-halfgrid{display:grid;grid:auto/ 1fr 1fr;grid-column-gap:1%}.sheet-thirdsgrid{display:grid;grid:auto/repeat(3, 1fr);grid-column-gap:2%}.sheet-column>div:not(:first-child){margin-top:5px}.sheet-col-1-3{grid-column:1/3}.sheet-col-1-4{grid-column:1/4}.sheet-col-1-5{grid-column:1/5}.sheet-col-2-4{grid-column:2/4}.sheet-col-3{grid-column:3}.sheet-col-3-5{grid-column:3/5}.sheet-col-4{grid-column:4}.sheet-col-4-7{grid-column:4/7}.sheet-col-5-7{grid-column:5/7}.sheet-row-3-5{grid-row:3/5}.sheet-col55{width:55%}.sheet-col50{width:50%}.sheet-col40{width:40%}.sheet-colthird{width:calc(100%/3)}.sheet-col25{width:25%}.sheet-colsixth{width:calc(100%/6)}.sheet-grey-box,.sheet-grey-box-bordered{padding:4px;background:#F0F0F0}.sheet-grey-box-bordered{border:1px solid #aaa}.sheet-core-box{padding:8px;background:#F0F0F0}.sheet-core-box-text{padding:8px 3px 3px 8px;background:#F0F0F0}input[type=text].sheet-inherit{border-radius:0;border:none;background:transparent;box-shadow:none;padding:0;color:inherit;font:inherit}input[type=number].sheet-inline-input{position:relative;z-index:2;vertical-align:baseline;padding:0 3px}.sheet-text-input{color:#666;padding-right:5px;line-height:1}.sheet-text-input div{font-size:.9em;line-height:14px;border-top:1px solid #AAA}.sheet-text-input input[type=text],.sheet-text-input input[type=number],.sheet-text-input textarea{background:transparent;padding:1px 0;width:100%;border-radius:0;color:#223297;border:none;text-align:inherit;font-weight:inherit;box-shadow:none}.sheet-text-input input[type=text][readonly="readonly"],.sheet-text-input input[type=number][readonly="readonly"],.sheet-text-input textarea[readonly="readonly"]{cursor:default}.sheet-text-input input[type=text],.sheet-text-input input[type=number]{font-size:1.1em}.sheet-text-input textarea{height:20px;min-height:20px}.sheet-text-input input[type=checkbox]{height:14px;margin:3px 0}.sheet-text-input select{width:100%;height:20px;color:#223297;background:transparent;border:none}.sheet-text-input.sheet-important{font-weight:bold;font-size:1.1em}.sheet-text-input.sheet-center{text-align:center}.sheet-text-input.sheet-duo{display:grid;text-align:center;grid:auto / 1fr 5px 1fr;align-items:center;align-content:start;grid-column-gap:4px}.sheet-text-input.sheet-duo>span{font-size:16px;color:#333}.sheet-text-input.sheet-duo div{grid-column:1/4}.sheet-blue-button{text-align:center}.sheet-blue-button button[type=roll].btn{background:#2B3FEA;width:35px;height:35px;display:block;margin:0 auto;color:white}.sheet-blue-button button[type=roll].btn::before{content:""}.sheet-lower{text-transform:lowercase}.sheet-space-before::before,.sheet-space-after::after{content:" "}.sheet-colon-after::after{content:":"}.sheet-hide-empty[value=""]+span{display:none}.sheet-add-plus:not([value^="-"])+span::before{content:"+"}.sheet-simple-repsection .repitem{margin-bottom:3px}.sheet-simple-repsection textarea{margin:3px 0 0;height:50px}.sheet-simple-repsection .sheet-display .sheet-name{font-weight:bold;font-size:1.1em;border-bottom:1px solid #777}.sheet-simple-repsection .sheet-display .sheet-details{line-height:1.4;text-align:justify}.sheet-skills-type[value="neither"] ~ div .sheet-skills-either,.sheet-skills-type:not([value="first"]) ~ div .sheet-skills-first,.sheet-skills-type:not([value="revised"]) ~ div .sheet-skills-revised,.sheet-skills-type:not([value="neither"]) ~ div .sheet-skills-neither,.sheet-skills-query:not([value="hover"]) ~ div .sheet-skills-query-hover,.sheet-skills-query[value="query"] ~ div .sheet-skills-query-display{display:none}.sheet-skills-query-display input:not([value*="str"]) ~ .sheet-str,.sheet-skills-query-display input:not([value*="dex"]) ~ .sheet-dex,.sheet-skills-query-display input:not([value*="con"]) ~ .sheet-con,.sheet-skills-query-display input:not([value*="int"]) ~ .sheet-int,.sheet-skills-query-display input:not([value*="wis"]) ~ .sheet-wis,.sheet-skills-query-display input:not([value*="cha"]) ~ .sheet-cha{display:none}.sheet-skills-query[value="hover"] ~ div .sheet-skill:hover .sheet-skills-query-display,.sheet-skill .sheet-display .sheet-query:focus+.sheet-skills-query-display{display:none}.repcontrol{display:flex;margin-top:4px}.repcontrol button{padding:3px 10px}.repcontrol_edit{order:1;margin-left:auto}.repcontrol button{background:#223297;color:#FFF;box-shadow:none;text-shadow:none}.repcontrol_move,.repcontrol_del{padding:1px 10px}.itemcontrol{z-index:100}.sheet-section-toggle-header{position:relative}.sheet-section-toggle-header input{cursor:pointer;position:absolute;width:22px;height:100%;z-index:2;right:0;opacity:0}.sheet-section-toggle-header input+h1::after{background-image:url("https://svgshare.com/i/6Vz.svg")}.sheet-section-toggle-header input:not(:checked)+h1::after{transform:rotate(180deg)}.sheet-section-toggle-header+input+div{margin-top:5px}.sheet-settings label{font-weight:bold}.sheet-settings label span{margin-right:4px}.sheet-settings select{width:120px;display:inline-block}.sheet-settings select.sheet-wide{width:170px}.sheet-core{display:grid;grid-column-gap:5px}.sheet-core.sheet-core-info{grid:auto / 2.5fr 1fr .8fr}.sheet-core.sheet-core-info .sheet-info{flex-wrap:wrap;padding-right:3px}.sheet-core.sheet-core-info .sheet-info .sheet-important{width:calc(60% - 22px)}.sheet-core.sheet-core-info .sheet-info .sheet-level{width:44px}.sheet-core.sheet-core-info .sheet-info .sheet-level-rest{width:calc(40% - 22px)}.sheet-core.sheet-core-stats{grid:auto / 1fr 260px 220px}.sheet-core .sheet-main-content{margin-top:3px;display:grid;grid:auto/repeat(3, 1fr);grid-row-gap:3px}.sheet-core .sheet-main-content .sheet-left-margin{margin-left:15px}.sheet-core button[type=roll].sheet-doombutton{width:100%}.sheet-core button[type=roll].sheet-doombutton:hover{color:red}.sheet-saves .sheet-flex{margin-top:4px}.sheet-menus-content{display:grid;grid:auto / 1fr 1fr}.sheet-character .sheet-menus button[type=roll].btn{margin-right:auto}.sheet-menus button[type=roll].btn{color:#2B3FEA;font-size:1.1em}.sheet-menus button[type=roll].btn:hover{color:red}.sheet-attributes{font-size:1.1em;line-height:16px}.sheet-attributes table{width:100%;height:100%}.sheet-attributes td:first-child,.sheet-attributes .sheet-mod{font-weight:bold}.sheet-attributes td:not(:first-child){text-align:center}.sheet-attributes input[type=number]{width:45px}.sheet-attributes .sheet-mod{font-size:1.1em}.sheet-editmode[value="0"] ~ .sheet-content .sheet-resources .repcontainer{grid:auto / 1fr 1fr}.sheet-resources .sheet-credits{margin-left:auto}.sheet-resources .repcontainer{display:grid;grid-row-gap:3px;margin-top:3px}.sheet-resources input[type=text]{width:calc(100% - 8em);margin-right:auto}.sheet-resources .sheet-slash{margin:0 2px}.sheet-weapons .sheet-edit{justify-content:space-between}.sheet-weapons .sheet-edit .sheet-name{width:135px;flex-grow:1}.sheet-weapons .sheet-edit .sheet-ab{width:45px}.sheet-weapons .sheet-edit .sheet-weapon-skill{width:80px}.sheet-weapons .sheet-edit .sheet-attribute{width:60px}.sheet-weapons .sheet-edit .sheet-burst{width:65px}.sheet-weapons .sheet-edit .sheet-damage{width:65px}.sheet-weapons .sheet-edit .sheet-shock-damage{width:80px}.sheet-weapons .sheet-edit .sheet-shock-ac{width:55px}.sheet-weapons .sheet-edit .sheet-skill-to-damage{width:40px}.sheet-weapons .sheet-edit .sheet-range{width:65px}.sheet-weapons .sheet-edit .sheet-ammo{width:50px}.sheet-weapons .sheet-text-input{padding-right:3px}.sheet-weapons .repitem{margin-bottom:3px}.sheet-weapons .sheet-display{font-size:1.1em;border:1px solid #888;text-indent:-10px;padding:2px 4px 2px 14px}.sheet-weapons .sheet-display .sheet-name{font-weight:bold}.sheet-weapons .repitem:nth-child(odd) .sheet-display{background:#D3D3D3}.sheet-skill-container,.sheet-skills-repeating .repcontainer{display:grid;grid:auto / 1fr 1fr;grid-gap:4px 1%}.sheet-skill{position:relative}.sheet-skill .sheet-display,.sheet-skill .sheet-edit{border:1px solid #888;padding:2px 4px;height:100%}.sheet-skill .sheet-display{font-weight:bold;font-size:1.1em}.sheet-skill .sheet-display .sheet-dice[value="3d6d1"]+.sheet-name::after{content:"3d6"}.sheet-skill .sheet-display .sheet-dice[value="4d6d2"]+.sheet-name::after{content:"4d6"}.sheet-skill .sheet-display .sheet-name{margin-right:auto}.sheet-skill .sheet-display .sheet-name::after{vertical-align:super;margin-left:2px;font-weight:normal;font-size:.7em}.sheet-skill .sheet-display .sheet-query{width:55px;background:transparent;border-color:transparent;position:relative;height:18px;z-index:2;margin:0 2px;outline:none;color:inherit;flex-shrink:0;line-height:16px;padding:0}.sheet-skill:not(:hover) .sheet-display .sheet-query:not(:focus){display:none}.sheet-skill .sheet-skills-query-display{margin:0 3px;flex-shrink:0;font-weight:normal}.sheet-skill .sheet-edit input[type="text"].sheet-name{width:100%;margin-bottom:2px}.sheet-skill .sheet-edit div.sheet-name{flex-grow:1;width:0;padding:1px 2px}.sheet-skill .sheet-edit .sheet-level{margin:0 2px;padding:1px 2px;width:40px}.sheet-skill .sheet-edit .sheet-query{width:50px}.sheet-skill .sheet-edit .sheet-dice{width:35px}.sheet-skill .sheet-edit.sheet-flex-wrap select,.sheet-skill .sheet-edit.sheet-flex-wrap input{flex-grow:1}.sheet-skill.sheet-skill-points .sheet-display{font-size:1.1em;font-weight:bold;width:100%}.sheet-skill.sheet-skill-points .sheet-name{background:#000;color:#fff;flex-grow:0;margin-right:auto;width:auto;padding:0 4px}.sheet-skill.sheet-skill-points .sheet-edit .sheet-level{margin:0}.sheet-skill-container .sheet-skill:nth-of-type(4n+1),.sheet-skill-container .sheet-skill:nth-of-type(4n+2){background:#D3D3D3}.repcontainer[data-groupname="repeating_skills"] .repitem:nth-of-type(4n+1) .sheet-skill,.repcontainer[data-groupname="repeating_skills"] .repitem:nth-of-type(4n+2) .sheet-skill{background:#D3D3D3}.sheet-skills-type:not([value="neither"]) ~ div .sheet-skills-repeating,.sheet-psionics .sheet-skills-repeating,.sheet-magic .sheet-skills-repeating{margin-top:4px}.sheet-skill-blurb{font-style:italic;text-align:center}.sheet-details-button{margin-left:auto;font-weight:bold;color:#999;letter-spacing:1px;cursor:pointer;text-transform:uppercase;font-size:.8em}.sheet-details-button input{visibility:hidden;position:absolute}.sheet-details-button input:checked+span{color:#333}.sheet-input-details:not([value="1"]) ~ div .sheet-details{display:none}.sheet-super-type:not([value="psionics"]) ~ div .sheet-super-psionics-only,.sheet-super-type:not([value="magic"]) ~ div .sheet-super-magic-only,.sheet-super-type:not([value="both"]) ~ div .sheet-super-both,.sheet-super-type[value="magic"] ~ div .sheet-super-psionics,.sheet-super-type[value="psionics"] ~ div .sheet-super-magic,.sheet-super-type[value="neither"] ~ div .sheet-super{display:none}.sheet-tab-input:not([value="psionics"]) ~ .sheet-psionics,.sheet-tab-input:not([value="magic"]) ~ .sheet-magic{display:none}.sheet-psionics-effort{display:grid;grid:auto/ auto 60px 60px 80px;align-items:center;grid-column-gap:4px;margin-top:5px}.sheet-psionics-effort h3{line-height:1}.sheet-techniques{margin-top:5px;padding:0 4px}.sheet-techniques>.sheet-flex-center{margin-bottom:5px}.sheet-techniques input[type=text]{width:100%}.sheet-spells{margin-top:5px;padding:0 4px}.sheet-spells>.sheet-flex-center{margin-bottom:5px}.sheet-spells>.sheet-flex{border-bottom:1px solid #666;margin-bottom:3px}.sheet-spells>.sheet-flex :not(:first-child){text-align:center}.sheet-spells .sheet-edit .sheet-name{width:220px;flex-grow:1}.sheet-spells .sheet-edit .sheet-prepared{margin:0 3px}.sheet-spells .sheet-edit .sheet-prepared,.sheet-spells .sheet-edit .sheet-damage{width:60px}.sheet-spells .sheet-display .sheet-name{padding-bottom:1px}.sheet-spells .sheet-display span.sheet-prepared{margin:0 4px 0 auto}.sheet-spells .sheet-display input[type=number].sheet-prepared{padding:0 4px;position:relative;z-index:2}.sheet-foci-loc[value="left"] ~ .sheet-column .sheet-foci-right,.sheet-foci-loc[value="right"] ~ .sheet-column .sheet-foci-left{display:none}.sheet-foci>.sheet-name{border-bottom:1px solid #777}.sheet-foci>.sheet-name div{font-weight:bold;font-size:1.1em}.sheet-foci>.sheet-name,.sheet-foci>.sheet-edit textarea,.sheet-foci>.sheet-display{margin-bottom:3px}.sheet-foci .sheet-edit .sheet-name{flex-grow:1}.sheet-foci .sheet-edit .sheet-level{margin-left:3px;width:60px}.sheet-foci .sheet-display .sheet-level{margin-left:auto}.sheet-armor .sheet-name{width:150px;margin-left:auto}.sheet-armor .sheet-ac{width:45px}.sheet-armor .sheet-enc{width:60px}.sheet-armor .sheet-type{width:80px}.sheet-readied-stowed{display:grid;align-items:center;grid:auto / 1fr 60px 60px 80px 80px;grid-column-gap:7px}.sheet-readied-stowed .sheet-input-gear-over[value="1"]+.sheet-text-input input:first-child{color:red}.sheet-cyberware h3{margin:5px 0}.sheet-cyberware .sheet-edit{flex-wrap:wrap}.sheet-cyberware .sheet-edit input[type=text]{width:0;flex-grow:1}.sheet-cyberware .sheet-edit>span{margin:0 3px}.sheet-equipment .repitem{margin-bottom:2px}.sheet-equipment .repitem input[type=text],.sheet-equipment .repitem input[type=number],.sheet-equipment .repitem select{background:transparent}.sheet-equipment .repitem input[type=text]{flex-grow:1;width:0}.sheet-equipment .repitem input[type=number]{width:45px;margin:0 3px}.sheet-equipment .repitem select{width:80px}.sheet-equipment .sheet-other h3{margin-bottom:5px}.sheet-equipment textarea{height:100px}.sheet-misc h3{margin-bottom:4px}.sheet-misc .repitem{display:flex;align-items:center;margin-bottom:2px}.sheet-goals input[type=text]{flex-grow:1;margin-right:5px}.sheet-goals input[type=number]{width:70px}.sheet-languages input{width:100%}.sheet-notes{margin:10px 0}.sheet-ship{margin-top:-20px;grid:auto/repeat(4, 1fr)}.sheet-ship .sheet-menus h3{line-height:1}.sheet-ship .sheet-menus button[type=roll].btn{line-height:1}.sheet-ship .sheet-info{flex-wrap:wrap}.sheet-ship .sheet-info .sheet-text-input{margin-bottom:3px}.sheet-ship .sheet-data{display:grid;grid:auto/repeat(3, 1fr)}.sheet-ship .sheet-data .sheet-text-input,.sheet-ship .sheet-data .sheet-text-input input[type=number]{text-align:center}.sheet-ship .sheet-stats{display:grid;grid:auto / 1fr 1fr}.sheet-ship .sheet-input-color-negative[value^="-"]+.sheet-text-input input:first-child{color:red}.sheet-ship .repcontainer{display:grid;grid-row-gap:3px}.sheet-ship .repitem,.sheet-ship .repitem .sheet-edit,.sheet-ship .repitem .sheet-display{width:100%}.sheet-ship .sheet-grey-box-bordered{padding-right:0}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-name{width:calc(100% - 200px)}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-damage{width:65px}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-duo{width:80px}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-qualities{width:calc(100% - 195px)}.sheet-ship .sheet-ship-weapons .sheet-display{text-indent:-10px;padding-left:14px}.sheet-ship .sheet-ship-defenses .sheet-edit .sheet-name,.sheet-ship .sheet-ship-defenses .sheet-edit .sheet-effect,.sheet-ship .sheet-ship-fitting .sheet-edit .sheet-name,.sheet-ship .sheet-ship-fitting .sheet-edit .sheet-effect{flex:1 1 auto;width:0}.sheet-ship .sheet-ship-defenses .sheet-display,.sheet-ship .sheet-ship-fitting .sheet-display{text-indent:-10px;padding:2px 4px 2px 14px}.sheet-ship .sheet-edit .sheet-broken{width:50px}.sheet-ship .sheet-edit .sheet-number{width:50px}.sheet-ship .sheet-display .sheet-name{font-weight:bold}.sheet-ship .sheet-display .sheet-broken{color:red;text-transform:uppercase}.sheet-ship .sheet-display .sheet-description{font-style:italic}.sheet-editmode[value="0"] ~ .sheet-ship .sheet-ship-defenses,.sheet-editmode[value="0"] ~ .sheet-ship .sheet-ship-fitting{background:#F0F0F0;padding:3px 0}.sheet-npc{margin-top:-20px;grid:auto / 3fr .8fr 2.2fr}.sheet-npc .sheet-input-individual-hide:not([value="1"]) ~ .sheet-rolls .sheet-individual-hide{display:none}.sheet-npc .sheet-menus h3{line-height:1}.sheet-npc .sheet-menus button[type=roll].btn{line-height:1}.sheet-npc .sheet-info{display:grid;grid:auto/repeat(5, 1fr) 1.3fr}.sheet-npc .sheet-npc-hp{display:grid;grid:auto / 40px 1fr}.sheet-npc .sheet-individual-hide input[type="checkbox"]{margin-right:2px}.sheet-npc .sheet-npc-rep-header{margin:4px}.sheet-npc .sheet-rolls>:first-child{margin-bottom:5px}.sheet-npc .sheet-npc-checkbox{font-size:.9em}.sheet-npc .sheet-npc-checkbox span{vertical-align:middle;margin-right:4px}.sheet-npc .repcontainer{display:grid;grid-gap:3px}.sheet-npc .sheet-full-attacks{margin:0 6px 0 auto}.sheet-npc .sheet-grey-box-bordered{padding-right:1px}.sheet-npc .sheet-text-input{padding-right:3px}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-name{width:0;flex-grow:1}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-attacks,.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-ab{width:50px}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-burst,.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-damage{width:65px}.sheet-npc .sheet-npc-attacks .sheet-display{font-size:1.1em;font-weight:bold;padding:4px 8px}.sheet-npc .sheet-npc-attacks .sheet-display .sheet-attacks[value="1"]+span{display:none}.sheet-npc .sheet-npc-attacks .sheet-display .sheet-attacks{text-transform:lowercase}.sheet-npc .sheet-npc-abilities .sheet-npc-checkbox{margin-left:auto}.sheet-npc .sheet-npc-abilities .sheet-edit .sheet-name{width:100px}.sheet-npc .sheet-npc-abilities .sheet-edit .sheet-description{width:0;flex-grow:1}.sheet-npc .sheet-npc-abilities .sheet-display{text-indent:-10px;padding:4px 8px 4px 18px}.sheet-npc .sheet-npc-abilities .sheet-display .sheet-name{font-weight:bold}.sheet-npc .sheet-npc-abilities .sheet-display .sheet-description{font-style:italic}.sheet-rolltemplate-swn-default,.sheet-rolltemplate-swn-attack,.sheet-rolltemplate-swn-skill,.sheet-rolltemplate-swn-save{margin-left:-41px;width:292px;color:#FFF;font-family:"Arial",sans-serif}.sheet-rolltemplate-swn-default div,.sheet-rolltemplate-swn-attack div,.sheet-rolltemplate-swn-skill div,.sheet-rolltemplate-swn-save div{box-sizing:border-box}.sheet-rolltemplate-swn-default .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-attack .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-skill .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-save .sheet-container .inlinerollresult{padding:0;font-family:inherit;background:transparent;border-color:transparent;border:none}.sheet-rolltemplate-swn-default .sheet-container,.sheet-rolltemplate-swn-attack .sheet-container,.sheet-rolltemplate-swn-skill .sheet-container,.sheet-rolltemplate-swn-save .sheet-container{min-height:175px;position:relative;padding:18px 20px}.sheet-rolltemplate-swn-default .sheet-background,.sheet-rolltemplate-swn-attack .sheet-background,.sheet-rolltemplate-swn-skill .sheet-background,.sheet-rolltemplate-swn-save .sheet-background{width:100%;height:calc(100% - 175px);position:absolute;top:153px;left:0;background:#0F0F0F}.sheet-rolltemplate-swn-default .sheet-header,.sheet-rolltemplate-swn-attack .sheet-header,.sheet-rolltemplate-swn-skill .sheet-header,.sheet-rolltemplate-swn-save .sheet-header{width:198px}.sheet-rolltemplate-swn-default .sheet-header .sheet-name,.sheet-rolltemplate-swn-attack .sheet-header .sheet-name,.sheet-rolltemplate-swn-skill .sheet-header .sheet-name,.sheet-rolltemplate-swn-save .sheet-header .sheet-name{margin-bottom:12px;font-size:13px;line-height:1;height:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:"Times New Roman",serif;font-weight:bold}.sheet-rolltemplate-swn-default .sheet-header .sheet-title,.sheet-rolltemplate-swn-attack .sheet-header .sheet-title,.sheet-rolltemplate-swn-skill .sheet-header .sheet-title,.sheet-rolltemplate-swn-save .sheet-header .sheet-title{font-size:14px;height:32px;line-height:16px;overflow:hidden;font-weight:bold;margin-bottom:24px}.sheet-rolltemplate-swn-default .sheet-content,.sheet-rolltemplate-swn-attack .sheet-content,.sheet-rolltemplate-swn-skill .sheet-content,.sheet-rolltemplate-swn-save .sheet-content{position:relative}.sheet-rolltemplate-swn-default .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-attack .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-skill .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-save .sheet-rolls .inlinerollresult{font-size:36px;font-weight:bold;line-height:29px;white-space:nowrap}.sheet-rolltemplate-swn-default .sheet-rolls,.sheet-rolltemplate-swn-attack .sheet-rolls,.sheet-rolltemplate-swn-skill .sheet-rolls,.sheet-rolltemplate-swn-save .sheet-rolls{height:35px;display:flex;align-items:start}.sheet-rolltemplate-swn-default .sheet-rollname,.sheet-rolltemplate-swn-attack .sheet-rollname,.sheet-rolltemplate-swn-skill .sheet-rollname,.sheet-rolltemplate-swn-save .sheet-rollname{font-size:12px;line-height:1}.sheet-rolltemplate-swn-default a,.sheet-rolltemplate-swn-attack a,.sheet-rolltemplate-swn-skill a,.sheet-rolltemplate-swn-save a{color:inherit}.sheet-rolltemplate-swn-default a:hover,.sheet-rolltemplate-swn-attack a:hover,.sheet-rolltemplate-swn-skill a:hover,.sheet-rolltemplate-swn-save a:hover{color:red}.sheet-rolltemplate-swn-default a[href^="~"],.sheet-rolltemplate-swn-attack a[href^="~"],.sheet-rolltemplate-swn-skill a[href^="~"],.sheet-rolltemplate-swn-save a[href^="~"]{padding:0;background:transparent;border:none;line-height:1.4}.sheet-rolltemplate-swn-default .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-black.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-default .sheet-name{color:#bababa}.sheet-rolltemplate-swn-default .sheet-rollname{margin-right:auto}.sheet-rolltemplate-swn-default .sheet-desc,.sheet-rolltemplate-swn-default .sheet-buttons{font-size:12px;line-height:1.4}.sheet-rolltemplate-swn-default .sheet-info{font-style:italic;font-size:10px;line-height:1;margin:-10px 0 5px}.sheet-rolltemplate-swn-attack .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-purple.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-attack .sheet-name{color:#b291ec}.sheet-rolltemplate-swn-attack .sheet-title .inlinerollresult{font-size:1em;pointer-events:none}.sheet-rolltemplate-swn-attack .sheet-damage{margin-left:auto}.sheet-rolltemplate-swn-attack .sheet-roll{margin-left:10px}.sheet-rolltemplate-swn-attack .sheet-rolls:not(:first-of-type){margin-top:5px}.sheet-rolltemplate-swn-attack .sheet-shock{font-style:italic;margin-top:4px;font-size:12px}.sheet-rolltemplate-swn-attack .sheet-info{font-style:italic;font-size:10px}.sheet-rolltemplate-swn-attack .sheet-info>span:first-child{margin-right:10px}.sheet-rolltemplate-swn-attack .sheet-desc{font-size:12px;line-height:1.4}.sheet-rolltemplate-swn-skill .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-blue.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-skill .sheet-name{color:#80b0ff}.sheet-rolltemplate-swn-skill .sheet-title .sheet-italic{font-style:italic}.sheet-rolltemplate-swn-skill .sheet-title .inlinerollresult{font-size:1em;pointer-events:none}.sheet-rolltemplate-swn-skill .sheet-rollname{margin-right:auto}.sheet-rolltemplate-swn-save .sheet-container.sheet-success{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-green.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-save .sheet-container.sheet-success .sheet-name{color:#83db53}.sheet-rolltemplate-swn-save .sheet-container.sheet-failure{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-red.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-save .sheet-container.sheet-failure .sheet-name{color:#ff8080}.sheet-rolltemplate-swn-save .sheet-vs{margin:0 10px}.sheet-rolltemplate-swn-save .sheet-rollname{margin-right:auto} +.charsheet{background:#fff}.charsheet{background-color:white;padding:0 !important;font-size:12px;min-width:800px;color:#000}div,span,label,textarea,button[type=roll],h1,h2,h3{box-sizing:border-box}label{margin:0;padding:0;color:inherit;font-size:1em;font-weight:normal;width:auto}p{font-size:1em;margin:0 0 5px;line-height:inherit}textarea{resize:vertical;padding:1px 4px;font-size:12px;margin:0;display:block}input[type=text],input[type=number]{padding:1px 4px;font-size:12px;color:#000}input[type=number][readonly="readonly"],input[type=number].sheet-no-spinners{-moz-appearance:textfield}input[type=number][readonly="readonly"]::-webkit-inner-spin-button,input[type=number][readonly="readonly"]::-webkit-outer-spin-button,input[type=number].sheet-no-spinners::-webkit-inner-spin-button,input[type=number].sheet-no-spinners::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}select{margin:0;font-size:12px;padding:1px 2px;line-height:18px;height:22px}button[type=roll].btn{margin:0}button[type=roll].sheet-unstyled-button{text-shadow:none;box-shadow:none;color:inherit;text-align:inherit;padding:0;border:none;border-radius:0;font-size:inherit;background:transparent}button[type=roll].sheet-unstyled-button::before{content:""}button[type=roll].sheet-invisible-button{position:absolute;z-index:1;opacity:0;left:0;width:100%;height:100%;top:0}button[type=roll].sheet-invisible-button:hover+div{color:#2B3FEA;border-color:#2B3FEA}.sheet-hider[value="0"]+div,.sheet-hider[value="0"]+label,.sheet-hider[value="0"]+button,.sheet-hider[value="0"]+span{display:none}.sheet-editmode[value="0"] ~ .sheet-content .sheet-empty-hider[value=""]+div{display:none}h1{font-family:"Contrail One",sans-serif;background-color:#9B9B9B;padding-left:5px;color:#fff;font-size:1.3em;line-height:22px;font-weight:normal}h1::after{content:"";position:absolute;right:0;background-color:#223297;background-position:center;background-size:100%;width:22px;height:22px}h2{font-family:"Contrail One",sans-serif;padding-left:5px;border:2px solid #000;background-color:#ccc;color:#000;font-size:1.1em;margin:5px 0;width:175px;line-height:18px}h3{font-size:1.2em;font-family:"Contrail One",sans-serif;color:#6B6B6B;line-height:1.5;font-weight:normal}.sheet-npc-input[value="0"] ~ .sheet-tabs .sheet-npc-tab,.sheet-npc-input[value="1"] ~ .sheet-tabs .sheet-pc-tab,.sheet-tab-input:not([value="character"]) ~ .sheet-character,.sheet-tab-input:not([value="ship"]) ~ .sheet-ship,.sheet-tab-input:not([value="npc"]) ~ .sheet-npc{display:none}.sheet-content{min-width:800px;display:grid;grid-gap:5px}.sheet-editmode[value="0"] ~ .sheet-content .sheet-edit,.sheet-editmode[value="0"] ~ .sheet-content .repcontrol,.sheet-editmode[value="1"] ~ .sheet-content .sheet-display{display:none}.sheet-header{margin-bottom:10px}.sheet-header input{opacity:0;position:absolute}.sheet-header .sheet-logo{width:480px}.sheet-header .sheet-npc-chooser{cursor:pointer;margin-left:auto;color:#fff}.sheet-header .sheet-npc-chooser span{padding:3px 6px}.sheet-header .sheet-npc-chooser input:not(:checked) ~ .sheet-pc-label,.sheet-header .sheet-npc-chooser input:checked ~ .sheet-npc-label{background:#11194B}.sheet-header .sheet-npc-chooser input:checked ~ .sheet-pc-label,.sheet-header .sheet-npc-chooser input:not(:checked) ~ .sheet-npc-label{background:#223297}.sheet-header .sheet-edit-button{margin:0 5px 0 20px}.sheet-header .sheet-settings-gear,.sheet-header .sheet-edit-button{cursor:pointer;font-size:16px;font-family:pictos}.sheet-header .sheet-settings-gear input:not(:checked)+span,.sheet-header .sheet-edit-button input:not(:checked)+span{color:#888}.sheet-header .sheet-settings-gear input:checked+span,.sheet-header .sheet-edit-button input:checked+span{color:#223297}.sheet-footer{font-size:10px;border-top:1px solid #ccc;margin-top:10px;color:#666}.sheet-footer button[type="roll"].btn:hover{color:#223297}.sheet-tabs{margin-bottom:10px;width:100%;position:relative;z-index:2;border-top:1px solid #333;font-family:"Contrail One",sans-serif;flex-flow:row-reverse;justify-content:flex-end}.sheet-tabs input{opacity:0;position:absolute}.sheet-tabs input:checked+span{background:#11194B}.sheet-tabs input:not(:checked)+span{background:#223297}.sheet-tabs span{padding:1px 25px 0}.sheet-tabs label{cursor:pointer;line-height:17px;display:flex;margin:-1px -10px 0 0;color:#fff;clip-path:polygon(0 0, 100% 0, 100% 10px, calc(100% - 10px) 100%, 0 100%)}.sheet-flex{display:flex}.sheet-flex-center{display:flex;align-items:center}.sheet-flex-between{display:flex;align-items:center;justify-content:space-between}.sheet-flex-wrap{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.sheet-grow{flex-grow:1}.sheet-halfgrid{display:grid;grid:auto/ 1fr 1fr;grid-column-gap:1%}.sheet-thirdsgrid{display:grid;grid:auto/repeat(3, 1fr);grid-column-gap:2%}.sheet-column>div:not(:first-child){margin-top:5px}.sheet-col-1-3{grid-column:1/3}.sheet-col-1-4{grid-column:1/4}.sheet-col-1-5{grid-column:1/5}.sheet-col-2-4{grid-column:2/4}.sheet-col-3{grid-column:3}.sheet-col-3-5{grid-column:3/5}.sheet-col-4{grid-column:4}.sheet-col-4-7{grid-column:4/7}.sheet-col-5-7{grid-column:5/7}.sheet-row-3-5{grid-row:3/5}.sheet-col55{width:55%}.sheet-col50{width:50%}.sheet-col40{width:40%}.sheet-colthird{width:calc(100%/3)}.sheet-col25{width:25%}.sheet-colsixth{width:calc(100%/6)}.sheet-grey-box,.sheet-grey-box-bordered{padding:4px;background:#F0F0F0}.sheet-grey-box-bordered{border:1px solid #aaa}.sheet-core-box{padding:8px;background:#F0F0F0}.sheet-core-box-text{padding:8px 3px 3px 8px;background:#F0F0F0}input[type=text].sheet-inherit{border-radius:0;border:none;background:transparent;box-shadow:none;padding:0;color:inherit;font:inherit}input[type=number].sheet-inline-input{position:relative;z-index:2;vertical-align:baseline;padding:0 3px}.sheet-text-input{color:#666;padding-right:5px;line-height:1}.sheet-text-input div{font-size:.9em;line-height:14px;border-top:1px solid #AAA}.sheet-text-input div input[type="checkbox"]{height:14px;margin:0 3px 0 0}.sheet-text-input input[type=text],.sheet-text-input input[type=number],.sheet-text-input textarea{background:transparent;padding:1px 0;width:100%;border-radius:0;color:#223297;border:none;text-align:inherit;font-weight:inherit;box-shadow:none}.sheet-text-input input[type=text][readonly="readonly"],.sheet-text-input input[type=number][readonly="readonly"],.sheet-text-input textarea[readonly="readonly"]{cursor:default}.sheet-text-input input[type=text],.sheet-text-input input[type=number]{font-size:1.1em}.sheet-text-input textarea{height:20px;min-height:20px}.sheet-text-input>input[type=checkbox]{height:14px;margin:3px 0}.sheet-text-input select{width:100%;height:20px;color:#223297;background:transparent;border:none}.sheet-text-input.sheet-important{font-weight:bold;font-size:1.1em}.sheet-text-input.sheet-center{text-align:center}.sheet-text-input.sheet-duo{display:grid;text-align:center;grid:auto / 1fr 5px 1fr;align-items:center;align-content:start;grid-column-gap:4px}.sheet-text-input.sheet-duo>span{font-size:16px;color:#333}.sheet-text-input.sheet-duo div{grid-column:1/4}.sheet-text-input button[type=roll].btn{width:100%}.sheet-text-input button[type=roll].btn:hover{color:red}.sheet-blue-button{text-align:center}.sheet-blue-button button[type=roll].btn{background:#2B3FEA;width:35px;height:35px;display:block;margin:0 auto;color:white}.sheet-blue-button button[type=roll].btn::before{content:""}.sheet-lower{text-transform:lowercase}.sheet-space-before::before,.sheet-space-after::after{content:" "}.sheet-colon-after::after{content:":"}.sheet-hide-empty[value=""]+span{display:none}.sheet-add-plus:not([value^="-"])+span::before{content:"+"}.sheet-api{font-size:.8em;background:#F0F0F0;border-radius:5px;padding:1px;line-height:1;vertical-align:super}.sheet-simple-repsection .repitem{margin-bottom:3px}.sheet-simple-repsection textarea{margin:3px 0 0;height:50px}.sheet-simple-repsection .sheet-display .sheet-name{font-weight:bold;font-size:1.1em;border-bottom:1px solid #777}.sheet-simple-repsection .sheet-display .sheet-details{line-height:1.4;text-align:justify;white-space:pre-wrap}.sheet-skills-type[value="neither"] ~ div .sheet-skills-either,.sheet-skills-type:not([value="first"]) ~ div .sheet-skills-first,.sheet-skills-type:not([value="revised"]) ~ div .sheet-skills-revised,.sheet-skills-type:not([value="neither"]) ~ div .sheet-skills-neither,.sheet-skills-query:not([value="hover"]) ~ div .sheet-skills-query-hover,.sheet-skills-query[value="query"] ~ div .sheet-skills-query-display{display:none}.sheet-skills-query-display input:not([value*="str"]) ~ .sheet-str,.sheet-skills-query-display input:not([value*="dex"]) ~ .sheet-dex,.sheet-skills-query-display input:not([value*="con"]) ~ .sheet-con,.sheet-skills-query-display input:not([value*="int"]) ~ .sheet-int,.sheet-skills-query-display input:not([value*="wis"]) ~ .sheet-wis,.sheet-skills-query-display input:not([value*="cha"]) ~ .sheet-cha{display:none}.sheet-skills-query[value="hover"] ~ div .sheet-skill:hover .sheet-skills-query-display,.sheet-skill .sheet-display .sheet-query:focus+.sheet-skills-query-display{display:none}.repcontrol{display:flex;margin-top:4px}.repcontrol button{padding:3px 10px}.repcontrol_edit{order:1;margin-left:auto}.repcontrol button{background:#223297;color:#FFF;box-shadow:none;text-shadow:none}.repcontrol_move,.repcontrol_del{padding:1px 10px}.itemcontrol{z-index:100}.sheet-section-toggle-header{position:relative}.sheet-section-toggle-header input{cursor:pointer;position:absolute;width:22px;height:100%;z-index:2;right:0;opacity:0}.sheet-section-toggle-header input+h1::after{background-image:url("https://svgshare.com/i/6Vz.svg")}.sheet-section-toggle-header input:not(:checked)+h1::after{transform:rotate(180deg)}.sheet-section-toggle-header+input+div{margin-top:5px}.sheet-settings label{font-weight:bold}.sheet-settings label span{margin-right:4px}.sheet-settings select{width:120px;display:inline-block}.sheet-settings select.sheet-wide{width:170px}.sheet-core{display:grid;grid-column-gap:5px}.sheet-core.sheet-core-info{grid:auto / 2.5fr 1fr .8fr}.sheet-core.sheet-core-info .sheet-info{flex-wrap:wrap;padding-right:3px}.sheet-core.sheet-core-info .sheet-info .sheet-important{width:calc(60% - 22px)}.sheet-core.sheet-core-info .sheet-info .sheet-level{width:44px}.sheet-core.sheet-core-info .sheet-info .sheet-level-rest{width:calc(40% - 22px)}.sheet-core.sheet-core-stats{grid:auto/minmax(310px, 1fr) minmax(260px, 1fr) minmax(220px, 1fr)}.sheet-core .sheet-main-content{margin-top:3px;display:grid;grid:auto/repeat(3, 1fr);grid-row-gap:3px}.sheet-core .sheet-main-content .sheet-left-margin{margin-left:15px}.sheet-saves .sheet-flex{margin-top:4px}.sheet-menus-content{display:grid;grid:auto / 1fr 1fr}.sheet-character .sheet-menus button[type=roll].btn{margin-right:auto}.sheet-menus button[type=roll].btn{color:#2B3FEA;font-size:1.1em}.sheet-menus button[type=roll].btn:hover{color:red}.sheet-attributes{font-size:1.1em;line-height:16px}.sheet-attributes table{width:100%;height:100%}.sheet-attributes td:first-child,.sheet-attributes .sheet-mod{font-weight:bold}.sheet-attributes td:not(:first-child){text-align:center}.sheet-attributes input[type=number]{width:45px}.sheet-attributes .sheet-mod{font-size:1.1em}.sheet-editmode[value="0"] ~ .sheet-content .sheet-resources .repcontainer{grid:auto / 1fr 1fr}.sheet-resources .sheet-credits{margin-left:auto}.sheet-resources .repcontainer{display:grid;grid-row-gap:3px;margin-top:3px}.sheet-resources input[type=text]{width:calc(100% - 8em);margin-right:auto}.sheet-resources .sheet-slash{margin:0 2px}.sheet-weapons .sheet-edit{justify-content:space-between}.sheet-weapons .sheet-edit .sheet-name{width:135px;flex-grow:1}.sheet-weapons .sheet-edit .sheet-ab{width:45px}.sheet-weapons .sheet-edit .sheet-weapon-skill{width:80px}.sheet-weapons .sheet-edit .sheet-attribute{width:60px}.sheet-weapons .sheet-edit .sheet-burst{width:65px}.sheet-weapons .sheet-edit .sheet-damage{width:70px}.sheet-weapons .sheet-edit .sheet-shock-damage{width:95px}.sheet-weapons .sheet-edit .sheet-shock-ac{width:55px}.sheet-weapons .sheet-edit .sheet-skill-to-damage{width:40px}.sheet-weapons .sheet-edit .sheet-range{width:70px}.sheet-weapons .sheet-edit .sheet-ammo{width:53px}.sheet-weapons .sheet-text-input{padding-right:3px}.sheet-weapons .repitem{margin-bottom:3px}.sheet-weapons .sheet-display{font-size:1.1em;border:1px solid #888;text-indent:-10px;padding:2px 4px 2px 14px}.sheet-weapons .sheet-display .sheet-name{font-weight:bold}.sheet-weapons .repitem:nth-child(odd) .sheet-display{background:#D3D3D3}.sheet-skill-container,.sheet-skills-repeating .repcontainer{display:grid;grid:auto / 1fr 1fr;grid-gap:4px 1%}.sheet-skill{position:relative}.sheet-skill .sheet-display,.sheet-skill .sheet-edit{border:1px solid #888;padding:2px 4px;height:100%}.sheet-skill .sheet-display{font-weight:bold;font-size:1.1em}.sheet-skill .sheet-display .sheet-dice[value="3d6d1"]+.sheet-name::after{content:"3d6"}.sheet-skill .sheet-display .sheet-dice[value="4d6d2"]+.sheet-name::after{content:"4d6"}.sheet-skill .sheet-display .sheet-name{margin-right:auto}.sheet-skill .sheet-display .sheet-name::after{vertical-align:super;margin-left:2px;font-weight:normal;font-size:.7em}.sheet-skill .sheet-display .sheet-query{width:55px;background:transparent;border-color:transparent;position:relative;height:18px;z-index:2;margin:0 2px;outline:none;color:inherit;flex-shrink:0;line-height:16px;padding:0}.sheet-skill:not(:hover) .sheet-display .sheet-query:not(:focus){display:none}.sheet-skill .sheet-skills-query-display{margin:0 3px;flex-shrink:0;font-weight:normal}.sheet-skill .sheet-edit input[type="text"].sheet-name{width:100%;margin-bottom:2px}.sheet-skill .sheet-edit div.sheet-name{flex-grow:1;width:0;padding:1px 2px}.sheet-skill .sheet-edit .sheet-level{margin:0 2px;padding:1px 2px;width:40px}.sheet-skill .sheet-edit .sheet-query{width:50px}.sheet-skill .sheet-edit .sheet-dice{width:35px}.sheet-skill .sheet-edit.sheet-flex-wrap select,.sheet-skill .sheet-edit.sheet-flex-wrap input{flex-grow:1}.sheet-skill.sheet-skill-points .sheet-display{font-size:1.1em;font-weight:bold;width:100%}.sheet-skill.sheet-skill-points .sheet-name{background:#000;color:#fff;flex-grow:0;margin-right:auto;width:auto;padding:0 4px}.sheet-skill.sheet-skill-points .sheet-edit .sheet-level{margin:0}.sheet-skill-container .sheet-skill:nth-of-type(4n+1),.sheet-skill-container .sheet-skill:nth-of-type(4n+2){background:#D3D3D3}.repcontainer[data-groupname="repeating_skills"] .repitem:nth-of-type(4n+1) .sheet-skill,.repcontainer[data-groupname="repeating_skills"] .repitem:nth-of-type(4n+2) .sheet-skill{background:#D3D3D3}.sheet-skills-type:not([value="neither"]) ~ div .sheet-skills-repeating,.sheet-psionics .sheet-skills-repeating,.sheet-magic .sheet-skills-repeating{margin-top:4px}.sheet-skill-blurb{font-style:italic;text-align:center}.sheet-details-button{margin-left:auto;font-weight:bold;color:#999;letter-spacing:1px;cursor:pointer;text-transform:uppercase;font-size:.8em}.sheet-details-button input{visibility:hidden;position:absolute}.sheet-details-button input:checked+span{color:#333}.sheet-input-details:not([value="1"]) ~ div .sheet-details{display:none}.sheet-super-type:not([value="psionics"]) ~ div .sheet-super-psionics-only,.sheet-super-type:not([value="magic"]) ~ div .sheet-super-magic-only,.sheet-super-type:not([value="both"]) ~ div .sheet-super-both,.sheet-super-type[value="magic"] ~ div .sheet-super-psionics,.sheet-super-type[value="psionics"] ~ div .sheet-super-magic,.sheet-super-type[value="neither"] ~ div .sheet-super{display:none}.sheet-tab-input:not([value="psionics"]) ~ .sheet-psionics,.sheet-tab-input:not([value="magic"]) ~ .sheet-magic{display:none}.sheet-psionics-effort{display:grid;grid:auto/ auto 60px 60px 80px;align-items:center;grid-column-gap:4px;margin-top:5px}.sheet-psionics-effort h3{line-height:1}.sheet-techniques{margin-top:5px;padding:0 4px}.sheet-techniques>.sheet-flex-center{margin-bottom:5px}.sheet-techniques input[type=text]{width:100%}.sheet-spells{margin-top:5px;padding:0 4px}.sheet-spells>.sheet-flex-center{margin-bottom:5px}.sheet-spells>.sheet-flex{border-bottom:1px solid #666;margin-bottom:3px}.sheet-spells>.sheet-flex :not(:first-child){text-align:center}.sheet-spells .sheet-edit .sheet-name{width:220px;flex-grow:1}.sheet-spells .sheet-edit .sheet-prepared{margin:0 3px}.sheet-spells .sheet-edit .sheet-prepared,.sheet-spells .sheet-edit .sheet-damage{width:60px}.sheet-spells .sheet-display .sheet-name{padding-bottom:1px}.sheet-spells .sheet-display span.sheet-prepared{margin:0 4px 0 auto}.sheet-spells .sheet-display input[type=number].sheet-prepared{padding:0 4px;position:relative;z-index:2}.sheet-foci-loc[value="left"] ~ .sheet-column .sheet-foci-right,.sheet-foci-loc[value="right"] ~ .sheet-column .sheet-foci-left{display:none}.sheet-foci .sheet-details-button{position:relative;z-index:2}.sheet-foci .sheet-class-ability{position:relative}.sheet-foci .sheet-class-ability .sheet-edit .sheet-name{font-weight:bold;font-size:1.1em;border-bottom:1px solid #777}.sheet-foci .sheet-class-ability .sheet-name,.sheet-foci .sheet-class-ability .sheet-edit textarea,.sheet-foci .sheet-class-ability .sheet-display{margin-bottom:3px}.sheet-foci .sheet-edit .sheet-name{flex-grow:1}.sheet-foci .sheet-edit .sheet-level{margin-left:3px;width:60px}.sheet-foci .sheet-display .sheet-level{margin-left:auto}.sheet-armor .sheet-name{width:150px;margin-left:auto}.sheet-armor .sheet-ac{width:45px}.sheet-armor .sheet-enc{width:60px}.sheet-armor .sheet-type{width:80px}.sheet-readied-stowed{display:grid;align-items:center;grid:auto / 1fr 60px 60px 80px 80px;grid-column-gap:7px}.sheet-readied-stowed .sheet-input-gear-over[value="1"]+.sheet-text-input input:first-child{color:red}.sheet-cyberware h3{margin:5px 0}.sheet-cyberware .sheet-edit{flex-wrap:wrap}.sheet-cyberware .sheet-edit input[type=text]{width:0;flex-grow:1}.sheet-cyberware .sheet-edit>span{margin:0 3px}.sheet-equipment .repcontainer[data-groupname="repeating_weapons"]+.repcontrol{display:none}.sheet-equipment .repitem{margin-bottom:2px}.sheet-equipment .repitem input[type=text],.sheet-equipment .repitem input[type=number],.sheet-equipment .repitem select{background:transparent}.sheet-equipment .repitem input[type=text]{flex-grow:1;width:0}.sheet-equipment .repitem input[type=number]{width:45px;margin:0 3px}.sheet-equipment .repitem select{width:80px}.sheet-equipment .sheet-other h3{margin-bottom:5px}.sheet-equipment textarea{height:100px}.sheet-misc h3{margin-bottom:4px}.sheet-misc .repitem{display:flex;align-items:center;margin-bottom:2px}.sheet-goals input[type=text]{flex-grow:1;margin-right:5px}.sheet-goals input[type=number]{width:70px}.sheet-languages input{width:100%}.sheet-notes{margin:10px 0}.sheet-ship{margin-top:-20px;grid:auto/repeat(4, 1fr)}.sheet-ship .sheet-menus h3{line-height:1}.sheet-ship .sheet-menus button[type=roll].btn{line-height:1}.sheet-ship .sheet-info{flex-wrap:wrap}.sheet-ship .sheet-info .sheet-text-input{margin-bottom:3px}.sheet-ship .sheet-data{display:grid;grid:auto/repeat(3, 1fr)}.sheet-ship .sheet-data .sheet-text-input,.sheet-ship .sheet-data .sheet-text-input input[type=number]{text-align:center}.sheet-ship .sheet-stats{display:grid;grid:auto / 1fr 1fr}.sheet-ship .sheet-input-color-negative[value^="-"]+.sheet-text-input input:first-child{color:red}.sheet-ship .repcontainer{display:grid;grid-row-gap:3px}.sheet-ship .repitem,.sheet-ship .repitem .sheet-edit,.sheet-ship .repitem .sheet-display{width:100%}.sheet-ship .sheet-grey-box-bordered{padding-right:0}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-name{width:calc(100% - 200px)}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-damage{width:65px}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-duo{width:80px}.sheet-ship .sheet-ship-weapons .sheet-edit .sheet-qualities{width:calc(100% - 195px)}.sheet-ship .sheet-ship-weapons .sheet-display{text-indent:-10px;padding-left:14px}.sheet-ship .sheet-ship-defenses .sheet-edit .sheet-name,.sheet-ship .sheet-ship-defenses .sheet-edit .sheet-effect,.sheet-ship .sheet-ship-fitting .sheet-edit .sheet-name,.sheet-ship .sheet-ship-fitting .sheet-edit .sheet-effect{flex:1 1 auto;width:0}.sheet-ship .sheet-ship-defenses .sheet-display,.sheet-ship .sheet-ship-fitting .sheet-display{text-indent:-10px;padding:2px 4px 2px 14px}.sheet-ship .sheet-edit .sheet-broken{width:50px}.sheet-ship .sheet-edit .sheet-number{width:50px}.sheet-ship .sheet-display .sheet-name{font-weight:bold}.sheet-ship .sheet-display .sheet-broken{color:red;text-transform:uppercase}.sheet-ship .sheet-display .sheet-description{font-style:italic}.sheet-editmode[value="0"] ~ .sheet-ship .sheet-ship-defenses,.sheet-editmode[value="0"] ~ .sheet-ship .sheet-ship-fitting{background:#F0F0F0;padding:3px 0}.sheet-npc{margin-top:-20px;grid:auto / 3fr .8fr 2.2fr}.sheet-npc .sheet-input-individual-hide:not([value="1"]) ~ .sheet-rolls .sheet-individual-hide{display:none}.sheet-npc .sheet-menus h3{line-height:1}.sheet-npc .sheet-menus button[type=roll].btn{line-height:1}.sheet-npc .sheet-info{display:grid;grid:auto/repeat(5, 1fr) 1.3fr}.sheet-npc .sheet-npc-hp{display:grid;grid:auto / 40px 1fr}.sheet-npc .sheet-individual-hide input[type="checkbox"]{margin-right:2px}.sheet-npc .sheet-npc-rep-header{margin:4px}.sheet-npc .sheet-rolls>:first-child{margin-bottom:5px}.sheet-npc .sheet-npc-checkbox{font-size:.9em}.sheet-npc .sheet-npc-checkbox span{vertical-align:middle;margin-right:4px}.sheet-npc .repcontainer{display:grid;grid-gap:3px}.sheet-npc .sheet-full-attacks{margin:0 6px 0 auto}.sheet-npc .sheet-grey-box-bordered{padding-right:1px}.sheet-npc .sheet-text-input{padding-right:3px}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-name{width:0;flex-grow:1}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-attacks,.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-ab{width:50px}.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-burst,.sheet-npc .sheet-npc-attacks .sheet-edit .sheet-damage{width:65px}.sheet-npc .sheet-npc-attacks .sheet-display{font-size:1.1em;font-weight:bold;padding:4px 8px}.sheet-npc .sheet-npc-attacks .sheet-display .sheet-attacks[value="1"]+span{display:none}.sheet-npc .sheet-npc-attacks .sheet-display .sheet-attacks{text-transform:lowercase}.sheet-npc .sheet-npc-abilities .sheet-npc-checkbox{margin-left:auto}.sheet-npc .sheet-npc-abilities .sheet-edit .sheet-name{width:100px}.sheet-npc .sheet-npc-abilities .sheet-edit .sheet-description{width:0;flex-grow:1}.sheet-npc .sheet-npc-abilities .sheet-display{text-indent:-10px;padding:4px 8px 4px 18px}.sheet-npc .sheet-npc-abilities .sheet-display .sheet-name{font-weight:bold}.sheet-npc .sheet-npc-abilities .sheet-display .sheet-description{font-style:italic}.withoutavatars .sheet-rolltemplate-swn-default,.withoutavatars .sheet-rolltemplate-swn-attack,.withoutavatars .sheet-rolltemplate-swn-skill,.withoutavatars .sheet-rolltemplate-swn-save{margin-left:-11px}.sheet-rolltemplate-swn-default,.sheet-rolltemplate-swn-attack,.sheet-rolltemplate-swn-skill,.sheet-rolltemplate-swn-save{margin-left:-41px;width:292px;color:#FFF;font-family:"Arial",sans-serif}.sheet-rolltemplate-swn-default div,.sheet-rolltemplate-swn-attack div,.sheet-rolltemplate-swn-skill div,.sheet-rolltemplate-swn-save div{box-sizing:border-box}.sheet-rolltemplate-swn-default .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-attack .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-skill .sheet-container .inlinerollresult,.sheet-rolltemplate-swn-save .sheet-container .inlinerollresult{padding:0;font-family:inherit;background:transparent;border-color:transparent;border:none}.sheet-rolltemplate-swn-default .sheet-container,.sheet-rolltemplate-swn-attack .sheet-container,.sheet-rolltemplate-swn-skill .sheet-container,.sheet-rolltemplate-swn-save .sheet-container{min-height:175px;position:relative;padding:18px 20px}.sheet-rolltemplate-swn-default .sheet-background,.sheet-rolltemplate-swn-attack .sheet-background,.sheet-rolltemplate-swn-skill .sheet-background,.sheet-rolltemplate-swn-save .sheet-background{width:100%;height:calc(100% - 175px);position:absolute;top:153px;left:0;background:#0F0F0F}.sheet-rolltemplate-swn-default .sheet-header,.sheet-rolltemplate-swn-attack .sheet-header,.sheet-rolltemplate-swn-skill .sheet-header,.sheet-rolltemplate-swn-save .sheet-header{width:198px}.sheet-rolltemplate-swn-default .sheet-header .sheet-name,.sheet-rolltemplate-swn-attack .sheet-header .sheet-name,.sheet-rolltemplate-swn-skill .sheet-header .sheet-name,.sheet-rolltemplate-swn-save .sheet-header .sheet-name{margin-bottom:12px;font-size:13px;line-height:1;height:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:"Times New Roman",serif;font-weight:bold}.sheet-rolltemplate-swn-default .sheet-header .sheet-title,.sheet-rolltemplate-swn-attack .sheet-header .sheet-title,.sheet-rolltemplate-swn-skill .sheet-header .sheet-title,.sheet-rolltemplate-swn-save .sheet-header .sheet-title{font-size:14px;height:32px;line-height:16px;overflow:hidden;font-weight:bold;margin-bottom:24px}.sheet-rolltemplate-swn-default .sheet-content,.sheet-rolltemplate-swn-attack .sheet-content,.sheet-rolltemplate-swn-skill .sheet-content,.sheet-rolltemplate-swn-save .sheet-content{position:relative}.sheet-rolltemplate-swn-default .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-attack .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-skill .sheet-rolls .inlinerollresult,.sheet-rolltemplate-swn-save .sheet-rolls .inlinerollresult{font-size:36px;font-weight:bold;line-height:29px;white-space:nowrap}.sheet-rolltemplate-swn-default .sheet-rolls,.sheet-rolltemplate-swn-attack .sheet-rolls,.sheet-rolltemplate-swn-skill .sheet-rolls,.sheet-rolltemplate-swn-save .sheet-rolls{height:35px;display:flex;align-items:start}.sheet-rolltemplate-swn-default .sheet-rollname,.sheet-rolltemplate-swn-attack .sheet-rollname,.sheet-rolltemplate-swn-skill .sheet-rollname,.sheet-rolltemplate-swn-save .sheet-rollname{font-size:12px;line-height:1}.sheet-rolltemplate-swn-default a,.sheet-rolltemplate-swn-attack a,.sheet-rolltemplate-swn-skill a,.sheet-rolltemplate-swn-save a{color:inherit}.sheet-rolltemplate-swn-default a:hover,.sheet-rolltemplate-swn-attack a:hover,.sheet-rolltemplate-swn-skill a:hover,.sheet-rolltemplate-swn-save a:hover{color:red}.sheet-rolltemplate-swn-default a[href^="~"],.sheet-rolltemplate-swn-attack a[href^="~"],.sheet-rolltemplate-swn-skill a[href^="~"],.sheet-rolltemplate-swn-save a[href^="~"]{padding:0;background:transparent;border:none;line-height:1.4}.sheet-rolltemplate-swn-default .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-black.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-default .sheet-name{color:#bababa}.sheet-rolltemplate-swn-default .sheet-rollname{margin-right:auto}.sheet-rolltemplate-swn-default .sheet-desc,.sheet-rolltemplate-swn-default .sheet-buttons{font-size:12px;line-height:1.4}.sheet-rolltemplate-swn-default .sheet-info{font-style:italic;font-size:10px;line-height:1;margin:-10px 0 5px}.sheet-rolltemplate-swn-default .sheet-info .inlinerollresult{font-size:1em;font-weight:normal}.sheet-rolltemplate-swn-attack .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-purple.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-attack .sheet-name{color:#b291ec}.sheet-rolltemplate-swn-attack .sheet-title .inlinerollresult{font-size:1em;pointer-events:none}.sheet-rolltemplate-swn-attack .sheet-damage{margin-left:auto}.sheet-rolltemplate-swn-attack .sheet-roll{margin-left:10px}.sheet-rolltemplate-swn-attack .sheet-rolls:not(:first-of-type){margin-top:5px}.sheet-rolltemplate-swn-attack .sheet-shock{font-style:italic;margin-top:4px;font-size:12px}.sheet-rolltemplate-swn-attack .sheet-info{font-style:italic;font-size:10px}.sheet-rolltemplate-swn-attack .sheet-info>span:first-child{margin-right:10px}.sheet-rolltemplate-swn-attack .sheet-info .inlinerollresult{font-weight:normal;font-size:1em;margin-left:2px}.sheet-rolltemplate-swn-attack .sheet-desc{font-size:12px;line-height:1.4}.sheet-rolltemplate-swn-skill .sheet-container{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-blue.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-skill .sheet-name{color:#80b0ff}.sheet-rolltemplate-swn-skill .sheet-title .sheet-italic{font-style:italic}.sheet-rolltemplate-swn-skill .sheet-title .inlinerollresult{font-size:1em;pointer-events:none}.sheet-rolltemplate-swn-skill .sheet-rollname{margin-right:auto}.sheet-rolltemplate-swn-save .sheet-container.sheet-success{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-green.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-save .sheet-container.sheet-success .sheet-name{color:#83db53}.sheet-rolltemplate-swn-save .sheet-container.sheet-failure{background:url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-top-red.png") top no-repeat,url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Stars_Without_Number_Revised/Assets/rt-bottom.png") bottom no-repeat}.sheet-rolltemplate-swn-save .sheet-container.sheet-failure .sheet-name{color:#ff8080}.sheet-rolltemplate-swn-save .sheet-vs{margin:0 10px}.sheet-rolltemplate-swn-save .sheet-rollname{margin-right:auto} diff --git a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html index 10ef0f3b41..cb751e1340 100644 --- a/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html +++ b/Stars_Without_Number_Revised/Stars_Without_Number_Revised.html @@ -1,3 +1,3 @@ -

