Compare commits

..

11 Commits

Author SHA1 Message Date
536739fced All fixes requested 2023-05-07 14:03:14 +02:00
2d328659b2 Combat Tracker + power enhancements 2023-04-06 16:57:19 +02:00
b9b8fa7c0d Update release 2023-03-28 15:41:15 +02:00
0368be050b Update combat tab 2023-03-24 10:17:20 +01:00
4ca23257cb Combat tab 2023-03-22 22:43:30 +01:00
e0adf04753 Combat tab 2023-03-21 20:43:41 +01:00
d399b29d84 WIP Hero 6 2023-03-21 14:01:27 +01:00
4d3f067bf9 Enhance march 2023-03-14 19:23:46 +01:00
3489dc6254 Enhance march 2023-03-14 19:23:19 +01:00
b23d0836fe Some fixes 2023-02-21 20:22:08 +01:00
0fe4202098 Enhance sheets 2023-02-14 15:34:37 +01:00
32 changed files with 2421 additions and 687 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.history/

View File

@ -1,3 +1,18 @@
{
}
{
"ACTOR": {
"TypeCharacter": "Character"
},
"ITEM": {
"TypeSkill": "Skill",
"TypePerk": "Perk",
"TypePower": "Power",
"TypeTalent": "Talent",
"TypeAdvantage": "Advantage",
"TypeMartialart": "Martial art",
"TypeLimitation": "Limitation",
"TypeComplication": "Complication",
"TypeEquipment": "Equipment",
"TypeCurrency": "Currency",
"TypeManeuver": "Maneuver"
}
}

View File

