-
-
@@ -37,8 +45,8 @@ import { getPropertyIcon } from '/imports/constants/PROPERTIES.js';
import InlineEffect from '../components/effects/InlineEffect.vue';
export default {
- mixins: [treeNodeViewMixin],
components: {InlineEffect},
+ mixins: [treeNodeViewMixin],
computed: {
icon() {
if (this.model.damageType === 'healing') {
From 572078c2faee6af550e711eb7a32a7520e470127 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 15:53:39 +0200
Subject: [PATCH 17/25] Fixed dependency loop when props target self by tags
---
.../engine/computation/buildComputation/linkTypeDependencies.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
index 10ce0b0a..5a8a5dc0 100644
--- a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
+++ b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
@@ -175,7 +175,7 @@ function linkEffects(dependencyGraph, prop, computation) {
// Returns an array of IDs of the properties the effect targets
export function getEffectTagTargets(effect, computation) {
let targets = getTargetListFromTags(effect.targetTags, computation);
- let notIds = [];
+ let notIds = [effect._id]; // Can't target itself
if (effect.extraTags) {
effect.extraTags.forEach(ex => {
if (ex.operation === 'OR') {
From bfbb31d30cac0b0ad338df22513216d10eaf2701 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 16:45:40 +0200
Subject: [PATCH 18/25] Fixed performance regression in dependency graph speed
---
.../buildComputation/linkCalculationDependencies.js | 9 ++++++++-
.../buildComputation/linkTypeDependencies.js | 12 ++++++------
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/app/imports/api/engine/computation/buildComputation/linkCalculationDependencies.js b/app/imports/api/engine/computation/buildComputation/linkCalculationDependencies.js
index 68a19951..35ba9b60 100644
--- a/app/imports/api/engine/computation/buildComputation/linkCalculationDependencies.js
+++ b/app/imports/api/engine/computation/buildComputation/linkCalculationDependencies.js
@@ -9,8 +9,15 @@ export default function linkCalculationDependencies(dependencyGraph, prop, { pro
};
// Add this calculation to the dependency graph
const calcNodeId = `${prop._id}.${calcObj._key}`;
- dependencyGraph.addNode(calcNodeId, calcObj);
+ // Skip empty calculations that aren't targeted by anything
+ if (
+ !calcObj.calculation
+ && !calcObj.effects
+ && !calcObj.proficiencies
+ ) return;
+
+ dependencyGraph.addNode(calcNodeId, calcObj);
// Traverse the parsed calculation looking for variable names
traverse(calcObj.parseNode, node => {
// Skip nodes that aren't symbols or accessors
diff --git a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
index 5a8a5dc0..814449c3 100644
--- a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
+++ b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js
@@ -98,8 +98,10 @@ function linkAdjustment(dependencyGraph, prop) {
function linkAttribute(dependencyGraph, prop) {
linkVariableName(dependencyGraph, prop);
- // Depends on spellSlotLevel
- dependOnCalc({ dependencyGraph, prop, key: 'spellSlotLevel' });
+ // Spell slots depend on spellSlotLevel
+ if (prop.type === 'spellSlot') {
+ dependOnCalc({ dependencyGraph, prop, key: 'spellSlotLevel' });
+ }
// Depends on base value
dependOnCalc({ dependencyGraph, prop, key: 'baseValue' });
@@ -257,8 +259,8 @@ function linkDamageMultiplier(dependencyGraph, prop) {
function linkPointBuy(dependencyGraph, prop) {
dependOnCalc({ dependencyGraph, prop, key: 'min' });
dependOnCalc({ dependencyGraph, prop, key: 'max' });
- dependOnCalc({ dependencyGraph, prop, key: 'cost' });
dependOnCalc({ dependencyGraph, prop, key: 'total' });
+
prop.values?.forEach((row, index) => {
// Get a unique id for the row because it might be shared among duplicated point buy tables
// prop._id is forced unique by the database, so it can be used instead
@@ -273,9 +275,7 @@ function linkPointBuy(dependencyGraph, prop) {
}
dependencyGraph.addNode(pointBuyRow._id, pointBuyRow);
linkVariableName(dependencyGraph, pointBuyRow);
- dependOnCalc({ dependencyGraph, pointBuyRow, key: 'min' });
- dependOnCalc({ dependencyGraph, pointBuyRow, key: 'max' });
- dependOnCalc({ dependencyGraph, pointBuyRow, key: 'cost' });
+ dependencyGraph.addLink(pointBuyRow._id, prop._id, 'pointBuyRow');
});
if (prop.inactive) return;
}
From 745296c1db69130fcab4e99a7c1e395b24e54be9 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 16:46:14 +0200
Subject: [PATCH 19/25] Fixed regression: point buy cost calc failing
---
.../computeComputation/computeByType/computePointBuy.js | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computePointBuy.js b/app/imports/api/engine/computation/computeComputation/computeByType/computePointBuy.js
index c2cc7606..a7727247 100644
--- a/app/imports/api/engine/computation/computeComputation/computeByType/computePointBuy.js
+++ b/app/imports/api/engine/computation/computeComputation/computeByType/computePointBuy.js
@@ -3,8 +3,8 @@ import evaluateCalculation from '../../utility/evaluateCalculation.js';
export default function computePointBuy(computation, node) {
const prop = node.data;
- const tableMin = prop.min?.value || null;
- const tableMax = prop.max?.value || null;
+ const min = has(prop, 'min.value') ? prop.min.value : null;
+ const max = has(prop, 'max.value') ? prop.max.value : null;
prop.spent = 0;
prop.values?.forEach(row => {
// Clean up added properties
@@ -14,9 +14,7 @@ export default function computePointBuy(computation, node) {
row.spent = 0;
if (row.value === undefined) return;
- const min = has(row, 'min.value') ? row.min.value : tableMin;
- const max = has(row, 'max.value') ? row.max.value : tableMax;
- const costFunction = EJSON.clone(row.cost || prop.cost);
+ const costFunction = EJSON.clone(prop.cost);
if (costFunction) costFunction.parseLevel = 'reduce';
// Check min and max
From ad15020f0bea0cbaea801cfbb0ae36fcfd51fb54 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 16:46:26 +0200
Subject: [PATCH 20/25] Removed per-row point buy cost/min/max
---
app/imports/api/properties/PointBuys.js | 27 +------------------------
1 file changed, 1 insertion(+), 26 deletions(-)
diff --git a/app/imports/api/properties/PointBuys.js b/app/imports/api/properties/PointBuys.js
index db20911a..fcbb8f6e 100644
--- a/app/imports/api/properties/PointBuys.js
+++ b/app/imports/api/properties/PointBuys.js
@@ -29,7 +29,7 @@ let PointBuySchema = createPropertySchema({
'values.$._id': {
type: String,
regEx: SimpleSchema.RegEx.Id,
- autoValue(){
+ autoValue() {
if (!this.isSet) return Random.id();
}
},
@@ -49,18 +49,6 @@ let PointBuySchema = createPropertySchema({
type: Number,
optional: true,
},
- 'values.$.min': {
- type: 'fieldToCompute',
- optional: true,
- },
- 'values.$.max': {
- type: 'fieldToCompute',
- optional: true,
- },
- 'values.$.cost': {
- type: 'fieldToCompute',
- optional: true,
- },
min: {
type: 'fieldToCompute',
optional: true,
@@ -102,19 +90,6 @@ const ComputedOnlyPointBuySchema = createPropertySchema({
'values.$': {
type: Object,
},
- 'values.$.min': {
- type: 'computedOnlyField',
- optional: true,
- },
- 'values.$.max': {
- type: 'computedOnlyField',
- optional: true,
- },
- 'values.$.cost': {
- type: 'computedOnlyField',
- optional: true,
- parseLevel: 'compile',
- },
'values.$.spent': {
type: Number,
optional: true,
From df8f9c085f4b499edbcf6519be3c631f01cc4773 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 16:52:21 +0200
Subject: [PATCH 21/25] Fixed regression in actions breaking ui and uses
---
.../computeComputation/computeByType/computeAction.js | 2 +-
app/imports/client/ui/properties/viewers/ActionViewer.vue | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js
index a8243f40..48a71fb5 100644
--- a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js
+++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js
@@ -1,6 +1,6 @@
export default function computeAction(computation, node) {
const prop = node.data;
- if (prop.uses) {
+ if (Number.isFinite(prop.uses?.value)) {
prop.usesLeft = prop.uses.value - (prop.usesUsed || 0);
if (!prop.usesLeft) {
prop.insufficientResources = true;
diff --git a/app/imports/client/ui/properties/viewers/ActionViewer.vue b/app/imports/client/ui/properties/viewers/ActionViewer.vue
index 2cea866a..de20f2fe 100644
--- a/app/imports/client/ui/properties/viewers/ActionViewer.vue
+++ b/app/imports/client/ui/properties/viewers/ActionViewer.vue
@@ -65,7 +65,7 @@
:value="reset"
/>
From 643e7892c8139c5b84c32d3d4491fbd2ebcdbe9f Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Fri, 22 Sep 2023 22:10:11 +0200
Subject: [PATCH 22/25] Minor redesign of printed character sheets
---
.../CharacterSheetPrinted.vue | 35 +++-
.../PrintedInventory.vue | 131 +++++++--------
.../printedCharacterSheet/PrintedStats.vue | 154 +++++++++---------
.../components/PrintedAction.vue | 118 +++++++++-----
.../{PrintedItem.vue => PrintedBlockItem.vue} | 0
.../components/PrintedLineItem.vue | 122 ++++++++++++++
.../components/PrintedSkill.vue | 4 +-
7 files changed, 366 insertions(+), 198 deletions(-)
rename app/imports/client/ui/creature/character/printedCharacterSheet/components/{PrintedItem.vue => PrintedBlockItem.vue} (100%)
create mode 100644 app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedLineItem.vue
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
index 1d47cd09..61cc7628 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
@@ -32,7 +32,10 @@
light
>
-
+
{{ creature.name }}
@@ -59,7 +62,7 @@
{{ creatureUrl }}
@@ -234,7 +237,7 @@ export default {
.character-sheet-printed {
background: white;
color: black;
- font-size: 11pt;
+ font-size: 10pt;
}
.character-sheet-printed * {
@@ -247,6 +250,14 @@ export default {
padding: 4px;
}
+.character-sheet-printed p {
+ margin-bottom: 8px;
+}
+
+.character-sheet-printed .double-border > .label:first-child {
+ margin-bottom: 8px;
+}
+
.character-sheet-printed .column-layout, .character-sheet-printed .column-layout.wide-columns {
position:relative;
width: 100%;
@@ -256,6 +267,10 @@ export default {
column-fill: balance-all;
}
+.character-sheet-printed .column-layout {
+ column-width: 200px;
+}
+
.character-sheet-printed .column-layout>div {
position:relative;
}
@@ -267,9 +282,10 @@ export default {
opacity: 1 !important;
}
.character-sheet-printed .creature-name {
- font-size: 24pt;
+ font-size: 16pt;
background-color: white;
}
+
.character-sheet-printed .logo-background {
width: 60px;
height: 60px;
@@ -284,6 +300,10 @@ export default {
max-width: unset;
}
+.character-sheet-printed .tree-node-title {
+ min-height: unset !important;
+}
+
.character-sheet-printed .double-border {
position: relative;
padding: 11px 10px;
@@ -291,6 +311,8 @@ export default {
border-image-slice: 110 126 fill;
border-image-width: 16px;
border-image-repeat: stretch;
+ box-decoration-break: clone;
+ page-break-inside: avoid;
}
.character-sheet-printed .octagon-border {
@@ -298,6 +320,8 @@ export default {
padding: 4px 20px;
border-image: url(/images/print/octagonBorder.png) 124 118 fill;
border-image-width: 22px;
+ box-decoration-break: clone;
+ page-break-inside: avoid;
}
.character-sheet-printed .span-all {
@@ -322,6 +346,7 @@ export default {
.character-sheet-printed .span-all {
column-span: all;
+ display: block;
}
@media screen {
@@ -337,7 +362,7 @@ export default {
@media print {
@page {
size: auto;
- margin: 8mm 8mm 8mm 8mm;
+ margin: 8mm;
}
body {
margin: 0;
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
index 416e8b00..6a6c97c3 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
@@ -2,83 +2,72 @@
-
-
-
-
- Inventory
-
-
- $vuetify.icons.injustice
- Weight Carried:
- {{ weightCarried }} lb
-
-
- $vuetify.icons.cash
- Net worth:
-
-
-
- $vuetify.icons.spell
- Items attuned:
- {{ variables.itemsAttuned && variables.itemsAttuned.value }}
-
-
+
+
+ Inventory
-
-
- Equipped
-
+
+ $vuetify.icons.injustice
+ Weight Carried:
+ {{ weightCarried }} lb
-
-
+ $vuetify.icons.cash
+ Net worth:
+
-
+ $vuetify.icons.spell
+ Items attuned:
+ {{ variables.itemsAttuned && variables.itemsAttuned.value }}
+
+
+
+
+
+ Carried
-
-
-
+
-
-
+ :model="item"
+ />
+
+
@@ -90,7 +79,7 @@ import getParentRefByTag from '/imports/api/creature/creatureProperties/methods/
import BUILT_IN_TAGS from '/imports/constants/BUILT_IN_TAGS.js';
import CoinValue from '/imports/client/ui/components/CoinValue.vue';
import stripFloatingPointOddities from '/imports/api/engine/computation/utility/stripFloatingPointOddities.js';
-import PrintedItem from '/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedItem.vue';
+import PrintedLineItem from '/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedLineItem.vue';
import PrintedContainer from '/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedContainer.vue';
import CreatureVariables from '/imports/api/creature/creatures/CreatureVariables.js';
@@ -98,7 +87,7 @@ export default {
components: {
ColumnLayout,
CoinValue,
- PrintedItem,
+ PrintedItem: PrintedLineItem,
PrintedContainer,
},
props: {
@@ -233,15 +222,17 @@ export default {
\ No newline at end of file
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSkill.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSkill.vue
index 404da2aa..a1765b98 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSkill.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSkill.vue
@@ -11,7 +11,7 @@
:value="model.proficiency"
class="prof-icon"
/>
-
+
{{ displayedModifier }}
.printed-skill{
- min-height: 30px;
+ min-height: 0;
}
.prof-icon {
From 6204be2240e7f47bba1ccf1e306d5bdc5dbf40bc Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Sat, 23 Sep 2023 12:47:31 +0200
Subject: [PATCH 23/25] Fixed printing on Chrome
---
.../CharacterSheetPrinted.vue | 25 +++++++++++++++----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
index 61cc7628..c4e5e2ab 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue
@@ -67,9 +67,13 @@
{{ creatureUrl }}
-
+
@@ -263,8 +267,8 @@ export default {
width: 100%;
widows: 0;
orphans: 0;
- -webkit-column-fill: balance-all;
- column-fill: balance-all;
+ column-fill: balance;
+ padding: 0;
}
.character-sheet-printed .column-layout {
@@ -273,6 +277,8 @@ export default {
.character-sheet-printed .column-layout>div {
position:relative;
+ margin-top: 4px;
+ margin-bottom: 4px;
}
.character-sheet-printed .column-layout > div > * {
page-break-inside: avoid;
@@ -306,7 +312,8 @@ export default {
.character-sheet-printed .double-border {
position: relative;
- padding: 11px 10px;
+ border-style: solid;
+ border-width: 11px 10px;
border-image-source: url(/images/print/doubleLineImageBorder.png);
border-image-slice: 110 126 fill;
border-image-width: 16px;
@@ -335,7 +342,7 @@ export default {
.character-sheet-printed .stats .label {
font-size: 10pt;
- font-variant: small-caps;
+ font-variant: all-small-caps
}
.character-sheet-printed .label {
@@ -349,6 +356,14 @@ export default {
display: block;
}
+.character-sheet-printed .page-break-before {
+ page-break-before: always;
+}
+
+.character-sheet-printed .avoid-page-break-after {
+ page-break-after: avoid;
+}
+
@media screen {
.character-sheet-printed {
display: flex;
From ac8bd2cddb0cf1938952d7fc912339d8ee52c929 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Sat, 23 Sep 2023 12:48:05 +0200
Subject: [PATCH 24/25] Iterated on printing format
---
.../printedCharacterSheet/PrintedSpells.vue | 39 +++----
.../printedCharacterSheet/PrintedStats.vue | 106 ++++++++++--------
.../components/PrintedAction.vue | 2 +-
.../components/PrintedContainer.vue | 5 -
.../components/PrintedLineItem.vue | 9 +-
.../components/PrintedSpell.vue | 82 ++++++++++----
.../components/PrintedSpellList.vue | 5 +-
app/imports/client/ui/utility/romanize.js | 31 +++++
8 files changed, 182 insertions(+), 97 deletions(-)
create mode 100644 app/imports/client/ui/utility/romanize.js
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedSpells.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedSpells.vue
index 5e547734..cac6e162 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedSpells.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedSpells.vue
@@ -2,37 +2,38 @@
-
-
+
+ Spells
+
+
-
-
+
+
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedStats.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedStats.vue
index b504b5a6..85832259 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedStats.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedStats.vue
@@ -13,7 +13,10 @@
>
-
+
{{ ability.name }}
@@ -108,8 +111,13 @@
:key="healthBar._id"
>
-
- Total: {{ healthBar.total }}
+
+
+ Total:
+
+
+ {{ healthBar.total }}
+
-
+
Total:
-
+
{{ resource.name }}
@@ -175,6 +183,7 @@
-
-
-
- Spell Slots
-
-
-
- {{ spellSlot.name }}
-
-
- Total: {{ spellSlot.total }}
-
-
-
-
-
-
@@ -275,9 +249,7 @@
-
+
+
+
+
+ Spell Slots
+
+
+
+ {{ spellSlot.name }}
+
+
+ Total: {{ spellSlot.total }}
+
+
+
+
+
+
note._id);
+ const topLevelNotes = getProperties(this.creature, {
+ type: 'note',
+ summary: { $exists: true },
+ 'ancestor.id': {$nin: allNoteIds}
+ });
+ return topLevelNotes;
},
},
methods: {
@@ -554,7 +569,6 @@ export default {
min-width: 86px;
text-align: center;
margin: 4px 4px -10px;
- padding: 8px;
z-index: 1;
}
.ability .bottom {
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedAction.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedAction.vue
index 9382ae14..4a63daa5 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedAction.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedAction.vue
@@ -84,7 +84,7 @@
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSpellList.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSpellList.vue
index 4dbf8d14..13ec0b26 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSpellList.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/components/PrintedSpellList.vue
@@ -1,5 +1,8 @@
-
+
{{ model.name }}
diff --git a/app/imports/client/ui/utility/romanize.js b/app/imports/client/ui/utility/romanize.js
new file mode 100644
index 00000000..f201d53d
--- /dev/null
+++ b/app/imports/client/ui/utility/romanize.js
@@ -0,0 +1,31 @@
+const roman = {
+ Ⅿ: 1000,
+ ⅭⅯ: 900,
+ Ⅾ: 500,
+ ⅭⅮ: 400,
+ Ⅽ: 100,
+ ⅩⅭ: 90,
+ Ⅼ: 50,
+ XL: 40,
+ Ⅻ: 12,
+ Ⅺ: 11,
+ Ⅹ: 10,
+ Ⅸ: 9,
+ Ⅷ: 8,
+ Ⅶ: 7,
+ Ⅵ: 6,
+ Ⅴ: 5,
+ Ⅳ: 4,
+ Ⅲ: 3,
+ Ⅱ: 2,
+ Ⅰ: 1
+};
+export default function romanize(num) {
+ var str = '';
+ for (var i of Object.keys(roman)) {
+ var q = Math.floor(num / roman[i]);
+ num -= q * roman[i];
+ str += i.repeat(q);
+ }
+ return str;
+}
\ No newline at end of file
From 593d75a4bc9121f1871eb5b271c8f9290d156be3 Mon Sep 17 00:00:00 2001
From: ThaumRystra <9525416+ThaumRystra@users.noreply.github.com>
Date: Sat, 23 Sep 2023 13:28:14 +0200
Subject: [PATCH 25/25] Fixed missing margin in print inventory
---
.../character/printedCharacterSheet/PrintedInventory.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
index 6a6c97c3..dd385d68 100644
--- a/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
+++ b/app/imports/client/ui/creature/character/printedCharacterSheet/PrintedInventory.vue
@@ -2,7 +2,7 @@