Skip to content

Commit a2cbf7c

Browse files
committed
fix: make the movement calculate correctly
1 parent f12cb26 commit a2cbf7c

File tree

11 files changed

+256
-38
lines changed

11 files changed

+256
-38
lines changed

src/lang/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@
215215
"OSE.items.Containers": "Containers",
216216
"OSE.items.Armors": "Armors",
217217
"OSE.items.Weight": "Wgt.",
218-
"OSE.items.ItemSlots": "Item Slots",
218+
"OSE.items.WeightLong": "Weight",
219+
"OSE.items.ItemBasedEncumberance": "Enc.",
220+
"OSE.items.ItemBasedEncumberanceLong": "Item-Based Encumbrance",
219221
"OSE.items.Qualities": "Qualities",
220222
"OSE.items.Notes": "Notes",
221223
"OSE.items.Cost": "Cost",

src/module/actor/data-model-classes/data-model-character-encumbrance-item-based.ts

Lines changed: 85 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@ export default class OseDataModelCharacterEncumbranceItemBased
1515
extends OseDataModelCharacterEncumbrance
1616
implements CharacterEncumbrance
1717
{
18+
static packedEncumbranceSteps = {
19+
fiveEighths: 62.5,
20+
threeQuarters: 75,
21+
sevenEighths: 87.5,
22+
};
23+
24+
static equippedEncumbranceSteps = {
25+
oneThird: 33.33,
26+
fiveNinths: 55.55,
27+
sevenNinths: 77.77,
28+
};
29+
30+
#equippedMax;
31+
32+
#packedMax;
33+
34+
#max;
35+
1836
static templateEncumbranceBar = "";
1937

2038
static templateInventoryRow = "";
@@ -31,28 +49,82 @@ export default class OseDataModelCharacterEncumbranceItemBased
3149

3250
#weight;
3351

34-
constructor(
35-
max = OseDataModelCharacterEncumbrance.baseEncumbranceCap,
36-
items: Item[] = []
37-
) {
52+
#equippedWeight;
53+
54+
#packedWeight;
55+
56+
constructor(max = 16, items: Item[] = []) {
3857
super(OseDataModelCharacterEncumbranceItemBased.type, max);
39-
this.#weight = items.reduce(
40-
(acc, { type, system: { quantity, itemslots } }: Item) => {
41-
if (type === "item") return acc + quantity.value * itemslots;
42-
if (["weapon", "armor", "container"].includes(type))
43-
return acc + itemslots;
44-
return acc;
45-
},
46-
0
58+
59+
this.#packedMax = 16;
60+
this.#equippedMax = 9;
61+
this.#packedWeight = Math.ceil(
62+
items.reduce(
63+
(acc, { type, system: { quantity, itemslots, equipped } }: Item) => {
64+
if (type === "item" && !equipped)
65+
return acc + quantity.value * itemslots;
66+
if (["weapon", "armor", "container"].includes(type) && !equipped)
67+
return acc + itemslots;
68+
return acc;
69+
},
70+
0
71+
)
72+
);
73+
this.#equippedWeight = Math.ceil(
74+
items.reduce(
75+
(acc, { type, system: { quantity, itemslots, equipped } }: Item) => {
76+
if (type === "item" && equipped)
77+
return acc + quantity.value * itemslots;
78+
if (["weapon", "armor", "container"].includes(type) && equipped)
79+
return acc + itemslots;
80+
return acc;
81+
},
82+
0
83+
)
4784
);
85+
this.#weight = this.usingEquippedEncumbrance
86+
? this.#equippedWeight
87+
: this.#packedWeight;
88+
89+
this.#max = this.usingEquippedEncumbrance
90+
? this.#equippedMax
91+
: this.#packedMax;
4892
}
4993

