add maxExorcismLevel to weapon database pages

- add to Weapon type
- add field to WeaponStatsSection (min: 1)
- add to new/edit/import page payloads
This commit is contained in:
Justin Edmund 2026-01-04 01:22:37 -08:00
parent 23527c727e
commit cfa9e5d389
9 changed files with 42 additions and 11 deletions

View file

@ -302,6 +302,7 @@
onChange={(bef) => { onChange={(bef) => {
befoulment = bef befoulment = bef
}} }}
maxExorcismLevel={weaponData?.maxExorcismLevel}
/> />
</div> </div>
</DetailsSection> </DetailsSection>

View file

@ -328,6 +328,7 @@
onChange={(bef) => { onChange={(bef) => {
befoulment = bef befoulment = bef
}} }}
maxExorcismLevel={weaponData?.maxExorcismLevel}
/> />
</div> </div>
</DetailsSection> </DetailsSection>

View file

@ -12,9 +12,11 @@
onChange?: (befoulment: Befoulment | null) => void onChange?: (befoulment: Befoulment | null) => void
/** Language for display */ /** Language for display */
locale?: 'en' | 'ja' locale?: 'en' | 'ja'
/** Maximum exorcism level for this weapon (from weapon's maxExorcismLevel) */
maxExorcismLevel?: number | null
} }
let { currentBefoulment = null, onChange, locale = 'en' }: Props = $props() let { currentBefoulment = null, onChange, locale = 'en', maxExorcismLevel = null }: Props = $props()
const { befoulments, findBefoulment, isLoading } = useWeaponStatModifiers() const { befoulments, findBefoulment, isLoading } = useWeaponStatModifiers()
@ -44,15 +46,14 @@
return items return items
}) })
// Exorcism level options (0-5) // Exorcism level options (0 to maxExorcismLevel, fallback to 5)
const exorcismOptions: Array<{ value: number; label: string }> = [ const exorcismOptions = $derived.by(() => {
{ value: 0, label: 'Level 0 (Full Effect)' }, const max = maxExorcismLevel ?? 5
{ value: 1, label: 'Level 1' }, return Array.from({ length: max + 1 }, (_, i) => ({
{ value: 2, label: 'Level 2' }, value: i,
{ value: 3, label: 'Level 3' }, label: `Level ${i}`
{ value: 4, label: 'Level 4' }, }))
{ value: 5, label: 'Level 5 (Fully Exorcised)' } })
]
// Get suffix for display // Get suffix for display
function getSuffix(modifier: WeaponStatModifier | undefined): string { function getSuffix(modifier: WeaponStatModifier | undefined): string {

View file

@ -28,7 +28,9 @@
onchange, onchange,
width, width,
linkUrl, linkUrl,
hasLinkButton = false hasLinkButton = false,
min,
max
}: { }: {
label: string label: string
/** Secondary label displayed below the main label */ /** Secondary label displayed below the main label */
@ -48,6 +50,10 @@
linkUrl?: string | null linkUrl?: string | null
/** Whether to show the link button (disabled when linkUrl is empty) */ /** Whether to show the link button (disabled when linkUrl is empty) */
hasLinkButton?: boolean hasLinkButton?: boolean
/** Minimum value for number inputs */
min?: number
/** Maximum value for number inputs */
max?: number
} = $props() } = $props()
// For checkbox type, derive the checked state from value // For checkbox type, derive the checked state from value
@ -110,6 +116,8 @@
contained={true} contained={true}
{placeholder} {placeholder}
alignRight={true} alignRight={true}
{min}
{max}
/> />
{:else if type === 'date'} {:else if type === 'date'}
<DatePicker bind:value={value as string | null} contained={true} {placeholder} /> <DatePicker bind:value={value as string | null} contained={true} {placeholder} />

View file

