Files
roll20-character-sheets-tester/Stars_Without_Number_Revised/Source/pug/character.pug
T

406 lines
22 KiB
Plaintext

-
const attributes = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"];
const customSkills = {
culture_alien: "Culture/Alien/",
culture_one: "Culture/",
culture_two: "Culture/",
culture_three: "Culture/",
profession: "Profession/"
};
const skills = {
revised: ["administer", "connect", "exert", "fix", "heal", "know", "lead",
"notice", "perform", "pilot", "program", "punch", "shoot", "sneak", "stab",
"survive", "talk", "trade", "work"],
first: ["artist", "athletics", "bureaucracy", "business", "combat_energy", "combat_gunnery",
"combat_primitive", "combat_projectile", "combat_psitech", "combat_unarmed", "computer",
"culture_alien", "culture_criminal", "culture_spacer", "culture_traveller", "culture_one",
"culture_two", "culture_three", "exosuit", "gambling", "history", "instructor", "language",
"leadership", "navigation", "perception", "persuade", "profession", "religion", "science",
"security", "stealth", "steward", "survival", "tactics", "tech_astronautic", "tech_maltech",
"tech_medical", "tech_postech", "tech_pretech", "tech_psitech", "vehicle_air", "vehicle_grav",
"vehicle_land", "vehicle_space", "vehicle_water", "dummy"],
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
input(type="hidden", name="attr_setting_skill_query", value="hover").skills-query
//- Core
.core.core-info.col-1-3
.info.flex.core-box-text
+text-input("name", "NAME").important
+text-input("level", "LEVEL", "no-spinners")(type="number", min="1", value="1").level.center
+text-input("class", "CLASS").level-rest
+text-input("background", "BACKGROUND").col25
+text-input("species_gender", "SPECIES_GENDER").col25
+text-input("faction", "FACTION").col25
+text-input("homeworld", "HOMEWORLD").col25
.saves.core-box
h3(data-i18n="SAVING_THROWS")
.flex-between
+makeSave("physical")
+makeSave("mental")
+makeSave("evasion")
input(type="hidden", name="attr_homebrew_luck_save", value="0").hider
+makeSave("luck")
.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
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
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
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
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
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
//- Stats
.core.core-stats.col-1-3
.main.core-box-text
h3(data-i18n="CORE_STATISTICS")
.main-content
+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")
+text-input("AC", "ARMOR_CLASS")(type="number", value="10", readonly, data-i18n-title="AC_DESC").center
+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(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
tr
th
th(data-i18n="BASE")
th(data-i18n="BONUS")
th(data-i18n="MODIFIER")
tbody
each attr in attributes
tr
td(data-i18n=attr.toUpperCase(), data-i18n-title=`${attr.toUpperCase()}_DESC`)
td
input(type="number", name=`attr_${attr}`, value="10").edit
span(name=`attr_${attr}`).display
td
input(type="number", name=`attr_${attr}_bonus`, value="0").edit
span(name=`attr_${attr}_bonus`).display
td.mod
input(type="hidden", name=`attr_${attr}_mod`, value="0").add-plus
span(name=`attr_${attr}_mod`)
.resources.core-box-text
.flex
h3(data-i18n="RESOURCES")
+text-input("credits", "CREDITS")(type="number", value="0").credits.center.col50
fieldset.repeating_resources
+text-input-duo("resource_count", "resource_count_max", "").display
span(name="attr_resource_name")
.flex-center.edit
input(type="text", name="attr_resource_name")
input(type="number", name="attr_resource_count")
span.slash /
input(type="number", name="attr_resource_count_max")
.column
//- Weapons
.section
+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} @{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
span(name="attr_weapon_attack_display")
span
| (
span(name="attr_weapon_damage_display")
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_use_ammo", value="0").hider
span
| . #[span(data-i18n="AMMO")]: 
input(type="number", name="attr_weapon_ammo").inline-input
|  / 
span(name="attr_weapon_ammo_max")
.edit.flex-wrap.grey-box-bordered
+text-input("weapon_name", "NAME").name
+text-input("weapon_attack", "ATTACK_BONUS_SHORT")(type="number", value="0").ab.center
+fake-text-input("SKILL").skills-either.weapon-skill.center
select(name="attr_weapon_skill_bonus")
option.skills-revised(value="@{skill_shoot}", data-i18n="SHOOT")
option.skills-revised(value="@{skill_punch}", data-i18n="PUNCH")
option.skills-revised(value="@{skill_stab}", data-i18n="STAB")
option.skills-first(value="@{skill_combat_energy}", data-i18n="COMBAT_ENERGY")
option.skills-first(value="@{skill_combat_gunnery}", data-i18n="COMBAT_GUNNERY")
option.skills-first(value="@{skill_combat_primitive}", data-i18n="COMBAT_PRIMITIVE")
option.skills-first(value="@{skill_combat_projectile}", data-i18n="COMBAT_PROJECTILE")
option.skills-first(value="@{skill_combat_psitech}", data-i18n="COMBAT_PSITECH")
option.skills-first(value="@{skill_combat_unarmed}", data-i18n="COMBAT_UNARMED")
option(value="@{skill_telekinesis}", data-i18n="TELEKINESIS")
option(value="0", data-i18n="NONE")
+text-input("weapon_skill_bonus", "SKILL_AB").weapon-skill.skills-neither.center
+fake-text-input("ATTRIBUTE").attribute.center
select(name="attr_weapon_attribute_mod")
each attr in attributes
option(value=`@{${attr}_mod}`, data-i18n=`${attr.toUpperCase()}_SHORT`)
+fake-text-input("BURST").burst.center
select(name="attr_weapon_burst")
option(value="", data-i18n="NO", selected)
option(value="@{burst_query}", data-i18n="ASK")
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")(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")
+text-input("weapon_shock_ac", "SHOCK_AC")(type="number", value="10").shock-ac.center
+text-input("weapon_range", "RANGE").range.center
+text-input-duo("weapon_ammo", "weapon_ammo_max", "", {value: "0"}).ammo.center
input(type="checkbox", name="attr_weapon_use_ammo", value!="{{ammo=[[0@{weapon_ammo} - (1 @{weapon_burst})]] / @{weapon_ammo|max}}}")
span(data-i18n="AMMO")
//- Foci
.section.foci-left
+foci
.section.super
+sectionheader("show_psionics", false)
span(data-i18n="PSYCHIC_SKILLS_TECHNIQUES").super-psionics-only
span(data-i18n="SPACE_MAGIC").super-magic-only
span(data-i18n="PSIONICS_AND_SPACE_MAGIC").super-both
div
.tabs.flex.super-both
label
input(type="radio", name="attr_tab_super", value="magic")
span(data-i18n="SPACE_MAGIC")
label
input(type="radio", name="attr_tab_super", value="psionics", checked)
span(data-i18n="PSYCHIC_SKILLS_TECHNIQUES")
input(type="hidden", name="attr_tab_super", value="psionics").tab-input
.psionics
.skills-psionic.skill-container(data-i18n-list="SKILL_ORDER_PSIONIC")
each skill in skills.psionic
+makeSkill(skill)
.skills-repeating
fieldset.repeating_psychic-skills
+makeSkill("", true)
.psionics-effort.grey-box
h3(data-i18n="COMMITTED_EFFORT")
+text-input("psionics_committed_effort_scene", "SCENE")(type="number", value="0", min="0").center
+text-input("psionics_committed_effort_day", "DAY")(type="number", value="0", min="0").center
+text-input("psionics_total_effort", "MAXIMUM")(type="number", value="0", readonly, data-i18n-title="MAXIMUM_EFFORT_DESC").center
.techniques.simple-repsection
.flex-center
h3(data-i18n="PSYCHIC_TECHNIQUES")
label.details-button
input(type="checkbox", name="attr_show_technique_details", value="1", checked)
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}}}")
.display
.name #[span(name="attr_technique_name")]
.details #[span(name="attr_technique_description")]
.edit
input.name(type="text", name="attr_technique_name", data-i18n-placeholder="TECHNIQUE")
textarea.details(name="attr_technique_description", data-i18n-placeholder="DESCRIPTION")
.magic
.skill-container
+makeSkill("magic")
input(type="hidden", name="attr_skill_magic2_name", value="").empty-hider
+makeSkill("magic2", true)
.skills-repeating
fieldset.repeating_magic-skills
+makeSkill("", true)
.spells.simple-repsection
.flex-center
h3(data-i18n="SPELLS")
label.details-button
input(type="checkbox", name="attr_show_spell_details", value="1", checked)
span(data-i18n="EXPAND")
input(type="hidden", name="attr_show_spell_details", value="1").input-details
.flex.edit
.name(data-i18n="NAME")
.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}]]}}")
.display
.name.flex-center
span(name="attr_spell_name")
span.prepared #[span(data-i18n="PREPARED")]:
input.prepared(type="number", name="attr_spell_prepared", value="0", min="0")
.details #[span(name="attr_spell_description")]
.edit.flex-wrap
input.name(type="text", name="attr_spell_name")
input.prepared(type="number", name="attr_spell_prepared", value="0", min="0")
input.damage(type="text", name="attr_spell_damage", value="0")
textarea.details(name="attr_spell_description")
.column
//- Skills
.section
+sectionheader("show_skills", "SKILLS")
.skills
.skills-revised.skill-container(data-i18n-list="SKILL_ORDER_REVISED")
each skill in skills.revised
+makeSkill(skill)
.skill.skill-points
.display.flex-center
span(data-i18n="UNSPENT_SKILL_POINTS").name
span(name="attr_unspent_skill_points").level
.edit.flex-center
span(data-i18n="UNSPENT_SKILL_POINTS").name
input(type="number", min="0", value="0", name="attr_unspent_skill_points").level
.skills-first.skill-container(data-i18n-list="SKILL_ORDER_FIRST")
each skill in skills.first
+makeSkill(skill, !!customSkills[skill], customSkills[skill])
.skill.skill-points
.display.flex-center
span(data-i18n="UNSPENT_SKILL_POINTS").name
span(name="attr_unspent_skill_points").level
.edit.flex-center
span(data-i18n="UNSPENT_SKILL_POINTS").name
input(type="number", min="0", value="0", name="attr_unspent_skill_points").level
input(type="hidden", name="attr_homebrew_extra_skills", value="0").hider
.skills-repeating
fieldset.repeating_skills
+makeSkill("", true)
.skill-blurb.edit(data-i18n="SKILL_BLURB")
//- Foci
.section.foci-right
+foci
//- Gear
.section.col-1-3
+sectionheader("show_gear", "GEAR")
.gear.halfgrid
.equipment.column
.grey-box.readied-stowed.flex-center
h3(data-i18n="EQUIPMENT")
input(type="hidden", name="attr_gear_readied_over", value="0").input-gear-over
+text-input-duo("gear_readied", "gear_readied_max", "READIED", {value: "5", readonly: true, "data-i18n-title": "STRENGTH/2"})(value="0", readonly)
input(type="hidden", name="attr_gear_stowed_over", value="0").input-gear-over
+text-input-duo("gear_stowed", "gear_stowed_max", "STOWED", {value: "10", readonly: true, "data-i18n-title": "STRENGTH"})(value="0", readonly)
+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")
.grey-box.other
h3(data-i18n="OTHER_EQUIPMENT")
textarea(name="attr_gear_other").other-gear
.column
.armor.grey-box.flex-center
h3(data-i18n="ARMOR")
+text-input("armor_name", "NAME").name
+text-input("armor_ac", "AC")(type="number", value="0").center.ac
+text-input("armor_encumbrance", "ENCUMBRANCE_SHORT")(type="number", value="0").center.enc
+fake-text-input("TYPE").type.center
select(name="attr_armor_type")
option(value="none", data-i18n="NONE")
option(value="primitive", data-i18n="PRIMITIVE")
option(value="street", data-i18n="STREET", selected)
option(value="combat", data-i18n="COMBAT")
option(value="powered", data-i18n="POWERED")
.cyberware.simple-repsection.grey-box
.flex-center
h3(data-i18n="CYBERWARE")
label.details-button
input(type="checkbox", name="attr_show_cyberware_details", value="1", checked)
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}}}")
.display
.name.flex-between
span(name="attr_cyberware_name")
span #[span(name="attr_cyberware_strain")] #[span(data-i18n="STRAIN").lower]
.details #[span(name="attr_cyberware_description")]
.edit.flex-center
input(type="text", name="attr_cyberware_name").name
span #[span(data-i18n="STRAIN_COST")]:
input(type="number", name="attr_cyberware_strain", value="0").strain
textarea(name="attr_cyberware_description", data-i18n-placeholder="DESCRIPTION").details
//- Misc
.section.col-1-3
+sectionheader("show_misc", "MISCELLANEOUS")
.misc
.thirdsgrid.repeating-flex-row
.goals.grey-box.col-1-3
h3(data-i18n="GOALS")
fieldset.repeating_goals
input(type="text", name="attr_goal_name")
input(type="number", min="0", data-i18n-placeholder="XP", name="attr_goal_xp")
.languages.grey-box
h3(data-i18n="LANGUAGES")
fieldset.repeating_languages
input(type="text", name="attr_language")
textarea.notes(name="attr_notes", data-i18n-placeholder="NOTES")