Various automations fixes

This commit is contained in:
LeRatierBretonnien 2024-06-10 14:30:12 +02:00
parent 92684b0d32
commit dc4429f3e1
74 changed files with 2260 additions and 1952 deletions

View File

@ -1,3 +1,20 @@
{
"TYPES": {
"Actor": {
"character": "Character"
},
"Item": {
"armor": "Armor",
"weapon": "Weapon",
"equipment": "Equipment",
"skill": "Skill",
"perk": "Perk",
"ability": "Ability",
"cumulativetask": "Cumulative Task",
"genetic": "Genetic",
"money": "Money",
"cyber": "Cyber",
"ammo": "Ammo"
}
}
}

View File

@ -11,7 +11,7 @@ export class DarkStarsActorSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-dark-stars", "sheet", "actor"],
template: "systems/fvtt-dark-stars/templates/actors/actor-sheet.hbs",
width: 960,
@ -25,7 +25,7 @@ export class DarkStarsActorSheet extends ActorSheet {
/* -------------------------------------------- */
async getData() {
const objectData = this.object.system
let actorData = duplicate(objectData)
let actorData = foundry.utils.duplicate(objectData)
let formData = {
title: this.title,
@ -39,21 +39,23 @@ export class DarkStarsActorSheet extends ActorSheet {
limited: this.object.limited,
skills: this.actor.getSkills( ),
perks: this.actor.getPerks( ),
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
ammos: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getAmmos()) ),
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getSpells()) ),
powers: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getPowers()) ),
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()) ),
cybers: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getCybers()) ),
genetics: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getGenetics()) ),
weapons: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getWeapons()) ),
ammos: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getAmmos()) ),
spells: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getSpells()) ),
powers: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getPowers()) ),
armors: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getShields())),
equipments: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquipmentsOnly()) ),
equippedWeapons: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquippedWeapons()) ),
cybers: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getCybers()) ),
genetics: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getGenetics()) ),
equippedArmor: this.actor.getEquippedArmor(),
equippedShield: this.actor.getEquippedShield(),
subActors: duplicate(this.actor.getSubActors()),
subActors: foundry.utils.duplicate(this.actor.getSubActors()),
encCapacity: this.actor.getEncumbranceCapacity(),
conditions: this.actor.getConditions(),
tasks: this.actor.getCumulativeTasks(),
config: game.system.darkstars.config,
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}),
containersTree: this.actor.containersTree,
@ -145,7 +147,16 @@ export class DarkStarsActorSheet extends ActorSheet {
const skillId = li.data("item-id")
this.actor.rollSkill(skillId)
});
html.find('.roll-attribute').click((event) => {
const attrKey = $(event.currentTarget).data("attr-key")
this.actor.rollAttribute(attrKey)
})
html.find('.start-cumulative-task').click((event) => {
const li = $(event.currentTarget).parents(".item")
const skillId = li.data("item-id")
this.actor.rollSkill(skillId, true)
})
html.find('.roll-weapon').click((event) => {
const li = $(event.currentTarget).parents(".item");
const skillId = li.data("item-id")

View File

@ -43,8 +43,6 @@ export class DarkStarsActor extends Actor {
}
if (data.type == 'character') {
const skills = await DarkStarsUtility.loadCompendium("fvtt-dark-stars.skills");
data.items = skills.map(i => i.toObject())
}
if (data.type == 'npc') {
}
@ -120,54 +118,59 @@ export class DarkStarsActor extends Actor {
}
getEquippedWeapons() {
let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getArmors() {
let comp = duplicate(this.items.filter(item => item.type == 'armor') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'armor') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getSpells() {
let comp = duplicate(this.items.filter(item => item.type == 'spell') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'spell') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getPowers() {
let comp = duplicate(this.items.filter(item => item.type == 'psychic') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'psychic') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getCumulativeTasks() {
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'cumulativetask') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getEquippedArmor() {
let comp = this.items.find(item => item.type == 'armor' && item.system.equipped)
if (comp) {
return duplicate(comp)
return foundry.utils.duplicate(comp)
}
return undefined
}
/* -------------------------------------------- */
getCybers() {
let comp = duplicate(this.items.filter(item => item.type == 'cyber') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'cyber') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getGenetics() {
let comp = duplicate(this.items.filter(item => item.type == 'genetic') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'genetic') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getShields() {
let comp = duplicate(this.items.filter(item => item.type == 'shield') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'shield') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
getEquippedShield() {
let comp = this.items.find(item => item.type == 'shield' && item.system.equipped)
if (comp) {
return duplicate(comp)
return foundry.utils.duplicate(comp)
}
return undefined
}
@ -177,7 +180,7 @@ export class DarkStarsActor extends Actor {
if (item.type == "weapon" && item.system.needammo) {
let ammo = this.items.find(ammo => ammo.type == "ammo" && item.system.ammoid == ammo.id)
if (ammo) {
item.ammo = duplicate(ammo)
item.ammo = foundry.utils.duplicate(ammo)
}
}
}
@ -192,29 +195,34 @@ export class DarkStarsActor extends Actor {
/* -------------------------------------------- */
getConditions() {
let comp = duplicate(this.items.filter(item => item.type == 'condition') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'condition') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getWeapons() {
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'weapon') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getAmmos() {
let comp = duplicate(this.items.filter(item => item.type == 'ammo') || []);
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'ammo') || []);
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getItemById(id) {
let item = this.items.find(item => item.id == id);
if (item) {
item = duplicate(item)
getItemById(id, duplicate = true) {
let item = this.items.find(it => it.id == id)
if (item && duplicate) {
item = foundry.utils.duplicate(item)
}
return item;
return item
}
/* -------------------------------------------- */
getItem(id) {
let item = this.items.get(id)
return item
}
/* -------------------------------------------- */
setWeaponAmmo(weaponId, ammoId) {
@ -233,14 +241,14 @@ export class DarkStarsActor extends Actor {
/* -------------------------------------------- */
updateSkill(skill) {
skill.derivated = duplicate(this.system.derivated[skill.system.base])
skill.derivated = foundry.utils.duplicate(this.system.derivated[skill.system.base])
skill.total = skill.system.value + skill.derivated.value + skill.system.bonus
}
/* -------------------------------------------- */
getSkills() {
this.computeDerivated()
let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'skill') || [])
for (let skill of comp) {
this.updateSkill(skill)
}
@ -250,7 +258,7 @@ export class DarkStarsActor extends Actor {
/* -------------------------------------------- */
getPerks() {
let comp = duplicate(this.items.filter(item => item.type == 'perk') || [])
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'perk') || [])
DarkStarsUtility.sortArrayObjectsByName(comp)
return comp
}
@ -295,7 +303,7 @@ export class DarkStarsActor extends Actor {
}
/* ------------------------------------------- */
getEquipmentsOnly() {
return duplicate(this.items.filter(item => item.type == "equipment") || [])
return foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || [])
}
/* ------------------------------------------- */
@ -321,7 +329,7 @@ export class DarkStarsActor extends Actor {
/* ------------------------------------------- */
async buildContainerTree() {
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || [])
let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || [])
for (let equip1 of equipments) {
if (equip1.system.iscontainer) {
equip1.system.contents = []
@ -375,7 +383,7 @@ export class DarkStarsActor extends Actor {
async incDecHP(formula) {
let dmgRoll = new Roll(formula + "[dark-starsorange]").roll({ async: false })
await DarkStarsUtility.showDiceSoNice(dmgRoll, game.settings.get("core", "rollMode"))
let hp = duplicate(this.system.secondary.hp)
let hp = foundry.utils.duplicate(this.system.secondary.hp)
hp.value = Number(hp.value) + Number(dmgRoll.total)
this.update({ 'system.secondary.hp': hp })
return Number(dmgRoll.total)
@ -429,9 +437,10 @@ export class DarkStarsActor extends Actor {
return this.items.find(i => i.type == "perk" && i.name.toLowerCase() === "last word")
}
/* -------------------------------------------- */
getInitiativeScore() {
async getInitiativeScore() {
let initFormula = (this.system.derivated.si.value + this.system.derivated.si.bonus) + "d6"
let initRoll = new Roll(initFormula).roll({ async: false })
let initRoll = await new Roll(initFormula).roll()
await DarkStarsUtility.showDiceSoNice(initRoll, game.settings.get("core", "rollMode"))
return initRoll.total
}
@ -439,13 +448,13 @@ export class DarkStarsActor extends Actor {
getSubActors() {
let subActors = [];
for (let id of this.system.subactors) {
subActors.push(duplicate(game.actors.get(id)))
subActors.push(foundry.utils.duplicate(game.actors.get(id)))
}
return subActors;
}
/* -------------------------------------------- */
async addSubActor(subActorId) {
let subActors = duplicate(this.system.subactors);
let subActors = foundry.utils.duplicate(this.system.subactors);
subActors.push(subActorId);
await this.update({ 'system.subactors': subActors });
}
@ -464,7 +473,7 @@ export class DarkStarsActor extends Actor {
getOneSkill(skillId) {
let skill = this.items.find(item => item.type == 'skill' && item.id == skillId)
if (skill) {
skill = duplicate(skill);
skill = foundry.utils.duplicate(skill);
}
return skill;
}
@ -560,7 +569,7 @@ export class DarkStarsActor extends Actor {
/* -------------------------------------------- */
modifyRerolls( value) {
let rerolls = duplicate(this.system.various.rerolls)
let rerolls = foundry.utils.duplicate(this.system.various.rerolls)
rerolls.value += value
this.update({ 'system.various.rerolls': rerolls })
}
@ -576,7 +585,9 @@ export class DarkStarsActor extends Actor {
let rollData = DarkStarsUtility.getBasicRollData()
rollData.alias = this.name
rollData.actorImg = this.img
rollData.actorId = this.id
console.log("Prepare common roll data for actor", this)
rollData.tokenId = this.token?.id
rollData.actorId = this.id
rollData.img = this.img
rollData.armors = this.getArmors()
rollData.conditions = this.getConditions()
@ -616,24 +627,23 @@ export class DarkStarsActor extends Actor {
}
/* -------------------------------------------- */
rollAbility(abilityKey) {
let rollData = this.getCommonRollData(abilityKey)
rollData.mode = "ability"
if (rollData.target) {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return
}
DarkStarsUtility.rollDarkStars(rollData)
rollAttribute(attrKey) {
let rollData = this.getCommonRollData()
rollData.attr = foundry.utils.duplicate(this.system.attributes[attrKey])
rollData.mode = "attribute"
rollData.title = "Attribute " + rollData.attr.label
this.startRoll(rollData)
}
/* -------------------------------------------- */
rollSkill(skillId) {
async rollSkill(skillId, isCumulative = false, taskId = undefined) {
let skill = this.items.get(skillId)
if (skill) {
skill = duplicate(skill)
skill = foundry.utils.duplicate(skill)
this.updateSkill(skill)
let rollData = this.getCommonRollData()
rollData.mode = "skill"
rollData.isCumulative = isCumulative
rollData.title = "Skill " + skill.name
rollData.skill = skill
rollData.img = skill.img
@ -641,6 +651,17 @@ export class DarkStarsActor extends Actor {
ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.")
return
}
if (isCumulative) {
rollData.title = "Cumulative Task " + skill.name
if (!taskId) {
let cumulativeTask = await this.createEmbeddedDocuments("Item", [{name: "Cumulative task " + skill.name, type: "cumulativetask",
'system.skill': skill.name}])
//console.log("Task", cumulativeTask)
rollData.taskId = cumulativeTask[0].id
}else {
rollData.taskId = cumulativeTask[0].id
}
}
this.startRoll(rollData)
}
}
@ -649,10 +670,10 @@ export class DarkStarsActor extends Actor {
rollWeapon(weaponId) {
let weapon = this.items.get(weaponId)
if (weapon) {
weapon = duplicate(weapon)
weapon = foundry.utils.duplicate(weapon)
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase())
if (skill) {
skill = duplicate(skill)
skill = foundry.utils.duplicate(skill)
this.updateSkill(skill)
let rollData = this.getCommonRollData()
rollData.mode = "weapon"

View File

@ -21,7 +21,7 @@ export class DarkStarsCombat extends Combat {
for (let cId of ids) {
const c = this.combatants.get(cId);
let id = c._id || c.id;
let initScore = c.actor ? c.actor.getInitiativeScore(this.id, id) : -1;
let initScore = c.actor ? await c.actor.getInitiativeScore(this.id, id) : -1;
await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: initScore }]);
setTimeout(() => this.processOtherTurns(c, initScore), 400)
}

View File

@ -1,6 +1,72 @@
export const DARKSTARS_CONFIG = {
sizeOptions: {
"1": "Tiny",
"2": "Small",
"3": "Medium",
"4": "Large",
"5": "Huge",
"6": "Gargantuan"
},
classNPC: {
"none": "None",
"chaplain": "Chaplain",
"magus": "Magus",
"martial": "Martial",
"skalawag": "Skalawag",
"warden": "Warden"
},
synergyBonus: {
"0": "0",
"5": "+5%",
"+6": "+6%",
"+7": "+7%",
"+8": "+8%",
"+9": "+9%",
"+10": "+10%"
},
attributeModifier: [
{value: "0", label: "None"},
{value: "-1", label: "Difficult (-1)"},
{value: "-3", label: "Hard (-3)"},
{value: "-6", label: "Very Hard (-6)"},
{value: "-9", label: "Impossible (-9)"}
],
weaponAiming: {
"none": "None",
" arm": "Arm (-50)",
"head": "Head (-50)",
"torso": "Torso(-30)",
"leg": "Leg (-30)",
"hand": "Hand/Weapon (-70)"
},
rollModifiers: [
{ "value": "-80", "label": "-80%" },
{ "value": "-70", "label": "-70%" },
{ "value": "-60", "label": "-60%" },
{ "value": "-50", "label": "-50%" },
{ "value": "-40", "label": "-40%" },
{ "value": "-30", "label": "-30%" },
{ "value": "-20", "label": "-20%" },
{ "value": "-10", "label": "-10%" },
{ "value": "0", "label": "0%" },
{ "value": "+10", "label": "+10%" },
{ "value": "+20", "label": "+20%" },
{ "value": "+30", "label": "+30%" },
{ "value": "+40", "label": "+40%" }
],
abilityValues: {
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8"
},
basebonus : {
"csb": "CSB",
"ssb": "SSB",

View File

@ -9,7 +9,7 @@ export class DarkStarsItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-dark-stars", "sheet", "item"],
template: "systems/fvtt-dark-stars/templates/items/item-sheet.hbs",
dragDrop: [{ dragSelector: null, dropSelector: null }],
@ -49,7 +49,7 @@ export class DarkStarsItemSheet extends ItemSheet {
/* -------------------------------------------- */
async getData() {
let objectData = duplicate(this.object.system)
let objectData = foundry.utils.duplicate(this.object.system)
let formData = {
title: this.title,
@ -87,7 +87,7 @@ export class DarkStarsItemSheet extends ItemSheet {
/* -------------------------------------------- */
postItem() {
let chatData = duplicate(DarkStarsUtility.data(this.item));
let chatData = foundry.utils.duplicate(DarkStarsUtility.data(this.item));
if (this.actor) {
chatData.actor = { id: this.actor.id };
}

View File

@ -11,7 +11,7 @@ export class DarkStarsNPCSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["dark-stars-rpg", "sheet", "actor"],
template: "systems/fvtt-dark-stars/templates/npc-sheet.hbs",
width: 640,
@ -25,7 +25,7 @@ export class DarkStarsNPCSheet extends ActorSheet {
/* -------------------------------------------- */
async getData() {
const objectData = this.object.system
let actorData = duplicate(objectData)
let actorData = foundry.utils.duplicate(objectData)
let formData = {
title: this.title,
@ -38,21 +38,22 @@ export class DarkStarsNPCSheet extends ActorSheet {
data: actorData,
limited: this.object.limited,
skills: this.actor.getSkills( ),
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())),
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ),
weapons: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getWeapons()) ),
armors: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getArmors())),
shields: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getShields())),
spells: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getLore())),
equipments: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquipmentsOnly()) ),
equippedWeapons: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquippedWeapons()) ),
equippedArmor: this.actor.getEquippedArmor(),
equippedShield: this.actor.getEquippedShield(),
feats: duplicate(this.actor.getFeats()),
subActors: duplicate(this.actor.getSubActors()),
race: duplicate(this.actor.getRace()),
moneys: duplicate(this.actor.getMoneys()),
feats: foundry.utils.duplicate(this.actor.getFeats()),
subActors: foundry.utils.duplicate(this.actor.getSubActors()),
race: foundry.utils.duplicate(this.actor.getRace()),
moneys: foundry.utils.duplicate(this.actor.getMoneys()),
encCapacity: this.actor.getEncumbranceCapacity(),
saveRolls: this.actor.getSaveRoll(),
conditions: this.actor.getConditions(),
config: game.system.darkstars.config,
containersTree: this.actor.containersTree,
encCurrent: this.actor.encCurrent,
options: this.options,

View File

@ -67,8 +67,14 @@ export class DarkStarsRollDialog extends Dialog {
html.find('#weapon-aiming').change((event) => {
this.rollData.weaponAiming = String(event.currentTarget.value)
})
html.find('#synergy-bonus').change((event) => {
this.rollData.synergyBonus = Number(event.currentTarget.value)
})
html.find('#extra-time').change((event) => {
this.rollData.extraTime = event.currentTarget.checked
})
html.find('#attribute-modifier').change((event) => {
this.rollData.attributeModifier = Number(event.currentTarget.value)
})
}
}

View File

@ -11,9 +11,7 @@ export class DarkStarsUtility {
/* -------------------------------------------- */
static async init() {
Hooks.on('renderChatLog', (log, html, data) => DarkStarsUtility.chatListeners(html));
/*Hooks.on("dropCanvasData", (canvas, data) => {
DarkStarsUtility.dropItemOnToken(canvas, data)
});*/
Hooks.on('renderChatMessage', (message, html, data) => DarkStarsUtility.chatMessageHandler(message, html, data))
DarkStarsCommands.init();
@ -43,13 +41,28 @@ export class DarkStarsUtility {
return __locationNames[key]
})
this.gameSettings()
}
/*-------------------------------------------- */
static gameSettings() {
static async processOpposed(rollData) {
if (this.currentOpposition) {
let opposed = {
winner: this.currentOpposition,
looser: rollData,
isOpposed : true
}
if (rollData.degrees > this.currentOpposition.degrees ) {
opposed.winner = rollData
opposed.looser = this.currentOpposition
}
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-opposition-result.hbs`, opposed)
})
await msg.setFlag("world", "darkstars-roll-data", opposed)
} else {
this.currentOpposition = rollData
ui.notifications.info("Opposed rolls started with " + rollData.alias );
}
}
/*-------------------------------------------- */
@ -60,13 +73,13 @@ export class DarkStarsUtility {
/*-------------------------------------------- */
static getSkills() {
return duplicate(this.skills)
return foundry.utils.duplicate(this.skills)
}
/* -------------------------------------------- */
static async ready() {
const skills = await DarkStarsUtility.loadCompendium("fvtt-dark-stars.sprawl");
this.skills = skills.filter(i=> i.type =="skill").map(i => i.toObject() );
this.skills = skills.filter(i => i.type == "skill").map(i => i.toObject());
}
/* -------------------------------------------- */
@ -96,6 +109,13 @@ export class DarkStarsUtility {
rollData.roll = undefined
this.rollDarkStars(rollData)
})
html.on("click", '.chat-roll-opposed', event => {
let messageId = this.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "darkstars-roll-data")
this.processOpposed(rollData)
})
}
/* -------------------------------------------- */
@ -103,10 +123,8 @@ export class DarkStarsUtility {
const templatePaths = [
'systems/fvtt-dark-stars/templates/partials/editor-notes-gm.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-roll-select.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-actor-ability-block.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-actor-status.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-options-abilities.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-item-nav.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-item-description.hbs',
'systems/fvtt-dark-stars/templates/partials/partial-actor-equipment.hbs'
@ -275,12 +293,41 @@ export class DarkStarsUtility {
static async rollDarkStars(rollData) {
let actor = game.actors.get(rollData.actorId)
if (rollData.tokenId) {
actor = game.canvas.tokens.get(rollData.tokenId).actor
}
// Specific attribute
if (rollData.attr) {
rollData.isSuccess = false
rollData.isFailure = false
rollData.targetNumber = Math.max( rollData.attr.value + rollData.attributeModifier, 0)
let myRoll = await new Roll("1d10").roll()
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
if (myRoll.total <= rollData.targetNumber) {
rollData.isSuccess = true
rollData.isFailure = false
}
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.diceResult = myRoll.total
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-attribute-result.hbs`, rollData)
})
msg.setFlag("world", "darkstars-roll-data", rollData)
return
}
// ability/save/size => 0
rollData.percentValue = 0
if (rollData.skill) {
rollData.percentValue = rollData.skill.total
}
if (rollData.synergyBonus) {
rollData.percentValue += rollData.synergyBonus
}
if (rollData.extraTime) {
rollData.percentValue += 30
}
rollData.percentValue += rollData.bonusMalus
rollData.diceFormula = "1d100"
@ -293,20 +340,21 @@ export class DarkStarsUtility {
rollData.locationMalus = this.getAimingMalus(rollData.weaponAiming)
rollData.percentValue += rollData.locationMalus
}
rollData.percentValue = Math.max(rollData.percentValue, 0)
// Performs roll
console.log("Roll formula", rollData.diceFormula)
let myRoll = rollData.roll
if (!myRoll) { // New rolls only of no rerolls
myRoll = new Roll(rollData.diceFormula).roll({ async: false })
myRoll = await new Roll(rollData.diceFormula).roll()
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
}
rollData.roll = duplicate(myRoll)
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.diceResult = myRoll.total
rollData.isCriticalSuccess = rollData.diceResult <= rollData.skill.derivated.value
rollData.isCriticalFailure = rollData.diceResult == 100
rollData.isSuccess = rollData.diceResult == 1 || rollData.diceResult <= rollData.percentValue
rollData.isFailure = rollData.diceResult == 100 || rollData.diceResult > rollData.percentValue
rollData.degrees = Math.floor(rollData.percentValue / 10) - Math.floor(rollData.diceResult / 10)
rollData.degrees = Math.floor((rollData.percentValue - rollData.diceResult) / 10)
rollData.damageMultiplier = rollData.isCriticalSuccess ? 2 : 1
if (rollData.reroll) {
@ -322,7 +370,21 @@ export class DarkStarsUtility {
// Compute
rollData.locationMultiplier = this.locationMultiplier(rollData.weaponAiming)
}
// Task management
if (rollData.taskId) {
let task = actor.getItem(rollData.taskId)
console.log(" Task", task, rollData.taskId)
if (task) {
let newCumulated = rollData.degrees + task.system.cumulated
let nbrolls = task.system.nbrolls + 1
task.update({ 'system.cumulated': newCumulated, 'system.nbrolls': nbrolls })
rollData.taskName = task.name
rollData.taskCumulated = newCumulated
rollData.taskNbrolls = nbrolls
}
}
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-generic-result.hbs`, rollData)
})
@ -350,6 +412,19 @@ export class DarkStarsUtility {
static getUsers(filter) {
return game.users.filter(filter).map(user => user.id);
}
/* -------------------------------------------- */
static async chatMessageHandler(message, html, data) {
const chatCard = html.find('.gm-actions')
if (chatCard.length > 0) {
// If the user is the message author or the actor owner, proceed
const actor = game.actors.get(data.message.speaker.actor)
if (actor?.isOwner) return
else if (game.user.isGM || data.author.id === game.user.id) return
const divButtons = chatCard.find('.gm-actions')
divButtons.hide()
}
}
/* -------------------------------------------- */
static getWhisperRecipients(rollMode, name) {
switch (rollMode) {
@ -367,7 +442,7 @@ export class DarkStarsUtility {
/* -------------------------------------------- */
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
let chatGM = foundry.utils.duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
@ -428,11 +503,15 @@ export class DarkStarsUtility {
/* -------------------------------------------- */
static getBasicRollData() {
let rollData = {
rollId: randomID(16),
rollId: foundry.utils.randomID(16),
rollMode: game.settings.get("core", "rollMode"),
bonusMalus: 0,
isAboveEffectiveRange: false,
weaponAiming: "none"
weaponAiming: "none",
synergyBonus: 0,
extraTime: false,
attributeModifier: 0,
config: game.system.darkstars.config,
}
DarkStarsUtility.updateWithTarget(rollData)
return rollData

View File

@ -1 +1 @@
MANIFEST-000164
MANIFEST-000184

View File

@ -1,7 +1,7 @@
2024/02/26-14:13:38.988782 7f13374006c0 Recovering log #162
2024/02/26-14:13:38.999307 7f13374006c0 Delete type=3 #160
2024/02/26-14:13:38.999433 7f13374006c0 Delete type=0 #162
2024/02/26-14:20:24.273426 7f132fe006c0 Level-0 table #167: started
2024/02/26-14:20:24.273466 7f132fe006c0 Level-0 table #167: 0 bytes OK
2024/02/26-14:20:24.280039 7f132fe006c0 Delete type=0 #165
2024/02/26-14:20:24.287744 7f132fe006c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.855616 7f04234006c0 Recovering log #182
2024/06/09-22:14:13.912791 7f04234006c0 Delete type=3 #180
2024/06/09-22:14:13.912941 7f04234006c0 Delete type=0 #182
2024/06/10-09:41:28.708545 7f041be006c0 Level-0 table #187: started
2024/06/10-09:41:28.708577 7f041be006c0 Level-0 table #187: 0 bytes OK
2024/06/10-09:41:28.715216 7f041be006c0 Delete type=0 #185
2024/06/10-09:41:28.728576 7f041be006c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/02/25-13:25:19.760043 7f0428e006c0 Recovering log #158
2024/02/25-13:25:19.770300 7f0428e006c0 Delete type=3 #156
2024/02/25-13:25:19.770349 7f0428e006c0 Delete type=0 #158
2024/02/25-15:40:12.540906 7f0421a006c0 Level-0 table #163: started
2024/02/25-15:40:12.541352 7f0421a006c0 Level-0 table #163: 0 bytes OK
2024/02/25-15:40:12.547853 7f0421a006c0 Delete type=0 #161
2024/02/25-15:40:12.555529 7f0421a006c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.633006 7f0422a006c0 Recovering log #178
2024/06/09-15:12:48.642816 7f0422a006c0 Delete type=3 #176
2024/06/09-15:12:48.642870 7f0422a006c0 Delete type=0 #178
2024/06/09-22:14:10.275844 7f041be006c0 Level-0 table #183: started
2024/06/09-22:14:10.275910 7f041be006c0 Level-0 table #183: 0 bytes OK
2024/06/09-22:14:10.305783 7f041be006c0 Delete type=0 #181
2024/06/09-22:14:10.338771 7f041be006c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000157
MANIFEST-000177

View File

@ -1,7 +1,7 @@
2024/02/26-14:13:39.006215 7f133ce006c0 Recovering log #155
2024/02/26-14:13:39.017058 7f133ce006c0 Delete type=3 #153
2024/02/26-14:13:39.017184 7f133ce006c0 Delete type=0 #155
2024/02/26-14:20:24.266061 7f132fe006c0 Level-0 table #160: started
2024/02/26-14:20:24.266133 7f132fe006c0 Level-0 table #160: 0 bytes OK
2024/02/26-14:20:24.273275 7f132fe006c0 Delete type=0 #158
2024/02/26-14:20:24.287729 7f132fe006c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.916877 7f04220006c0 Recovering log #175
2024/06/09-22:14:13.976920 7f04220006c0 Delete type=3 #173
2024/06/09-22:14:13.977065 7f04220006c0 Delete type=0 #175
2024/06/10-09:41:28.721432 7f041be006c0 Level-0 table #180: started
2024/06/10-09:41:28.721455 7f041be006c0 Level-0 table #180: 0 bytes OK
2024/06/10-09:41:28.728421 7f041be006c0 Delete type=0 #178
2024/06/10-09:41:28.728621 7f041be006c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/02/25-13:25:19.773014 7f04234006c0 Recovering log #151
2024/02/25-13:25:19.782933 7f04234006c0 Delete type=3 #149
2024/02/25-13:25:19.782991 7f04234006c0 Delete type=0 #151
2024/02/25-15:40:12.548028 7f0421a006c0 Level-0 table #156: started
2024/02/25-15:40:12.548061 7f0421a006c0 Level-0 table #156: 0 bytes OK
2024/02/25-15:40:12.555343 7f0421a006c0 Delete type=0 #154
2024/02/25-15:40:12.555542 7f0421a006c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.646030 7f04220006c0 Recovering log #171
2024/06/09-15:12:48.657289 7f04220006c0 Delete type=3 #169
2024/06/09-15:12:48.657351 7f04220006c0 Delete type=0 #171
2024/06/09-22:14:10.305922 7f041be006c0 Level-0 table #176: started
2024/06/09-22:14:10.305944 7f041be006c0 Level-0 table #176: 0 bytes OK
2024/06/09-22:14:10.338591 7f041be006c0 Delete type=0 #174
2024/06/09-22:14:10.376968 7f041be006c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000210
MANIFEST-000230

View File

@ -1,7 +1,7 @@
2024/02/26-14:13:38.913763 7f13374006c0 Recovering log #208
2024/02/26-14:13:38.925039 7f13374006c0 Delete type=3 #206
2024/02/26-14:13:38.925223 7f13374006c0 Delete type=0 #208
2024/02/26-14:20:24.237608 7f132fe006c0 Level-0 table #213: started
2024/02/26-14:20:24.237681 7f132fe006c0 Level-0 table #213: 0 bytes OK
2024/02/26-14:20:24.244690 7f132fe006c0 Delete type=0 #211
2024/02/26-14:20:24.259041 7f132fe006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.629087 7f04234006c0 Recovering log #228
2024/06/09-22:14:13.682604 7f04234006c0 Delete type=3 #226
2024/06/09-22:14:13.682717 7f04234006c0 Delete type=0 #228
2024/06/10-09:41:28.681612 7f041be006c0 Level-0 table #233: started
2024/06/10-09:41:28.681700 7f041be006c0 Level-0 table #233: 0 bytes OK
2024/06/10-09:41:28.688115 7f041be006c0 Delete type=0 #231
2024/06/10-09:41:28.708370 7f041be006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/02/25-13:25:19.703338 7f0428e006c0 Recovering log #204
2024/02/25-13:25:19.713635 7f0428e006c0 Delete type=3 #202
2024/02/25-13:25:19.713706 7f0428e006c0 Delete type=0 #204
2024/02/25-15:40:12.512691 7f0421a006c0 Level-0 table #209: started
2024/02/25-15:40:12.512744 7f0421a006c0 Level-0 table #209: 0 bytes OK
2024/02/25-15:40:12.519870 7f0421a006c0 Delete type=0 #207
2024/02/25-15:40:12.526721 7f0421a006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.575130 7f0422a006c0 Recovering log #224
2024/06/09-15:12:48.586449 7f0422a006c0 Delete type=3 #222
2024/06/09-15:12:48.586519 7f0422a006c0 Delete type=0 #224
2024/06/09-22:14:10.136453 7f041be006c0 Level-0 table #229: started
2024/06/09-22:14:10.136510 7f041be006c0 Level-0 table #229: 0 bytes OK
2024/06/09-22:14:10.178843 7f041be006c0 Delete type=0 #227
2024/06/09-22:14:10.237058 7f041be006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000210
MANIFEST-000230

View File

@ -1,7 +1,7 @@
2024/02/26-14:13:38.930692 7f133ce006c0 Recovering log #208
2024/02/26-14:13:38.941919 7f133ce006c0 Delete type=3 #206
2024/02/26-14:13:38.942031 7f133ce006c0 Delete type=0 #208
2024/02/26-14:20:24.244869 7f132fe006c0 Level-0 table #213: started
2024/02/26-14:20:24.244926 7f132fe006c0 Level-0 table #213: 0 bytes OK
2024/02/26-14:20:24.251440 7f132fe006c0 Delete type=0 #211
2024/02/26-14:20:24.259056 7f132fe006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.684410 7f04220006c0 Recovering log #228
2024/06/09-22:14:13.738438 7f04220006c0 Delete type=3 #226
2024/06/09-22:14:13.738501 7f04220006c0 Delete type=0 #228
2024/06/10-09:41:28.695535 7f041be006c0 Level-0 table #233: started
2024/06/10-09:41:28.695561 7f041be006c0 Level-0 table #233: 0 bytes OK
2024/06/10-09:41:28.701707 7f041be006c0 Delete type=0 #231
2024/06/10-09:41:28.708395 7f041be006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/02/25-13:25:19.716119 7f04234006c0 Recovering log #204
2024/02/25-13:25:19.727169 7f04234006c0 Delete type=3 #202
2024/02/25-13:25:19.727244 7f04234006c0 Delete type=0 #204
2024/02/25-15:40:12.520043 7f0421a006c0 Level-0 table #209: started
2024/02/25-15:40:12.520077 7f0421a006c0 Level-0 table #209: 0 bytes OK
2024/02/25-15:40:12.526536 7f0421a006c0 Delete type=0 #207
2024/02/25-15:40:12.533719 7f0421a006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.588970 7f04220006c0 Recovering log #224
2024/06/09-15:12:48.599090 7f04220006c0 Delete type=3 #222
2024/06/09-15:12:48.599210 7f04220006c0 Delete type=0 #224
2024/06/09-22:14:10.179007 7f041be006c0 Level-0 table #229: started
2024/06/09-22:14:10.179038 7f041be006c0 Level-0 table #229: 0 bytes OK
2024/06/09-22:14:10.207646 7f041be006c0 Delete type=0 #227
2024/06/09-22:14:10.275783 7f041be006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000022
MANIFEST-000042

View File

@ -1,8 +1,8 @@
2024/02/26-14:13:38.966465 7f13374006c0 Recovering log #20
2024/02/26-14:13:38.977463 7f13374006c0 Delete type=3 #18
2024/02/26-14:13:38.977548 7f13374006c0 Delete type=0 #20
2024/02/26-14:20:24.259303 7f132fe006c0 Level-0 table #25: started
2024/02/26-14:20:24.259357 7f132fe006c0 Level-0 table #25: 0 bytes OK
2024/02/26-14:20:24.265823 7f132fe006c0 Delete type=0 #23
2024/02/26-14:20:24.287708 7f132fe006c0 Manual compaction at level-0 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/02/26-14:20:24.287792 7f132fe006c0 Manual compaction at level-1 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.796638 7f04234006c0 Recovering log #40
2024/06/09-22:14:13.848675 7f04234006c0 Delete type=3 #38
2024/06/09-22:14:13.848823 7f04234006c0 Delete type=0 #40
2024/06/10-09:41:28.701835 7f041be006c0 Level-0 table #45: started
2024/06/10-09:41:28.701863 7f041be006c0 Level-0 table #45: 0 bytes OK
2024/06/10-09:41:28.708242 7f041be006c0 Delete type=0 #43
2024/06/10-09:41:28.708405 7f041be006c0 Manual compaction at level-0 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/10-09:41:28.708427 7f041be006c0 Manual compaction at level-1 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2024/02/25-13:25:19.744621 7f0428e006c0 Recovering log #16
2024/02/25-13:25:19.754834 7f0428e006c0 Delete type=3 #14
2024/02/25-13:25:19.754885 7f0428e006c0 Delete type=0 #16
2024/02/25-15:40:12.533736 7f0421a006c0 Level-0 table #21: started
2024/02/25-15:40:12.533778 7f0421a006c0 Level-0 table #21: 0 bytes OK
2024/02/25-15:40:12.540676 7f0421a006c0 Delete type=0 #19
2024/02/25-15:40:12.555489 7f0421a006c0 Manual compaction at level-0 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/02/25-15:40:12.555554 7f0421a006c0 Manual compaction at level-1 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.617616 7f0422a006c0 Recovering log #36
2024/06/09-15:12:48.628378 7f0422a006c0 Delete type=3 #34
2024/06/09-15:12:48.628495 7f0422a006c0 Delete type=0 #36
2024/06/09-22:14:10.237082 7f041be006c0 Level-0 table #41: started
2024/06/09-22:14:10.237123 7f041be006c0 Level-0 table #41: 0 bytes OK
2024/06/09-22:14:10.275511 7f041be006c0 Delete type=0 #39
2024/06/09-22:14:10.305901 7f041be006c0 Manual compaction at level-0 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-22:14:10.338791 7f041be006c0 Manual compaction at level-1 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000177
MANIFEST-000197

View File

@ -1,7 +1,7 @@
2024/02/26-14:13:39.028984 7f13374006c0 Recovering log #175
2024/02/26-14:13:39.040662 7f13374006c0 Delete type=3 #173
2024/02/26-14:13:39.040750 7f13374006c0 Delete type=0 #175
2024/02/26-14:20:24.280431 7f132fe006c0 Level-0 table #180: started
2024/02/26-14:20:24.280468 7f132fe006c0 Level-0 table #180: 0 bytes OK
2024/02/26-14:20:24.287553 7f132fe006c0 Delete type=0 #178
2024/02/26-14:20:24.287767 7f132fe006c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.982525 7f04234006c0 Recovering log #195
2024/06/09-22:14:14.045462 7f04234006c0 Delete type=3 #193
2024/06/09-22:14:14.045536 7f04234006c0 Delete type=0 #195
2024/06/10-09:41:28.715334 7f041be006c0 Level-0 table #200: started
2024/06/10-09:41:28.715357 7f041be006c0 Level-0 table #200: 0 bytes OK
2024/06/10-09:41:28.721312 7f041be006c0 Delete type=0 #198
2024/06/10-09:41:28.728591 7f041be006c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/02/25-13:25:19.786914 7f0428e006c0 Recovering log #171
2024/02/25-13:25:19.797512 7f0428e006c0 Delete type=3 #169
2024/02/25-13:25:19.797578 7f0428e006c0 Delete type=0 #171
2024/02/25-15:40:12.555728 7f0421a006c0 Level-0 table #176: started
2024/02/25-15:40:12.555778 7f0421a006c0 Level-0 table #176: 0 bytes OK
2024/02/25-15:40:12.562473 7f0421a006c0 Delete type=0 #174
2024/02/25-15:40:12.562645 7f0421a006c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.661428 7f0422a006c0 Recovering log #191
2024/06/09-15:12:48.671794 7f0422a006c0 Delete type=3 #189
2024/06/09-15:12:48.671874 7f0422a006c0 Delete type=0 #191
2024/06/09-22:14:10.338805 7f041be006c0 Level-0 table #196: started
2024/06/09-22:14:10.338838 7f041be006c0 Level-0 table #196: 0 bytes OK
2024/06/09-22:14:10.376746 7f041be006c0 Delete type=0 #194
2024/06/09-22:14:10.376994 7f041be006c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000014
MANIFEST-000034

View File

@ -1,8 +1,8 @@
2024/02/26-14:13:38.944643 7f13374006c0 Recovering log #12
2024/02/26-14:13:38.955458 7f13374006c0 Delete type=3 #10
2024/02/26-14:13:38.955573 7f13374006c0 Delete type=0 #12
2024/02/26-14:20:24.251571 7f132fe006c0 Level-0 table #17: started
2024/02/26-14:20:24.251622 7f132fe006c0 Level-0 table #17: 0 bytes OK
2024/02/26-14:20:24.258866 7f132fe006c0 Delete type=0 #15
2024/02/26-14:20:24.259070 7f132fe006c0 Manual compaction at level-0 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/02/26-14:20:24.259112 7f132fe006c0 Manual compaction at level-1 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-22:14:13.740220 7f04234006c0 Recovering log #32
2024/06/09-22:14:13.790228 7f04234006c0 Delete type=3 #30
2024/06/09-22:14:13.790339 7f04234006c0 Delete type=0 #32
2024/06/10-09:41:28.688322 7f041be006c0 Level-0 table #37: started
2024/06/10-09:41:28.688366 7f041be006c0 Level-0 table #37: 0 bytes OK
2024/06/10-09:41:28.695417 7f041be006c0 Delete type=0 #35
2024/06/10-09:41:28.708385 7f041be006c0 Manual compaction at level-0 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/10-09:41:28.708412 7f041be006c0 Manual compaction at level-1 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2024/02/25-13:25:19.728626 7f0428e006c0 Recovering log #8
2024/02/25-13:25:19.738166 7f0428e006c0 Delete type=3 #6
2024/02/25-13:25:19.738216 7f0428e006c0 Delete type=0 #8
2024/02/25-15:40:12.526734 7f0421a006c0 Level-0 table #13: started
2024/02/25-15:40:12.526774 7f0421a006c0 Level-0 table #13: 0 bytes OK
2024/02/25-15:40:12.533260 7f0421a006c0 Delete type=0 #11
2024/02/25-15:40:12.548013 7f0421a006c0 Manual compaction at level-0 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/02/25-15:40:12.555515 7f0421a006c0 Manual compaction at level-1 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-15:12:48.601801 7f0422a006c0 Recovering log #28
2024/06/09-15:12:48.612089 7f0422a006c0 Delete type=3 #26
2024/06/09-15:12:48.612161 7f0422a006c0 Delete type=0 #28
2024/06/09-22:14:10.207782 7f041be006c0 Level-0 table #33: started
2024/06/09-22:14:10.207808 7f041be006c0 Level-0 table #33: 0 bytes OK
2024/06/09-22:14:10.236857 7f041be006c0 Delete type=0 #31
2024/06/09-22:14:10.275812 7f041be006c0 Manual compaction at level-0 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
2024/06/09-22:14:10.305912 7f041be006c0 Manual compaction at level-1 from '!folders!0XjcJyQMCVYU611t' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -101,5 +101,20 @@
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-dark-stars/archive/fvtt-dark-stars-v11.0.21.zip",
"url": "https://www.uberwald.me/gitea/uberwald/",
"background": "images/ui/dark_stars_welcome_page.webp",
"id": "fvtt-dark-stars"
"id": "fvtt-dark-stars",
"flags": {
"hotReload": {
"extensions": [
"css",
"hbs",
"json"
],
"paths": [
"styles/",
"lang/",
"assets/",
"templates/"
]
}
}
}

View File

@ -278,6 +278,7 @@
"Item": {
"types": [
"skill",
"cumulativetask",
"perk",
"ability",
"armor",
@ -305,6 +306,12 @@
"signs": 0,
"cherisheditems": 0
},
"cumulativetask": {
"cumulated": 0,
"nbrolls": 0,
"skill": "",
"description": ""
},
"psychic": {
"level": 0,
"egocost": 0,

View File

@ -32,7 +32,10 @@
<ul class="stat-list alternate-list item-list stat-column-size">
{{#each system.attributes as |attr key|}}
<li class="item stat flexrow list-item list-item-shadow">
<label class="item-field-label-medium">{{attr.label}}</label>
<a class="roll-attribute" data-attr-key="{{key}}">
<i class="fa-solid fa-dice-d10"></i>
<label class="item-field-label-medium">{{attr.label}}</label>
</a>
<input type="text" class="item-field-label-short padd-right" name="system.attributes.{{key}}.value" value="{{attr.value}}" data-dtype="Number"/>
{{/each}}
</li>
@ -99,21 +102,24 @@
<span class="item-name-label-header-long2">
<h3><label class="items-title-text">Skills</label></h3>
</span>
<span class="item-field-label-medium">
<span class="item-field-label-short">
<label class="short-label">Base</label>
</span>
<span class="item-field-label-long">
<label class="short-label">Derivated</label>
</span>
<span class="item-field-label-medium">
<span class="item-field-label-short">
<label class="short-label">Bonus</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">Total</label>
</span>
<span class="item-field-label-medium">
<span class="item-field-label-short">
<label class="short-label">Used?</label>
</span>
<span class="item-field-label-short">
<label class="short-label">Cumul.</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">&nbsp;</label>
</span>
@ -123,11 +129,47 @@
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{skill.img}}" />
</a>
<span class="item-field-label-vlong2"><i class="fa-solid fa-dice-d10"></i><a class="roll-skill">{{skill.name}}</a></span>
<span class="item-field-label-medium">{{skill.system.value}}</span>
<span class="item-field-label-short">{{skill.system.value}}</span>
<span class="item-field-label-long">{{skill.derivated.label}} ({{skill.derivated.value}})</span>
<span class="item-field-label-medium">{{skill.system.bonus}}</span>
<span class="item-field-label-short">{{skill.system.bonus}}</span>
<span class="item-field-label-medium">{{skill.total}}%</span>
<label class="attribute-value checkbox"><input type="checkbox" class="skill-used-id" {{checked skill.system.used}}/></label>
<span class="item-field-label-short" data-tooltip="Start a cumulative task"><a class="start-cumulative-task"><i class="fa-solid fa-circle-plus"></i></a></span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<ul class="alternate-list item-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header-long2">
<h3><label class="items-title-text">Tasks</label></h3>
</span>
<span class="item-field-label-long">
<label class="short-label">Skill</label>
</span>
<span class="item-field-label-short">
<label class="short-label">Nb Rolls</label>
</span>
<span class="item-field-label-short">
<label class="short-label">Total</label>
</span>
<span class="item-field-label-medium">
<label class="short-label">&nbsp;</label>
</span>
</li>
{{#each tasks as |task key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{task._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{task.img}}" />
</a>
<span class="item-field-label-vlong2"><i class="fa-solid fa-dice-d10"></i><a class="roll-skill">{{task.name}}</a></span>
<span class="item-field-label-long">{{task.system.skill}}</span>
<span class="item-field-label-short">{{task.system.nbrolls}}</span>
<span class="item-field-label-short">{{task.system.cumulated}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
@ -270,12 +312,8 @@
{{#if weapon.system.needammo}}
<select class="item-field-label-long edit-weapon-ammo" type="text" data-dtype="String">
{{#select system.ammoid}}
<option value="">None</option>
{{#each @root.ammos as |ammo index|}}
<option value="{{ammo._id}}">{{ammo.name}}</option>
{{/each}}
{{/select}}
{{selectOptions @root.ammos selected=system.ammoid valueAttr="_id" nameAttr="_id" labelAttr="name"}}
</select>
{{#if weapon.ammo}}
<span class="item-field-label-medium margin-left-4"><label>{{weapon.ammo.system.damage}}</label></span>
@ -440,12 +478,8 @@
{{#if weapon.system.needammo}}
<select class="item-field-label-vlong edit-weapon-ammo" type="text" data-dtype="String">
{{#select system.ammoid}}
<option value="">None</option>
{{#each @root.ammos as |ammo index|}}
<option value="{{ammo._id}}">{{ammo.name}}</option>
{{/each}}
{{/select}}
<option value="">None</option>
{{selectOptions @root.ammos selected=system.ammoid valueAttr="_id" nameAttr="_id" labelAttr="name"}}
</select>
{{#if weapon.ammo}}
<span class="item-field-label-medium"><label>{{weapon.ammo.system.damage}}</label></span>
@ -712,14 +746,7 @@
<li class="flexrow item">
<label class="generic-label">Size</label>
<select class="competence-base flexrow" type="text" name="system.biodata.size" value="{{data.biodata.size}}" data-dtype="Number">
{{#select data.biodata.size}}
<option value="1">Tiny</option>
<option value="2">Small</option>
<option value="3">Medium</option>
<option value="4">Large</option>
<option value="5">Huge</option>
<option value="6">Gargantuan</option>
{{/select}}
{{selectOptions config.sizeOptions selected=data.biodata.size}}
</select>
</li>
<li class="flexrow item">

View File

@ -23,14 +23,7 @@
<h4 class="ability-text-white ability-margin">Class</h4>
</span>
<select class="competence-base flexrow" type="text" name="system.biodata.class" value="{{data.biodata.class}}" data-dtype="String">
{{#select data.biodata.class}}
<option value="none">None</option>
<option value="chaplain">Chaplain</option>
<option value="magus">Magus</option>
<option value="martial">Martial</option>
<option value="skalawag">Skalawag</option>
<option value="warden">Warden</option>
{{/select}}
{{selectOptions @root.config.classNPC selected=data.biodata.class }}
</select>
</li>
@ -365,14 +358,7 @@
<li class="flexrow item">
<label class="generic-label">Size</label>
<select class="competence-base flexrow" type="text" name="system.biodata.size" value="{{data.biodata.size}}" data-dtype="Number">
{{#select data.biodata.size}}
<option value="1">Tiny</option>
<option value="2">Small</option>
<option value="3">Medium</option>
<option value="4">Large</option>
<option value="5">Huge</option>
<option value="6">Gargantuan</option>
{{/select}}
{{selectOptions config.sizeOptions selected=data.biodata.size}}
</select>
</li>
<li class="flexrow item">

View File

@ -7,58 +7,62 @@
</header>
<div class="flexcol">
{{#if attr}}
<div class="flexrow">
<span class="roll-dialog-label">Attribute : </span>
<span class="roll-dialog-label">{{attr.label}} ( {{attr.value}} )</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Modifier : </span>
<select class="status-small-label color-class-common" type="text" id="attribute-modifier" value="{{attributeModifier}}" data-dtype="String" >
{{selectOptions config.attributeModifier selected=attributeModifier valueAttr="value" nameAttr="value" labelAttr="label"}}
</select>
</div>
{{/if}}
{{#if skill}}
<div class="flexrow">
<span class="roll-dialog-label">Skill : </span>
<span class="roll-dialog-label">{{skill.name}} ( {{skill.total}}% )</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Skill : </span>
<span class="roll-dialog-label">{{skill.name}} ( {{skill.total}}% )</span>
</div>
{{#if weapon}}
<div class="flexrow">
<span class="roll-dialog-label">Weapon : </span>
<span class="roll-dialog-label">{{weapon.name}}</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Above effective range ({{weapon.system.effectiverange}}, -30%) : </span>
<label class="attribute-value checkbox"><input type="checkbox" id="above-effective-range" {{checked isAboveEffectiveRange}}/></label>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Aiming : </span>
<select class="status-small-label color-class-common" type="text" id="weapon-aiming" value="{{weaponAiming}}" data-dtype="String" >
{{selectOptions config.weaponAiming selected=weaponAiming}}
</select>
</div>
{{else}}
<div class="flexrow">
<span class="roll-dialog-label">Synergy Bonus : </span>
<select class="status-small-label color-class-common" type="text" id="synergy-bonus" value="{{synergyBonus}}" data-dtype="N"umber >
{{selectOptions config.synergyBonus selected=synergyBonus}}
</select>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Extra time (+30%): </span>
<input type="checkbox" id="extra-time" name="extraTime" {{checked extraTime}}/></label>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select class="status-small-label color-class-common" type="text" id="bonusMalus" value="{{bonusMalus}}" data-dtype="Number" >
{{selectOptions config.rollModifiers selected=bonusMalus valueAttr="value" nameAttr="value" labelAttr="label"}}
</select>
</div>
{{/if}}
{{#if weapon}}
<div class="flexrow">
<span class="roll-dialog-label">Weapon : </span>
<span class="roll-dialog-label">{{weapon.name}}</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Above effective range ({{weapon.system.effectiverange}}, -30%) : </span>
<label class="attribute-value checkbox"><input type="checkbox" id="above-effective-range" {{checked isAboveEffectiveRange}}/></label>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Aiming : </span>
<select class="status-small-label color-class-common" type="text" id="weapon-aiming" value="{{weaponAiming}}" data-dtype="String" >
{{#select weaponAiming}}
<option value="none">None</option>
<option value="arm">Arm (-50)</option>
<option value="head">Head (-50)</option>
<option value="torso">Torso(-30)</option>
<option value="leg">Leg (-30)</option>
<option value="hand">Hand/Weapon (-70)</option>
{{/select}}
</select>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select class="status-small-label color-class-common" type="text" id="bonusMalus" value="{{bonusMalus}}" data-dtype="Number" >
{{#select bonusMalus}}
<option value="-80">-80%</option>
<option value="-70">-70%</option>
<option value="-60">-60%</option>
<option value="-50">-50%</option>
<option value="-40">-40%</option>
<option value="-30">-30%</option>
<option value="-20">-20%</option>
<option value="-10">-10%</option>
<option value="0">0%</option>
<option value="+10">+10%</option>
<option value="+20">+20%</option>
<option value="+30">+30%</option>
<option value="+40">+40%</option>
{{/select}}
</select>
</div>
</div>
</form>

View File

@ -1,75 +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>
<ul>
<li><strong>Fight result !</strong></li>
{{#if successDetails.fumbleDetails}}
<li>Fumble ! : {{successDetails.fumbleDetails.data.text}} </li>
{{/if}}
{{#if armorResult}}
<li>Armor initial result : {{armorResult.rawArmor}}</li>
{{#each armorResult.messages as |message idx|}}
<li>{{message}}</li>
{{/each}}
{{/if}}
{{#if successDetails.hack_vs_shields}}
<li>Hack weapon : check shield !</li>
{{/if}}
{{#if successDetails.entangle}}
<li>Entangle weapon : attacker can entangle !</li>
{{/if}}
{{#if successDetails.knockback}}
<li>Knockback weapon : check knockback !</li>
{{/if}}
{{#if successDetails.hack_armors}}
<li>Hack weapon : check armor damage !</li>
{{/if}}
{{#if successDetails.penetrating_impale}}
<li>Penetrating weapon : apply the Impale condition !</li>
{{/if}}
{{#if (or successDetails.critical_1 successDetails.critical_2)}}
<li>Critical {{#if successDetails.critical_1}} 1 {{else}} 2 {{/if}} : {{successDetails.criticalText}} </li>
{{/if}}
{{#if successDetails.attackerHPLossValue}}
<li>Attacker has lost HP : {{successDetails.attackerHPLossValue}} HP </li>
{{/if}}
{{#if successDetails.defenderHPLossValue}}
<li>Defender has lost HP : {{successDetails.defenderHPLossValue}} HP </li>
{{/if}}
<li>Success details : {{successDetails.result}} </li>
<li><strong>Final successes</strong> {{sumSuccess}} </li>
<!-- <button class="chat-card-button reroll-level-remaining" data-roll-id="{{rollId}}">Reroll</button> -->
</ul>
</div>
</div>

View File

@ -0,0 +1,30 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class=chat-actor-name>{{alias}}</h4>
</div>
<hr>
<div class="flexcol">
</div>
<div>
<ul>
<li>Attribute : {{attr.label}} ({{attr.value}})</li>
<li>Modifier : {{attributeModifier}}</li>
<li>Target : {{targetNumber}}</li>
<li>Result : {{diceResult}}</li>
{{#if isSuccess}}
<li><strong>Success !</strong></li>
{{else}}
<li><strong>Failure ...</strong></li>
{{/if}}
</ul>
</div>
</div>

View File

@ -18,7 +18,7 @@
<div>
<ul>
{{#if skill}}
<li>Skill : {{skill.name}} ({{skill.total}}%)</li>
{{/if}}
@ -30,18 +30,41 @@
{{/if}}
<li>Bonus/Malus: {{bonusMalus}}% </li>
{{#if extraTime}}
<li>Extra time: +30%, time x 2</li>
{{/if}}
{{#if synergyBonus}}
<li>Synergy Bonus: +{{synergyBonus}}% </li>
{{/if}}
<li>Target Number: {{percentValue}}% </li>
<li>Result: {{diceResult}} </li>
<li>Degrees: {{degrees}} </li>
<li class="flexrow gm-actions">
<span>Degrees: {{degrees}}</span>
<a class="chat-roll-opposed">
<span data-tooltip="Opposed" class="roll-opposed-icon fa-stack fa-1x">
<i class="fa-thin fa-square fa-stack-1x"></i>
<i class="fa-solid fa-arrow-right-arrow-left fa-stack-1x "></i>
</span>
</a>
</li>
{{#if taskId}}
<li>Task : {{taskName}}</li>
<li>Nb rolls : {{taskNbrolls}} </li>
<li>Cumulated : {{taskCumulated}} </li>
{{/if}}
{{#if isCriticalSuccess}}
<li><strong>Critical Success !</strong></li>
<li><strong>Special Success !</strong></li>
{{else}}
{{#if isSuccess}}
<li><strong>Success !</strong></li>
{{else}}
{{#if isCriticalFailure}}
<li><strong>Critical Failure !</strong></li>
<li><strong>Mishap !</strong></li>
{{else}}
<li><strong>Failure ...</strong></li>
{{/if}}

View File

@ -1,11 +0,0 @@
<div class="chat-message-header">
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
<h4 class=chat-actor-name>{{defenderName}}</h4>
</div>
<hr>
<div >
{{defenderName}} wins the opposition against {{attackerName}} !
</div>
</div>

View File

@ -0,0 +1,19 @@
<div class="chat-message-header">
<img class="actor-icon" src="{{winner.actorImg}}" alt="{{winner.alias}}" />
<span data-tooltip="Opposed" class="roll-opposed-icon fa-stack fa-1x">
<i class="fa-thin fa-square fa-stack-1x"></i>
<i class="fa-solid fa-arrow-right-arrow-left fa-stack-1x "></i>
</span>
<img class="actor-icon" src="{{looser.actorImg}}" alt="{{looser.alias}}" />
<label class="chat-actor-name-opposition">{{winner.alias}} vs {{looser.alias}}</label>
</div>
<hr>
<div >
<label class="chat-result-success">{{winner.alias}} ({{winner.skill.name}}, {{winner.diceResult}}) wins opposition against {{looser.alias}} ({{looser.skill.name}}, {{looser.diceResult}})</label>
</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

@ -47,11 +47,7 @@
<li class="flexrow"><label class="generic-label">Availability</label>
<select class="competence-base flexrow" type="text" name="system.availability" value="{{system.availability}}" data-dtype="String">
{{#select system.availability}}
{{#each config.availability as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
{{selectOptions config.availability selected=system.availability}}
</select>
</li>

View File

@ -0,0 +1,33 @@
<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-dark-stars/templates/partials/partial-item-nav.hbs}}
{{!-- Sheet Body --}}
<section class="sheet-body">
{{> systems/fvtt-dark-stars/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">Skill</label>
<label class="item-field-label-long">{{system.skill}}</label>
</li>
<li class="flexrow">
<label class="item-field-label-long">Cumulated score</label>
<label class="item-field-label-long">{{system.cumulated}}</label>
</li>
<li class="flexrow">
<label class="item-field-label-long">Number of rolls</label>
<label class="item-field-label-long">{{system.nbrolls}}</label>
</li>
</ul>
</div>
</section>
</form>

View File

@ -19,11 +19,7 @@
<label class="item-field-label-long">Cyber Type</label>
<select class="item-field-label-vlong" type="text" name="system.cybertype" value="{{system.cybertype}}"
data-dtype="String">
{{#select system.cybertype}}
{{#each config.cyberTypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.cyberTypes selected=system.cybertype}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Upgrade</label>

View File

@ -19,11 +19,7 @@
<label class="item-field-label-long">Genetic Type</label>
<select class="item-field-label-vlong" type="text" name="system.cybertype" value="{{system.cybertype}}"
data-dtype="String">
{{#select system.cybertype}}
{{#each config.cyberTypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.cyberTypes selected=system.cybertype}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Upgrade</label>

View File

@ -17,11 +17,7 @@
<li class="flexrow"><label class="item-field-label-long">Perk Type</label>
<select class="item-field-label-vlong" type="text" name="system.perktype" value="{{system.perktype}}" data-dtype="String">
{{#select system.perktype}}
{{#each config.perktypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.perktypes selected=system.perktype}}
</select>
</li>

View File

@ -17,11 +17,7 @@
<li class="flexrow"><label class="item-field-label-long">Perk Type</label>
<select class="item-field-label-vlong" type="text" name="system.perktype" value="{{system.perktype}}" data-dtype="String">
{{#select system.perktype}}
{{#each config.perktypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.perktypes selected=system.perktype}}
</select>
</li>

View File

@ -17,11 +17,7 @@
<ul>
<li class="flexrow"><label class="item-field-label-long">Base</label>
<select class="item-field-label-long competence-base flexrow" type="text" name="system.base" value="{{system.base}}" data-dtype="String">
{{#select system.base}}
{{#each config.basebonus as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
{{selectOptions config.basebonus selected=system.base}}
</select>
</li>

View File

@ -19,11 +19,7 @@
<label class="item-field-label-long">Magic Type</label>
<select class="item-field-label-vlong" type="text" name="system.magictype" value="{{system.magictype}}"
data-dtype="String">
{{#select system.magictype}}
{{#each config.magicTypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.magicTypes selected=system.magictype}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Experience</label>

View File

@ -21,21 +21,13 @@
<li class="flexrow"><label class="item-field-label-long">Weapon Type</label>
<select class="item-field-label-vlong" type="text" name="system.weapontype" value="{{system.weapontype}}" data-dtype="String">
{{#select system.weapontype}}
{{#each config.weapontypes as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.weapontypes selected=system.weapontype}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Associated skill</label>
<select class="item-field-label-vlong" type="text" name="system.skill" value="{{system.skill}}" data-dtype="String">
{{#select system.skill}}
{{#each skills as |skill idx|}}
<option value="{{skill.name}}">{{skill.name}}</option>
{{/each}}
{{/select}}
{{selectOptions skills selected=system.skill nameAttr="name" valueAttr="name" labelAttr="name"}}
</select>
</li>
@ -91,21 +83,13 @@
<li class="flexrow"><label class="item-field-label-long">Effective Range</label>
<select class="item-field-label-long" type="text" name="system.effectiverange" value="{{system.effectiverange}}" data-dtype="Number">
{{#select system.effectiverange}}
{{#each config.range as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.range selected=system.effectiverange}}
</select>
</li>
<li class="flexrow"><label class="item-field-label-long">Maximum Range</label>
<select class="item-field-label-long" type="text" name="system.maxrange" value="{{system.maxrange}}" data-dtype="Number">
{{#select system.maxrange}}
{{#each config.range as |type key|}}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
{{selectOptions config.range selected=system.maxrange}}
</select>
</li>

View File

@ -4,16 +4,6 @@
</span>
<select class="status-small-label color-class-common" type="text" name="system.abilities.{{key}}.value" value="{{ability.value}}"
data-dtype="Number" {{#unless @root.editScore}}disabled{{/unless}}>
{{#select ability.value}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
{{/select}}
{{selectOptions @root.config.abilityValues selected=ability.value}}
</select>
</li>

View File

@ -1,7 +0,0 @@
<option value="agi">Agility</option>
<option value="str">Strength</option>
<option value="dex">Dexterity</option>
<option value="con">Constitution</option>
<option value="int">Intelligence</option>
<option value="wit">Wits</option>
<option value="cha">Charisma</option>

View File

@ -1,14 +0,0 @@
{{#if notapplicable}}
<option value="notapplicable">Not applicable</option>
{{/if}}
<option value="0">0</option>
<option value="1">d4</option>
<option value="2">d6</option>
<option value="3">d8</option>
<option value="4">d10</option>
<option value="5">d12</option>
<option value="6">d12 d4</option>
<option value="7">d12 d6</option>
<option value="8">d12 d8</option>
<option value="9">d12 d10</option>
<option value="10">d12 d12</option>

View File

@ -1,15 +0,0 @@
{{#if notapplicable}}
<option value="notapplicable">Not applicable</option>
{{/if}}
<option value="touch">Self Only</option>
<option value="touchself">Touch/Self</option>
<option value="tz">Threat Zone</option>
<option value="close">Close</option>
<option value="medium">Medium</option>
<option value="long">Long</option>
<option value="extreme">Extreme</option>
<option value="sight">Line of Sight</option>
<option value="tz_close">TZ/Close</option>
<option value="close_medium">Close/Medium</option>
<option value="medium_long">Medium/Long</option>
<option value="long_extreme">Long/Extreme</option>

View File

@ -1,4 +0,0 @@
<ul>
</ul>