diff options
Diffstat (limited to 'client/src/akkamon')
| -rw-r--r-- | client/src/akkamon/client/Client.ts | 23 | ||||
| -rw-r--r-- | client/src/akkamon/client/EventType.ts | 3 | ||||
| -rw-r--r-- | client/src/akkamon/client/IncomingEvents.ts | 2 | ||||
| -rw-r--r-- | client/src/akkamon/client/InteractionEngine.ts | 34 | ||||
| -rw-r--r-- | client/src/akkamon/client/OutgoingEvents.ts | 11 | ||||
| -rw-r--r-- | client/src/akkamon/scenes/UIElement.ts | 26 | ||||
| -rw-r--r-- | client/src/akkamon/scenes/WorldScene.ts | 5 |
7 files changed, 94 insertions, 10 deletions
diff --git a/client/src/akkamon/client/Client.ts b/client/src/akkamon/client/Client.ts index 1591347..0e7e8c3 100644 --- a/client/src/akkamon/client/Client.ts +++ b/client/src/akkamon/client/Client.ts @@ -38,7 +38,8 @@ import type { import { HeartBeatReplyEvent, Interaction, - OutgoingInteractionRequestEvent + OutgoingInteractionRequestEvent, + InteractionReplyEvent } from './OutgoingEvents'; @@ -94,6 +95,14 @@ export class Client implements AkkamonClient console.log(event); this.interactionEngine!.push(event as IncomingInteractionRequest); break; + case EventType.INTERACTION_START: + console.log("Received interaction starting event!"); + console.log(event); + if (!this.interactionEngine!.getWaitingForInteractionToStart()) { + this.interactionEngine!.setWaitingForInteractionToStart(true); + this.interactionEngine!.setWaitingDialogue(`Waiting for ${event.interactionType!} to start...`); + } + break; default: console.log("ignored incoming event, doesn't match EventType interface."); console.log(event.type); @@ -222,4 +231,16 @@ export class Client implements AkkamonClient getCurrentSceneKey() { return this.scene!.scene.key; } + + sendInteractionReply(value: boolean, requestName: string) { + console.log("Sending interaction reply event!"); + this.interactionEngine!.setAnswering(false); + this.interactionEngine!.setWaitingForInteractionToStart(true); + this.send(new InteractionReplyEvent( + this.getSessionTrainerId()!, + this.getCurrentSceneKey()!, + requestName, + value + )); + } } diff --git a/client/src/akkamon/client/EventType.ts b/client/src/akkamon/client/EventType.ts index 7d6d483..de296e0 100644 --- a/client/src/akkamon/client/EventType.ts +++ b/client/src/akkamon/client/EventType.ts @@ -11,6 +11,7 @@ export enum EventType { NEW_TILE_POS = "NewTilePos", INTERACTION_REQUEST = "InteractionRequestEvent", INTERACTION_REPLY = "InteractionReplyEvent", - INTERACTION_ABORTED = "InteractionAbortedEvent" + INTERACTION_ABORTED = "InteractionAbortedEvent", + INTERACTION_START = "InteractionStarting" } diff --git a/client/src/akkamon/client/IncomingEvents.ts b/client/src/akkamon/client/IncomingEvents.ts index 0674c1c..1145b4c 100644 --- a/client/src/akkamon/client/IncomingEvents.ts +++ b/client/src/akkamon/client/IncomingEvents.ts @@ -7,6 +7,8 @@ export interface IncomingEvent extends AkkamonEvent { remoteMovementQueues?:{[trainerId: string]: { value: Array<Direction> }} trainerId?: string requestId?: number + requestName?: string + interactionType?: string } export class IncomingInteractionRequest implements IncomingEvent { diff --git a/client/src/akkamon/client/InteractionEngine.ts b/client/src/akkamon/client/InteractionEngine.ts index cf0c947..f54ced4 100644 --- a/client/src/akkamon/client/InteractionEngine.ts +++ b/client/src/akkamon/client/InteractionEngine.ts @@ -13,7 +13,6 @@ import type { IncomingInteractionRequest } from './IncomingEvents'; - export class InteractionEngine extends AkkamonEngine { private scene: WorldScene; @@ -28,21 +27,30 @@ export class InteractionEngine extends AkkamonEngine { private answering: boolean = false; + private waitingForInteractionToStart: boolean = false; + constructor(scene: WorldScene) { super(); this.scene = scene; } playerIsBusy() { - return this.waitingForResponseOf || this.awaitingInit || this.answering + return this.waitingForResponseOf || this.awaitingInit || this.answering; } update() { if (!this.requestBackLog.isEmpty() && !this.playerIsBusy() && this.scene.menus.isEmpty()) { + let message = this.requestBackLog.pop(); - this.scene.pushMenu(new InteractionRequestDialogue(this.scene, ["YES", "NO"], {name: message!.trainerId, requestType: message!.type})); + + this.answering = true; + this.scene.pushMenu(new InteractionRequestDialogue(this.scene, ["YES", "NO"], + {name: message!.trainerId, + requestType: message!.interactionType, + requestName: message!.requestName} + )); } } @@ -54,9 +62,8 @@ export class InteractionEngine extends AkkamonEngine { // check trainerId if (this.awaitingInit) { this.waitingForResponseOf = event.requestName; - this.scene.clearMenus(); - this.scene.pushMenu(new WaitingDialogue(this.scene, new Phaser.GameObjects.Group(this.scene), 20, 'Awaiting player response...')); + (this.scene.menus.peek()! as WaitingDialogue).text = 'Awaiting player response...'; this.awaitingInit = false; } else { @@ -64,4 +71,21 @@ export class InteractionEngine extends AkkamonEngine { } } + setAnswering(value: boolean) { + this.answering = value; + } + + setWaitingForInteractionToStart(value: boolean) { + this.waitingForInteractionToStart = value; + } + + getWaitingForInteractionToStart() { + return this.waitingForInteractionToStart; + } + + setWaitingDialogue(text: string) { + this.scene.clearMenus(); + this.scene.pushMenu(new WaitingDialogue(this.scene, new Phaser.GameObjects.Group(this.scene), 20, text)); + } + } diff --git a/client/src/akkamon/client/OutgoingEvents.ts b/client/src/akkamon/client/OutgoingEvents.ts index 90b72c6..9feb49b 100644 --- a/client/src/akkamon/client/OutgoingEvents.ts +++ b/client/src/akkamon/client/OutgoingEvents.ts @@ -76,3 +76,14 @@ export class OutgoingInteractionRequestEvent implements InteractionEvent { ) { } } +export class InteractionReplyEvent implements AkkamonEvent { + public type: EventType = EventType.INTERACTION_REPLY; + + constructor( + public trainerId: string, + public sceneId: string, + public requestName: string, + public value: boolean + ) { } +} + diff --git a/client/src/akkamon/scenes/UIElement.ts b/client/src/akkamon/scenes/UIElement.ts index f1d5dd3..c77503e 100644 --- a/client/src/akkamon/scenes/UIElement.ts +++ b/client/src/akkamon/scenes/UIElement.ts @@ -1,4 +1,7 @@ import type { WorldScene } from '../scenes/WorldScene'; + +import { client } from '../../app'; + import { Direction } from '../render/Direction'; import { baseQueue, @@ -441,8 +444,16 @@ class ChallengeDialogue extends ConfirmationDialogue implements AkkamonMenu { export class InteractionRequestDialogue extends ConfirmationDialogue implements AkkamonMenu { - constructor(scene: WorldScene, options: Array<string>, dialogueData: {name: string, requestType: string}) { + private requestName: string; + + dialogueData; + + constructor(scene: WorldScene, options: Array<string>, dialogueData: {name: string, requestType: string, requestName: string}) { super(scene, options, dialogueData); + this.dialogueData = dialogueData; + + this.requestName = dialogueData.requestName; + this.dialogueBox!.push( `Do you want to ${dialogueData.requestType} with ${dialogueData.name}?` ); @@ -451,7 +462,13 @@ export class InteractionRequestDialogue extends ConfirmationDialogue implements confirm() { if (this.buttons![this.index!].text === "YES") { + console.log("Sending true!"); + this.akkamonScene.requestConfirmInteractionReply(true, this.requestName); + this.akkamonScene.clearMenus(); + this.akkamonScene.pushMenu(new WaitingDialogue(this.akkamonScene, new Phaser.GameObjects.Group(this.scene), 20, `Waiting for ${this.dialogueData.requestType} to start...`)); } else { + console.log("Sending false!"); + this.akkamonScene.requestConfirmInteractionReply(false, this.requestName); this.destroyAndGoBack(); } } @@ -462,14 +479,17 @@ export class InteractionRequestDialogue extends ConfirmationDialogue implements } } + export class WaitingDialogue extends Dialogue { + text: string; waitingPrinter: any constructor(scene: WorldScene, group: Phaser.GameObjects.Group, depth: number, text: string) { super(scene, group, depth); - this.typewriteText(text); + this.text = text; + this.typewriteText(this.text); this.waitingPrinter = setInterval(() => { this.displayedText.text = ''; - this.typewriteText(text); + this.typewriteText(this.text); }, 3000); } diff --git a/client/src/akkamon/scenes/WorldScene.ts b/client/src/akkamon/scenes/WorldScene.ts index 3e8db40..f125a0e 100644 --- a/client/src/akkamon/scenes/WorldScene.ts +++ b/client/src/akkamon/scenes/WorldScene.ts @@ -46,6 +46,7 @@ export interface WorldScene extends Phaser.Scene { clearMenus: () => void + requestConfirmInteractionReply: (v: boolean, requestName: string) => void } @@ -161,5 +162,9 @@ export function createWorldScene<PhaserScene extends BasePhaserScene>(scene: Pha } } + requestConfirmInteractionReply(value: boolean, requestName: string) { + client.sendInteractionReply(value, requestName); + } + } } |
