Compare commits

...

12 Commits

34 changed files with 1724 additions and 561 deletions

View File

@ -44,8 +44,8 @@ export class Hero6ActorSheet extends ActorSheet {
powers: await this.actor.getPowers( ), powers: await this.actor.getPowers( ),
talents: this.actor.getTalents( ), talents: this.actor.getTalents( ),
complications: this.actor.getComplications( ), complications: this.actor.getComplications( ),
martialarts: this.actor.getMartialArts( ),
maneuvers: this.actor.getManeuvers( ), maneuvers: this.actor.getManeuvers( ),
nonstockmaneuvers: this.actor.getNonStockManeuvers(),
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())),
@ -66,6 +66,7 @@ export class Hero6ActorSheet extends ActorSheet {
notes5: await TextEditor.enrichHTML(this.object.system.biodata.notes5, {async: true}), notes5: await TextEditor.enrichHTML(this.object.system.biodata.notes5, {async: true}),
containersTree: this.actor.containersTree, containersTree: this.actor.containersTree,
encCurrent: this.actor.encCurrent, encCurrent: this.actor.encCurrent,
totalValue: this.actor.totalValue,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
editScore: this.options.editScore, editScore: this.options.editScore,
@ -152,10 +153,14 @@ export class Hero6ActorSheet extends ActorSheet {
const characKey = $(event.currentTarget).data("charac-key"); const characKey = $(event.currentTarget).data("charac-key");
this.actor.rollCharac(characKey); this.actor.rollCharac(characKey);
}); });
html.find('.roll-perception').click((event) => {
this.actor.rollPerception("int");
});
html.find('.roll-direct').click((event) => { html.find('.roll-direct').click((event) => {
const rollFormula = $(event.currentTarget).data("roll-formula"); const rollFormula = $(event.currentTarget).data("roll-formula")
let roll = new Roll(rollFormula).roll({async: false}) const rollSource = $(event.currentTarget).data("roll-source")
roll.toMessage() Hero6Utility.processDirectRoll( { actorId: this.actor.id, rollFormula: rollFormula, rollSource: rollSource, mode:"directroll"} )
}); });
html.find('.roll-item').click((event) => { html.find('.roll-item').click((event) => {
@ -163,13 +168,30 @@ export class Hero6ActorSheet extends ActorSheet {
let itemId = li.data("item-id") let itemId = li.data("item-id")
this.actor.rollItem(itemId); this.actor.rollItem(itemId);
}); });
html.find('.roll-damage').click((event) => {
const li = $(event.currentTarget).parents(".item");
let itemId = li.data("item-id")
this.actor.rollDamage(itemId);
});
html.find('.roll-lift-dice').click((event) => {
const li = $(event.currentTarget).parents(".item");
let itemId = li.data("item-id")
this.actor.rollLiftDice(itemId);
});
html.find('.roll-weapon').click((event) => { html.find('.roll-weapon').click((event) => {
const li = $(event.currentTarget).parents(".item"); const li = $(event.currentTarget).parents(".item");
const skillId = li.data("item-id") const skillId = li.data("item-id")
this.actor.rollWeapon(skillId) this.actor.rollWeapon(skillId)
}); });
html.find('.hold-action').click((event) => {
this.actor.holdAction()
});
html.find('.abort-action').click((event) => {
this.actor.abortAction()
});
html.find('.lock-unlock-sheet').click((event) => { html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore; this.options.editScore = !this.options.editScore;
this.render(true); this.render(true);

View File

@ -1,14 +1,12 @@
/* -------------------------------------------- */ /* -------------------------------------------- */
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
import { Hero6RollDialog } from "./hero6-roll-dialog.js"; import { Hero6RollDialog } from "./hero6-roll-dialog.js";
import { Hero6LiftDice } from "./hero6-lift-dice.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const coverBonusTable = { "nocover": 0, "lightcover": 2, "heavycover": 4, "entrenchedcover": 6 }; const __speed2Segments = [ [0], [7], [6, 12], [4, 8, 12], [3, 6, 9, 12], [3, 5, 8, 10, 12], [2, 4, 6, 8, 10, 12],
const statThreatLevel = ["agi", "str", "phy", "com", "def", "per"] [2, 4, 6, 7, 9, 11, 12], [2, 3, 5, 6, 8, 9, 11, 12], [2, 3, 4, 6, 7, 8, 10, 11, 12], [2, 3, 4, 5, 6, 8, 9, 10, 11, 12],
const __subkey2title = { [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
"melee-dmg": "Melee Damage", "melee-atk": "Melee Attack", "ranged-atk": "Ranged Attack",
"ranged-dmg": "Ranged Damage", "dmg-res": "Damare Resistance"
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -62,13 +60,19 @@ export class Hero6Actor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
computeHitPoints() { computeDerivatedData() {
if (this.type == "character") { if (this.type == "character") {
let newSTREND = this.computeSTREND()
if (newSTREND != this.system.characteristics.str.strend) {
this.update({ 'system.characteristics.str.strend': newSTREND })
}
} }
} }
computeDicesValue() { computeDicesValue() {
this.system.biodata.presenceattack = Hero6Utility.getDerivatedDiceValue(this.system.characteristics.pre.value ) this.system.biodata.presenceattack = Hero6Utility.getDerivatedDiceFormulas(this.system.characteristics.pre.value)
this.system.characteristics.str.strdice = Hero6Utility.getDerivatedDiceValue(this.system.characteristics.str.value ) this.system.characteristics.str.strdice = Hero6LiftDice.getLiftDice(this.system.characteristics.str.value)
this.system.characteristics.str.lift = Hero6LiftDice.getLift(this.system.characteristics.str.value)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareDerivedData() { prepareDerivedData() {
@ -76,7 +80,7 @@ export class Hero6Actor 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.buildContainerTree() this.buildContainerTree()
this.computeHitPoints() this.computeDerivatedData()
this.computeDicesValue() this.computeDicesValue()
} }
@ -91,7 +95,10 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getEncumbranceCapacity() { getEncumbranceCapacity() {
return 1; let numLift = this.system.characteristics.str.lift.match(/\d*\s/g)
if (numLift && numLift[0] && Number(numLift[0])) {
return numLift[0] / 2
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -148,18 +155,6 @@ export class Hero6Actor extends Actor {
return listItem return listItem
} }
/* -------------------------------------------- */
getConditions() {
let comp = duplicate(this.items.filter(item => item.type == 'condition') || []);
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getWeapons() {
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []);
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getItemById(id) { getItemById(id) {
let item = this.items.find(item => item.id == id); let item = this.items.find(item => item.id == id);
@ -172,22 +167,23 @@ export class Hero6Actor extends Actor {
prepareSkill(skill) { prepareSkill(skill) {
skill.roll = 0 skill.roll = 0
skill.charac = "N/A" skill.charac = "N/A"
skill.system.skilltype = skill.system.skilltype.toLowerCase()
if (skill.system.skillfamiliarity) { if (skill.system.skillfamiliarity) {
skill.roll = 8; skill.roll = 8;
} else if (skill.system.skillprofiency) { } else if (skill.system.skillprofiency) {
skill.roll = 10; skill.roll = 10;
} else if (skill.system.skilltype == "agility") { } else if (skill.system.skilltype == "agility") {
skill.charac = "DEX" skill.charac = "dex"
let charac = duplicate(this.system.characteristics.dex) let charac = duplicate(this.system.characteristics.dex)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
} else if (skill.system.skilltype == "interaction") { } else if (skill.system.skilltype == "interaction") {
skill.charac = "PRE" skill.charac = "pre"
let charac = duplicate(this.system.characteristics.pre) let charac = duplicate(this.system.characteristics.pre)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
} else if (skill.system.skilltype == "intellect") { } else if (skill.system.skilltype == "intellect") {
skill.charac = "INT" skill.charac = "int"
let charac = duplicate(this.system.characteristics.int) let charac = duplicate(this.system.characteristics.int)
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
@ -197,12 +193,13 @@ export class Hero6Actor extends Actor {
if (skill.system.characteristic == "manual") { if (skill.system.characteristic == "manual") {
skill.roll = skill.system.base skill.roll = skill.system.base
} else { } else {
skill.charac = skill.system.characteristic skill.charac = (skill.system.characteristic == "") ? "str" : skill.system.characteristic
let charac = duplicate(this.system.characteristics[skill.system.characteristic]) let charac = duplicate(this.system.characteristics[skill.system.characteristic])
this.prepareCharacValues(charac) this.prepareCharacValues(charac)
skill.roll = charac.roll skill.roll = charac.roll
} }
} }
console.log("SILL", skill)
if (skill.system.levels > 0) { if (skill.system.levels > 0) {
skill.roll += skill.system.levels skill.roll += skill.system.levels
} }
@ -226,6 +223,7 @@ export class Hero6Actor extends Actor {
let comp = duplicate(this.items.filter(item => item.type == 'power') || []) let comp = duplicate(this.items.filter(item => item.type == 'power') || [])
for (let c of comp) { for (let c of comp) {
c.enrichDescription = c.name + "<br>" + await TextEditor.enrichHTML(c.system.description, { async: true }) c.enrichDescription = c.name + "<br>" + await TextEditor.enrichHTML(c.system.description, { async: true })
c.enrichNotes = c.name + "<br>" + await TextEditor.enrichHTML(c.system.notes, { async: true })
} }
Hero6Utility.sortArrayObjectsByName(comp) Hero6Utility.sortArrayObjectsByName(comp)
return comp return comp
@ -235,11 +233,6 @@ export class Hero6Actor extends Actor {
Hero6Utility.sortArrayObjectsByName(comp) Hero6Utility.sortArrayObjectsByName(comp)
return comp return comp
} }
getMartialArts() {
let comp = duplicate(this.items.filter(item => item.type == 'martialart') || [])
Hero6Utility.sortArrayObjectsByName(comp)
return comp
}
getComplications() { getComplications() {
let comp = duplicate(this.items.filter(item => item.type == 'complication') || []) let comp = duplicate(this.items.filter(item => item.type == 'complication') || [])
Hero6Utility.sortArrayObjectsByName(comp) Hero6Utility.sortArrayObjectsByName(comp)
@ -280,73 +273,68 @@ export class Hero6Actor extends Actor {
return 0; return 0;
} }
getManeuvers() { getManeuvers() {
let maneuvers = { let maneuvers = {
general: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "general"), general: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "general"),
offensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "offensive"), offensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "offensive"),
defensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "defensive") defensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "defensive")
} }
Hero6Utility.sortArrayObjectsByName(maneuvers.general)
Hero6Utility.sortArrayObjectsByName(maneuvers.offensive)
Hero6Utility.sortArrayObjectsByName(maneuvers.defensive)
return maneuvers
}
getNonStockManeuvers() {
let maneuvers = this.items.filter(item => item.type == "maneuver" && !item.system.isstock)
Hero6Utility.sortArrayObjectsByName(maneuvers)
return maneuvers return maneuvers
} }
getEquipments() { getEquipments() {
return this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment"); let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment");
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
getWeapons() { getWeapons() {
return this.items.filter(item => item.type == "equipment" && item.system.subtype == "weapon"); let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "weapon");
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
getArmors() { getArmors() {
return this.items.filter(item => item.type == "equipment" && item.system.subtype == "armor"); let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "armor");
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
getShields() { getShields() {
return this.items.filter(item => item.type == "equipment" && item.system.subtype == "shield"); let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "shield");
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
getEquipmentsMoneys() { getEquipmentsMoneys() {
return duplicate(this.items.filter(item => item.type == "equipment" && (item.system.subtype == "equipment" || item.system.subtype == "money")) || []) let list = duplicate(this.items.filter(item => item.type == "equipment" && (item.system.subtype == "equipment" || item.system.subtype == "money")) || [])
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
getEquipmentsOnly() { getEquipmentsOnly() {
return duplicate(this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment") || []) let list = duplicate(this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment") || [])
Hero6Utility.sortArrayObjectsByName(list)
return list
} }
/* ------------------------------------------- */ /* ------------------------------------------- */
async buildContainerTree() { buildContainerTree() {
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []) let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []);
for (let equip1 of equipments) {
if (equip1.system.iscontainer) {
equip1.system.contents = []
equip1.system.contentsEnc = 0
for (let equip2 of equipments) {
if (equip1._id != equip2.id && equip2.system.containerid == equip1.id) {
equip1.system.contents.push(equip2)
let q = equip2.system.quantity ?? 1
equip1.system.contentsEnc += q * equip2.system.weight
}
}
}
}
// Compute whole enc
let enc = 0 let enc = 0
for (let item of equipments) { let value = 0
//item.data.idrDice = Hero6Utility.getDiceFromLevel(Number(item.data.idr)) for (let equip1 of equipments) {
if (item.system.equipped) { if (Number(equip1.system.weight) && Number(equip1.system.quantity)) {
if (item.system.iscontainer) { enc += equip1.system.weight * equip1.system.quantity
enc += item.system.contentsEnc }
} else if (item.system.containerid == "") { if (Number(equip1.system.value) && Number(equip1.system.quantity)) {
let q = item.system.quantity ?? 1 value += equip1.system.value * equip1.system.quantity
enc += q * item.system.weight
}
} }
} }
for (let item of this.items) { // Process items/shields/armors
if ((item.type == "weapon" || item.type == "shield" || item.type == "armor") && item.system.equipped) {
let q = item.system.quantity ?? 1
enc += q * item.system.weight
}
}
// Store local values // Store local values
this.encCurrent = enc this.encCurrent = enc
this.containersTree = equipments.filter(item => item.system.containerid == "") // Returns the root of equipements without container this.totalValue = value
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -375,7 +363,7 @@ export class Hero6Actor extends Actor {
} else { } else {
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }]) await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }])
} }
} else if (object && object.system.containerid) { // remove from container } else if (object?.system?.containerid) { // remove from container
console.log("Removeing: ", object) console.log("Removeing: ", object)
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]); await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
} }
@ -392,18 +380,69 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async equipGear(equipmentId) { async equipGear(equipmentId) {
let item = this.items.find(item => item.id == equipmentId); let item = this.items.find(item => item.id == equipmentId);
if (item && item.system) { if (item?.system) {
let update = { _id: item.id, "system.equipped": !item.system.equipped }; let update = { _id: item.id, "system.equipped": !item.system.equipped };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getInitiativeScore(combatId, combatantId) { async cleanCombat() {
if (this.type == 'character') { await this.setFlag("world", "hold-action", false)
this.rollMR(true, combatId, combatantId) await this.setFlag("world", "abort-action", false)
}
async holdAction() {
if (this.getFlag("world", "hold-action")) {
await this.setFlag("world", "hold-action", false)
} else {
await this.setFlag("world", "hold-action", true)
} }
console.log("Init required !!!!") game.combat.rebuildInitiative()
return -1; }
async disableHoldAction() {
await this.setFlag("world", "hold-action", false)
}
async disableAbortAction() {
await this.setFlag("world", "abort-action", { state: false, count: 0 })
}
async abortAction() {
let abort = this.getFlag("world", "abort-action")
if (abort.state) {
await this.setFlag("world", "abort-action", { state: false, count: 0 })
} else {
await this.setFlag("world", "abort-action", { state: true, count: 0 })
}
game.combat.rebuildInitiative()
}
getHoldAction() {
return this.getFlag("world", "hold-action")
}
getAbortAction() {
let abort = this.getFlag("world", "abort-action")
return abort?.state || false
}
/* -------------------------------------------- */
hasPhase(segmentNumber) {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
let phases = __speed2Segments[index]
console.log("index", segmentNumber, index, phases, phases.includes(segmentNumber), __speed2Segments)
return phases.includes(segmentNumber)
}
/* -------------------------------------------- */
getSegments() {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
console.log("INDEX", index, __speed2Segments[index])
return __speed2Segments[index]
}
getPhasesString() {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
return __speed2Segments[index].toString()
}
/* -------------------------------------------- */
getBaseInit() {
let r = new Roll("1d6").roll({ async: false })
let base = this.system.characteristics.dex.value + (r.total / 10)
return base
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -434,12 +473,23 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareCharacValues(charac) { prepareCharacValues(charac) {
charac.total = charac.value charac.total = charac.value
charac.roll = 9 + Math.floor((charac.value) / 5) charac.roll = 9 + Math.round((charac.value) / 5)
} }
prepareCharac() { prepareCharac() {
let characs = duplicate(this.system.characteristics) let characs = duplicate(this.system.characteristics)
for (let key in characs) { for (let key in characs) {
this.prepareCharacValues(characs[key]) let ch = characs[key]
this.prepareCharacValues(ch)
if (key == "str") {
ch.lift = Hero6LiftDice.getLift(ch.value)
ch.liftDice = Hero6LiftDice.getLiftDice(ch.value)
}
if (key == "spd") {
ch.phasesString = this.getPhasesString()
}
if (key =="pre") {
ch.presenceattack = duplicate(this.system.biodata.presenceattack)
}
} }
return characs return characs
} }
@ -453,6 +503,22 @@ export class Hero6Actor extends Actor {
return skill; return skill;
} }
/* -------------------------------------------- */
computeSTREND() {
let newSTREND = 0
switch (this.system.characteristics.str.strendmode) {
case "str20":
newSTREND = Math.floor(this.system.characteristics.str.value / 20)
break;
case "str10":
newSTREND = Math.floor(this.system.characteristics.str.value / 10)
break;
case "str5":
newSTREND = Math.floor(this.system.characteristics.str.value / 5)
break;
}
return newSTREND
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async deleteAllItemsByType(itemType) { async deleteAllItemsByType(itemType) {
let items = this.items.filter(item => item.type == itemType); let items = this.items.filter(item => item.type == itemType);
@ -525,6 +591,18 @@ export class Hero6Actor extends Actor {
return rollData return rollData
} }
/* -------------------------------------------- */
rollPerception() {
let rollData = this.getCommonRollData("int")
rollData.isPerception = true
rollData.charac.roll = Number(rollData.charac.perceptionroll)
rollData.mode = "perception"
if (rollData.target) {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return
}
this.startRoll(rollData)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
rollCharac(chKey) { rollCharac(chKey) {
@ -547,6 +625,53 @@ export class Hero6Actor extends Actor {
} }
this.startRoll(rollData) this.startRoll(rollData)
} }
/* -------------------------------------------- */
async rollDamage(itemId) {
let item = this.items.get(itemId)
let rollData = this.getCommonRollData()
rollData.mode = "damage"
rollData.item = duplicate(item)
rollData.title = item.name
rollData.diceFormula = Hero6Utility.convertRollHeroSyntax(item.system.damage)
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = myRoll
rollData.result = myRoll.total
rollData.bodyValue = Hero6Utility.computeBodyValue(myRoll)
let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-damage-result.hbs`, rollData)
let msg = await rollData.roll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
rollData.roll = duplicate(rollData.roll) // Convert to object
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------------------------------------- */
async rollLiftDice() {
let rollData = this.getCommonRollData()
rollData.mode = "lift-dice"
rollData.diceFormula = Hero6Utility.convertRollHeroSyntax(Hero6LiftDice.getLiftDice(this.system.characteristics.str.value))
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.bodyValue = Hero6Utility.computeBodyValue(myRoll)
rollData.result = myRoll.total
rollData.roll = duplicate(myRoll)
let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-lift-dice-result.hbs`, rollData)
let msg = await myRoll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
rollSkill(skillId) { rollSkill(skillId) {

View File

@ -1,21 +1,191 @@
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class Hero6Combat extends Combat { export class Hero6CombatTracker extends CombatTracker {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {} ) { static get defaultOptions() {
let path = "systems/fvtt-hero-system-6/templates/apps/combat-tracker.hbs";
return foundry.utils.mergeObject(super.defaultOptions, {
template: path,
});
}
}
/* -------------------------------------------- */
export class Hero6Combat extends Combat {
/* -------------------------------------------- */
static ready() {
Hooks.on("getCombatTrackerEntryContext", (html, options) => { Hero6Combat.pushMenuOptions(html, options); });
game.combat.settings.resource = "characteristics.spd.value";
}
/* -------------------------------------------- */
static pushMenuOptions(html, options) {
let newOpt
for (let i = 0; i < options.length; i++) {
let option = options[i];
if (option.name == 'COMBAT.CombatantReroll') { // Replace !
option.name = "Hold/Unhold action";
option.condition = true;
option.icon = '<i class="far fa-question-circle"></i>';
option.callback = target => {
Hero6Combat.holdAction(target.data('combatant-id'));
}
//newOpt = duplicate(option)
}
}
//options.push(newOpt)
}
/* -------------------------------------------- */
static holdAction(combatantId) {
const combatant = game.combat.combatants.get(combatantId)
combatant.actor.holdAction()
}
/* -------------------------------------------- */
constructor(data, context) {
super(data, context);
this.turnNumber = 0;
this.segmentNumber = 12;
}
/* -------------------------------------------- */
async startCombat() {
game.combat.settings.resource = "characteristics.spd.value";
let updList = []
for (let c of this.combatants) {
this.computeInitiative(c, updList)
await c.actor.cleanCombat()
}
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
}
super.startCombat();
}
/* -------------------------------------------- */
computeInitiative(c, updList) {
let id = c._id || c.id
let hasSegment = c.actor.hasPhase(this.segmentNumber)
let isOnHold = c.actor.getHoldAction()
if (hasSegment || isOnHold) {
let baseInit = c.actor ? c.actor.getBaseInit() : 0;
let name = c.actor.name
if (isOnHold) {
if (hasSegment) { // On hold + current segment -> auto-disable on hold
c.actor.disableHoldAction()
} else {
name = c.actor.name + " (H)"
}
}
if (c.actor.getAbortAction()) {
name = c.actor.name + " (A)"
c.actor.disableAbortAction()
}
updList.push({ _id: id, name: name, initiative: baseInit, holdAction: c.holdAction })
} else {
updList.push({ _id: id, name: name, initiative: 0, holdAction: c.holdAction })
}
}
/* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
console.log("Roll INIT")
let updList = []
for (let cId = 0; cId < ids.length; cId++) { for (let cId = 0; cId < ids.length; cId++) {
const c = this.combatants.get(ids[cId]); const c = this.combatants.get(ids[cId])
let id = c._id || c.id; this.computeInitiative(c, updList)
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1; }
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]);
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
} }
return this; return this;
} }
/* -------------------------------------------- */
async rebuildInitiative() {
let updList = []
for (let c of this.combatants) {
this.computeInitiative(c, updList)
}
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
console.log("Rebuild INIT", updList)
for(let c of updList) {
if ( c.initiative != 0) {
return true
}
}
}
return false
}
/* -------------------------------------------- */
async nextRound() {
let hasCombatants = false
let nextRound = this.round
let advanceTime = 0
let turn = this.turn === null ? null : 0; // Preserve the fact that it's no-one's turn currently.
let turnData = this.getFlag("world", "hero6-turn-data")
console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
turn = turn; // Preserve the fact that it's no-one's turn currently.
if (this.settings.skipDefeated && (turn !== null)) {
turn = this.turns.findIndex(t => !t.isDefeated);
if (turn === -1) {
ui.notifications.warn("COMBAT.NoneRemaining", { localize: true });
turn = 0;
}
}
advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime;
advanceTime += CONFIG.time.roundTime;
nextRound = nextRound + 1;
console.log("Next round called....2", nextRound, turnData)
turnData = this.getFlag("world", "hero6-turn-data")
if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "hero6-turn-data", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber += 1
if (turnData.segmentNumber > 12) {
turnData.segmentNumber = 1
turnData.turnNumber++
}
await this.setFlag("world", "hero6-turn-data", turnData)
this.turnNumber = turnData.turnNumber;
this.segmentNumber = turnData.segmentNumber;
console.log("Next round called....3", nextRound, turnData)
// Re-compute init of actors
hasCombatants = await this.rebuildInitiative()
console.log("Going round....", nextRound, hasCombatants)
}
// Update the document, passing data through a hook first
const updateData = { round: nextRound, turn: turn, segmentNumber: turnData.segmentNumber, turnNumber: turnData.turnNumber };
const updateOptions = { advanceTime, direction: 1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
return this.update(updateData, updateOptions);
}
/* -------------------------------------------- */
async _onCreateEmbeddedDocuments(type, documents, result, options, userId) {
super._onCreateEmbeddedDocuments(type, documents, result, options, userId)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_onUpdate(changed, options, userId) { _onUpdate(changed, options, userId) {
} }

View File

@ -4,18 +4,28 @@ import { Hero6Utility } from "./hero6-utility.js";
import { Hero6RollDialog } from "./hero6-roll-dialog.js"; import { Hero6RollDialog } from "./hero6-roll-dialog.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower"} const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower" }
/* -------------------------------------------- */ /* -------------------------------------------- */
export class Hero6Commands { export class Hero6Commands {
static init() { static ready() {
if (!game.system.hero6.commands) { if (!game.system.hero6.commands) {
const hero6Commands = new Hero6Commands(); const hero6Commands = new Hero6Commands();
hero6Commands.registerCommand({ path: ["/rtarget"], func: (content, msg, params) => Hero6Commands.rollTarget(msg, params), descr: "Launch the target roll window" }); hero6Commands.registerCommand({ path: ["/rh"], func: (content, msg, params) => Hero6Commands.rollSpecialHero(msg, params), descr: "Special roll hero roll (1/2d6 like)" });
hero6Commands.registerCommand({ path: ["/rsave"], func: (content, msg, params) => Hero6Commands.rollSave(msg, params), descr: "Performs a save roll" });
game.system.hero6.commands = hero6Commands; game.system.hero6.commands = hero6Commands;
} }
Hooks.on("chatMessage", (html, content, msg) => {
if (content[0] == '/') {
let regExp = /(\S+)/g;
let commands = content.match(regExp);
if (game.hero6.commands.processChatCommand(commands, content, msg)) {
return false;
}
}
return true
})
} }
constructor() { constructor() {
@ -108,37 +118,25 @@ export class Hero6Commands {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static rollTarget(msg, params) { static async rollSpecialHero(msg, params) {
const speaker = ChatMessage.getSpeaker() console.log("ROLL HERE", msg, params)
let actor let formula = params.join(' ')
if (speaker.token) actor = game.actors.tokens[speaker.token] if (formula) {
if (!actor) actor = game.actors.get(speaker.actor) let foundryFormula = Hero6Utility.convertRollHeroSyntax(formula)
if (!actor) {
return ui.notifications.warn(`Select your actor to run the macro`)
}
actor.rollDefenseRanged()
}
/* -------------------------------------------- */ let myRoll = new Roll(foundryFormula).roll({ async: false })
static rollSave(msg, params) { await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
console.log(msg, params) let bodyValue = Hero6Utility.computeBodyValue(myRoll)
if ( params.length == 0) {
ui.notifications.warn("/rsave command error : syntax is /rsave reflex, /rsave fortitude or /rsave willpower") let msgFlavor = await renderTemplate('systems/fvtt-hero-system-6/templates/chat/chat-hr-roll.hbs', {myRoll, bodyValue} )
return let msg = await myRoll.toMessage({
} user: game.user.id,
let saveKey = params[0].toLowerCase() rollMode: game.settings.get("core", "rollMode"),
if ( saveKey.length > 0 && (saveKey[0] == "r" || saveKey[0] == "f" || saveKey[0] == "w")) { flavor: msgFlavor
const speaker = ChatMessage.getSpeaker() })
let actor return true
if (speaker.token) actor = game.actors.tokens[speaker.token]
if (!actor) actor = game.actors.get(speaker.actor)
if (!actor) {
return ui.notifications.warn(`Select your actor to run the macro`)
}
actor.rollSave( __saveFirstToKey[saveKey[0]] )
} else {
ui.notifications.warn("/rsave syntax error : syntax is /rsave reflex, /rsave fortitude or /rsave willpower")
} }
return false
} }
} }

View File

@ -48,5 +48,11 @@ export const Hero6_CONFIG = {
powerSenseAffecting: { powerSenseAffecting: {
"none": "None", "none": "None",
"senseaffecting": "Sense-Affecting", "senseaffecting": "Sense-Affecting",
},
powerEffectRoll: {
"standard": "Standard",
"normal": "Normal",
"killing": "Killing",
"countbody": "Killing (Count BODY)"
} }
} }

View File

@ -60,6 +60,7 @@ export class Hero6ItemSheet extends ItemSheet {
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}), description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
config: game.system.hero6.config, config: game.system.hero6.config,
system: objectData, system: objectData,
limited: this.object.limited, limited: this.object.limited,

641
modules/hero6-lift-dice.js Normal file
View File

@ -0,0 +1,641 @@
const __LiftDiceValues = {
"0": {
"weight": "25 kg",
"dice": ""
},
"1": {
"weight": "29 kg",
"dice": ""
},
"2": {
"weight": "33 kg",
"dice": ""
},
"3": {
"weight": "37.5 kg",
"dice": "0 1/2d6"
},
"4": {
"weight": "44 kg",
"dice": "0 1/2d6"
},
"5": {
"weight": "50 kg",
"dice": "1d6"
},
"6": {
"weight": "58 kg",
"dice": "1d6"
},
"7": {
"weight": "67 kg",
"dice": "1d6"
},
"8": {
"weight": "75 kg",
"dice": "1 1/2d6"
},
"9": {
"weight": "88 kg",
"dice": "1 1/2d6"
},
"10": {
"weight": "100 kg",
"dice": "2d6"
},
"11": {
"weight": "117 kg",
"dice": "2d6"
},
"12": {
"weight": "133 kg",
"dice": "2d6"
},
"13": {
"weight": "150 kg",
"dice": "2 1/2d6"
},
"14": {
"weight": "175 kg",
"dice": "2 1/2d6"
},
"15": {
"weight": "200 kg",
"dice": "3d6"
},
"16": {
"weight": "233 kg",
"dice": "3d6"
},
"17": {
"weight": "267 kg",
"dice": "3d6"
},
"18": {
"weight": "300 kg",
"dice": "3 1/2d6"
},
"19": {
"weight": "350 kg",
"dice": "3 1/2d6"
},
"20": {
"weight": "400 kg",
"dice": "4d6"
},
"21": {
"weight": "467 kg",
"dice": "4d6"
},
"22": {
"weight": "533 kg",
"dice": "4d6"
},
"23": {
"weight": "600 kg",
"dice": "4 1/2d6"
},
"24": {
"weight": "700 kg",
"dice": "4 1/2d6"
},
"25": {
"weight": "800 kg",
"dice": "5d6"
},
"26": {
"weight": "933 kg",
"dice": "5d6"
},
"27": {
"weight": "1,067 kg",
"dice": "5d6"
},
"28": {
"weight": "1,200 kg",
"dice": "5 1/2d6"
},
"29": {
"weight": "1,400 kg",
"dice": "5 1/2d6"
},
"30": {
"weight": "1,600 kg",
"dice": "6d6"
},
"31": {
"weight": "1,867 kg",
"dice": "6d6"
},
"32": {
"weight": "2,133 kg",
"dice": "6d6"
},
"33": {
"weight": "2,400 kg",
"dice": "6 1/2d6"
},
"34": {
"weight": "2,800 kg",
"dice": "6 1/2d6"
},
"35": {
"weight": "3,200 kg",
"dice": "7d6"
},
"36": {
"weight": "3,733 kg",
"dice": "7d6"
},
"37": {
"weight": "4,267 kg",
"dice": "7d6"
},
"38": {
"weight": "4,800 kg",
"dice": "7 1/2d6"
},
"39": {
"weight": "5,600 kg",
"dice": "7 1/2d6"
},
"40": {
"weight": "6,400 kg",
"dice": "8d6"
},
"41": {
"weight": "7,467 kg",
"dice": "8d6"
},
"42": {
"weight": "8,533 kg",
"dice": "8d6"
},
"43": {
"weight": "9,600 kg",
"dice": "8 1/2d6"
},
"44": {
"weight": "11 tons",
"dice": "8 1/2d6"
},
"45": {
"weight": "12.5 tons",
"dice": "9d6"
},
"46": {
"weight": "15 tons",
"dice": "9d6"
},
"47": {
"weight": "17 tons",
"dice": "9d6"
},
"48": {
"weight": "19 tons",
"dice": "9 1/2d6"
},
"49": {
"weight": "22 tons",
"dice": "9 1/2d6"
},
"50": {
"weight": "25 tons",
"dice": "10d6"
},
"51": {
"weight": "29 tons",
"dice": "10d6"
},
"52": {
"weight": "33 tons",
"dice": "10d6"
},
"53": {
"weight": "37.5 tons",
"dice": "10 1/2d6"
},
"54": {
"weight": "44 tons",
"dice": "10 1/2d6"
},
"55": {
"weight": "50 tons",
"dice": "11d6"
},
"56": {
"weight": "58 tons",
"dice": "11d6"
},
"57": {
"weight": "67 tons",
"dice": "11d6"
},
"58": {
"weight": "75 tons",
"dice": "11 1/2d6"
},
"59": {
"weight": "88 tons",
"dice": "11 1/2d6"
},
"60": {
"weight": "100 tons",
"dice": "12d6"
},
"61": {
"weight": "117 tons",
"dice": "12d6"
},
"62": {
"weight": "133 tons",
"dice": "12d6"
},
"63": {
"weight": "150 tons",
"dice": "12 1/2d6"
},
"64": {
"weight": "175 tons",
"dice": "12 1/2d6"
},
"65": {
"weight": "200 tons",
"dice": "13d6"
},
"66": {
"weight": "233 tons",
"dice": "13d6"
},
"67": {
"weight": "267 tons",
"dice": "13d6"
},
"68": {
"weight": "300 tons",
"dice": "13 1/2d6"
},
"69": {
"weight": "350 tons",
"dice": "13 1/2d6"
},
"70": {
"weight": "400 tons",
"dice": "14d6"
},
"71": {
"weight": "467 tons",
"dice": "14d6"
},
"72": {
"weight": "533 tons",
"dice": "14d6"
},
"73": {
"weight": "600 tons",
"dice": "14 1/2d6"
},
"74": {
"weight": "700 tons",
"dice": "14 1/2d6"
},
"75": {
"weight": "800 tons",
"dice": "15d6"
},
"76": {
"weight": "933 tons",
"dice": "15d6"
},
"77": {
"weight": "1 kton 15d6",
"dice": ""
},
"78": {
"weight": "1.2 ktons",
"dice": "15 1/2d6"
},
"79": {
"weight": "1.4 ktons",
"dice": "15 1/2d6"
},
"80": {
"weight": "1.6 ktons",
"dice": "16d6"
},
"81": {
"weight": "1.9 ktons",
"dice": "16d6"
},
"82": {
"weight": "2 ktons",
"dice": "16d6"
},
"83": {
"weight": "2.4 ktons",
"dice": "16 1/2d6"
},
"84": {
"weight": "2.8 ktons",
"dice": "16 1/2d6"
},
"85": {
"weight": "3.2 ktons",
"dice": "17d6"
},
"86": {
"weight": "3.7 ktons",
"dice": "17d6"
},
"87": {
"weight": "4.3 ktons",
"dice": "17d6"
},
"88": {
"weight": "4.8 ktons",
"dice": "17 1/2d6"
},
"89": {
"weight": "5.6 ktons",
"dice": "17 1/2d6"
},
"90": {
"weight": "6.4 ktons",
"dice": "18d6"
},
"91": {
"weight": "7.5 ktons",
"dice": "18d6"
},
"92": {
"weight": "8.5 ktons",
"dice": "18d6"
},
"93": {
"weight": "9.6 ktons",
"dice": "18 1/2d6"
},
"94": {
"weight": "11 ktons",
"dice": "18 1/2d6"
},
"95": {
"weight": "12.5 ktons",
"dice": "19d6"
},
"96": {
"weight": "15 ktons",
"dice": "19d6"
},
"97": {
"weight": "17 ktons",
"dice": "19d6"
},
"98": {
"weight": "19 ktons",
"dice": "19 1/2d6"
},
"99": {
"weight": "22 ktons",
"dice": "19 1/2d6"
},
"100": {
"weight": "25 ktons",
"dice": "20d6"
},
"105": {
"weight": "50 ktons",
"dice": "21d6"
},
"110": {
"weight": "100 ktons",
"dice": "22d6"
},
"115": {
"weight": "200 ktons",
"dice": "23d6"
},
"120": {
"weight": "400 ktons",
"dice": "24d6"
},
"125": {
"weight": "800 ktons",
"dice": "25d6"
},
"130": {
"weight": "1.6 mtons",
"dice": "26d6"
},
"135": {
"weight": "3.2 mtons",
"dice": "27d6"
},
"140": {
"weight": "6.4 mtons",
"dice": "28d6"
},
"145": {
"weight": "12.5 mtons",
"dice": "29d6"
},
"150": {
"weight": "25 mtons",
"dice": "30d6"
},
"155": {
"weight": "50 mtons",
"dice": "31d6"
},
"160": {
"weight": "100 mtons",
"dice": "32d6"
},
"165": {
"weight": "200 mtons",
"dice": "33d6"
},
"170": {
"weight": "400 mtons",
"dice": "34d6"
},
"175": {
"weight": "800 mtons",
"dice": "35d6"
},
"180": {
"weight": "1.6 gtons",
"dice": "36d6"
},
"185": {
"weight": "3.2 gtons",
"dice": "37d6"
},
"190": {
"weight": "6.4 gtons",
"dice": "38d6"
},
"195": {
"weight": "12.5 gtons",
"dice": "39d6"
},
"200": {
"weight": "25 gtons",
"dice": "40d6"
},
"-50": {
"weight": "0.025 kg",
"dice": ""
},
"-45": {
"weight": "0.05 kg",
"dice": ""
},
"-40": {
"weight": "0.1 kg",
"dice": ""
},
"-35": {
"weight": "0.2 kg",
"dice": ""
},
"-30": {
"weight": "0.4 kg",
"dice": ""
},
"-29": {
"weight": "0.5 kg",
"dice": ""
},
"-28": {
"weight": "0.5 kg",
"dice": ""
},
"-27": {
"weight": "0.6 kg",
"dice": ""
},
"-26": {
"weight": "0.7 kg",
"dice": ""
},
"-25": {
"weight": "0.8 kg",
"dice": ""
},
"-24": {
"weight": "0.9 kg",
"dice": ""
},
"-23": {
"weight": "1.0 kg",
"dice": ""
},
"-22": {
"weight": "1.2 kg",
"dice": ""
},
"-21": {
"weight": "1.4 kg",
"dice": ""
},
"-20": {
"weight": "1.6 kg",
"dice": ""
},
"-19": {
"weight": "1.8 kg",
"dice": ""
},
"-18": {
"weight": "2.0 kg",
"dice": ""
},
"-17": {
"weight": "2.4 kg",
"dice": ""
},
"-16": {
"weight": "2.8 kg",
"dice": ""
},
"-15": {
"weight": "3.2 kg",
"dice": ""
},
"-14": {
"weight": "3.6 kg",
"dice": ""
},
"-13": {
"weight": "4.0 kg",
"dice": ""
},
"-12": {
"weight": "4.8 kg",
"dice": ""
},
"-11": {
"weight": "5.6 kg",
"dice": ""
},
"-10": {
"weight": "6.4 kg",
"dice": ""
},
"-9": {
"weight": "7.2 kg",
"dice": ""
},
"-8": {
"weight": "8.0 kg",
"dice": ""
},
"-7": {
"weight": "9.5 kg",
"dice": ""
},
"-6": {
"weight": "11 kg",
"dice": ""
},
"-5": {
"weight": "12.5 kg",
"dice": ""
},
"-4": {
"weight": "14 kg",
"dice": ""
},
"-3": {
"weight": "16 kg",
"dice": ""
},
"-2": {
"weight": "19 kg",
"dice": ""
},
"-1": {
"weight": "22 kg",
"dice": ""
}
}
export class Hero6LiftDice{
static getLift(value) {
let data = __LiftDiceValues[String(value)]
if (data) {
return data.weight
}
return 0
}
static getLiftDice(value) {
let data = __LiftDiceValues[String(value)]
if (data) {
return data.dice
}
return 0
}
}

View File

@ -13,7 +13,7 @@ import { Hero6ItemSheet } from "./hero6-item-sheet.js";
import { Hero6ActorSheet } from "./hero6-actor-sheet.js"; import { Hero6ActorSheet } from "./hero6-actor-sheet.js";
import { Hero6NPCSheet } from "./hero6-npc-sheet.js"; import { Hero6NPCSheet } from "./hero6-npc-sheet.js";
import { Hero6Utility } from "./hero6-utility.js"; import { Hero6Utility } from "./hero6-utility.js";
import { Hero6Combat } from "./hero6-combat.js"; import { Hero6Combat, Hero6CombatTracker } from "./hero6-combat.js";
import { Hero6Item } from "./hero6-item.js"; import { Hero6Item } from "./hero6-item.js";
import { Hero6Hotbar } from "./hero6-hotbar.js" import { Hero6Hotbar } from "./hero6-hotbar.js"
import { Hero6Commands } from "./hero6-commands.js" import { Hero6Commands } from "./hero6-commands.js"
@ -41,10 +41,10 @@ Hooks.once("init", async function () {
// Set an initiative formula for the system // Set an initiative formula for the system
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: "1d6", formula: "1d6",
decimals: 1 decimals: 3
}; };
/* -------------------------------------------- */ /* ------------------------------- ------------- */
game.socket.on("system.fvtt-hero-system-6", data => { game.socket.on("system.fvtt-hero-system-6", data => {
Hero6Utility.onSocketMesssage(data) Hero6Utility.onSocketMesssage(data)
}); });
@ -54,6 +54,8 @@ Hooks.once("init", async function () {
CONFIG.Combat.documentClass = Hero6Combat CONFIG.Combat.documentClass = Hero6Combat
CONFIG.Actor.documentClass = Hero6Actor CONFIG.Actor.documentClass = Hero6Actor
CONFIG.Item.documentClass = Hero6Item CONFIG.Item.documentClass = Hero6Item
CONFIG.ui.combat = Hero6CombatTracker;
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register sheet application classes // Register sheet application classes
@ -73,7 +75,7 @@ function welcomeMessage() {
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part"> content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part">
<strong>Welcome to the Hero6 RPG.</strong> <strong>Welcome to Hero System 6E RPG.</strong>
` }); ` });
} }
@ -93,7 +95,9 @@ Hooks.once("ready", function () {
welcomeMessage(); welcomeMessage();
Hero6Utility.ready() Hero6Utility.ready()
Hero6Commands.init() Hero6Commands.ready()
Hero6Combat.ready()
}) })
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -53,7 +53,7 @@ export class Hero6RollDialog extends Dialog {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
var dialog = this; let dialog = this;
function onLoad() { function onLoad() {
} }
$(function () { onLoad(); }); $(function () { onLoad(); });

View File

@ -15,16 +15,17 @@ export class Hero6Utility {
Hero6Utility.dropItemOnToken(canvas, data) Hero6Utility.dropItemOnToken(canvas, data)
});*/ });*/
Hero6Commands.init();
Handlebars.registerHelper('count', function (list) { Handlebars.registerHelper('count', function (list) {
return list.length; return list.length;
}) })
Handlebars.registerHelper('exists', function (val) {
return val != null && val != undefined;
});
Handlebars.registerHelper('includes', function (array, val) { Handlebars.registerHelper('includes', function (array, val) {
return array.includes(val); return array.includes(val);
}) })
Handlebars.registerHelper('upper', function (text) { Handlebars.registerHelper('upper', function (text) {
if (text) { if (text) {
return text.toUpperCase(); return text.toUpperCase();
} }
return text return text
@ -40,17 +41,22 @@ export class Hero6Utility {
return list.length > 0; return list.length > 0;
}) })
Handlebars.registerHelper('mul', function (a, b) { Handlebars.registerHelper('mul', function (a, b) {
return parseInt(a) * parseInt(b); return Number(a) * Number(b);
}) })
Handlebars.registerHelper('locationLabel', function (key) { Handlebars.registerHelper('locationLabel', function (key) {
return __locationNames[key] return __locationNames[key]
}) })
Handlebars.registerHelper('isSkillCustom', function (key) { Handlebars.registerHelper('isSkillCustom', function (key) {
if (key == "custom" ) { if (key == "custom") {
return true; return true;
} }
return false return false
}) })
Handlebars.registerHelper('checkInit', function (value) {
let myValue = Number(value) || 0
return myValue > 0
})
this.gameSettings() this.gameSettings()
@ -78,12 +84,16 @@ export class Hero6Utility {
/*-------------------------------------------- */ /*-------------------------------------------- */
static getDerivatedDiceValue(value) { static getDerivatedDiceFormulas(value) {
let dices = Math.floor(value/5) +"d6" let rollFormula = Math.floor(value / 5) + "d6"
if ( value % 5 > 2) { let displayFormula = Math.floor(value / 5)
dices += "+1d3" if (value % 5 > 2) {
rollFormula += "+round(1d6/2)"
displayFormula += " 1/2d6"
} else {
displayFormula += "d6"
} }
return dices return { rollFormula: rollFormula, displayFormula: displayFormula }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
static upperFirst(text) { static upperFirst(text) {
@ -135,24 +145,6 @@ export class Hero6Utility {
html.on("click", '.view-item-from-chat', event => { html.on("click", '.view-item-from-chat', event => {
game.system.crucible.creator.openItemView(event) game.system.crucible.creator.openItemView(event)
}) })
html.on("click", '.roll-defense-melee', event => {
let rollId = $(event.currentTarget).data("roll-id")
let rollData = Hero6Utility.getRollData(rollId)
rollData.defenseWeaponId = $(event.currentTarget).data("defense-weapon-id")
let actor = game.canvas.tokens.get(rollData.defenderTokenId).actor
if (actor && (game.user.isGM || actor.isOwner)) {
actor.rollDefenseMelee(rollData)
}
})
html.on("click", '.roll-defense-ranged', event => {
let rollId = $(event.currentTarget).data("roll-id")
let rollData = Hero6Utility.getRollData(rollId)
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
if (defender && (game.user.isGM || defender.isOwner)) {
defender.rollDefenseRanged(rollData)
}
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -172,7 +164,8 @@ export class Hero6Utility {
'systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs', 'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs' 'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-power-maneuver-effect.hbs'
] ]
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@ -301,13 +294,40 @@ export class Hero6Utility {
} }
} }
/* -------------- ----------------------------- */
static computeBodyValue(roll) {
let bodyValue = 0
for (let term of roll.terms) {
if (term.constructor.name == "Die") {
for (let value of term.values) {
if (value > 1) {
bodyValue += 1
}
if (value == 6) {
bodyValue += 1
}
}
}
if (term.constructor.name == "NumericTerm") {
if (term.total > 1) {
bodyValue += 1
}
if (term.total == 6) {
bodyValue += 1
}
}
}
return bodyValue
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async rollHero6(rollData) { static async rollHero6(rollData) {
let actor = game.actors.get(rollData.actorId) let actor = game.actors.get(rollData.actorId)
// ability/save/size => 0 // ability/save/size => 0
let diceFormula = "3d6" let diceFormula = "3d6"
let target = 10 let target = 10
if (rollData.charac) { if (rollData.charac) {
target = rollData.charac.roll target = rollData.charac.roll
@ -316,7 +336,7 @@ export class Hero6Utility {
target = rollData.item.roll || rollData.item.system.roll target = rollData.item.roll || rollData.item.system.roll
} }
target += rollData.bonusMalus target += rollData.bonusMalus
// Performs roll // Performs roll
console.log("Roll formula", diceFormula) console.log("Roll formula", diceFormula)
let myRoll = rollData.roll let myRoll = rollData.roll
@ -324,6 +344,7 @@ export class Hero6Utility {
myRoll = new Roll(diceFormula).roll({ async: false }) myRoll = new Roll(diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
} }
rollData.roll = myRoll rollData.roll = myRoll
rollData.target = target rollData.target = target
rollData.diceFormula = diceFormula rollData.diceFormula = diceFormula
@ -332,23 +353,65 @@ export class Hero6Utility {
if (rollData.result <= target) { if (rollData.result <= target) {
rollData.isSuccess = true rollData.isSuccess = true
} }
if ( myRoll.terms[0].total == 3) { // Always a success if (myRoll.terms[0].total == 3) { // Always a success
rollData.isSuccess = true rollData.isSuccess = true
} }
if ( myRoll.terms[0].total == 18) { // Always a failure if (myRoll.terms[0].total == 18) { // Always a failure
rollData.isSuccess = false rollData.isSuccess = false
} }
rollData.margin = target - rollData.result rollData.margin = target - rollData.result
let msg = await this.createChatWithRollMode(rollData.alias, { this.outputRollMessage(rollData)
content: await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-generic-result.hbs`, rollData)
})
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
} }
/* -------------------------------------------- */ /* -------------- ----------------------------- */
static processDirectRoll(rollData) {
let roll = new Roll(rollData.rollFormula).roll({ async: false })
rollData.roll = roll
rollData.result = roll.total
rollData.bodyValue = this.computeBodyValue(rollData.roll)
this.outputRollMessage(rollData).catch(function() { ui.notifications.warn("Error during message output.") })
}
/* -------------- ----------------------------- */
static async outputRollMessage(rollData) {
let msgFlavor = await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-generic-result.hbs`, rollData)
let msg = await rollData.roll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
rollData.roll = duplicate(rollData.roll) // Convert to object
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------- ----------------------------- */
static convertRollHeroSyntax(hero6Formula) {
// Ensure we have no space at all
//hero6Formula = hero6Formula.replace(/\s/g, '')
let hasHalfDice = ""
let newFormula = hero6Formula
let form1 = hero6Formula.match(/\s*(\d*)\s*1\/2d6/)
if ( form1 ) {
let nbDice = form1[1] || 0
newFormula = nbDice+"d6+round(1d6/2)"
}
let form3 = hero6Formula.match(/\s*(\d*)\.5d6/)
if ( form3 ) {
let nbDice = form3[1] || 0
newFormula = nbDice+"d6+round(1d6/2)"
}
console.log("Parsed formula : ", hero6Formula, newFormula)
return newFormula
}
/* -------------- ----------------------------- */
static sortArrayObjectsByName(myArray) { static sortArrayObjectsByName(myArray) {
myArray.sort((a, b) => { myArray.sort((a, b) => {
let fa = a.name.toLowerCase(); let fa = a.name.toLowerCase();
@ -386,7 +449,7 @@ export class Hero6Utility {
static blindMessageToGM(chatOptions) { static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions); let chatGM = duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM); chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM); console.log("blindMessageToGM", chatGM);
game.socket.emit("system.fvtt-hero-system-6", { msg: "msg_gm_chat_message", data: chatGM }); game.socket.emit("system.fvtt-hero-system-6", { msg: "msg_gm_chat_message", data: chatGM });
} }

View File

@ -39,9 +39,9 @@
{"name":"Concealment","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Concealment","description":"Concealment represents a characters ability to hide things and to find things which others have hidden — important papers, weapons, jewels, arti- facts, drugs, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"YfLechAkLdcHGPCm"} {"name":"Concealment","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Concealment","description":"Concealment represents a characters ability to hide things and to find things which others have hidden — important papers, weapons, jewels, arti- facts, drugs, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"YfLechAkLdcHGPCm"}
{"name":"Security Systems","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Security Systems","description":"A character with Security Systems can locate, recognize, evade, and build various types of alarms and traps. This usually requires the proper equipment, and often a lot of time (one Turn or longer) as well.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bBoNhL0myNTylcHm"} {"name":"Security Systems","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Security Systems","description":"A character with Security Systems can locate, recognize, evade, and build various types of alarms and traps. This usually requires the proper equipment, and often a lot of time (one Turn or longer) as well.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505024,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bBoNhL0myNTylcHm"}
{"name":"Transport Familiarity","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Transport Familiarity","description":"This Background Skill allows characters to drive or pilot specific types of vehicles, or ride a living mount, under routine conditions (combat or crisis conditions require other Skills listed above).\nEach Transport Familiarity (TF) costs 2 Character Points. The character must select one of the following groups of vehicles:\n\nRiding Animals (horses, camels, elephants, and so on)\nGround Vehicles (cars, trucks, trains, motorcycles, sleds, snowmobiles)\nWater Vehicles (rowed boats, sailed boats, motorized boats)\nAir Vehicles (airplanes, helicopters) Space Vehicles (spaceships, starships) Mecha\nCharacters can purchase a TF with a single specific type of vehicle for 1 Character Point. This includes not only individual vehicles (Ford Mus- tangs, Los Angeles-class submarines) but recreational “vehicles” (such as SCUBA, Parachuting, Snow Skiing, or the like).","notes":"","effects":"","cost":"","activecost":"","basecost":"","value":"","modifiers":"","skilltype":"Background","characteristic":"","base":"","levelscost":"","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505028,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bstMbLdHkP16NpyE"} {"name":"Transport Familiarity","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Transport Familiarity","description":"This Background Skill allows characters to drive or pilot specific types of vehicles, or ride a living mount, under routine conditions (combat or crisis conditions require other Skills listed above).\nEach Transport Familiarity (TF) costs 2 Character Points. The character must select one of the following groups of vehicles:\n\nRiding Animals (horses, camels, elephants, and so on)\nGround Vehicles (cars, trucks, trains, motorcycles, sleds, snowmobiles)\nWater Vehicles (rowed boats, sailed boats, motorized boats)\nAir Vehicles (airplanes, helicopters) Space Vehicles (spaceships, starships) Mecha\nCharacters can purchase a TF with a single specific type of vehicle for 1 Character Point. This includes not only individual vehicles (Ford Mus- tangs, Los Angeles-class submarines) but recreational “vehicles” (such as SCUBA, Parachuting, Snow Skiing, or the like).","notes":"","effects":"","cost":"","activecost":"","basecost":"","value":"","modifiers":"","skilltype":"Background","characteristic":"","base":"","levelscost":"","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505028,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"bstMbLdHkP16NpyE"}
{"name":"Charm","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Charm","description":"Charm is the ability to gain others trust (and perhaps even friendship) by offering companionship or favors. This Skill is normally only for use on NPCs; a player should have more control over his characters actions. The GM may rule that Charm can be used on a PC when it fits his Complications or personality.","notes":"","effects":"","cost":null,"activecost":null,"basecost":3,"value":"","modifiers":"","skilltype":"interaction","characteristic":"PRE","base":"","levelscost":2,"levels":null,"skilllevelonly":0,"skillfamiliarity":0,"skilleveryman":false,"skillprofiency":0,"plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.39","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1686003305741,"lastModifiedBy":"psfGTCIZQgpI1hvV"},"ownership":{"default":0,"psfGTCIZQgpI1hvV":3},"folder":null,"sort":0,"_id":"ddpdwDnfixUNP0eF"}
{"name":"Streetwise","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Streetwise","description":"Streetwise gives a character knowledge of the seamy side of civilization. He knows how to find the black market, talk to thugs and criminals, gain information, deal with organized (and not so organized) crime figures, and so on.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505023,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gIYMsOzBOnRNRCLv"} {"name":"Streetwise","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Streetwise","description":"Streetwise gives a character knowledge of the seamy side of civilization. He knows how to find the black market, talk to thugs and criminals, gain information, deal with organized (and not so organized) crime figures, and so on.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505023,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gIYMsOzBOnRNRCLv"}
{"name":"Tracking","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Tracking","description":"Characters with Tracking can follow a trail by observing tracks, marks, broken twigs and so forth, and also know how to hide tracks.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505027,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gpzcF5naO9H3vNzi"} {"name":"Tracking","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Tracking","description":"Characters with Tracking can follow a trail by observing tracks, marks, broken twigs and so forth, and also know how to hide tracks.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505027,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"gpzcF5naO9H3vNzi"}
{"name":"Charm","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Charm","description":"Charm is the ability to gain others trust (and perhaps even friendship) by offering companionship or favors. This Skill is normally only for use on NPCs; a player should have more control over his characters actions. The GM may rule that Charm can be used on a PC when it fits his Complications or personality.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"hZxL8I4mNlTsA9xQ"}
{"name":"Systems Operation","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Systems Operation","description":"Characters with Systems Operation know how to operate sensing and communication devices properly. It does not cover navigational equipment (thats Navigation) or encoding transmissions (thats Cryptography).","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"j7rkLue81LaHIzz7"} {"name":"Systems Operation","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Systems Operation","description":"Characters with Systems Operation know how to operate sensing and communication devices properly. It does not cover navigational equipment (thats Navigation) or encoding transmissions (thats Cryptography).","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"j7rkLue81LaHIzz7"}
{"name":"Ventriloquism","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Ventriloquism","description":"A character with Ventriloquism can make his voice sound as if its coming from somewhere other than himself, and can speak without apparently moving his lips. Ventriloquism is detected with a PER Roll in a Skill Versus Skill Contest. A Ventriloquism roll takes a -1 for every 2m of distance between the ventriloquist and the point where the voice “speaks.”","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"jFd7i04Eu1FLCEpJ"} {"name":"Ventriloquism","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"Ventriloquism","description":"A character with Ventriloquism can make his voice sound as if its coming from somewhere other than himself, and can speak without apparently moving his lips. Ventriloquism is detected with a PER Roll in a Skill Versus Skill Contest. A Ventriloquism roll takes a -1 for every 2m of distance between the ventriloquist and the point where the voice “speaks.”","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Intellect","characteristic":"INT","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505026,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"jFd7i04Eu1FLCEpJ"}
{"name":"High Society","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"High Society","description":"Characters with High Society know about upper-class culture and how to interact with it: what clothes to wear, which fork to use for shrimp, whos who, the gossip and “court politics” applicable to the situation, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"m40buQ4y7AzWbrA9"} {"name":"High Society","type":"skill","img":"systems/fvtt-hero-system-6/images/icons/HeroIcon-Skills.webp","system":{"displayname":"High Society","description":"Characters with High Society know about upper-class culture and how to interact with it: what clothes to wear, which fork to use for shrimp, whos who, the gossip and “court politics” applicable to the situation, and so forth.","notes":"","effects":"","cost":"","activecost":"","basecost":"3","value":"","modifiers":"","skilltype":"Interaction","characteristic":"PRE","base":"","levelscost":"2","levels":"","plusonecost":0,"skillroll":""},"effects":[],"flags":{"core":{"sourceId":"Item.KBoef00TNP73lDg0"}},"_stats":{"systemId":"fvtt-hero-system-6","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671911635138,"modifiedTime":1674948505025,"lastModifiedBy":"PNdow54uXjPLt2Zr"},"folder":null,"sort":0,"ownership":{"default":0,"PNdow54uXjPLt2Zr":3},"_id":"m40buQ4y7AzWbrA9"}

View File

@ -39,42 +39,44 @@
text-align: justify; text-align: justify;
font-size: 16px; font-size: 16px;
letter-spacing: 1px; letter-spacing: 1px;
color: rgba(44, 133, 133, 0.75); color: rgba(6, 56, 56, 0.75);
background: rgba(66, 66, 64, 0.95); background: rgba(228, 240, 240, 1);
} }
/* Fonts */ /* Fonts */
.sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item { .sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item {
font-size: 1.0rem; font-size: 1.0rem;
color: rgba(224, 208, 197, 0.9); color: rgba(224, 208, 197, 0.9);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
} /* For title, sidebar character and scene */ } /* For title, sidebar character and scene */
.sheet nav.sheet-tabs { .sheet nav.sheet-tabs {
font-size: 0.7rem; font-size: 0.7rem;
color: rgba(224, 208, 197, 0.9); color: rgba(224, 208, 197, 0.9);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
} /* For nav and title */ } /* For nav and title */
.fvtt-hero-system-6 .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle { .fvtt-hero-system-6 .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
font-size: 0.8rem; font-size: 0.8rem;
color: rgba(224, 208, 197, 0.9); color: rgba(4, 44, 44, 0.98);
background: rgba(66, 66, 64, 0.95); /*background: rgba(66, 66, 64, 0.95);*/
}
.window-app {
} }
.window-header{ .window-header{
background: rgba(0,0,0,0.75); background: rgba(0,0,0,0.75);
} }
.dialog .window-content { .dialog .window-content {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.dialog-content, .dialog-buttons, .form-fields { .dialog-content, .dialog-buttons, .form-fields {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.dialog-buttons { .dialog-buttons {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.dialog .dialog-buttons button.default { .dialog .dialog-buttons button.default {
color: rgba(66, 66, 64, 0.95); color: rgba(224, 208, 197, 0.9);
} }
.window-app.sheet .window-content { .window-app.sheet .window-content {
margin: 0; margin: 0;
@ -211,8 +213,7 @@ table { border: 1px solid #7a7971;}
flex: 'flex-shrink' ; flex: 'flex-shrink' ;
} }
/* Styles limited to foundryvtt-vadentis sheets */ /* Styles limited to foundryvtt-hero6 sheets */
.fvtt-hero-system-6 .sheet-header { .fvtt-hero-system-6 .sheet-header {
-webkit-box-flex: 0; -webkit-box-flex: 0;
-ms-flex: 0 0 210px; -ms-flex: 0 0 210px;
@ -399,14 +400,9 @@ form .form-group label {
text-align: right; text-align: right;
} }
.window-app.sheet .window-content .sheet-header {
/* ======================================== */ background: rgba(228, 240, 240, 0.75);
/* Sheet */
.window-app.sheet .window-content .sheet-header{
background: url("../images/ui/pc_sheet_bg.webp")
} }
/* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/
/*color: rgba(168, 139, 139, 0.5);*/
.window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] { .window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] {
background: rgba(228, 240, 240, 0.75); background: rgba(228, 240, 240, 0.75);
@ -434,13 +430,10 @@ form .form-group label {
.window-app .window-content, .window-app.sheet .window-content .sheet-body{ .window-app .window-content, .window-app.sheet .window-content .sheet-body{
font-size: 0.8rem; font-size: 0.8rem;
/*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/
background: rgba(228, 240, 240, 0.75); background: rgba(228, 240, 240, 0.75);
color: rgba(66, 66, 64, 0.95); color: rgba(66, 66, 64, 0.95);
} }
/* background: rgba(245,245,240,0.6) url("../images/ui/sheet_background.webp") left top;*/
section.sheet-body{padding: 0.25rem 0.5rem;} section.sheet-body{padding: 0.25rem 0.5rem;}
.sheet header.sheet-header .profile-img { .sheet header.sheet-header .profile-img {
@ -466,8 +459,6 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
color:beige; color:beige;
} }
/* background: rgb(245,245,240) url("../images/ui/fond4.webp") repeat left top;*/
nav.sheet-tabs .item { nav.sheet-tabs .item {
position: relative; position: relative;
padding: 0 0.15rem; padding: 0 0.15rem;
@ -480,7 +471,7 @@ nav.sheet-tabs .item:after {
right: 0; right: 0;
height: 2rem; height: 2rem;
width: 1px; width: 1px;
border-right: 1px dashed rgba(52, 52, 52, 0.25); /*border-right: 1px dashed rgba(52, 52, 52, 0.25);*/
} }
.sheet .tab[data-tab] { .sheet .tab[data-tab] {
@ -586,9 +577,6 @@ ul, li {
.item-display-hide { .item-display-hide {
display: none; display: none;
} }
.conteneur-type {
background: rgb(200, 10, 100, 0.25);
}
.item-quantite { .item-quantite {
margin-left: 0.5rem; margin-left: 0.5rem;
} }
@ -780,8 +768,6 @@ ul, li {
color: rgba(220,220,220,0.75); color: rgba(220,220,220,0.75);
} }
/* background: rgb(105,85,65) url("../images/ui/texture_feuille_perso_onglets.webp") no-repeat right bottom;*/
#sidebar.collapsed { #sidebar.collapsed {
height: 470px !important; height: 470px !important;
} }
@ -865,18 +851,6 @@ ul, li {
padding-bottom: .2rem; padding-bottom: .2rem;
} }
.div-river-full {
height: 5rem;
align-items: flex-start;
}
.div-river {
align-content: center;
margin-left: 8px;
align-content:space-around;
justify-content: space-around;
}
.div-center { .div-center {
align-self: center; align-self: center;
} }
@ -1051,38 +1025,9 @@ ul, li {
transition: opacity 0.3s; transition: opacity 0.3s;
} }
.tooltip .ttt-fatigue{
width: 360px;
background: rgba(30, 25, 20, 0.9);
border-image: url(img/ui/bg_control.jpg) 21 repeat;
border-image-slice: 6 6 6 6 fill;
border-image-width: 6px 6px 6px 6px;
border-image-outset: 0px 0px 0px 0px;
border-radius: 0px;
font-size: 0.8rem;
padding: 3px 0;
}
.tooltip .ttt-ajustements {
width: 150px;
background: rgba(220,220,210,0.95);
border-radius: 6px;
font-size: 0.9rem;
padding: 3px 0;
}
.tooltip-nobottom { .tooltip-nobottom {
border-bottom: unset; /* If you want dots under the hoverable text */ border-bottom: unset; /* If you want dots under the hoverable text */
} }
.tooltip .ttt-xp {
width: 250px;
background: rgba(220,220,210,0.95);
border-radius: 6px;
font-size: 0.9rem;
padding: 3px 0;
}
/* Show the tooltip text when you mouse over the tooltip container */ /* Show the tooltip text when you mouse over the tooltip container */
.tooltip:hover .tooltiptext { .tooltip:hover .tooltiptext {
@ -1154,34 +1099,6 @@ ul, li {
padding-left: 2rem; padding-left: 2rem;
} }
.drop-equipment-effect,
.drop-power-effect,
.drop-perk-effect,
.drop-ability-effect,
.drop-effect-specaffected,
.drop-effect-spec,
.drop-ability-weapon,
.drop-ability-armor,
.drop-race-perk,
.drop-spec-perk,
.drop-ability-power,
.drop-ability-spec,
.drop-spec-power,
.drop-specialability,
.drop-abilities,
.drop-optionnal-abilities,
.drop-virtue-vice-effect,
.drop-virtue-vice,
.drop-vice-virtue,
.drop-specialperk1,
.drop-perk2,
.drop-spec1 ,
.drop-spec2 {
background: linear-gradient(to bottom, #6c95b9fc 5%, #105177ab 100%);
background-color: #7d5d3b00;
border-radius: 3px;
border: 2px ridge #846109;
}
/*************************************************************/ /*************************************************************/
#pause #pause
@ -1392,6 +1309,11 @@ Focus FOC: #ff0084
max-width: 9rem; max-width: 9rem;
min-width: 9rem; min-width: 9rem;
} }
.item-field-label-very-short {
flex-grow:1;
max-width: 2.5rem;
min-width: 2.5rem;
}
.item-field-label-short { .item-field-label-short {
flex-grow:1; flex-grow:1;
max-width: 4rem; max-width: 4rem;
@ -1436,6 +1358,11 @@ Focus FOC: #ff0084
.margin-image-right { .margin-image-right {
margin-right: 4px; margin-right: 4px;
} }
.fixed-separator {
width: 12px;
max-width: 12px;
min-width: 12px;
}
.alternate-list { .alternate-list {
margin-top: 4px; margin-top: 4px;
flex-wrap: nowrap; flex-wrap: nowrap;
@ -1451,4 +1378,8 @@ Focus FOC: #ff0084
.biodata-portrait { .biodata-portrait {
min-height: 512px; min-height: 512px;
min-width: 256px; min-width: 256px;
}
.textarea-full-height {
min-height: 100%;
height: 100%;
} }

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

@ -91,15 +91,15 @@
"styles": [ "styles": [
"styles/simple.css" "styles/simple.css"
], ],
"version": "10.0.29", "version": "10.0.45",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "10", "verified": "10",
"maximum": "10" "maximum": "11"
}, },
"title": "Hero System v6 for FoundrtVTT (Official)", "title": "Hero System v6 for FoundrtVTT (Official)",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/raw/branch/main/system.json", "manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/raw/branch/main/system.json",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/archive/fvtt-hero-system-6-v10.0.29.zip", "download": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/archive/fvtt-hero-system-6-v10.0.45.zip",
"url": "https://www.uberwald.me/gitea/uberwald/", "url": "https://www.uberwald.me/gitea/uberwald/",
"background": "images/ui/hro6_welcome_page.webp", "background": "images/ui/hro6_welcome_page.webp",
"id": "fvtt-hero-system-6" "id": "fvtt-hero-system-6"

View File

@ -31,54 +31,57 @@
"xpearned": 0, "xpearned": 0,
"xpspent": 0, "xpspent": 0,
"combatskills": "", "combatskills": "",
"presenceattack": "", "presenceattack": {},
"gmnotes": "" "gmnotes": "",
"combatnotes1":""
} }
}, },
"characteristics": { "characteristics": {
"characteristics": { "characteristics": {
"str": { "str": {
"label": "Strength", "label": "STR",
"value": 10, "value": 10,
"base": 10, "base": 10,
"category": "main", "category": "main",
"strdice": "", "strdice": "1d6",
"lift": "", "lift": "",
"strend": 0, "strend": 0,
"strendmode": "str10",
"hasroll": true, "hasroll": true,
"realcost": 0, "realcost": 0,
"activecost": 0 "activecost": 0
}, },
"dex": { "dex": {
"label": "Dexterity", "label": "DEX",
"value": 10, "value": 10,
"base": 10, "base": 10,
"hasroll": true, "hasroll": true,
"category": "main" "category": "main"
}, },
"con": { "con": {
"label": "Constitution", "label": "CON",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10 "base": 10
}, },
"int": { "int": {
"label": "Intelligence", "label": "INT",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10 "base": 10,
"perceptionroll": 10
}, },
"ego": { "ego": {
"label": "Ego", "label": "EGO",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
"base": 10 "base": 10
}, },
"pre": { "pre": {
"label": "Presence", "label": "PRE",
"hasroll": true, "hasroll": true,
"category": "main", "category": "main",
"value": 10, "value": 10,
@ -121,7 +124,7 @@
"modifier": 1 "modifier": 1
}, },
"spd": { "spd": {
"label": "Speed", "label": "SPD",
"hasroll": false, "hasroll": false,
"value": 2, "value": 2,
"base": 2 "base": 2
@ -170,14 +173,6 @@
"value": 20, "value": 20,
"max": 20 "max": 20
}, },
"other": {
"label": "OTHER",
"hasroll": false,
"isvital": true,
"damage": 0,
"value": 20,
"max": 20
},
"body": { "body": {
"label": "BODY", "label": "BODY",
"hasroll": false, "hasroll": false,
@ -314,7 +309,6 @@
"power", "power",
"advantage", "advantage",
"maneuver", "maneuver",
"martialart",
"limitation", "limitation",
"complication", "complication",
"equipment" "equipment"
@ -338,12 +332,16 @@
"senseaffecting": false, "senseaffecting": false,
"modifiers": [], "modifiers": [],
"levels": 0, "levels": 0,
"quantity": 0, "quantity": 1,
"range": "", "range": "",
"damage": "", "damage": "",
"endurance": 0, "endurance": 0,
"hasroll": false, "hasroll": false,
"roll": 0, "roll": 0,
"computebody": false,
"haseffectroll": false,
"effectroll": "standard",
"effectrollformula": "",
"items": {} "items": {}
} }
}, },
@ -353,8 +351,9 @@
], ],
"maneuvertype": "general", "maneuvertype": "general",
"pha": "", "pha": "",
"ocv": 0, "ocv": "",
"dcv" : 0, "dcv" : "",
"isstock": false,
"active": false "active": false
}, },
"advantage": { "advantage": {
@ -369,7 +368,7 @@
}, },
"skill": { "skill": {
"skilltype": "agility", "skilltype": "agility",
"characteristic": "", "characteristic": "str",
"base": "", "base": "",
"levelscost": 0, "levelscost": 0,
"levels": 0, "levels": 0,
@ -458,15 +457,6 @@
"templates": [ "templates": [
"common" "common"
] ]
},
"martialart": {
"maneuver_phase": 0,
"maneuver_ocv": 0,
"maneuver_dcv": 0,
"maneuver_effect": "",
"templates": [
"common"
]
} }
} }
} }

View File

@ -4,7 +4,13 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<div class="flexrow"> <div class="flexrow">
<img class="profile-img margin-image-right" src="{{img}}" data-edit="img" title="{{name}}" />
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="fixed-separator">
&nbsp;
</div>
<div class="flexcol"> <div class="flexcol">
<h1 class="charname "><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname "><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
@ -98,7 +104,7 @@
<a class="" data-tab="skills">Skills</a> <a class="" data-tab="skills">Skills</a>
<a class="" data-tab="perks">Perks</a> <a class="" data-tab="perks">Perks</a>
<a class="" data-tab="talents">Talents</a> <a class="" data-tab="talents">Talents</a>
<a class="" data-tab="martial">Martial Arts</a> <a class="" data-tab="maneuver">Maneuvers</a>
<a class="" data-tab="powers">Powers</a> <a class="" data-tab="powers">Powers</a>
<a class="" data-tab="complications">Complications</a> <a class="" data-tab="complications">Complications</a>
<a class="" data-tab="equipment">Equipment</a> <a class="" data-tab="equipment">Equipment</a>
@ -117,17 +123,15 @@
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item"> <li class="item">
<label class="item-field-label-medium">STR Dice</label> <label class="item-field-label-medium">STR Dice</label>
<a class="roll-direct" data-roll-formula="{{characteristics.str.strdice}}"><i class="fas fa-dice"></i>{{characteristics.str.strdice}}</a> <a class="roll-lift-dice"><i class="fas fa-dice"></i>{{characteristics.str.strdice}}</a>
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-medium">Lift</label> <label class="item-field-label-medium">Lift</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.str.lift" value="{{characteristics.str.lift}}" data-dtype="String" /> <input type="text" class="item-field-label-short update-field" disabled data-field-name="system.characteristics.str.lift" value="{{characteristics.str.lift}}" data-dtype="String" />
<label class="item-field-label-short">&nbsp;</label> <label class="item-field-label-short">&nbsp;</label>
<label class="item-field-label-medium">STR END</label> <label class="item-field-label-medium">STR END</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.str.strend" value="{{characteristics.str.strend}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.str.strend" disabled value="{{characteristics.str.strend}}" data-dtype="Number" />
</li>
<li class="flexrow item">
<label class="item-field-label-long">Presence attack</label>
<a class="roll-direct" data-roll-formula="{{system.biodata.presenceattack}}"><i class="fas fa-dice"></i>{{system.biodata.presenceattack}}</a>
</li> </li>
</ul> </ul>
@ -135,18 +139,18 @@
<ul class="stat-list alternate-list"> <ul class="stat-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long-img"> <span class="item-field-label-long-img">
<label class="">{{upperFirst key}} Maneuvers</label> <label class="">{{upperFirst key}} Maneuver</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-very-short">
<label class="short-label">PHA</label> <label class="short-label">PHA</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-very-short">
<label class="short-label">OCV</label> <label class="short-label">OCV</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">DCV</label> <label class="short-label">DCV</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-long">
<label class="short-label">Effects</label> <label class="short-label">Effects</label>
</span> </span>
</li> </li>
@ -156,12 +160,13 @@
src="{{maneuver.img}}" /></a> src="{{maneuver.img}}" /></a>
<span class="item-field-label-long">{{maneuver.name}}</span> <span class="item-field-label-long">{{maneuver.name}}</span>
<span class="item-field-label-short">{{maneuver.system.pha}}</span> <span class="item-field-label-very-short">{{maneuver.system.pha}}</span>
<span class="item-field-label-short">{{maneuver.system.ocv}}</span> <span class="item-field-label-very-short">{{maneuver.system.ocv}}</span>
<span class="item-field-label-short">{{maneuver.system.dcv}}</span> <span class="item-field-label-short">{{maneuver.system.dcv}}</span>
<span class="item-field-label-medium">{{maneuver.system.effects}}</span> <span class="item-field-label-long">{{maneuver.system.effects}}</span>
<span class="item-field-label-short">&nbsp;</span>
<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>
@ -176,6 +181,15 @@
<li class="flexrow item"> <li class="flexrow item">
<label class="item-field-label-medium">SPD</label> <label class="item-field-label-medium">SPD</label>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.spd.value" value="{{characteristics.spd.value}}" data-dtype="Number" /> <input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.spd.value" value="{{characteristics.spd.value}}" data-dtype="Number" />
<span class="item-field-label-very-short">&nbsp;</span>
<button class="chat-card-button item-field-label-medium hold-action">Hold/Unhold</button>
<button class="chat-card-button item-field-label-medium abort-action">Abort/Unabort</button>
<span class="">&nbsp;</span>
<label class="item-field-label-long">Presence attack</label>
<a class="roll-direct" data-roll-source="Presence attack" data-roll-formula="{{system.biodata.presenceattack.rollFormula}}"><i class="fas fa-dice"></i>{{system.biodata.presenceattack.displayFormula}}</a>
</li> </li>
</ul> </ul>
@ -187,10 +201,10 @@
<label class="">Vitals</label> <label class="">Vitals</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Val.</label> <label class="short-label">Val</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Dam.</label> <label class="short-label">Dmg</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
@ -214,10 +228,10 @@
<label class="">Defenses</label> <label class="">Defenses</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Val.</label> <label class="short-label">Normal</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Res.</label> <label class="short-label">Resistant</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
@ -277,16 +291,16 @@
<label class="">Senses</label> <label class="">Senses</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Val.</label>
</span> </span>
</li> </li>
{{#each senses as |sense key|}}
<li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}"> <li class="item flexrow list-item list-item-shadow" data-charac-key="{{key}}">
<span class="item-field-label-long">{{sense.label}}</span> <span class="item-field-label-long">
<span class="item-field-label-short">{{sense.value}}</span> <a class="roll-perception"><i class="fas fa-dice"></i>Perception Roll</a>
</span>
<input type="text" class="item-field-label-short update-field" data-field-name="system.characteristics.int.perceptionroll" value="{{characteristics.int.perceptionroll}}" data-dtype="Number" />
</li> </li>
{{/each}}
</ul> </ul>
<textarea type="text" class="textarea-full-height padd-right" name="system.biodata.combatnotes1" data-dtype="String">{{system.biodata.combatnotes1}}</textarea>
</div> </div>
<div> <div>
@ -296,10 +310,10 @@
<label class="">Movement</label> <label class="">Movement</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">C.</label> <label class="short-label">C</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Non-C.</label> <label class="short-label">NC</label>
</span> </span>
</li> </li>
{{#each characteristics as |char key|}} {{#each characteristics as |char key|}}
@ -457,33 +471,44 @@
</ul> </ul>
</div> </div>
{{!-- Martial Tab --}} {{!-- Maneuvers Tab --}}
<div class="tab martial" data-group="primary" data-tab="martial"> <div class="tab maneuver" data-group="primary" data-tab="maneuver">
<ul class="stat-list alternate-list item-list"> <ul class="stat-list 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-field-label-long-img"> <span class="item-field-label-long-img">
<label class="">Martial Arts</label> <label class="">Maneuvers</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="short-label">Roll</label> <label class="short-label">PHA</label>
</span>
<span class="item-field-label-short">
<label class="short-label">OCV</label>
</span>
<span class="item-field-label-short">
<label class="short-label">DCV</label>
</span>
<span class="item-field-label-long">
<label class="short-label">Effects</label>
</span> </span>
</li> </li>
{{#each martialarts as |martial key|}} {{#each nonstockmaneuvers as |maneuver key|}}
<li class="item stat flexrow list-item list-item-shadow" data-item-id="{{martial._id}}"> <li class="item stat flexrow list-item list-item-shadow" data-item-id="{{maneuver._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="{{martial.img}}" /></a> src="{{maneuver.img}}" /></a>
<span class="item-name-label"><a class="roll-item" data-type="talent">{{martial.name}}</a></span> <span class="item-field-label-long">{{maneuver.name}}</span>
{{#if martial.system.hasroll}}
<span class="item-field-label-short">{{martial.system.roll}}-</span> <span class="item-field-label-short">{{maneuver.system.pha}}</span>
{{else}} <span class="item-field-label-short">{{maneuver.system.ocv}}</span>
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">{{maneuver.system.dcv}}</span>
{{/if}}
<div class="item-filler">&nbsp;</div> <span class="item-field-label-long">{{maneuver.system.effects}}</span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <div class="item-filler">&nbsp;</div>
</div> <div class="item-controls item-controls-fixed">
</li> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}} {{/each}}
</ul> </ul>
</div> </div>
@ -499,8 +524,14 @@
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="item-field-label-short">Cost</label> <label class="item-field-label-short">Cost</label>
</span> </span>
<span class="item-field-label-long4"> <span class="item-field-label-long3">
<label class="item-field-label-long4">Power</label> <label class="item-field-label-long3">Name</label>
</span>
<span class="item-field-label-long2">
<label class="item-field-label-long2">Display</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Effect</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="item-field-label-short">Roll</label> <label class="item-field-label-short">Roll</label>
@ -512,10 +543,11 @@
{{#each powers as |power key|}} {{#each powers as |power key|}}
<li class="item stat flexrow list-item list-item-shadow" data-item-id="{{power._id}}"> <li class="item stat flexrow list-item list-item-shadow" data-item-id="{{power._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="{{power.img}}" /></a> src="{{power.img}}" /></a>
<span class="item-field-label-short">{{power.system.cost}}</span> <span class="item-field-label-short">{{power.system.cost}}</span>
<span class="item-field-label-long4">{{{power.enrichDescription}}} <span class="item-field-label-long3">{{power.name}}</span>
</span> <span class="item-field-label-long2">{{power.system.displayname}}</span>
<span class="item-field-label-medium"><a class="roll-damage" data-type="power"><i class="fas fa-dice"></i>{{power.system.damage}}</a></span>
{{#if power.system.hasroll}} {{#if power.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="power"><i class="fas fa-dice"></i>{{power.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="power"><i class="fas fa-dice"></i>{{power.system.roll}}-</a></span>
{{else}} {{else}}
@ -569,6 +601,7 @@
<h3>Encumbrance</h3> <h3>Encumbrance</h3>
<span class="small-label">Current : {{encCurrent}}</span> <span class="small-label">Current : {{encCurrent}}</span>
<span class="small-label">Capacity : {{encCapacity}}</span> <span class="small-label">Capacity : {{encCapacity}}</span>
<span class="small-label">Total value : {{totalValue}}</span>
</div> </div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Weapons" items=weapons}} {{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment-section.hbs title="Weapons" items=weapons}}
@ -629,31 +662,31 @@
{{!-- Notes Tab --}} {{!-- Notes Tab --}}
<div class="tab notes" data-group="primary" data-tab="notes"> <div class="tab notes" data-group="primary" data-tab="notes">
<h3>Notes 1 : </h3> <h3>Notes 1 : </h3>
<div class="form-group editor"> <div class="medium-editor ">
{{editor notes1 target="system.biodata.notes1" button=true owner=owner {{editor notes1 target="system.biodata.notes1" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 2 : </h3> <h3>Notes 2 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes2 target="system.biodata.notes2" button=true owner=owner {{editor notes2 target="system.biodata.notes2" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 3 : </h3> <h3>Notes 3 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes3 target="system.biodata.notes3" button=true owner=owner {{editor notes3 target="system.biodata.notes3" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 4 : </h3> <h3>Notes 4 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes4 target="system.biodata.notes4" button=true owner=owner {{editor notes4 target="system.biodata.notes4" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>
<hr> <hr>
<h3>Notes 5 : </h3> <h3>Notes 5 : </h3>
<div class="form-group editor"> <div class="small-editor">
{{editor notes5 target="system.biodata.notes5" button=true owner=owner {{editor notes5 target="system.biodata.notes5" button=true owner=owner
editable=editable}} editable=editable}}
</div> </div>

View File

@ -0,0 +1,127 @@
<section class="{{cssClass}} directory flexcol" id="{{cssId}}" data-tab="{{tabName}}">
<header class="combat-tracker-header">
{{#if user.isGM}}
<nav class="encounters flexrow" aria-label="COMBAT.NavLabel">
<a class="combat-button combat-create" data-tooltip="COMBAT.Create">
<i class="fas fa-plus"></i>
</a>
{{#if combatCount}}
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterPrevious"
{{#if previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
<i class="fas fa-caret-left"></i>
</a>
<h4 class="encounter">{{localize "COMBAT.Encounter"}} {{currentIndex}} / {{combatCount}}</h4>
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterNext"
{{#if nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}>
<i class="fas fa-caret-right"></i>
</a>
{{/if}}
<a class="combat-button combat-control" data-tooltip="COMBAT.Delete" data-control="endCombat" {{#unless combatCount}}disabled{{/unless}}>
<i class="fas fa-trash"></i>
</a>
</nav>
{{/if}}
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
{{#if user.isGM}}
<a class="combat-button combat-control" data-tooltip="COMBAT.RollAll" data-control="rollAll" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users"></i>
</a>
<a class="combat-button combat-control" data-tooltip="COMBAT.RollNPC" data-control="rollNPC" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users-cog"></i>
</a>
{{/if}}
{{#if combatCount}}
{{#if combat.round}}
<h3 class="encounter-title noborder">Turn {{combat.turnNumber}} Segment {{combat.segmentNumber}}</h3>
{{else}}
<h3 class="encounter-title noborder">{{localize 'COMBAT.NotStarted'}}</h3>
{{/if}}
{{else}}
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
{{/if}}
{{#if user.isGM}}
<a class="combat-button combat-control" data-tooltip="COMBAT.InitiativeReset" data-control="resetAll"
{{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-undo"></i>
</a>
<a class="combat-button combat-control" data-tooltip="{{labels.scope}}"
data-control="toggleSceneLink" {{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
</a>
<a class="combat-button combat-settings" data-tooltip="COMBAT.Settings" data-control="trackerSettings">
<i class="fas fa-cog"></i>
</a>
{{/if}}
</div>
</header>
<ol id="combat-tracker" class="directory-list">
{{#each turns}}
{{#if (checkInit this.initiative)}}
<li class="combatant actor directory-item flexrow {{this.css}}" data-combatant-id="{{this.id}}">
<img class="token-image" data-src="{{this.img}}" alt="{{this.name}}"/>
<div class="token-name flexcol">
<h4>{{this.name}} </h4>
<div class="combatant-controls flexrow">
{{#if ../user.isGM}}
<a class="combatant-control {{#if this.hidden}}active{{/if}}" data-tooltip="COMBAT.ToggleVis" data-control="toggleHidden">
<i class="fas fa-eye-slash"></i>
</a>
<a class="combatant-control {{#if this.defeated}}active{{/if}}" data-tooltip="COMBAT.ToggleDead" data-control="toggleDefeated">
<i class="fas fa-skull"></i>
</a>
{{/if}}
{{#if this.canPing}}
<a class="combatant-control" data-tooltip="COMBAT.PingCombatant" data-control="pingCombatant">
<i class="fa-solid fa-bullseye-arrow"></i>
</a>
{{/if}}
<div class="token-effects">
{{#each this.effects}}
<img class="token-effect" src="{{this}}"/>
{{/each}}
</div>
</div>
</div>
{{#if this.hasResource}}
<div class="token-resource">
<span class="resource">{{this.resource}}</span>
</div>
{{/if}}
<div class="token-initiative">
{{#if this.hasRolled}}
<span class="initiative">{{this.initiative}}</span>
{{else if this.owner}}
<a class="combatant-control roll" data-tooltip="COMBAT.InitiativeRoll" data-control="rollInitiative"></a>
{{/if}}
</div>
</li>
{{/if}}
{{/each}}
</ol>
<nav id="combat-controls" class="directory-footer flexrow" data-tooltip-direction="UP">
{{#if hasCombat}}
{{#if user.isGM}}
{{#if round}}
<a class="combat-control" data-tooltip="COMBAT.RoundPrev" data-control="previousRound"><i class="fas fa-step-backward"></i></a>
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
<a class="combat-control center" data-control="endCombat">{{localize 'COMBAT.End'}}</a>
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
<a class="combat-control" data-tooltip="COMBAT.RoundNext" data-control="nextRound"><i class="fas fa-step-forward"></i></a>
{{else}}
<a class="combat-control center" data-control="startCombat">{{localize 'COMBAT.Begin'}}</a>
{{/if}}
{{else if control}}
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
<a class="combat-control center" data-control="nextTurn">{{localize 'COMBAT.TurnEnd'}}</a>
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
{{/if}}
{{/if}}
</nav>
</section>

View File

@ -9,10 +9,10 @@
<div class="flexcol"> <div class="flexcol">
{{#if charac}} {{#if charac}}
<div class="flexrow"> <div class="flexrow">
<span class="item-field-label-long margin-item-list">Characteristic : </span> <span class="item-field-label-long margin-item-list">{{#if isPerception}}Perception{{else}}Characteristic{{/if}} : </span>
<span class="item-field-label-medium margin-item-list">{{charac.roll}}-</span> <span class="item-field-label-medium margin-item-list">{{charac.roll}}-</span>
</div> </div>
{{/if}} {{/if}}
{{#if item}} {{#if item}}

View File

@ -0,0 +1,29 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class=chat-actor-name>{{alias}}</h4>
</div>
<hr>
{{#if img}}
<div >
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol">
</div>
<div>
<ul>
<li>Name : {{title}}</li>
<li>Damage formula : {{diceFormula}}</li>
<li><strong>TOTAL : {{result}}</strong></li>
<li><strong>BODY : {{bodyValue}}</strong></li>
</ul>
</div>
</div>

View File

@ -18,8 +18,14 @@
<div> <div>
<ul> <ul>
{{#if target}}
<li>Target Roll : {{target}}- <li>Target Roll : {{target}}-
</li> </li>
{{/if}}
{{#if rollSource}}
<li>Roll : {{rollSource}}</li>
{{/if}}
{{#if charac}} {{#if charac}}
<li>CHAR : {{charac.label}}</li> <li>CHAR : {{charac.label}}</li>
@ -29,11 +35,24 @@
<li>{{item.name}} ({{upperFirst item.type}})</li> <li>{{item.name}} ({{upperFirst item.type}})</li>
{{/if}} {{/if}}
{{#if (exists bonusMalus)}}
<li>Bonus/Penalty : {{bonusMalus}} <li>Bonus/Penalty : {{bonusMalus}}
</li> </li>
{{/if}}
<li><strong>Result : {{result}}</strong> ({{#if isSuccess}}Success!!{{else}}Failure!{{/if}})</li> <li><strong>TOTAL : {{result}}</strong>
{{#if (exists margin)}}
({{#if isSuccess}}Success!!{{else}}Failure!{{/if}})
{{/if}}
</li>
{{#if (exists bodyValue)}}
<li><strong>BODY : {{bodyValue}}</strong>
{{/if}}
{{#if (exists margin)}}
<li><strong>Margin : {{margin}}</strong> <li><strong>Margin : {{margin}}</strong>
{{/if}}
</ul> </ul>
</div> </div>

View File

@ -0,0 +1,3 @@
<div>
BODY : {{bodyValue}}
</div>

View File

@ -0,0 +1,29 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class=chat-actor-name>{{alias}}</h4>
</div>
<hr>
{{#if img}}
<div >
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol">
</div>
<div>
<ul>
<li>Lift dice formula : {{diceFormula}}</li>
<li>BODY : {{bodyValue}}</li>
<li><strong>TOTAL : {{result}}</strong></li>
</ul>
</div>
</div>

View File

@ -1,46 +0,0 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class=chat-actor-name>{{alias}}</h4>
</div>
<hr>
{{#if img}}
<div>
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol">
</div>
<div>
{{#if isRangedAttack}}
<div>{{defender.name}} is under Ranged attack. He must roll a Target Roll to defend himself.</div>
{{else}}
<div>{{defender.name}} is under Melee attack. He must roll a Defense Roll to defend himself.</div>
{{/if}}
<ul>
{{#if isRangedAttack}}
<li>
<button class="chat-card-button roll-defense-ranged" data-roll-id="{{@root.rollId}}">Roll Target !</button>
</li>
{{else}}
<li>
{{#each defenderWeapons as |weapon idx|}}
<button class="chat-card-button roll-defense-melee" data-defense-weapon-id="{{weapon._id}}"
data-roll-id="{{@root.rollId}}">{{weapon.name}}</button>
{{/each}}
</li>
{{/if}}
</ul>
<!-- <button class="chat-card-button reroll-level-remaining" data-roll-id="{{rollId}}">Reroll</button> -->
</ul>
</div>
</div>

View File

@ -1,9 +1,9 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> <header class="sheet-header">
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/> <img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="header-fields"> <div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
</div> </div>
</header> </header>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs}}
@ -16,33 +16,54 @@
<div class="tab details" data-group="primary" data-tab="details"> <div class="tab details" data-group="primary" data-tab="details">
<ul> <ul>
{{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs}}
<li class="flexrow"><label class="item-field-label-long">Subtype</label>
<select class="item-field-label-long" type="text" name="system.subtype" value="{{system.subtype}}" data-dtype="String">
{{#select system.subtype}}
{{#each config.equipmentSubType as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Equipped ?</label> <li class="flexrow"><label class="item-field-label-long">Equipped ?</label>
<label class="item-field-label-medium"><input type="checkbox" name="system.equipped" {{checked system.equipped}}/></label> <label class="item-field-label-medium"><input type="checkbox" name="system.equipped" {{checked
system.equipped}} /></label>
</li>
<li class="flexrow"><label class="item-field-label-long">Quantity</label>
<input type="text" class="item-field-label-short" name="system.quantity" value="{{system.quantity}}"
data-dtype="Number" />
</li>
<li class="flexrow">
<label class="item-field-label-long">Value</label>
<input type="text" class="item-field-label-medium input-numeric-short padd-right" name="system.value"
value="{{system.value}}" data-dtype="Number" />
&nbsp;
<label class="item-field-label-long">Total Value</label>
<label class="item-field-label-long">{{mul system.value system.quantity}}</label>
</li> </li>
<li class="flexrow"><label class="item-field-label-long">Weight</label> <li class="flexrow"><label class="item-field-label-long">Weight</label>
<input type="text" class="item-field-label-medium input-numeric-short padd-right" name="system.weight" value="{{system.weight}}" data-dtype="Number"/> <input type="text" class="item-field-label-medium input-numeric-short padd-right" name="system.weight"
value="{{system.weight}}" data-dtype="Number" />
&nbsp;
<label class="item-field-label-long">Total Weight</label>
<label class="item-field-label-long">{{mul system.weight system.quantity}}</label>
</li> </li>
<li class="flexrow"><label class="item-field-label-long">Value</label>
<input type="text" class="item-field-label-medium input-numeric-short padd-right" name="system.value" value="{{system.value}}" data-dtype="Number"/> {{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs quantityDone=1}}
<li class="flexrow"><label class="item-field-label-long">Subtype</label>
<select class="item-field-label-long" type="text" name="system.subtype" value="{{system.subtype}}"
data-dtype="String">
{{#select system.subtype}}
{{#each config.equipmentSubType as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</li> </li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul> </ul>
</div> </div>
</section> </section>
</form> </form>

View File

@ -27,21 +27,28 @@
</select> </select>
</li> </li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-power-maneuver-effect.hbs}}
<li class="flexrow"><label class="item-field-label-medium">Is stock ?</label>
<label class="item-field-label-medium"><input type="checkbox" name="system.isstock" {{checked system.isstock}}/></label>
</li>
<li class="flexrow"><label class="item-field-label-medium">PHA</label> <li class="flexrow"><label class="item-field-label-medium">PHA</label>
<input type="text" class="item-field-label-medium" name="system.pha" value="{{system.pha}}" data-dtype="String"/> <input type="text" class="item-field-label-medium" name="system.pha" value="{{system.pha}}" data-dtype="String"/>
</li> </li>
<li class="flexrow"><label class="item-field-label-medium">OCV</label> <li class="flexrow"><label class="item-field-label-medium">OCV</label>
<input type="text" class="item-field-label-medium" name="system.ocv" value="{{system.ocv}}" data-dtype="Number"/> <input type="text" class="item-field-label-medium" name="system.ocv" value="{{system.ocv}}" data-dtype="String"/>
</li> </li>
<li class="flexrow"><label class="item-field-label-medium">DCV</label> <li class="flexrow"><label class="item-field-label-medium">DCV</label>
<input type="text" class="item-field-label-medium" name="system.dcv" value="{{system.dcv}}" data-dtype="Number"/> <input type="text" class="item-field-label-medium" name="system.dcv" value="{{system.dcv}}" data-dtype="String"/>
</li> </li>
<li class="flexrow"><label class="item-field-label-medium">Effects</label> <li class="flexrow"><label class="item-field-label-medium">Effects</label>
<input type="text" class="item-field-label-long" name="system.effects" value="{{system.effects}}" data-dtype="String"/> <input type="text" class="item-field-label-long" name="system.effects" value="{{system.effects}}" data-dtype="String"/>
</li> </li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul> </ul>

View File

@ -1,23 +0,0 @@
<form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs}}
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="tab details" data-group="primary" data-tab="details">
<ul>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
</section>
</form>

View File

@ -18,6 +18,8 @@
<ul> <ul>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs}}
<!-- {{> systems/fvtt-hero-system-6/templates/partials/partial-power-maneuver-effect.hbs}} -->
{{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}} {{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}

View File

@ -1,22 +1,31 @@
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-field-label-long-img"> <span class="item-name-img">
<label class="">{{title}}</label> <label class="">&nbsp;</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-short">
<label class="item-field-label-medium">Value</label> <label class="item-field-label-short">Qty</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-long3">
<label class="item-field-label-medium">Mass</label> <label class="item-field-label-long3">{{title}}</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-long">
<label class="item-field-label-medium">Quantity</label> <label class="item-field-label-long4">Display</label>
</span>
<span class="item-field-label-short">
<label class="item-field-label-short">Effect</label>
</span> </span>
<span class="item-field-label-short"> <span class="item-field-label-short">
<label class="item-field-label-short">Roll</label> <label class="item-field-label-short">Roll</label>
</span> </span>
<span class="item-field-label-medium"> <span class="item-field-label-short">
<label class="item-field-label-medium">END</label> <label class="item-field-label-short">END</label>
</span>
<span class="item-field-label-short">
<label class="item-field-label-short">Value</label>
</span>
<span class="item-field-label-short">
<label class="item-field-label-short">Weight</label>
</span> </span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">

View File

@ -1,18 +1,17 @@
<li class="item flexrow list-item list-item-shadow" data-item-id="{{equip._id}}"> <li class="item flexrow list-item list-item-shadow" data-item-id="{{equip._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{equip.img}}" /></a> <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{equip.img}}" /></a>
<span class="item-name-label">{{equip.name}}</span>
<span class="item-field-label-medium"><label>{{equip.system.value}} <span class="item-field-label-short"><label>{{equip.system.quantity}}</label> </span>
<span class="item-field-label-long3">{{equip.name}}</span>
<span class="item-field-label-long"><label>{{equip.system.displayname}}
</label> </label>
</span> </span>
<span class="item-field-label-medium"><label>{{equip.system.weight}} <span class="item-field-label-short"><label><a class="roll-damage" data-type="perk"><i class="fas fa-dice"></i>{{equip.system.damage}}</a>
</label> </label>
</span> </span>
<span class="item-field-label-medium"><label>{{equip.system.quantity}}
</label>
</span>
{{#if equip.system.hasroll}} {{#if equip.system.hasroll}}
<span class="item-field-label-short"><a class="roll-item" data-type="perk"><i class="fas fa-dice"></i>{{equip.system.roll}}-</a></span> <span class="item-field-label-short"><a class="roll-item" data-type="perk"><i class="fas fa-dice"></i>{{equip.system.roll}}-</a></span>
@ -20,9 +19,11 @@
<span class="item-field-label-short">&nbsp;</span> <span class="item-field-label-short">&nbsp;</span>
{{/if}} {{/if}}
<span class="item-field-label-medium"><label>{{equip.system.endurance}} <span class="item-field-label-short"><label>{{equip.system.endurance}}</label> </span>
</label>
</span> <span class="item-field-label-short"><label>{{mul equip.system.quantity equip.system.value}}</label> </span>
<span class="item-field-label-short"><label>{{mul equip.system.quantity equip.system.weight}}</label> </span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">

View File

@ -1,20 +1,51 @@
<li class="item stat flexrow list-item list-item-shadow" data-attr-key="{{key}}"> <li class="item stat flexrow list-item list-item-shadow" data-attr-key="{{key}}">
<input type="text" class="item-field-label-medium" name="system.characteristics.{{key}}.value" value="{{charac.value}}" data-dtype="Number"/> <input type="text" class="item-field-label-medium" name="system.characteristics.{{key}}.value"
value="{{charac.value}}" data-dtype="Number" />
<span class="item-field-label-medium" name="{{key}}"> <span class="item-field-label-medium" name="{{key}}">
<h4 class="item-field-label-medium margin-item-list">{{charac.label}}</a></h4> <h4 class="item-field-label-medium margin-item-list">{{charac.label}}</a></h4>
</span> </span>
<h4 class="item-field-label-short margin-item-list">{{charac.base}}</h4> <h4 class="item-field-label-short margin-item-list">{{charac.base}}</h4>
{{#if charac.hasroll}} {{#if charac.hasroll}}
<h4 class="item-field-label-short margin-item-list"><a class="roll-charac" data-charac-key="{{key}}"><i class="fas fa-dice"></i>{{charac.roll}}-</a></h4> <h4 class="item-field-label-short margin-item-list"><a class="roll-charac" data-charac-key="{{key}}"><i
class="fas fa-dice"></i>{{charac.roll}}-</a></h4>
{{else}} {{else}}
<h4 class="item-field-label-short margin-item-list">&nbsp;</h4> <h4 class="item-field-label-short margin-item-list">&nbsp;</h4>
{{/if}} {{/if}}
<input type="text" class="item-field-label-long2" name="system.characteristics.{{key}}.notes" value="{{charac.notes}}" data-dtype="String"/> <input type="text" class="item-field-label-long2" name="system.characteristics.{{key}}.notes" value="{{charac.notes}}"
data-dtype="String" />
{{#if charac.lift}}
<h4 class="item-field-label-short margin-item-list">&nbsp;&nbsp;</h4>
<h4 class="item-field-label-short margin-item-list">{{charac.lift}}</h4>
<h4 class="item-field-label-medium margin-item-list"><a class="roll-lift-dice" data-charac-key="{{key}}"><i
class="fas fa-dice"></i>{{charac.liftDice}}</a></h4>
<select class="actor-computer-str-end" name="system.characteristics.str.strendmode"
value="{{charac.strendmode}}">
{{#select charac.strendmode}}
<option value="str20">STR/20 (half normal)</option>
<option value="str10">STR/10 (normal, half heroic)</option>
<option value="str5">STR/5 (heroic)</option>
<option value="0">0</option>
{{/select}}
</select>
{{/if}}
{{#if charac.phasesString}}
<h4 class="item-field-label-short margin-item-list">&nbsp;&nbsp;</h4>
<h4 class="item-field-label-long2 margin-item-list">Phases : {{charac.phasesString}}</h4>
{{/if}}
{{#if charac.presenceattack}}
<h4 class="item-field-label-short margin-item-list">&nbsp;&nbsp;</h4>
<h4 class="item-field-label-long margin-item-list">Presence attack</h4>
<a class="roll-direct" data-roll-source="Presence attack" data-roll-formula="{{charac.presenceattack.rollFormula}}"><i class="fas fa-dice"></i>{{charac.presenceattack.displayFormula}}</a>
{{/if}}
</li> </li>

View File

@ -3,16 +3,18 @@
<label class="item-field-label-medium">Display name</label> <label class="item-field-label-medium">Display name</label>
<input type="text" class="" name="system.displayname" value="{{system.displayname}}" data-dtype="string"/> <input type="text" class="" name="system.displayname" value="{{system.displayname}}" data-dtype="string"/>
</div> </div>
<div>
<label class="generic-label">Notes</label>
<div class="small-editor item-text-long-line">
{{editor notes target="system.notes" button=true owner=owner editable=editable}}
</div>
</div>
<div> <div>
<label class="generic-label">Description</label> <label class="generic-label">Description</label>
<div class="medium-editor item-text-long-line"> <div class="medium-editor item-text-long-line">
{{editor description target="system.description" button=true owner=owner editable=editable}} {{editor description target="system.description" button=true owner=owner editable=editable}}
</div> </div>
</div> </div>
<div>
<label class="generic-label">Notes</label>
<div class="medium-editor item-text-long-line">
{{editor notes target="system.notes" button=true owner=owner editable=editable}}
</div>
</div>
</div> </div>

View File

@ -6,4 +6,9 @@
<li class="flexrow"><label class="item-field-label-long">Roll</label> <li class="flexrow"><label class="item-field-label-long">Roll</label>
<input type="text" class="item-field-label-medium" name="system.roll" value="{{system.roll}}" data-dtype="Number"/> <input type="text" class="item-field-label-medium" name="system.roll" value="{{system.roll}}" data-dtype="Number"/>
</li> </li>
<!-- <li class="flexrow"><label class="item-field-label-long">Computes BODY ?</label>
<label class="item-field-label-medium"><input type="checkbox" name="system.computebody" {{checked system.computebody}}/></label>
</li> -->
{{/if}} {{/if}}

View File

@ -31,6 +31,9 @@
<li class="flexrow"><label class="item-field-label-long">Endurance</label> <li class="flexrow"><label class="item-field-label-long">Endurance</label>
<input type="text" class="item-field-label-short" name="system.endurance" value="{{system.endurance}}" data-dtype="Number"/> <input type="text" class="item-field-label-short" name="system.endurance" value="{{system.endurance}}" data-dtype="Number"/>
</li> </li>
{{#if quantityDone}}
{{else}}
<li class="flexrow"><label class="item-field-label-long">Quantity</label> <li class="flexrow"><label class="item-field-label-long">Quantity</label>
<input type="text" class="item-field-label-short" name="system.quantity" value="{{system.quantity}}" data-dtype="Number"/> <input type="text" class="item-field-label-short" name="system.quantity" value="{{system.quantity}}" data-dtype="Number"/>
</li> </li>
{{/if}}

View File

@ -0,0 +1,20 @@
<li class="flexrow"><label class="item-field-label-long">Has Effect Roll ?</label>
<label class="item-field-label-medium"><input type="checkbox" name="system.haseffectroll" {{checked
system.haseffectroll}} /></label>
</li>
{{#if system.haseffectroll}}
<li class="flexrow"><label class="item-field-label-long">Effect Roll</label>
<select class="item-field-label-long" type="text" name="system.effectroll" value="{{system.effectroll}}"
data-dtype="String">
{{#select system.effectroll}}
{{#each config.powerEffectRoll as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Effect roll formula</label>
<input type="text" class="item-field-label-long" name="system.effectrollformula" value="{{system.effectrollformula}}" data-dtype="String"/>
</li>
{{/if}}