Add rest dice tracking for the Sync actors
This commit is contained in:
parent
4544516c5c
commit
1002b1387c
8 changed files with 186 additions and 24 deletions
|
|
@ -1,37 +1,47 @@
|
|||
const statDice = [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ];
|
||||
export const statDice = [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ];
|
||||
|
||||
const trainingLevels = [``, `locked`, `+2`, `+4`];
|
||||
export const trainingLevels = [``, `locked`, `+2`, `+4`];
|
||||
|
||||
const damageTypes = [ `slashing`, `piercing`, `smashing`, `gun`, `neon`, `shadow`, `solar` ];
|
||||
export const damageTypes = [ `slashing`, `piercing`, `smashing`, `gun`, `neon`, `shadow`, `solar` ];
|
||||
|
||||
const ammoTypes = [`quivers`, `mags`, `cells`];
|
||||
export const ammoTypes = [`quivers`, `mags`, `cells`];
|
||||
|
||||
const stats = [ `build`, `meta`, `presence`, `hands`, `tilt`, `rng` ];
|
||||
export const stats = [ `build`, `meta`, `presence`, `hands`, `tilt`, `rng` ];
|
||||
|
||||
const buildSkills = [ `defense`, `magic`, `melee`, `platforming`, `strength`, ];
|
||||
const metaSkills = [ `alchemy`, `arcanum`, `dreams`, `lore`, `navigation`, ];
|
||||
const presenceSkills = [ `animal_handling`, `perception`, `sneak`, `speech`, `vibes`, ];
|
||||
const handsSkills = [ `accuracy`, `crafting`, `engineering`, `explosives`, `piloting`, ];
|
||||
export const buildSkills = [ `defense`, `magic`, `melee`, `platforming`, `strength`, ];
|
||||
export const metaSkills = [ `alchemy`, `arcanum`, `dreams`, `lore`, `navigation`, ];
|
||||
export const presenceSkills = [ `animal_handling`, `perception`, `sneak`, `speech`, `vibes`, ];
|
||||
export const handsSkills = [ `accuracy`, `crafting`, `engineering`, `explosives`, `piloting`, ];
|
||||
|
||||
const allSkills = [
|
||||
export const allSkills = [
|
||||
...buildSkills,
|
||||
...metaSkills,
|
||||
...presenceSkills,
|
||||
...handsSkills,
|
||||
];
|
||||
|
||||
const skills = {
|
||||
export const skills = {
|
||||
build: buildSkills,
|
||||
meta: metaSkills,
|
||||
presence: presenceSkills,
|
||||
hands: handsSkills,
|
||||
};
|
||||
|
||||
const itemTiers = [
|
||||
export const itemTiers = [
|
||||
`simple`, `greater`,
|
||||
`rare`, `legendary`
|
||||
];
|
||||
|
||||
export const syncMilestones = [
|
||||
{ value: 20, andReturn: true },
|
||||
{ value: 40, andReturn: false },
|
||||
{ value: 60, andReturn: true },
|
||||
{ value: 80, andReturn: false },
|
||||
{ value: 100, andReturn: true },
|
||||
];
|
||||
|
||||
export const syncDice = "1d20";
|
||||
|
||||
export default {
|
||||
stats,
|
||||
statDice,
|
||||
|
|
@ -45,4 +55,6 @@ export default {
|
|||
allSkills,
|
||||
skills,
|
||||
itemTiers,
|
||||
};
|
||||
syncMilestones,
|
||||
syncDice,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
import PlayerActor from "./Player.mjs";
|
||||
import MobActor from "./Mob.mjs";
|
||||
import SyncActor from "./Sync.mjs";
|
||||
|
||||
/** @extends {Actor} */
|
||||
export class ActorHandler extends Actor {
|
||||
proxyTargets = {
|
||||
player: PlayerActor,
|
||||
mob: MobActor,
|
||||
sync: SyncActor,
|
||||
};
|
||||
|
||||
constructor(data, ctx) {
|
||||
|
|
@ -89,4 +91,10 @@ export class ActorHandler extends Actor {
|
|||
};
|
||||
return true;
|
||||
};
|
||||
|
||||
_preUpdate(...args) {
|
||||
return this.proxyFunction("_preUpdate", ...args);
|
||||
};
|
||||
|
||||
useRestDie() { return this.proxyFunction("useRestDie"); };
|
||||
};
|
||||
|
|
|
|||
60
module/documents/Actor/Sync.mjs
Normal file
60
module/documents/Actor/Sync.mjs
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
import { syncMilestones, syncDice } from "../../config.mjs";
|
||||
|
||||
/** @this {Actor} */
|
||||
async function useRestDie() {
|
||||
let addToSync = await (new Roll(syncDice)).evaluate();
|
||||
await addToSync.toMessage({
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
|
||||
flavor: `Sync Restoration`,
|
||||
});
|
||||
this.update({
|
||||
"system.rest_dice": this.system.rest_dice - 1,
|
||||
"system.value": this.system.value + addToSync.total,
|
||||
});
|
||||
};
|
||||
|
||||
/** @this {Actor} */
|
||||
async function _preUpdate(data, options) {
|
||||
if (options.diff) {
|
||||
if (data.system?.value != null) {
|
||||
let currentSync = this.system.value;
|
||||
let newSync = data.system.value;
|
||||
|
||||
let minSync = Math.min(currentSync, newSync);
|
||||
let maxSync = Math.max(currentSync, newSync);
|
||||
let milestones = syncMilestones.filter(
|
||||
m => minSync < m.value && m.value <= maxSync
|
||||
);
|
||||
|
||||
if (milestones.length > 0) data.system.rest_dice ??= this.system.rest_dice;
|
||||
|
||||
for (const milestone of milestones) {
|
||||
// Damage
|
||||
if (newSync < currentSync) {
|
||||
if (!this.system.milestones_hit.has(milestone.value)) {
|
||||
data.system.rest_dice += 1;
|
||||
this.system.milestones_hit.add(milestone.value);
|
||||
};
|
||||
}
|
||||
|
||||
// Healing
|
||||
else if (newSync > currentSync) {
|
||||
if (
|
||||
this.system.milestones_hit.has(milestone.value)
|
||||
&& milestone.andReturn
|
||||
&& milestone.value <= newSync
|
||||
) {
|
||||
this.system.milestones_hit.delete(milestone.value);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
data.system.milestones_hit = [ ...this.system.milestones_hit ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export default {
|
||||
_preUpdate,
|
||||
useRestDie,
|
||||
};
|
||||
|
|
@ -3,10 +3,18 @@ export class SyncData extends foundry.abstract.TypeDataModel {
|
|||
const fields = foundry.data.fields;
|
||||
return {
|
||||
value: new fields.NumberField({
|
||||
required: true,
|
||||
integer: true,
|
||||
initial: 100,
|
||||
}),
|
||||
rest_dice: new fields.NumberField({
|
||||
integer: true,
|
||||
initial: 0,
|
||||
min: 0,
|
||||
}),
|
||||
milestones_hit: new fields.SetField(
|
||||
new fields.NumberField({ integer: true, }),
|
||||
{ initial: [] },
|
||||
),
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ export class AbstractSyncSheet extends GenericActorSheet {
|
|||
super.defaultOptions,
|
||||
{
|
||||
width: 200,
|
||||
height: 200,
|
||||
height: 275,
|
||||
}
|
||||
);
|
||||
opts.classes.push(
|
||||
|
|
@ -22,11 +22,12 @@ export class AbstractSyncSheet extends GenericActorSheet {
|
|||
|
||||
ctx.system = actor.system;
|
||||
ctx.flags = actor.flags;
|
||||
|
||||
console.groupCollapsed(`SyncSheet.getData`);
|
||||
console.log(`ctx`, ctx);
|
||||
console.log(`actor`, actor);
|
||||
console.groupEnd();
|
||||
return ctx;
|
||||
};
|
||||
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
html.find(`.use-rest-die`)
|
||||
.on(`click`, this.actor.useRestDie.bind(this.actor));
|
||||
};
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue