Skip to content

Commit 19d7d10

Browse files
authored
Fix broken script when json is not in TF/O/M/D order (#75)
Seems like this is a known issue from when parseJson was first implemented in #8. > Behavior is undefined if not entered in order of all characters of each category in order Townsfolk, Outsiders, Minion, Demon It's an easy fix, just do a stable-sort in TF/O/M/D order. Tested with a randomly shuffled TB script: `http://localhost:5173/script.html?json=[{"id": "mayor"}, {"id": "poisoner"}, {"id": "investigator"}, {"id": "soldier"}, {"id": "undertaker"}, {"id": "spy"}, {"id": "virgin"}, {"id": "empath"}, {"id": "butler"}, {"id": "slayer"}, {"id": "monk"}, {"id": "_meta", "name": "Trouble Brewing"}, {"id": "recluse"}, {"id": "baron"}, {"id": "saint"}, {"id": "scarletwoman"}, {"id": "washerwoman"}, {"id": "fortuneteller"}, {"id": "chef"}, {"id": "ravenkeeper"}, {"id": "imp"}, {"id": "drunk"}, {"id": "librarian"}]` <img width="1049" height="1276" alt="image" src="https://github.com/user-attachments/assets/64de3a15-5de1-4556-bf79-881a2f126730" />
1 parent dc2d752 commit 19d7d10

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

src/js/botc/roles.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export interface NightAction {
2525
index: number;
2626
}
2727

28-
const RoleTypes = [
28+
export const RoleTypes = [
2929
"townsfolk",
3030
"outsider",
3131
"minion",

src/js/select_script.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { roles, nameToId, RoleTypes } from "./botc/roles";
12
import { ScriptData, ScriptsFile } from "./botc/script";
23
import { decompressScriptJson } from "./compression";
34
import { getScripts } from "./get_scripts";
@@ -27,6 +28,12 @@ interface ScriptCharacter {
2728
id: string;
2829
}
2930

31+
function charSortKey(char: string): number {
32+
const roleType = roles.get(nameToId(char))?.roleType ?? "";
33+
const index = RoleTypes.indexOf(roleType as (typeof RoleTypes)[number]);
34+
return index === -1 ? 999 : index;
35+
}
36+
3037
export function parseJson(json: string): ScriptData {
3138
const decompressedJson = decompressScriptJson(json);
3239
const parsed: (ScriptMeta | ScriptCharacter | string)[] =
@@ -37,7 +44,8 @@ export function parseJson(json: string): ScriptData {
3744
)!;
3845
const characters = parsed
3946
.filter((item): item is ScriptCharacter | string => item !== meta)
40-
.map((item) => (typeof item === "string" ? item : item.id));
47+
.map((item) => (typeof item === "string" ? item : item.id))
48+
.sort((a, b) => charSortKey(a) - charSortKey(b));
4149

4250
return {
4351
pk: 0,

0 commit comments

Comments
 (0)