@ -14,8 +14,8 @@ export class Hero6ActorSheet extends ActorSheet {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-hero-system-6", "sheet", "actor"],
template: "systems/fvtt-hero-system-6/templates/actors/actor-sheet.hbs",
width: 960,
height: 720,
width: 1124,
height: 916,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "main" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: true
@ -36,21 +36,34 @@ export class Hero6ActorSheet extends ActorSheet {
cssClass: this.isEditable ? "editable" : "locked",
system: objectData,
characteristics: this.actor.prepareCharac(),
defenses: duplicate(this.actor.system.defenses),
movements: duplicate(this.actor.system.movements),
limited: this.object.limited,
skills: this.actor.getSkills( ),
perks: this.actor.getPerks( ),
powers: await this.actor.getPowers( ),
talents: this.actor.getTalents( ),
complications: this.actor.getComplications( ),
maneuvers: this.actor.getManeuvers( ),
nonstockmaneuvers: this.actor.getNonStockManeuvers(),
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ),
equippedArmor: this.actor.getEquippedArmor(),
equippedShield: this.actor.getEquippedShield(),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsMoneys()) ),
subActors: duplicate(this.actor.getSubActors()),
race: duplicate(this.actor.getRace()),
moneys: duplicate(this.actor.getMoneys()),
encCapacity: this.actor.getEncumbranceCapacity(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}),
motivation: await TextEditor.enrichHTML(this.object.system.biodata.motivation, {async: true}),
quote: await TextEditor.enrichHTML(this.object.system.biodata.quote, {async: true}),
tactics: await TextEditor.enrichHTML(this.object.system.biodata.tactics, {async: true}),
campaignuse: await TextEditor.enrichHTML(this.object.system.biodata.campaignuse, {async: true}),
appearance: await TextEditor.enrichHTML(this.object.system.biodata.appearance, {async: true}),
notes1: await TextEditor.enrichHTML(this.object.system.biodata.notes1, {async: true}),
notes2: await TextEditor.enrichHTML(this.object.system.biodata.notes2, {async: true}),
notes3: await TextEditor.enrichHTML(this.object.system.biodata.notes3, {async: true}),
notes4: await TextEditor.enrichHTML(this.object.system.biodata.notes4, {async: true}),
notes5: await TextEditor.enrichHTML(this.object.system.biodata.notes5, {async: true}),
containersTree: this.actor.containersTree,
encCurrent: this.actor.encCurrent,
options: this.options,
@ -139,7 +152,28 @@ export class Hero6ActorSheet extends ActorSheet {
const characKey = $(event.currentTarget).data("charac-key");
this.actor.rollCharac(characKey);
});
html.find('.roll-direct').click((event) => {
const rollFormula = $(event.currentTarget).data("roll-formula")
const rollSource = $(event.currentTarget).data("roll-source")
Hero6Utility.processDirectRoll( { actorId: this.actor.id, rollFormula: rollFormula, rollSource: rollSource, mode:"directroll"} )
});
html.find('.roll-item').click((event) => {
const li = $(event.currentTarget).parents(".item");
let itemId = li.data("item-id")
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) => {
const li = $(event.currentTarget).parents(".item");
const skillId = li.data("item-id")
@ -163,7 +197,11 @@ export class Hero6ActorSheet extends ActorSheet {
html.find('.update-field').change(ev => {
const fieldName = $(ev.currentTarget).data("field-name");
let value = Number(ev.currentTarget.value);
const fieldType = $(ev.currentTarget).data("dtype");
let value = ev.currentTarget.value
if (fieldType.toLowerCase() == "Number") {
value = Number(value)
}
this.actor.update( { [`${fieldName}`]: value } );
});
}

View File

@ -1,14 +1,12 @@
/* -------------------------------------------- */
import { Hero6Utility } from "./hero6-utility.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 statThreatLevel = ["agi", "str", "phy", "com", "def", "per"]
const __subkey2title = {
"melee-dmg": "Melee Damage", "melee-atk": "Melee Attack", "ranged-atk": "Ranged Attack",
"ranged-dmg": "Ranged Damage", "dmg-res": "Damare Resistance"
}
const __speed2Segments = [[0], [7], [6, 12], [4, 8, 12], [3, 6, 9, 12], [3, 5, 8, 10, 12], [2, 4, 6, 8, 10, 12]
[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],
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
/* -------------------------------------------- */
/* -------------------------------------------- */
@ -43,8 +41,8 @@ export class Hero6Actor extends Actor {
}
if (data.type == 'character') {
const skills = await Hero6Utility.loadCompendium("fvtt-hero-system-6.skills");
data.items = skills.map(i => i.toObject())
//const skills = await Hero6Utility.loadCompendium("fvtt-hero-system-6.skills");
//data.items = skills.map(i => i.toObject())
}
if (data.type == 'npc') {
}
@ -66,6 +64,11 @@ export class Hero6Actor extends Actor {
if (this.type == "character") {
}
}
computeDicesValue() {
this.system.biodata.presenceattack = Hero6Utility.getDerivatedDiceFormulas(this.system.characteristics.pre.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() {
@ -73,6 +76,7 @@ export class Hero6Actor extends Actor {
this.system.encCapacity = this.getEncumbranceCapacity()
this.buildContainerTree()
this.computeHitPoints()
this.computeDicesValue()
}
super.prepareDerivedData();
@ -91,7 +95,7 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */
getMoneys() {
let comp = this.items.filter(item => item.type == 'money');
let comp = this.items.filter(item => item.type == 'currency');
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
@ -163,10 +167,78 @@ export class Hero6Actor extends Actor {
}
return item;
}
/* -------------------------------------------- */
prepareSkill(skill) {
skill.roll = 0
skill.charac = "N/A"
skill.system.skilltype = skill.system.skilltype.toLowerCase()
if (skill.system.skillfamiliarity) {
skill.roll = 8;
} else if (skill.system.skillprofiency) {
skill.roll = 10;
} else if (skill.system.skilltype == "agility") {
skill.charac = "dex"
let charac = duplicate(this.system.characteristics.dex)
this.prepareCharacValues(charac)
skill.roll = charac.roll
} else if (skill.system.skilltype == "interaction") {
skill.charac = "pre"
let charac = duplicate(this.system.characteristics.pre)
this.prepareCharacValues(charac)
skill.roll = charac.roll
} else if (skill.system.skilltype == "intellect") {
skill.charac = "int"
let charac = duplicate(this.system.characteristics.int)
this.prepareCharacValues(charac)
skill.roll = charac.roll
} else if (skill.system.skilltype == "background") {
skill.roll = 11
} else if (skill.system.skilltype == "custom") {
if (skill.system.characteristic == "manual") {
skill.roll = skill.system.base
} else {
skill.charac = (skill.system.characteristic == "") ? "str" : skill.system.characteristic
let charac = duplicate(this.system.characteristics[skill.system.characteristic])
this.prepareCharacValues(charac)
skill.roll = charac.roll
}
}
console.log("SILL", skill)
if (skill.system.levels > 0) {
skill.roll += skill.system.levels
}
}
/* -------------------------------------------- */
getSkills() {
let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
for (let skill of comp) {
this.prepareSkill(skill)
}
Hero6Utility.sortArrayObjectsByName(comp)
return comp
}
getPerks() {
let comp = duplicate(this.items.filter(item => item.type == 'perk') || [])
Hero6Utility.sortArrayObjectsByName(comp)
return comp
}
async getPowers() {
let comp = duplicate(this.items.filter(item => item.type == 'power') || [])
for (let c of comp) {
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)
return comp
}
getTalents() {
let comp = duplicate(this.items.filter(item => item.type == 'talent') || [])
Hero6Utility.sortArrayObjectsByName(comp)
return comp
}
getComplications() {
let comp = duplicate(this.items.filter(item => item.type == 'complication') || [])
Hero6Utility.sortArrayObjectsByName(comp)
return comp
}
@ -204,14 +276,51 @@ export class Hero6Actor extends Actor {
}
return 0;
}
/* ------------------------------------------- */
getEquipments() {
return this.items.filter(item => item.type == 'shield' || item.type == 'armor' || item.type == "weapon" || item.type == "equipment");
getManeuvers() {
let maneuvers = {
general: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "general"),
offensive: this.items.filter(item => item.type == "maneuver" && item.system.maneuvertype == "offensive"),
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
}
getEquipments() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getWeapons() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "weapon");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getArmors() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "armor");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getShields() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "shield");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getEquipmentsMoneys() {
let list = duplicate(this.items.filter(item => item.type == "equipment" && (item.system.subtype == "equipment" || item.system.subtype == "money")) || [])
Hero6Utility.sortArrayObjectsByName(list)
return list
}
/* ------------------------------------------- */
getEquipmentsOnly() {
return duplicate(this.items.filter(item => item.type == "equipment") || [])
let list = duplicate(this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment") || [])
Hero6Utility.sortArrayObjectsByName(list)
return list
}
/* ------------------------------------------- */
@ -259,7 +368,7 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */
async incDecHP(formula) {
let dmgRoll = new Roll(formula+"[dark-starsorange]").roll({ async: false })
let dmgRoll = new Roll(formula + "[dark-starsorange]").roll({ async: false })
await Hero6Utility.showDiceSoNice(dmgRoll, game.settings.get("core", "rollMode"))
let hp = duplicate(this.system.secondary.hp)
hp.value = Number(hp.value) + Number(dmgRoll.total)
@ -305,13 +414,23 @@ export class Hero6Actor extends Actor {
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
}
/* -------------------------------------------- */
getInitiativeScore(combatId, combatantId) {
if (this.type == 'character') {
this.rollMR(true, combatId, combatantId)
}
console.log("Init required !!!!")
return -1;
hasPhase(segmentNumber) {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
let phases = __speed2Segments[index]
return phases.includes(segmentNumber)
}
/* -------------------------------------------- */
getSegments() {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
return __speed2Segments[index]
}
/* -------------------------------------------- */
getBaseInit() {
let r = new Roll("1d6").roll({ async: false })
let base = this.system.characteristics.dex.value + (r.total / 10)
return base
}
/* -------------------------------------------- */
@ -340,14 +459,19 @@ export class Hero6Actor extends Actor {
}
/* -------------------------------------------- */
prepareCharacValues( charac) {
charac.total = charac.base+charac.value
charac.roll = 9 + Math.floor((charac.base+charac.value)/5)
prepareCharacValues(charac) {
charac.total = charac.value
charac.roll = 9 + Math.floor((charac.value) / 5)
}
prepareCharac() {
let characs = duplicate(this.system.characteristics)
for(let key in characs) {
this.prepareCharacValues( characs[key])
for (let key in characs) {
let ch = characs[key]
this.prepareCharacValues(ch)
if (key == "str") {
ch.lift = Hero6LiftDice.getLift(ch.value)
ch.liftDice = Hero6LiftDice.getLiftDice(ch.value)
}
}
return characs
}
@ -444,7 +568,56 @@ export class Hero6Actor extends Actor {
}
this.startRoll(rollData)
}
/* -------------------------------------------- */
rollItem(itemId) {
let item = this.items.get(itemId)
let rollData = this.getCommonRollData()
rollData.mode = "item"
rollData.item = duplicate(item)
if (item.type == "skill") {
this.prepareSkill(rollData.item)
}
this.startRoll(rollData)
}
/* -------------------------------------------- */
async rollDamage(itemId) {
let item = this.items.get(itemId)
let rollData = this.getCommonRollData()
rollData.mode = "damage"
rollData.item = duplicate(item)
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 msg = await Hero6Utility.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-damage-result.hbs`, rollData)
})
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.roll = myRoll
rollData.result = myRoll.total
let msg = await Hero6Utility.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-hero-system-6/templates/chat/chat-lift-dice-result.hbs`, rollData)
})
msg.setFlag("world", "rolldata", rollData)
console.log("Rolldata result", rollData)
}
/* -------------------------------------------- */
rollSkill(skillId) {
let skill = this.items.get(skillId)

View File

@ -1,21 +1,141 @@
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() {
var 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 init() {
Hooks.on("getCombatTrackerEntryContext", (html, options) => { Hero6Combat.pushMenuOptions(html, options); });
}
/* -------------------------------------------- */
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 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)
}
}
newOpt.name = "Abort action"
newOpt.callback = target => {
Hero6Combat.abortAction(target.data('combatant-id'));
}
options.push( newOpt)
}
/* -------------------------------------------- */
static holdAction(combatantId) {
console.log("Combatant HOLD : ", combatantId)
const combatant = game.combat.combatants.get(combatantId)
combatant.setFlag("world", "hero6-hold-action", true)
combatant.update({name: combatant.name + " (H)"})
console.log("HOLD", combatant)
}
/* -------------------------------------------- */
static abortAction(html, combatantId) {
console.log("Combatant ABORT : ", combatantId);
const combatant = game.combat.combatants.get(combatantId);
combatant.setFlag("world", "hero6-abort-action", true)
combatant.update({name: combatant.name + " (A)"})
console.log("ABORT", combatant)
}
/* -------------------------------------------- */
constructor(data, context) {
super(data, context);
this.turnNumber = 1;
this.segmentNumber = 12;
}
/* -------------------------------------------- */
async computeInitiative(c) {
let id = c._id || c.id
if (c.actor.hasPhase(this.segmentNumber)) {
let baseInit = c.actor ? c.actor.getBaseInit() : - 1;
await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: baseInit }]);
} else {
await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: -1, visible: false, active: false }]);
}
console.log("Combatant", c)
}
/* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
ids = typeof ids === "string" ? [ids] : ids;
for (let cId = 0; cId < ids.length; cId++) {
const c = this.combatants.get(ids[cId]);
let id = c._id || c.id;
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1;
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]);
const c = this.combatants.get(ids[cId])
await this.computeInitiative(c)
}
return this;
}
/* -------------------------------------------- */
nextRound() {
let turn = this.turn === null ? null : 0; // 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;
}
}
let advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime;
advanceTime += CONFIG.time.roundTime;
let nextRound = this.round + 1;
let turnData = this.getFlag("world", "hero6-turn-data")
if (!turnData) {
turnData = { turnNumber: 1, segmentNumber: 12 }
this.setFlag("world", "hero6-turn-data", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber -= 1
if (turnData.segmentNumber <= 0) {
turnData.segmentNumber = 12
turnData.turnNumber++
}
this.setFlag("world", "hero6-turn-data", turnData)
this.turnNumber = turnData.turnNumber;
this.segmentNumber = turnData.segmentNumber;
// Re-compute init of actors
for (let c of this.combatants) {
this.computeInitiative(c)
}
// Update the document, passing data through a hook first
const updateData = { round: nextRound, 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) {
console.log(">>>>", documents)
super._onCreateEmbeddedDocuments(type, documents, result, 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";
/* -------------------------------------------- */
const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower"}
const __saveFirstToKey = { r: "reflex", f: "fortitude", w: "willpower" }
/* -------------------------------------------- */
export class Hero6Commands {
static init() {
static ready() {
if (!game.system.hero6.commands) {
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: ["/rsave"], func: (content, msg, params) => Hero6Commands.rollSave(msg, params), descr: "Performs a save roll" });
hero6Commands.registerCommand({ path: ["/rh"], func: (content, msg, params) => Hero6Commands.rollSpecialHero(msg, params), descr: "Special roll hero roll (1/2d6 like)" });
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() {
@ -108,37 +118,17 @@ export class Hero6Commands {
}
/* -------------------------------------------- */
static rollTarget(msg, params) {
const speaker = ChatMessage.getSpeaker()
let actor
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.rollDefenseRanged()
}
/* -------------------------------------------- */
static rollSave(msg, params) {
console.log(msg, params)
if ( params.length == 0) {
ui.notifications.warn("/rsave command error : syntax is /rsave reflex, /rsave fortitude or /rsave willpower")
return
}
let saveKey = params[0].toLowerCase()
if ( saveKey.length > 0 && (saveKey[0] == "r" || saveKey[0] == "f" || saveKey[0] == "w")) {
const speaker = ChatMessage.getSpeaker()
let actor
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")
static async rollSpecialHero(msg, params) {
console.log("ROLL HERE", msg, params)
let formula = params.join(' ')
if (formula) {
let foundryFormula = Hero6Utility.convertRollHeroSyntax(formula)
let myRoll = new Roll(foundryFormula).roll({ async: false })
await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
myRoll.toMessage()
return true
}
return false
}
}

View File

@ -1,6 +1,17 @@
export const Hero6_CONFIG = {
equipmentSubType: {
equipment: "Equipment",
weapon: "Weapon",
armor: "Armor",
shield: "Shield",
money: "Money"
},
maneuverTypes: {
"general": "General",
"offensive": "Offensive",
"defensive": "Defensive"
},
rollCharac : {
"str": "Strength",
"dex": "Dexterity",
@ -37,5 +48,11 @@ export const Hero6_CONFIG = {
powerSenseAffecting: {
"none": "None",
"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,
cssClass: this.isEditable ? "editable" : "locked",
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,
system: objectData,
limited: this.object.limited,
@ -145,6 +146,16 @@ export class Hero6ItemSheet extends ItemSheet {
let itemType = li.data("item-type");
});
html.find('.item-skill-profiency').click(ev => {
this.object.update( {'system.levels': 12, 'system.cost': 2} )
} )
html.find('.item-skill-familiarity').click(ev => {
this.object.update( {'system.levels': 10, 'system.cost': 1} )
} )
html.find('.item-skill-everyman').click(ev => {
this.object.update( {'system.levels': 8, 'system.cost': 0} )
} )
html.find('.view-subitem').click(ev => {
this.viewSubitem(ev);
});

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.5d6"
},
"4": {
"weight": "44 kg",
"dice": "0.5d6"
},
"5": {
"weight": "50 kg",
"dice": "1d6"
},
"6": {
"weight": "58 kg",
"dice": "1d6"
},
"7": {
"weight": "67 kg",
"dice": "1d6"
},
"8": {
"weight": "75 kg",
"dice": "1.5d6"
},
"9": {
"weight": "88 kg",
"dice": "1.5d6"
},
"10": {
"weight": "100 kg",
"dice": "2d6"
},
"11": {
"weight": "117 kg",
"dice": "2d6"
},
"12": {
"weight": "133 kg",
"dice": "2d6"
},
"13": {
"weight": "150 kg",
"dice": "2.5d6"
},
"14": {
"weight": "175 kg",
"dice": "2.5d6"
},
"15": {
"weight": "200 kg",
"dice": "3d6"
},
"16": {
"weight": "233 kg",
"dice": "3d6"
},
"17": {
"weight": "267 kg",
"dice": "3d6"
},
"18": {
"weight": "300 kg",
"dice": "3.5d6"
},
"19": {
"weight": "350 kg",
"dice": "3.5d6"
},
"20": {
"weight": "400 kg",
"dice": "4d6"
},
"21": {
"weight": "467 kg",
"dice": "4d6"
},
"22": {
"weight": "533 kg",
"dice": "4d6"
},
"23": {
"weight": "600 kg",
"dice": "4.5d6"
},
"24": {
"weight": "700 kg",
"dice": "4.5d6"
},
"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.5d6"
},
"29": {
"weight": "1,400 kg",
"dice": "5.5d6"
},
"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.5d6"
},
"34": {
"weight": "2,800 kg",
"dice": "6.5d6"
},
"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.5d6"
},
"39": {
"weight": "5,600 kg",
"dice": "7.5d6"
},
"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.5d6"
},
"44": {
"weight": "11 tons",
"dice": "8.5d6"
},
"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.5d6"
},
"49": {
"weight": "22 tons",
"dice": "9.5d6"
},
"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.5d6"
},
"54": {
"weight": "44 tons",
"dice": "10.5d6"
},
"55": {
"weight": "50 tons",
"dice": "11d6"
},
"56": {
"weight": "58 tons",
"dice": "11d6"
},
"57": {
"weight": "67 tons",
"dice": "11d6"
},
"58": {
"weight": "75 tons",
"dice": "11.5d6"
},
"59": {
"weight": "88 tons",
"dice": "11.5d6"
},
"60": {
"weight": "100 tons",
"dice": "12d6"
},
"61": {
"weight": "117 tons",
"dice": "12d6"
},
"62": {
"weight": "133 tons",
"dice": "12d6"
},
"63": {
"weight": "150 tons",
"dice": "12.5d6"
},
"64": {
"weight": "175 tons",
"dice": "12.5d6"
},
"65": {
"weight": "200 tons",
"dice": "13d6"
},
"66": {
"weight": "233 tons",
"dice": "13d6"
},
"67": {
"weight": "267 tons",
"dice": "13d6"
},
"68": {
"weight": "300 tons",
"dice": "13.5d6"
},
"69": {
"weight": "350 tons",
"dice": "13.5d6"
},
"70": {
"weight": "400 tons",
"dice": "14d6"
},
"71": {
"weight": "467 tons",
"dice": "14d6"
},
"72": {
"weight": "533 tons",
"dice": "14d6"
},
"73": {
"weight": "600 tons",
"dice": "14.5d6"
},
"74": {
"weight": "700 tons",
"dice": "14.5d6"
},
"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.5d6"
},
"79": {
"weight": "1.4 ktons",
"dice": "15.5d6"
},
"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.5d6"
},
"84": {
"weight": "2.8 ktons",
"dice": "16.5d6"
},
"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.5d6"
},
"89": {
"weight": "5.6 ktons",
"dice": "17.5d6"
},
"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.5d6"
},
"94": {
"weight": "11 ktons",
"dice": "18.5d6"
},
"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.5d6"
},
"99": {
"weight": "22 ktons",
"dice": "19.5d6"
},
"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 { Hero6NPCSheet } from "./hero6-npc-sheet.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 { Hero6Hotbar } from "./hero6-hotbar.js"
import { Hero6Commands } from "./hero6-commands.js"
@ -41,7 +41,7 @@ Hooks.once("init", async function () {
// Set an initiative formula for the system
CONFIG.Combat.initiative = {
formula: "1d6",
decimals: 1
decimals: 3
};
/* -------------------------------------------- */
@ -54,6 +54,8 @@ Hooks.once("init", async function () {
CONFIG.Combat.documentClass = Hero6Combat
CONFIG.Actor.documentClass = Hero6Actor
CONFIG.Item.documentClass = Hero6Item
CONFIG.ui.combat = Hero6CombatTracker;
/* -------------------------------------------- */
// Register sheet application classes
@ -91,15 +93,9 @@ Hooks.once("ready", function () {
});
}
// CSS patch for v9
if (game.version) {
let sidebar = document.getElementById("sidebar");
sidebar.style.width = "min-content";
}
welcomeMessage();
Hero6Utility.ready()
Hero6Commands.init()
Hero6Commands.ready()
})
/* -------------------------------------------- */

View File

@ -15,16 +15,17 @@ export class Hero6Utility {
Hero6Utility.dropItemOnToken(canvas, data)
});*/
Hero6Commands.init();
Handlebars.registerHelper('count', function (list) {
return list.length;
})
Handlebars.registerHelper('exists', function (val) {
return val != null && val != undefined;
});
Handlebars.registerHelper('includes', function (array, val) {
return array.includes(val);
})
Handlebars.registerHelper('upper', function (text) {
if (text) {
if (text) {
return text.toUpperCase();
}
return text
@ -43,15 +44,14 @@ export class Hero6Utility {
return parseInt(a) * parseInt(b);
})
Handlebars.registerHelper('locationLabel', function (key) {
return __locationNames[key]
return __locationNames[key]
})
Handlebars.registerHelper('isSkillCustom', function (key) {
if (key == "custom" || key == "background" ) {
if (key == "custom") {
return true;
}
return false
})
this.gameSettings()
@ -77,6 +77,19 @@ export class Hero6Utility {
}) */
}
/*-------------------------------------------- */
static getDerivatedDiceFormulas(value) {
let rollFormula = Math.floor(value / 5) + "d6"
let displayFormula = Math.floor(value / 5)
if (value % 5 > 2) {
rollFormula += "+round(1d6/2)"
displayFormula += " 1/2d6"
} else {
displayFormula += "d6"
}
return { rollFormula: rollFormula, displayFormula: displayFormula }
}
/*-------------------------------------------- */
static upperFirst(text) {
if (typeof text !== 'string') return text
@ -127,24 +140,6 @@ export class Hero6Utility {
html.on("click", '.view-item-from-chat', 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)
}
})
}
/* -------------------------------------------- */
@ -154,6 +149,7 @@ export class Hero6Utility {
'systems/fvtt-hero-system-6/templates/partials/editor-notes-gm.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-roll-select.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-characteristic-block.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-full-charac.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-status.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-options-abilities.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-nav.hbs',
@ -162,6 +158,9 @@ export class Hero6Utility {
'systems/fvtt-hero-system-6/templates/partials/partial-item-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-actor-equipment.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);
}
@ -290,17 +289,48 @@ 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) {
let actor = game.actors.get(rollData.actorId)
// ability/save/size => 0
let diceFormula = "3d6+" + rollData.bonusMalus
let diceFormula = "3d6"
let target = 10
if (rollData.charac) {
target = rollData.charac.roll
}
if (rollData.item) {
target = rollData.item.roll || rollData.item.system.roll
}
target += rollData.bonusMalus
// Performs roll
console.log("Roll formula", diceFormula)
@ -309,6 +339,7 @@ export class Hero6Utility {
myRoll = new Roll(diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
}
rollData.roll = myRoll
rollData.target = target
rollData.diceFormula = diceFormula
@ -317,22 +348,54 @@ export class Hero6Utility {
if (rollData.result <= target) {
rollData.isSuccess = true
}
if ( myRoll.terms[0].total == 3) { // Always a success
if (myRoll.terms[0].total == 3) { // Always a success
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.margin = target - rollData.result
this.outputRollMessage(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)
}
/* -------------- ----------------------------- */
static async outputRollMessage(rollData) {
let msg = await this.createChatWithRollMode(rollData.alias, {
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 convertRollHeroSyntax( hero6Formula) {
// Ensure we have no space at all
//hero6Formula = hero6Formula.replace(/\s/g, '')
let hasHalfDice = ""
if (hero6Formula.match("1/2d6")) {
hero6Formula = hero6Formula.replace("1/2d6", "d6")
hasHalfDice = "+round(1d6)"
}
let foundryFormula = hero6Formula + hasHalfDice
foundryFormula = foundryFormula.replace(' ', '')
console.log("Parsed formula : ", hero6Formula, foundryFormula)
return foundryFormula
}
/* -------------- ----------------------------- */
static sortArrayObjectsByName(myArray) {
myArray.sort((a, b) => {
let fa = a.name.toLowerCase();

View File

@ -39,42 +39,44 @@
text-align: justify;
font-size: 16px;
letter-spacing: 1px;
color: rgba(44, 133, 133, 0.75);
background: rgba(66, 66, 64, 0.95);
color: rgba(6, 56, 56, 0.75);
background: rgba(228, 240, 240, 1);
}
/* Fonts */
.sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item {
font-size: 1.0rem;
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 */
.sheet nav.sheet-tabs {
font-size: 0.8rem;
font-size: 0.7rem;
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 */
.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;
color: rgba(224, 208, 197, 0.9);
background: rgba(66, 66, 64, 0.95);
color: rgba(4, 44, 44, 0.98);
/*background: rgba(66, 66, 64, 0.95);*/
}
.window-app {
}
.window-header{
background: rgba(0,0,0,0.75);
}
.dialog .window-content {
color: rgba(66, 66, 64, 0.95);
color: rgba(224, 208, 197, 0.9);
}
.dialog-content, .dialog-buttons, .form-fields {
color: rgba(66, 66, 64, 0.95);
color: rgba(224, 208, 197, 0.9);
}
.dialog-buttons {
color: rgba(66, 66, 64, 0.95);
color: rgba(224, 208, 197, 0.9);
}
.dialog .dialog-buttons button.default {
color: rgba(66, 66, 64, 0.95);
color: rgba(224, 208, 197, 0.9);
}
.window-app.sheet .window-content {
margin: 0;
@ -173,19 +175,6 @@ table { border: 1px solid #7a7971;}
grid-template-columns: repeat(12, minmax(0, 1fr));
}
.flex-group-center,
.flex-group-left,
.flex-group-right {
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
text-align: center;
padding: 5px;
}
.flex-group-left {
-webkit-box-pack: start;
-ms-flex-pack: start;
@ -224,8 +213,7 @@ table { border: 1px solid #7a7971;}
flex: 'flex-shrink' ;
}
/* Styles limited to foundryvtt-vadentis sheets */
/* Styles limited to foundryvtt-hero6 sheets */
.fvtt-hero-system-6 .sheet-header {
-webkit-box-flex: 0;
-ms-flex: 0 0 210px;
@ -412,14 +400,9 @@ form .form-group label {
text-align: right;
}
/* ======================================== */
/* Sheet */
.window-app.sheet .window-content .sheet-header{
background: url("../images/ui/pc_sheet_bg.webp")
.window-app.sheet .window-content .sheet-header {
background: rgba(228, 240, 240, 0.75);
}
/* 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"] {
background: rgba(228, 240, 240, 0.75);
@ -447,13 +430,10 @@ form .form-group label {
.window-app .window-content, .window-app.sheet .window-content .sheet-body{
font-size: 0.8rem;
background: url("../images/ui/pc_sheet_bg.webp") repeat left top;
background: rgba(228, 240, 240, 0.75);
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;}
.sheet header.sheet-header .profile-img {
@ -466,7 +446,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
.sheet nav.sheet-tabs {
font-size: 0.70rem;
font-weight: bold;
height: 3rem;
height: 2.5rem;
flex: 0 0 3rem;
margin: 0;
padding: 0 0 0 0.25rem;
@ -479,11 +459,9 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
color:beige;
}
/* background: rgb(245,245,240) url("../images/ui/fond4.webp") repeat left top;*/
nav.sheet-tabs .item {
position: relative;
padding: 0 0.25rem;
padding: 0 0.15rem;
}
nav.sheet-tabs .item:after {
@ -493,7 +471,7 @@ nav.sheet-tabs .item:after {
right: 0;
height: 2rem;
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] {
@ -546,7 +524,7 @@ ul, li {
}
.sheet li {
margin: 0.010rem;
margin: 0.1rem;
padding: 0.25rem;
}
.header-fields li {
@ -574,10 +552,10 @@ ul, li {
}
.list-item {
margin: 0.125rem;
margin: 0.2rem;
/*box-shadow: inset 0px 0px 1px #00000096;*/
/*border-radius: 0.25rem;*/
padding: 0.125rem;
padding: 0.2rem;
flex: 1 1 5rem;
display: flex !important;
}
@ -599,9 +577,6 @@ ul, li {
.item-display-hide {
display: none;
}
.conteneur-type {
background: rgb(200, 10, 100, 0.25);
}
.item-quantite {
margin-left: 0.5rem;
}
@ -793,8 +768,6 @@ ul, li {
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 {
height: 470px !important;
}
@ -878,18 +851,6 @@ ul, li {
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 {
align-self: center;
}
@ -952,7 +913,7 @@ ul, li {
}
#sidebar #sidebar-tabs i{
width: 25px;
/*width: 25px;*/
height: 25px;
display: inline-block;
background-position:center;
@ -1064,38 +1025,9 @@ ul, li {
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 {
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 */
.tooltip:hover .tooltiptext {
@ -1167,34 +1099,6 @@ ul, li {
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
@ -1420,6 +1324,26 @@ Focus FOC: #ff0084
max-width: 8rem;
min-width: 8rem;
}
.item-field-label-long-img {
flex-grow:1;
max-width: 10rem;
min-width: 10rem;
}
.item-field-label-long2 {
flex-grow:1;
max-width: 16rem;
min-width: 16rem;
}
.item-field-label-long3 {
flex-grow:1;
max-width: 30rem;
min-width: 30rem;
}
.item-field-label-long4 {
flex-grow:1;
max-width: 40rem;
min-width: 40rem;
}
.item-control-end {
align-self: flex-end;
}
@ -1429,6 +1353,11 @@ Focus FOC: #ff0084
.margin-image-right {
margin-right: 4px;
}
.fixed-separator {
width: 12px;
max-width: 12px;
min-width: 12px;
}
.alternate-list {
margin-top: 4px;
flex-wrap: nowrap;
@ -1441,3 +1370,11 @@ Focus FOC: #ff0084
min-width:2rem;
max-width: 2rem;
}
.biodata-portrait {
min-height: 512px;
min-width: 256px;
}
.textarea-full-height {
min-height: 100%;
height: 100%;
}

View File

@ -91,7 +91,7 @@
"styles": [
"styles/simple.css"
],
"version": "10.0.9",
"version": "10.0.36",
"compatibility": {
"minimum": "10",
"verified": "10",
@ -99,7 +99,7 @@
},
"title": "Hero System v6 for FoundrtVTT (Official)",
"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.9.zip",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/archive/fvtt-hero-system-6-v10.0.36.zip",
"url": "https://www.uberwald.me/gitea/uberwald/",
"background": "images/ui/hro6_welcome_page.webp",
"id": "fvtt-hero-system-6"

View File

@ -8,59 +8,87 @@
"biodata": {
"species": "",
"age": 0,
"campaign":"",
"alternateids":"",
"player": "",
"gm": "",
"gender": 0,
"character": "",
"mass":"",
"religion": "",
"weight": "",
"height": "",
"background": "",
"motivation": "",
"quote" : "",
"tactics": "",
"campaignuse": "",
"appearance": "",
"description": "",
"notes": "",
"gmnotes": ""
"points": 0,
"complications": 0,
"xpearned": 0,
"xpspent": 0,
"combatskills": "",
"presenceattack": {},
"gmnotes": "",
"combatnotes1":""
}
},
"characteristics": {
"characteristics": {
"str": {
"label": "Strength",
"value": 0,
"label": "STR",
"value": 10,
"base": 10,
"category": "main",
"strdice": "",
"lift": "",
"strend": 0,
"hasroll": true,
"realcost": 0,
"activecost": 0
},
"dex": {
"label": "Dexterity",
"value": 0,
"label": "DEX",
"value": 10,
"base": 10,
"hasroll": true,
"category": "main"
},
"con": {
"label": "Constitution",
"label": "CON",
"hasroll": true,
"category": "main",
"value": 0,
"value": 10,
"base": 10
},
"int": {
"label": "Intelligence",
"label": "INT",
"hasroll": true,
"category": "main",
"value": 0,
"base": 10
"value": 10,
"base": 10,
"perceptionroll": 10
},
"ego": {
"label": "Ego",
"label": "EGO",
"hasroll": true,
"category": "main",
"value": 0,
"value": 10,
"base": 10
},
"pre": {
"label": "Presence",
"label": "PRE",
"hasroll": true,
"category": "main",
"value": 0,
"value": 10,
"base": 10
},
"ocv": {
"label": "OCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -69,6 +97,7 @@
},
"dcv": {
"label": "DCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -77,6 +106,7 @@
},
"omcv": {
"label": "OMCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -85,6 +115,7 @@
},
"dmcv": {
"label": "DMCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -92,12 +123,15 @@
"modifier": 1
},
"spd": {
"label": "Speed",
"label": "SPD",
"hasroll": false,
"value": 2,
"base": 2
},
"pd": {
"label": "PD",
"hasroll": false,
"isdefense": true,
"value": 2,
"base": 2,
"pd_nonresistant_total": 0,
@ -107,6 +141,8 @@
},
"ed": {
"label": "ED",
"hasroll": false,
"isdefense": true,
"value": 2,
"base": 2,
"ed_nonresistant_total": 0,
@ -116,21 +152,31 @@
},
"rec": {
"label": "REC",
"hasroll": false,
"value": 4,
"base": 4
},
"end": {
"label": "REC",
"label": "END",
"hasroll": false,
"isvital": true,
"damage": 0,
"value": 20,
"max": 20
},
"stun": {
"label": "STUN",
"hasroll": false,
"isvital": true,
"damage": 0,
"value": 20,
"max": 20
},
"body": {
"label": "Body",
"label": "BODY",
"hasroll": false,
"isvital": true,
"damage": 0,
"value": 10,
"max": 10,
"loc": {
@ -154,27 +200,91 @@
},
"running": {
"label": "Running",
"ismovement": true,
"hasroll": false,
"value": 12,
"base": 12
},
"swimming": {
"label": "Swimming",
"ismovement": true,
"hasroll": false,
"value": 4,
"base": 4
},
"leaping": {
"label": "Leaping",
"ismovement": true,
"hasroll": false,
"value": 4,
"base": 4,
"leaping_horizontal_base": 0,
"leaping_horizontal_total": 0,
"leaping_vertical_base": 0,
"leaping_vertical_total": 0
}
}
},
"movements": {
"movements": {
"fly": {
"label": "Fly",
"value": 0
},
"flying": {
"label": "Flying",
"teleport": {
"label": "Teleport",
"value": 0
},
"tunnel": {
"label": "Tunnel",
"value": 0
},
"move1": {
"label": "N/A",
"iseditable": true,
"value": 0
},
"move2": {
"label": "N/A",
"iseditable": true,
"value": 0
}
}
},
"defenses": {
"defenses": {
"mental": {
"label": "Mental",
"value": 0,
"base": 0
"resistant": ""
},
"power": {
"label": "Power",
"value": 0,
"resistant": ""
},
"flash": {
"label": "Flash",
"value": 0,
"resistant": ""
},
"def1": {
"label": "N/A",
"value": 0,
"iseditable": true,
"resistant": ""
},
"def2": {
"label": "N/A",
"value": 0,
"iseditable": true,
"resistant": ""
},
"def3": {
"label": "N/A",
"value": 0,
"iseditable": true,
"resistant": ""
}
}
},
@ -183,7 +293,9 @@
"character": {
"templates": [
"biodata",
"characteristics"
"characteristics",
"defenses",
"movements"
],
"subactors": []
}
@ -195,6 +307,7 @@
"talent",
"power",
"advantage",
"maneuver",
"limitation",
"complication",
"equipment"
@ -224,9 +337,24 @@
"endurance": 0,
"hasroll": false,
"roll": 0,
"computebody": false,
"haseffectroll": false,
"effectroll": "standard",
"effectrollformula": "",
"items": {}
}
},
"maneuver": {
"templates": [
"common"
],
"maneuvertype": "general",
"pha": "",
"ocv": 0,
"dcv" : 0,
"isstock": false,
"active": false
},
"advantage": {
"templates": [
"common"
@ -239,10 +367,14 @@
},
"skill": {
"skilltype": "agility",
"characteristic": "",
"characteristic": "str",
"base": "",
"levelscost": 0,
"levels": 0,
"skilllevelonly": false,
"skillfamiliarity": false,
"skilleveryman": false,
"skillprofiency": false,
"templates": [
"common"
]
@ -258,6 +390,7 @@
"common",
"power"
],
"subtype": "equipment",
"value": 0,
"weight": 0,
"moneycost": 0
@ -291,15 +424,6 @@
"impenetrable": 0,
"value": 0
},
"maneuver": {
"templates": [
"common"
],
"phase": 0,
"ocv": "+0",
"dcv": "+0",
"active": false
},
"movement": {
"templates": [
"common"
@ -332,15 +456,6 @@
"templates": [
"common"
]
},
"martialart": {
"maneuver_phase": 0,
"maneuver_ocv": 0,
"maneuver_dcv": 0,
"maneuver_effect": "",
"templates": [
"common"
]
}
}
}

File diff suppressed because it is too large Load Diff

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 (ne this.initiative "-1")}}
<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}} {{log this}} {{#if this.holdAction}}(H){{/if}}</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

@ -15,10 +15,27 @@
</div>
{{/if}}
{{#if item}}
<div class="flexrow">
<span class="item-field-label-long margin-item-list">Bonus/Malus : </span>
<span class="item-field-label-long margin-item-list">{{upperFirst item.type}} - {{upperFirst item.name}}</span>
{{#if item.roll}}
<span class="item-field-label-medium margin-item-list">{{item.roll}}-</span>
{{else}}
<span class="item-field-label-medium margin-item-list">{{item.system.roll}}-</span>
{{/if}}
</div>
{{/if}}
<div class="flexrow">
<span class="item-field-label-long margin-item-list">Bonus/Penalty : </span>
<select class="item-field-label-medium" type="text" id="bonusMalus" value="{{bonusMalus}}" data-dtype="Number" >
{{#select bonusMalus}}
<option value="-10">-10</option>
<option value="-9">-9</option>
<option value="-8">-8</option>
<option value="-7">-7</option>
<option value="-6">-6</option>
<option value="-5">-5</option>
<option value="-4">-4</option>
<option value="-3">-3</option>
<option value="-2">-2</option>
@ -28,6 +45,12 @@
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
{{/select}}
</select>
</div>

View File

@ -0,0 +1,30 @@
<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>Damage formula : {{diceFormula}}</li>
<li><strong>Result : {{result}}</strong></li>
<li><strong>BODY : {{bodyValue}}</strong></li>
</ul>
</div>
</div>

View File

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

View File

@ -0,0 +1,28 @@
<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><strong>Result : {{result}}</strong></li>
</ul>
</div>
</div>

View File

@ -16,10 +16,10 @@
<div class="tab details" data-group="primary" data-tab="details">
<ul>
<li class="flexrow"><label class="generic-label">Quantity</label>
<input type="text" class="input-numeric-short padd-right" name="system.quantity" value="{{data.quantity}}" data-dtype="Number"/>
<input type="text" class="input-numeric-short padd-right" name="system.quantity" value="{{system.quantity}}" data-dtype="Number"/>
</li>
<li class="flexrow"><label class="generic-label">Unit value</label>
<input type="text" class="input-numeric-short padd-right" name="system.value" value="{{data.value}}" data-dtype="Number"/>
<input type="text" class="input-numeric-short padd-right" name="system.value" value="{{system.value}}" data-dtype="Number"/>
</li>
</ul>
</div>

View File

@ -16,20 +16,30 @@
<div class="tab details" data-group="primary" data-tab="details">
<ul>
{{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-power-equipment-cost.hbs}}
<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>
</li>
<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">Weight</label>
<input type="text" class="item-field-label-medium input-numeric-short padd-right" name="system.weight" value="{{system.weight}}" 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"/>
</li>
<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>
</li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
<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"/>
</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"/>
</li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>

View File

@ -0,0 +1,57 @@
<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">
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs}}
<div class="tab details" data-group="primary" data-tab="details">
<ul>
<li class="flexrow"><label class="item-field-label-long">Type</label>
<select class="item-field-label-long" type="text" name="system.maneuvertype" value="{{system.maneuvertype}}" data-dtype="String">
{{#select system.maneuvertype}}
{{#each config.maneuverTypes as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</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>
<input type="text" class="item-field-label-medium" name="system.pha" value="{{system.pha}}" data-dtype="String"/>
</li>
<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"/>
</li>
<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"/>
</li>
<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"/>
</li>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
</section>
</form>

View File

@ -18,6 +18,8 @@
<ul>
{{> 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-item-cost.hbs}}

View File

@ -46,6 +46,29 @@
<input type="text" class="item-field-label-medium" name="system.levels" value="{{system.levels}}" data-dtype="Number"/>
</li>
<li class="flexrow"><label class="item-field-label-long">Skill levels only</label>
<input type="checkbox" class="item-field-label-medium" name="system.skilllevelonly" {{checked system.skilllevelonly}}
{{#if (or system.skillfamiliarity system.skillprofiency)}}disabled{{/if}}
data-dtype="Number"/>
</li>
<li class="flexrow"><label class="item-field-label-long">Familiarity only</label>
<input type="checkbox" class="item-field-label-medium item-skill-familiarity" name="system.skillfamiliarity" {{checked system.skillfamiliarity}}
{{#if (or system.skillprofiency system.skilllevelonly)}}disabled{{/if}}
data-dtype="Number"/>
</li>
{{#if system.skillfamiliarity}}
<li class="flexrow"><label class="item-field-label-long">Everyman skill</label>
<input type="checkbox" class="item-field-label-medium item-skill-everyman" name="system.skilleveryman" {{checked system.skilleveryman}} data-dtype="Number"/>
</li>
{{/if}}
<li class="flexrow"><label class="item-field-label-long">Proficency</label>
<input type="checkbox" class="item-field-label-medium item-skill-profiency" name="system.skillprofiency" {{checked system.skillprofiency}}
{{#if (or system.skillfamiliarity system.skilllevelonly)}}disabled{{/if}}
data-dtype="Number"/>
</li>
{{#if (ne system.skilltype "combat")}}
<li class="flexrow"><label class="item-field-label-long">Levels Cost</label>
<input type="text" class="item-field-label-medium" name="system.levelscost" value="{{system.levelscost}}" data-dtype="Number"/>

View File

@ -1,8 +1,9 @@
<li class="item flexrow list-item" data-attr-key="{{key}}">
<span class="item-field-label-medium" name="{{key}}">
<h4 class="item-field-label-medium margin-item-list"><a class="roll-charac" data-charac-key="{{key}}">{{charac.label}}</a></h4>
<h4 class="item-field-label-medium margin-item-list">{{charac.label}}</a></h4>
</span>
<input type="text" class="item-field-label-short" name="system.characteristics.{{key}}.value" value="{{charac.value}}" data-dtype="Number"/>
<h4 class="item-field-label-short margin-item-list">{{charac.total}}</h4>
<h4 class="item-field-label-short margin-item-list"><a class="roll-charac" data-charac-key="{{key}}">{{charac.roll}}-</a></h4>
<input type="text" class="item-field-label-short" name="system.characteristics.{{key}}.value" value="{{charac.value}}" data-dtype="Number"/>
&nbsp;
<!-- <h4 class="item-field-label-short margin-item-list">{{charac.total}}</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>
</li>

View File

@ -0,0 +1,31 @@
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-img">
<label class="">&nbsp;</label>
</span>
<span class="item-field-label-long-img">
<label class="">{{title}}</label>
</span>
<span class="item-field-label-long4">
<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 class="item-field-label-short">
<label class="item-field-label-short">Roll</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">END</label>
</span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="equipment" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
<ul class="item-list list-item-shadow2">
{{#each items as |equip key|}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs equip=equip}}
{{/each}}
</ul>
</ul>

View File

@ -1,37 +1,27 @@
<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>
{{#if (eq level 1)}}
<span class="item-name-label">{{equip.name}}</span>
{{else}}
<span class="item-name-label-level2">{{equip.name}}</span>
{{/if}}
<span class="item-field-label-long"><label>
{{equip.system.quantity}}
(<a class="quantity-minus plus-minus-button">&nbsp;-</a>/<a class="quantity-plus plus-minus-button">+</a>)
<span class="item-field-label-long4"><label>{{equip.system.displayname}}
</label>
</span>
<span class="item-field-label-medium">
&nbsp;-&nbsp;
</span>
<span class="item-field-label-short">
{{#if equip.system.iscontainer}}
{{equip.system.contentsEnc}}
{{else}}
{{mul equip.system.weight equip.system.quantity}}
{{/if}}
</span>
<span class="item-field-label-medium">
&nbsp;-&nbsp;
<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>
</span>
{{#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>
{{else}}
<span class="item-field-label-short">&nbsp;</span>
{{/if}}
<span class="item-field-label-medium"><label>{{equip.system.endurance}}
</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
{{#if (eq level 1)}}
<a class="item-control item-equip" title="Worn">{{#if equip.system.equipped}}<i
class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
{{/if}}
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>

View File

@ -0,0 +1,26 @@
<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"/>
<span class="item-field-label-medium" name="{{key}}">
<h4 class="item-field-label-medium margin-item-list">{{charac.label}}</a></h4>
</span>
<h4 class="item-field-label-short margin-item-list">{{charac.base}}</h4>
{{#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>
{{else}}
<h4 class="item-field-label-short margin-item-list">&nbsp;</h4>
{{/if}}
<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-short margin-item-list"><a class="roll-lift-dice" data-charac-key="{{key}}"><i class="fas fa-dice"></i>{{charac.liftDice}}</a></h4>
{{/if}}
</li>

View File

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

View File

@ -6,4 +6,9 @@
<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"/>
</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}}

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}}