The Happy Anarchist 2020-09-05 01:12:15 -10:00
commit 771cc0636c
11 changed files with 133 additions and 108 deletions

View File

@ -821,11 +821,11 @@
line-height: 30px; line-height: 30px;
} }
.acks.sheet.actor.character .sheet-body .exploration .attribute { .acks.sheet.actor.character .sheet-body .exploration .attribute {
margin: 4px; margin: 1px;
} }
.acks.sheet.actor.character .sheet-body .exploration .attribute .attribute-name { .acks.sheet.actor.character .sheet-body .exploration .attribute .attribute-name {
text-align: left; text-align: center;
flex: 1 0 60px; flex: 1 0 45px;
line-height: 25px; line-height: 25px;
font-size: 12px; font-size: 12px;
} }

View File

@ -38,7 +38,7 @@
"ACKS.roll.attribute": "{attribute} check", "ACKS.roll.attribute": "{attribute} check",
"ACKS.roll.details.attribute": "Roll 1d20 <= {score} for success", "ACKS.roll.details.attribute": "Roll 1d20 <= {score} for success",
"ACKS.roll.exploration": "{exploration} test", "ACKS.roll.exploration": "{exploration} test",
"ACKS.roll.details.exploration": "Roll 1d6 <= {expl} for success", "ACKS.roll.details.exploration": "Roll 1d20 >= {expl} for success",
"ACKS.roll.reaction": "Reaction roll", "ACKS.roll.reaction": "Reaction roll",
"ACKS.roll.initiative": "Group {group} rolls for Initiative!", "ACKS.roll.initiative": "Group {group} rolls for Initiative!",
"ACKS.roll.individualInit": "{name} rolls for Initiative!", "ACKS.roll.individualInit": "{name} rolls for Initiative!",
@ -68,8 +68,8 @@
"ACKS.Retainer": "Retainer", "ACKS.Retainer": "Retainer",
"ACKS.RetainerWage": "Wage", "ACKS.RetainerWage": "Wage",
"ACKS.RetainerUpkeep": "Upkeep", "ACKS.RetainerUpkeep": "Upkeep",
"ACKS.Loyalty": "Loyalty Rating", "ACKS.Loyalty": "Henchmen Morale",
"ACKS.LoyaltyShort": "LR", "ACKS.LoyaltyShort": "MOR",
"ACKS.scores.str.long": "Strength", "ACKS.scores.str.long": "Strength",
"ACKS.scores.str.short": "STR", "ACKS.scores.str.short": "STR",
@ -95,7 +95,7 @@
"ACKS.saves.spell.short": "S", "ACKS.saves.spell.short": "S",
"ACKS.saves.spell.long": "Spells", "ACKS.saves.spell.long": "Spells",
"ACKS.saves.magic.long": "Bonus vs Magic", "ACKS.saves.magic.long": "Bonus vs Magic",
"ACKS.saves.magic.short": "vs Magic", "ACKS.saves.magic.short": "vs Magic",
"ACKS.Health": "Hit Points", "ACKS.Health": "Hit Points",
"ACKS.HealthMax": "Maximum Hit Points", "ACKS.HealthMax": "Maximum Hit Points",
@ -116,11 +116,11 @@
"ACKS.ArmorClassNaked": "Naked Armor Class", "ACKS.ArmorClassNaked": "Naked Armor Class",
"ACKS.ArmorClass": "Armor Class", "ACKS.ArmorClass": "Armor Class",
"ACKS.ArmorClassShort": "AC", "ACKS.ArmorClassShort": "AC",
"ACKS.AscArmorClassShort": "AAC", "ACKS.AscArmorClassShort": "AC",
"ACKS.ArmorClassBonus": "Armor Class Bonus", "ACKS.ArmorClassBonus": "Armor Class Bonus",
"ACKS.Thac0": "THAC0", "ACKS.Thac0": "THAC0",
"ACKS.ABShort": "AB", "ACKS.ABShort": "Throw",
"ACKS.AB": "Attack Bonus", "ACKS.AB": "Throw",
"ACKS.MeleeShort": "MEL", "ACKS.MeleeShort": "MEL",
"ACKS.Melee": "Melee", "ACKS.Melee": "Melee",
"ACKS.MeleeBonus": "Melee Bonus", "ACKS.MeleeBonus": "Melee Bonus",
@ -163,6 +163,8 @@
"ACKS.Setting.Initiative": "Initiative", "ACKS.Setting.Initiative": "Initiative",
"ACKS.Setting.InitiativeHint": "Grouped or individual initiative.", "ACKS.Setting.InitiativeHint": "Grouped or individual initiative.",
"ACKS.Setting.InitiativeIndividual": "Individual initiative", "ACKS.Setting.InitiativeIndividual": "Individual initiative",
"ACKS.Setting.InitiativeGroup": "Grouped Initiative", "ACKS.Setting.InitiativeGroup": "Grouped Initiative",
"ACKS.Setting.RerollInitiative": "Initiative persistence", "ACKS.Setting.RerollInitiative": "Initiative persistence",
"ACKS.Setting.RerollInitiativeHint": "Keeps, resets or rerolls initiative each round", "ACKS.Setting.RerollInitiativeHint": "Keeps, resets or rerolls initiative each round",
@ -185,9 +187,9 @@
"ACKS.items.Equip": "Equip", "ACKS.items.Equip": "Equip",
"ACKS.items.Unequip": "Unequip", "ACKS.items.Unequip": "Unequip",
"ACKS.items.Misc": "Misc", "ACKS.items.Misc": "Items",
"ACKS.items.Weapons": "Weapons", "ACKS.items.Weapons": "Weapons",
"ACKS.items.Treasure": "Treasure", "ACKS.items.Treasure": "Heavy Items",
"ACKS.items.Armors": "Armors", "ACKS.items.Armors": "Armors",
"ACKS.items.Weight": "Wgt.", "ACKS.items.Weight": "Wgt.",
"ACKS.items.Qualities": "Qualities", "ACKS.items.Qualities": "Qualities",
@ -200,7 +202,7 @@
"ACKS.items.RollType": "Type", "ACKS.items.RollType": "Type",
"ACKS.items.Damage": "Damage", "ACKS.items.Damage": "Damage",
"ACKS.items.ArmorAC": "AC", "ACKS.items.ArmorAC": "AC",
"ACKS.items.ArmorAAC": "AAC", "ACKS.items.ArmorAAC": "AC",
"ACKS.items.Bonus": "Bonus", "ACKS.items.Bonus": "Bonus",
"ACKS.items.AtkBonus": "Attack Bonus", "ACKS.items.AtkBonus": "Attack Bonus",
"ACKS.items.roundAttacks": "Attacks Spent this Round", "ACKS.items.roundAttacks": "Attacks Spent this Round",
@ -241,9 +243,9 @@
"ACKS.abilities.Requirements": "Requirements", "ACKS.abilities.Requirements": "Requirements",
"ACKS.exploration.ld.long": "Listen at Door", "ACKS.exploration.ld.long": "Listen for noises",
"ACKS.exploration.ld.short": "Listen Door", "ACKS.exploration.ld.short": "Hear Noise",
"ACKS.exploration.ld.abrev": "LD", "ACKS.exploration.ld.abrev": "HN",
"ACKS.exploration.od.long": "Open Stuck Door", "ACKS.exploration.od.long": "Open Stuck Door",
"ACKS.exploration.od.short": "Open Door", "ACKS.exploration.od.short": "Open Door",
"ACKS.exploration.od.abrev": "OD", "ACKS.exploration.od.abrev": "OD",
@ -272,9 +274,9 @@
"ACKS.colors.white": "White", "ACKS.colors.white": "White",
"ACKS.reaction.check": "Reaction Check", "ACKS.reaction.check": "Reaction Check",
"ACKS.reaction.Hostile": "{name} is Hostile", "ACKS.reaction.Hostile": "{name} is Hostile and attacks",
"ACKS.reaction.Unfriendly": "{name} is Unfriendly", "ACKS.reaction.Unfriendly": "{name} is Unfriendly and may attack",
"ACKS.reaction.Neutral": "{name} is Neutral", "ACKS.reaction.Neutral": "{name} is Neutral and uncertain",
"ACKS.reaction.Indifferent": "{name} is Indifferent", "ACKS.reaction.Indifferent": "{name} is Indifferent and uninterested",
"ACKS.reaction.Friendly": "{name} is Friendly" "ACKS.reaction.Friendly": "{name} is Friendly and helpful"
} }

