summaryrefslogtreecommitdiff
path: root/src/engine/systems
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth@simponic.xyz>2025-03-01 12:36:47 -0700
committerElizabeth Hunt <elizabeth@simponic.xyz>2025-03-01 12:36:47 -0700
commit8dacee8f73633131fd68935c1e2493dc4beec837 (patch)
treefc9adf76fce4761b01208ba2f44e72a6838244aa /src/engine/systems
parentd903bd9a13e790cf42c84c3dc59bf89ffeae1d80 (diff)
downloadthe-abstraction-engine-8dacee8f73633131fd68935c1e2493dc4beec837.tar.gz
the-abstraction-engine-8dacee8f73633131fd68935c1e2493dc4beec837.zip
updates
Diffstat (limited to 'src/engine/systems')
-rw-r--r--src/engine/systems/Modal.ts93
-rw-r--r--src/engine/systems/SystemNames.ts1
-rw-r--r--src/engine/systems/index.ts1
3 files changed, 95 insertions, 0 deletions
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<ModalComponent>(
+ ComponentNames.Modal
+ );
+ if (this.openingEntity) {
+ return;
+ }
+
+ this.openingEntity = entity;
+ SOUNDS.get(ModalOpen.name)!.play();
+
+ if (modalComponent.initState.type === "CONTENT") {
+ const content = `
+ <div style="text-align:center">
+ <div>${modalComponent.initState.contentInit!.content}</div>
+ <br>
+ <button id="close">Close</button>
+ </div>`;
+ 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