SWN Revised v2.4.0 (#5124)

* Added permanent strain tracking from cyberware.

* Fix typo

* HP roll now behaves correctly with Heroic characters.

* Travel cost macro.

* Add new magic skills, also add option in weapon skill list.

* Fix typo

* Readme

* Number of attacks for NPCs upped to 8

* Add magic effort

* Final tweaks to magic effort

* Space Magic finished

* Changelog

* Add i18n to missing Innate AC

* changelog

* Fix version number

* Build html
This commit is contained in:
Karlinator
2019-06-03 16:47:45 -05:00
committed by Cassie Levett
parent b228af6a43
commit caf89367c5
9 changed files with 216 additions and 37 deletions
+18
View File
@@ -36,6 +36,24 @@ Report any problems, suggestions, or features by [creating an issue](https://git
## Changelog
### 2.4.1
* Fix Innate AC missing translation key.
### 2.4.0
* Add tracking of permanent System Strain.
* Fix HP roll for Heroic characters.
* Added a macro to calculate travel costs.
* Codex of the Black Sun support!
* Magic changed to Know Magic and Use Magic.
* Sunblade skill and Fight skill added.
* Toggle between Adept, Arcanist, and Magister.
* Magic Effort for Adepts.
* Spell Slots for Magisters and Arcanists.
* Arcanists track if spells are prepared.
* Adepts have abilities.
### 2.3.1
* Fixed a bug causing the sheet to sometimes display an incorrect attack bonus for weapons.
@@ -457,6 +457,8 @@ input[type=number].sheet-inline-input {
.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-super-type:not([value="psionics"]):not([value="both"]) ~ div .sheet-skills-psionics,
.sheet-super-type:not([value="magic"]):not([value="both"]) ~ div .sheet-skills-magic,
.sheet-skills-query:not([value="hover"]) ~ div .sheet-skills-query-hover,
.sheet-skills-query[value="query"] ~ div .sheet-skills-query-display,
.sheet-skills-query[value="query"] ~ div .sheet-skills-query-ask {
@@ -814,6 +816,16 @@ input[type=number].sheet-inline-input {
}
/* Space Magic */
.sheet-magic-effort {
display: grid;
grid: auto/ auto 45px 45px 45px 45px 80px;
align-items: center;
grid-column-gap: 4px;
margin-top: 5px;
h3 { line-height: 1 }
}
.sheet-spells {
margin-top: 5px;
> .sheet-flex-center { margin-bottom: 5px }
@@ -841,6 +853,22 @@ input[type=number].sheet-inline-input {
}
}
.sheet-spell-slots {
display: grid;
grid: auto/ auto 55px 55px 55px 55px 55px;
align-items: center;
grid-column-gap: 4px;
margin-top: 5px;
h3 { line-height: 1 }
}
.sheet-magic-type {
&:not([value="adept"]) ~ div .sheet-adept,
&:not([value="magister"]) ~ div .sheet-magister,
&:not([value="arcanist"]) ~ div .sheet-arcanist,
&[value="adept"] ~ div .sheet-spellcaster { display: none }
}
/* Foci */
.sheet-foci-loc {
&[value="left"] ~ .sheet-column .sheet-foci-right,
@@ -20,6 +20,7 @@
"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"],
magic: ["know_magic", "use_magic", "sunblade"],
};
//- We have foci in two locations, so they are outsourced to this mixin
@@ -94,6 +95,7 @@ input(type="hidden", name="attr_homebrew_skill_list", value="revised").skills-ty
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
input(type="hidden", name="attr_magic_type", value="arcanist").magic-type
//- Core
.core.core-info.cols-2
@@ -135,9 +137,9 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer
.main-content
+text-input-duo("HP", "HP_max", false, {value: "0"}).important
.label
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]]}}")
button.unstyled-button(type="roll", name="roll_HP", data-i18n="HIT_POINTS" value!="&{template:swn-default} {{charname=@{name}}} {{title=^{HIT_POINTS}}} {{=[[{abs(@{setting_heroic_enable}-1)*@{level}d6 + @{level}*@{constitution_mod}[CON] + @{level}*@{extra_hp_query}, abs(@{setting_heroic_enable}-1)*@{hp|max} + 1d1, 0d0 + @{setting_heroic_enable}*ceil(([[6*@{level}]] [Level] + [[@{level}*@{con_bonus}]] [Con] + [[@{level}*@{extra_hp_query}]] [Bonus])/2)}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("strain_permanent_extra", "strain_permanent", "PERMANENT_STRAIN", {readonly: true, "data-i18n-title": "PERMANENT_STRAIN"})(type="number", min="0", value="0", data-i18n-title="TOTAL_CYBERWARE_STRAIN").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
@@ -273,7 +275,9 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer
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.skills-psionics(value="@{skill_telekinesis}", data-i18n="TELEKINESIS")
option.skills-magic(value="@{skill_sunblade}", data-i18n="SUNBLADE")
option.skills-magic(value="@{skill_fight}", data-i18n="FIGHT")
option(value="0", data-i18n="NONE")
+text-input("weapon_skill_bonus", "SKILL_AB").weapon-skill.skills-neither.center
+fake-text-input("ATTRIBUTE").attribute.center
@@ -442,36 +446,81 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer
textarea.details(name="attr_technique_description", data-i18n-placeholder="DESCRIPTION")
.magic
.skill-container
+makeSkill("magic")
+makeSkill("know_magic")
+makeSkill("use_magic")
+makeSkill("sunblade")
+makeSkill("fight")
input(type="hidden", name="attr_skill_magic2_name", value="").empty-hider
+makeSkill("magic2", true)
.skills-repeating
fieldset.repeating_magic-skills
+makeSkill("", true)
.spells.grey-box.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")
h3(data-i18n="TYPE_OF_MAGIC")
select(name="attr_magic_type")
option(value="arcanist" data-i18n="ARCANIST")
option(value="magister" data-i18n="MAGISTER")
option(value="adept" data-i18n="ADEPT")
.adept
.magic-effort.grey-box
h3(data-i18n="MAGIC_EFFORT")
+text-input("magic_total_effort", "TOTAL")(type="number", value="0", min="0").center
+text-input("magic_committed_effort_current", "CURRENT")(type="number", value="0", min="0").center
+text-input("magic_committed_effort_scene", "SCENE")(type="number", value="0", min="0").center
+text-input("magic_committed_effort_day", "DAY")(type="number", value="0", min="0").center
+text-input("magic_uncommitted_effort", "UNCOMMITTED")(type="number", value="1", readonly, data-i18n-title="MAXIMUM_EFFORT_DESC").center
.spells.grey-box.simple-repsection
.flex-center
h3(data-i18n="ABILITIES")
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")
fieldset.repeating_abilities
button.display.invisible-button(type="roll", name="roll_Ability", value!="&{template:swn-default} {{charname=@{name}}} {{title=@{ability_name}}} {{info=^{ABILITY}}} {{desc=@{ability_description}}}")
.display
.name.flex-center
span(name="attr_ability_name")
.details #[span(name="attr_ability_description")]
.edit.flex-wrap
input.name(type="text", name="attr_ability_name")
textarea.details(name="attr_ability_description")
.spellcaster
.spell-slots.grey-box
h3(data-i18n="SPELL_SLOTS")
+text-input("spell-slots-first-level", "FIRST_LEVEL")(type="number", value="0", min="0").center
+text-input("spell-slots-second-level", "SECOND_LEVEL")(type="number", value="0", min="0").center
+text-input("spell-slots-third-level", "THIRD_LEVEL")(type="number", value="0", min="0").center
+text-input("spell-slots-fourth-level", "FOURTH_LEVEL")(type="number", value="0", min="0").center
+text-input("spell-slots-fifth-level", "FIFTH_LEVEL")(type="number", value="0", min="0").center
.spells.grey-box.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")
.level(data-i18n="LEVEL")
.prepared.arcanist(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(name="attr_spell_level")
span.prepared.arcanist #[span(data-i18n="PREPARED")]:
input.prepared.arcanist(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.level(type="number", name="attr_spell_level", value="0", min="0")
input.prepared.arcanist(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
@@ -728,7 +777,8 @@ input(type="hidden", name="attr_setting_skill_query", value="hover").skills-quer
textarea(name="attr_armor_description")
.cyberware.simple-repsection.grey-box
.flex-center
h3(data-i18n="CYBERWARE")
h3
| #[span(data-i18n="CYBERWARE")] – #[span(data-i18n="TOTAL_CYBERWARE_STRAIN")] #[span(name="attr_cyberware_strain_total")]
label.details-button
input(type="checkbox", name="attr_show_cyberware_details", value="1", checked)
span(data-i18n="EXPAND")
@@ -57,7 +57,31 @@ rolltemplate.sheet-rolltemplate-swn-attack
.roll {{attack4}}
.rollname.damage(data-i18n="DAMAGE")
.roll {{damage4}}
| {{/attack4}} {{#shock}}
| {{/attack4}} {{#attack5}}
.rolls
.rollname(data-i18n="ATTACK")
.roll {{attack5}}
.rollname.damage(data-i18n="DAMAGE")
.roll {{damage5}}
| {{/attack5}} {{#attack6}}
.rolls
.rollname(data-i18n="ATTACK")
.roll {{attack6}}
.rollname.damage(data-i18n="DAMAGE")
.roll {{damage6}}
| {{/attack6}} {{#attack7}}
.rolls
.rollname(data-i18n="ATTACK")
.roll {{attack7}}
.rollname.damage(data-i18n="DAMAGE")
.roll {{damage7}}
| {{/attack7}} {{#attack8}}
.rolls
.rollname(data-i18n="ATTACK")
.roll {{attack8}}
.rollname.damage(data-i18n="DAMAGE")
.roll {{damage8}}
| {{/attack8}} {{#shock}}
.shock {{shock}}
| {{/shock}}
.info
@@ -12,6 +12,7 @@ input(type="hidden", name="attr_ship_vehicle_type", value="SHIP").input-type
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_travel_cost", data-i18n="TRAVEL_COST", value!=`&{template:swn-default} {{charname=@{ship_name}}} {{title=^{TRAVEL_COST}}} {{info=You will travel for [[?{Distance?}]] hexes, starting from ?{Starting from?|Edge of system, 0|Other, 2}, and ending in ?{Ending in?|Edge of system, 0|Other, 2}. It will take [[(?{Distance?}*6+?{Starting from?|Edge of system, 0|Other, 2}+?{Ending in?|Edge of system, 0|Other, 2}) / ?{Drive Rating?}]] days and cost [[((?{Distance?}+?{Starting from?|Edge of system, 0|Other, 2}+?{Ending in?|Edge of system, 0|Other, 2}) / ?{Drive Rating?}) * @{ship_crew} * 20 ]] credits in life support costs.}}`).unstyled-button
//- Ship header
.info.core-box-text.flex
+42 -2
View File
@@ -3,7 +3,7 @@
"use strict";
/* Data constants */
const sheetName = "Stars Without Number (revised)";
const sheetVersion = "2.3.1";
const sheetVersion = "2.4.1";
const translate = getTranslationByKey;
const attributes = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"];
const effortAttributes = ["wisdom_mod", "constitution_mod", "psionics_extra_effort",
@@ -1878,6 +1878,15 @@
});
};
const calculateMagicEffort = () => {
getAttrs(["magic_total_effort", "magic_committed_effort_current", "magic_committed_effort_scene", "magic_committed_effort_day", "magic_uncommitted_effort"], function(v) {
const magic_uncommitted_effort = parseInt(v.magic_total_effort) - (parseInt(v.magic_committed_effort_current) + parseInt(v.magic_committed_effort_scene) + parseInt(v.magic_committed_effort_day));
mySetAttrs({
magic_uncommitted_effort
}, v);
});
};
const calculateAC = () => {
getSectionIDs("repeating_armor", idArray => {
const sourceAttrs = [
@@ -1918,6 +1927,33 @@
});
};
const calculatePermanentStrain = () => {
getAttrs(["cyberware_strain_total", "strain_permanent_extra", "strain_permanent"], v => {
const permStrain = parseInt(v.cyberware_strain_total) + parseInt(v.strain_permanent_extra);
mySetAttrs({
strain_permanent: permStrain
}, v);
});
};
const calculateCyberwareStrain = () => {
//Loop through the cyberware and add up the strain.
getSectionIDs("repeating_cyberware", idArray => {
const sourceAttrs = [
...idArray.map(id => `repeating_cyberware${id}_cyberware_strain`),
"cyberware_strain_total"
];
getAttrs(sourceAttrs, v => {
const cyberwareStrain = Math.max(
...idArray.map(id => parseInt(v[`repeating_cyberware${id}_cyberware_strain`]) || 0)
);
mySetAttrs({
cyberware_strain_total: cyberwareStrain
}, v);
});
});
};
const calculateMod = (attr) => {
getAttrs([attr, `${attr}_bonus`, `${attr}_mod`], v => {
const mod = (value => {
@@ -2224,7 +2260,7 @@
const setting = idArray.reduce((m, id) => {
if (v.npc_roll_full_attack === "1") {
const num = parseInt(v[`repeating_npc-attacks_${id}_attack_number`]) || 1;
const macro = [2, 3, 4].map(n => {
const macro = [2, 3, 4, 5, 6, 7, 8].map(n => {
if (n <= num)
return `{{attack${n}=[[1d20 + @{attack_ab} @{attack_burst} @{modifier_query}]]}} ` +
`{{damage${n}=[[@{attack_damage} @{attack_burst}]]}} `;
@@ -3429,11 +3465,15 @@
on("change:strain change:strain_permanent", validateStrain);
on("change:constitution", calculateMaxStrain);
on("change:repeating_cyberware", calculateCyberwareStrain);
on("change:strain_permanent_extra change:cyberware_strain_total", calculatePermanentStrain);
on("change:level", calculateSaves);
on([...effortAttributes, "repeating_psychic-skills:skill"].map(x => `change:${x}`).join(" "), calculateEffort);
on("change:magic_committed_effort_current change:magic_committed_effort_scene change: magic_committed_effort_day change:magic_total_effort", calculateMagicEffort);
on("change:repeating_armor change:innate_ac remove:repeating_armor", calculateAC);
on("change:strength change:repeating_gear remove:repeating_gear change:repeating_weapons " +
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+19 -1
View File
@@ -14,6 +14,7 @@
"ADD_EXTRA_SKILLS_DESC": "Adds an extendable extra skill list for custom skills.",
"ADD_LUCK_SAVE": "Add a luck save",
"ADD_LUCK_SAVE_DESC": "Add a homebrew Luck Save for those times where only pure luck can pull the character through.",
"ADEPT": "Adept",
"ADMINISTER": "Administer",
"ADRENAL_SUPPRESSION_PUMP": "Adrenal Suppression Pump",
"ADRENAL_SUPPRESSION_PUMP_DESC": "These endocrine pumps neutralize numerous brain chemicals in the user when activated while exciting the user’s perceptual centers. This combination produces a cold, dispassionate situational awareness that grants the user +2 on initiative rolls when the system is engaged. Most systems have built-in safety overrides to prevent psychological addiction and brain damage, allowing the unit to be used for no more than an hour each day. The user takes a -2 penalty on all social skill checks while the unit is active, and it requires five rounds to toggle it.",
@@ -48,6 +49,7 @@
"ANTI_VEHICLE_LASER": "Anti-Vehicle Laser",
"ANTI_VEHICLE_LASER_DESC": "Anti-vehicle lasers are less useful against soft targets, but excel at penetrating vehicle armor. Against vehicles and other hard-skinned targets, damage is rolled twice and the better result is used.",
"AP": "AP",
"ARCANIST": "Arcanist",
"ARMOR": "Armor",
"ARMORED_UNDERSUIT": "Armored Undersuit",
"ARMORED_UNDERSUIT_DESC": "An armored undersuit is a skin-tight bodysuit woven of advanced TL4 fibers with exceptional shock-activated rigidity and impact dispersion capabilities. Transparent panels allow for it to be worn with almost any outfit without drawing notice or being detected without a close tactile examination.",
@@ -79,7 +81,7 @@
"AUGMENTED_PLATING": "Augmented Plating",
"AUTHORITY": "Authority",
"AUTHORITY_DESC": "You have an uncanny kind of charisma about you, one that makes others instinctively follow your instructions and further your causes. At level 1, this is a knack of charm and personal magnetism, while level 2 might suggest latent telepathic influence or transhuman memetic hacking augmentations. Where this focus refers to followers, it means NPCs who have voluntarily chosen to be in your service. PCs never count as followers.\nLevel 1: Gain Lead as a bonus skill. Once per day, you can make a request from an NPC who is not openly hostile to you, rolling a Cha/Lead skill check at a difficulty of the NPC’s Morale score. If you succeed, they will comply with the request, provided it is not harmful or extremely uncharacteristic.\nLevel 2: Those who follow you are fired with confidence. Any NPC being directly led by you gains a Morale and hit roll bonus equal to your Lead skill and a +1 bonus on all skill checks. Your followers will not act against your interests unless under extreme pressure.",
"AUTOMATION_SUPPORT": "Automation support",
"AUTOMATION_SUPPORT": "Automation Support",
"AUTOMATION_SUPPORT_DESC": "Ship can use simple robots as crew.",
"AUTO_TARGETING_SYSTEM": "Auto-targeting system",
"AUTO_TARGETING_SYSTEM_DESC": "Fires one weapon system per round without a gunner.",
@@ -310,10 +312,13 @@
"FIELD_EQUIPMENT": "Field Equipment",
"FIELD_RADIO": "Field radio",
"FIELD_RADIO_DESC": "On worlds too primitive to have a comm grid, adventurers often fall back on these headset-mounted field radios. A single type A cell powers them for months of use. Urban or rugged terrain limits their range to about two kilometers, while flat plains give a maximum range of thirty kilometers. Someone with at least Program-0 skill can use the radio’s shortwave functionality to communicate with a prepared target at continental distances if given ten minutes for tuning.",
"FIFTH_LEVEL": "5th Level",
"FIGHT": "Fight",
"FIGHTER": "Fighter",
"FINE_NPC_WHISPERING": "Fine-grained NPC whispers",
"FINE_NPC_WHISPERING_DESC": "Show checkboxes to control public rolls vs whispering for all NPC rolls individually.",
"FIRST_EDITION": "First Edition",
"FIRST_LEVEL": "1st Level",
"FITTING": "Fitting",
"FIX": "Fix",
"FLAK": "Flak",
@@ -331,6 +336,7 @@
"FORCE_PAVIS_DESC": "Shields are an ancient yet extremely useful adjunct to body armor. Primitive shields are usually of wood or stretched hide, while more modern riot shields tend toward clear plastic. A force pavis is more effective, being a small pretech force disc projector that can absorb all manner of small arms fire. All shields require one free hand to use effectively. Shields grant a base AC to their user; 13 for primitive and riot shields, and 15 for a force pavis. If the bearer’s AC is already equal or better, the shield simply grants a +1 AC bonus. Primitive and riot shields are ignored by all weapons that ignore primitive armor. Aside from their AC benefit, a shield also renders the bearer immune to the first instance of melee Shock damage they take each round, assuming the shield is effective against the weapon being used.",
"FORCE_PUPPETRY": "Force Puppetry",
"FORCE_PUPPETRY_DESC": "As a Main Action, the telekinetic can Commit Effort for the day to suborn a visible target’s mobility, whether robotic, vehicular, or human, provided it’s no larger than a ground car. A sapient victim can make a Mental saving throw to resist the psychic onslaught; on a failure, they lose control of their physical actions. If not piloted by the telekinetic, the target remains motionless or continues on its current direction of travel. If the telekinetic spends a Main Action to control them, they can be made to perform any physical action that is not directly suicidal, using the psychic’s skill levels and hit bonus for any attacks or skill checks they might make. The puppetry lasts until the end of the scene, until the target leaves the psychic’s sight, or until a sapient target believes that their action or inaction is about to get them killed. The psychic’s control is fine enough to achieve even very delicate physical motions, but it is not good enough to control the target’s speech, though it can keep them silent.",
"FOURTH_LEVEL": "4th Level",
"FOXER_DRONES": "Foxer Drones",
"FOXER_DRONES_DESC": "+2 AC for one round when fired, Ammo 5.",
"FRACTAL_IMPACT_CHARGE": "Fractal Impact Charge",
@@ -461,6 +467,7 @@
"KINETIC_TRANSVERSAL": "Kinetic Transversal",
"KINETIC_TRANSVERSAL_DESC": "The adept may Commit Effort as an On Turn action to move freely over vertical or overhanging surfaces as if they were flat ground, crossing any solid surface strong enough to bear five kilos of weight. They can also move over liquids at their full movement rate. This movement ability lasts as long as the Effort is committed.",
"KNOW": "Know",
"KNOW_MAGIC": "Know Magic",
"LANGUAGE": "Language",
"LANGUAGES": "Languages",
"LARGE_ADVANCED_WEAPON": "Large advanced weapon",
@@ -498,6 +505,8 @@
"LUXURY_CABINS": "Luxury Cabins",
"LUXURY_CABINS_DESC": "10% of max crew get luxurious quarters.",
"MAGIC": "Magic",
"MAGIC_EFFORT": "Magic Effort",
"MAGISTER": "Magister",
"MAG_PISTOL": "Mag Pistol",
"MAG_PISTOL_DESC": "Mag weaponry involves the magnetic acceleration of metal flechettes, while spike throwers are the shotgun equivalents of these weapons. Mag ammunition is packaged with integral power supplies, so no additional power cells are necessary to fire these weapons.",
"MAG_RIFLE": "Mag Rifle",
@@ -758,6 +767,7 @@
"SCIENCE": "Science",
"SCOUT_REPORT": "Scout report",
"SCOUT_REPORT_DESC": "A collation of survey scans and merchant reports on a particular lost world or isolated colony. Scouting reports are available for all but the most unknown worlds and provide maps, basic information, and note any critical cultural taboos.",
"SECOND_LEVEL": "2nd Level",
"SECURE_CLOTHING": "Secure Clothing",
"SECURE_CLOTHING_DESC": "Secure clothing comes in assorted styles and fashions ranging from casual street wear to haute couture. Normal fabrics and components are replaced with light, flexible armor components that are only slightly hindering to the wearer. Only close tactile examination can distinguish secure clothing from ordinary couture.",
"SECURITY": "Security",
@@ -847,6 +857,7 @@
"SPEED": "Speed",
"SPELL": "Spell",
"SPELLS": "Spells",
"SPELL_SLOTS": "Spell Slots",
"SPIKE_DRIVE_2": "Drive-2 upgrade",
"SPIKE_DRIVE_2_DESC": "Upgrade a spike drive to drive-2 rating.",
"SPIKE_DRIVE_3": "Drive-3 upgrade",
@@ -909,6 +920,7 @@
"SUICIDE_CHARGE_DESC": "The drone is loaded with a demo charge as per page 69. The operator can trigger it as an attack, but unless they can move the drone in by surprise, the approach will always give onlookers a chance to spot it before it gets within range.",
"SUIT_RIPPER": "Suit ripper",
"SUIT_RIPPER_DESC": "Suit rippers are rods with fractal cutting surfaces designed to cripple vacc suit auto-repair routines. Every hit with a suit ripper counts as a suit tear on a vacc suit-wearing enemy. Unsurprisingly, these weapons are strictly illegal in space environments.",
"SUNBLADE": "Sunblade",
"SUPPRESS_COGNITION": "Suppress Cognition",
"SUPPRESS_COGNITION_DESC": "Through intense focus, the telepath can make the target of a Telepathic Contact simply not think about something, whether that’s the presence of the telepath, the possibility of committing violence, the absence of important documentation, or any other single potential action or one specific person. This technique requires the psychic to Commit Effort for the scene as a Main Action. The target gets a Mental saving throw to resist this power and become immune to it for the scene. If failed, the thought remains unthinkable for the rest of the scene unless the target perceives physical danger or a traumatic threat to something they prize highly. In that case, the block instantly dissolves and cannot be re-established during the scene. Once the effect ends, the target will remain oblivious to their temporary fugue unless it is brought to their attention somehow.",
"SURGE_MOMENTUM": "Surge Momentum",
@@ -981,6 +993,7 @@
"THERMAL_PISTOL_DESC": "Thermal pistols and their larger, two-handed plasma projector cousins replace the beam of a laser with a small sphere of magnetically-shaped plasma. The spheres tend to dissipate at much shorter ranges than a laser beam, but do significantly more damage to targets within range and are not affected by ambient particulates. They tend to be extremely loud in operation.",
"THERMOKINESIS": "Thermokinesis",
"THERMOKINESIS_DESC": "Telekinetic power involves kinetic energy, but a sufficiently sophisticated grip on motion can be used to agitate the molecules of an inanimate object and cause it to melt or burst into flame. Similar focus can chill or freeze such substances. Applying Thermokinesis to a target requires that the adept Commit Effort for the scene as a Main Action. Thermokinesis cannot affect objects larger than the adept could lift with their Telekinetic Manipulation.\nAs with other telekinetic powers, this ability does not work on objects being held or used by intelligent creatures. Non-sentient robots or other objects with hit points take 1d12 damage per level of Telekinesis skill, each time this technique is applied to them.",
"THIRD_LEVEL": "3rd Level",
"THUNDER_GUN": "Thunder Gun",
"THUNDER_GUN_DESC": "Thunder guns are named for the basso vibrations caused by their operation, a sound that can be felt as far as thirty meters away from an operator. This two-handed weapon uses grav plates to create rapid, randomized disruptions in a target that increase the chance of complete structural collapse. If a thunder gun hits a target with an unmodified hit roll of 16 or higher an extra 1d10 damage is rolled. This bonus damage always applies to inanimate targets.",
"TIGHTBEAM_LINK_UNIT": "Tightbeam link unit",
@@ -997,6 +1010,8 @@
"TOOLKIT_PRETECH_DESC": "Containing a wide range of necessary tools for a particular skill set, toolkits can handle almost any job that doesn’t require a full-scale shop or lab. A standard postech toolkit can handle electronics, small welding jobs, and basic repair on ordinary TL4 goods. More sophisticated pretech tools are necessary for working on advanced TL5 artifacts, and the tools themselves are very rare and difficult to obtain.",
"TOOLS_AND_MEDICAL": "Tools & Medical",
"TORPEDO_LAUNCHER": "Torpedo Launcher",
"TOTAL": "Total",
"TOTAL_CYBERWARE_STRAIN": "Total Cyberware Strain",
"TOXIN_INJECTOR": "Toxin Injector",
"TOXIN_INJECTOR_DESC": "The user’s canines or fingernails are altered to allow for the injection of one of two types of poison. If the user attempts to inject an unsuspecting victim they are already touching, the attempt is automatically successful. If the victim is wary or in combat, they can only be affected if they are unarmored and the user succeeds in a Punch attack roll. On a success, the victim must make a Physical saving throw at -2 or be incapacitated by the poison, dying in 1d6 rounds or being incapacitated for 1d6 hours at the user’s discretion. Each poison attack adds 2 System Strain to the user.",
"TRACTOR_BEAMS": "Tractor beams",
@@ -1010,11 +1025,13 @@
"TRANSLATOR_TORC_DESC": "Each translator torc is keyed for two languages, and will automatically translate what it hears in one into speech in the other. The translations are eccentric in many cases, and there is always a several-second delay between each statement and its translation. Any attempts to exert social skills or Charisma through a translator torc suffer a -2 skill check penalty. The torc is powered by one type A power cell, which lasts for one week of regular use.",
"TRANSMIT_THOUGHT": "Transmit Thought",
"TRANSMIT_THOUGHT_DESC": "The telepath can send thoughts and images over a Telepathic Contact, allowing two-way communication with a willing target as an Instant action when desired.",
"TRAVEL_COST": "Travel Cost",
"TSUNAMI": "Tsunami",
"TSUNAMI_DESC": "Requires Heal-1. An emergency combat stim used to juice certain expendable soldiers before an assault, Tsunami fills them with a reckless disregard for pain and an intense aggressiveness. The short effect duration and difficult application limits its wider use, however. Subjects gain a Morale score of 12, 10 extra hit points for ten minutes and a +2 bonus on all hit rolls. At the end of the duration, they immediately lose those 10 hit points, which may leave them mortally wounded. Each application adds 2 System Strain to the target.",
"TWITCHLOCK_ACTUATORS": "Twitchlock Actuators",
"TWITCHLOCK_ACTUATORS_DESC": "Neural override fibers are woven into the user’s hands and arms and linked to a perceptual modulator implanted at the base of the user’s brain stem. When presented with a direct exercise of hand-eye coordination, the twitchlock can be engaged to produce superhuman accuracy and precision. Any attack roll or skill check reliant chiefly on manual dexterity or aim can be rerolled, though the power surge inflicts two points of System Strain on the user. A given roll can only be rerolled once with this cyberware. While the twitchlock allows superhuman accuracy when engaged, the overrides fuzz ordinary nerve impulses and reduce the user’s Dexterity modifier by 1 when active. Activating or deactivating the cyberware requires a Main Action.",
"TYPE": "Type",
"TYPE_OF_MAGIC": "Type of Magic",
"UNARMED_COMBATANT": "Unarmed Combatant",
"UNARMED_COMBATANT_DESC": "Your empty hands are more dangerous than knives and guns in the grip of the less gifted. Your unarmed attacks are counted as melee weapons when it comes to binding up opponents wielding rifles and similar long arms, though you need at least one hand free to do so.\nLevel 1: Gain Punch as a bonus skill. Your unarmed attacks become more dangerous as your Punch skill increases. At level-0, they do 1d6 damage. At level-1, they do 1d8 damage. At level-2 they do 1d10, level-3 does 1d12, and level-4 does 1d12+1. At Punch-1 or better, they have the Shock quality equal to your Punch skill against AC 15 or less. While you normally add your Punch skill level to any unarmed damage, don’t add it twice to this Shock damage.\nLevel 2: You know locks and twists that use powered servos against their wearer. Your unarmed attacks count as TL4 weapons for the purpose of overcoming advanced armors. Even on a miss with a Punch attack, you do an unmodified 1d6 damage.",
"UNCOMMITTED": "Uncommitted",
@@ -1027,6 +1044,7 @@
"UNTRAINED": "Untrained",
"UNTRAINED_SKILLS_IN_QUICK_MACRO": "Show untrained skills in quick macro",
"USE_AMMO_AUTOMATICALLY": "Use ammo automatically",
"USE_MAGIC": "Use Magic",
"VACC_FRESHER": "Vacc fresher",
"VACC_FRESHER_DESC": "This three-kilo tube filters and compresses atmosphere to refill vacc suit oxygen tanks. It can extract oxygen from any atmosphere which contains it, even in the form of carbon dioxide. Refilling a standard vacc suit tank requires ten minutes of operation and consumes one type A power cell. Most vacc freshers are also equipped with an emergency hand crank power source, though it requires at least two hours of cranking.",
"VACC_SKIN": "Vacc skin",