View File

@ -333,12 +333,12 @@ export class AcksActor extends Actor {
rollExploration(expl, options = {}) { rollExploration(expl, options = {}) {
const label = game.i18n.localize(`ACKS.exploration.${expl}.long`); const label = game.i18n.localize(`ACKS.exploration.${expl}.long`);
const rollParts = ["1d6"]; const rollParts = ["1d20"];
const data = { const data = {
actor: this.data, actor: this.data,
roll: { roll: {
type: "below", type: "above",
target: this.data.data.exploration[expl], target: this.data.data.exploration[expl],
}, },
details: game.i18n.format("ACKS.roll.details.exploration", { details: game.i18n.format("ACKS.roll.details.exploration", {
@ -519,8 +519,9 @@ export class AcksActor extends Actor {
let hasItems = false; let hasItems = false;
Object.values(this.data.items).forEach((item) => { Object.values(this.data.items).forEach((item) => {
if (item.type == "item" && !item.data.treasure) { if (item.type == "item" && !item.data.treasure) {
if (option === "detailed") totalWeight += 166.6;
hasItems = true; // hasItems = true;
} }
if ( if (
item.type == "item" && item.type == "item" &&
@ -531,7 +532,7 @@ export class AcksActor extends Actor {
totalWeight += item.data.weight; totalWeight += item.data.weight;
} }
}); });
if (option === "detailed" && hasItems) totalWeight += 80; // if (option === "detailed" && hasItems) totalWeight += 166.6;
data.encumbrance = { data.encumbrance = {
pct: Math.clamped( pct: Math.clamped(
@ -541,7 +542,7 @@ export class AcksActor extends Actor {
), ),
max: data.encumbrance.max, max: data.encumbrance.max,
encumbered: totalWeight > data.encumbrance.max, encumbered: totalWeight > data.encumbrance.max,
value: totalWeight, value: Math.round(totalWeight),
}; };
if (data.config.movementAuto && option != "disabled") { if (data.config.movementAuto && option != "disabled") {
@ -553,15 +554,15 @@ export class AcksActor extends Actor {
const data = this.data.data; const data = this.data.data;
let option = game.settings.get("acks", "encumbranceOption"); let option = game.settings.get("acks", "encumbranceOption");
let weight = data.encumbrance.value; let weight = data.encumbrance.value;
let delta = data.encumbrance.max - 1600; let delta = data.encumbrance.max - 20000;
if (["detailed", "complete"].includes(option)) { if (["detailed", "complete"].includes(option)) {
if (weight > data.encumbrance.max) { if (weight > data.encumbrance.max) {
data.movement.base = 0; data.movement.base = 0;
} else if (weight > 800 + delta) { } else if (weight > 10000 + delta) {
data.movement.base = 30; data.movement.base = 30;
} else if (weight > 600 + delta) { } else if (weight > 7000 + delta) {
data.movement.base = 60; data.movement.base = 60;
} else if (weight > 400 + delta) { } else if (weight > 5000 + delta) {
data.movement.base = 90; data.movement.base = 90;
} else { } else {
data.movement.base = 120; data.movement.base = 120;
@ -606,7 +607,7 @@ export class AcksActor extends Actor {
(i) => i.type == "item" && i.data.treasure (i) => i.type == "item" && i.data.treasure
); );
treasure.forEach((item) => { treasure.forEach((item) => {
total += item.data.quantity.value * item.data.cost; total += item.data.quantity.value * item.data.cost
}); });
data.treasure = total; data.treasure = total;
} }
@ -703,11 +704,13 @@ export class AcksActor extends Actor {
const od = { const od = {
0: 0, 0: 0,
3: 1, 3: 30,
9: 2, 4: 26,
13: 3, 6: 22,
16: 4, 9: 18,
18: 5, 13: 14,
16: 10,
18: 6,
}; };
data.exploration.odMod = AcksActor._valueFromTable( data.exploration.odMod = AcksActor._valueFromTable(
od, od,

View File

@ -106,75 +106,91 @@ export const ACKS = {
monster_saves: { monster_saves: {
0: { 0: {
label: "Normal Human", label: "Normal Human",
d: 14, d: 15,
w: 15, w: 17,
p: 16, p: 16,
b: 17, b: 17,
s: 18 s: 18
}, },
1: { 1: {
label: "1-3", label: "1",
d: 12, d: 14,
w: 13, w: 16,
p: 15,
b: 16,
s: 17
},
2: {
label: "2-3",
d: 13,
w: 15,
p: 14, p: 14,
b: 15, b: 15,
s: 16 s: 16
}, },
4: { 4: {
label: "4-6", label: "4",
d: 10, d: 12,
w: 11, w: 14,
p: 13,
b: 14,
s: 15
},
5: {
label: "5-6",
d: 11,
w: 13,
p: 12, p: 12,
b: 13, b: 13,
s: 14 s: 14
}, },
7: { 7: {
label: "7-9", label: "7",
d: 8, d: 10,
w: 9, w: 12,
p: 11,
b: 12,
s: 13
},
8: {
label: "8-9",
d: 9,
w: 11,
p: 10, p: 10,
b: 10, b: 11,
s: 12 s: 12
}, },
10: { 10: {
label: "10-12", label: "10",
d: 6, d: 8,
w: 7, w: 10,
p: 9,
b: 10,
s: 11
},
11: {
label: "11-12",
d: 7,
w: 9,
p: 8, p: 8,
b: 8, b: 9,
s: 10 s: 10
}, },
13: { 13: {
label: "13-15", label: "13",
d: 4, d: 6,
w: 5, w: 8,
p: 7,
b: 8,
s: 9
},
14: {
label: "14+",
d: 5,
w: 7,
p: 6, p: 6,
b: 5, b: 7,
s: 8 s: 8
}, },
16: { },
label: "16-18",
d: 2,
w: 3,
p: 4,
b: 3,
s: 6
},
19: {
label: "19-21",
d: 2,
w: 2,
p: 2,
b: 2,
s: 4
},
22: {
label: "22+",
d: 2,
w: 2,
p: 2,
b: 2,
s: 2
},
}
}; };

View File

@ -16,14 +16,14 @@ export class AcksDice {
result.isFailure = true; result.isFailure = true;
} }
} else if (data.roll.type == "below") { } else if (data.roll.type == "below") {
// MORALE, EXPLORATION // MORALE
if (roll.total <= result.target) { if (roll.total <= result.target) {
result.isSuccess = true; result.isSuccess = true;
} else { } else {
result.isFailure = true; result.isFailure = true;
} }
} else if (data.roll.type == "check") { } else if (data.roll.type == "check") {
// SCORE CHECKS (1s and 20s) // SCORE CHECKS (1s and 20s), EXPLORATION
if (die == 1 || (roll.total <= result.target && die < 20)) { if (die == 1 || (roll.total <= result.target && die < 20)) {
result.isSuccess = true; result.isSuccess = true;
} else { } else {

View File

@ -33,6 +33,10 @@ export const registerHelpers = async function () {
Handlebars.registerHelper("mult", function (lh, rh) { Handlebars.registerHelper("mult", function (lh, rh) {
return parseFloat(lh) * parseFloat(rh); return parseFloat(lh) * parseFloat(rh);
}); });
Handlebars.registerHelper("multround", function (lh, rh) {
return Math.round((parseFloat(lh) * parseFloat(rh)) * 100) / 100;
})
Handlebars.registerHelper("roundWeight", function (weight) { Handlebars.registerHelper("roundWeight", function (weight) {
return Math.round(parseFloat(weight) / 100) / 10; return Math.round(parseFloat(weight) / 100) / 10;

View File

@ -2,7 +2,7 @@
"name": "acks", "name": "acks",
"title": "Adventurer Conqueror Kings System", "title": "Adventurer Conqueror Kings System",
"description": "Play B/X OSR modules with ACKS on Foundry VTT", "description": "Play B/X OSR modules with ACKS on Foundry VTT",
"version": "0.1.0", "version": "0.2.0",
"minimumCoreVersion": "0.6.2", "minimumCoreVersion": "0.6.2",
"compatibleCoreVersion": "0.6.6", "compatibleCoreVersion": "0.6.6",
"templateVersion": 2, "templateVersion": 2,

View File

@ -10,8 +10,8 @@
}, },
"hp": { "hp": {
"hd": "1d8", "hd": "1d8",
"value": 20, "value": 4,
"max": 20 "max": 4
}, },
"ac": { "ac": {
"value": 0, "value": 0,
@ -31,19 +31,19 @@
}, },
"saves": { "saves": {
"death": { "death": {
"value": 0 "value": 15
}, },
"wand": { "wand": {
"value": 0 "value": 17
}, },
"paralysis": { "paralysis": {
"value": 0 "value": 16
}, },
"breath": { "breath": {
"value": 0 "value": 17
}, },
"spell": { "spell": {
"value": 0 "value": 18
} }
}, },
"movement": { "movement": {
@ -98,10 +98,10 @@
} }
}, },
"exploration": { "exploration": {
"ld": 1, "ld": 18,
"od": 2, "od": 18,
"sd": 1, "sd": 18,
"ft": 1 "ft": 18
}, },
"scores": { "scores": {
"str": { "str": {
@ -130,7 +130,7 @@
} }
}, },
"encumbrance": { "encumbrance": {
"max": 1600 "max": 20000
}, },
"languages": { "languages": {
"value": [] "value": []
@ -140,7 +140,7 @@
"templates": ["common", "spellcaster"], "templates": ["common", "spellcaster"],
"details": { "details": {
"biography": "", "biography": "",
"alignment": "", "alignment": "Neutral",
"xp": 0, "xp": 0,
"treasure": { "treasure": {
"table": "", "table": "",
@ -150,7 +150,7 @@
"d": 0, "d": 0,
"w": 0 "w": 0
}, },
"morale": 0 "morale": 7
}, },
"attacks": "" "attacks": ""
} }
@ -165,7 +165,7 @@
}, },
"treasure": false, "treasure": false,
"cost": 0, "cost": 0,
"weight": 0 "weight": 166.6
}, },
"weapon": { "weapon": {
"range": { "range": {
@ -184,7 +184,7 @@
"melee": true, "melee": true,
"cost": 0, "cost": 0,
"equipped": false, "equipped": false,
"weight": 0, "weight": 167,
"counter": { "counter": {
"value": 0, "value": 0,
"max": 0 "max": 0
@ -193,11 +193,11 @@
"armor": { "armor": {
"description": "", "description": "",
"ac": 9, "ac": 9,
"aac": 10, "aac": 0,
"type": "light", "type": "light",
"cost": 0, "cost": 0,
"equipped": false, "equipped": false,
"weight": 0 "weight": 2000
}, },
"spell": { "spell": {
"lvl": 1, "lvl": 1,

View File

@ -6,7 +6,7 @@
{{localize 'ACKS.Melee'}} ({{mod data.scores.str.mod}}) {{localize 'ACKS.Melee'}} ({{mod data.scores.str.mod}})
</li> </li>
<li> <li>
{{localize 'ACKS.exploration.od.long'}} ({{data.exploration.odMod}} in 6) {{localize 'ACKS.exploration.od.long'}} ({{data.exploration.odMod}}+)
</li> </li>
</ol> </ol>
</div> </div>

View File

@ -2,28 +2,28 @@
<li class="attribute flexrow" data-exploration="ld"> <li class="attribute flexrow" data-exploration="ld">
<h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.ld.abrev'}}) {{localize 'ACKS.exploration.ld.long'}}"><a>{{ localize "ACKS.exploration.ld.short" }}</a></h4> <h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.ld.abrev'}}) {{localize 'ACKS.exploration.ld.long'}}"><a>{{ localize "ACKS.exploration.ld.short" }}</a></h4>
<div class="attribute-value"> <div class="attribute-value">
<input name="data.exploration.ld" type="text" value="{{data.exploration.ld}}" data-dtype="Number" placeholder="0" /> <input name="data.exploration.ld" type="text" value="{{data.exploration.ld}}" value="18" data-dtype="Number" placeholder="0" />
</div> </div>
</li> </li>
<li class="attribute flexrow" data-exploration="od"> <li class="attribute flexrow" data-exploration="od">
<h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.od.abrev'}}) {{localize 'ACKS.exploration.od.long'}}"><a>{{ localize "ACKS.exploration.od.short" }}</a> <h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.od.abrev'}}) {{localize 'ACKS.exploration.od.long'}}"><a>{{ localize "ACKS.exploration.od.short" }}</a>
</h4> </h4>
<div class="attribute-value"> <div class="attribute-value">
<input name="data.exploration.od" type="text" value="{{data.exploration.od}}" placeholder="0" data-dtype="String" /> <input name="data.exploration.od" type="text" value="{{data.exploration.od}}" value="18" placeholder="0" data-dtype="String" />
</div> </div>
</li> </li>
<li class="attribute flexrow" data-exploration="sd"> <li class="attribute flexrow" data-exploration="sd">
<h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.sd.abrev'}}) {{localize 'ACKS.exploration.sd.long'}}"><a>{{ localize "ACKS.exploration.sd.short" }}</a> <h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.sd.abrev'}}) {{localize 'ACKS.exploration.sd.long'}}"><a>{{ localize "ACKS.exploration.sd.short" }}</a>
</h4> </h4>
<div class="attribute-value"> <div class="attribute-value">
<input name="data.exploration.sd" type="text" value="{{data.exploration.sd}}" placeholder="0" data-dtype="String" /> <input name="data.exploration.sd" type="text" value="{{data.exploration.sd}}" value="18" placeholder="0" data-dtype="String" />
</div> </div>
</li> </li>
<li class="attribute flexrow" data-exploration="ft"> <li class="attribute flexrow" data-exploration="ft">
<h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.ft.abrev'}}) {{localize 'ACKS.exploration.ft.long'}}"><a>{{ localize "ACKS.exploration.ft.short" }}</a> <h4 class="attribute-name box-title" title="({{localize 'ACKS.exploration.ft.abrev'}}) {{localize 'ACKS.exploration.ft.long'}}"><a>{{ localize "ACKS.exploration.ft.short" }}</a>
</h4> </h4>
<div class="attribute-value"> <div class="attribute-value">
<input name="data.exploration.ft" type="text" value="{{data.exploration.ft}}" placeholder="0" data-dtype="String" /> <input name="data.exploration.ft" type="text" value="{{data.exploration.ft}}" value="18" placeholder="0" data-dtype="String" />
</div> </div>
</li> </li>
</ul> </ul>

View File

@ -176,7 +176,7 @@
</h4> </h4>
</a> </a>
</div> </div>
<div class="field-long">{{mult item.data.quantity.value item.data.cost}}</div> <div class="field-long">{{multround item.data.quantity.value item.data.cost}}</div>
<div class="field-short quantity"> <div class="field-short quantity">
<input value="{{item.data.quantity.value}}" type="text" <input value="{{item.data.quantity.value}}" type="text"
placeholder="0" />{{#if item.data.quantity.max}}<span>/{{item.data.quantity.max}}</span>{{/if}} placeholder="0" />{{#if item.data.quantity.max}}<span>/{{item.data.quantity.max}}</span>{{/if}}