From 58e60e4da497d03ebd52062256d2559dc93659b6 Mon Sep 17 00:00:00 2001 From: Moritz Ruth Date: Fri, 27 Dec 2024 18:10:40 +0100 Subject: [PATCH] commit 05 --- package.json | 2 - pnpm-lock.yaml | 110 +------------------- public/objects/schüssel.png | Bin 0 -> 17997 bytes src/App.vue | 90 +++++++++++----- src/components/InteractionQueueItemCard.vue | 29 +++++- src/components/ObjectCard.vue | 2 +- src/components/ObjectPicture.vue | 2 +- src/game.ts | 39 +++++-- src/index.ts | 8 -- src/screens/AdminScreen.vue | 11 -- src/screens/DirectorScreen.vue | 70 +++++++++++++ src/screens/InteractionsScreen.vue | 6 +- src/screens/QueueScreen.vue | 51 ++++----- src/server/game.ts | 35 ++++++- src/server/trpc/director.ts | 26 ++++- src/shared/gameEvents.ts | 3 +- src/shared/util.ts | 7 +- vite.config.ts | 2 - 18 files changed, 286 insertions(+), 207 deletions(-) create mode 100644 public/objects/schüssel.png delete mode 100644 src/screens/AdminScreen.vue create mode 100644 src/screens/DirectorScreen.vue diff --git a/package.json b/package.json index 6c4576a..926467b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "typescript": "^5.7.2", "unplugin-icons": "^0.22.0", "vite": "^6.0.3", - "vite-plugin-pages": "^0.32.4", "vite-plugin-windicss": "^1.9.4", "windicss": "^3.5.6" }, @@ -46,7 +45,6 @@ "pinia": "^2.3.0", "superjson": "^2.2.2", "vue": "^3.5.13", - "vue-router": "^4.5.0", "ws": "^8.18.0", "zod": "^3.24.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 068618c..5fcca92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,9 +68,6 @@ importers: vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) - vue-router: - specifier: ^4.5.0 - version: 4.5.0(vue@3.5.13(typescript@5.7.2)) ws: specifier: ^8.18.0 version: 8.18.0(bufferutil@4.0.8) @@ -111,9 +108,6 @@ importers: vite: specifier: ^6.0.3 version: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1) - vite-plugin-pages: - specifier: ^0.32.4 - version: 0.32.4(@vue/compiler-sfc@3.5.13)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.2))) vite-plugin-windicss: specifier: ^1.9.4 version: 1.9.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1)) @@ -701,9 +695,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -725,9 +716,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} @@ -954,10 +942,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} @@ -1014,15 +998,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - esprima-extract-comments@1.1.0: - resolution: {integrity: sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw==} - engines: {node: '>=4'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1041,10 +1016,6 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - extract-comments@1.1.0: - resolution: {integrity: sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q==} - engines: {node: '>=6'} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1194,11 +1165,6 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -1323,10 +1289,6 @@ packages: package-manager-detector@0.2.7: resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} - parse-code-context@1.0.0: - resolution: {integrity: sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA==} - engines: {node: '>=6'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -1565,24 +1527,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-plugin-pages@0.32.4: - resolution: {integrity: sha512-OM8CNb8mAzyYR8ASRC0+2LXVB8ecR/5JHc5RpxbWtF+CmhjhmIELs0iV5y8qvU48soZbk+NsFOYlhoIcjw3+ew==} - peerDependencies: - '@solidjs/router': '*' - '@vue/compiler-sfc': ^2.7.0 || ^3.0.0 - react-router: '*' - vite: ^2.0.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - vue-router: '*' - peerDependenciesMeta: - '@solidjs/router': - optional: true - '@vue/compiler-sfc': - optional: true - react-router: - optional: true - vue-router: - optional: true - vite-plugin-windicss@1.9.4: resolution: {integrity: sha512-3t1AUVrs2XBXGc2BefRPRvy1CLy8qA/5A1J1Z73Ej1DIx+puXn39MQSWluxZ2FHEz8z9OEIvsoIIPc/s/P3OmQ==} peerDependencies: @@ -1639,11 +1583,6 @@ packages: '@vue/composition-api': optional: true - vue-router@4.5.0: - resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} - peerDependencies: - vue: ^3.2.0 - vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -2067,10 +2006,6 @@ snapshots: dependencies: '@types/node': 22.10.2 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - '@types/estree@1.0.6': {} '@types/express-serve-static-core@5.0.2': @@ -2097,8 +2032,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/ms@0.7.34': {} - '@types/node@22.10.2': dependencies: undici-types: 6.20.0 @@ -2334,8 +2267,6 @@ snapshots: depd@2.0.0: {} - dequal@2.0.3: {} - destr@2.0.3: {} destroy@1.2.0: {} @@ -2420,12 +2351,6 @@ snapshots: escape-html@1.0.3: {} - esprima-extract-comments@1.1.0: - dependencies: - esprima: 4.0.1 - - esprima@4.0.1: {} - estree-walker@2.0.2: {} etag@1.8.1: {} @@ -2480,11 +2405,6 @@ snapshots: transitivePeerDependencies: - supports-color - extract-comments@1.1.0: - dependencies: - esprima-extract-comments: 1.1.0 - parse-code-context: 1.0.0 - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2628,8 +2548,6 @@ snapshots: jiti@2.4.2: {} - json5@2.2.3: {} - kolorist@1.8.0: {} listhen@1.9.0: @@ -2736,8 +2654,6 @@ snapshots: package-manager-detector@0.2.7: {} - parse-code-context@1.0.0: {} - parseurl@1.3.3: {} path-key@3.1.1: {} @@ -2991,24 +2907,6 @@ snapshots: vary@1.1.2: {} - vite-plugin-pages@0.32.4(@vue/compiler-sfc@3.5.13)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.2))): - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.0 - dequal: 2.0.3 - extract-comments: 1.1.0 - fast-glob: 3.3.2 - json5: 2.2.3 - local-pkg: 0.5.1 - picocolors: 1.1.1 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1) - yaml: 2.6.1 - optionalDependencies: - '@vue/compiler-sfc': 3.5.13 - vue-router: 4.5.0(vue@3.5.13(typescript@5.7.2)) - transitivePeerDependencies: - - supports-color - vite-plugin-windicss@1.9.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.0)(tsx@4.19.2)(yaml@2.6.1)): dependencies: '@windicss/plugin-utils': 1.9.4 @@ -3036,11 +2934,6 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.7.2) - vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)): - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.7.2) - vue@3.5.13(typescript@5.7.2): dependencies: '@vue/compiler-dom': 3.5.13 @@ -3063,6 +2956,7 @@ snapshots: optionalDependencies: bufferutil: 4.0.8 - yaml@2.6.1: {} + yaml@2.6.1: + optional: true zod@3.24.1: {} diff --git a/public/objects/schüssel.png b/public/objects/schüssel.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4f63ebbe7c73065119adc131cb2bb825f527bb GIT binary patch literal 17997 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 literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue index df8228a..de8295f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,21 +6,16 @@ Verbindung wird hergestellt…
-
@@ -78,34 +74,76 @@ opacity: 0; } - .slide-down-enter-active, - .slide-down-leave-active { - position: absolute; - transition: 200ms ease; + .list-move, + .list-enter-active, + .list-leave-active { + transition: 400ms ease; transition-property: opacity, transform; } - .slide-down-enter-from, - .slide-down-leave-to { + .list-enter-from, + .list-leave-to { opacity: 0; - transform: translateY(40%); + transform: scale(0.9); + } + + .list-leave-active { + position: absolute; } diff --git a/src/components/InteractionQueueItemCard.vue b/src/components/InteractionQueueItemCard.vue index 8f58bcf..2452b19 100644 --- a/src/components/InteractionQueueItemCard.vue +++ b/src/components/InteractionQueueItemCard.vue @@ -5,7 +5,7 @@
-
+
{{ game.allObjectsById.get(item.interaction.objectId)!.label }}
@@ -13,27 +13,42 @@
-
-
+
+
{{ item.votes }}
Vote{{item.votes === 1 ? "" : "s" }}
+ +
@@ -44,13 +59,17 @@ \ No newline at end of file diff --git a/src/screens/DirectorScreen.vue b/src/screens/DirectorScreen.vue new file mode 100644 index 0000000..8715c13 --- /dev/null +++ b/src/screens/DirectorScreen.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/src/screens/InteractionsScreen.vue b/src/screens/InteractionsScreen.vue index d515b6a..9659781 100644 --- a/src/screens/InteractionsScreen.vue +++ b/src/screens/InteractionsScreen.vue @@ -16,9 +16,9 @@ @object-drop="onObjectInteractionDrop" />
-
+ -
+ diff --git a/src/screens/QueueScreen.vue b/src/screens/QueueScreen.vue index 97b4765..36c24d0 100644 --- a/src/screens/QueueScreen.vue +++ b/src/screens/QueueScreen.vue @@ -1,37 +1,40 @@ \ No newline at end of file diff --git a/src/server/game.ts b/src/server/game.ts index 6edebb8..c3ba59f 100644 --- a/src/server/game.ts +++ b/src/server/game.ts @@ -2,7 +2,7 @@ import EventEmitter from "eventemitter3" import type { GameEvent } from "../shared/gameEvents" import type { Interaction, InteractionQueueItem } from "../shared/script/types" import { script } from "../shared/script" -import { getInteractionQueueItemId } from "../shared/util" +import { findMatchingCombination, getInteractionQueueItemId } from "../shared/util" interface Events { "game-event": [GameEvent] @@ -59,11 +59,42 @@ export class Game extends EventEmitter { this.emit("game-event", { type: "room-changed", roomId }) } + activateInteractionQueueItem(id: string) { + const item = this.interactionQueue.get(id) + if (item === undefined) return + this.interactionQueue.delete(id) + this.emit("game-event", { type: "interaction-votes-changed", id, votes: 0 }) + switch (item.interaction.type) { + case "use": + this.emit("game-event", { type: "object-visibility-changed", id: item.interaction.objectId, isVisible: false }) + break + + case "combine": + const matchingCombination = findMatchingCombination(script.roomsById.get(this.currentRoomId)!.combinations, item.interaction.objectIds) + + if (matchingCombination !== undefined) { + matchingCombination.inputs.forEach(input => { + if (input.isConsumed) this.emit("game-event", { type: "object-visibility-changed", id: input.objectId, isVisible: false }) + }) + + matchingCombination.outputIds.forEach(outputId => { + this.emit("game-event", { type: "object-visibility-changed", id: outputId, isVisible: true }) + }) + } + + break + } + } + removeInteractionQueueItem(id: string) { if (!this.interactionQueue.has(id)) return - this.emit("game-event", { type: "interaction-votes-changed", id: id, votes: 0 }) + this.emit("game-event", { type: "interaction-votes-changed", id, votes: 0 }) this.interactionQueue.delete(id) } + + setObjectVisibility(id: string, isVisible: boolean) { + this.emit("game-event", { type: "object-visibility-changed", id, isVisible }) + } } export const game = new Game() \ No newline at end of file diff --git a/src/server/trpc/director.ts b/src/server/trpc/director.ts index 4705819..4763427 100644 --- a/src/server/trpc/director.ts +++ b/src/server/trpc/director.ts @@ -1,20 +1,38 @@ import { t } from "./base" import { z } from "zod" +import { game } from "../game" export const directorRouter = t.router({ switchRoom: t.procedure .input(z.object({ roomId: z.string() })) - .mutation(async ({ input, ctx }) => { - ctx.game.switchRoom(input.roomId) + .mutation(async ({ input }) => { + game.switchRoom(input.roomId) }), removeInteractionQueueItem: t.procedure .input(z.object({ id: z.string() })) - .mutation(async ({ input, ctx }) => { - ctx.game.removeInteractionQueueItem(input.id) + .mutation(async ({ input }) => { + game.removeInteractionQueueItem(input.id) + }), + + activateInteractionQueueItem: t.procedure + .input(z.object({ + id: z.string() + })) + .mutation(async ({ input }) => { + game.activateInteractionQueueItem(input.id) + }), + + setObjectVisibility: t.procedure + .input(z.object({ + id: z.string(), + isVisible: z.boolean() + })) + .mutation(async ({ input }) => { + game.setObjectVisibility(input.id, input.isVisible) }), }) \ No newline at end of file diff --git a/src/shared/gameEvents.ts b/src/shared/gameEvents.ts index a5daadc..b913d95 100644 --- a/src/shared/gameEvents.ts +++ b/src/shared/gameEvents.ts @@ -3,4 +3,5 @@ import type { InteractionQueueItem } from "./script/types" export type GameEvent = | { type: "room-changed"; roomId: string } | { type: "interaction-queued"; item: InteractionQueueItem } - | { type: "interaction-votes-changed"; id: string; votes: number } \ No newline at end of file + | { type: "interaction-votes-changed"; id: string; votes: number } + | { type: "object-visibility-changed"; id: string; isVisible: boolean } \ No newline at end of file diff --git a/src/shared/util.ts b/src/shared/util.ts index 4601d7c..da8195a 100644 --- a/src/shared/util.ts +++ b/src/shared/util.ts @@ -1,4 +1,5 @@ -import type { Interaction } from "./script/types" +import type { Combination, Interaction } from "./script/types" +import { isEqual } from "lodash-es" export const cSet = (...values: T[]) => new Set(values) export const cMap = (object: Record) => new Map(Object.entries(object)) @@ -9,4 +10,8 @@ export function getInteractionQueueItemId(interaction: Interaction) { else if (interaction.type === "combine") id = `combine-${[...interaction.objectIds].sort().join("_")}` else throw new Error("Unknown interaction type") return id +} + +export function findMatchingCombination(combinations: Set, objectIds: Set) { + return combinations.values().find(c => isEqual(new Set(c.inputs.values().map(i => i.objectId)), objectIds)) } \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index f33ee20..d175473 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,14 +1,12 @@ import { defineConfig } from "vite" import vuePlugin from "@vitejs/plugin-vue" import iconsPlugin from "unplugin-icons/vite" -import pagesPlugin from "vite-plugin-pages" import windiPlugin from "vite-plugin-windicss" export default defineConfig({ plugins: [ vuePlugin(), iconsPlugin(), - pagesPlugin(), windiPlugin() ], server: {