From 8dacee8f73633131fd68935c1e2493dc4beec837 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sat, 1 Mar 2025 12:36:47 -0700 Subject: updates --- src/engine/systems/Modal.ts | 93 +++++++++++++++++++++++++++++++++++++++ src/engine/systems/SystemNames.ts | 1 + src/engine/systems/index.ts | 1 + 3 files changed, 95 insertions(+) create mode 100644 src/engine/systems/Modal.ts (limited to 'src/engine/systems') diff --git a/src/engine/systems/Modal.ts b/src/engine/systems/Modal.ts new file mode 100644 index 0000000..7643a73 --- /dev/null +++ b/src/engine/systems/Modal.ts @@ -0,0 +1,93 @@ +import { Game } from ".."; +import { System, SystemNames } from "."; +import { Miscellaneous, ModalClose, ModalOpen, SOUNDS } from "../config"; +import { ComponentNames, Modal as ModalComponent } from "../components"; +import { Entity } from "../entities"; +import { + CodeConsumer, + CodeEditorInstance, + CodeEditorSingleton, + ModalInstance, + ModalSingleton, +} from "../utils"; + +export interface ModalInitState { + type: "CONTENT" | "CODE_EDITOR"; + contentInit?: { + content: string; + }; + codeInit?: { + code: string; + codeConsumer: CodeConsumer; + readonly?: boolean; + result?: { data?: string; error?: string }; + }; +} + +export class Modal extends System { + private openingEntity: null | Entity = null; + private modalInstance: ModalInstance = ModalSingleton; + private codeEditorInstance: CodeEditorInstance = CodeEditorSingleton; + + constructor() { + super(SystemNames.Modal); + } + + public update(_dt: number, game: Game) { + if (this.openingEntity) { + if (this.openingEntity.hasComponent(ComponentNames.Modal)) { + return; + } + this.closeCallback(); + } + + game.forEachEntityWithComponent(ComponentNames.Modal, (entity) => { + const modalComponent = entity.getComponent( + ComponentNames.Modal + ); + if (this.openingEntity) { + return; + } + + this.openingEntity = entity; + SOUNDS.get(ModalOpen.name)!.play(); + + if (modalComponent.initState.type === "CONTENT") { + const content = ` +
+
${modalComponent.initState.contentInit!.content}
+
+ +
`; + this.modalInstance.open(content); + document + .getElementById("close") + ?.addEventListener("click", this.closeCallback.bind(this)); + } + + if (modalComponent.initState.type === "CODE_EDITOR") { + this.codeEditorInstance.open( + modalComponent.initState.codeInit!.code, + (code) => { + const result = + modalComponent.initState.codeInit!.codeConsumer(code); + if (result.consumed) { + this.closeCallback(); + } + return result; + }, + !!modalComponent.initState.codeInit!.readonly, + modalComponent.initState.codeInit!.result, + ); + } + }); + } + + private closeCallback() { + this.openingEntity = null; + this.modalInstance.vanish(); + this.codeEditorInstance.close(); + document.getElementById(Miscellaneous.CANVAS_ID)!.focus(); + SOUNDS.get(ModalClose.name)!.play(); + } +} diff --git a/src/engine/systems/SystemNames.ts b/src/engine/systems/SystemNames.ts index 63f83a4..430ee48 100644 --- a/src/engine/systems/SystemNames.ts +++ b/src/engine/systems/SystemNames.ts @@ -8,4 +8,5 @@ export namespace SystemNames { export const Life = "Life"; export const Music = "Music"; export const Level = "Level"; + export const Modal = "Modal"; } diff --git a/src/engine/systems/index.ts b/src/engine/systems/index.ts index 29dbc7e..75b548d 100644 --- a/src/engine/systems/index.ts +++ b/src/engine/systems/index.ts @@ -9,3 +9,4 @@ export * from "./Collision"; export * from "./Life"; export * from "./Music"; export * from "./Level"; +export * from "./Modal"; \ No newline at end of file -- cgit v1.2.3-70-g09d2