Actor sheet v1

This commit is contained in:
LeRatierBretonnien 2022-12-30 22:27:38 +01:00
parent 83119a2b82
commit 580b044c77
13 changed files with 313 additions and 874 deletions

View File

@ -13,10 +13,10 @@ export class DarkStarsActorSheet extends ActorSheet {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["fvtt-dark-stars", "sheet", "actor"], classes: ["fvtt-dark-stars", "sheet", "actor"],
template: "systems/fvtt-dark-stars/templates/actor-sheet.hbs", template: "systems/fvtt-dark-stars/templates/actors/actor-sheet.hbs",
width: 960, width: 960,
height: 720, height: 720,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "main" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: true editScore: true
}); });
@ -35,23 +35,18 @@ export class DarkStarsActorSheet extends ActorSheet {
name: this.actor.name, name: this.actor.name,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
data: actorData, system: actorData,
limited: this.object.limited, limited: this.object.limited,
skills: this.actor.getSkills( ), skills: this.actor.getSkills( ),
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ), weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())), armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())), shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ), equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ), equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ),
equippedArmor: this.actor.getEquippedArmor(), equippedArmor: this.actor.getEquippedArmor(),
equippedShield: this.actor.getEquippedShield(), equippedShield: this.actor.getEquippedShield(),
feats: duplicate(this.actor.getFeats()),
subActors: duplicate(this.actor.getSubActors()), subActors: duplicate(this.actor.getSubActors()),
race: duplicate(this.actor.getRace()),
moneys: duplicate(this.actor.getMoneys()),
encCapacity: this.actor.getEncumbranceCapacity(), encCapacity: this.actor.getEncumbranceCapacity(),
saveRolls: this.actor.getSaveRoll(),
conditions: this.actor.getConditions(), conditions: this.actor.getConditions(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}), description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}), notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}),

View File

