zenno/doc/spark: spark explorer
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
<script lang="ts">
|
||||
import * as skill from '$lib/data/skill';
|
||||
import * as spark from '$lib/data/spark';
|
||||
import { onMount } from 'svelte';
|
||||
import { SvelteMap } from 'svelte/reactivity';
|
||||
|
||||
let sparks: spark.Spark[] = $state([]);
|
||||
let skills: SvelteMap<number, skill.Skill> = new SvelteMap();
|
||||
onMount(async () => {
|
||||
const [sp, sk] = await Promise.all([spark.sparks(), skill.skills()]);
|
||||
sparks = sp;
|
||||
for (const s of sk) {
|
||||
skills.set(s.skill_id, s);
|
||||
}
|
||||
});
|
||||
|
||||
let group = $state(1);
|
||||
|
||||
const groups = $derived.by(() => {
|
||||
const m = new Map<number, spark.Spark[]>();
|
||||
for (const s of sparks) {
|
||||
const l = m.get(s.spark_group) ?? [];
|
||||
l.push(s);
|
||||
m.set(s.spark_group, l);
|
||||
}
|
||||
return [...m.entries()];
|
||||
});
|
||||
function describe(eff: spark.Effect) {
|
||||
if (eff.target === spark.Target.Skill) {
|
||||
const sk = skills.get(eff.value1);
|
||||
return `${sk?.name} ${spark.TARGET_NAMES[eff.target]} +${eff.value2}`;
|
||||
}
|
||||
return `${spark.TARGET_NAMES[eff.target]} +${eff.value1}`;
|
||||
}
|
||||
const cur = $derived(sparks.find((s) => s.spark_group === group));
|
||||
const curEffectGroups = $derived(cur?.effects ?? []);
|
||||
const curDescriptions = $derived(curEffectGroups.map((g) => g.map((e) => describe(e))));
|
||||
</script>
|
||||
|
||||
<h1 class="text-4xl">Spark Explorer</h1>
|
||||
<form class="mx-auto mt-8 p-4 rounded-md text-center shadow-md ring md:max-w-2xl">
|
||||
<select class="w-full" bind:value={group}>
|
||||
{#each groups as [id, s] (id)}
|
||||
<option value={id}>{s[0].name}</option>
|
||||
{/each}
|
||||
</select>
|
||||
</form>
|
||||
<svelte:boundary>
|
||||
<div class="mx-auto mt-8 max-w-md flex-1 flex-col rounded-md border p-2 text-center shadow-sm transition-shadow hover:shadow-md">
|
||||
<span class="block text-xl">{cur?.name}</span>
|
||||
<span class="block">{cur?.description}</span>
|
||||
</div>
|
||||
<table class="mx-auto w-full max-w-xl mt-8 table-fixed">
|
||||
<caption class="text-xl">Possible Effects</caption>
|
||||
<tbody>
|
||||
{#each curDescriptions as s (s)}
|
||||
<tr class="text-center even:bg-mist-300 dark:even:bg-mist-900">
|
||||
<td>
|
||||
{#each s as n (n)}
|
||||
<span class="block">{n}</span>
|
||||
{/each}
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{#snippet pending()}
|
||||
<div>Loading data...</div>
|
||||
{/snippet}
|
||||
</svelte:boundary>
|
||||
Reference in New Issue
Block a user