Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract action sample tasks as separate data field #12611

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Extract action sample tasks as separate data field
Include refactored data for all the actions currently existing in the system as action objects.
  • Loading branch information
nikolaj-a committed Dec 30, 2023
commit 74272f221d41885211de2374d4a02b8c0257ce20
17 changes: 17 additions & 0 deletions src/module/actor/actions/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
ActionVariant,
ActionVariantUseOptions,
} from "./types.ts";
import type { ProficiencyRank } from "@item/base/data/index.ts";
import { PROFICIENCY_RANKS } from "@module/data.ts";

interface BaseActionVariantData {
cost?: ActionCost;
Expand All @@ -23,12 +25,23 @@ interface BaseActionData<ActionVariantDataType extends BaseActionVariantData = B
description: string;
img?: string;
name: string;
sampleTasks?: Partial<Record<ProficiencyRank, string>>;
section?: ActionSection;
slug?: string | null;
traits?: string[];
variants?: ActionVariantDataType | ActionVariantDataType[];
}

function labelSampleTasks(sampleTasks: Partial<Record<ProficiencyRank, string>>): { label: string; text: string }[] {
const unlabeled: { rank: ProficiencyRank; text: string }[] = [];
let rank: keyof typeof sampleTasks;
for (rank in sampleTasks) {
unlabeled.push({ rank, text: sampleTasks[rank]! });
}
unlabeled.sort((t1, t2) => PROFICIENCY_RANKS.indexOf(t1.rank) - PROFICIENCY_RANKS.indexOf(t2.rank));
return unlabeled.map((task) => ({ label: CONFIG.PF2E.proficiencyRanks[task.rank], text: task.text }));
}

