From 15e249e41e9845240e47b47492bb5c2922d4075e Mon Sep 17 00:00:00 2001
From: LeRatierBretonnien
Date: Fri, 7 Jun 2024 11:26:46 +0200
Subject: [PATCH] v12 support
---
module/actor-sheet.js | 4 +-
module/actor.js | 66 +++---
module/item-sheet.js | 2 +-
module/sos-card-deck.js | 24 +-
module/sos-combat.js | 4 +-
module/sos-dialog-combat-actions.js | 6 +-
module/sos-flip-dialog.js | 14 +-
module/sos-gm-deck.js | 6 +-
module/sos-main.js | 1 +
module/sos-utility.js | 338 +++++++++++++--------------
packs/combat-actions/000009.log | 0
packs/combat-actions/000011.ldb | Bin 0 -> 15155 bytes
packs/combat-actions/CURRENT | 1 +
packs/combat-actions/LOCK | 0
packs/combat-actions/LOG | 13 ++
packs/combat-actions/LOG.old | 5 +
packs/combat-actions/MANIFEST-000007 | Bin 0 -> 256 bytes
packs/consequences/000009.log | 0
packs/consequences/000011.ldb | Bin 0 -> 7666 bytes
packs/consequences/CURRENT | 1 +
packs/consequences/LOCK | 0
packs/consequences/LOG | 13 ++
packs/consequences/LOG.old | 5 +
packs/consequences/MANIFEST-000007 | Bin 0 -> 255 bytes
packs/gears/000009.log | 0
packs/gears/000011.ldb | Bin 0 -> 58930 bytes
packs/gears/CURRENT | 1 +
packs/gears/LOCK | 0
packs/gears/LOG | 13 ++
packs/gears/LOG.old | 5 +
packs/gears/MANIFEST-000007 | Bin 0 -> 260 bytes
packs/genelines/000009.log | 0
packs/genelines/000011.ldb | Bin 0 -> 7865 bytes
packs/genelines/CURRENT | 1 +
packs/genelines/LOCK | 0
packs/genelines/LOG | 13 ++
packs/genelines/LOG.old | 5 +
packs/genelines/MANIFEST-000007 | Bin 0 -> 255 bytes
packs/injuries/000009.log | 0
packs/injuries/000011.ldb | Bin 0 -> 14817 bytes
packs/injuries/CURRENT | 1 +
packs/injuries/LOCK | 0
packs/injuries/LOG | 13 ++
packs/injuries/LOG.old | 5 +
packs/injuries/MANIFEST-000007 | Bin 0 -> 256 bytes
packs/languages/000009.log | 0
packs/languages/000011.ldb | Bin 0 -> 1725 bytes
packs/languages/CURRENT | 1 +
packs/languages/LOCK | 0
packs/languages/LOG | 13 ++
packs/languages/LOG.old | 5 +
packs/languages/MANIFEST-000007 | Bin 0 -> 255 bytes
packs/skills/000009.log | 0
packs/skills/000011.ldb | Bin 0 -> 11402 bytes
packs/skills/CURRENT | 1 +
packs/skills/LOCK | 0
packs/skills/LOG | 13 ++
packs/skills/LOG.old | 5 +
packs/skills/MANIFEST-000007 | Bin 0 -> 255 bytes
packs/subcultures/000009.log | 0
packs/subcultures/000011.ldb | Bin 0 -> 4158 bytes
packs/subcultures/CURRENT | 1 +
packs/subcultures/LOCK | 0
packs/subcultures/LOG | 13 ++
packs/subcultures/LOG.old | 5 +
packs/subcultures/MANIFEST-000007 | Bin 0 -> 255 bytes
packs/weaknesses/000009.log | 0
packs/weaknesses/000011.ldb | Bin 0 -> 837 bytes
packs/weaknesses/CURRENT | 1 +
packs/weaknesses/LOCK | 0
packs/weaknesses/LOG | 13 ++
packs/weaknesses/LOG.old | 5 +
packs/weaknesses/MANIFEST-000007 | Bin 0 -> 255 bytes
system.json | 15 +-
74 files changed, 410 insertions(+), 241 deletions(-)
create mode 100644 packs/combat-actions/000009.log
create mode 100644 packs/combat-actions/000011.ldb
create mode 100644 packs/combat-actions/CURRENT
create mode 100644 packs/combat-actions/LOCK
create mode 100644 packs/combat-actions/LOG
create mode 100644 packs/combat-actions/LOG.old
create mode 100644 packs/combat-actions/MANIFEST-000007
create mode 100644 packs/consequences/000009.log
create mode 100644 packs/consequences/000011.ldb
create mode 100644 packs/consequences/CURRENT
create mode 100644 packs/consequences/LOCK
create mode 100644 packs/consequences/LOG
create mode 100644 packs/consequences/LOG.old
create mode 100644 packs/consequences/MANIFEST-000007
create mode 100644 packs/gears/000009.log
create mode 100644 packs/gears/000011.ldb
create mode 100644 packs/gears/CURRENT
create mode 100644 packs/gears/LOCK
create mode 100644 packs/gears/LOG
create mode 100644 packs/gears/LOG.old
create mode 100644 packs/gears/MANIFEST-000007
create mode 100644 packs/genelines/000009.log
create mode 100644 packs/genelines/000011.ldb
create mode 100644 packs/genelines/CURRENT
create mode 100644 packs/genelines/LOCK
create mode 100644 packs/genelines/LOG
create mode 100644 packs/genelines/LOG.old
create mode 100644 packs/genelines/MANIFEST-000007
create mode 100644 packs/injuries/000009.log
create mode 100644 packs/injuries/000011.ldb
create mode 100644 packs/injuries/CURRENT
create mode 100644 packs/injuries/LOCK
create mode 100644 packs/injuries/LOG
create mode 100644 packs/injuries/LOG.old
create mode 100644 packs/injuries/MANIFEST-000007
create mode 100644 packs/languages/000009.log
create mode 100644 packs/languages/000011.ldb
create mode 100644 packs/languages/CURRENT
create mode 100644 packs/languages/LOCK
create mode 100644 packs/languages/LOG
create mode 100644 packs/languages/LOG.old
create mode 100644 packs/languages/MANIFEST-000007
create mode 100644 packs/skills/000009.log
create mode 100644 packs/skills/000011.ldb
create mode 100644 packs/skills/CURRENT
create mode 100644 packs/skills/LOCK
create mode 100644 packs/skills/LOG
create mode 100644 packs/skills/LOG.old
create mode 100644 packs/skills/MANIFEST-000007
create mode 100644 packs/subcultures/000009.log
create mode 100644 packs/subcultures/000011.ldb
create mode 100644 packs/subcultures/CURRENT
create mode 100644 packs/subcultures/LOCK
create mode 100644 packs/subcultures/LOG
create mode 100644 packs/subcultures/LOG.old
create mode 100644 packs/subcultures/MANIFEST-000007
create mode 100644 packs/weaknesses/000009.log
create mode 100644 packs/weaknesses/000011.ldb
create mode 100644 packs/weaknesses/CURRENT
create mode 100644 packs/weaknesses/LOCK
create mode 100644 packs/weaknesses/LOG
create mode 100644 packs/weaknesses/LOG.old
create mode 100644 packs/weaknesses/MANIFEST-000007
diff --git a/module/actor-sheet.js b/module/actor-sheet.js
index 92958ef..a5162e2 100644
--- a/module/actor-sheet.js
+++ b/module/actor-sheet.js
@@ -10,7 +10,7 @@ export class SoSActorSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
- return mergeObject(super.defaultOptions, {
+ return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["sos", "sheet", "actor"],
template: "systems/foundryvtt-shadows-over-sol/templates/actor-sheet.html",
width: 640,
@@ -81,7 +81,7 @@ export class SoSActorSheet extends ActorSheet {
formData.weapons = this.actor.items.filter( item => item.type == 'weapon');
formData.armors = this.actor.items.filter( item => item.type == 'armor');
formData.totalEncumbrance = SoSUtility.computeEncumbrance(this.actor.items);
- formData.wounds = duplicate(this.actor.system.wounds);
+ formData.wounds = foundry.utils.duplicate(this.actor.system.wounds);
formData.isGM = game.user.isGM;
formData.currentWounds = this.actor.computeCurrentWounds();
formData.totalWounds = this.actor.system.scores.wound.value;
diff --git a/module/actor.js b/module/actor.js
index 770da99..4b379aa 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -61,24 +61,24 @@ export class SoSActor extends Actor {
/* -------------------------------------------- */
checkDeck() {
- if ( !this.cardDeck && this.hasPlayerOwner ) {
- this.cardDeck = new SoSCardDeck();
- this.cardDeck.initCardDeck( this, this.system.internals.deck );
+ if ( !this.system.cardDeck && this.hasPlayerOwner ) {
+ this.system.cardDeck = new SoSCardDeck();
+ this.system.cardDeck.initCardDeck( this, this.system.internals.deck );
}
if ( !this.hasPlayerOwner ) {
- this.cardDeck = game.system.sos.gmDeck.GMdeck;
- console.log("DECK : ", this.cardDeck);
+ this.system.cardDeck = game.system.sos.gmDeck.GMdeck;
+ console.log("DECK : ", this.system.cardDeck);
}
}
/* -------------------------------------------- */
getDeckSize() {
- return this.cardDeck.getDeckSize();
+ return this.system.cardDeck.getDeckSize();
}
/* -------------------------------------------- */
getEdgesCard( ) {
- let edgesCard = duplicate(this.cardDeck.data.cardEdge);
+ let edgesCard = foundry.utils.duplicate(this.system.cardDeck.data.cardEdge);
for (let edge of edgesCard) {
edge.path = `systems/foundryvtt-shadows-over-sol/img/cards/${edge.cardName}.webp`
}
@@ -86,36 +86,36 @@ export class SoSActor extends Actor {
}
/* -------------------------------------------- */
resetDeckFull( ) {
- this.cardDeck.shuffleDeck();
- this.cardDeck.drawEdge( this.system.scores.edge.value );
+ this.system.cardDeck.shuffleDeck();
+ this.system.cardDeck.drawEdge( this.system.scores.edge.value );
this.saveDeck();
}
/* -------------------------------------------- */
drawNewEdge( ) {
- this.cardDeck.drawEdge( 1 );
+ this.system.cardDeck.drawEdge( 1 );
this.saveDeck();
}
/* -------------------------------------------- */
discardEdge( cardName ) {
- this.cardDeck.discardEdge( cardName );
+ this.system.cardDeck.discardEdge( cardName );
this.saveDeck();
}
/* -------------------------------------------- */
resetDeck( ) {
- this.cardDeck.resetDeck();
+ this.system.cardDeck.resetDeck();
this.saveDeck();
}
/* -------------------------------------------- */
saveDeck( ) {
- let deck = { deck: duplicate(this.cardDeck.data.deck),
- discard: duplicate(this.cardDeck.data.discard),
- cardEdge: duplicate(this.cardDeck.data.cardEdge)
+ let deck = { deck: foundry.utils.duplicate(this.system.cardDeck.data.deck),
+ discard: foundry.utils.duplicate(this.system.cardDeck.data.discard),
+ cardEdge: foundry.utils.duplicate(this.system.cardDeck.data.cardEdge)
}
if ( this.hasPlayerOwner ) {
- this.update( { 'data.internals.deck': deck });
+ this.update( { 'system.internals.deck': deck });
} else {
game.settings.set("foundryvtt-shadows-over-sol", "gmDeck", deck );
}
@@ -213,7 +213,7 @@ export class SoSActor extends Actor {
/* -------------------------------------------- */
async updateWound(woundName, value) {
- let wounds = duplicate(this.system.wounds)
+ let wounds = foundry.utils.duplicate(this.system.wounds)
wounds[woundName] = value;
await this.update( { 'system.wounds': wounds } );
}
@@ -246,13 +246,13 @@ export class SoSActor extends Actor {
let flipData = {
mode: 'stat',
- stat: duplicate(this.system.stats[statKey]),
+ stat: foundry.utils.duplicate(this.system.stats[statKey]),
actor: this,
modifierList: SoSUtility.fillRange(-10, +10),
tnList: SoSUtility.fillRange(6, 20),
- consequencesList: duplicate( this.getApplicableConsequences() ),
+ consequencesList: foundry.utils.duplicate( this.getApplicableConsequences() ),
weaknessList: this.items.filter( item => item.type == 'weakness' ),
- wounds: duplicate( this.system.wounds),
+ wounds: foundry.utils.duplicate( this.system.wounds),
malusConsequence: 0,
bonusConsequence: 0,
woundMalus: 0
@@ -265,12 +265,12 @@ export class SoSActor extends Actor {
async rollSkill( skill ) {
let flipData = {
mode: 'skill',
- statList: duplicate(this.system.stats),
+ statList: foundry.utils.duplicate(this.system.stats),
selectedStat: 'strength',
- consequencesList: duplicate( this.getApplicableConsequences() ),
- wounds: duplicate( this.system.wounds),
+ consequencesList: foundry.utils.duplicate( this.getApplicableConsequences() ),
+ wounds: foundry.utils.duplicate( this.system.wounds),
skillExperienceList: this.getSkillExperience( skill.name),
- skill: duplicate(skill),
+ skill: foundry.utils.duplicate(skill),
actor: this,
modifierList: SoSUtility.fillRange(-10, +10),
tnList: SoSUtility.fillRange(6, 20),
@@ -301,14 +301,14 @@ export class SoSActor extends Actor {
let flipData = {
mode: 'weapon',
- weapon: duplicate(weapon),
- statList: duplicate(this.system.stats),
+ weapon: foundry.utils.duplicate(weapon),
+ statList: foundry.utils.duplicate(this.system.stats),
target: target,
selectedStat: selectedStatName,
- consequencesList: duplicate( this.getApplicableConsequences() ),
+ consequencesList: foundry.utils.duplicate( this.getApplicableConsequences() ),
skillExperienceList: this.getSkillExperience( skill.name),
- wounds: duplicate( this.system.wounds),
- skill: duplicate(skill),
+ wounds: foundry.utils.duplicate( this.system.wounds),
+ skill: foundry.utils.duplicate(skill),
actor: this,
modifierList: SoSUtility.fillRange(-10, +10),
tnList: SoSUtility.fillRange(6, 20),
@@ -349,14 +349,14 @@ export class SoSActor extends Actor {
async applyConsequenceWound( severity, consequenceName) {
if ( severity == 'none') return; // Nothing !
- let wounds = duplicate(this.system.wounds);
+ let wounds = foundry.utils.duplicate(this.system.wounds);
if (severity == 'light' ) wounds.light += 1;
if (severity == 'moderate' ) wounds.moderate += 1;
if (severity == 'severe' ) wounds.severe += 1;
if (severity == 'critical' ) wounds.critical += 1;
let sumWound = wounds.light + (wounds.moderate*2) + (wounds.severe*3) + (wounds.critical*4);
- let currentWounds = duplicate(this.system.scores.currentwounds);
+ let currentWounds = foundry.utils.duplicate(this.system.scores.currentwounds);
currentWounds.value = sumWound;
await this.update( { 'data.scores.currentwounds': currentWounds, 'data.wounds': wounds } );
@@ -403,7 +403,7 @@ export class SoSActor extends Actor {
return;
}
- let wounds = duplicate(this.system.wounds);
+ let wounds = foundry.utils.duplicate(this.system.wounds);
for (let wound of flipData.woundsList ) {
if (wound == 'L' ) wounds.light += 1;
if (wound == 'M' ) wounds.moderate += 1;
@@ -412,7 +412,7 @@ export class SoSActor extends Actor {
}
// Compute total
let sumWound = wounds.light + (wounds.moderate*2) + (wounds.severe*3) + (wounds.critical*4);
- let currentWounds = duplicate(this.system.scores.currentwounds);
+ let currentWounds = foundry.utils.duplicate(this.system.scores.currentwounds);
currentWounds.value = sumWound;
if ( sumWound >= this.system.scores.wound.value) {
let bleeding = this.items.find( item => item.type == 'consequence' && item.name == 'Bleeding');
diff --git a/module/item-sheet.js b/module/item-sheet.js
index 841563e..c70f5ac 100644
--- a/module/item-sheet.js
+++ b/module/item-sheet.js
@@ -8,7 +8,7 @@ export class SoSItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
- return mergeObject(super.defaultOptions, {
+ return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["foundryvtt-shadows-over-sol", "sheet", "item"],
template: "systems/foundryvtt-shadows-over-sol/templates/item-sheet.html",
width: 550,
diff --git a/module/sos-card-deck.js b/module/sos-card-deck.js
index 1bd8fea..833d378 100644
--- a/module/sos-card-deck.js
+++ b/module/sos-card-deck.js
@@ -8,7 +8,7 @@ const IDX2CARDFAMILY = ['c', 'd', 'h', 's'];
export class SoSCardDeck {
/* -------------------------------------------- */
- initCardDeck(actor, savedDeck = undefined ) {
+ async initCardDeck(actor, savedDeck = undefined ) {
this.data = {};
@@ -18,27 +18,28 @@ export class SoSCardDeck {
this.data.cardEdge = [];
if ( savedDeck.deck && savedDeck.deck.length > 0 ) {
- this.data.deck = duplicate(savedDeck.deck);
+ this.data.deck = foundry.utils.duplicate(savedDeck.deck);
}
if ( savedDeck.discard && savedDeck.discard.length > 0 ) {
- this.data.discard = duplicate(savedDeck.discard);
+ this.data.discard = foundry.utils.duplicate(savedDeck.discard);
}
if ( savedDeck.cardEdge && savedDeck.cardEdge.length > 0 ) {
- this.data.cardEdge = duplicate(savedDeck.cardEdge);
+ this.data.cardEdge = foundry.utils.duplicate(savedDeck.cardEdge);
}
this.data.actor = actor;
if ( this.data.deck.length == 0 && this.data.discard.length == 0) {
- this.shuffleDeck();
+ await this.shuffleDeck();
}
}
/* -------------------------------------------- */
- shuffleDeck() {
+ async shuffleDeck() {
this.cleanCardList();
// Randomize deck
while (this.data.deck.length != NB_POKER_CARD) {
- let idx = new Roll("1d54").roll( {async:false} ).total;
+ let roll = await new Roll("1d54").roll();
+ let idx = roll.total;
if (!this.data.cardState[idx - 1]) {
if (idx == 53) { // Red Joker
this.data.deck.push( { cardName: 'jr' } );
@@ -57,8 +58,8 @@ export class SoSCardDeck {
}
/* -------------------------------------------- */
- resetDeck() {
- let newdeck = duplicate(this.data.deck).concat( duplicate (this.data.discard) )
+ async resetDeck() {
+ let newdeck = foundry.utils.duplicate(this.data.deck).concat( foundry.utils.duplicate (this.data.discard) )
this.data.discard = [] // Reinit discard pile
this.data.deck = []
let decklen = newdeck.length
@@ -68,7 +69,8 @@ export class SoSCardDeck {
}
// Randomize deck
while (this.data.deck.length != decklen) {
- let idx = new Roll("1d"+decklen).roll({async : false}).total
+ let roll = await new Roll("1d"+decklen).roll()
+ let idx = roll.total
//console.log("Deck stuff", this.data.deck.length, decklen, idx)
if (!cardState[idx-1]) {
this.data.deck.push( newdeck[idx-1] )
@@ -104,7 +106,7 @@ export class SoSCardDeck {
/* -------------------------------------------- */
getDeckSize() {
- return this.data.deck.length;
+ return this.data.deck.length;
}
/* -------------------------------------------- */
diff --git a/module/sos-combat.js b/module/sos-combat.js
index 47ae6e6..f657486 100644
--- a/module/sos-combat.js
+++ b/module/sos-combat.js
@@ -14,7 +14,7 @@ export class SoSCombat extends Combat {
this.phaseSetup = {}; // Reset each new round/update
for (let combatant of this.combatants) {
this.setInitiative(combatant.id, -1); // Reset init
- let uniq = randomID(16)
+ let uniq = foundry.utils.randomID(16)
const name = combatant.actor ? combatant.actor.name : combatant.name;
if (combatant.players && combatant.players[0] ) {
// A player controls this combatant -> message !
@@ -80,7 +80,7 @@ export class SoSCombat extends Combat {
// Now push specific messages
for (let action of actionList) {
- let uniq = randomID(16);
+ let uniq = foundry.utils.randomID(16);
action.uniqId = uniq; // Easy tracking with chat messages
const name = action.combatant.actor ? action.combatant.actor.name : action.combatant.name;
if (action.combatant.players[0]) {
diff --git a/module/sos-dialog-combat-actions.js b/module/sos-dialog-combat-actions.js
index 823e539..e39e49e 100644
--- a/module/sos-dialog-combat-actions.js
+++ b/module/sos-dialog-combat-actions.js
@@ -53,11 +53,11 @@ export class SoSDialogCombatActions extends Dialog {
super.close();
let action3Index = $('#action3').val();
- let action3 = duplicate(this.combatActions.actionsList[action3Index]);
+ let action3 = foundry.utils.duplicate(this.combatActions.actionsList[action3Index]);
let action2Index = $('#action2').val();
- let action2 = duplicate(this.combatActions.actionsList[action2Index]);
+ let action2 = foundry.utils.duplicate(this.combatActions.actionsList[action2Index]);
let action1Index = $('#action1').val();
- let action1 = duplicate(this.combatActions.actionsList[action1Index]);
+ let action1 = foundry.utils.duplicate(this.combatActions.actionsList[action1Index]);
let combatant3Id = $('#combatant3').val();
let combatant2Id = $('#combatant2').val();
diff --git a/module/sos-flip-dialog.js b/module/sos-flip-dialog.js
index ef6515b..19d2951 100644
--- a/module/sos-flip-dialog.js
+++ b/module/sos-flip-dialog.js
@@ -29,7 +29,7 @@ export class SoSFlipDialog extends Dialog {
let scoreBase = 0;
if ( this.flipData.mode == 'skill' || this.flipData.mode == 'weapon' ) {
let statKey = $('#statSelect').val();
- this.flipData.stat = duplicate( this.flipData.statList[ statKey ] );
+ this.flipData.stat = foundry.utils.duplicate( this.flipData.statList[ statKey ] );
scoreBase = Math.floor(this.flipData.statList[ statKey ].value / 2) + this.flipData.skill.system.value
} else { //Stat mode
let statKey = $('#statSelect').val();
@@ -52,10 +52,10 @@ export class SoSFlipDialog extends Dialog {
async updateFlip( flipData ) {
//console.log("UPDATE !!!", flipData);
$('.view-deck').remove();
- $("#view-deck").append(await flipData.actor.cardDeck.getDeckHTML());
+ $("#view-deck").append(await flipData.actor.system.cardDeck.getDeckHTML());
$('.view-edge').remove();
- $("#view-edge").append(await flipData.actor.cardDeck.getEdgeHTMLForFlip());
+ $("#view-edge").append(await flipData.actor.system.cardDeck.getEdgeHTMLForFlip());
this.updateScoreBase();
@@ -67,10 +67,10 @@ export class SoSFlipDialog extends Dialog {
flipData.edgeLuck = $('#edge-luck').is(":checked");
flipData.cardOrigin = "Edge";
if ( flipData.mode == 'skill' || flipData.mode == 'weapon') {
- flipData.stat = duplicate( flipData.statList[ $('#statSelect').val() ] );
+ flipData.stat = foundry.utils.duplicate( flipData.statList[ $('#statSelect').val() ] );
}
console.log("CLICK:", flipData);
- this.flipData.actor.cardDeck.doFlipFromDeckOrEdge(flipData);
+ this.flipData.actor.system.cardDeck.doFlipFromDeckOrEdge(flipData);
this.onFlipClose();
});
@@ -161,11 +161,11 @@ export class SoSFlipDialog extends Dialog {
flipData.modifier = html.find('#modifier').val();
if ( flipData.mode == 'skill' || flipData.mode == 'weapon') {
let statKey = $('#statSelect').val();
- flipData.stat = duplicate( flipData.statList[ statKey ] );
+ flipData.stat = foundry.utils.duplicate( flipData.statList[ statKey ] );
}
flipData.cardOrigin = "Deck";
flipData.tn = (flipData.target) ? flipData.target.actor.system.scores.defense.value : $('#tn').val();
- dialog.flipData.actor.cardDeck.doFlipFromDeckOrEdge(flipData);
+ dialog.flipData.actor.system.cardDeck.doFlipFromDeckOrEdge(flipData);
dialog.onFlipClose();
});
diff --git a/module/sos-gm-deck.js b/module/sos-gm-deck.js
index 915a210..3f472fd 100644
--- a/module/sos-gm-deck.js
+++ b/module/sos-gm-deck.js
@@ -35,9 +35,9 @@ export class SoSGMDeck extends Dialog {
/* -------------------------------------------- */
saveDeck( ) {
let deck = {
- deck: duplicate(this.GMdeck.data.deck),
- discard: duplicate(this.GMdeck.data.discard),
- cardEdge: duplicate(this.GMdeck.data.cardEdge)
+ deck: foundry.utils.duplicate(this.GMdeck.data.deck),
+ discard: foundry.utils.duplicate(this.GMdeck.data.discard),
+ cardEdge: foundry.utils.duplicate(this.GMdeck.data.cardEdge)
}
game.settings.set("foundryvtt-shadows-over-sol", "gmDeck", deck );
}
diff --git a/module/sos-main.js b/module/sos-main.js
index 309efab..8b46c48 100644
--- a/module/sos-main.js
+++ b/module/sos-main.js
@@ -104,6 +104,7 @@ Hooks.once("ready", function () {
});
}
ClassCounter.registerUsageCount()
+ SoSUtility.ready()
welcomeMessage();
diff --git a/module/sos-utility.js b/module/sos-utility.js
index 243c8bb..22d2a98 100644
--- a/module/sos-utility.js
+++ b/module/sos-utility.js
@@ -1,18 +1,18 @@
-/* -------------------------------------------- */
+/* -------------------------------------------- */
import { SoSCombat } from "./sos-combat.js";
import { SoSDialogCombatActions } from "./sos-dialog-combat-actions.js";
-/* -------------------------------------------- */
-const severity2malus = { "none": 0, "light": -1, "moderate": -2, "severe": -3, "critical": -4};
-/* -------------------------------------------- */
-const severity2bonus = { "none": 0, "light": 1, "moderate": 2, "severe": 3, "critical": 4};
+/* -------------------------------------------- */
+const severity2malus = { "none": 0, "light": -1, "moderate": -2, "severe": -3, "critical": -4 };
+/* -------------------------------------------- */
+const severity2bonus = { "none": 0, "light": 1, "moderate": 2, "severe": 3, "critical": 4 };
-/* -------------------------------------------- */
-export class SoSUtility {
-
- /* -------------------------------------------- */
+/* -------------------------------------------- */
+export class SoSUtility {
+
+ /* -------------------------------------------- */
static async preloadHandlebarsTemplates() {
-
+
const templatePaths = [
'systems/foundryvtt-shadows-over-sol/templates/actor-sheet.html',
'systems/foundryvtt-shadows-over-sol/templates/editor-notes-gm.html',
@@ -27,31 +27,41 @@ export class SoSUtility {
'systems/foundryvtt-shadows-over-sol/templates/dialog-flip.html'
]
- return loadTemplates(templatePaths);
+ return loadTemplates(templatePaths);
}
/* -------------------------------------------- */
- static fillRange (start, end) {
+ static ready() {
+ Handlebars.registerHelper('select', function (selected, options) {
+ const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
+ const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
+ const html = options.fn(this);
+ return html.replace(rgx, "$& selected");
+ });
+ }
+
+ /* -------------------------------------------- */
+ static fillRange(start, end) {
return Array(end - start + 1).fill().map((item, index) => start + index);
}
-
- /* -------------------------------------------- */
- static onSocketMesssage( msg ) {
- if( !game.user.isGM ) return; // Only GM
- if (msg.name == 'msg_declare_actions' ) {
- let combat = game.combats.get( msg.data.combatId); // Get the associated combat
- combat.setupActorActions( msg.data );
+ /* -------------------------------------------- */
+ static onSocketMesssage(msg) {
+ if (!game.user.isGM) return; // Only GM
+
+ if (msg.name == 'msg_declare_actions') {
+ let combat = game.combats.get(msg.data.combatId); // Get the associated combat
+ combat.setupActorActions(msg.data);
} else if (msg.name == 'msg_close_action') {
- game.combat.closeAction( msg.data.uniqId );
+ game.combat.closeAction(msg.data.uniqId);
} else if (msg.name == 'msg_request_defense') {
- SoSUtility.applyDamage( msg.data );
+ SoSUtility.applyDamage(msg.data);
} else if (msg.name == 'msg_reaction_cover') {
- SoSUtility.reactionCover( msg.data.uniqId );
+ SoSUtility.reactionCover(msg.data.uniqId);
} else if (msg.name == 'msg_reaction_melee') {
- SoSUtility.reactionMelee( msg.data.uniqId );
+ SoSUtility.reactionMelee(msg.data.uniqId);
} else if (msg.name == 'msg_reaction_hit') {
- SoSUtility.reactionHit( msg.data.uniqId );
+ SoSUtility.reactionHit(msg.data.uniqId);
}
}
@@ -60,13 +70,13 @@ export class SoSUtility {
const pack = game.packs.get(compendium);
return await pack?.getDocuments() ?? [];
}
-
+
/* -------------------------------------------- */
static async loadCompendium(compendium, filter = item => true) {
let compendiumData = await SoSUtility.loadCompendiumData(compendium);
return compendiumData.filter(filter);
}
-
+
/* -------------------------------------------- */
static async loadCompendiumNames(compendium) {
const pack = game.packs.get(compendium);
@@ -74,38 +84,21 @@ export class SoSUtility {
await pack.getIndex().then(index => competences = index);
return competences;
}
-
- /* -------------------------------------------- */
- /*static async loadCompendium(compendium, filter = item => true) {
- let compendiumItems = await SoSUtility.loadCompendiumNames(compendium);
- const pack = game.packs.get(compendium);
- let list = [];
- for (let compendiumItem of compendiumItems) {
- await pack.getEntity(compendiumItem.id).then(it => {
- const item = it.data;
- if (filter(item)) {
- list.push(item);
- }
- });
- };
- return list;
- }*/
-
/* -------------------------------------------- */
static updateCombat(combat, round, diff, id) {
combat.requestActions();
}
/* -------------------------------------------- */
- static async openDeclareActions( event) {
+ static async openDeclareActions(event) {
event.preventDefault();
let round = event.currentTarget.attributes['data-round'].value;
let combatantId = event.currentTarget.attributes['data-combatant-id'].value;
let combatId = event.currentTarget.attributes['data-combat-id'].value;
let uniqId = event.currentTarget.attributes['data-uniq-id'].value;
- let d = await SoSDialogCombatActions.create( combatId, combatantId, round, uniqId );
- d.render(true);
+ let d = await SoSDialogCombatActions.create(combatId, combatantId, round, uniqId);
+ d.render(true);
}
/* -------------------------------------------- */
@@ -116,13 +109,13 @@ export class SoSUtility {
static getConsequenceBonus(severity) {
return severity2bonus[severity] ?? 0;
}
-
+
/* -------------------------------------------- */
- static computeEncumbrance( items) {
- let trappings = items.filter( item => item.type == 'gear' || item.type == 'armor' || item.type == 'weapon' );
+ static computeEncumbrance(items) {
+ let trappings = items.filter(item => item.type == 'gear' || item.type == 'armor' || item.type == 'weapon');
let sumEnc = 0;
for (let object of trappings) {
- if ( (!object.system.worn) && (!object.system.neg) && (!object.system.software) && (!object.system.implant) && (!object.system.containerid || object.system.containerid == "") ) {
+ if ((!object.system.worn) && (!object.system.neg) && (!object.system.software) && (!object.system.implant) && (!object.system.containerid || object.system.containerid == "")) {
sumEnc += (object.big > 0) ? object.big : 1;
}
}
@@ -133,48 +126,49 @@ export class SoSUtility {
static closeAction(event) {
let uniqId = event.currentTarget.attributes['data-uniq-id'].value;
- if ( game.user.isGM ) {
- game.combat.closeAction( uniqId );
+ if (game.user.isGM) {
+ game.combat.closeAction(uniqId);
} else {
game.socket.emit("system.foundryvtt-shadows-over-sol", {
- name: "msg_close_action", data: { uniqId: uniqId} } );
+ name: "msg_close_action", data: { uniqId: uniqId }
+ });
}
}
/* -------------------------------------------- */
static async registerChatCallbacks(html) {
html.on("click", '#button-declare-actions', event => {
- SoSUtility.openDeclareActions( event );
+ SoSUtility.openDeclareActions(event);
});
html.on("click", '#button-end-action', event => {
- SoSUtility.closeAction( event );
- });
+ SoSUtility.closeAction(event);
+ });
html.on("click", '#button-reaction-cover', event => {
let uniqId = event.currentTarget.attributes['data-uniq-id'].value;
- if ( game.user.isGM ) {
- SoSUtility.reactionCover( uniqId );
+ if (game.user.isGM) {
+ SoSUtility.reactionCover(uniqId);
} else {
- game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_cover", data: { uniqId: uniqId} } );
+ game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_cover", data: { uniqId: uniqId } });
}
- });
+ });
html.on("click", '#button-reaction-melee', event => {
let uniqId = event.currentTarget.attributes['data-uniq-id'].value;
- if ( game.user.isGM ) {
- SoSUtility.reactionMelee( uniqId );
+ if (game.user.isGM) {
+ SoSUtility.reactionMelee(uniqId);
} else {
- game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_melee", data: { uniqId: uniqId} } );
+ game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_melee", data: { uniqId: uniqId } });
}
- });
+ });
html.on("click", '#button-reaction-hit', event => {
let uniqId = event.currentTarget.attributes['data-uniq-id'].value;
- if ( game.user.isGM ) {
- SoSUtility.reactionHit( uniqId );
+ if (game.user.isGM) {
+ SoSUtility.reactionHit(uniqId);
} else {
- game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_hit", data: { uniqId: uniqId} } );
+ game.socket.emit("system.foundryvtt-shadows-over-sol", { name: "msg_reaction_hit", data: { uniqId: uniqId } });
}
- });
+ });
}
/* -------------------------------------------- */
@@ -188,46 +182,46 @@ export class SoSUtility {
}
/* -------------------------------------------- */
- static increaseConsequenceSeverity( severity ) {
- if ( severity == 'none') return 'light';
- if ( severity == 'light') return 'moderate';
- if ( severity == 'moderate') return 'severe';
- if ( severity == 'severe') return 'critical';
+ static increaseConsequenceSeverity(severity) {
+ if (severity == 'none') return 'light';
+ if (severity == 'light') return 'moderate';
+ if (severity == 'moderate') return 'severe';
+ if (severity == 'severe') return 'critical';
return 'critical';
}
/* -------------------------------------------- */
- static getConsequenceSeverityLevel( severity) {
- if ( severity == 'none') return 0;
- if ( severity == 'light') return 1;
- if ( severity == 'moderate') return 2;
- if ( severity == 'severe') return 3;
- if ( severity == 'critical') return 4;
+ static getConsequenceSeverityLevel(severity) {
+ if (severity == 'none') return 0;
+ if (severity == 'light') return 1;
+ if (severity == 'moderate') return 2;
+ if (severity == 'severe') return 3;
+ if (severity == 'critical') return 4;
return 0;
}
-
+
/* -------------------------------------------- */
- static increaseSeverity( severity ) {
- if ( severity == 'L') return 'M';
- if ( severity == 'M') return 'S';
- if ( severity == 'S') return 'C';
- if ( severity == 'C') return 'F';
+ static increaseSeverity(severity) {
+ if (severity == 'L') return 'M';
+ if (severity == 'M') return 'S';
+ if (severity == 'S') return 'C';
+ if (severity == 'C') return 'F';
}
/* -------------------------------------------- */
- static decreaseSeverity( severity ) {
- if ( severity == 'C') return 'S';
- if ( severity == 'S') return 'M';
- if ( severity == 'M') return 'L';
- if ( severity == 'L') return 'N';
+ static decreaseSeverity(severity) {
+ if (severity == 'C') return 'S';
+ if (severity == 'S') return 'M';
+ if (severity == 'M') return 'L';
+ if (severity == 'L') return 'N';
}
/* -------------------------------------------- */
- static getSeverityLevel( severity) {
- if ( severity == 'C') return 4;
- if ( severity == 'S') return 3;
- if ( severity == 'M') return 2;
- if ( severity == 'L') return 1;
+ static getSeverityLevel(severity) {
+ if (severity == 'C') return 4;
+ if (severity == 'S') return 3;
+ if (severity == 'M') return 2;
+ if (severity == 'L') return 1;
return 0;
}
@@ -238,53 +232,53 @@ export class SoSUtility {
let msgTxt = "Are you sure to delete this item ?";
let buttons = {
delete: {
- icon: '',
- label: "Yes, delete it",
- callback: () => {
- console.log("Delete : ", itemId);
- actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
- li.slideUp(200, () => actorSheet.render(false));
- }
- },
- cancel: {
- icon: '',
- label: "Cancel"
+ icon: '',
+ label: "Yes, delete it",
+ callback: () => {
+ console.log("Delete : ", itemId);
+ actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
+ li.slideUp(200, () => actorSheet.render(false));
}
+ },
+ cancel: {
+ icon: '',
+ label: "Cancel"
}
- msgTxt += "
";
- let d = new Dialog({
- title: "Confirm deletion",
- content: msgTxt,
- buttons: buttons,
- default: "cancel"
- });
- d.render(true);
}
-
+ msgTxt += "
";
+ let d = new Dialog({
+ title: "Confirm deletion",
+ content: msgTxt,
+ buttons: buttons,
+ default: "cancel"
+ });
+ d.render(true);
+ }
+
/* -------------------------------------------- */
- static async applyDamage( flipData ) {
+ static async applyDamage(flipData) {
if (!this.registry) this.registry = {};
- if ( flipData.isReaction) { // Check again resut in case of reaction !
+ if (flipData.isReaction) { // Check again resut in case of reaction !
flipData.magnitude = flipData.finalScore - flipData.tn; // Update magnitude
- if ( flipData.magnitude < 0 ) {
- let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-reaction-result.html', flipData );
- ChatMessage.create( { content: html });
+ if (flipData.magnitude < 0) {
+ let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-reaction-result.html', flipData);
+ ChatMessage.create({ content: html });
return;
}
}
-
+
// DR management
- let armor = flipData.target.actor.system.items.find( item => item.type == 'armor' && item.system.worn);
+ let armor = flipData.target.actor.system.items.find(item => item.type == 'armor' && item.system.worn);
flipData.armorDR = armor ? armor.system.dr : 0;
- flipData.armorGel = armor ?armor.system.gel : 0;
+ flipData.armorGel = armor ? armor.system.gel : 0;
flipData.armorReflect = armor ? armor.system.reflect : 0;
let dr = flipData.target.actor.system.scores.dr.value + flipData.armorDR;
if (flipData.weapon.system.category == 'ballistic') {
- dr += flipData.armorGel;
+ dr += flipData.armorGel;
}
if (flipData.weapon.system.category == 'laser') {
- dr += flipData.armorReflect;
+ dr += flipData.armorReflect;
}
let shock = flipData.target.actor.system.scores.shock.value || 1;
@@ -292,106 +286,106 @@ export class SoSUtility {
flipData.damageStatus = 'apply_damage';
flipData.targetShock = shock;
- flipData.targetDR = dr;
+ flipData.targetDR = dr;
flipData.targetCritical = defenseCritical;
// DR management
- if ( flipData.damageValue < dr) {
+ if (flipData.damageValue < dr) {
if (flipData.damageValue < dr / 2) {
flipData.damageStatus = "no_damage";
flipData.damageReason = "Damage are lesser than DR/2";
} else {
- flipData.damageSeverity = this.decreaseSeverity(flipData.damageSeverity );
- if ( flipData.damageSeverity == 'N') {
+ flipData.damageSeverity = this.decreaseSeverity(flipData.damageSeverity);
+ if (flipData.damageSeverity == 'N') {
flipData.damageStatus = "no_damage";
flipData.damageReason = "Severity decreased to nothing";
- }
+ }
}
}
-
+
// Shock management
flipData.woundsList = [];
flipData.nbStun = 0;
- if ( flipData.weapon.stun ) { // Stun weapon case
- if ( flipData.damageValue >= shock ) {
+ if (flipData.weapon.stun) { // Stun weapon case
+ if (flipData.damageValue >= shock) {
flipData.nbStun = Math.floor(flipData.damageValue / shock);
}
} else {
- if ( flipData.damageValue >= shock ) {
+ if (flipData.damageValue >= shock) {
let incSeverity = Math.floor(flipData.damageValue / shock);
- for (let i=0; i= defenseCritical);
+ flipData.isCritical = (flipData.cardTotal >= defenseCritical);
- let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-damage-target.html', flipData );
- ChatMessage.create( { content: html });
+ let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-damage-target.html', flipData);
+ ChatMessage.create({ content: html });
// Is target able to dodge ??
- let defender = game.actors.get( flipData.target.actor._id);
- flipData.coverConsequence = defender.items.find( item => item.type == 'consequence' && item.name == 'Cover');
- flipData.APavailable = game.combat.getAPFromActor( defender._id );
+ let defender = game.actors.get(flipData.target.actor._id);
+ flipData.coverConsequence = defender.items.find(item => item.type == 'consequence' && item.name == 'Cover');
+ flipData.APavailable = game.combat.getAPFromActor(defender._id);
console.log("FLIPDATE : ", flipData);
- if ( !flipData.isReaction && flipData.APavailable > 0) {
- if ( (flipData.weapon.system.category == 'melee' ) || ( (flipData.weapon.system.category == 'laser' || flipData.weapon.system.category == 'ballistic') &&
- flipData.coverConsequence.system.severity != 'none') ) {
- flipData.coverSeverityLevel = this.getConsequenceSeverityLevel( flipData.coverConsequence.system.severity ) * 2;
- flipData.coverSeverityFlag = (flipData.coverSeverityLevel > 0);
- flipData.isMelee = (flipData.weapon.system.category == 'melee' );
- let melee = defender.items.find( item => item.type == 'skill' && item.name == 'Melee');
+ if (!flipData.isReaction && flipData.APavailable > 0) {
+ if ((flipData.weapon.system.category == 'melee') || ((flipData.weapon.system.category == 'laser' || flipData.weapon.system.category == 'ballistic') &&
+ flipData.coverConsequence.system.severity != 'none')) {
+ flipData.coverSeverityLevel = this.getConsequenceSeverityLevel(flipData.coverConsequence.system.severity) * 2;
+ flipData.coverSeverityFlag = (flipData.coverSeverityLevel > 0);
+ flipData.isMelee = (flipData.weapon.system.category == 'melee');
+ let melee = defender.items.find(item => item.type == 'skill' && item.name == 'Melee');
flipData.defenderMelee = melee.system.value;
- flipData.uniqId = randomID(16);
+ flipData.uniqId = foundry.utils.randomID(16);
this.registry[flipData.uniqId] = flipData;
- let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-damage-request-dodge.html', flipData );
- ChatMessage.create( { content: html, whisper: ChatMessage.getWhisperRecipients(flipData.target.actor.name).concat(ChatMessage.getWhisperRecipients("GM")) } );
+ let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-damage-request-dodge.html', flipData);
+ ChatMessage.create({ content: html, whisper: ChatMessage.getWhisperRecipients(flipData.target.actor.name).concat(ChatMessage.getWhisperRecipients("GM")) });
return; // Wait message response
}
}
flipData.isReaction = false;
- this.takeWounds( flipData);
+ this.takeWounds(flipData);
}
- /* -------------------------------------------- */
- static reactionCover( uniqId) {
+ /* -------------------------------------------- */
+ static reactionCover(uniqId) {
let flipData = this.registry[uniqId];
flipData.tn += flipData.coverSeverityLevel;
flipData.isReaction = true;
- game.combat.decreaseAPFromActor( flipData.target.actor._id );
- SoSUtility.applyDamage( flipData);
- }
+ game.combat.decreaseAPFromActor(flipData.target.actor._id);
+ SoSUtility.applyDamage(flipData);
+ }
/* -------------------------------------------- */
- static reactionMelee( uniqId) {
+ static reactionMelee(uniqId) {
let flipData = this.registry[uniqId];
flipData.tn += flipData.defenderMelee;
flipData.isReaction = true;
- game.combat.decreaseAPFromActor( flipData.target.actor._id );
- SoSUtility.applyDamage( flipData);
+ game.combat.decreaseAPFromActor(flipData.target.actor._id);
+ SoSUtility.applyDamage(flipData);
}
/* -------------------------------------------- */
- static reactionHit( uniqId) {
+ static reactionHit(uniqId) {
let flipData = this.registry[uniqId];
flipData.isReaction = true;
- SoSUtility.takeWounds( flipData);
+ SoSUtility.takeWounds(flipData);
}
-
- /* -------------------------------------------- */
- static takeWounds( flipData ) {
- let defender = game.actors.get( flipData.target.actor._id);
- defender.applyWounds( flipData );
+
+ /* -------------------------------------------- */
+ static takeWounds(flipData) {
+ let defender = game.actors.get(flipData.target.actor._id);
+ defender.applyWounds(flipData);
}
/* -------------------------------------------- */
@@ -402,7 +396,7 @@ export class SoSUtility {
let objectId = item.id
console.log("ID", dragData, dropId, objectId)
if (dragData.type == 'Item' && dropId) {
- actorSheet.actor.addObjectToContainer(objectId, dropId );
+ actorSheet.actor.addObjectToContainer(objectId, dropId);
}
return true
}
diff --git a/packs/combat-actions/000009.log b/packs/combat-actions/000009.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/combat-actions/000011.ldb b/packs/combat-actions/000011.ldb
new file mode 100644
index 0000000000000000000000000000000000000000..922ad1687e75b33e5f67cdbc28df9d619342487d
GIT binary patch
literal 15155
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
literal 0
HcmV?d00001
diff --git a/packs/combat-actions/CURRENT b/packs/combat-actions/CURRENT
new file mode 100644
index 0000000..875cf23
--- /dev/null
+++ b/packs/combat-actions/CURRENT
@@ -0,0 +1 @@
+MANIFEST-000007
diff --git a/packs/combat-actions/LOCK b/packs/combat-actions/LOCK
new file mode 100644
index 0000000..e69de29
diff --git a/packs/combat-actions/LOG b/packs/combat-actions/LOG
new file mode 100644
index 0000000..57ff2ac
--- /dev/null
+++ b/packs/combat-actions/LOG
@@ -0,0 +1,13 @@
+2024/05/31-12:37:50.244518 7f20a6a006c0 Recovering log #6
+2024/05/31-12:37:50.292179 7f20a6a006c0 Delete type=0 #6
+2024/05/31-12:37:50.292229 7f20a6a006c0 Delete type=3 #4
+2024/05/31-12:57:42.325821 7f20a5a006c0 Level-0 table #10: started
+2024/05/31-12:57:42.325873 7f20a5a006c0 Level-0 table #10: 0 bytes OK
+2024/05/31-12:57:42.332227 7f20a5a006c0 Delete type=0 #8
+2024/05/31-12:57:42.355930 7f20a5a006c0 Manual compaction at level-0 from '!items!06L0cwm4CIuCFetU' @ 72057594037927935 : 1 .. '!items!uSQw858IiBrWkeSj' @ 0 : 0; will stop at '!items!uSQw858IiBrWkeSj' @ 20 : 1
+2024/05/31-12:57:42.355939 7f20a5a006c0 Compacting 1@0 + 0@1 files
+2024/05/31-12:57:42.359540 7f20a5a006c0 Generated table #11@0: 20 keys, 15155 bytes
+2024/05/31-12:57:42.359578 7f20a5a006c0 Compacted 1@0 + 0@1 files => 15155 bytes
+2024/05/31-12:57:42.365779 7f20a5a006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
+2024/05/31-12:57:42.365873 7f20a5a006c0 Delete type=2 #5
+2024/05/31-12:57:42.386374 7f20a5a006c0 Manual compaction at level-0 from '!items!uSQw858IiBrWkeSj' @ 20 : 1 .. '!items!uSQw858IiBrWkeSj' @ 0 : 0; will stop at (end)
diff --git a/packs/combat-actions/LOG.old b/packs/combat-actions/LOG.old
new file mode 100644
index 0000000..b6e583a
--- /dev/null
+++ b/packs/combat-actions/LOG.old
@@ -0,0 +1,5 @@
+2024/05/31-12:37:00.345049 7f04c4c006c0 Recovering log #3
+2024/05/31-12:37:00.345498 7f04c4c006c0 Level-0 table #5: started
+2024/05/31-12:37:00.358604 7f04c4c006c0 Level-0 table #5: 22912 bytes OK
+2024/05/31-12:37:00.406080 7f04c4c006c0 Delete type=0 #3
+2024/05/31-12:37:00.406202 7f04c4c006c0 Delete type=3 #2
diff --git a/packs/combat-actions/MANIFEST-000007 b/packs/combat-actions/MANIFEST-000007
new file mode 100644
index 0000000000000000000000000000000000000000..a86c839bc1f6a7cdc71dbb3a83dd5db392ca41b3
GIT binary patch
literal 256
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 7666 bytes
+2024/05/31-12:57:42.288596 7f20a5a006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
+2024/05/31-12:57:42.288688 7f20a5a006c0 Delete type=2 #5
+2024/05/31-12:57:42.318921 7f20a5a006c0 Manual compaction at level-0 from '!items!vHcRT3kQVWPHSz38' @ 13 : 1 .. '!items!vHcRT3kQVWPHSz38' @ 0 : 0; will stop at (end)
diff --git a/packs/consequences/LOG.old b/packs/consequences/LOG.old
new file mode 100644
index 0000000..1d5a478
--- /dev/null
+++ b/packs/consequences/LOG.old
@@ -0,0 +1,5 @@
+2024/05/31-12:36:59.630199 7f04bf4006c0 Recovering log #3
+2024/05/31-12:36:59.631365 7f04bf4006c0 Level-0 table #5: started
+2024/05/31-12:36:59.641960 7f04bf4006c0 Level-0 table #5: 10948 bytes OK
+2024/05/31-12:36:59.690838 7f04bf4006c0 Delete type=0 #3
+2024/05/31-12:36:59.690928 7f04bf4006c0 Delete type=3 #2
diff --git a/packs/consequences/MANIFEST-000007 b/packs/consequences/MANIFEST-000007
new file mode 100644
index 0000000000000000000000000000000000000000..728c476547037604780e52e0583e57afaa9711a5
GIT binary patch
literal 255
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