Compare commits

...

42 Commits

Author SHA1 Message Date
686ea4cea6 Fix manifest link 2023-08-25 18:55:34 +02:00
c915b85a7b Update README 2023-08-25 16:34:10 +02:00
5026e120c1 Equipment management 2023-08-24 23:12:55 +02:00
9cefc6f816 Equipment management 2023-08-24 20:32:12 +02:00
11d7c7d1c0 Equipment management 2023-08-24 20:32:00 +02:00
3abf9a9f8f Equipment management 2023-08-24 18:45:54 +02:00
f5c0faffd3 Equipment management 2023-08-24 15:59:54 +02:00
3f0e0a41b8 Update equipments type 2023-08-22 23:30:31 +02:00
20c49eb48c Fix Maneuvers 2023-08-15 22:12:02 +02:00
6275319164 Various fixes 2023-08-10 13:06:16 +02:00
19fb872824 Various fixes 2023-08-10 13:05:56 +02:00
002d6f4fbd Various fixes 2023-08-09 18:05:16 +02:00
43a3a2ccfa Various fixes and enhancents 2023-08-08 08:17:48 +02:00
356f0fee5f Various fixes and enhancents 2023-08-08 08:17:30 +02:00
58bcfc07a3 Various fixes and enhancents 2023-08-07 23:28:04 +02:00
3dcb60e7a9 Add compendiums + pictures + minor fixes 2023-08-04 07:04:12 +02:00
6c4812c7e4 Add compendiums + pictures + minor fixes 2023-08-03 22:32:45 +02:00
099bb0d88c Use initiative 2023-07-29 18:12:22 +02:00
9a30275640 Use initiative 2023-07-29 18:11:57 +02:00
b798cde48d Combat tracker fixes 2023-07-24 13:35:35 +02:00
a943e6defa Fix turn management 2023-07-21 14:52:22 +02:00
9099e812d5 Combat tracker fixes 2023-07-16 14:33:26 +02:00
6d6b7075df Combat tracker fixes 2023-07-07 15:35:24 +02:00
3762e6185b Combat tracker fixes 2023-07-06 21:28:52 +02:00
1e74d6f306 Combat tracker fixes 2023-07-06 13:10:41 +02:00
8f10b9825e Fixes from 29th of june 2023-06-30 22:20:44 +02:00
297c94adb7 Fixes from 29th of june 2023-06-30 21:11:29 +02:00
b535a86116 Fixes from 29th of june 2023-06-30 17:21:11 +02:00
270c7c4a91 Fixes from 29th of june 2023-06-30 13:14:40 +02:00
0b0b74754f Various/changes from 30th may requestsé 2023-06-06 09:18:33 +02:00
cf4de99242 All fixes requested 2023-05-07 14:06:48 +02:00
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
105 changed files with 3512 additions and 896 deletions

1
.gitignore vendored Normal file
View File

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

View File

@ -1,2 +1,27 @@
# fvtt-dark-stars
This is the official Hero System 6th Edition game system for FoundryVTT, based on the TTRPG from Hero Games and developed by Legendsmiths, LLC. For more information about Legendsmiths and their work, visit https://legendsmiths.com/.
The Hero System game system is not usable standalone. To play this game you need a copy of the core rulebook.
It features :
- PC/NPC sheets
- Roll management and associated helpers
- Segment and Turn management in the combat tracker
- Official compendiums
![Snapshot](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/08/hero6_snapshot_02.webp "Snapshot")
Installation
Manifest URL: https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6
For manual installation, use the provided manifest URL in the "Install System" popup window while managing game systems.
Copyright (c) 2023 Legendsmiths, LLC
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
All content for the HERO System™® is DOJ, Inc.s trademark for its roleplaying system. HERO System Copyright ©1984, 1989, 2002, 2009 by DOJ, Inc. d/b/a Hero Games. All rights reserved. Fantasy Hero ©2003, 2010 by DOJ, Inc. d/b/a Hero Games. All rights reserved. Star Hero ©2003, 2011 by DOJ, Inc. d/b/a Hero Games. All rights reserved. All DOJ trademarks and copyrights used with permission and under license with Legendsmiths , LLC. For further information about Hero Games and the HERO System, visit www.herogames.com. All HERO System™® content is not be included to copy, modify, merge, publish, distribute, sublicense, and/or sell with copies of the Software with the exception of the current licensee Legendsmiths, LLC.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

