diff --git a/src/lib/components/collection/WeaponEditPane.svelte b/src/lib/components/collection/WeaponEditPane.svelte
index 1e91e251..999d5399 100644
--- a/src/lib/components/collection/WeaponEditPane.svelte
+++ b/src/lib/components/collection/WeaponEditPane.svelte
@@ -302,6 +302,7 @@
onChange={(bef) => {
befoulment = bef
}}
+ maxExorcismLevel={weaponData?.maxExorcismLevel}
/>
diff --git a/src/lib/components/sidebar/EditWeaponSidebar.svelte b/src/lib/components/sidebar/EditWeaponSidebar.svelte
index f78a582a..13f1bd85 100644
--- a/src/lib/components/sidebar/EditWeaponSidebar.svelte
+++ b/src/lib/components/sidebar/EditWeaponSidebar.svelte
@@ -328,6 +328,7 @@
onChange={(bef) => {
befoulment = bef
}}
+ maxExorcismLevel={weaponData?.maxExorcismLevel}
/>
diff --git a/src/lib/components/sidebar/edit/BefoulmentSelect.svelte b/src/lib/components/sidebar/edit/BefoulmentSelect.svelte
index 0fc3a02f..8c89236d 100644
--- a/src/lib/components/sidebar/edit/BefoulmentSelect.svelte
+++ b/src/lib/components/sidebar/edit/BefoulmentSelect.svelte
@@ -12,9 +12,11 @@
onChange?: (befoulment: Befoulment | null) => void
/** Language for display */
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()
@@ -44,15 +46,14 @@
return items
})
- // Exorcism level options (0-5)
- const exorcismOptions: Array<{ value: number; label: string }> = [
- { value: 0, label: 'Level 0 (Full Effect)' },
- { value: 1, label: 'Level 1' },
- { value: 2, label: 'Level 2' },
- { value: 3, label: 'Level 3' },
- { value: 4, label: 'Level 4' },
- { value: 5, label: 'Level 5 (Fully Exorcised)' }
- ]
+ // Exorcism level options (0 to maxExorcismLevel, fallback to 5)
+ const exorcismOptions = $derived.by(() => {
+ const max = maxExorcismLevel ?? 5
+ return Array.from({ length: max + 1 }, (_, i) => ({
+ value: i,
+ label: `Level ${i}`
+ }))
+ })
// Get suffix for display
function getSuffix(modifier: WeaponStatModifier | undefined): string {
diff --git a/src/lib/components/ui/DetailItem.svelte b/src/lib/components/ui/DetailItem.svelte
index 1163f836..98c26059 100644
--- a/src/lib/components/ui/DetailItem.svelte
+++ b/src/lib/components/ui/DetailItem.svelte
@@ -28,7 +28,9 @@
onchange,
width,
linkUrl,
- hasLinkButton = false
+ hasLinkButton = false,
+ min,
+ max
}: {
label: string
/** Secondary label displayed below the main label */
@@ -48,6 +50,10 @@
linkUrl?: string | null
/** Whether to show the link button (disabled when linkUrl is empty) */
hasLinkButton?: boolean
+ /** Minimum value for number inputs */
+ min?: number
+ /** Maximum value for number inputs */
+ max?: number
} = $props()
// For checkbox type, derive the checked state from value
@@ -110,6 +116,8 @@
contained={true}
{placeholder}
alignRight={true}
+ {min}
+ {max}
/>
{:else if type === 'date'}
diff --git a/src/lib/features/database/weapons/sections/WeaponStatsSection.svelte b/src/lib/features/database/weapons/sections/WeaponStatsSection.svelte
index ab2780bf..ee4cc5c4 100644
--- a/src/lib/features/database/weapons/sections/WeaponStatsSection.svelte
+++ b/src/lib/features/database/weapons/sections/WeaponStatsSection.svelte
@@ -193,6 +193,15 @@
type="number"
placeholder="0"
/>
+
{:else}
{#if weapon.maxSkillLevel}
@@ -201,5 +210,8 @@
{#if weapon.maxAwakeningLevel}
{/if}
+ {#if weapon.maxExorcismLevel != null}
+
+ {/if}
{/if}
diff --git a/src/lib/types/api/entities.ts b/src/lib/types/api/entities.ts
index 31047a8e..b5371d91 100644
--- a/src/lib/types/api/entities.ts
+++ b/src/lib/types/api/entities.ts
@@ -20,6 +20,7 @@ export interface Weapon {
maxLevel: number
maxSkillLevel: number
maxAwakeningLevel: number
+ maxExorcismLevel?: number | null
/** Weapon series - object with slug/name/flags */
series: WeaponSeriesRef | null
ax: boolean
diff --git a/src/routes/(app)/database/weapons/[granblueId]/edit/+page.svelte b/src/routes/(app)/database/weapons/[granblueId]/edit/+page.svelte
index 76dec8e3..fd83d041 100644
--- a/src/routes/(app)/database/weapons/[granblueId]/edit/+page.svelte
+++ b/src/routes/(app)/database/weapons/[granblueId]/edit/+page.svelte
@@ -87,6 +87,7 @@
maxLevel: 100,
maxSkillLevel: 10,
maxAwakeningLevel: 0,
+ maxExorcismLevel: null as number | null,
flb: false,
ulb: false,
transcendence: false,
@@ -134,6 +135,7 @@
maxLevel: weapon.maxLevel || 100,
maxSkillLevel: weapon.maxSkillLevel || 10,
maxAwakeningLevel: weapon.maxAwakeningLevel || 0,
+ maxExorcismLevel: weapon.maxExorcismLevel ?? null,
flb: weapon.uncap?.flb || false,
ulb: weapon.uncap?.ulb || false,
transcendence: weapon.uncap?.transcendence || false,
@@ -186,6 +188,7 @@
max_level: editData.maxLevel,
max_skill_level: editData.maxSkillLevel,
max_awakening_level: editData.maxAwakeningLevel,
+ max_exorcism_level: editData.maxExorcismLevel,
flb: editData.flb,
ulb: editData.ulb,
transcendence: editData.transcendence,
diff --git a/src/routes/(app)/database/weapons/import/+page.svelte b/src/routes/(app)/database/weapons/import/+page.svelte
index 23c8fa99..d4c8a8fe 100644
--- a/src/routes/(app)/database/weapons/import/+page.svelte
+++ b/src/routes/(app)/database/weapons/import/+page.svelte
@@ -121,6 +121,7 @@
maxLevel: suggestions?.maxLevel ?? 100,
maxSkillLevel: 10,
maxAwakeningLevel: 0,
+ maxExorcismLevel: null as number | null,
flb: suggestions?.flb ?? false,
ulb: suggestions?.ulb ?? false,
transcendence: suggestions?.transcendence ?? false,
@@ -281,6 +282,7 @@
max_level: formData.maxLevel,
max_skill_level: formData.maxSkillLevel,
max_awakening_level: formData.maxAwakeningLevel,
+ max_exorcism_level: formData.maxExorcismLevel,
flb: formData.flb,
ulb: formData.ulb,
transcendence: formData.transcendence,
diff --git a/src/routes/(app)/database/weapons/new/+page.svelte b/src/routes/(app)/database/weapons/new/+page.svelte
index 53bf4625..c4c3d192 100644
--- a/src/routes/(app)/database/weapons/new/+page.svelte
+++ b/src/routes/(app)/database/weapons/new/+page.svelte
@@ -75,6 +75,7 @@
maxLevel: 100,
maxSkillLevel: 10,
maxAwakeningLevel: 0,
+ maxExorcismLevel: null as number | null,
// Uncap
flb: false,
@@ -184,6 +185,7 @@
max_level: editData.maxLevel,
max_skill_level: editData.maxSkillLevel,
max_awakening_level: editData.maxAwakeningLevel,
+ max_exorcism_level: editData.maxExorcismLevel,
// Uncap
flb: editData.flb,