zenno: format

This commit is contained in:
2026-03-31 12:07:38 -04:00
parent 08deedea8f
commit 22ca5c98f3
15 changed files with 196 additions and 179 deletions

View File

@@ -1,25 +1,25 @@
<script lang="ts">
import { character } from '$lib/data/character'
import { character } from '$lib/data/character';
interface Props {
id: string
value: number
label?: string
region?: keyof typeof character
required?: boolean
}
interface Props {
id: string;
value: number;
label?: string;
region?: keyof typeof character;
required?: boolean;
}
let { id, value = $bindable(), label, region = 'global', required = false }: Props = $props()
let { id, value = $bindable(), label, region = 'global', required = false }: Props = $props();
</script>
{#if label}
<label for={id}>{label}</label>
<label for={id}>{label}</label>
{/if}
<select id={id} bind:value={value} required={required}>
{#if !required}
<option value=0></option>
{/if}
{#each character[region] as c}
<option value={c.chara_id}>{c.name}</option>
{/each}
<select {id} bind:value {required}>
{#if !required}
<option value="0"></option>
{/if}
{#each character[region] as c}
<option value={c.chara_id}>{c.name}</option>
{/each}
</select>

View File

@@ -1,5 +1,5 @@
import type { RegionalName } from '$lib/regional-name'
import globalJSON from '../../../../global/character.json'
import type { RegionalName } from '$lib/regional-name';
import globalJSON from '../../../../global/character.json';
/**
* Character definitions.
@@ -8,16 +8,19 @@ export interface Character {
/**
* Character ID.
*/
chara_id: number
chara_id: number;
/**
* Regional name of the character.
* E.g., Special Week for Global, or スペシャルウィーク for JP.
*/
name: string
name: string;
}
export const character = {
global: globalJSON as Character[],
}
global: globalJSON as Character[],
};
export const charaNames = globalJSON.reduce((m, c) => m.set(c.chara_id, {en: c.name}), new Map<Character['chara_id'], RegionalName>());
export const charaNames = globalJSON.reduce(
(m, c) => m.set(c.chara_id, { en: c.name }),
new Map<Character['chara_id'], RegionalName>(),
);

View File

@@ -1,5 +1,5 @@
import type { RegionalName } from '$lib/regional-name';
import globalJSON from '../../../../global/conversation.json'
import globalJSON from '../../../../global/conversation.json';
/**
* Lobby conversation data.
@@ -42,33 +42,36 @@ export interface Conversation {
export const conversation = {
global: globalJSON as Conversation[],
}
};
export const byChara = {
global: globalJSON.reduce((m, c) => m.set(c.chara_id, (m.get(c.chara_id) ?? []).concat(c as Conversation)), new Map<Conversation['chara_id'], Conversation[]>()),
}
global: globalJSON.reduce(
(m, c) => m.set(c.chara_id, (m.get(c.chara_id) ?? []).concat(c as Conversation)),
new Map<Conversation['chara_id'], Conversation[]>(),
),
};
export const locations: Record<Conversation['location'], {name: RegionalName, group: 1 | 2 | 3 | 4 | 5}> = {
110: {name: {en: 'right side front'}, group: 1},
120: {name: {en: 'right side front'}, group: 1},
130: {name: {en: 'right side front'}, group: 1},
210: {name: {en: 'left side table'}, group: 2},
220: {name: {en: 'left side table'}, group: 2},
310: {name: {en: 'center back seat'}, group: 3},
410: {name: {en: 'center posters'}, group: 4},
420: {name: {en: 'center posters'}, group: 4},
430: {name: {en: 'center posters'}, group: 4},
510: {name: {en: 'left side school map'}, group: 5},
520: {name: {en: 'left side school map'}, group: 5},
530: {name: {en: 'left side school map'}, group: 5},
}
export const locations: Record<Conversation['location'], { name: RegionalName; group: 1 | 2 | 3 | 4 | 5 }> = {
110: { name: { en: 'right side front' }, group: 1 },
120: { name: { en: 'right side front' }, group: 1 },
130: { name: { en: 'right side front' }, group: 1 },
210: { name: { en: 'left side table' }, group: 2 },
220: { name: { en: 'left side table' }, group: 2 },
310: { name: { en: 'center back seat' }, group: 3 },
410: { name: { en: 'center posters' }, group: 4 },
420: { name: { en: 'center posters' }, group: 4 },
430: { name: { en: 'center posters' }, group: 4 },
510: { name: { en: 'left side school map' }, group: 5 },
520: { name: { en: 'left side school map' }, group: 5 },
530: { name: { en: 'left side school map' }, group: 5 },
};
function locCharas(convos: Conversation[], locGroup: 1 | 2 | 3 | 4 | 5) {
const m = convos
.filter((c) => locations[c.location].group === locGroup)
.flatMap((c) => [c.chara_1, c.chara_2, c.chara_3].filter((x) => x != null))
.reduce((m, id) => m.set(id, 1 + (m.get(id) ?? 0)), new Map<number, number>())
return [...m].toSorted((a, b) => b[1] - a[1]) // descending
.reduce((m, id) => m.set(id, 1 + (m.get(id) ?? 0)), new Map<number, number>());
return [...m].toSorted((a, b) => b[1] - a[1]); // descending
}
export const groupPopulars = {
@@ -79,4 +82,4 @@ export const groupPopulars = {
4: locCharas(conversation.global, 4),
5: locCharas(conversation.global, 5),
},
}
};

View File

@@ -3,5 +3,5 @@
* Currently English is the only supported language.
*/
export interface RegionalName {
en: string
en: string;
}

View File

@@ -7,9 +7,7 @@ describe('Welcome.svelte', () => {
it('renders greetings for host and guest', async () => {
render(Welcome, { host: 'SvelteKit', guest: 'Vitest' });
await expect
.element(page.getByRole('heading', { level: 1 }))
.toHaveTextContent('Hello, SvelteKit!');
await expect.element(page.getByRole('heading', { level: 1 })).toHaveTextContent('Hello, SvelteKit!');
await expect.element(page.getByText('Hello, Vitest!')).toBeInTheDocument();
});
});