diff options
Diffstat (limited to 'client/src/akkamon')
| -rw-r--r-- | client/src/akkamon/client/Client.ts | 48 | ||||
| -rw-r--r-- | client/src/akkamon/client/IncomingEvents.ts | 9 | ||||
| -rw-r--r-- | client/src/akkamon/client/InteractionEngine.ts | 4 | ||||
| -rw-r--r-- | client/src/akkamon/client/OutgoingEvents.ts | 42 | ||||
| -rw-r--r-- | client/src/akkamon/client/Session.ts | 12 | ||||
| -rw-r--r-- | client/src/akkamon/client/Socket.ts | 2 | ||||
| -rw-r--r-- | client/src/akkamon/render/engine/GridPhysics.ts | 18 | ||||
| -rw-r--r-- | client/src/akkamon/render/engine/RemotePlayerEngine.ts | 22 | ||||
| -rw-r--r-- | client/src/akkamon/scenes/AkkamonWorldScene.ts | 8 | ||||
| -rw-r--r-- | client/src/akkamon/scenes/UIElement.ts | 98 | ||||
| -rw-r--r-- | client/src/akkamon/scenes/WorldScene.ts | 22 |
11 files changed, 172 insertions, 113 deletions
diff --git a/client/src/akkamon/client/Client.ts b/client/src/akkamon/client/Client.ts index 0e7e8c3..4adaec5 100644 --- a/client/src/akkamon/client/Client.ts +++ b/client/src/akkamon/client/Client.ts @@ -39,7 +39,10 @@ import { HeartBeatReplyEvent, Interaction, OutgoingInteractionRequestEvent, - InteractionReplyEvent + InteractionReplyEvent, + StartMovingEvent, + NewTilePosEvent, + StopMovingEvent } from './OutgoingEvents'; @@ -85,9 +88,10 @@ export class Client implements AkkamonClient this.send(new HeartBeatReplyEvent()); break; case EventType.TRAINER_REGISTRATION_REPLY: - if (event.trainerId !== undefined) { - console.log("setting Session trainerId to: " + event.trainerId); - this.session.trainerId = event.trainerId; + if (event.trainerID !== undefined) { + console.log("setting Session trainerID to: "); + console.log(event.trainerID); + this.session.trainerID = event.trainerID; } break; case EventType.INTERACTION_REQUEST: @@ -213,23 +217,19 @@ export class Client implements AkkamonClient sendInteractionRequest(interaction: Interaction) { console.log("sent an interaction request!"); - console.log(this.getCurrentSceneKey()); + console.log(this.getTrainerID()); console.log(JSON.stringify(interaction)); this.interactionEngine!.setAwaitingInteractionRequestInitiation(true); this.send(new OutgoingInteractionRequestEvent( - this.getCurrentSceneKey(), + this.getTrainerID()!, interaction )); } - getSessionTrainerId() { - return this.session.trainerId; - } - - getCurrentSceneKey() { - return this.scene!.scene.key; + getTrainerID() { + return this.session.trainerID; } sendInteractionReply(value: boolean, requestName: string) { @@ -237,10 +237,30 @@ export class Client implements AkkamonClient this.interactionEngine!.setAnswering(false); this.interactionEngine!.setWaitingForInteractionToStart(true); this.send(new InteractionReplyEvent( - this.getSessionTrainerId()!, - this.getCurrentSceneKey()!, + this.getTrainerID()!, requestName, value )); } + + sendStartMove(direction: Direction) { + this.send(new StartMovingEvent(this.getTrainerID()!, direction)); + } + + sendNewTilePos(tilePos: {x: number, y: number}) { + this.send(new NewTilePosEvent( + this.getTrainerID()!, tilePos + ) + ); + } + + sendStopMoving(direction: Direction) { + this.send( + new StopMovingEvent( + this.getTrainerID()!, + direction + ) + ); + + } } diff --git a/client/src/akkamon/client/IncomingEvents.ts b/client/src/akkamon/client/IncomingEvents.ts index 1145b4c..be02bf9 100644 --- a/client/src/akkamon/client/IncomingEvents.ts +++ b/client/src/akkamon/client/IncomingEvents.ts @@ -2,10 +2,11 @@ import { EventType, AkkamonEvent } from './EventType'; import type { Direction } from '../render/Direction'; +type TrainerID = {id: string, scene: string} export interface IncomingEvent extends AkkamonEvent { - remoteMovementQueues?:{[trainerId: string]: { value: Array<Direction> }} - trainerId?: string + remoteMovementQueues?:{[trainerID: string]: { value: Array<Direction> }} + trainerID?: TrainerID requestId?: number requestName?: string interactionType?: string @@ -17,7 +18,7 @@ export class IncomingInteractionRequest implements IncomingEvent { constructor( public interactionType: string, - public trainerId: string, + public trainerID: TrainerID, public requestName: string ) { } } @@ -35,7 +36,7 @@ export class PlayerRegistrationReplyEvent implements IncomingEvent { public type: EventType = EventType.TRAINER_REGISTRATION_REPLY; constructor( - public trainerId: string + public trainerID: TrainerID ) { } } diff --git a/client/src/akkamon/client/InteractionEngine.ts b/client/src/akkamon/client/InteractionEngine.ts index f54ced4..ee5b4ac 100644 --- a/client/src/akkamon/client/InteractionEngine.ts +++ b/client/src/akkamon/client/InteractionEngine.ts @@ -47,7 +47,7 @@ export class InteractionEngine extends AkkamonEngine { this.answering = true; this.scene.pushMenu(new InteractionRequestDialogue(this.scene, ["YES", "NO"], - {name: message!.trainerId, + {name: message!.trainerID.id, requestType: message!.interactionType, requestName: message!.requestName} )); @@ -59,7 +59,7 @@ export class InteractionEngine extends AkkamonEngine { } push(event: IncomingInteractionRequest) { - // check trainerId + // check trainerID if (this.awaitingInit) { this.waitingForResponseOf = event.requestName; diff --git a/client/src/akkamon/client/OutgoingEvents.ts b/client/src/akkamon/client/OutgoingEvents.ts index 9feb49b..6c19b07 100644 --- a/client/src/akkamon/client/OutgoingEvents.ts +++ b/client/src/akkamon/client/OutgoingEvents.ts @@ -2,20 +2,33 @@ import type { Direction } from '../render/Direction'; import { EventType, AkkamonEvent } from './EventType'; +export type TrainerID = { + id: string, + scene: string +} + +interface OutgoingEvent extends AkkamonEvent { + trainerID: TrainerID; +} + export type RemoteMovementQueues = { - [trainerId: string]: { value: Array<Direction> } + [trainerID: string]: { value: Array<Direction> } } export type Interaction = { type: string, - requestingTrainerId: string, - receivingTrainerIds: string[] + receivingtrainerIDs: TrainerID[] } -export interface InteractionEvent extends AkkamonEvent { +export interface InteractionEvent extends OutgoingEvent { interaction: Interaction } + + + + + export class HeartBeatReplyEvent implements AkkamonEvent { public type: EventType = EventType.HEART_BEAT; @@ -34,54 +47,53 @@ export class PlayerRegistrationRequestEvent implements AkkamonEvent { } -export class StartMovingEvent implements AkkamonEvent { +export class StartMovingEvent implements OutgoingEvent { public type: EventType = EventType.START_MOVING; constructor( - public sceneId: string, + public trainerID: TrainerID, public direction: Direction, ) { } } -export class StopMovingEvent implements AkkamonEvent { +export class StopMovingEvent implements OutgoingEvent { public type: EventType = EventType.STOP_MOVING; constructor( - public sceneId: string, + public trainerID: TrainerID, public direction: Direction, ) { } } -export class NewTilePosEvent implements AkkamonEvent { +export class NewTilePosEvent implements OutgoingEvent { public type: EventType = EventType.NEW_TILE_POS; constructor( - public sceneId: string, + public trainerID: TrainerID, public tilePos: {x: number, y: number} ) { } } -export class OutgoingInteractionRequestEvent implements InteractionEvent { +export class OutgoingInteractionRequestEvent implements OutgoingEvent { public type: EventType = EventType.INTERACTION_REQUEST; constructor( - public sceneId: string, + public trainerID: TrainerID, public interaction: Interaction, ) { } } -export class InteractionReplyEvent implements AkkamonEvent { +export class InteractionReplyEvent implements OutgoingEvent { public type: EventType = EventType.INTERACTION_REPLY; constructor( - public trainerId: string, - public sceneId: string, + public trainerID: TrainerID, public requestName: string, public value: boolean ) { } diff --git a/client/src/akkamon/client/Session.ts b/client/src/akkamon/client/Session.ts index 6b6f5ec..7357743 100644 --- a/client/src/akkamon/client/Session.ts +++ b/client/src/akkamon/client/Session.ts @@ -1,11 +1,7 @@ -import type Player from './player'; +import type { + TrainerID +} from './OutgoingEvents'; export default interface AkkamonSession extends WebSocket { - trainerId?: string - -} - -interface User { - name: string - password: string + trainerID?: TrainerID; } diff --git a/client/src/akkamon/client/Socket.ts b/client/src/akkamon/client/Socket.ts index b46c73f..3184416 100644 --- a/client/src/akkamon/client/Socket.ts +++ b/client/src/akkamon/client/Socket.ts @@ -7,7 +7,7 @@ import { export class Socket extends WebSocket implements AkkamonSession { - public trainerId?: string; + public trainerID?: {id: string, scene: string}; constructor( url: string, diff --git a/client/src/akkamon/render/engine/GridPhysics.ts b/client/src/akkamon/render/engine/GridPhysics.ts index 7c266bf..4a7d1e1 100644 --- a/client/src/akkamon/render/engine/GridPhysics.ts +++ b/client/src/akkamon/render/engine/GridPhysics.ts @@ -66,9 +66,7 @@ export class GridPhysics extends AkkamonEngine { private startMoving(direction: Direction): void { console.log("Sending startMovingEvent"); - this.client.send( - new StartMovingEvent(this.playerSprite.getScene(), direction) - ); + this.client.sendStartMove(direction); this.playerSprite.startAnimation(direction); this.movementDirection = direction; this.updatePlayerSpriteTilePosition(); @@ -96,12 +94,7 @@ export class GridPhysics extends AkkamonEngine { } private updatePlayerSpriteTilePosition() { - this.client.send( - new NewTilePosEvent( - this.playerSprite.getScene(), - this.playerSprite.getTilePos() - ) - ); + this.client.sendNewTilePos(this.playerSprite.getTilePos()); this.playerSprite.setTilePos( this.playerSprite .getTilePos() @@ -149,12 +142,7 @@ export class GridPhysics extends AkkamonEngine { } private stopMoving(): void { - this.client.send( - new StopMovingEvent( - this.playerSprite.getScene(), - this.movementDirection - ) - ); + this.client.sendStopMoving(this.movementDirection); this.playerSprite.stopAnimation(this.movementDirection); this.movementDirection = Direction.NONE; } diff --git a/client/src/akkamon/render/engine/RemotePlayerEngine.ts b/client/src/akkamon/render/engine/RemotePlayerEngine.ts index 7ce5fa9..037b26c 100644 --- a/client/src/akkamon/render/engine/RemotePlayerEngine.ts +++ b/client/src/akkamon/render/engine/RemotePlayerEngine.ts @@ -24,7 +24,7 @@ export class RemotePlayerEngine extends AkkamonEngine { private scene: WorldScene; - private trainerIdToRemotePlayerSprite: Map<string, RemotePlayerSprite> = new Map(); + private trainerIDToRemotePlayerSprite: Map<string, RemotePlayerSprite> = new Map(); constructor(scene: WorldScene) { super(); @@ -37,13 +37,13 @@ export class RemotePlayerEngine extends AkkamonEngine { } pushMovesToSprites(remoteMovementQueues: RemoteMovementQueues) { - this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { + this.trainerIDToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { remoteSprite.push(remoteMovementQueues[key].value); }); } update(delta: number): void { - this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { + this.trainerIDToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { if (remoteSprite.isMoving()) { console.log("remote player currently walking"); remoteSprite.updatePixelPosition(delta); @@ -55,18 +55,18 @@ export class RemotePlayerEngine extends AkkamonEngine { } updateMembers(newRemoteMovementQueues: RemoteMovementQueues) { - const traineridToQueueValue = newRemoteMovementQueues; + const trainerIDToQueueValue = newRemoteMovementQueues; Object.keys(newRemoteMovementQueues).forEach((key: string) => { - var moveQueue = traineridToQueueValue[key].value; + var moveQueue = trainerIDToQueueValue[key].value; if (moveQueue !== undefined) { // console.log("-> key: " + key + " has position " + newTilePos.x + ", " + newTilePos.y); - if (!this.trainerIdToRemotePlayerSprite.has(key)) { + if (!this.trainerIDToRemotePlayerSprite.has(key)) { // console.log("adding remote player sprite for " + key); - this.trainerIdToRemotePlayerSprite.set(key, + this.trainerIDToRemotePlayerSprite.set(key, new RemotePlayerSprite({ scene: this.scene, tilePos: new Phaser.Math.Vector2(this.scene.spawnPointTilePos!), @@ -82,11 +82,11 @@ export class RemotePlayerEngine extends AkkamonEngine { }); - this.trainerIdToRemotePlayerSprite.forEach((value: RemotePlayerSprite, key: string) => { + this.trainerIDToRemotePlayerSprite.forEach((value: RemotePlayerSprite, key: string) => { if (!(key in newRemoteMovementQueues)) { // console.log("removing remote player sprite for " + key); - this.trainerIdToRemotePlayerSprite.get(key)!.destroy(); - this.trainerIdToRemotePlayerSprite.delete(key); + this.trainerIDToRemotePlayerSprite.get(key)!.destroy(); + this.trainerIDToRemotePlayerSprite.delete(key); } else { // console.log("Player " + key + " was not removed!"); } @@ -94,6 +94,6 @@ export class RemotePlayerEngine extends AkkamonEngine { } getData() { - return this.trainerIdToRemotePlayerSprite; + return this.trainerIDToRemotePlayerSprite; } } diff --git a/client/src/akkamon/scenes/AkkamonWorldScene.ts b/client/src/akkamon/scenes/AkkamonWorldScene.ts index 002b4b5..9912145 100644 --- a/client/src/akkamon/scenes/AkkamonWorldScene.ts +++ b/client/src/akkamon/scenes/AkkamonWorldScene.ts @@ -147,8 +147,8 @@ export function akkamonBaseWorldScene(key: string): WorldScene { requestBattle: function (remotePlayerName: string | string[]): void { this.client.sendInteractionRequest({ type: "battle", - requestingTrainerId: this.client.getSessionTrainerId()!, - receivingTrainerIds: Array.isArray(remotePlayerName) ? remotePlayerName : [remotePlayerName] + requestingtrainerID: this.client.getSessiontrainerID()!, + receivingtrainerIDs: Array.isArray(remotePlayerName) ? remotePlayerName : [remotePlayerName] }); }, @@ -265,8 +265,8 @@ export function akkamonBaseWorldScene(key: string): WorldScene { // requestBattle(remotePlayerName: string | string[]): void { // this.client.sendInteractionRequest({ // type: "battle", -// requestingTrainerId: this.client.getSessionTrainerId()!, -// receivingTrainerIds: Array.isArray(remotePlayerName) ? remotePlayerName : [remotePlayerName] +// requestingtrainerID: this.client.getSessiontrainerID()!, +// receivingtrainerIDs: Array.isArray(remotePlayerName) ? remotePlayerName : [remotePlayerName] // }); // } // diff --git a/client/src/akkamon/scenes/UIElement.ts b/client/src/akkamon/scenes/UIElement.ts index c77503e..1c87ef4 100644 --- a/client/src/akkamon/scenes/UIElement.ts +++ b/client/src/akkamon/scenes/UIElement.ts @@ -163,12 +163,6 @@ class Menu extends Phaser.GameObjects.Image implements AkkamonMenu { return index * this.ySpacing! + this.yOffsetFromTop! + 7 + this.y; } - setButtons(buttonTextArray: Array<string>) { - for (let i = 0; i < buttonTextArray.length; i++) { - this.buttons!.push(new MenuText(this.scene, this.group!, this.groupDepth!, this.x - this.xOffsetFromRight!, this.y + this.yOffsetFromTop! + i * this.ySpacing!, buttonTextArray[i])); - } - } - clearButtons() { for (let button of this.buttons!) { button.destroy(); @@ -202,6 +196,13 @@ export class PauseMenu extends Menu implements AkkamonMenu { this.group!.setDepth(this.groupDepth!); } + setButtons(buttonTextArray: Array<string>) { + for (let i = 0; i < buttonTextArray.length; i++) { + this.buttons!.push(new MenuText(this.scene, this.group!, this.groupDepth!, this.x - this.xOffsetFromRight!, this.y + this.yOffsetFromTop! + i * this.ySpacing!, buttonTextArray[i])); + } + } + + confirm() { if (this.buttons![this.index!].text === 'PHONE') { this.akkamonScene.pushMenu(new RemotePlayerList(this.akkamonScene, this.akkamonScene.getRemotePlayerNames())); @@ -210,7 +211,7 @@ export class PauseMenu extends Menu implements AkkamonMenu { } class ListMenu extends Menu implements AkkamonMenu { - options: Array<string> + options: Array<any> viewTop: number = 0; @@ -218,7 +219,7 @@ class ListMenu extends Menu implements AkkamonMenu { constructor( scene: WorldScene, - options: Array<string> + options: any[] ) { super(scene, "pause-menu") let camera = scene.cameras.main; @@ -232,28 +233,14 @@ class ListMenu extends Menu implements AkkamonMenu { this.xOffsetFromRight = 210; this.yOffsetFromTop = 50; - let contacts = new MenuText( - this.scene, - this.group!, - this.groupDepth!, - this.x - this.xOffsetFromRight, - this.y + 20, - "Nearby trainers:") - // this.yOffsetFromTop - // this.ySpacing - this.setPicker(0); - this.setButtons( - this.options.slice( - this.viewTop, - this.viewBot - ) - ); this.groupDepth = 30; this.group!.setDepth(this.groupDepth); } + setButtons(visibleOptions: any[]) {} + selectButton(direction: Direction) { if (direction === Direction.UP) { if (this.index! !== 0) { @@ -292,12 +279,51 @@ class ListMenu extends Menu implements AkkamonMenu { class RemotePlayerList extends ListMenu implements AkkamonMenu { + constructor( + scene: WorldScene, + options: {id: string, scene: string}[] + ) { + super(scene, options) + + let title = new MenuText( + this.scene, + this.group!, + this.groupDepth!, + this.x - this.xOffsetFromRight!, + this.y + 20, + "Nearby trainers:") + + this.setButtons( + this.options.slice( + this.viewTop, + this.viewBot + ) + ); + + // this.yOffsetFromTop + // this.ySpacing + + } + + setButtons(visibleOptions: {id: string, scene: string}[]) { + for (let i = 0; i < visibleOptions.length; i++) { + + this.buttons!.push(new MenuText( + this.scene, + this.group!, + this.groupDepth!, + this.x - this.xOffsetFromRight!, + this.y + this.yOffsetFromTop! + i * this.ySpacing!, + visibleOptions[i].id)); + } + } + confirm() { this.akkamonScene.pushMenu(new ChallengeDialogue( this.akkamonScene, ['YES', 'NO'], { - 'trainerName': this.buttons![this.index! + this.viewTop].text + 'trainerID': this.options![this.index! + this.viewTop] })); } } @@ -307,7 +333,7 @@ class ConfirmationDialogue extends Menu implements AkkamonMenu { options?: Array<string> dialogueBox?: Dialogue - constructor(scene: WorldScene, options: Array<string>, dialogueData: {[key: string]: string} | string) { + constructor(scene: WorldScene, options: Array<string>, dialogueData: {[key: string]: string} | string | {}) { super(scene, "confirmation-dialogue"); let camera = scene.cameras.main; this.setDisplaySize(200, 0.83 * 200) @@ -323,6 +349,14 @@ class ConfirmationDialogue extends Menu implements AkkamonMenu { this.dialogueBox = new Dialogue(scene, this.group!, this.groupDepth); } + + setButtons(buttonTextArray: Array<string>) { + for (let i = 0; i < buttonTextArray.length; i++) { + this.buttons!.push(new MenuText(this.scene, this.group!, this.groupDepth!, this.x - this.xOffsetFromRight!, this.y + this.yOffsetFromTop! + i * this.ySpacing!, buttonTextArray[i])); + } + } + + } class Dialogue extends Phaser.GameObjects.Image implements AkkamonMenu { @@ -416,19 +450,21 @@ class Dialogue extends Phaser.GameObjects.Image implements AkkamonMenu { } class ChallengeDialogue extends ConfirmationDialogue implements AkkamonMenu { - challengedTrainerName: string; - constructor(scene: WorldScene, options: Array<string>, dialogueData: {[key: string]: string}) { + challengedTrainerID: {id: string, scene: string}; + + constructor(scene: WorldScene, options: Array<string>, dialogueData: {trainerID: {id: string, scene: string}}) { + super(scene, options, dialogueData); - this.challengedTrainerName = dialogueData['trainerName']; + this.challengedTrainerID = dialogueData.trainerID; this.dialogueBox!.push( - `Do you want to challenge ${this.challengedTrainerName} to a battle?` + `Do you want to challenge ${this.challengedTrainerID.id} to a battle?` ); this.dialogueBox!.displayNextDialogue(); } confirm() { if (this.buttons![this.index!].text === "YES") { - this.akkamonScene.requestBattle(this.challengedTrainerName); + this.akkamonScene.requestBattle(this.challengedTrainerID); this.akkamonScene.clearMenus(); this.akkamonScene.pushMenu(new WaitingDialogue(this.akkamonScene, new Phaser.GameObjects.Group(this.scene), 20, 'Awaiting request initialisation...')); } else { diff --git a/client/src/akkamon/scenes/WorldScene.ts b/client/src/akkamon/scenes/WorldScene.ts index f125a0e..f570cde 100644 --- a/client/src/akkamon/scenes/WorldScene.ts +++ b/client/src/akkamon/scenes/WorldScene.ts @@ -40,9 +40,9 @@ export interface WorldScene extends Phaser.Scene { getPlayerPixelPosition: () => Phaser.Math.Vector2 - getRemotePlayerNames: () => string[] + getRemotePlayerNames: () => {id: string, scene: string}[] - requestBattle: (remotePlayerData: string | string[]) => void + requestBattle: (remotePlayerData: {id: string, scene: string}) => void clearMenus: () => void @@ -136,20 +136,26 @@ export function createWorldScene<PhaserScene extends BasePhaserScene>(scene: Pha return client.requestPlayerPixelPosition(); } - getRemotePlayerNames(): Array<string> { + getRemotePlayerNames(): Array<{id: string, scene: string}> { let remotePlayerData = client.requestRemotePlayerData(); if (remotePlayerData.size === 0) { - return ['Nobody Online']; + return [{id: 'Nobody Online', scene: ''}]; } else { - return Array.from(remotePlayerData.keys()); + let keys = remotePlayerData.keys(); + let trainerIDs: {id: string, scene: string}[] = []; + + for (let key of keys) { + let trainerID: { id: string, scene: string } = JSON.parse(key); + trainerIDs.push(trainerID); + } + return trainerIDs; } } - requestBattle(remotePlayerName: string | string[]): void { + requestBattle(remoteTrainerID: {id: string, scene: string}): void { client.sendInteractionRequest({ type: "battle", - requestingTrainerId: client.getSessionTrainerId()!, - receivingTrainerIds: Array.isArray(remotePlayerName) ? remotePlayerName : [remotePlayerName] + receivingtrainerIDs: Array.isArray(remoteTrainerID) ? remoteTrainerID : [remoteTrainerID] }); } |