5094
// eslint-disable-next-line class-methods-use-this
5195
get steps() {
52-
return Object.values(OseDataModelCharacterEncumbrance.encumbranceSteps);
96+
return this.usingEquippedEncumbrance
97+
? Object.values(
98+
OseDataModelCharacterEncumbranceItemBased.equippedEncumbranceSteps
99+
)
100+
: Object.values(
101+
OseDataModelCharacterEncumbranceItemBased.packedEncumbranceSteps
102+
);
103+
}
104+
105+
get usingEquippedEncumbrance() {
106+
const equippedValues = Object.values(
107+
OseDataModelCharacterEncumbranceItemBased.equippedEncumbranceSteps
108+
);
109+
const packedValues = Object.values(
110+
OseDataModelCharacterEncumbranceItemBased.packedEncumbranceSteps
111+
);
112+
let equippedIndex = equippedValues.findIndex(
113+
(step) => step > (this.#equippedWeight / this.#equippedMax) * 100
114+
);
115+
equippedIndex = equippedIndex === -1 ? 4 : equippedIndex;
116+
let packedIndex = packedValues.findIndex(
117+
(step) => step > (this.#packedWeight / this.#packedMax) * 100
118+
);
119+
packedIndex = packedIndex === -1 ? 4 : packedIndex;
120+
return !!(equippedIndex >= packedIndex);
53121
}
54122

55123
get value(): number {
56124
return this.#weight;
57125
}
126+
127+
get max(): number {
128+
return this.#max;
129+
}
58130
}

src/module/actor/data-model-classes/data-model-character-encumbrance.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ export default class OseDataModelCharacterEncumbrance
2626
quarter: 25,
2727
threeEighths: 37.5,
2828
half: 50,
29+
fiveEighths: 62.5,
30+
threeQuarters: 75,
31+
sevenEighths: 87.5,
32+
oneThird: 33.34,
33+
fiveNinths: 55.56,
34+
sevenNinths: 77.78,
2935
};
3036

3137
#encumbranceVariant;
@@ -113,4 +119,65 @@ export default class OseDataModelCharacterEncumbrance
113119
(this.#delta || 0)
114120
);
115121
}
122+
123+
// Item-based encumbrance variant props - packed
124+
get atFiveEighthsEncumbered() {
125+
return (
126+
this.value >
127+
this.max *
128+
(OseDataModelCharacterEncumbrance.encumbranceSteps.fiveEighths / 100)
129+
);
130+
}
131+
132+
get atThreeQuartersEncumbered() {
133+
return (
134+
this.value >
135+
this.max *
136+
(OseDataModelCharacterEncumbrance.encumbranceSteps.threeQuarters / 100)
137+
);
138+
}
139+
140+
get atSevenEighthsEncumbered() {
141+
return (
142+
this.value >
143+
this.max *
144+
(OseDataModelCharacterEncumbrance.encumbranceSteps.sevenEighths / 100)
145+
);
146+
}
147+
148+
// Item-based encumbrance variant props - equipped
149+
// eslint-disable-next-line class-methods-use-this
150+
get usingEquippedEncumbrance() {
151+
return false;
152+
}
153+
154+
get atOneThirdEncumbered() {
155+
return (
156+
this.value >
157+
Math.round(
158+
this.max *
159+
(OseDataModelCharacterEncumbrance.encumbranceSteps.oneThird / 100)
160+
)
161+
);
162+
}
163+
164+
get atFiveNinthsEncumbered() {
165+
return (
166+
this.value >
167+
Math.round(
168+
this.max *
169+
(OseDataModelCharacterEncumbrance.encumbranceSteps.fiveNinths / 100)
170+
)
171+
);
172+
}
173+
174+
get atSevenNinthsEncumbered() {
175+
return (
176+
this.value >
177+
Math.round(
178+
this.max *
179+
(OseDataModelCharacterEncumbrance.encumbranceSteps.sevenNinths / 100)
180+
)
181+
);
182+
}
116183
}