abstract class BaseActionVariant implements ActionVariant {
readonly #action: BaseAction<BaseActionVariantData, BaseActionVariant>;
readonly #cost?: ActionCost;
Expand Down Expand Up @@ -73,6 +86,7 @@ abstract class BaseActionVariant implements ActionVariant {
const name = this.name
? `${game.i18n.localize(this.#action.name)} - ${game.i18n.localize(this.name)}`
: game.i18n.localize(this.#action.name);
const sampleTasks = this.#action.sampleTasks ? labelSampleTasks(this.#action.sampleTasks) : undefined;
const traitLabels: Record<string, string | undefined> = CONFIG.PF2E.actionTraits;
const traitDescriptions: Record<string, string | undefined> = CONFIG.PF2E.traitsDescriptions;
const traits = this.traits.map((trait) => ({
Expand All @@ -84,6 +98,7 @@ abstract class BaseActionVariant implements ActionVariant {
description,
glyph: this.glyph,
name,
sampleTasks,
traits,
});
return ChatMessagePF2e.create({
Expand All @@ -101,6 +116,7 @@ abstract class BaseAction<TData extends BaseActionVariantData, TAction extends B
readonly description?: string;
readonly img?: string;
readonly name: string;
readonly sampleTasks?: Partial<Record<ProficiencyRank, string>>;
readonly section?: ActionSection;
readonly slug: string;
readonly traits: string[];
Expand All @@ -111,6 +127,7 @@ abstract class BaseAction<TData extends BaseActionVariantData, TAction extends B
this.description = data.description;
this.img = data.img;
this.name = data.name.trim();
this.sampleTasks = data.sampleTasks;
this.section = data.section;
this.slug = data.slug?.trim() || sluggify(this.name);
this.traits = data.traits ?? [];
Expand Down
2 changes: 2 additions & 0 deletions src/module/actor/actions/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { ActorPF2e } from "@actor";
import type { ChatMessagePF2e } from "@module/chat-message/document.ts";
import { ProficiencyRank } from "@item/base/data/index.ts";

const ACTION_COSTS = ["free", "reaction", 1, 2, 3] as const;
type ActionCost = (typeof ACTION_COSTS)[number];
Expand Down Expand Up @@ -40,6 +41,7 @@ interface Action {
glyph?: string;
img?: string;
name: string;
sampleTasks?: Partial<Record<ProficiencyRank, string>>;
section?: ActionSection;
slug: string;
traits: string[];
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/acrobatics/balance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:balance"],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "balance",
statistic: "acrobatics",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:maneuver-in-flight"],
sampleTasks: {
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "maneuver-in-flight",
statistic: "acrobatics",
Expand Down
4 changes: 4 additions & 0 deletions src/module/system/action-macros/acrobatics/squeeze.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:squeeze"],
sampleTasks: {
trained: `${PREFIX}.SampleTasks.Trained`,
master: `${PREFIX}.SampleTasks.Master`,
},
section: "skill",
slug: "squeeze",
statistic: "acrobatics",
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/athletics/climb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:climb"],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "climb",
statistic: "athletics",
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/athletics/force-open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:force-open"],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "force-open",
statistic: "athletics",
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/athletics/swim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:swim"],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "swim",
statistic: "athletics",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
rollOptions: ["action:gather-information"],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "gather-information",
statistic: "diplomacy",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ const action = new SingleCheckAction({
{ outcome: ["success"], text: "PF2E.Actions.SenseDirection.Notes.success" },
],
rollOptions: ["action:sense-direction"],
sampleTasks: {
untrained: "PF2E.Actions.SenseDirection.SampleTasks.Untrained",
trained: "PF2E.Actions.SenseDirection.SampleTasks.Trained",
expert: "PF2E.Actions.SenseDirection.SampleTasks.Expert",
master: "PF2E.Actions.SenseDirection.SampleTasks.Master",
legendary: "PF2E.Actions.SenseDirection.SampleTasks.Legendary",
},
slug: "sense-direction",
statistic: "survival",
traits: ["exploration", "secret"],
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/exploration/track.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ const action = new SingleCheckAction({
{ outcome: ["criticalFailure"], text: "PF2E.Actions.Track.Notes.criticalFailure" },
],
rollOptions: ["action:track"],
sampleTasks: {
untrained: "PF2E.Actions.Track.SampleTasks.Untrained",
trained: "PF2E.Actions.Track.SampleTasks.Trained",
expert: "PF2E.Actions.Track.SampleTasks.Expert",
master: "PF2E.Actions.Track.SampleTasks.Master",
legendary: "PF2E.Actions.Track.SampleTasks.Legendary",
},
slug: "track",
statistic: "survival",
traits: ["concentrate", "exploration", "move"],
Expand Down
6 changes: 6 additions & 0 deletions src/module/system/action-macros/general/decipher-writing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ class DecipherWritingAction extends SingleCheckAction {
{ outcome: ["criticalFailure"], text: "PF2E.Actions.DecipherWriting.Notes.criticalFailure" },
],
rollOptions: ["action:decipher-writing"],
sampleTasks: {
trained: "PF2E.Actions.DecipherWriting.SampleTasks.Trained",
expert: "PF2E.Actions.DecipherWriting.SampleTasks.Expert",
master: "PF2E.Actions.DecipherWriting.SampleTasks.Master",
legendary: "PF2E.Actions.DecipherWriting.SampleTasks.Legendary",
},
section: "skill",
slug: "decipher-writing",
statistic: "",
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/general/subsist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ class SubsistAction extends SingleCheckAction {
{ outcome: ["criticalFailure"], text: "PF2E.Actions.Subsist.Notes.criticalFailure" },
],
rollOptions: ["action:subsist"],
sampleTasks: {
untrained: "PF2E.Actions.Subsist.SampleTasks.Untrained",
trained: "PF2E.Actions.Subsist.SampleTasks.Trained",
expert: "PF2E.Actions.Subsist.SampleTasks.Expert",
master: "PF2E.Actions.Subsist.SampleTasks.Master",
legendary: "PF2E.Actions.Subsist.SampleTasks.Legendary",
},
section: "skill",
slug: "subsist",
statistic: "",
Expand Down
7 changes: 7 additions & 0 deletions src/module/system/action-macros/performance/perform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ const action = new SingleCheckAction({
{ outcome: ["failure"], text: `${PREFIX}.Notes.failure` },
{ outcome: ["criticalFailure"], text: `${PREFIX}.Notes.criticalFailure` },
],
sampleTasks: {
untrained: `${PREFIX}.SampleTasks.Untrained`,
trained: `${PREFIX}.SampleTasks.Trained`,
expert: `${PREFIX}.SampleTasks.Expert`,
master: `${PREFIX}.SampleTasks.Master`,
legendary: `${PREFIX}.SampleTasks.Legendary`,
},
section: "skill",
slug: "perform",
statistic: "performance",
Expand Down
8 changes: 8 additions & 0 deletions src/scripts/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,14 @@ export const PF2ECONFIG = {
"PF2E.ProficiencyLevel4", // legendary
] as const,

proficiencyRanks: {
untrained: "PF2E.ProficiencyLevel0",
trained: "PF2E.ProficiencyLevel1",
expert: "PF2E.ProficiencyLevel2",
master: "PF2E.ProficiencyLevel3",
legendary: "PF2E.ProficiencyLevel4",
} as const,

actorSizes: sizeTypes,

actorTypes,
Expand Down
Loading