Combat tracker fixes

This commit is contained in:
LeRatierBretonnien 2023-07-06 13:10:41 +02:00
parent 8f10b9825e
commit 1e74d6f306
5 changed files with 87 additions and 39 deletions

View File

@ -4,7 +4,7 @@ import { Hero6RollDialog } from "./hero6-roll-dialog.js";
import { Hero6LiftDice } from "./hero6-lift-dice.js"; import { Hero6LiftDice } from "./hero6-lift-dice.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const __speed2Segments = [[0], [7], [6, 12], [4, 8, 12], [3, 6, 9, 12], [3, 5, 8, 10, 12], [2, 4, 6, 8, 10, 12] const __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, 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]] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
@ -398,6 +398,9 @@ export class Hero6Actor extends Actor {
} }
game.combat.rebuildInitiative() game.combat.rebuildInitiative()
} }
async disableHoldAction() {
await this.setFlag("world", "hold-action", false)
}
async disableAbortAction() { async disableAbortAction() {
await this.setFlag("world", "abort-action", { state: false, count: 0 }) await this.setFlag("world", "abort-action", { state: false, count: 0 })
} }
@ -422,14 +425,19 @@ export class Hero6Actor extends Actor {
hasPhase(segmentNumber) { hasPhase(segmentNumber) {
let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
let phases = __speed2Segments[index] let phases = __speed2Segments[index]
console.log("index", segmentNumber, index, phases, phases.includes(segmentNumber)) console.log("index", segmentNumber, index, phases, phases.includes(segmentNumber), __speed2Segments)
return phases.includes(segmentNumber) return phases.includes(segmentNumber)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getSegments() { getSegments() {
let index = [Math.min(Math.max(this.system.characteristics.spd.value, 1), 12)] // Security bounds let index = Math.min(Math.max(this.system.characteristics.spd.value, 1), 12) // Security bounds
console.log("INDEX", index, __speed2Segments[index])
return __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() { getBaseInit() {
let r = new Roll("1d6").roll({ async: false }) let r = new Roll("1d6").roll({ async: false })
@ -476,6 +484,12 @@ export class Hero6Actor extends Actor {
ch.lift = Hero6LiftDice.getLift(ch.value) ch.lift = Hero6LiftDice.getLift(ch.value)
ch.liftDice = Hero6LiftDice.getLiftDice(ch.value) ch.liftDice = Hero6LiftDice.getLiftDice(ch.value)
} }
if (key == "spd") {
ch.phasesString = this.getPhasesString()
}
if (key =="pre") {
ch.presenceattack = duplicate(this.system.biodata.presenceattack)
}
} }
return characs return characs
} }

View File

@ -72,12 +72,18 @@ export class Hero6Combat extends Combat {
/* -------------------------------------------- */ /* -------------------------------------------- */
computeInitiative(c, updList) { computeInitiative(c, updList) {
let id = c._id || c.id let id = c._id || c.id
if (c.actor.hasPhase(this.segmentNumber) || c.actor.getHoldAction()) { let hasSegment = c.actor.hasPhase(this.segmentNumber)
let isOnHold = c.actor.isOnHold()
if (hasSegment || isOnHold) {
let baseInit = c.actor ? c.actor.getBaseInit() : 0; let baseInit = c.actor ? c.actor.getBaseInit() : 0;
let name = c.actor.name let name = c.actor.name
if (c.actor.getHoldAction()) { if (isOnHold) {
if (hasSegment) { // On hold + current segment -> auto-disable on hold
c.actor.disableHoldAction()
} else {
name = c.actor.name + " (H)" name = c.actor.name + " (H)"
} }
}
if (c.actor.getAbortAction()) { if (c.actor.getAbortAction()) {
name = c.actor.name + " (A)" name = c.actor.name + " (A)"
c.actor.disableAbortAction() c.actor.disableAbortAction()
@ -112,15 +118,29 @@ export class Hero6Combat extends Combat {
for (let c of this.combatants) { for (let c of this.combatants) {
this.computeInitiative(c, updList) this.computeInitiative(c, updList)
} }
console.log(this.combatants, updList)
if (updList.length > 0) { if (updList.length > 0) {
await this.updateEmbeddedDocuments("Combatant", updList); await this.updateEmbeddedDocuments("Combatant", updList);
console.log("Rebuild INIT", updList)
for(let c of updList) {
if ( c.initiative != 0) {
return true
} }
} }
}
return false
}
/* -------------------------------------------- */ /* -------------------------------------------- */
nextRound() { 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 turn = this.turn === null ? null : 0; // Preserve the fact that it's no-one's turn currently.
let turnData = this.getFlag("world", "hero6-turn-data")
console.log("Next round called....", nextRound, turnData)
while (!hasCombatants) {
turn = turn; // Preserve the fact that it's no-one's turn currently.
if (this.settings.skipDefeated && (turn !== null)) { if (this.settings.skipDefeated && (turn !== null)) {
turn = this.turns.findIndex(t => !t.isDefeated); turn = this.turns.findIndex(t => !t.isDefeated);
if (turn === -1) { if (turn === -1) {
@ -128,11 +148,11 @@ export class Hero6Combat extends Combat {
turn = 0; turn = 0;
} }
} }
let advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime; advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime;
advanceTime += CONFIG.time.roundTime; advanceTime += CONFIG.time.roundTime;
let nextRound = this.round + 1; nextRound = nextRound + 1;
console.log("Next round called....2", nextRound, turnData)
let turnData = this.getFlag("world", "hero6-turn-data") turnData = this.getFlag("world", "hero6-turn-data")
if (!turnData) { if (!turnData) {
turnData = { turnNumber: 0, segmentNumber: 12 } turnData = { turnNumber: 0, segmentNumber: 12 }
this.setFlag("world", "hero6-turn-data", turnData) this.setFlag("world", "hero6-turn-data", turnData)
@ -143,15 +163,18 @@ export class Hero6Combat extends Combat {
turnData.segmentNumber = 1 turnData.segmentNumber = 1
turnData.turnNumber++ turnData.turnNumber++
} }
this.setFlag("world", "hero6-turn-data", turnData) await this.setFlag("world", "hero6-turn-data", turnData)
this.turnNumber = turnData.turnNumber; this.turnNumber = turnData.turnNumber;
this.segmentNumber = turnData.segmentNumber; this.segmentNumber = turnData.segmentNumber;
console.log("Next round called....3", nextRound, turnData)
// Re-compute init of actors // Re-compute init of actors
this.rebuildInitiative() hasCombatants = await this.rebuildInitiative()
console.log("Going round....", nextRound, hasCombatants)
}
// Update the document, passing data through a hook first // Update the document, passing data through a hook first
const updateData = { round: nextRound, turn, segmentNumber: turnData.segmentNumber, turnNumber: turnData.turnNumber }; const updateData = { round: nextRound, turn: turn, segmentNumber: turnData.segmentNumber, turnNumber: turnData.turnNumber };
const updateOptions = { advanceTime, direction: 1 }; const updateOptions = { advanceTime, direction: 1 };
Hooks.callAll("combatRound", this, updateData, updateOptions); Hooks.callAll("combatRound", this, updateData, updateOptions);
return this.update(updateData, updateOptions); return this.update(updateData, updateOptions);

View File

@ -75,7 +75,7 @@ function welcomeMessage() {
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part"> content: `<div id="welcome-message-dark-stars"><span class="rdd-roll-part">
<strong>Welcome to the Hero6 RPG.</strong> <strong>Welcome to Hero System 6E RPG.</strong>
` }); ` });
} }

View File

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

View File

@ -37,4 +37,15 @@
{{/if}} {{/if}}
{{#if charac.phasesString}}
<h4 class="item-field-label-short margin-item-list">&nbsp;&nbsp;</h4>
<h4 class="item-field-label-long margin-item-list">Phases : {{charac.phasesString}}</h4>
{{/if}}
{{#if charac.presenceattack}}
<h4 class="item-field-label-short margin-item-list">&nbsp;&nbsp;</h4>
<h4 class="item-field-label-long margin-item-list">Presence attack</h4>
<a class="roll-direct" data-roll-source="Presence attack" data-roll-formula="{{charac.presenceattack.rollFormula}}"><i class="fas fa-dice"></i>{{charac.presenceattack.displayFormula}}</a>
{{/if}}
</li> </li>