@ -64,26 +64,30 @@ export class DarkStarsActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
computeHitPoints() { computeHitPoints() {
if (this.type == "character") { if (this.type == "character") {
let hp = duplicate(this.system.secondary.hp)
let max = (this.system.abilities.str.value + this.system.abilities.con.value) * 6
if (max != hp.max || hp.value > max) {
hp.max = max
hp.value = max // Init case
this.update({ 'system.secondary.hp': hp })
}
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
computeEffortPoints() { computeDerivated() {
if (this.type == "character") { let attr = this.system.attributes
let effort = duplicate(this.system.secondary.effort) let deriv = this.system.derivated
let max = (this.system.abilities.con.value + this.system.abilities.int.value) * 6 let secondary = this.system.secondary
if (max != effort.max || effort.value > max) {
effort.max = max deriv.csb.value = Math.round((attr.dex.value + attr.sel.value) / 2) + deriv.csb.bonus
effort.value = max // Init case deriv.asb.value = Math.round((attr.int.value + attr.edu.value) / 2) + deriv.asb.bonus
this.update({ 'system.secondary.effort': effort }) deriv.ssb.value = Math.round((attr.cha.value + attr.emp.value + attr.att.value) / 3) + deriv.ssb.bonus
} deriv.msb.value = Math.round((attr.con.value + attr.str.value ) / 2) + deriv.msb.bonus
} deriv.psb.value = Math.round((attr.str.value + attr.dex.value + attr.con.value) / 3) + deriv.psb.bonus
deriv.ego.value = attr.str.value + attr.cha.value + attr.sel.value + attr.emp.value + deriv.ego.bonus
deriv.hup.value = (attr.emp.value * 10) + deriv.hup.bonus
deriv.ss.value = (attr.edu.value * 10) + (attr.int.value * 10) + 250 + deriv.ss.bonus
deriv.mcdb.value = Math.round( (attr.str.value + attr.siz.value) / 4) + deriv.mcdb.bonus
deriv.si.value = Math.round( ((attr.dex.value + attr.sel.value) / 5) + 0.5) + deriv.si.bonus
secondary.hp.max = ((attr.con.value + attr.siz.value ) * 2) + secondary.hp.bonus
secondary.fp.max = 10 + attr.str.value + attr.con.value + secondary.fp.bonus
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -91,6 +95,7 @@ export class DarkStarsActor extends Actor {
if (this.type == 'character' || game.user.isGM) { if (this.type == 'character' || game.user.isGM) {
this.system.encCapacity = this.getEncumbranceCapacity() this.system.encCapacity = this.getEncumbranceCapacity()
this.computeDerivated()
this.buildContainerTree() this.buildContainerTree()
this.computeHitPoints() this.computeHitPoints()
this.computeEffortPoints() this.computeEffortPoints()
@ -110,35 +115,6 @@ export class DarkStarsActor extends Actor {
return 1; return 1;
} }
/* -------------------------------------------- */
getMoneys() {
let comp = this.items.filter(item => item.type == 'money');
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getFeats() {
let comp = duplicate(this.items.filter(item => item.type == 'feat') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getFeatsWithDie() {
let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.isfeatdie) || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getFeatsWithSL() {
let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.issl) || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getLore() {
let comp = duplicate(this.items.filter(item => item.type == 'spell') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getEquippedWeapons() { getEquippedWeapons() {
let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []); let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
DarkStarsUtility.sortArrayObjectsByName(comp) DarkStarsUtility.sortArrayObjectsByName(comp)
@ -171,11 +147,6 @@ export class DarkStarsActor extends Actor {
return undefined return undefined
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getRace() {
let race = this.items.filter(item => item.type == 'race')
return race[0] ?? [];
}
/* -------------------------------------------- */
checkAndPrepareEquipment(item) { checkAndPrepareEquipment(item) {
} }
@ -208,23 +179,23 @@ export class DarkStarsActor extends Actor {
return item; return item;
} }
/* -------------------------------------------- */
updateSkill(skill) {
skill.derivated = duplicate(this.system.derivated[skill.system.base])
skill.total = skill.derivated.value + skill.system.bonus
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getSkills() { getSkills() {
this.computeDerivated()
let comp = duplicate(this.items.filter(item => item.type == 'skill') || []) let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
for (let skill of comp) { for (let skill of comp) {
DarkStarsUtility.updateSkill(skill) this.updateSkill(skill)
} }
DarkStarsUtility.sortArrayObjectsByName(comp) DarkStarsUtility.sortArrayObjectsByName(comp)
return comp return comp
} }
/* -------------------------------------------- */
getRelevantAbility(statKey) {
let comp = duplicate(this.items.filter(item => item.type == 'skill' && item.system.ability == ability) || []);
return comp;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async equipItem(itemId) { async equipItem(itemId) {
let item = this.items.find(item => item.id == itemId) let item = this.items.find(item => item.id == itemId)
@ -428,12 +399,6 @@ export class DarkStarsActor extends Actor {
await this.update({ 'system.subactors': newArray }); await this.update({ 'system.subactors': newArray });
} }
/* -------------------------------------------- */
syncRoll(rollData) {
this.lastRollId = rollData.rollId;
DarkStarsUtility.saveRollData(rollData);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getOneSkill(skillId) { getOneSkill(skillId) {
let skill = this.items.find(item => item.type == 'skill' && item.id == skillId) let skill = this.items.find(item => item.type == 'skill' && item.id == skillId)
@ -545,20 +510,8 @@ export class DarkStarsActor extends Actor {
rollData.actorImg = this.img rollData.actorImg = this.img
rollData.actorId = this.id rollData.actorId = this.id
rollData.img = this.img rollData.img = this.img
rollData.featsDie = this.getFeatsWithDie()
rollData.featsSL = this.getFeatsWithSL()
rollData.armors = this.getArmors() rollData.armors = this.getArmors()
rollData.conditions = this.getConditions() rollData.conditions = this.getConditions()
rollData.featDieName = "none"
rollData.featSLName = "none"
rollData.rollAdvantage = "none"
rollData.advantage = "none"
rollData.disadvantage = "none"
rollData.forceAdvantage = this.isForcedAdvantage()
rollData.forceDisadvantage = this.isForcedDisadvantage()
rollData.forceRollAdvantage = this.isForcedRollAdvantage()
rollData.forceRollDisadvantage = this.isForcedRollDisadvantage()
rollData.noAdvantage = this.isNoAdvantage()
if (rollData.defenderTokenId) { if (rollData.defenderTokenId) {
let defenderToken = game.canvas.tokens.get(rollData.defenderTokenId) let defenderToken = game.canvas.tokens.get(rollData.defenderTokenId)
let defender = defenderToken.actor let defender = defenderToken.actor
@ -612,10 +565,10 @@ export class DarkStarsActor extends Actor {
return return
} }
skill = duplicate(skill) skill = duplicate(skill)
DarkStarsUtility.updateSkill(skill) this.updateSkill(skill)
let abilityKey = skill.system.ability let rollData = this.getCommonRollData()
let rollData = this.getCommonRollData(abilityKey)
rollData.mode = "skill" rollData.mode = "skill"
rollData.title = "Skill " + skill.name
rollData.skill = skill rollData.skill = skill
rollData.img = skill.img rollData.img = skill.img
if (rollData.target) { if (rollData.target) {
@ -655,152 +608,8 @@ export class DarkStarsActor extends Actor {
} }
} }
/* -------------------------------------------- */
rollDefenseMelee(attackRollData) {
let weapon = this.items.get(attackRollData.defenseWeaponId)
if (weapon) {
weapon = duplicate(weapon)
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase())
if (skill) {
skill = duplicate(skill)
DarkStarsUtility.updateSkill(skill)
let abilityKey = skill.system.ability
let rollData = this.getCommonRollData(abilityKey)
rollData.defenderTokenId = undefined // Cleanup
rollData.mode = "weapondefense"
rollData.shield = this.getEquippedShield()
rollData.attackRollData = duplicate(attackRollData)
rollData.skill = skill
rollData.weapon = weapon
rollData.img = weapon.img
if (!rollData.forceDisadvantage) { // This is an attack, check if disadvantaged
rollData.forceDisadvantage = this.isDefenseDisadvantage()
}
this.startRoll(rollData)
} else {
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
}
} else {
ui.notifications.warn("Weapon not found ! ")
}
}
/* -------------------------------------------- */
rollDefenseRanged(attackRollData) {
let rollData = this.getCommonRollData()
rollData.defenderTokenId = undefined // Cleanup
rollData.mode = "rangeddefense"
if ( attackRollData) {
rollData.attackRollData = duplicate(attackRollData)
rollData.effectiveRange = DarkStarsUtility.getWeaponRange(attackRollData.weapon)
rollData.tokensDistance = attackRollData.tokensDistance // QoL copy
}
rollData.sizeDice = DarkStarsUtility.getSizeDice(this.system.biodata.size)
rollData.distanceBonusDice = 0 //Math.max(0, Math.floor((rollData.tokensDistance - rollData.effectiveRange) + 0.5))
rollData.hasCover = "none"
rollData.situational = "none"
rollData.useshield = false
rollData.shield = this.getEquippedShield()
this.startRoll(rollData)
}
/* -------------------------------------------- */
rollShieldDie() {
let shield = this.getEquippedShield()
if (shield) {
shield = duplicate(shield)
let rollData = this.getCommonRollData()
rollData.mode = "shield"
rollData.shield = shield
rollData.useshield = true
rollData.img = shield.img
this.startRoll(rollData)
}
}
/* -------------------------------------------- */
async rollArmorDie(rollData = undefined) {
let armor = this.getEquippedArmor()
if (armor) {
armor = duplicate(armor)
let reduce = 0
let multiply = 1
let disadvantage = false
let advantage = false
let messages = ["Armor applied"]
if (rollData) {
if (DarkStarsUtility.isArmorLight(armor) && DarkStarsUtility.isWeaponPenetrating(rollData.attackRollData.weapon)) {
return { armorIgnored: true, nbSuccess: 0, messages: ["Armor ignored : Penetrating weapons ignore Light Armors."] }
}
if (DarkStarsUtility.isWeaponPenetrating(rollData.attackRollData.weapon)) {
messages.push("Armor reduced by 1 (Penetrating weapon)")
reduce = 1
}
if (DarkStarsUtility.isWeaponLight(rollData.attackRollData.weapon)) {
messages.push("Armor with advantage (Light weapon)")
advantage = true
}
if (DarkStarsUtility.isWeaponHeavy(rollData.attackRollData.weapon)) {
messages.push("Armor with disadvantage (Heavy weapon)")
disadvantage = true
}
if (DarkStarsUtility.isWeaponHack(rollData.attackRollData.weapon)) {
messages.push("Armor reduced by 1 (Hack weapon)")
reduce = 1
}
if (DarkStarsUtility.isWeaponUndamaging(rollData.attackRollData.weapon)) {
messages.push("Armor multiplied by 2 (Undamaging weapon)")
multiply = 2
}
}
let diceColor = armor.system.absorprionroll
let armorResult = await DarkStarsUtility.getRollTableFromDiceColor(diceColor, false)
console.log("Armor log", armorResult)
let armorValue = Math.max(0, (Number(armorResult.text) + reduce) * multiply)
if (advantage || disadvantage) {
let armorResult2 = await DarkStarsUtility.getRollTableFromDiceColor(diceColor, false)
let armorValue2 = Math.max(0, (Number(armorResult2.text) + reduce) * multiply)
if (advantage) {
armorValue = (armorValue2 > armorValue) ? armorValue2 : armorValue
messages.push(`Armor advantage - Roll 1 = ${armorValue} - Roll 2 = ${armorValue2}`)
}
if (disadvantage) {
armorValue = (armorValue2 < armorValue) ? armorValue2 : armorValue
messages.push(`Armor disadvantage - Roll 1 = ${armorValue} - Roll 2 = ${armorValue2}`)
}
}
armorResult.armorValue = armorValue
if (!rollData) {
ChatMessage.create({ content: "Armor result : " + armorValue })
}
messages.push("Armor result : " + armorValue)
return { armorIgnored: false, nbSuccess: armorValue, rawArmor: armorResult.text, messages: messages }
}
return { armorIgnored: true, nbSuccess: 0, messages: ["No armor equipped."] }
}
/* -------------------------------------------- */
rollSave(saveKey) {
let saves = this.getSaveRoll()
let save = saves[saveKey]
if (save) {
save = duplicate(save)
let rollData = this.getCommonRollData()
rollData.mode = "save"
rollData.save = save
if (rollData.target) {
ui.notifications.warn("You are targetting a token with a save roll - Not authorized.")
return
}
this.startRoll(rollData)
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async startRoll(rollData) { async startRoll(rollData) {
this.syncRoll(rollData)
let rollDialog = await DarkStarsRollDialog.create(this, rollData) let rollDialog = await DarkStarsRollDialog.create(this, rollData)
rollDialog.render(true) rollDialog.render(true)
} }

View File

@ -3,7 +3,6 @@ export const DARKSTARS_CONFIG = {
basebonus : { basebonus : {
"csb": "CSB", "csb": "CSB",
"asb": "SSB",
"ssb": "SSB", "ssb": "SSB",
"msb": "MSB", "msb": "MSB",
"psb": "PSB", "psb": "PSB",

View File

@ -5,8 +5,8 @@ export class DarkStarsRollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, rollData) { static async create(actor, rollData) {
let options = { classes: ["DarkStarsDialog"], width: 540, height: 340, 'z-index': 99999 }; let options = { classes: ["DarkStarsDialog"], width: 320, height: 'fit-content', 'z-index': 99999 };
let html = await renderTemplate('systems/fvtt-dark-stars/templates/roll-dialog-generic.hbs', rollData); let html = await renderTemplate('systems/fvtt-dark-stars/templates/apps/roll-dialog-generic.hbs', rollData);
return new DarkStarsRollDialog(actor, rollData, html, options); return new DarkStarsRollDialog(actor, rollData, html, options);
} }
@ -58,26 +58,8 @@ export class DarkStarsRollDialog extends Dialog {
} }
$(function () { onLoad(); }); $(function () { onLoad(); });
html.find('#advantage').change((event) => { html.find('#bonusMalus').change((event) => {
this.rollData.advantage = event.currentTarget.value this.rollData.bonusMalus = Number(event.currentTarget.value)
})
html.find('#disadvantage').change((event) => {
this.rollData.disadvantage = event.currentTarget.value
})
html.find('#rollAdvantage').change((event) => {
this.rollData.rollAdvantage = event.currentTarget.value
})
html.find('#useshield').change((event) => {
this.rollData.useshield = event.currentTarget.checked
})
html.find('#hasCover').change((event) => {
this.rollData.hasCover = event.currentTarget.value
})
html.find('#situational').change((event) => {
this.rollData.situational = event.currentTarget.value
})
html.find('#distanceBonusDice').change((event) => {
this.rollData.distanceBonusDice = Number(event.currentTarget.value)
}) })
} }

View File

@ -255,170 +255,31 @@ export class DarkStarsUtility {
let actor = game.actors.get(rollData.actorId) let actor = game.actors.get(rollData.actorId)
// ability/save/size => 0 // ability/save/size => 0
let diceFormula rollData.percentValue = 0
let startFormula = "0d6cs>=5[blue]" if ( rollData.mode == "skill") {
if (rollData.ability) { rollData.percentValue = rollData.skill.total
startFormula = String(rollData.ability.value) + "d6cs>=5[blue]"
}
if (rollData.save) {
startFormula = String(rollData.save.value) + "d6cs>=5[blue]"
}
if (rollData.sizeDice) {
let nb = rollData.sizeDice.nb + rollData.distanceBonusDice + this.getDiceFromCover(rollData.hasCover) + this.getDiceFromSituational(rollData.situational)
startFormula = String(nb) + String(rollData.sizeDice.dice) + "cs>=5[blue]"
}
diceFormula = startFormula
// skill => 2
// feat => 4
// bonus => 6
if (rollData.skill) {
let level = rollData.skill.system.level
if (rollData.skill.system.issl2) {
rollData.hasSLBonus = true
level += 2
if (level > 7) { level = 7 }
}
rollData.skill.system.skilldice = __skillLevel2Dice[level]
diceFormula += "+" + String(rollData.skill.system.skilldice) + "cs>=5[black]"
if (rollData.skill.system.skilltype == "complex" && rollData.skill.system.level == 0) {
rollData.complexSkillDisadvantage = true
rollData.rollAdvantage = "roll-disadvantage"
}
if (rollData.skill.system.isfeatdie) {
rollData.hasFeatDie = true
diceFormula += "+ 1d10cs>=5[dark-stars-purple]"
} else {
diceFormula += `+ 0d10cs>=5[dark-stars-purple]`
}
if (rollData.skill.system.bonusdice != "none") {
rollData.hasBonusDice = rollData.skill.system.bonusdice
diceFormula += `+ ${rollData.hasBonusDice}cs>=5[black]`
} else {
diceFormula += `+ 0d6cs>=5[black]`
}
} else {
diceFormula += `+ 0d8cs=>5 + 0d10cs>=5 + 0d6cs>=5`
}
// advantage => 8
let advFormula = "+ 0d8cs>=5"
if (rollData.advantage == "advantage1" || rollData.forceAdvantage) {
advFormula = "+ 1d8cs>=5[dark-stars-darkgreen]"
}
if (rollData.advantage == "advantage2") {
advFormula = "+ 2d8cs>=5[dark-stars-darkgreen]"
}
diceFormula += advFormula
// disadvantage => 10
let disFormula = "- 0d8cs>=5"
if (rollData.disadvantage == "disadvantage1" || rollData.forceDisadvantage) {
disFormula = "- 1d8cs>=5[red]"
}
if (rollData.disadvantage == "disadvantage2") {
disFormula = "- 2d8cs>=5[red]"
}
diceFormula += disFormula
// armor => 12
let skillArmorPenalty = 0
for (let armor of rollData.armors) {
if (armor.system.equipped) {
skillArmorPenalty += armor.system.skillpenalty
}
}
if (rollData.skill && rollData.skill.system.armorpenalty && skillArmorPenalty > 0) {
rollData.skillArmorPenalty = skillArmorPenalty
diceFormula += `- ${skillArmorPenalty}d8cs>=5`
} else {
diceFormula += `- 0d8cs>=5`
}
// shield => 14
if (rollData.useshield && rollData.shield) {
diceFormula += "+ 1" + String(rollData.shield.system.shielddie) + "cs>=5[yellow]"
} else {
diceFormula += " + 0d6cs>=5"
} }
rollData.percentValue += rollData.bonusMalus
rollData.diceFormula = "1d100"
// Performs roll // Performs roll
console.log("Roll formula", diceFormula) console.log("Roll formula", rollData.diceFormula)
let myRoll = rollData.roll let myRoll = rollData.roll
if (!myRoll) { // New rolls only of no rerolls if (!myRoll) { // New rolls only of no rerolls
myRoll = new Roll(diceFormula).roll({ async: false }) myRoll = new Roll(rollData.diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
} }
rollData.rollOrder = 0
rollData.roll = myRoll rollData.roll = myRoll
rollData.nbSuccess = myRoll.total rollData.diceResult = myRoll.total
rollData.isSuccess = rollData.diceResult <= rollData.percentValue
rollData.isFailure = rollData.diceResult > rollData.percentValue
if (rollData.rollAdvantage == "none" && rollData.forceRollAdvantage) { let msg = await this.createChatWithRollMode(rollData.alias, {
rollData.rollAdvantage = "roll-advantage" content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-generic-result.hbs`, rollData)
}
if (rollData.rollAdvantage == "none" && rollData.forceRollDisadvantage) {
rollData.rollAdvantage = "roll-disadvantage"
}
if (rollData.rollAdvantage != "none") {
rollData.rollOrder = 1
rollData.rollType = (rollData.rollAdvantage == "roll-advantage") ? "Advantage" : "Disadvantage"
this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
}) })
rollData.rollOrder = 2
let myRoll2 = new Roll(diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll2, game.settings.get("core", "rollMode"))
rollData.roll = myRoll2 // Tmp switch to display the proper results
rollData.nbSuccess = myRoll2.total
this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
})
rollData.roll = myRoll // Revert the tmp switch
rollData.nbSuccess = myRoll.total
if (rollData.rollAdvantage == "roll-advantage") {
if (myRoll2.total > rollData.nbSuccess) {
hasChanged = true
rollData.roll = myRoll2
rollData.nbSuccess = myRoll2.total
}
} else {
if (myRoll2.total < rollData.nbSuccess) {
rollData.roll = myRoll2
rollData.nbSuccess = myRoll2.total
}
}
rollData.rollOrder = 3
}
rollData.nbSuccess = Math.max(0, rollData.nbSuccess)
rollData.isFirstRollAdvantage = false
// Manage exp
if (rollData.skill && rollData.skill.system.level > 0) {
let nbSkillSuccess = rollData.roll.terms[2].total
if (nbSkillSuccess == 0 || nbSkillSuccess == rollData.skill.system.level) {
actor.incrementSkillExp(rollData.skill.id, 1)
}
}
this.saveRollData(rollData)
actor.lastRoll = rollData
this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
})
console.log("Rolldata result", rollData) console.log("Rolldata result", rollData)
msg.setFlag("world", "roll-data", rollData)
// Message response
this.displayDefenseMessage(rollData)
// Manage defense result
this.processAttackDefense(rollData)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -512,7 +373,7 @@ export class DarkStarsUtility {
break; break;
} }
chatOptions.alias = chatOptions.alias || name; chatOptions.alias = chatOptions.alias || name;
ChatMessage.create(chatOptions); return ChatMessage.create(chatOptions);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -520,7 +381,7 @@ export class DarkStarsUtility {
let rollData = { let rollData = {
rollId: randomID(16), rollId: randomID(16),
rollMode: game.settings.get("core", "rollMode"), rollMode: game.settings.get("core", "rollMode"),
advantage: "none" bonusMalus : 0
} }
DarkStarsUtility.updateWithTarget(rollData) DarkStarsUtility.updateWithTarget(rollData)
return rollData return rollData
@ -536,7 +397,7 @@ export class DarkStarsUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static createChatWithRollMode(name, chatOptions) { static createChatWithRollMode(name, chatOptions) {
this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions) return this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -0,0 +1,86 @@
{"name":"Upgrade Tools of the Trade","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Technician","requirements":"Requires a relevant Engineering skill of 60%","xpcost":100,"cost":0,"description":"<p>An engineer can upgrade one piece of equipment per character in the group, to upgrade the equipment they must succeed in a relevant skill check. For each degree of success, the item receives one of the bonuses, bonuses do not stack +10% on skill checks with the item, +25% to structure points (SP) or armour (AP), round up, +50% more range of the item, +2 to Stealth Rating, +2 To Sensor Rating, Double to storage capacity of computer systems, +2 To Programme Strength, +20% to Firewall Strength. The upgrade can be performed again once the relevant skill of the technician has increased.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.9T7T3uEaVyxdWH3H"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672224333744,"modifiedTime":1672355593175,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"0LA7gMBDogO56AZK"}
{"name":"Mr Roboto","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":500,"cost":0,"description":"<p>Robotic and cybernetic characters can take this perk. The character now has a +20% on the number of structure points or Hit points that a robotic or cybernetic component has (round up). It only applies to components embedded in part of their body or cyber replacements parts.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.srENv7lt6bATGgi9"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353569380,"modifiedTime":1672355542183,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"10oeP0MOIcz8dyMr"}
{"name":"Medical Technician","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The character is a paramedic or doctor, a true health care professional. The character receives a +10% on all skill checks in science and medical related checks. +50 Humanity Points. Once per session the character can re-roll a failed medical check on another character. Once per session the character can heal a total of their intelligence in hit points on all the characters, they are treating dividing up their intelligence state between each of their patients. EG character with 6 Intelligence healing 2 people can heal each of them an additional 3 Hit points. These points are healed over the day and not healed instantly. Requires a medical skill of<br>40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.mlhAYRLFrXgcX8Wi"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220068919,"modifiedTime":1672355539616,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"1chLXnUgsPhV50XV"}
{"name":"Weapons Designer","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Technician","requirements":"Weapons Engineering skill of 60%","xpcost":200,"cost":0,"description":"<p>The technician can upgrade weapons or create new designs. The weapons designer can add one property per degree of success they achieve, the upgrade can only be performed on a weapon or weapon linked system. +2 damage and penetration (+20% for large military weapons like cannons), +50% to the ammunition capacity, +50% to the range of the weapon, +2 to sensor rating of the sensors.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.rZwgaZrEj2LRFpue"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672224421842,"modifiedTime":1672355597039,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"20dcF0rrpuAUHE6g"}
{"name":"Research Scientist","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Head Stooge","requirements":"one science skill 50%","xpcost":200,"cost":0,"description":"<p>The stooge knows intimately a research scientist, and that scientist can perform research tasks for the stooge. The stooge has promised them something in return and may or may not fulfil it. The scientist is motivated and if helping other characters or researching on their own provides 10% bonus to all science related skills. If using the research rules this is 2 automatic successes per month.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.9c0zzM69TiIMfAdx"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352184025,"modifiedTime":1672355561632,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"3pxRZhbGH8GROoO2"}
{"name":"Berserker","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":10,"description":"<p>A character with this perk is a berserker! Maybe it&rsquo;s their Scandinavian ancestry, or they can just get really, really angry. Once per game session (or after the GM determines enough in-game time has passed) the character may enter an enraged state. This is done as a free action and must be declared before initiative is rolled. When enraged the character literally goes berserk, tearing into enemies with the most brutal melee weapon they can get their hands on. The enraged state lasts for a number of combat rounds equal to the character&rsquo;s Constitution stat. At the end of this time, the character drops to zero Fatigue until they have rested for a significant time (up to the GM but 30-60 mins).</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.eVGZVDOG2Aee3KFj"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175662541,"modifiedTime":1672355481952,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"4CqVE4Yzgt5ZZEH3"}
{"name":"Warrior Soldier","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The character is a warrior and more skilled than other characters at combat operations. The character receives a +10% on all recon checks to spot ambushes or concealed equipment, +10% on Called Shots or Attacks, +5 Fatigue Points. Once per session the character can re-roll a failed recon check. &nbsp;Requires a combat skill of 40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.5BazvYNhaVollVkp"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672219977468,"modifiedTime":1672355595727,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"4vzWgvOfVMRalYn1"}
{"name":"Spear Master","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":1000,"cost":0,"description":"<p>Spear Masters have mastered cuts, thrusts and blocks. Spear Masters are particularly deadly closing in the opening moments of combat. Spears will have their special properties doubled. Add +2 to damage.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.oDMfgKVzlWjPaesC"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353864875,"modifiedTime":1672355569200,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"6FsoEyGjpqVPz2YL"}
{"name":"Cyber Gang","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Head Stooge","requirements":"streetwise 50%","xpcost":300,"cost":0,"description":"<p>The stooge has been supplying a cyber gang with free stuff in debiting them to the stooge.<br>They don&rsquo;t like the stooge but owe them. The stooge makes a call and a persuade check, if that<br>check succeeds 1d6 cyber gangers will arrive in 2d6 hours to assist the stooge in whatever enterprise they have.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.9Ll1L9PtEzfMoE9Q"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352086849,"modifiedTime":1672355488296,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"7T2lI6xo821zeAeP"}
{"name":"Fan Rage","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Celebrity","requirements":"50% in one performance skill","xpcost":100,"cost":0,"description":"<p>The celebrity has inspired their fans to attack a company, individual or political group or even boycott that group. For all intents and purpose the fans will cause a ruckus and at least are very distracting. Its every likely that the issue will be discussed in the popular spheres of news. The&nbsp;<br>gm must decide what this does for the players benefit but at the very least it should bring attention to the issues. Mechanically for each degree of success the organisation will receive a global penalty of 5% per degree of success to all their tasks as fans sabotage their operations. For each degree of success this activity will continue for 1 week.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.KvZHroToAnDx5aIW"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672226287149,"modifiedTime":1672355499978,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"8A8b7kReRGV9bCC0"}
{"name":"Natural Pilot","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":200,"cost":0,"description":"<p>Your character is highly attuned to driving and controlling vehicles. All Pilot skills gain a +10% bonus.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.7il0tv3FPe36iC2w"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353350004,"modifiedTime":1672355547039,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"9LzjO8uycbp9WexV"}
{"name":"Non-Lethal Expert","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Enforcer","requirements":"50% unarmed, melee or weapon skill","xpcost":100,"cost":0,"description":"<p>The enforcer has learned to get more nonlethal effect from their non-lethal weapons. These weapons add +2 to penetration and add an extra 2d6 fatigue points of damage. This can include unarmed attacks.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.oJQEqIi7HArZk2rB"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351399763,"modifiedTime":1672355548087,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"9t50XDpgg2dZpaFY"}
{"name":"Contacts in high places","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Stringer","requirements":"50% Social and Style","xpcost":200,"cost":0,"description":"<p>The stringer has contacts that can assist them, perhaps law enforcement, government, corporations, syndicate members or military. The contact can help the stringer in any way they can. This is a more powerful perk than the contacts perk and can only be used once per Scenario. The GM will need to decide what the contact can do, but it could be arrange passage out of a warzone, begin legal proceedings against a corporation, give the stringer 10,000 credits.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.VT6i6kolHJCQu75a"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351621771,"modifiedTime":1672355486151,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"B2OjSQd9vK3tsDLI"}
{"name":"Fire Discipline","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"Ballistics skill of 50 or more","xpcost":100,"cost":0,"description":"<p>When you receive a command from a leader who spent an action issuing the command and directing fire, then provided that leader has the Let&rsquo;s Rock perk or the Leader perk, you receive a bonus on 10% on your next Ballistics check.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.cxhRTVKlmvOUHpuG"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354623274,"modifiedTime":1672355511822,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"B8Mhgv9oeWHd7wkG"}
{"name":"Resources","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":300,"cost":0,"description":"<p>This perk allows the character to amass a series of lines of credit, revenue, favours and good will. You can make a Persuasion or Manipulation roll to immediately amass an amount of cash that can be collected from any major bank. For every 10% the character makes their skill check by, the character amasses 3,000 credits that can be immediately used. You don&rsquo;t even have to pay it back. This can be done once per session and every time the perk is used successfully there is a 20% chance that those avenues of resources have dried up; the character loses this perk. The perk can be repurchased any time it is lost by spending the XP again.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.TDLGq2a8TG7zKxDf"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354024819,"modifiedTime":1672355562840,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"CNnuJwSUyfRpko2S"}
{"name":"Multi Skilled","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":200,"cost":0,"description":"<p>The character can select a second role and acquire those second set of perks. The character will have to pay 20% more experience for Perks in the second role.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.0LAHp36U3Tpkj1j6"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354694114,"modifiedTime":1672355544873,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"CufMdkFOPEIMPSOl"}
{"name":"Technician","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The character is a technician and is able to design and repair all sorts of gadgets. Most engineers have a speciality field, weapons, cybernetics, electronics etc. All technicians receive one re-roll per session on a failed repair attempt. All technicians receive a +10% to all engineering and science skills except medicine, surgery, first aid, psychiatry, and pharmacology.</p>\n<p>Once per session the technician can repair a completely broken component by jury rigging<br>it, this will add a temporary 4d6 Structure point, this repair will last until the next scene.<br>Requires an engineering or science skill of 40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.Z0t7eFFVK1NIhK2y"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220148447,"modifiedTime":1672355578720,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"DYFsikJWxjrVOf6N"}
{"name":"Get to the Chopper","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"Starting Initiative of 3 or less","xpcost":100,"cost":0,"description":"<p>Even though your character is slow on their reflexes, when you hear commands from leaders, you react faster. If your character receives a command that they want to react to, regardless of the leadership qualities of that character, you can take your next action immediately after that command. Your initiative order stays the same, but you take your next action sooner or later and perform the action. This can only be performed once per round, and the &ldquo;leader&rdquo; character must have used an action to issue the command.</p>\n<p>Example: Brink has the perk Get to the Chopper. Wilmer issues a command on action 24, for everyone to take cover behind the wall. Brink can now move his action on 12 to 23 and<br>use that to take cover.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.Z02xElfWh1A5BuBl"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354269627,"modifiedTime":1672355513768,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"FKdhowXqf1yH3GsW"}
{"name":"Combat Medic","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Medical Technician","requirements":"Requires First Aid 50%","xpcost":200,"cost":0,"description":"<p>The character is used to performing under fire and getting their team back in the fight. The character can spend 1 or more actions to perform first aid and battlefield surgery. The character makes a medical check, and for each degree of success may spend 1 action treating the patient. The medic will instantly heal 1d3 Hit points per action spent.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.ox2rNWmf2jKYKTBk"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672223509693,"modifiedTime":1672355483944,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"G2fnx4Xr8BylrtJS"}
{"name":"Powerful footage","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Stringer","requirements":"Art Film, language 50%","xpcost":200,"cost":0,"description":"<p>The stringer presents information in such a way that the entire group receives a bonus to their persuade checks. For each degree of success the stringers composition adds 10% to all social checks of the characters for the scene.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.5zacbKu8nY5UiZRF"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351710247,"modifiedTime":1672355550303,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"GHhjLSFS7FTd3fSj"}
{"name":"Master Of Weapons","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":800,"cost":0,"description":"<p>Any weapon the character uses will have its special properties doubled. Ranged weapons will have their effective range increased: Close to Short, Short to Medium, and Medium to Long. Any other weapon without a special property will receive +2 bonus to Penetration.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.PsKG66u8SlJDIz6z"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353757075,"modifiedTime":1672355538552,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"Hfl4G5tTuG3CUh3G"}
{"name":"Tough-Minded","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":30,"description":"<p>Mind control doesn&rsquo;t work too well on you. In fact, normal people can&rsquo;t even hypnotise you. Attempts at mind control on you suffer an additional 40% penalty.<br><br>30 SS cost</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.P2EAh9Zthx8E6iTM"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672109836110,"modifiedTime":1672355587568,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"HsAGgMseZMPoydb7"}
{"name":"Trauma Specialist","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Medical Technician","requirements":"Requires Medicine 50%","xpcost":200,"cost":0,"description":"<p>The character receives a re-roll on all attempts to stabilise a dying patient. If the patient suffered hit point loss from bleeding that damage is all automatically recovered.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.o3d4AiZ7h4i0ZqNy"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672222875444,"modifiedTime":1672355589792,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"Jj2ejcHHwOJYVI9H"}
{"name":"Grease Monkey Vehicle","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Technician","requirements":"Related Engineering skill of 60%","xpcost":300,"cost":0,"description":"<p>The technician is able to fix repair and modify vehicles like no one else. For each degree of success the grease monkey can repair 20% of the structure of the vehicle per 1 hour of work. If modifying a vehicle the grease monkey can add the following upgrades one per degree of success. +20% to fuel capacity or operation time, +25% to top speed, +25% power generation, +25% to available spaces<br>by more efficiently using space and combining components, in vehicles with no spaces left the vehicle receives 25% of its base spaces as free space to add new components.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.1zdpal8OOZcz114F"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225016241,"modifiedTime":1672355514824,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"L2qCQyJsYCW4yyDw"}
{"name":"Let's Rock","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"Starting Initiative of 4 or greater","xpcost":400,"cost":0,"description":"<p>This is a leadership perk for characters with either Persuasion and Manipulation or the Professional skills Military Tactics or Battle Tactics. This character is defined as the leader. The leader can trade their own actions to one or more characters. If they fail their roll however they lose the action they attempted the roll on and cannot trade any actions. On the first round of combat, the leader can make a skill check on the relevant skill to trade their actions to another character. A character can only receive one action in this way and the leader who trades their action will lose that action from the next action they take. One action plus another action can be traded per degree of success; this must be traded to a character who has not already received a traded action. The character who receives the traded action will then take that action in the next initiative segment after the leader&rsquo;s first action. The leader may perform Let&rsquo;s Rock alongside another action by receiving -20% on both actions (as per the normal rules for taking multiple actions).</p>\n<p><br>Example: Jacks uses Let&rsquo;s Rock on her Battle Tactics check. She rolls 24 for Initiative and has 4&nbsp; actions, and Tom and Linda have two actions each. Their two actions start on 14 and 12&nbsp; espectively. On action 24 Jacks uses Let&rsquo;s Rock, while also shooting with her Squad Automatic weapon. Her Battle Tactics is 80%, and her Ballistics Weapons is 80%, but she receives -20% on both skills. She rolls 4% on Ballistics Weapons and 40% on Battle Tactics. This gives her two&nbsp; degrees of success, and she will lose her next two actions, as two actions were traded to the other characters. (Jacks could have traded three actions total, losing three actions.) As she shot her weapon on thefirst action, that is not considered lost. Each character will have their new traded action immediately after the Battle Tactics and Ballistic Weapons checks, in this example action 23. The other characters then take that free action.&nbsp;</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.nBTHDJ9CSAKqEmDa"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354098844,"modifiedTime":1672355531159,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"MHGTHoscqACAThpT"}
{"name":"The Blue Fury","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Enforcer","requirements":"50% in persuade skill","xpcost":300,"cost":0,"description":"<p>The character first makes a persuade check, telling their law enforcement contacts that they need backup and assistance. The character can summon a horde of police from their contacts, police will cross jurisdictional lines to assist the character arriving as quickly as their vehicles can carry them. For each degree of success 1d6 law enforcement or security guards will descend on the characters location. This will be a very flashy arrival with sirens blaring and blue lights flashing. The police will then assist the character for however many scenes requires the crime to be resolved.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.99R3lYVOTA51piFg"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351235822,"modifiedTime":1672355580879,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"MYwpEBGq42EEDxIB"}
{"name":"Stamina","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":100,"cost":0,"description":"<p>This perk grants the character a bonus of 10 points to their Fatigue points total. This perk may be taken up to three times.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.akeE7DYXKKaZ1IY0"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353531092,"modifiedTime":1672355570111,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"NUPwbemn6IHjiB3j"}
{"name":"Lowlife Connections","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Fixer","requirements":"streetwise 60%","xpcost":100,"cost":0,"description":"<p>The fixer has focused themselves on connecting with the criminals of society. In any criminal interaction or skill check the fixer receives a re-roll if the action is not going the fixers way. For example extorting some shop keepers, the fixer gets a re-roll because of the criminal connections. The fixer can also send these criminal connections to act on their behalf, and they too will receive a re-roll on the given skill. Once per session the fixer can call in cash favours by making a persuade check. They then will receive 1,000CR per degree of success.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.GrLY5pkUKcZJYbrA"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352402989,"modifiedTime":1672355534001,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"PITT5ybwaeN3I2VW"}
{"name":"Fang it!","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Road Warrior","requirements":"Pilot or Driving skill of 60%","xpcost":100,"cost":0,"description":"<p>The character can increase the top speed of the vehicle by pushing the vehicle beyond its design limits. The engine plus one component will suffer 1d6 per round of damage from the excessive use but the top speed is increased by 50%. This bonus stacks with all other speed bonuses.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.DnbSyfvfHDsGJCgI"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225247665,"modifiedTime":1672355510520,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"PT8tRuZs8wq2RWLg"}
{"name":"Therapy","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Medical Technician","requirements":"psychiatry and pharmacology 50%","xpcost":200,"cost":0,"description":"<p>The character can perform therapy along with the use of specific drugs (costing 100 credits per session) to restore humanity to characters that have lost humanity. Each week the character makes a check on their psychiatry, for each degree of success the patient gains 1d3 humanity. The character is never cured of their insanities, but they learn to live with them.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.BIKmhzNci6c400om"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672223388590,"modifiedTime":1672355583231,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"RfXUzc4pS6cQAegd"}
{"name":"Street Fighter","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Warrior Soldier","requirements":"","xpcost":200,"cost":0,"description":"<p>The character is skilled at brawling and street fighting. When facing multiple opponents, the bonus opponents receive from ganging up is reduced by 10% if the character has 50% or more in melee or unarmed combat, 20% if they have 70% or more in melee or unarmed combat and 40% if they have 80% or more.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.cGsAOX9ih3E1BPSA"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672221653110,"modifiedTime":1672355571144,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"S8MjwSmWq1KgVOh9"}
{"name":"Quick on the Draw","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Warrior Soldier","requirements":"","xpcost":200,"cost":0,"description":"<p>The character is fast to act, they roll their normal starting initiative but add an additional d6+2 to the first action, making that action carry forward in the turn order but still taking their second action as it normally would be taken.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.hNvG9jwPxYlZH9Q9"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672221560476,"modifiedTime":1672355553954,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"SmSbd0kTEIsZqxrR"}
{"name":"Luck Of The Leprechaun","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":10,"description":"<p>You get 1 re-roll of any test you make per session. Once used, you must wait for the next game session to use it again. This affects only skill and attribute checks.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.BwKEUssx3VjRgPDn"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175922559,"modifiedTime":1672355535536,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"UnTUIGtB6nVgLRhn"}
{"name":"Dolla Dolla bills Yall","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Celebrity","requirements":"Requires 50% in one performance skill","xpcost":200,"cost":0,"description":"<p>The character can extract royalties from advertisers or other stooges who like their stuff. They make a persuade check and for each degree of success, receive 1,000 credits in royalty payments, these are sent immediately and thus many potential earnings are lost but they money arrives that day. After these bills are extracted, the Celebrity will need to produce a new work to use this perk again.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.jOHFJtauteWfKO4x"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672226489173,"modifiedTime":1672355491576,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"YDiTFpUIHI5rEwU6"}
{"name":"Armour Affinity","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":400,"cost":0,"description":"<p>The character is used to using armour to its maximum potential. The character can add 10%<br>more armour (round up) to their AP ratings for any armour the character is using. This is only applied to personal armour, and cannot be used with power armour, force fields or vehicles with<br>armour.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.A5EK2oSJaIko8Dv3"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353121661,"modifiedTime":1672355478241,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"YrVss2CRpVAj1QSv"}
{"name":"Road Warrior","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The character comes from some gang of nomadic vehicle using people. They can count on their clan to assist them. The character is also an amazing pilot or driver. Chose a given pilot skill and the character receives one free re-roll per session using that skill. The character also adds +10% to that skill as a bonus to all rolls.</p>\n<p><br>The character suffers half the normal penalties from performing multiple actions in their given vehicle example if they are on a motor cycle and jumping over a car while shooting a pistol this<br>is normally -20%, however for this character is only -10%. Road warriors can also perform an evasion or dodge using their vehicles, by using an action they can dodge an incoming attack requiring the same or more degrees of success to dodge as the attacker had.</p>\n<p>Requires an piloting skill or driving of 40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.T7ydlgx8hjEU9fnE"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220380805,"modifiedTime":1672355564896,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"YyBN60duFwWHgZ7w"}
{"name":"Distracting Performance","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Celebrity","requirements":"50% in one performance skill","xpcost":390,"cost":0,"description":"<p>The character can use their performance skill to distract NPCs. The character makes a performance check and for each degree of success each viewer, watcher or listener of the performance will need to make a self-control check. If the NPC fails the check they will lose 1 action per degree of success of the Celebrity or will receive a penalty of 10% per degree of success if combat has not begun to their next skill check.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.x3yFdnC7RSR3zxFc"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672226168813,"modifiedTime":1672355490360,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ZBkzmLxS8rGQEMey"}
{"name":"Fixer","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The fixer is a criminal or quasi legal person who solves problems, often using contacts and other means. All fixers have multiple networks and contacts, on any given streetwise check the fixer receives +10%. On opposed persuade or intimidation checks the fixer receives +1 automatic success. Once per session the fixer can re-roll a failed streetwise, persuade or intimidation check.<br>Streetwise 40% and Pursuade 40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.8sI1IK9ZzLKc3cnP"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220854620,"modifiedTime":1672355512785,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ZVyuECQjkD4WDZN9"}
{"name":"Drug Specialist","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Medical Technician","requirements":"Chemistry or Pharmacology 40%","xpcost":200,"cost":0,"description":"<p>The character can make a successful pharmaceutical roll to reduce the addictiveness of a drug being administered by them.&nbsp;</p>\n<p>Characters receiving the drug roll twice for addition and take the most favourable result.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.wqf86rDLNZJCRpub"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672222640304,"modifiedTime":1672355492736,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"a4XJyiqtrlBtgWZc"}
{"name":"Leader","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>Your character is a born leader. When issuing commands which can work with other leadership perks, you can make a skill check associated with that command. If you succeed on that skill check then for each two degrees of success you will provide a bonus of 5% to the characters performing actions relating to that command. If used in long running tasks this counts as 1 degree of success per two degrees of success on your check. Skills which can work with leadership include: Profession Military Forces, Profession Corporate Officer, Profession Science Officer, Military Tactics, Battle Tactics, any Engineering or Science skill, Persuasion and Manipulation, plus any other skills the GM determines. In a given round there can only be one leader issuing commands, but multiple leaders may try. The first leader to issue a command is the leader for all bonuses that round. In long running tasks multiple leaders may issue commands but the players and the GM can choose how these bonuses may be allocated.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.fiYcViRevcQJvOwX"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672176193476,"modifiedTime":1672355529664,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"aTQkUuhATyT4k1N0"}
{"name":"Evasive Driving","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Road Warrior","requirements":"Pilot or Driving skill of 50%","xpcost":200,"cost":0,"description":"<p>When being chased the character receives an additional +10% to their pilot or driving checks, and if there is an opposed roll, they receive an automatic extra success. Each round the character can make one evasive action at no action cost.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.eP2XaLtQPKfEw1l4"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225160705,"modifiedTime":1672355496305,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ahcNDD0R4VLR3zSO"}
{"name":"Stubborn","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Warrior Soldier","requirements":"","xpcost":100,"cost":0,"description":"<p>The character has a never give up or never say die attitude, receives a +2 to self-control checks regarding suppressive fire, checks when combat starts in the event of ambush, once per day the character can recover 1d6 Hit Points.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.IGwmHbVkdWNayjEg"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220960693,"modifiedTime":1672355573536,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"bYCdwZdADnndaIDt"}
{"name":"Ground Work","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Hacker","requirements":"Persuade 50%","xpcost":200,"cost":0,"description":"<p>You have already laid out a series of social engineering attacks on your given target or know someone who did. When attacking that given target all your programs receive +2 to their strength, you also get one re-roll on a run against a physical facilities intrusion counter measure.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.8FMQ4OnK6NuZkTtx"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225902194,"modifiedTime":1672355515800,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"e6D0WO3pTGKbJR8M"}
{"name":"Improvised Weapons","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":200,"cost":0,"description":"<p>Any item can be used as a weapon. Improvised Weapons allows the character to pick up and use or throw any object as an improvised weapon to greater effect. These objects will inflict between 1d6 and 2d6 plus MCDB, or half MCDB if thrown with larger objects causing more damage.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.wbJczfXVZQyZXtzo"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353215453,"modifiedTime":1672355522392,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ecKx5H9Zh80PRtFu"}
{"name":"Influence","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":600,"cost":0,"description":"<p>This perk enables a character to gain influence in either a corporation or government branch.<br>This influence can be used to acquire goods, services, resources or other components that the organisation is able to provide.</p>\n<p><br>A normal Persuasion or Manipulation roll is required. If successful, the organisation will attempt to give you what you ask for. The Game Master must decide if this can happen or not, and the Game Master&rsquo;s decisions are final. However, this perk allows you to exert influence remotely via net, letter, fax, phone or face-toface communications.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.x85cjiN1km9mCA7N"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353961385,"modifiedTime":1672355523377,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"fLpYB8rMnvXFtmNL"}
{"name":"Dirt","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Stringer","requirements":"","xpcost":100,"cost":0,"description":"<p>The character has some piece of dirt on a given NPC. By making a verbal threat against the person the stringer unbalances the NPC. The stringer makes an opposed manipulation check to coerce or blackmail the NPC if the stringer wins this test. Then that NPC will receive a -20% to all actions for the scene as they are so disturbed about the information getting out. The Stringer can change the NPC once per week.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.VAuElPlqlS9EdSz4"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351556106,"modifiedTime":1672355489384,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"gB4bhgty4vBYxoZD"}
{"name":"Natural Aptitude","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":20,"description":"<p>You have a natural aptitude for a non combat skill. You receive a 20% bonus on any checks with the skill, once per game week you can reroll one failed check on that skill.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.DqAGwLpowUl7z1t7"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175591382,"modifiedTime":1672355546033,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"gbmVPOxEfqGZFhTb"}
{"name":"Tell me the truth","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Stringer","requirements":"50% persuade and manipulate","xpcost":100,"cost":0,"description":"<p>The stringer compels or tricks the truth out of an interview subject. This can be on air or not.<br>The stringer makes a persuade check the subject makes a self-control check. For each degree of success the stringer got, the subject of the interview receives a -1 to their self-control stat for the self-control check.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.mW4yXJQNaoSnYf5V"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351786648,"modifiedTime":1672355579903,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"gnxr6jGPAyhNyyj1"}
{"name":"Profession Specialty","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":100,"cost":0,"description":"<p>You have a special understanding of one of your skills. Choose a Science, Engineering, Piloting or Professional skill and get +10% bonus on one aspect, for example Alchemy. You can also use the Profession Specialty on Farming and Herding. The bonus is only applied to that aspect of the skill.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.bYGg7iMOrb666qMZ"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353436620,"modifiedTime":1672355552616,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"hpxHz33Rr7i0lVvu"}
{"name":"Secret Paths, Secret Lines","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Hacker","requirements":"Programming or Computer Operation 50%","xpcost":300,"cost":0,"description":"<p>You know some special ways around the network and reduce the penalties for latency and distance by half.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.KgjdSoLbxOQgqvdU"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225980910,"modifiedTime":1672355567295,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"i0LROD5jLN8CzwXJ"}
{"name":"Syndicate Favours","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Fixer","requirements":"","xpcost":500,"cost":0,"description":"<p>Your character is owed favours from a crime syndicate or cyber criminal organisation. Once per month you can call in that favour. This could either be a syndicate hit man, who can take out a target for you, a group 2d6 of syndicate enforcers to do some work for you in the street, or even a syndicate laboratory and scientist who could concoct a batch of undetectable drugs. The monetary value of the favour should not exceed the characters charisma x 10 x 1d6 x 1,000 credits.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.7zViYasde34EmuWv"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352950109,"modifiedTime":1672355577551,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"iNjU7NDXaXVzhaBu"}
{"name":"Latin connections","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Fixer","requirements":"70% streetwise skill","xpcost":100,"cost":0,"description":"<p>The fixer can get all manner of illegal substances. The fixer pays 20% less than the going market rate for any item, any drug any supply.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.8q1BSL8552ihER6u"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352900374,"modifiedTime":1672355528631,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"kDmdYzCpPdENIX4q"}
{"name":"Ace Gunner","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":400,"cost":0,"description":"<p>Using the main gun of the vehicle you are in has become your specialty. Once per session you can use the main gun of your vehicle and perform an automatic armour penetrating hit. The main gun has double penetration and deals 50% more damage in a single attack.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.hcDCkCaU9aHHYuNq"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353023438,"modifiedTime":1672355475736,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"kj0YkRUBYhnH1esi"}
{"name":"Rapid Manufacturing","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Head Stooge","requirements":"one engineering skill 50%","xpcost":200,"cost":0,"description":"<p>The stooge knows people who own factories and can get any item made but for double the cost. This can be illegal items, weapons, spaceships you name it. The product will be made within half the normal time of manufacture of 1 month which ever is lower. Typical items take 1 or 2 days to manufacture, large items like spaceships take 2 months to a year.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.p7wAh6Nyxj3ozC4S"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352258580,"modifiedTime":1672355560504,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"l6DVDxGHMbEVO4uB"}
{"name":"Torpedo","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Fixer","requirements":"Streetwise 70%","xpcost":200,"cost":0,"description":"<p>The fixer has required a loyal torpedo to strong arm others, protect them and act as body guard. This is another character and is more loyal than a gun or thug for higher. The torpedo will give their life to save the fixer, if they do so the fixer will lose this perk and must purchase it again.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.1yAvLoM4mSzDmvoO"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352581293,"modifiedTime":1672355586297,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"lC0bd0CT8PDsxbHi"}
{"name":"Midnight Run","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Road Warrior","requirements":"","xpcost":300,"cost":0,"description":"<p>If the character is trying to evade authorities or break through blockades or just trying to lay<br>low in a city and perform errands or deliveries, the character will receive an increase of 4 to the<br>stealth rating of their vehicle by using terrain features or just planning and luck. They move<br>through the city over passes and highways like ghosts on the winds. If detected by law enforcement, the receive an extra action at the start of the round make a run for it.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.dUy03epB4asSXmu6"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225555247,"modifiedTime":1672355541073,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"lkhFJbwGI4H9235u"}
{"name":"Efficient compilation","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Hacker","requirements":"Programming 70%","xpcost":400,"cost":0,"description":"<p>All programs you create require 50% storage space on you cyber deck or computer.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.d4BMIAXxboaFuDfG"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672226049122,"modifiedTime":1672355493720,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"m3S03Bzxfy5uJGhV"}
{"name":"Enforcer","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The enforcer is a peace officer, security guard or professional investigator. The enforcer has<br>contacts, informants and generally is well connected in law enforcement of their city/region. Some enforcers work for governments and maybe have global connections.<br>Once per scene an Enforcer can perform an authoritative command, they could order a criminal to put their hands up and surrender, order a citizen out of a car so they can commandeer it, order other law enforcement officers to perform actions. Authoritative command requires the&nbsp; opponents of the enforcer to make self-control check, if they fail they will follow the command for the scene. The Enforcer makes a persuade check and receives a +10% to that check. For each degree of success, the opponents of the command will receive a -1 to their self-control check to resist the command. <br><br>40% in persuade skill</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.XBtssWAGShE0YDNx"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220617908,"modifiedTime":1672355495000,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nBFtWz9kn5tOfFu1"}
{"name":"Unnatural Health","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":40,"description":"<p>This perk provides resistance to disease and poison. The character suffers 50% less damage to Fatigue, Hit points, Humanity or Essence from poisons and diseases. They also receive -2 on any attribute checks to resist poisons or diseases.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.WrIziSiyUHTWtF9X"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175817509,"modifiedTime":1672355591958,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nBfZfXLJzJSl0vTX"}
{"name":"Fame","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":200,"cost":0,"description":"<p>This perk enables a character to gain national fame and/or notoriety. It provides +10% bonus<br>to all social rolls to anyone who cares about your fame. Game master discretion is to be used<br>to determine if the NPC does care.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.jYTfVXVeDzurjErd"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353312645,"modifiedTime":1672355498392,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nTQTmsmC1J0UWynZ"}
{"name":"What, This? This Is Nothing!","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":40,"description":"<p>It takes a lot to kill you. You can literally keep fighting even with missing limbs. You suffer no ill effects (except not having that limb, and Movement penalties) from losing an arm or leg. Even if you lose two or more limbs, as long as you still have general Hit points, you&rsquo;re alive and active. You never fall unconscious for having zero Fatigue. General Hit points must be negative before you die. You also don&rsquo;t bleed out like normal people do.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.FVPt4J5wgnLZjKhm"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672176141140,"modifiedTime":1672355598360,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nkKiYkpWTYXEX3iU"}
{"name":"Informants","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Enforcer","requirements":"50% Streetwise skill","xpcost":100,"cost":0,"description":"<p>The enforcer has a network of criminal informants, and these informants give them a detailed understanding of the criminal happenings within a city or other location. The informants provide information to the enforcer in exchange for the enforcer mostly looking the other way. If the enforcer fails on a street wise check, they automatically can re-roll with a +20% bonus by contacting an informant. If the enforcer wishes to question the informant and the informant has detailed information, they will automatically spill the beans to the enforcer.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.7nedTX53nCxj41ZE"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351316602,"modifiedTime":1672355524440,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nwJ7K5OLe5XdFt7R"}
{"name":"Villain","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":5,"description":"<p>You&rsquo;re scary as hell and twice as mean. People see you as a threat to their lives. Gain 10% bonus to Manipulation or Persuasion through fear and intimidation.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.vGF6R8KUUqGi5oNA"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672176105285,"modifiedTime":1672355594504,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"nyA0xQopfGDmpeeu"}
{"name":"Fanatical Fans","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Celebrity","requirements":"50% in one performance skill","xpcost":200,"cost":0,"description":"<p>The celebrity has a group of fanatical fans that will if contacted show up and help the celebrity. These fans will be armed with typical pistols and knives and may have armour. To convince the fans to help, including dangerous tasks the celebrity needs to make a persuade check, for each degree of success 1d6 fans will arrive within 1d3 hours to help.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.kfS6amLHeLHrXSEr"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672226394853,"modifiedTime":1672355502583,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"o3EOQk7C4YO5OTz8"}
{"name":"I've Seen Things...","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":30,"description":"<p>You have seen so much that you may have been hospitalised in the past but now you&rsquo;re better. You suffer half the normal detachment from traumatic events. You gain a 40% bonus on any EGO and Self-Control tests for fear or panic.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.zhmbb9zfMIPd1gvo"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175544519,"modifiedTime":1672355521287,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"o7WzVc8el1urZYVs"}
{"name":"Last Word","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"Starting Initiative of 3 or less","xpcost":100,"cost":0,"description":"<p>A character with this perk will always get an action at the end of a combat round after all other characters have completed all their actions. If multiple characters in the scene have this ability then resolve them as per normal for characters acting in the same initiative rank. This essentially adds an initiative rank at zero after the round has counted down to rank 1. If a character with this perk increases their SI above 3, then they lose this ability until such time as their SI is once more 3 or less. This includes the SI penalty for wearing bulky armour. If as a result of the penalty their SI<br>is reduced to 3 or less then they can use this ability.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.yzy3qI0bvFPXr53K"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354378556,"modifiedTime":1672355527536,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"okR24CxN7Z9LqBqv"}
{"name":"Akimbo","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Warrior Soldier","requirements":"","xpcost":200,"cost":0,"description":"<p>The character suffers only half penalties for firing weapons from both hands.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.FdYmBz0G5MWNFNCO"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672221053821,"modifiedTime":1672355476815,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"qVz6KUaJhgmgYm7l"}
{"name":"Insider Trading","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Head Stooge","requirements":"","xpcost":100,"cost":0,"description":"<p>On any given finance check the stooge has inside information. This could enable them to receive a re-roll on a failed finance check or stock market trade, have some extra information about a facility or even have someone on the inside of an opposing facility working for them. The gm must decide the outcome of using this perk. This perk can be used once per session.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.x1sHpg2NKY4T3QYW"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351877786,"modifiedTime":1672355526384,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"qxGAX8oVXpINNNIk"}
{"name":"The Chinese Cyber Shark from Shanghai","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Hacker","requirements":"Computer use or Programming 60%","xpcost":200,"cost":0,"description":"<p>Somehow you have access to some hardcore military code, and if you use that code to make programs that attack other programs, they turn out way more dangerous. All kill type programmes built will receive +1d6 damage per degree of success, this damage is added to the normal damage the program does. To create the programme create it as per the normal rules.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.ga30zB8NBRP2iOqV"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225755791,"modifiedTime":1672355581975,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"sV0veGRmmy59ntpp"}
{"name":"Hero","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":5,"description":"<p>You are a heroic character; people are inspired by you and will generally try to help you. If you behave like a villain, you lose this perk. Gain +10% to Persuasion checks with anyone you&rsquo;re trying to gain assistance from or inspire.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.goH5qlIVUfXxr7gW"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175871988,"modifiedTime":1672355519152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"tNSu6fcGDNYhvRYX"}
{"name":"Stringer","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>This character works for some sort of media outfit or even a covert information gathering operation. They are skilled at finding information and presenting it to achieve a response. Reporters have informants and contacts, and generally can find people who don&rsquo;t want to be found.</p>\n<p>Once per session stringers can make an inquiry about a specific piece of information which is not generally known check using either persuade, computer use or street wise, the stringer will receive +20% on this check. For each degree of success, they receive an additional piece of information. Information flow, the stringer is also able to securely send that information to the right relevant people at the right time. This will give the group +20% on all social checks with that person. The Truth, if a Stringer tells the truth to a group of people through any means either<br>broadcast or simply speaking the stringer can influence those peoples actions. Its up to the GM how this can affect the viewers, either they rage or feel better or panic.&nbsp;</p>\n<p>Requires 40% in persuade skill and either language or art film</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.Ee5BbPKeiGexNNO3"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220703420,"modifiedTime":1672355572159,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"tVl3m66PdpV68hhe"}
{"name":"Partner","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Enforcer","requirements":"","xpcost":200,"cost":0,"description":"<p>The enforcer has a side kick partner, this is another security guard or piece officer who will help them and stick with them through whatever trials. This partner cannot be another Enforcer.<br>The partner will improve with time aquiring new items and perks, GM should decide which upgrades the partner has aquired.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.GhfjxFVf5j6kwixH"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672351465378,"modifiedTime":1672355549152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"tW4k6XEkieu0JqQd"}
{"name":"Toughness","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":10,"description":"<p>You are tougher than most, even if you are of small stature. Gain 10 HP. This perk may be taken twice.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.SG5pJ0poepiB6BSh"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672176011164,"modifiedTime":1672355588656,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"tlJreO61x21lnibw"}
{"name":"Hacker","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>The hacker in dark stars is a computer technician, intrusion and security specialist. All hackers receive +10% on their hacking and programming checks. Hackers also suffer half EGO damage from all cyber attacks against their EGO. Once per session hackers can re-roll damage on a single programs damage. <br><br>Requires Computer Use 40%</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.zCs6BlwG6s75slhi"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220486117,"modifiedTime":1672355516785,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"u09QIcbtcSF2mvFK"}
{"name":"Contact","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":50,"cost":0,"description":"<p>Contacts are game master-generated NPC characters that can be useful to you. They will try to help you with information and may, on a successful Persuasion roll, provide some assistance; however, this assistance is personal and cannot be organisation-based (that&rsquo;s Influence). Contacts can be of any type and are usually knowledgeable. The contact typically has a 50% skill rating in their field.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.v8YRvRWtrCsR2zV0"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353269828,"modifiedTime":1672355485135,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"u4AlTW262KRzzqhp"}
{"name":"Shield Master","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":1000,"cost":0,"description":"<p>Shield Masters are often the centre of any defence or attack, using the shield not only to deflect blows but also disable weapons. Shield Masters can parry two opponents per round instead of one, making them formidable solo combatants. Shields will have their special properties doubled.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.zIDpS9Bl4xlXTkWY"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353816021,"modifiedTime":1672355568192,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"uNgVai3tdLgGJDVe"}
{"name":"Axe Master","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":600,"cost":0,"description":"<p>Masters of the Axe know how to get the most out of the weapon and are so skilled that they can bypass armour better than their less skilled counterparts. Axes will have their special properties doubled. Add an additional +2 to penetration.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.4bWCIbqZNXq7F0Dc"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353672493,"modifiedTime":1672355480760,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ugN44JQlrG4HWF1d"}
{"name":"Master Marksman","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":null,"cost":0,"description":"<p>With keen eyes and expert aim, Master Marksmen are deadly on the battlefield or especially in ambush. Halve the penalties from called shots using ranged weapons. +2 to damage and penetration using called shots.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.xtJw8aCdG0xj0oq5"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353709436,"modifiedTime":1672355537544,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"vjPDplg5oqjBgckC"}
{"name":"Extensive Contacts","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Fixer","requirements":"50% Persuade Skill","xpcost":100,"cost":0,"description":"<p>For each contact purchased with experience, a second contact is acquired for free. This simulates the fixers networking abilities who knows why the contacts help the fixer maybe they have some dirt on them but its never out of the goodness of the heart. This second contact may turn on them if treated badly.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.KihdnnjW02G7nwHc"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672352800510,"modifiedTime":1672355497264,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"xGDZGLXdLd30PKWK"}
{"name":"Rich","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":40,"description":"<p>You are wealthy, well connected and have a position in a corporation. This can never be taken away from you except in extreme circumstances. You have 1d100 x 1d10 credits per month. The credits will accumulate in a safe account.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.LHPDLu3nY5LJpde7"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672175964638,"modifiedTime":1672355563871,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"xPAhA5blFf1nw2xb"}
{"name":"I got friends","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Road Warrior","requirements":"Pilot/Driving and Persuade of 40%","xpcost":200,"cost":0,"description":"<p>The character can make a successful persuade check and can summon a group of other runners/drivers/pilots/gangers to help with some task. For each degree of success 1d6 additional<br>people will arrive and if only 1 success is achieved 1 person will arrive with their vehicle and weapons. These people are like family to the character and members of their vehicle clan/gang. For each degree of success, the friends will help for 1 week.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.MewvFhwQ3awq36va"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672225326901,"modifiedTime":1672355520225,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"xQBjSCMXfYPTn6gD"}
{"name":"Two-Fisted","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":20,"description":"<p>You have the natural ability to use both hands. This reduces the penalty for using two weapons or any task using both hands to -10% instead of -20%.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.And3B0fW4GUChqTq"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672176054637,"modifiedTime":1672355590929,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"xlZ0QCsNG9mB6i9d"}
{"name":"Sword Master","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":800,"cost":0,"description":"<p>Sword Masters have become adept at one handed and two-handed fighting with swords. They can consequently use these weapons better and get more benefit from special properties and receive a free parry action with the sword once per round. Swords will have their special properties doubled. +10% to parrying with the sword and one free parry per round.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.bBdVRclvy6rDbBgN"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672353919924,"modifiedTime":1672355574953,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"y340VAyWceyZfvHK"}
{"name":"Practiced Scavenger","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"advanced","role":"","requirements":"","xpcost":250,"cost":0,"description":"<p>The character knows about certain terrain types, i.e. where to find the best ammo, chips,<br>scrap, hiding places or resources and materials for their crafting skills. This perk may be taken<br>more than once. The following list of terrains can be learned by the character, although you<br>could expand this: Junk Yard, Wasteland, The Old World, Oceans, and Rad Zones, Wastes.<br>Whenever the character fails a Navigation, Survival or foraging related craft (Engineering,<br>Scavenging, Hacking) skill check once per session they can receive an automatic re-roll on the skill check. The character must take the result of this check.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.SG6YSWePxEmKoP2f"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672354543865,"modifiedTime":1672355551376,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"ydWo02hjIx4wm1mY"}
{"name":"Cyber Designer","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"role","role":"Technician","requirements":"Cybernetics Design or Cybernetics Engineering skill of 60%","xpcost":300,"cost":0,"description":"<p>An engineer who specialises in cybernetics, they can create new designs or modify cybernetics. Either reducing the humanity loss by 10% per degree of success with a minimum of 1 point per dice of humanity the component/upgrade requires. Or Improving the durability of the component by 10% (+10% to SP per degree of success). Or Extending its capability by combining two components for example combining the thermographic and targeting components allow that upgrade to a cybernetic eye to only take 1<br>option space.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.6JI8xTBNoTqcRSSD"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672224518971,"modifiedTime":1672355487280,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"zRE7pBw0rov4qwhA"}
{"name":"Celebrity","type":"perk","img":"systems/fvtt-dark-stars/images/icons/perk.webp","system":{"perktype":"normal","role":"","requirements":"","xpcost":0,"cost":50,"description":"<p>This character is a celebrity, either they perform music, create performance art of some kind, and inspire the masses. They probably already have a body of work. Inspire to action. Should the character wish to get their fands to perform a task, they can inspire their fans with a performance. The character receives a +10% to any performance where they wish to influence people. The<br>following persuade check will receive a bonus of 10% per degree of success the performance received. Celebrities also can receive a re-roll once per session which can be used on any failed roll.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.IrI3xInQi7THinHw"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.9","coreVersion":"10.291","createdTime":1672220555574,"modifiedTime":1672355482968,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"zwZoHMkWYtMCNx9f"}

View File

@ -238,14 +238,15 @@ table {border: 1px solid #7a7971;}
.fvtt-dark-stars .sheet-header .profile-img { .fvtt-dark-stars .sheet-header .profile-img {
-webkit-box-flex: 0; -webkit-box-flex: 0;
-ms-flex: 0 0 128px; -ms-flex: 0 0 96px;
flex: 0 0 128px; flex: 0 0 96px;
width: 196px; width: 96px;
height: auto; height: auto;
max-height:260px; max-height:96px;
margin-top: 0px; margin-top: 0px;
margin-right: 10px; margin-right: 10px;
object-fit: cover; object-fit: cover;
border-width: 0px;
object-position: 50% 0; object-position: 50% 0;
} }
@ -569,7 +570,7 @@ ul, li {
} }
.list-item-shadow { .list-item-shadow {
background:rgba(87, 60, 32, 0.35); background:rgba(87, 60, 32, 0.35);
flex-grow: 0; /*flex-grow: 0;*/
flex-wrap: nowrap; flex-wrap: nowrap;
justify-content: flex-start; justify-content: flex-start;
} }
@ -1488,6 +1489,12 @@ Focus FOC: #ff0084
max-width: 14rem; max-width: 14rem;
min-width: 14rem; min-width: 14rem;
} }
.item-field-label-vlong2 {
flex-grow:1;
margin-top: 4px;
max-width: 22rem;
min-width: 22rem;
}
.item-control-end { .item-control-end {
align-self: flex-end; align-self: flex-end;
} }

View File

@ -1,60 +0,0 @@
{{!-- Carac Tab --}}
<div class="tab items" data-group="primary" data-tab="statistics">
<div class="grid grid-2col">
<div class="">
<div class="flexrow">
<span class="generic-label packed-left"><a class="generic-pool-roll"><button class="chat-card-button">Dice Pool</button></a></span>
</div>
</div>
<div class="">
<ul>
<li class="item flexrow list-item" data-key="momentum">
<span class="stat-label flexrow" name="momentum"> <h4>{{data.momentum.label}}</h4> </span>
<input type="text" class="padd-right" name="data.momentum.value" value="{{data.momentum.value}}" data-dtype="Number"/>
<input type="text" class="padd-right" name="data.momentum.max" value="{{data.momentum.max}}" data-dtype="Number"/>
</li>
</ul>
</div>
</div>
</div>
<ul>
<li class="item flexrow list-item" data-key="mr">
<span class="stat-label flexrow" name="mr">
<a class="roll-mr" data-stat-key="{{mr}}"><h4>{{data.mr.label}}</h4></a>
</span>
<select class="carac-base flexrow" type="text" name="data.mr.value" value="{{data.mr.value}}"
data-dtype="Number" >
{{#select data.mr.value}}
{{{@root.optionsDiceList}}}
{{/select}}
</select>
<input type="text" class="padd-right input-numeric-short" name="data.mr.mod" value="{{data.mr.mod}}" data-dtype="Number"/>
</li>
</ul>
<li class="item flexrow list-item" data-attr-key="{{key}}">
{{#each data.secondary as |stat2 key|}}
{{#if stat2.iscombat}}
<span class="stat-label" name="{{key}}">
<h4>{{stat2.label}} : </h4>
</span>
<span class="small-label padd-right packed-left">Cur</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.secondary.{{key}}.value" value="{{stat2.value}}" data-dtype="Number"/>
<span class="small-label padd-right packed-left">&nbsp;Max</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.secondary.{{key}}.max" value="{{stat2.max}}" data-dtype="Number"/>
{{/if}}
{{/each}}
</li>
<li class="item flexrow list-item" data-key="momentum">
<span class="stat-label flexrow" name="momentum"><h4>{{data.momentum.label}}:</h4></span>
<span class="small-label padd-right packed-left">Cur</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.momentum.value" value="{{data.momentum.value}}" data-dtype="Number"/>
<span class="small-label padd-right packed-left">&nbsp;Max</span><input type="text" class="padd-right update-field input-numeric-short" data-field-name="data.momentum.max" value="{{data.momentum.max}}" data-dtype="Number"/>
</li>

View File

@ -100,7 +100,7 @@
"styles": [ "styles": [
"styles/simple.css" "styles/simple.css"
], ],
"version": "10.0.9", "version": "10.0.12",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "10", "verified": "10",
@ -108,7 +108,7 @@
}, },
"title": "Dark Stars RPG", "title": "Dark Stars RPG",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-dark-stars/raw/branch/main/system.json", "manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-dark-stars/raw/branch/main/system.json",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-dark-stars/archive/fvtt-dark-stars-v10.0.9.zip", "download": "https://www.uberwald.me/gitea/uberwald/fvtt-dark-stars/archive/fvtt-dark-stars-v10.0.12.zip",
"url": "https://www.uberwald.me/gitea/uberwald/", "url": "https://www.uberwald.me/gitea/uberwald/",
"background": "images/ui/dark_stars_welcome_page.webp", "background": "images/ui/dark_stars_welcome_page.webp",
"id": "fvtt-dark-stars" "id": "fvtt-dark-stars"

View File

@ -46,105 +46,117 @@
"str": { "str": {
"label": "Strength", "label": "Strength",
"abbrev": "str", "abbrev": "str",
"col": 1, "value": 0
"value": 0,
"bonusname": "CSB",
"base": 0,
"bonus": 0
}, },
"dex": { "dex": {
"label": "Dexterity", "label": "Dexterity",
"abbrev": "dex", "abbrev": "dex",
"col": 1, "value": 0
"value": 0,
"bonusname": "ASB",
"base": 0,
"bonus": 0
}, },
"con": { "con": {
"label": "Constitution", "label": "Constitution",
"abbrev": "con", "abbrev": "con",
"col": 1, "value": 0
"value": 0,
"bonusname": "SSB",
"base": 0,
"bonus": 0
}, },
"siz": { "siz": {
"label": "Size", "label": "Size",
"abbrev": "siz", "abbrev": "siz",
"col": 2, "value": 0
"value": 0,
"bonusname": "MSB",
"base": 0,
"bonus": 0
}, },
"att": { "att": {
"label": "Attractiveness", "label": "Attractiveness",
"abbrev": "att", "abbrev": "att",
"col": 2, "value": 0
"value": 0,
"bonusname": "PSB",
"base": 0,
"bonus": 0
}, },
"int": { "int": {
"label": "Intelligence", "label": "Intelligence",
"abbrev": "int", "abbrev": "int",
"col": 2, "value": 0
"value": 0,
"derivname": "EGO",
"derivvalue": 0,
"base": 0
}, },
"edu": { "edu": {
"label": "Education", "label": "Education",
"abbrev": "edu", "abbrev": "edu",
"col": 2, "value": 0
"value": 0,
"derivname": "HUP",
"base": 0,
"derivvalue": 0
}, },
"cha": { "cha": {
"label": "Charisma", "label": "Charisma",
"abbrev": "cha", "abbrev": "cha",
"col": 2, "value": 0
"value": 0,
"derivname": "SS",
"base": 0,
"derivvalue": 0
}, },
"emp": { "emp": {
"label": "Empathy", "label": "Empathy",
"abbrev": "edu", "abbrev": "emp",
"col": 2, "value": 0
"value": 0,
"derivname": "MCDB",
"base": 0,
"derivvalue": 0
}, },
"sel": { "sel": {
"label": "Self-Control", "label": "Self-Control",
"abbrev": "sel", "abbrev": "sel",
"col": 2, "value": 0
}
},
"derivated": {
"csb": {
"label": "CSB",
"value": 0, "value": 0,
"derivname": "SI", "bonus": 0
"base": 0, },
"derivvalue": 0 "asb": {
"label": "ASB",
"value": 0,
"bonus": 0
},
"ssb": {
"label": "SSB",
"value": 0,
"bonus": 0
},
"msb": {
"label": "MSB",
"value": 0,
"bonus": 0
},
"psb": {
"label": "PSB",
"value": 0,
"bonus": 0
},
"ego": {
"label": "EGO",
"value": 0,
"bonus": 0
},
"hup": {
"label": "HUP",
"value": 0,
"bonus": 0
},
"ss": {
"label": "SS",
"value": 0,
"bonus": 0
},
"mcdb": {
"label": "MCDB",
"value": 0,
"bonus": 0
},
"si": {
"label": "SI",
"value": 0,
"bonus": 0
} }
}, },
"secondary": { "secondary": {
"hp": { "hp": {
"label": "Hitpoint", "label": "Hitpoints",
"abbrev": "hp", "abbrev": "hp",
"value": 0, "value": 0,
"bonus": 0, "bonus": 0,
"max": 0 "max": 0
}, },
"lp": { "fp": {
"label": "Hitpoint", "label": "Fatigue Points",
"abbrev": "lp", "abbrev": "fp",
"value": 0, "value": 0,
"bonus": 0, "bonus": 0,
"max": 0 "max": 0
@ -152,6 +164,7 @@
"bulk": { "bulk": {
"label": "Bulk", "label": "Bulk",
"abbrev": "bulk", "abbrev": "bulk",
"maxeditable": true,
"value": 0, "value": 0,
"bonus": 0, "bonus": 0,
"max": 0 "max": 0

View File

@ -3,77 +3,10 @@
{{!-- Sheet Header --}} {{!-- Sheet Header --}}
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="flexrow"> <div class="flexrow">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="flexcol"> <div class="flexcol">
<h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="flexrow">
<div class="ability-item">
<ul>
{{#each data.abilities as |ability key|}}
{{#if (eq ability.col 1)}}
{{> systems/fvtt-crucible-rpg/templates/partial-actor-ability-block.html ability=ability key=key}}
{{/if}}
{{/each}}
</ul>
<li class="item flexrow list-item" data-attr-key="class">
<span class="ability-label " name="class">
<h4 class="ability-text-white ability-margin">Class</h4>
</span>
<select class="competence-base flexrow" type="text" name="system.biodata.class" value="{{data.biodata.class}}" data-dtype="String">
{{#select data.biodata.class}}
<option value="chaplain">Chaplain</option>
<option value="magus">Magus</option>
<option value="martial">Martial</option>
<option value="skalawag">Skalawag</option>
<option value="warden">Warden</option>
{{/select}}
</select>
</li>
</div>
<div class="ability-item">
<ul>
{{#each data.abilities as |ability key|}}
{{#if (eq ability.col 2)}}
{{> systems/fvtt-crucible-rpg/templates/partial-actor-ability-block.html ability=ability key=key}}
{{/if}}
{{/each}}
{{#if equippedArmor}}
<li class="item flexrow list-item" data-attr-key="class">
<img class="sheet-competence-img" src="{{equippedArmor.img}}" />
<span class="ability-label " name="class">
<h4 class="ability-text-white ability-margin"><a class="roll-armor-die ability-margin">{{equippedArmor.name}}</a></h4>
</span>
</li>
{{/if}}
{{#if equippedShield}}
<li class="item flexrow list-item" data-attr-key="class">
<img class="sheet-competence-img" src="{{equippedShield.img}}" />
<span class="ability-label " name="equippedShield">
<h4 class="ability-text-white ability-margin"><a class="roll-shield-die ability-margin">{{equippedShield.name}}</a></h4>
</span>
</li>
{{/if}}
<li class="item flexrow list-item" data-attr-key="class">
<img class="sheet-competence-img" src="systems/fvtt-crucible-rpg/images/icons/feats/Marksman (Ballistic).webp" />
<span class="ability-label " name="rollTarget">
<h4 class="ability-text-white ability-margin"><a class="roll-target-die ability-margin">Target Roll</a></h4>
</span>
</li>
</ul>
</div>
<div class="ability-item status-block">
{{> systems/fvtt-crucible-rpg/templates/partial-actor-status.html}}
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -81,9 +14,9 @@
{{!-- Sheet Tab Navigation --}} {{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="main">Main</a>
<a class="item" data-tab="skills">Skills</a> <a class="item" data-tab="skills">Skills</a>
<a class="item" data-tab="combat">Combat</a> <a class="item" data-tab="combat">Combat</a>
<a class="item" data-tab="lore">Lore</a>
<a class="item" data-tab="equipment">Equipment</a> <a class="item" data-tab="equipment">Equipment</a>
<a class="item" data-tab="biodata">Biography</a> <a class="item" data-tab="biodata">Biography</a>
</nav> </nav>
@ -92,38 +25,83 @@
<section class="sheet-body"> <section class="sheet-body">
{{!-- Skills Tab --}} {{!-- Skills Tab --}}
<div class="tab skills" data-group="primary" data-tab="skills"> <div class="tab main" data-group="primary" data-tab="main">
<div class="flexrow">
<ul class="stat-list alternate-list item-list">
{{#each system.attributes as |attr key|}}
<li class="item stat flexrow list-item list-item-shadow">
<label class="item-field-label-medium">{{attr.label}}</label>
<input type="text" class="item-field-label-short padd-right" name="system.attributes.{{key}}.value" value="{{attr.value}}" data-dtype="Number"/>
{{/each}}
</li>
</ul>
<ul class="stat-list alternate-list item-list"> <ul class="stat-list alternate-list item-list">
{{#each system.derivated as |deriv key|}}
<li class="item stat flexrow list-item list-item-shadow">
<label class="item-field-label-medium">{{deriv.label}}</label>
<label class="item-field-label-short">{{deriv.value}}</label>
<input type="text" class="item-field-label-short padd-right" name="system.derivated.{{key}}.bonus" value="{{deriv.bonus}}" data-dtype="Number"/>
{{/each}}
</li>
</ul>
<ul class="stat-list alternate-list item-list">
{{#each system.secondary as |second key|}}
<li class="item stat flexrow list-item list-item-shadow">
<label class="item-field-label-medium">{{second.label}}</label>
<input type="text" class="item-field-label-short padd-right" name="system.secondary.{{key}}.value" value="{{second.value}}" data-dtype="Number"/>
{{#if second.maxeditable}}
<label class="item-field-label-short">&nbsp;/&nbsp;</label>
<input type="text" class="item-field-label-short padd-right" name="system.secondary.{{key}}.max" value="{{second.max}}" data-dtype="Number"/>
{{else}}
<label class="item-field-label-short">&nbsp;/&nbsp;{{second.max}}</label>
{{/if}}
<input type="text" class="item-field-label-short padd-right" name="system.secondary.{{key}}.bonus" value="{{second.bonus}}" data-dtype="Number"/>
{{/each}}
</li>
</ul>
</div>
</div>
{{!-- Skills Tab --}}
<div class="tab skills" data-group="primary" data-tab="skills">
<ul class="alternate-list item-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header"> <span class="item-name-label-header-long2">
<h3><label class="items-title-text">Skills</label></h3> <h3><label class="items-title-text">Skills</label></h3>
</span> </span>
<span class="item-field-label-short">
<label class="short-label">Ability</label>
</span>
<span class="item-field-label-short">
<label class="short-label">Dice</label>
</span>
<span class="item-field-label-long"> <span class="item-field-label-long">
<label class="short-label">Background</label> <label class="short-label">Derivated</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">Bonus</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">Total</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">&nbsp;</label>
</span> </span>
</li> </li>
{{#each skills as |skill key|}} {{#each skills as |skill key|}}
<li class="item stat flexrow list-item list-item-shadow" data-item-id="{{skill._id}}"> <li class="item flexrow list-item list-item-shadow" data-item-id="{{skill._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{skill.img}}" />
src="{{skill.img}}" /></a> </a>
<span class="item-name-label"><a class="roll-skill">{{skill.name}}</a></span> <span class="item-field-label-vlong2"><a class="roll-skill">{{skill.name}}</a></span>
<span class="item-field-label-short">{{upper skill.system.ability}}</span> <span class="item-field-label-long">{{skill.derivated.label}} ({{skill.derivated.value}})</span>
<span class="item-field-label-short">{{skill.system.skilldice}}</span> <span class="item-field-label-medium">{{skill.system.bonus}}</span>
<span class="item-field-label-long">&nbsp;-&nbsp;</span> <span class="item-field-label-medium">{{skill.total}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
</div> </div>
{{!-- Combat Tab --}} {{!-- Combat Tab --}}

View File

@ -8,68 +8,6 @@
<div class="flexcol"> <div class="flexcol">
{{#if sizeDice}}
<div class="flexrow">
<span class="roll-dialog-label">Size basic dices : </span>
<span class="roll-dialog-label">{{sizeDice.nb}}{{sizeDice.dice}}</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Distance bonus dice(s) : </span>
<select class="status-small-label color-class-common" type="text" id="distanceBonusDice" value="{{distanceBonusDice}}" data-dtype="String" >
{{#select distanceBonusDice}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
{{/if}}
{{#if hasCover}}
<div class="flexrow">
<span class="roll-dialog-label">Cover : </span>
<select class="status-small-label color-class-common" type="text" id="hasCover" value="{{hasCover}}" data-dtype="String" >
{{#select hasCover}}
<option value="none">None</option>
<option value="cover50">Cover at 50% (+1 dice)</option>
{{/select}}
</select>
</div>
{{/if}}
{{#if situational}}
<div class="flexrow">
<span class="roll-dialog-label">Situational : </span>
<select class="status-small-label color-class-common" type="text" id="situational" value="{{situational}}" data-dtype="String" >
{{#select situational}}
<option value="none">None</option>
<option value="dodge">Dodge (+1 dice)</option>
<option value="prone">Prone (+1 dice)</option>
<option value="moving">Moving (+1 dice)</option>
<option value="Engaged">Engaged (+1 dice)</option>
{{/select}}
</select>
</div>
{{/if}}
{{#if save}}
<div class="flexrow">
<span class="roll-dialog-label">{{save.label}} : </span>
<span class="roll-dialog-label">{{save.value}}d6</span>
</div>
{{/if}}
{{#if ability}}
<div class="flexrow">
<span class="roll-dialog-label">Ability : </span>
<span class="roll-dialog-label">{{ability.value}}d6</span>
</div>
{{/if}}
{{#if weapon}} {{#if weapon}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Weapon : </span> <span class="roll-dialog-label">Weapon : </span>
@ -77,91 +15,29 @@
</div> </div>
{{/if}} {{/if}}
{{#if shield}}
<div class="flexrow">
<span class="roll-dialog-label">Use shield ? : </span>
<span class="roll-dialog-label"><input type="checkbox" id="useshield" name="useshield" {{checked useshield}}/></span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">{{shield.name}} : </span>
<span class="roll-dialog-label">{{shield.data.shielddie}}</span>
</div>
{{/if}}
{{#if skill}} {{#if skill}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Skill : </span> <span class="roll-dialog-label">Skill : </span>
<span class="roll-dialog-label">{{skill.name}} - {{skill.data.skilldice}}</span> <span class="roll-dialog-label">{{skill.name}} ( {{skill.total}}% )</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Feature die or SL+2? : </span>
<span class="roll-dialog-label">{{#if skill.data.isfeatdie}} Yes {{else}} No {{/if}}</span>
</div> </div>
{{/if}} {{/if}}
{{#if noAdvantage}}
<div>
<span class="roll-dialog-label">No advantage due to condition : {{noAdvantage.name}}</span>
</div>
{{else}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Advantage : </span> <span class="roll-dialog-label">Bonus/Malus : </span>
<select class="status-small-label color-class-common" type="text" id="advantage" value="{{advantage}}" data-dtype="String" > <select class="status-small-label color-class-common" type="text" id="bonusMalus" value="{{bonusMalus}}" data-dtype="Number" >
{{#select advantage}} {{#select bonusMalus}}
<option value="none">None</option> <option value="-40">-40%</option>
<option value="advantage1">1 Advantage</option> <option value="-30">-30%</option>
<option value="advantage2">2 Advantages</option> <option value="-20">-20%</option>
<option value="-10">-10%</option>
<option value="0">0%</option>
<option value="+10">+10%</option>
<option value="+20">+20%</option>
<option value="+30">+30%</option>
<option value="+40">+40%</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">Disadvantage : </span>
<select class="status-small-label color-class-common" type="text" id="disadvantage" value="{{disadvantage}}" data-dtype="String" >
{{#select disadvantage}}
<option value="none">None</option>
<option value="disadvantage1">1 Disadvantage</option>
<option value="disadvantage2">2 Disadvantages</option>
{{/select}}
</select>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Roll with Advantage/Disadvantage : </span>
<select class="status-small-label color-class-common" type="text" id="rollAdvantage" value="{{rollAdvantage}}" data-dtype="String" >
{{#select rollAdvantage}}
<option value="none">None</option>
<option value="roll-advantage">Roll with Advantage</option>
<option value="roll-disadvantage">Roll with Disadvantage</option>
{{/select}}
</select>
</div>
{{#if forceAdvantage}}
<div class="flexrow">
<span class="roll-dialog-label">1 Advantage from condition : {{forceAdvantage.name}}
{{#if advantageFromTarget}} (Provided by targetted actor) {{/if}}
</span>
</div>
{{/if}}
{{#if forceDisadvantage}}
<div class="flexrow">
<span class="roll-dialog-label">1 Disadvantage from condition : {{forceDisadvantage.name}} </span>
</div>
{{/if}}
{{#if forceRollAdvantage}}
<div class="flexrow">
<span class="roll-dialog-label">Roll Advantage from condition : {{forceRollAdvantage.name}} </span>
</div>
{{/if}}
{{#if forceRollDisadvantage}}
<div class="flexrow">
<span class="roll-dialog-label">Roll Disadvantage from condition : {{forceRollDisadvantage.name}} </span>
</div>
{{/if}}
</div> </div>
</form> </form>

View File

@ -18,128 +18,21 @@
<div> <div>
<ul> <ul>
{{#if (eq rollOrder 1)}}
<li><strong>Roll with {{rollType}} - Roll 1</strong></li>
{{/if}}
{{#if (eq rollOrder 2)}}
<li><strong>Roll with {{rollType}} - Roll 2</strong></li>
{{/if}}
{{#if (eq rollOrder 3)}}
<li><strong>Roll with {{rollType}} - Final result !</strong></li>
{{/if}}
{{#if save}}
<li>Save : {{save.label}} - {{save.value}}d6
({{#each roll.terms.0.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if sizeDice}}
<li>Size/Range/Cover/Situational dices
({{#each roll.terms.0.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if ability}}
<li>Ability : {{ability.label}} - {{ability.value}}d6
({{#each roll.terms.0.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if skill}} {{#if skill}}
<li>Skill : {{skill.name}} - {{skill.data.skilldice}} <li>Skill : {{skill.name}} ({{skill.total}}%)
{{#if featSL}}
- with Feat SL +{{featSL}}
{{/if}}
&nbsp;({{#each roll.terms.2.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li> </li>
{{/if}} {{/if}}
<li>Bonus/Malus: {{bonusMalus}}%
</li>
<li> Result: {{diceResult}}
</li>
{{#if noAdvantage}} {{#if isSuccess}}
<li>No advantage due to condition : {{noAdvantage.name}}</li> <li><strong>Success !</strong></li>
{{else}} {{else}}
{{#if (or (eq advantage "advantage1") forceAdvantage)}} <li><strong>Failure ...</strong></li>
<li>1 Advantage Die !
&nbsp;({{#each roll.terms.8.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}} {{/if}}
{{#if (eq advantage "advantage2") }}
<li>2 Advantage Dice !
&nbsp;({{#each roll.terms.8.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{/if}}
{{#if (or (eq disadvantage "disadvantage1") forceDisadvantage)}}
<li>1 Disadvantage Die !
&nbsp;({{#each roll.terms.10.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if (eq disadvantage "disadvantage2")}}
<li>2 Disadvantage Dice !
&nbsp;({{#each roll.terms.10.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if (eq rollAdvantage "roll-advantage")}}
<li>Roll with Advantage !</li>
{{/if}}
{{#if (eq rollAdvantage "roll-disadvantage")}}
<li>Roll with Disadvantage !</li>
{{/if}}
{{#if skillArmorPenalty}}
<li>Armor Penalty : {{skillArmorPenalty}} Disadvantage Dice
&nbsp;({{#each roll.terms.12.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if hasBonusDice}}
<li>Skill bonus dice : {{hasBonusDice}}
&nbsp;({{#each roll.terms.6.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if complexSkillDisadvantage}}
<li>Roll with Disadvantage because of Complex Skill at SL 0 !</li>
{{/if}}
{{#if hasFeatDie}}
<li>Feat Die : d10
&nbsp;({{#each roll.terms.4.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
{{#if useshield}}
<li>Shield : {{shield.name}} - {{shield.data.shielddie}}
({{#each roll.terms.14.results as |die idx|}}
{{die.result}}&nbsp;
{{/each}})
</li>
{{/if}}
<li><strong>Number of successes</strong> {{nbSuccess}} </li>
<!-- <button class="chat-card-button reroll-level-remaining" data-roll-id="{{rollId}}">Reroll</button> --> <!-- <button class="chat-card-button reroll-level-remaining" data-roll-id="{{rollId}}">Reroll</button> -->