Add spell picker in the character sheet

This commit is contained in:
Clément Pons
2025-09-01 17:53:07 +02:00
parent c93cc4078c
commit 423df7bc42
9 changed files with 95 additions and 28 deletions

View File

@@ -2499,7 +2499,7 @@
{
"id": "9jq3pkj7sgfgq6q4ovwoanig6ha8g2ic",
"name": "Dévastation élémentaire",
"rank": 1,
"rank": 4,
"type": "precision",
"cost": 8,
"speed": "action",

View File

@@ -1,4 +1,4 @@
import type { Ability, Alignment, Character, CharacterConfig, CompiledCharacter, FeatureItem, Level, MainStat, Resistance, SpellElement, SpellType, TrainingLevel } from "~/types/character";
import type { Ability, Alignment, Character, CharacterConfig, CharacterVariables, CompiledCharacter, FeatureItem, Level, MainStat, Resistance, SpellElement, SpellType, TrainingLevel } from "~/types/character";
import { z } from "zod/v4";
import characterConfig from '#shared/character-config.json';
import { fakeA } from "#shared/proses";
@@ -293,6 +293,11 @@ export class CharacterCompiler
return substring;
})
}
variable<T extends keyof CharacterVariables>(prop: T, value: CharacterVariables[T])
{
this._character.variables[prop] = value;
this._result.variables[prop] = value;
}
protected add(feature?: string)
{
if(!feature)
@@ -1125,22 +1130,9 @@ class AspectPicker extends BuilderTab
}
static override validate(builder: CharacterBuilder): boolean
{
/* const physic = Object.values(builder.character.training['strength']).length + Object.values(builder.character.training['dexterity']).length + Object.values(builder.character.training['constitution']).length;
const mental = Object.values(builder.character.training['intelligence']).length + Object.values(builder.character.training['curiosity']).length;
const personality = Object.values(builder.character.training['charisma']).length + Object.values(builder.character.training['psyche']).length; */
if(builder.character.aspect === undefined)
return false;
/* const aspect = config.aspects[builder.character.aspect]!
if(physic > aspect.physic.max || physic < aspect.physic.min)
return false;
if(mental > aspect.mental.max || mental < aspect.mental.min)
return false;
if(personality > aspect.personality.max || personality < aspect.personality.min)
return false; */
return true;
}
}

View File

@@ -35,9 +35,18 @@ export function async(size: 'small' | 'normal' | 'large' = 'normal', fn: Promise
}
export function button(content: Node, onClick?: () => void, cls?: Class)
{
return dom('button', { class: [`text-light-100 dark:text-dark-100 font-semibold hover:bg-light-30 dark:hover:bg-dark-30 inline-flex items-center justify-center bg-light-25 dark:bg-dark-25 leading-none outline-none
const btn = dom('button', { class: [`text-light-100 dark:text-dark-100 font-semibold hover:bg-light-30 dark:hover:bg-dark-30 inline-flex items-center justify-center bg-light-25 dark:bg-dark-25 leading-none outline-none
border border-light-25 dark:border-dark-25 hover:border-light-30 dark:hover:border-dark-30 active:border-light-40 dark:active:border-dark-40 focus:shadow-raw transition-[box-shadow] focus:shadow-light-40 dark:focus:shadow-dark-40
disabled:bg-light-10 dark:disabled:bg-dark-10 disabled:border-none disabled:text-light-50 dark:disabled:text-dark-50`, cls], listeners: { click: onClick } }, [ content ]);
disabled:bg-light-10 dark:disabled:bg-dark-10 disabled:border-none disabled:text-light-50 dark:disabled:text-dark-50`, cls], listeners: { click: () => disabled || (onClick && onClick()) } }, [ content ]);
let disabled = false;
Object.defineProperty(btn, 'disabled', {
get: () => disabled,
set: (v) => {
disabled = !!v;
btn.toggleAttribute('disabled', disabled);
}
})
return btn;
}
export type Option<T> = { text: string, render?: () => HTMLElement, value: T | Option<T>[] } | undefined;
type StoredOption<T> = { item: Option<T>, dom: HTMLElement, container?: HTMLElement, children?: Array<StoredOption<T>> };

View File

@@ -3,7 +3,7 @@ import characterConfig from '#shared/character-config.json';
const config = characterConfig as CharacterConfig;
export function getText(id?: i18nID, lang?: string)
export function getText(id?: i18nID, lang?: string): string
{
return id ? (config.texts.hasOwnProperty(id) ? config.texts[id][lang ?? "default"] : '') : undefined;
return id ? (config.texts.hasOwnProperty(id) ? config.texts[id][lang ?? "default"] : '') : '';
}

View File

@@ -29,7 +29,7 @@ function renderContent(node: RootContent, proses: Record<string, Prose>): Node
{
const children = node.children.map(e => renderContent(e, proses)), properties = { ...node.properties, class: node.properties.className as string | string[] };
if(node.tagName in proses)
return prose(node.tagName, proses[node.tagName], children, properties);
return prose(node.tagName, proses[node.tagName] ?? { class: '' }, children, properties);
else
return dom(node.tagName as keyof HTMLElementTagNameMap, properties, children);
}