src/module/actor/data-model-classes/data-model-character-move.ts

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,38 @@ export default class OseDataModelCharacterMove implements CharacterMove {
2626
#overEncumbranceLimit;
2727

2828
#halfEncumbered;
29+
2930
#threeEighthsEncumbered;
31+
3032
#quarterEncumbered;
31-
33+
34+
#fiveEighthsEncumbered;
35+
36+
#threeQuartersEncumbered;
37+
38+
#sevenEighthsEncumbered;
39+
40+
#usingEquippedEncumbrance;
41+
42+
#oneThirdEncumbered;
43+
44+
#fiveNinthsEncumbered;
45+
46+
#sevenNinthsEncumbered;
47+
3248
/**
3349
* The constructor
3450
*
3551
* @param {OseDataModelCharacterEncumbrance} encumbrance - An object representing the character's encumbrance values
3652
* @param {boolean} shouldCalculateMovement - Should the class autocalculate movement?
3753
* @param {number} base - The base move rate for the actor
54+
* @param {boolean} usingEquippedEncumbrance - Is the character using equipped encumbrance
3855
*/
3956
constructor(
4057
encumbrance: OseDataModelCharacterEncumbrance = new OseDataModelCharacterEncumbrance(),
4158
shouldCalculateMovement = true,
42-
base = OseDataModelCharacterMove.baseMoveRate
59+
base = OseDataModelCharacterMove.baseMoveRate,
60+
usingEquippedEncumbrance = encumbrance.usingEquippedEncumbrance
4361
) {
4462
// Props necessary for any encumbrance variant
4563
this.#moveBase = base;
@@ -48,17 +66,38 @@ export default class OseDataModelCharacterMove implements CharacterMove {
4866
this.#overEncumbranceLimit = encumbrance.encumbered;
4967

5068
// Non-basic encumbrance variant props
51-
this.#halfEncumbered = encumbrance.atHalfEncumbered;
69+
this.#halfEncumbered = encumbrance.atHalfEncumbered;
5270
this.#threeEighthsEncumbered = encumbrance.atThreeEighthsEncumbered;
53-
this.#quarterEncumbered = encumbrance.atQuarterEncumbered;
71+
this.#quarterEncumbered = encumbrance.atQuarterEncumbered;
72+
73+
// Item-based encumbrance variant props - packed steps
74+
this.#fiveEighthsEncumbered = encumbrance.atFiveEighthsEncumbered;
75+
this.#threeQuartersEncumbered = encumbrance.atThreeQuartersEncumbered;
76+
this.#sevenEighthsEncumbered = encumbrance.atSevenEighthsEncumbered;
77+
// Item-based encumbrance variant props - equipped steps
78+
this.#usingEquippedEncumbrance = usingEquippedEncumbrance;
79+
this.#oneThirdEncumbered = encumbrance.atOneThirdEncumbered;
80+
this.#fiveNinthsEncumbered = encumbrance.atFiveNinthsEncumbered;
81+
this.#sevenNinthsEncumbered = encumbrance.atSevenNinthsEncumbered;
5482
}
5583

5684
#derivedSpeed() {
57-
if (this.#overEncumbranceLimit) return 0;
58-
else if (this.#halfEncumbered) return this.#moveBase * .25;
59-
else if (this.#threeEighthsEncumbered) return this.#moveBase * .50;
60-
else if (this.#quarterEncumbered) return this.#moveBase * .75;
61-
else return this.#moveBase;
85+
if (this.#overEncumbranceLimit) return 0;
86+
if (this.#usingEquippedEncumbrance) {
87+
if (this.#sevenNinthsEncumbered) return this.#moveBase * 0.25;
88+
if (this.#fiveNinthsEncumbered) return this.#moveBase * 0.5;
89+
return this.#oneThirdEncumbered ? this.#moveBase * 0.75 : this.#moveBase;
90+
}
91+
if (this.#encumbranceVariant === "itembased") {
92+
if (this.#sevenEighthsEncumbered) return this.#moveBase * 0.25;
93+
if (this.#threeQuartersEncumbered) return this.#moveBase * 0.5;
94+
return this.#fiveEighthsEncumbered
95+
? this.#moveBase * 0.75
96+
: this.#moveBase;
97+
}
98+
if (this.#halfEncumbered) return this.#moveBase * 0.25;
99+
if (this.#threeEighthsEncumbered) return this.#moveBase * 0.5;
100+
return this.#quarterEncumbered ? this.#moveBase * 0.75 : this.#moveBase;
62101
}
63102

64103
get base() {

src/module/helpers-handlebars.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ const registerHelpers = async () => {
7171
"asset",
7272
(relativePath) => `${OSE.assetsPath}${relativePath}`
7373
);
74+
75+
Handlebars.registerHelper("ceil", (val) => Math.ceil(val));
7476
};
7577

7678
export default registerHelpers;

src/module/item/data-model-spell.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
2-
* @file The data model for Items of type Ability
2+
* @file The data model for Items of type Spell
33
*/
4-
export default class OseDataModelItem extends foundry.abstract.DataModel {
4+
export default class OseDataModelSpell extends foundry.abstract.DataModel {
55
static defineSchema() {
66
const { StringField, NumberField, ArrayField, ObjectField } =
77
foundry.data.fields;

0 commit comments

Comments
 (0)