@ -193,6 +193,15 @@
type="number" type="number"
placeholder="0" placeholder="0"
/> />
<DetailItem
label="Max Exorcism Level"
sublabel="For befoulment weapons only"
bind:value={editData.maxExorcismLevel}
editable={true}
type="number"
placeholder="—"
min={1}
/>
{:else} {:else}
<DetailItem label="Max Level" value={weapon.maxLevel} /> <DetailItem label="Max Level" value={weapon.maxLevel} />
{#if weapon.maxSkillLevel} {#if weapon.maxSkillLevel}
@ -201,5 +210,8 @@
{#if weapon.maxAwakeningLevel} {#if weapon.maxAwakeningLevel}
<DetailItem label="Max Awakening Level" value={weapon.maxAwakeningLevel} /> <DetailItem label="Max Awakening Level" value={weapon.maxAwakeningLevel} />
{/if} {/if}
{#if weapon.maxExorcismLevel != null}
<DetailItem label="Max Exorcism Level" value={weapon.maxExorcismLevel} />
{/if}
{/if} {/if}
</DetailsContainer> </DetailsContainer>

View file

@ -20,6 +20,7 @@ export interface Weapon {
maxLevel: number maxLevel: number
maxSkillLevel: number maxSkillLevel: number
maxAwakeningLevel: number maxAwakeningLevel: number
maxExorcismLevel?: number | null
/** Weapon series - object with slug/name/flags */ /** Weapon series - object with slug/name/flags */
series: WeaponSeriesRef | null series: WeaponSeriesRef | null
ax: boolean ax: boolean

View file

@ -87,6 +87,7 @@
maxLevel: 100, maxLevel: 100,
maxSkillLevel: 10, maxSkillLevel: 10,
maxAwakeningLevel: 0, maxAwakeningLevel: 0,
maxExorcismLevel: null as number | null,
flb: false, flb: false,
ulb: false, ulb: false,
transcendence: false, transcendence: false,
@ -134,6 +135,7 @@
maxLevel: weapon.maxLevel || 100, maxLevel: weapon.maxLevel || 100,
maxSkillLevel: weapon.maxSkillLevel || 10, maxSkillLevel: weapon.maxSkillLevel || 10,
maxAwakeningLevel: weapon.maxAwakeningLevel || 0, maxAwakeningLevel: weapon.maxAwakeningLevel || 0,
maxExorcismLevel: weapon.maxExorcismLevel ?? null,
flb: weapon.uncap?.flb || false, flb: weapon.uncap?.flb || false,
ulb: weapon.uncap?.ulb || false, ulb: weapon.uncap?.ulb || false,
transcendence: weapon.uncap?.transcendence || false, transcendence: weapon.uncap?.transcendence || false,
@ -186,6 +188,7 @@
max_level: editData.maxLevel, max_level: editData.maxLevel,
max_skill_level: editData.maxSkillLevel, max_skill_level: editData.maxSkillLevel,
max_awakening_level: editData.maxAwakeningLevel, max_awakening_level: editData.maxAwakeningLevel,
max_exorcism_level: editData.maxExorcismLevel,
flb: editData.flb, flb: editData.flb,
ulb: editData.ulb, ulb: editData.ulb,
transcendence: editData.transcendence, transcendence: editData.transcendence,

View file

@ -121,6 +121,7 @@
maxLevel: suggestions?.maxLevel ?? 100, maxLevel: suggestions?.maxLevel ?? 100,
maxSkillLevel: 10, maxSkillLevel: 10,
maxAwakeningLevel: 0, maxAwakeningLevel: 0,
maxExorcismLevel: null as number | null,
flb: suggestions?.flb ?? false, flb: suggestions?.flb ?? false,
ulb: suggestions?.ulb ?? false, ulb: suggestions?.ulb ?? false,
transcendence: suggestions?.transcendence ?? false, transcendence: suggestions?.transcendence ?? false,
@ -281,6 +282,7 @@
max_level: formData.maxLevel, max_level: formData.maxLevel,
max_skill_level: formData.maxSkillLevel, max_skill_level: formData.maxSkillLevel,
max_awakening_level: formData.maxAwakeningLevel, max_awakening_level: formData.maxAwakeningLevel,
max_exorcism_level: formData.maxExorcismLevel,
flb: formData.flb, flb: formData.flb,
ulb: formData.ulb, ulb: formData.ulb,
transcendence: formData.transcendence, transcendence: formData.transcendence,

View file

@ -75,6 +75,7 @@
maxLevel: 100, maxLevel: 100,
maxSkillLevel: 10, maxSkillLevel: 10,
maxAwakeningLevel: 0, maxAwakeningLevel: 0,
maxExorcismLevel: null as number | null,
// Uncap // Uncap
flb: false, flb: false,
@ -184,6 +185,7 @@
max_level: editData.maxLevel, max_level: editData.maxLevel,
max_skill_level: editData.maxSkillLevel, max_skill_level: editData.maxSkillLevel,
max_awakening_level: editData.maxAwakeningLevel, max_awakening_level: editData.maxAwakeningLevel,
max_exorcism_level: editData.maxExorcismLevel,
// Uncap // Uncap
flb: editData.flb, flb: editData.flb,