Release v0.1.3 2026-07-11

This commit is contained in:
Warren H
2026-07-11 23:23:02 -04:00
parent 076f6cf97c
commit b48b3a4f8f
103 changed files with 6708 additions and 454 deletions
+26 -2
View File
@@ -6,6 +6,7 @@ import type { AppScreen } from "../frontend/types";
import { FrontEnd } from "../components/FrontEnd";
import { createDualScreenChannel, type DualScreenMessage, type FrontendCommand, type GameCommand } from "./dualScreenSync";
import type { BossId } from "../game/types";
import type { DifficultySlug } from "../game/progression/loot";
import { useForcedThorDisplays } from "./useThorDualScreen";
import { createRateLimitedPublisher } from "./rateLimitedPublisher";
@@ -18,6 +19,7 @@ function screenTitle(screen: AppScreen) {
case "saves": return "Choose hunter save";
case "home": return "Choose expedition";
case "profile": return "Hunter profile";
case "gear": return "Gear upgrade";
case "settings": return "Field settings";
case "mode": return "Prepare encounter";
case "game": return "Field console";
@@ -64,8 +66,8 @@ export function BottomDisplayApp() {
channelRef.current?.postMessage({ type: "frontend-command", command } satisfies DualScreenMessage);
}, []);
const launchGame = useCallback((bossIds: readonly BossId[]) => {
postFrontendCommand({ name: "launchGame", bossIds });
const launchGame = useCallback((bossIds: readonly BossId[], difficultySlug?: DifficultySlug) => {
postFrontendCommand({ name: "launchGame", bossIds, difficultySlug });
}, [postFrontendCommand]);
useEffect(() => {
@@ -115,6 +117,23 @@ export function BottomDisplayApp() {
downloadSlot: (slotId) => postFrontend({ name: "downloadSlot", slotId }),
selectMode: (mode) => postFrontend({ name: "selectMode", mode }),
selectBoss: (bossId) => postFrontend({ name: "selectBoss", bossId }),
selectDifficulty: (difficultySlug) => postFrontend({ name: "selectDifficulty", difficultySlug }),
selectGearOwner: (ownerId) => postFrontend({ name: "selectGearOwner", ownerId }),
selectGearSlot: (slotId) => postFrontend({ name: "selectGearSlot", slotId }),
selectGearWorkshopMode: (mode) => postFrontend({ name: "selectGearWorkshopMode", mode }),
selectInfusion: (infusionId) => postFrontend({ name: "selectInfusion", infusionId }),
upgradeSelectedGear: () => {
postFrontend({ name: "upgradeSelectedGear" });
return false;
},
equipSelectedInfusion: () => {
postFrontend({ name: "equipSelectedInfusion" });
return false;
},
equipPassiveInfusion: (passiveId) => {
postFrontend({ name: "equipPassiveInfusion", passiveId });
return false;
},
selectHealerClass: (classId) => postFrontend({ name: "selectHealerClass", classId }),
updateSetting: (key, value) => postFrontend({ name: "updateSetting", key, value }),
});
@@ -131,6 +150,11 @@ export function BottomDisplayApp() {
selectItem: (itemId) => postCommand({ name: "selectItem", itemId }),
setPaused: (paused) => postCommand({ name: "setPaused", paused }),
setPauseSelection: (selection) => postCommand({ name: "setPauseSelection", selection }),
setSelectedRunBuff: (buffId) => postCommand({ name: "setSelectedRunBuff", buffId }),
chooseRunBuff: (buffId) => {
postCommand({ name: "chooseRunBuff", buffId });
return false;
},
});
channel.onmessage = (event: MessageEvent<DualScreenMessage>) => {
if (event.data.type === "authoritative-ready") {