@ -1,3 +1,27 @@
{
}
{
"TYPES": {
"Actor": {
"character": "Character",
"minion": "Minion"
},
"Item": {
"skill": "Skill",
"perk": "Perk",
"power": "Power",
"talent": "Talent",
"advantage": "Advantage",
"martialart": "Martial art",
"limitation": "Limitation",
"complication": "Complication",
"equipment": "Equipment",
"currency": "Currency",
"maneuver": "Maneuver"
}
},
"COMBAT": {
"TurnPrev": "Previous initiative",
"RoundPrev": "Previous segment",
"TurnNext": "Next initiative",
"RoundNext": "Next segment"
}
}

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,29 +36,49 @@ 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(),
allmaneuvers: this.actor.getAllManeuvers(),
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(),
moneys: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getMoneys())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipments()) ),
subActors: duplicate(this.actor.getSubActors()),
race: duplicate(this.actor.getRace()),
moneys: duplicate(this.actor.getMoneys()),
encCapacity: this.actor.getEncumbranceCapacity(),
isHold: this.actor.getHoldAction(),
isAbort: this.actor.getAbortAction(),
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,
totalValue: this.actor.totalValue,
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
isGM: game.user.isGM
}
this.formData = formData;
this.stockManeuverDisplayed = false
console.log("PC : ", formData, this.object);
return formData;
@ -73,9 +93,9 @@ export class Hero6ActorSheet extends ActorSheet {
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
html.bind("keydown", function(e) { // Ignore Enter in actores sheet
/*html.bind("keydown", function(e) { // Ignore Enter in actores sheet
if (e.keyCode === 13) return false;
});
});*/
// Update Inventory Item
html.find('.item-edit').click(ev => {
@ -139,13 +159,59 @@ export class Hero6ActorSheet extends ActorSheet {
const characKey = $(event.currentTarget).data("charac-key");
this.actor.rollCharac(characKey);
});
html.find('.roll-perception').click((event) => {
this.actor.rollPerception("int");
});
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")
this.actor.rollWeapon(skillId)
});
html.find('.roll-maneuver').click((event) => {
const li = $(event.currentTarget).parents(".item");
const maneuverId = li.data("maneuver-id")
this.actor.rollManeuver(maneuverId)
});
html.find('.hold-action').click((event) => {
this.actor.holdAction()
});
html.find('.abort-action').click((event) => {
this.actor.abortAction()
});
html.find(".show-stock-maneuver").click((event) => {
if ( !this.stockManeuverDisplayed) {
$('div .maneuver-list').removeClass('maneuver-is-stock');
this.stockManeuverDisplayed = true
} else {
$('div .maneuver-list').addClass('maneuver-is-stock');
this.stockManeuverDisplayed = false
}
});
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;
this.render(true);
@ -163,7 +229,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]]
/* -------------------------------------------- */
/* -------------------------------------------- */
@ -42,11 +40,10 @@ export class Hero6Actor extends Actor {
return actor;
}
if (data.type == 'character') {
const skills = await Hero6Utility.loadCompendium("fvtt-hero-system-6.skills");
data.items = skills.map(i => i.toObject())
}
if (data.type == 'npc') {
if (data.type == 'character' || data.type == 'minion') {
const maneuvers = await Hero6Utility.loadCompendium("fvtt-hero-system-6.maneuvers")
let maneuversObj = maneuvers.map(i => i.toObject())
data.items = maneuversObj.filter(m => m.system.isstock)
}
return super.create(data, options);
@ -62,17 +59,33 @@ export class Hero6Actor extends Actor {
}
/* -------------------------------------------- */
computeHitPoints() {
if (this.type == "character") {
computeDerivatedData() {
let newSTREND = this.computeSTREND()
if (newSTREND != this.system.characteristics.str.strend) {
this.update({ 'system.characteristics.str.strend': newSTREND })
}
}
/* -------------------------------------------- */
performMigration() {
// Fix OCV/OMCV rollable
if (!this.system.characteristics.ocv.hasroll) {
this.update({ 'system.characteristics.ocv.hasroll': true, 'system.characteristics.omcv.hasroll': true })
}
}
/* -------------------------------------------- */
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() {
if (this.type == 'character' || game.user.isGM) {
this.system.encCapacity = this.getEncumbranceCapacity()
this.buildContainerTree()
this.computeHitPoints()
this.computeDerivatedData()
this.computeDicesValue()
}
super.prepareDerivedData();
@ -86,12 +99,15 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */
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
}
}
/* -------------------------------------------- */
getMoneys() {
let comp = this.items.filter(item => item.type == 'money');
let comp = this.items.filter(item => item.type == 'currency');
Hero6Utility.sortArrayObjectsByName(comp)
return comp;
}
@ -143,18 +159,6 @@ export class Hero6Actor extends Actor {
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) {
let item = this.items.find(item => item.id == id);
@ -164,9 +168,101 @@ export class Hero6Actor extends Actor {
return item;
}
/* -------------------------------------------- */
async _preCreate(data, options, user) {
await super._preCreate(data, options, user);
// Configure prototype token settings
const prototypeToken = {};
if (this.type === "character") Object.assign(prototypeToken, {
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
});
this.updateSource({ prototypeToken });
}
/* -------------------------------------------- */
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
}
}
/* -------------------------------------------- */
prepareManeuver(maneuver) {
maneuver.roll = 11 + this.system.characteristics.ocv.value
if (Number(maneuver.system.ocv)) {
maneuver.roll += Number(maneuver.system.ocv)
} else {
maneuver.noOCV = true
}
}
/* -------------------------------------------- */
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,62 +300,84 @@ export class Hero6Actor extends Actor {
}
return 0;
}
/* ------------------------------------------- */
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
}
getAllManeuvers() {
let maneuvers = this.items.filter(item => item.type == "maneuver")
Hero6Utility.sortArrayObjectsByName(maneuvers)
return maneuvers
}
getNonStockManeuvers() {
let maneuvers = this.items.filter(item => item.type == "maneuver" && !item.system.isstock)
Hero6Utility.sortArrayObjectsByName(maneuvers)
return maneuvers
}
getEquipments() {
return this.items.filter(item => item.type == 'shield' || item.type == 'armor' || item.type == "weapon" || item.type == "equipment");
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "equipment");
Hero6Utility.sortArrayObjectsByName(list)
return list
}
getMoneys() {
let list = this.items.filter(item => item.type == "equipment" && item.system.subtype == "money");
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
}
/* ------------------------------------------- */
async buildContainerTree() {
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
buildContainerTree() {
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []);
let enc = 0
for (let item of equipments) {
//item.data.idrDice = Hero6Utility.getDiceFromLevel(Number(item.data.idr))
if (item.system.equipped) {
if (item.system.iscontainer) {
enc += item.system.contentsEnc
} else if (item.system.containerid == "") {
let q = item.system.quantity ?? 1
enc += q * item.system.weight
}
let value = 0
for (let equip1 of equipments) {
if (Number(equip1.system.weight) && Number(equip1.system.quantity)) {
enc += equip1.system.weight * equip1.system.quantity
}
if (Number(equip1.system.value) && Number(equip1.system.quantity)) {
value += equip1.system.value * equip1.system.quantity
}
}
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
this.encCurrent = enc
this.containersTree = equipments.filter(item => item.system.containerid == "") // Returns the root of equipements without container
this.totalValue = value
}
/* -------------------------------------------- */
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)
@ -283,7 +401,7 @@ export class Hero6Actor extends Actor {
} else {
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)
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
}
@ -300,18 +418,93 @@ export class Hero6Actor extends Actor {
/* -------------------------------------------- */
async equipGear(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 };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
}
/* -------------------------------------------- */
getInitiativeScore(combatId, combatantId) {
if (this.type == 'character') {
this.rollMR(true, combatId, combatantId)
async cleanCombat() {
await this.setFlag("world", "hold-action", false)
await this.setFlag("world", "abort-action", { state: false, count: 0 })
}
async holdAction() {
await this.disableAbortAction()
if (this.getFlag("world", "hold-action")) {
await this.setFlag("world", "hold-action", false)
//game.combat.holdAction(this.id, false)
game.combat.forceHold(this, false)
return false
} else {
await this.setFlag("world", "hold-action", true)
//game.combat.holdAction(this.id, false)
game.combat.forceHold(this, true)
return true
}
console.log("Init required !!!!")
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() {
await this.disableHoldAction()
let abort = this.getFlag("world", "abort-action")
if (abort.state) {
await this.setFlag("world", "abort-action", { state: false, count: 0 })
game.combat.forceAbort(this, false)
//game.combat.abortAction(this.id, false)
} else {
await this.setFlag("world", "abort-action", { state: true, count: 0 })
game.combat.forceAbort(this, true)
//game.combat.abortAction(this.id, true)
}
}
async incAbortActionCount() {
let abort = this.getFlag("world", "abort-action")
if (abort.state) {
abort.count++
await this.setFlag("world", "abort-action", abort)
if (abort.count == 2) {
return true
}
}
return false
}
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(turn) {
if (turn != this.turn) {
let r = new Roll("1d6").roll({ async: false })
this.currentInit = Number(this.system.characteristics.dex.initiative) + Number(((r.total / 10).toFixed(2)))
this.turn = turn
}
return this.currentInit
}
/* -------------------------------------------- */
@ -340,14 +533,30 @@ 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) {
if (charac.label == "OCV" || charac.label == "OMCV" ) {
charac.total = charac.value
charac.roll = 11 + charac.value
} else {
charac.total = charac.value
charac.roll = 9 + Math.round((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)
}
if (key == "spd") {
ch.phasesString = this.getPhasesString()
}
if (key == "pre") {
ch.presenceattack = duplicate(this.system.biodata.presenceattack)
}
}
return characs
}
@ -361,6 +570,22 @@ export class Hero6Actor extends Actor {
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) {
let items = this.items.filter(item => item.type == itemType);
@ -433,6 +658,18 @@ export class Hero6Actor extends Actor {
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) {
@ -444,7 +681,89 @@ 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)
}
if (item.type == "maneuver") {
this.prepareManeuver(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.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)
}
/* -------------------------------------------- */
rollManeuver(maneuverId) {
let skill = this.items.get(skillId)
if (skill) {
if (skill.system.islore && skill.system.level == 0) {
ui.notifications.warn("You can't use Lore Skills with a SL of 0.")
return
}
skill = duplicate(skill)
Hero6Utility.updateSkill(skill)
let abilityKey = skill.system.ability
let rollData = this.getCommonRollData(abilityKey)
rollData.mode = "skill"
rollData.skill = skill
rollData.img = skill.img
if (rollData.target) {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return
}
this.startRoll(rollData)
}
}
/* -------------------------------------------- */
rollSkill(skillId) {
let skill = this.items.get(skillId)

View File

@ -1,25 +1,295 @@
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 => {
let id = target.data('combatant-id')
let c = game.combat.combatants.get(id)
c.actor.holdAction()
}
//newOpt = duplicate(option)
}
}
//options.push(newOpt)
}
/* -------------------------------------------- */
holdAction(combatantId) {
this.rebuildInitiative()
//console.log("Rebuilding.....")
}
/* -------------------------------------------- */
abortAction(actorId, abortState) {
this.rebuildInitiative()
}
/* -------------------------------------------- */
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();
}
/* -------------------------------------------- */
forceHold(actor, isHold) {
if (game.user.isGM) {
let updList = []
let c = this.combatants.find(c => c.actor._id == actor.id)
let name = actor.name + ((isHold) ? " (H)" : "")
console.log("ForceHold!!", c, actor)
updList.push({ _id: c.id || c._id, name: name, initiative: actor.getBaseInit(this.segmentNumber) })
this.updateEmbeddedDocuments("Combatant", updList)
} else {
game.socket.emit("system.fvtt-hero-system-6", { name: "msg_force_hold", data: { actorId: actor.id, isHold: isHold } });
}
}
/* -------------------------------------------- */
forceAbort(actor, isAbort) {
if (game.user.isGM) {
let updList = []
let c = this.combatants.find(c => c.actor._id == actor.id)
let name = actor.name + ((isAbort) ? " (A)" : "")
updList.push({ _id: c.id || c._id, name: name, initiative: actor.getBaseInit(this.segmentNumber) })
this.updateEmbeddedDocuments("Combatant", updList)
} else {
game.socket.emit("system.fvtt-hero-system-6", { name: "msg_force_abort", data: { actorId: actor.id, isAbort: isAbort } });
}
}
/* -------------------------------------------- */
computeInitiative(c, updList) {
let id = c._id || c.id
let hasSegment = c.actor.hasPhase(this.segmentNumber)
let isOnHold = c.actor.getHoldAction()
let isOnAbort = c.actor.getAbortAction()
let name = c.actor.name
if (hasSegment || isOnHold || isOnAbort) {
let baseInit = c.actor ? c.actor.getBaseInit(this.segmentNumber) : 0;
if (isOnHold) {
if (hasSegment) { // On hold + current segment -> auto-disable on hold
c.actor.disableHoldAction()
} else {
name = c.actor.name + " (H)"
}
}
if (isOnAbort) {
name = c.actor.name + " (A)"
if (c.actor.incAbortActionCount()) {
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;
let updList = []
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])
this.computeInitiative(c, updList)
}
if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList);
}
return this;
}
/* -------------------------------------------- */
_onUpdate(changed, options, userId) {
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
}
/* -------------------------------------------- */
nextTurn() {
let nbC = this.combatants.filter(c => c.initiative > 0).length
//console.log("Next turn called....", this.turn, nbC)
if (this.turn < nbC - 1) {
super.nextTurn()
} else {
this.nextRound()
}
}
/* -------------------------------------------- */
async previousRound() {
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", "turnData")
//console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
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 = -1 * (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", "turnData")
if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "turnData", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber -= 1
if (turnData.segmentNumber <= 0) {
turnData.segmentNumber = 12
turnData.turnNumber--
}
await this.setFlag("world", "turnData", 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 };
const updateOptions = { advanceTime, direction: -1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
console.log(this)
return this.update(updateData, updateOptions);
}
/* -------------------------------------------- */
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", "turnData")
//console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
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", "turnData")
if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "turnData", turnData)
}
turnData = duplicate(turnData)
turnData.segmentNumber += 1
if (turnData.segmentNumber > 12) {
turnData.segmentNumber = 1
turnData.turnNumber++
ChatMessage.create({
content: "Complete Post-Segment 12 Recoveries."
})
}
await this.setFlag("world", "turnData", 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 };
const updateOptions = { advanceTime, direction: 1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
console.log(this)
return this.update(updateData, updateOptions);
}
/* -------------------------------------------- */
async _onCreateEmbeddedDocuments(type, documents, result, options, userId) {
//console.log("Added...")
await super._onCreateEmbeddedDocuments(type, documents, result, options, userId)
await this.rebuildInitiative()
}
/* --------------------------------------------
_onUpdate(changed, options, userId) {
}*/
/* -------------------------------------------- */
static async checkTurnPosition() {
while (game.combat.turn > 0) {

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,25 @@ 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 async rollSpecialHero(msg, params) {
console.log("ROLL HERE", msg, params)
let formula = params.join(' ')
if (formula) {
let foundryFormula = Hero6Utility.convertRollHeroSyntax(formula)
/* -------------------------------------------- */
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")
let myRoll = new Roll(foundryFormula).roll({ async: false })
await Hero6Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
let bodyValue = Hero6Utility.computeBodyValue(myRoll)
let msgFlavor = await renderTemplate('systems/fvtt-hero-system-6/templates/chat/chat-hr-roll.hbs', {myRoll, bodyValue} )
let msg = await myRoll.toMessage({
user: game.user.id,
rollMode: game.settings.get("core", "rollMode"),
flavor: msgFlavor
})
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,10 @@ export const Hero6_CONFIG = {
powerSenseAffecting: {
"none": "None",
"senseaffecting": "Sense-Affecting",
},
powerEffectRoll: {
"standard": "Standard",
"normal": "Normal",
"killing": "Killing",
}
}

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 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 { 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,10 +41,10 @@ Hooks.once("init", async function () {
// Set an initiative formula for the system
CONFIG.Combat.initiative = {
formula: "1d6",
decimals: 1
decimals: 2
};
/* -------------------------------------------- */
/* ------------------------------- ------------- */
game.socket.on("system.fvtt-hero-system-6", data => {
Hero6Utility.onSocketMesssage(data)
});
@ -54,12 +54,14 @@ 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
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-hero-system-6", Hero6ActorSheet, { types: ["character"], makeDefault: true });
Actors.registerSheet("fvtt-hero-system-6", Hero6NPCSheet, { types: ["npc"], makeDefault: false });
Actors.registerSheet("fvtt-hero-system-6", Hero6ActorSheet, { types: ["minion"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-hero-system-6", Hero6ItemSheet, { makeDefault: true });
@ -73,7 +75,7 @@ function welcomeMessage() {
user: game.user.id,
whisper: [game.user.id],
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>
` });
}
@ -91,15 +93,11 @@ 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()
Hero6Combat.ready()
})
/* -------------------------------------------- */

View File

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

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
@ -40,17 +41,24 @@ export class Hero6Utility {
return list.length > 0;
})
Handlebars.registerHelper('mul', function (a, b) {
return parseInt(a) * parseInt(b);
return Number(a) * Number(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
})
Handlebars.registerHelper('fixNum', function (value) {
return Number(value) || 0
})
Handlebars.registerHelper('checkInit', function (value) {
let myValue = Number(value) || 0
return myValue > 0
})
this.gameSettings()
@ -77,6 +85,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
@ -106,6 +127,10 @@ export class Hero6Utility {
const rollTables = await Hero6Utility.loadCompendium("fvtt-hero-system-6.rolltables")
this.rollTables = rollTables.map(i => i.toObject())
for (let actor of game.actors) {
actor.performMigration()
}
}
/* -------------------------------------------- */
@ -127,24 +152,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,14 +161,19 @@ 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',
'systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs',
'systems/fvtt-hero-system-6/templates/partials/partial-actor-equipment.hbs',
'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);
}
@ -226,12 +238,21 @@ export class Hero6Utility {
/* -------------------------------------------- */
static async onSocketMesssage(msg) {
console.log("SOCKET MESSAGE", msg.name)
console.log("SOCKET MESSAGE", msg.name, msg)
if (msg.name == "msg_update_roll") {
this.updateRollData(msg.data)
}
if (msg.name == "msg_gm_process_attack_defense") {
this.processSuccessResult(msg.data)
if (msg.name == "msg_force_hold") {
if (game.user.isGM) {
let actor = game.actors.get(msg.data.actorId)
game.combat.forceHold(actor, msg.data.isHold)
}
}
if (msg.name == "msg_force_abort") {
if (game.user.isGM) {
let actor = game.actors.get(msg.data.actorId)
game.combat.forceAbort(actor, msg.data.isAbort)
}
}
if (msg.name == "msg_gm_item_drop" && game.user.isGM) {
let actor = game.actors.get(msg.data.actorId)
@ -290,25 +311,57 @@ 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)
let myRoll = rollData.roll
if (!myRoll) { // New rolls only of no rerolls
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.target = target
rollData.diceFormula = diceFormula
@ -317,22 +370,65 @@ 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
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)
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).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) {
myArray.sort((a, b) => {
let fa = a.name.toLowerCase();
@ -370,7 +466,7 @@ export class Hero6Utility {
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
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);
game.socket.emit("system.fvtt-hero-system-6", { msg: "msg_gm_chat_message", data: chatGM });
}

Binary file not shown.

View File

@ -0,0 +1 @@
MANIFEST-000098

0
packs/complications/LOCK Normal file
View File

3
packs/complications/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.588130 7fda7bbff6c0 Recovering log #96
2023/08/24-20:28:52.597974 7fda7bbff6c0 Delete type=3 #94
2023/08/24-20:28:52.598068 7fda7bbff6c0 Delete type=0 #96

View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.190057 7fda7abfd6c0 Recovering log #92
2023/08/24-20:11:49.204015 7fda7abfd6c0 Delete type=3 #90
2023/08/24-20:11:49.204065 7fda7abfd6c0 Delete type=0 #92
2023/08/24-20:28:26.993087 7fda79bfb6c0 Level-0 table #97: started
2023/08/24-20:28:26.993130 7fda79bfb6c0 Level-0 table #97: 0 bytes OK
2023/08/24-20:28:27.002024 7fda79bfb6c0 Delete type=0 #95
2023/08/24-20:28:27.002188 7fda79bfb6c0 Manual compaction at level-0 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.002221 7fda79bfb6c0 Manual compaction at level-1 from '!items!05yAsPAteobyHoVT' @ 72057594037927935 : 1 .. '!items!yFhVFTqzLKcqApBr' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/equipment/000099.ldb Normal file

Binary file not shown.

View File

1
packs/equipment/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000100

0
packs/equipment/LOCK Normal file
View File

3
packs/equipment/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.572724 7fda7a3fc6c0 Recovering log #97
2023/08/24-20:28:52.584112 7fda7a3fc6c0 Delete type=3 #95
2023/08/24-20:28:52.584178 7fda7a3fc6c0 Delete type=0 #97

15
packs/equipment/LOG.old Normal file
View File

@ -0,0 +1,15 @@
2023/08/24-20:11:49.176021 7fda7b3fe6c0 Recovering log #92
2023/08/24-20:11:49.186442 7fda7b3fe6c0 Delete type=3 #90
2023/08/24-20:11:49.186511 7fda7b3fe6c0 Delete type=0 #92
2023/08/24-20:28:26.929251 7fda79bfb6c0 Level-0 table #98: started
2023/08/24-20:28:26.933483 7fda79bfb6c0 Level-0 table #98: 61208 bytes OK
2023/08/24-20:28:26.940562 7fda79bfb6c0 Delete type=0 #96
2023/08/24-20:28:26.961338 7fda79bfb6c0 Manual compaction at level-0 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)
2023/08/24-20:28:26.961409 7fda79bfb6c0 Manual compaction at level-1 from '!folders!48DCB6UNXCsERTXK' @ 72057594037927935 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at '!items!zFQRJSrYV4E12NgW' @ 355 : 1
2023/08/24-20:28:26.961416 7fda79bfb6c0 Compacting 1@1 + 1@2 files
2023/08/24-20:28:26.966548 7fda79bfb6c0 Generated table #99@1: 125 keys, 61208 bytes
2023/08/24-20:28:26.966578 7fda79bfb6c0 Compacted 1@1 + 1@2 files => 61208 bytes
2023/08/24-20:28:26.974691 7fda79bfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2023/08/24-20:28:26.974830 7fda79bfb6c0 Delete type=2 #94
2023/08/24-20:28:26.975013 7fda79bfb6c0 Delete type=2 #98
2023/08/24-20:28:27.002145 7fda79bfb6c0 Manual compaction at level-1 from '!items!zFQRJSrYV4E12NgW' @ 355 : 1 .. '!items!zFQRJSrYV4E12NgW' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/maneuvers/000005.ldb Normal file

Binary file not shown.

View File

1
packs/maneuvers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000090

0
packs/maneuvers/LOCK Normal file
View File

3
packs/maneuvers/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.601708 7fda7a3fc6c0 Recovering log #88
2023/08/24-20:28:52.613896 7fda7a3fc6c0 Delete type=3 #86
2023/08/24-20:28:52.614012 7fda7a3fc6c0 Delete type=0 #88

8
packs/maneuvers/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.203061 7fda7bbff6c0 Recovering log #84
2023/08/24-20:11:49.219726 7fda7bbff6c0 Delete type=3 #82
2023/08/24-20:11:49.219820 7fda7bbff6c0 Delete type=0 #84
2023/08/24-20:28:27.002307 7fda79bfb6c0 Level-0 table #89: started
2023/08/24-20:28:27.002338 7fda79bfb6c0 Level-0 table #89: 0 bytes OK
2023/08/24-20:28:27.008560 7fda79bfb6c0 Delete type=0 #87
2023/08/24-20:28:27.051981 7fda79bfb6c0 Manual compaction at level-0 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.052022 7fda79bfb6c0 Manual compaction at level-1 from '!items!0HeZcvevni63brWf' @ 72057594037927935 : 1 .. '!items!yAT32VYV2aIWOBkK' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/perks/000005.ldb Normal file

Binary file not shown.

0
packs/perks/000099.log Normal file
View File

1
packs/perks/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000098

0
packs/perks/LOCK Normal file
View File

3
packs/perks/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.601706 7fda7abfd6c0 Recovering log #96
2023/08/24-20:28:52.613896 7fda7abfd6c0 Delete type=3 #94
2023/08/24-20:28:52.613994 7fda7abfd6c0 Delete type=0 #96

8
packs/perks/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.205472 7fda7b3fe6c0 Recovering log #92
2023/08/24-20:11:49.222633 7fda7b3fe6c0 Delete type=3 #90
2023/08/24-20:11:49.222697 7fda7b3fe6c0 Delete type=0 #92
2023/08/24-20:28:27.019936 7fda79bfb6c0 Level-0 table #97: started
2023/08/24-20:28:27.019979 7fda79bfb6c0 Level-0 table #97: 0 bytes OK
2023/08/24-20:28:27.051866 7fda79bfb6c0 Delete type=0 #95
2023/08/24-20:28:27.052012 7fda79bfb6c0 Manual compaction at level-0 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.052040 7fda79bfb6c0 Manual compaction at level-1 from '!items!L3vwlIh3oloE6A8W' @ 72057594037927935 : 1 .. '!items!yWTR7MCOtGWm1KCz' @ 0 : 0; will stop at (end)

BIN
packs/perks/MANIFEST-000098 Normal file

Binary file not shown.

BIN
packs/powers/000062.ldb Normal file

Binary file not shown.

0
packs/powers/000100.log Normal file
View File

1
packs/powers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000099

0
packs/powers/LOCK Normal file
View File

3
packs/powers/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.588130 7fda7abfd6c0 Recovering log #97
2023/08/24-20:28:52.597915 7fda7abfd6c0 Delete type=3 #95
2023/08/24-20:28:52.597970 7fda7abfd6c0 Delete type=0 #97

8
packs/powers/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.190059 7fda7a3fc6c0 Recovering log #93
2023/08/24-20:11:49.201012 7fda7a3fc6c0 Delete type=3 #91
2023/08/24-20:11:49.201080 7fda7a3fc6c0 Delete type=0 #93
2023/08/24-20:28:26.985277 7fda79bfb6c0 Level-0 table #98: started
2023/08/24-20:28:26.985305 7fda79bfb6c0 Level-0 table #98: 0 bytes OK
2023/08/24-20:28:26.992913 7fda79bfb6c0 Delete type=0 #96
2023/08/24-20:28:27.002175 7fda79bfb6c0 Manual compaction at level-0 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.002210 7fda79bfb6c0 Manual compaction at level-1 from '!items!3vinyVxuFdrQDCBo' @ 72057594037927935 : 1 .. '!items!zpF2QY4tx7qdBomQ' @ 0 : 0; will stop at (end)

Binary file not shown.

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

BIN
packs/skills/000005.ldb Normal file

Binary file not shown.

0
packs/skills/000099.log Normal file
View File

1
packs/skills/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000098

0
packs/skills/LOCK Normal file
View File

3
packs/skills/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.572723 7fda7b3fe6c0 Recovering log #96
2023/08/24-20:28:52.584114 7fda7b3fe6c0 Delete type=3 #94
2023/08/24-20:28:52.584178 7fda7b3fe6c0 Delete type=0 #96

8
packs/skills/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.176021 7fda7bbff6c0 Recovering log #92
2023/08/24-20:11:49.186443 7fda7bbff6c0 Delete type=3 #90
2023/08/24-20:11:49.186509 7fda7bbff6c0 Delete type=0 #92
2023/08/24-20:28:26.975180 7fda79bfb6c0 Level-0 table #97: started
2023/08/24-20:28:26.975225 7fda79bfb6c0 Level-0 table #97: 0 bytes OK
2023/08/24-20:28:26.985137 7fda79bfb6c0 Delete type=0 #95
2023/08/24-20:28:27.002160 7fda79bfb6c0 Manual compaction at level-0 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.002199 7fda79bfb6c0 Manual compaction at level-1 from '!items!0663RVbZRl0oZ0Dr' @ 72057594037927935 : 1 .. '!items!zLKcnLGEcMwECjni' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/talents/000005.ldb Normal file

Binary file not shown.

0
packs/talents/000099.log Normal file
View File

1
packs/talents/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000098

0
packs/talents/LOCK Normal file
View File

3
packs/talents/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/08/24-20:28:52.617237 7fda7abfd6c0 Recovering log #96
2023/08/24-20:28:52.627761 7fda7abfd6c0 Delete type=3 #94
2023/08/24-20:28:52.627835 7fda7abfd6c0 Delete type=0 #96

8
packs/talents/LOG.old Normal file
View File

@ -0,0 +1,8 @@
2023/08/24-20:11:49.221624 7fda7a3fc6c0 Recovering log #92
2023/08/24-20:11:49.232090 7fda7a3fc6c0 Delete type=3 #90
2023/08/24-20:11:49.232138 7fda7a3fc6c0 Delete type=0 #92
2023/08/24-20:28:27.008700 7fda79bfb6c0 Level-0 table #97: started
2023/08/24-20:28:27.008737 7fda79bfb6c0 Level-0 table #97: 0 bytes OK
2023/08/24-20:28:27.019736 7fda79bfb6c0 Delete type=0 #95
2023/08/24-20:28:27.051993 7fda79bfb6c0 Manual compaction at level-0 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)
2023/08/24-20:28:27.052030 7fda79bfb6c0 Manual compaction at level-1 from '!items!1oojD2KMJsxNlMez' @ 72057594037927935 : 1 .. '!items!znoFgVzNQOCTGUBl' @ 0 : 0; will stop at (end)

Binary file not shown.

0
packs/weapons/000088.log Normal file
View File

1
packs/weapons/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000086

0
packs/weapons/LOCK Normal file
View File

7
packs/weapons/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/24-15:57:43.392826 7fab4affd6c0 Recovering log #84
2023/08/24-15:57:43.403060 7fab4affd6c0 Delete type=3 #82
2023/08/24-15:57:43.403157 7fab4affd6c0 Delete type=0 #84
2023/08/24-15:59:11.995583 7fab497fa6c0 Level-0 table #89: started
2023/08/24-15:59:11.995614 7fab497fa6c0 Level-0 table #89: 0 bytes OK
2023/08/24-15:59:12.004480 7fab497fa6c0 Delete type=0 #87
2023/08/24-15:59:12.025495 7fab497fa6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

7
packs/weapons/LOG.old Normal file
View File

@ -0,0 +1,7 @@
2023/08/24-15:09:37.452353 7fab4b7fe6c0 Recovering log #80
2023/08/24-15:09:37.462595 7fab4b7fe6c0 Delete type=3 #78
2023/08/24-15:09:37.462673 7fab4b7fe6c0 Delete type=0 #80
2023/08/24-15:56:20.976153 7fab497fa6c0 Level-0 table #85: started
2023/08/24-15:56:20.976179 7fab497fa6c0 Level-0 table #85: 0 bytes OK
2023/08/24-15:56:20.984268 7fab497fa6c0 Delete type=0 #83
2023/08/24-15:56:20.984458 7fab497fa6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -39,42 +39,48 @@
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 {
}
.app.sidebar-popout .window-content {
color: rgba(4, 44, 44, 0.98);
}
.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(4, 44, 44, 0.98);
}
.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(4, 44, 44, 0.98);
}
.window-app.sheet .window-content {
margin: 0;
@ -173,19 +179,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 +217,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 +404,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 +434,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 +450,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 +463,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 +475,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 +528,7 @@ ul, li {
}
.sheet li {
margin: 0.010rem;
margin: 0.1rem;
padding: 0.25rem;
}
.header-fields li {
@ -574,10 +556,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 +581,6 @@ ul, li {
.item-display-hide {
display: none;
}
.conteneur-type {
background: rgb(200, 10, 100, 0.25);
}
.item-quantite {
margin-left: 0.5rem;
}
@ -670,6 +649,11 @@ ul, li {
align-content: center;
}
.content-center {
align-content: center;
text-align: center;
}
.attribut-value,
.carac-value {
flex-grow: 0;
@ -793,8 +777,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 +860,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 +922,7 @@ ul, li {
}
#sidebar #sidebar-tabs i{
width: 25px;
/*width: 25px;*/
height: 25px;
display: inline-block;
background-position:center;
@ -1064,38 +1034,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 {
@ -1103,6 +1044,31 @@ ul, li {
opacity: 1;
}
.chat-card-small-button {
box-shadow: inset 0px 1px 0px 0px #a6827e;
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
background-color: #7d5d3b00;
border-radius: 3px;
border: 1px ridge #846109;
display: inline-block;
cursor: pointer;
color: #ffffff;
font-size: 0.8rem;
text-decoration: none;
text-shadow: 0px 1px 0px #4d3534;
position: relative;
margin:1px;
}
.chat-card-small-button:hover {
background: linear-gradient(to bottom, #800000 5%, #3e0101 100%);
background-color: red;
}
.chat-card-small-button:active {
position:relative;
top:1px;
}
.chat-card-button {
box-shadow: inset 0px 1px 0px 0px #a6827e;
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
@ -1167,34 +1133,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
@ -1214,8 +1152,8 @@ ul, li {
}
#logo {
content : url(../images/ui/crucible_game_logo.png);
width: 100px;
content : url(../images/ui/logo_hex_yellow_01.webp);
width: 60px;
height: 60px;
}
@ -1354,6 +1292,9 @@ Focus FOC: #ff0084
background: black;
color: white;
}
.item-packed {
flex-grow:0;
}
.items-title-text {
margin-left: 4px;
}
@ -1405,6 +1346,11 @@ Focus FOC: #ff0084
max-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 {
flex-grow:1;
max-width: 4rem;
@ -1419,6 +1365,32 @@ Focus FOC: #ff0084
flex-grow:1;
max-width: 8rem;
min-width: 8rem;
text-align: start;
}
.item-field-text-long {
flex-grow:1;
max-width: 14rem;
min-width: 14rem;
}
.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 +1401,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;
@ -1439,5 +1416,31 @@ Focus FOC: #ff0084
}
.item-controls-fixed {
min-width:2rem;
max-width: 2rem;
/*max-width: 2rem;*/
}
.item-controls-fixed-small {
min-width:1rem;
font-size: 0.8rem;
/*max-width: 2rem;*/
}
.biodata-portrait {
min-height: 512px;
min-width: 256px;
}
.textarea-full-height {
min-height: 100%;
height: 100%;
}
.margin-left-4 {
margin-left: 4px;
}
.margin-left-8 {
margin-left: 8px;
}
.maneuver-is-stock {
display: none;
visibility: hidden;
}
.compendium .directory-list .directory-item .folder-header h3 {
color:#000
}

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

@ -30,15 +30,6 @@
"private": false,
"flags": {}
},
{
"type": "Item",
"label": "Weapons",
"name": "weapons",
"path": "packs/weapons.db",
"system": "fvtt-hero-system-6",
"private": false,
"flags": {}
},
{
"type": "Item",
"label": "Skills",
@ -66,6 +57,15 @@
"private": false,
"flags": {}
},
{
"type": "Item",
"label": "Maneuvers",
"name": "maneuvers",
"path": "packs/maneuvers.db",
"system": "fvtt-hero-system-6",
"private": false,
"flags": {}
},
{
"type": "Item",
"label": "Perks",
@ -91,16 +91,15 @@
"styles": [
"styles/simple.css"
],
"version": "10.0.9",
"version": "11.0.13",
"compatibility": {
"minimum": "10",
"verified": "10",
"maximum": "10"
"minimum": "11",
"verified": "11"
},
"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",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/raw/branch/master/system.json",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-hero-system-6/archive/fvtt-hero-system-6-v11.0.13.zip",
"url": "https://www.uberwald.me/gitea/uberwald/",
"background": "images/ui/hro6_welcome_page.webp",
"background": "systems/fvtt-hero-system-6/images/ui/hero_foundry_cover.webp",
"id": "fvtt-hero-system-6"
}

View File

@ -1,66 +1,97 @@
{
"Actor": {
"types": [
"character"
"character",
"minion"
],
"templates": {
"biodata": {
"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": "1d6",
"lift": "",
"strend": 0,
"strendmode": "str10",
"hasroll": true,
"realcost": 0,
"activecost": 0
},
"dex": {
"label": "Dexterity",
"value": 0,
"label": "DEX",
"value": 10,
"base": 10,
"hasroll": true,
"initiative": 10,
"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": 11
},
"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": true,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -69,6 +100,7 @@
},
"dcv": {
"label": "DCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -77,6 +109,7 @@
},
"omcv": {
"label": "OMCV",
"hasroll": true,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -85,6 +118,7 @@
},
"dmcv": {
"label": "DMCV",
"hasroll": false,
"base": 3,
"autoMod": "0",
"userMod": "0",
@ -92,12 +126,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 +144,8 @@
},
"ed": {
"label": "ED",
"hasroll": false,
"isdefense": true,
"value": 2,
"base": 2,
"ed_nonresistant_total": 0,
@ -116,21 +155,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 +203,100 @@
},
"running": {
"label": "Running",
"ismovement": true,
"hasroll": false,
"value": 12,
"ncvalue": 24,
"base": 12
},
"swimming": {
"label": "Swimming",
"ismovement": true,
"hasroll": false,
"value": 4,
"ncvalue": 8,
"base": 4
},
"leaping": {
"label": "Leaping",
"ismovement": true,
"hasroll": false,
"value": 4,
"ncvalue": 8,
"base": 4,
"leaping_horizontal_base": 0,
"leaping_horizontal_total": 0,
"leaping_vertical_base": 0,
"leaping_vertical_total": 0
},
"flying": {
"label": "Flying",
}
}
},
"movements": {
"movements": {
"fly": {
"label": "Fly",
"value": 0,
"base": 0
"ncvalue": 0
},
"teleport": {
"label": "Teleport",
"value": 0,
"ncvalue": 0
},
"tunnel": {
"label": "Tunnel",
"value": 0,
"ncvalue": 0
},
"move1": {
"label": "N/A",
"iseditable": true,
"value": 0,
"ncvalue": 0
},
"move2": {
"label": "N/A",
"iseditable": true,
"value": 0,
"ncvalue": 0
}
}
},
"defenses": {
"defenses": {
"mental": {
"label": "Mental",
"value": 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 +305,18 @@
"character": {
"templates": [
"biodata",
"characteristics"
"characteristics",
"defenses",
"movements"
],
"subactors": []
},
"minion": {
"templates": [
"biodata",
"characteristics",
"defenses",
"movements"
],
"subactors": []
}
@ -195,6 +328,7 @@
"talent",
"power",
"advantage",
"maneuver",
"limitation",
"complication",
"equipment"
@ -218,15 +352,32 @@
"senseaffecting": false,
"modifiers": [],
"levels": 0,
"quantity": 0,
"quantity": 1,
"range": "",
"damage": "",
"endurance": 0,
"hasroll": false,
"roll": 0,
"computebody": false,
"haseffectroll": false,
"effectroll": "standard",
"effectrollformula": "",
"hascharges": false,
"nbcharges": 0,
"items": {}
}
},
"maneuver": {
"templates": [
"common"
],
"maneuvertype": "general",
"pha": "",
"ocv": "",
"dcv" : "",
"isstock": false,
"active": false
},
"advantage": {
"templates": [
"common"
@ -239,10 +390,14 @@
},
"skill": {
"skilltype": "agility",
"characteristic": "",
"characteristic": "str",
"base": "",
"levelscost": 0,
"levels": 0,
"skilllevelonly": false,
"skillfamiliarity": false,
"skilleveryman": false,
"skillprofiency": false,
"templates": [
"common"
]
@ -258,9 +413,22 @@
"common",
"power"
],
"subtype": "equipment",
"value": 0,
"weight": 0,
"moneycost": 0
"moneycost": 0,
"ocv": 0,
"omcv": 0,
"dmcv": 0,
"rmod": 0,
"pd": 0,
"ed": 0,
"rpd": 0,
"red": 0,
"mentaldefense": 0,
"powerdefense": 0,
"flashdefense": 0,
"otherdefense": 0
},
"attack": {
"templates": [
@ -291,15 +459,6 @@
"impenetrable": 0,
"value": 0
},
"maneuver": {
"templates": [
"common"
],
"phase": 0,
"ocv": "+0",
"dcv": "+0",
"active": false
},
"movement": {
"templates": [
"common"
@ -332,15 +491,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,130 @@
<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}}
{{log combat.flags}}
{{#if combatCount}}
{{#if combat.round}}
<!--<h3 class="encounter-title noborder">Turn {{combat.turnNumber}} Segment {{combat.segmentNumber}}</h3>-->
<h3 class="encounter-title noborder">Turn {{combat.flags.world.turnData.turnNumber}} Segment {{combat.flags.world.turnData.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,16 +9,33 @@
<div class="flexcol">
{{#if charac}}
<div class="flexrow">
<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>
</div>
{{/if}}
{{#if item}}
<div class="flexrow">
<span class="item-field-label-long margin-item-list">Characteristic : </span>
<span class="item-field-label-medium margin-item-list">{{charac.roll}}-</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/Malus : </span>
<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

@ -7,12 +7,6 @@
<hr>
{{#if img}}
<div >
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol">
</div>

View File

@ -0,0 +1,23 @@
<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>
<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

@ -7,28 +7,52 @@
<hr>
{{#if img}}
<div >
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div>
{{/if}}
<div class="flexcol">
</div>
<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 (eq item.type "maneuver")}}
<li>{{item.system.effects}}</li>
{{#if item.system.haseffectroll}}
<li>{{item.system.effectrollformula}}</li>
{{/if}}
{{/if}}
{{/if}}
{{#if (exists bonusMalus)}}
<li>Bonus/Penalty : {{bonusMalus}}
</li>
{{/if}}
<li>Bonus/Malus : {{bonusMalus}}
<li><strong>TOTAL : {{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,3 @@
<div>
BODY : {{bodyValue}}
</div>

View File

@ -0,0 +1,23 @@
<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>
<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

@ -20,6 +20,8 @@
</li>
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -67,5 +67,7 @@
</div>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -21,5 +21,8 @@
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -16,13 +16,15 @@
<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>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -1,9 +1,9 @@
<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>
<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}}
@ -16,23 +16,136 @@
<div class="tab details" data-group="primary" data-tab="details">
<ul>
{{> 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">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">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">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>
{{> 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" />
&nbsp;
<label class="item-field-label-long">Total Weight</label>
<label class="item-field-label-long">{{mul system.weight system.quantity}}</label>
</li>
{{> 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>
{{#if (eq system.subtype "weapon") }}
<li class="flexrow"><label class="item-field-label-long">OCV</label>
<input type="text" class="item-field-label-short" name="system.ocv" value="{{system.ocv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">OMCV</label>
<input type="text" class="item-field-label-short" name="system.omcv" value="{{system.omcv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">RMod</label>
<input type="text" class="item-field-label-short" name="system.rmod" value="{{system.rmod}}"
data-dtype="Number" />
</li>
{{/if}}
{{#if (eq system.subtype "shield") }}
<li class="flexrow"><label class="item-field-label-long">OCV</label>
<input type="text" class="item-field-label-short" name="system.ocv" value="{{system.ocv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">DCV</label>
<input type="text" class="item-field-label-short" name="system.dcv" value="{{system.dcv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">OMCV</label>
<input type="text" class="item-field-label-short" name="system.omcv" value="{{system.omcv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">DMCV</label>
<input type="text" class="item-field-label-short" name="system.dmcv" value="{{system.dmcv}}"
data-dtype="Number" />
</li>
{{/if}}
{{#if (eq system.subtype "armor") }}
<li class="flexrow"><label class="item-field-label-long">DCV</label>
<input type="text" class="item-field-label-short" name="system.dcv" value="{{system.dcv}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">DMCV</label>
<input type="text" class="item-field-label-short" name="system.dmcv" value="{{system.dmcv}}"
data-dtype="Number" />
</li>
{{/if}}
{{#if (or (eq system.subtype "armor") (eq system.subtype "shield")) }}
<li class="flexrow"><label class="item-field-label-long">PD</label>
<input type="text" class="item-field-label-short" name="system.pd" value="{{system.pd}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">ED</label>
<input type="text" class="item-field-label-short" name="system.ed" value="{{system.ed}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">rPD</label>
<input type="text" class="item-field-label-short" name="system.rpd" value="{{system.rpd}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">rED</label>
<input type="text" class="item-field-label-short" name="system.red" value="{{system.red}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">Mental Defense</label>
<input type="text" class="item-field-label-short" name="system.mentaldefense" value="{{system.mentaldefense}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">Power Defense</label>
<input type="text" class="item-field-label-short" name="system.powerdefense" value="{{system.powerdefense}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">Flash Defense</label>
<input type="text" class="item-field-label-short" name="system.flashdefense" value="{{system.flashdefense}}"
data-dtype="Number" />
</li>
<li class="flexrow"><label class="item-field-label-long">Other Defense</label>
<input type="text" class="item-field-label-short" name="system.otherdefense" value="{{system.otherdefense}}"
data-dtype="Number" />
</li>
{{/if}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-hasroll.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>
</form>

View File

@ -11,13 +11,16 @@
{{!-- 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>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-description.hbs}}
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -0,0 +1,60 @@
<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="String"/>
</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="String"/>
</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>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -21,5 +21,8 @@
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-cost.hbs}}
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -18,10 +18,15 @@
<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}}
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -17,7 +17,7 @@
<ul>
<li class="flexrow"><label class="item-field-label-long">Type</label>
<select class="item-field-label-medium" type="text" name="system.skilltype" value="{{system.skilltype}}" data-dtype="String">
{{#select system.skilltype}}
{{#select (lower system.skilltype)}}
{{#each config.skillType as |char key|}}
<option value="{{key}}">{{char}}</option>
{{/each}}
@ -28,14 +28,14 @@
{{#if (isSkillCustom system.skilltype)}}
<li class="flexrow"><label class="item-field-label-long">Base characteristic</label>
<select class="item-field-label-medium" type="text" name="system.characteristic" value="{{system.characteristic}}" data-dtype="String">
{{#select system.characteristic}}
{{#select (lower system.characteristic)}}
{{#each config.rollCharac as |char key|}}
<option value="{{key}}">{{char}}</option>
{{/each}}
{{/select}}
</select>
</li>
{{#if (eq system.characteristic "manual")}}
{{#if (eq (lower system.characteristic) "manual")}}
<li class="flexrow"><label class="item-field-label-long">Base value</label>
<input type="text" class="item-field-label-medium" name="system.base" value="{{system.base}}" data-dtype="Number" {{#if (ne system.characteristic "manual")}}disabled{{/if}} />
</li>
@ -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"/>
@ -56,5 +79,8 @@
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -22,6 +22,8 @@
</ul>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

View File

@ -103,5 +103,7 @@
</div>
</div>
{{> systems/fvtt-hero-system-6/templates/partials/partial-item-notes.hbs}}
</section>
</form>

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,122 @@
<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-very-short">
<label class="item-field-label-very-short">Qty</label>
</span>
<span class="item-field-label-long2">
<label class="item-field-label-long2">{{title}}</label>
</span>
{{#if (or (eq title "Money") (eq title "Equipment"))}}
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
{{/if}}
{{#if (eq title "Weapons")}}
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">OCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">DCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">rMod</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">Rng</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
{{/if}}
{{#if (eq title "Shields")}}
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">OCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">DCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">OMCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">DMCV</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">&nbsp;</label>
</span>
{{/if}}
{{#if (eq title "Armor")}}
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">PD</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">ED</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">rPD</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">rED</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">DCV</label>
</span>
{{/if}}
<span class="item-field-label-long2">
<label class="item-field-label-long2">Display</label>
</span>
{{#if (and (ne title "Armor") (ne title "Shields"))}}
<span class="item-field-label-short">
<label class="item-field-label-short">Effect</label>
</span>
{{else}}
<span class="item-field-label-short">
<label class="item-field-label-short">&nbsp;</label>
</span>
{{/if}}
<span class="item-field-label-short">
<label class="item-field-label-short">Roll</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">END</label>
</span>
<span class="item-field-label-very-short">
<label class="item-field-label-very-short">Value</label>
</span>
<span class="item-field-label-short">
<label class="item-field-label-short">Weight</label>
</span>
<div class="item-controls item-controls-fixed-small">
<a class="item-control item-add" data-type="equipment" title="Create Item"><i class="fas fa-plus item-controls-fixed-small"></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,67 @@
<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>
<span class="item-field-label-very-short content-center" ><label class="content-center">{{equip.system.quantity}}</label> </span>
<span class="item-field-label-long2">{{equip.name}}</span>
{{#if (or (eq equip.system.subtype "money") (eq equip.system.subtype "equipment"))}}
<span class="item-field-label-very-short"><label>&nbsp;</label> </span>
<span class="item-field-label-very-short"><label>&nbsp;</label> </span>
<span class="item-field-label-very-short"><label>&nbsp;</label> </span>
<span class="item-field-label-very-short"><label>&nbsp;</label> </span>
<span class="item-field-label-very-short"><label>&nbsp;</label> </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>)
{{#if (eq equip.system.subtype "weapon")}}
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.ocv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.omcv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.rmod) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{equip.system.range}}</label> </span>
<span class="item-field-label-very-short content-center"><label>&nbsp;</label> </span>
{{/if}}
{{#if (eq equip.system.subtype "shield")}}
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.ocv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.dcv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.omcv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.dmcv) decimals=0 sign=true}}</label> </span>
<span class="item-field-label-very-short content-center"><label>&nbsp;</label> </span>
{{/if}}
{{#if (eq equip.system.subtype "armor")}}
<span class="item-field-label-very-short content-center"><label>{{equip.system.pd}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{equip.system.ed}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{equip.system.rpd}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{equip.system.red}}</label> </span>
<span class="item-field-label-very-short content-center"><label>{{numberFormat (fixNum equip.system.dcv) decimals=0 sign=true}}</label> </span>
{{/if}}
<span class="item-field-label-long2"><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;
{{#if (and (ne equip.system.subtype "armor") (ne equip.system.subtype "shield"))}}
<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>
{{else}}
<span class="item-field-label-short"><label>&nbsp;</label></span>
{{/if}}
{{#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-very-short content-center"><label>{{equip.system.endurance}}</label> </span>
<span class="item-field-label-very-short"><label>{{mul equip.system.quantity equip.system.value}}</label> </span>
<span class="item-field-label-short content-center"><label>{{mul equip.system.quantity equip.system.weight}}</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,51 @@
<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-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>

View File

@ -3,16 +3,11 @@
<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>

Some files were not shown because too many files have changed in this diff Show More