diff --git a/README.md b/README.md index 8fdee4e8..162279f3 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ A few things to notice: If you have exit scene - You must create layer "exit". The layer have cases where the gamer can switch to the next scene. -- In layer properties, you must add "exitSceneKey" property. It represent a key map of the next scene. Be careful, if you want that the next map will be correctly loaded, you must check that the map exists in the list of the maps application. The variable that represents maps in the application is "ROOMS" constant variable. +- In layer properties, you must add "exitSceneUrl" property. It represents a url map of the next scene. Be careful, if you want that the next map will be correctly loaded, you must check that the map files are in folder `back/src/Assets/Maps/`. The files will be accessible by url `/map/files//...`. ![](doc/images/exit_layer_map.png) diff --git a/back/src/Assets/Maps/Floor0/floor0.json b/back/src/Assets/Maps/Floor0/floor0.json index af7ab21f..21a675c3 100644 --- a/back/src/Assets/Maps/Floor0/floor0.json +++ b/back/src/Assets/Maps/Floor0/floor0.json @@ -47,9 +47,9 @@ "opacity":1, "properties":[ { - "name":"exitSceneKey", + "name":"exitSceneUrl", "type":"string", - "value":"floor1" + "value":"\/map\/files\/Floor1\/floor1.json" }], "type":"tilelayer", "visible":true, diff --git a/back/src/Assets/Maps/Floor1/floor1.json b/back/src/Assets/Maps/Floor1/floor1.json index fdf064f8..d54840f5 100644 --- a/back/src/Assets/Maps/Floor1/floor1.json +++ b/back/src/Assets/Maps/Floor1/floor1.json @@ -41,9 +41,9 @@ "opacity":1, "properties":[ { - "name":"exitSceneKey", + "name":"exitSceneUrl", "type":"string", - "value":"floor0" + "value":"\/map\/files\/Floor0\/floor0.json" }], "type":"tilelayer", "visible":true, diff --git a/back/src/Controller/AuthenticateController.ts b/back/src/Controller/AuthenticateController.ts index 2cd733b4..6eaa14ca 100644 --- a/back/src/Controller/AuthenticateController.ts +++ b/back/src/Controller/AuthenticateController.ts @@ -1,7 +1,7 @@ import {Application, Request, Response} from "express"; import Jwt from "jsonwebtoken"; import {BAD_REQUEST, OK} from "http-status-codes"; -import {SECRET_KEY, ROOM_STARTED, URL_ROOM_STARTED} from "../Enum/EnvironmentVariable"; //TODO fix import by "_Enum/..." +import {SECRET_KEY, URL_ROOM_STARTED} from "../Enum/EnvironmentVariable"; //TODO fix import by "_Enum/..." import { uuid } from 'uuidv4'; export class AuthenticateController{ @@ -26,7 +26,7 @@ export class AuthenticateController{ let token = Jwt.sign({email: param.email, userId: userId}, SECRET_KEY, {expiresIn: '24h'}); return res.status(OK).send({ token: token, - startedRoom: {key: ROOM_STARTED, url: URL_ROOM_STARTED}, + mapUrlStart: URL_ROOM_STARTED, userId: userId, }); }); diff --git a/back/src/Controller/MapController.ts b/back/src/Controller/MapController.ts index 5a19644b..65ca7956 100644 --- a/back/src/Controller/MapController.ts +++ b/back/src/Controller/MapController.ts @@ -1,7 +1,7 @@ import express from "express"; import {Application, Request, Response} from "express"; import {OK} from "http-status-codes"; -import {ROOM_STARTED, ROOMS, URL_ROOM_STARTED} from "../Enum/EnvironmentVariable"; +import {URL_ROOM_STARTED} from "../Enum/EnvironmentVariable"; export class MapController { App: Application; @@ -20,8 +20,7 @@ export class MapController { getMaps() { this.App.get("/maps", (req: Request, res: Response) => { return res.status(OK).send({ - mapStart: {key: ROOM_STARTED, url: URL_ROOM_STARTED}, - maps: ROOMS + mapUrlStart: URL_ROOM_STARTED }); }); } diff --git a/back/src/Enum/EnvironmentVariable.ts b/back/src/Enum/EnvironmentVariable.ts index 87a41c91..8ee18302 100644 --- a/back/src/Enum/EnvironmentVariable.ts +++ b/back/src/Enum/EnvironmentVariable.ts @@ -1,18 +1,11 @@ const SECRET_KEY = process.env.SECRET_KEY || "THECODINGMACHINE_SECRET_KEY"; -const ROOM_STARTED = "floor0"; -const URL_ROOM_STARTED = "/map/files/Floor0"; -const ROOMS = [ - {key: "floor0", url: "/map/files/Floor0"}, - {key: "floor1", url: "/map/files/Floor1"}, -] +const URL_ROOM_STARTED = "/map/files/Floor0/floor0.json"; const MINIMUM_DISTANCE = process.env.MINIMUM_DISTANCE ? Number(process.env.MINIMUM_DISTANCE) : 64; const GROUP_RADIUS = process.env.GROUP_RADIUS ? Number(process.env.GROUP_RADIUS) : 48; export { SECRET_KEY, - ROOM_STARTED, URL_ROOM_STARTED, - ROOMS, MINIMUM_DISTANCE, GROUP_RADIUS } diff --git a/doc/images/exit_layer_map.png b/doc/images/exit_layer_map.png index 122610c0..2a9a5b27 100644 Binary files a/doc/images/exit_layer_map.png and b/doc/images/exit_layer_map.png differ diff --git a/front/src/Connexion.ts b/front/src/Connexion.ts index e7d07efe..69b6647b 100644 --- a/front/src/Connexion.ts +++ b/front/src/Connexion.ts @@ -3,6 +3,7 @@ import {GameManager} from "./Phaser/Game/GameManager"; const SocketIo = require('socket.io-client'); import Axios from "axios"; import {API_URL} from "./Enum/EnvironmentVariable"; +import {getMapKeyByUrl} from "./Phaser/Login/LogincScene"; enum EventMessage{ WEBRTC_SIGNAL = "webrtc-signal", @@ -182,7 +183,8 @@ export class Connexion implements ConnexionInterface { return Axios.post(`${API_URL}/login`, {email: this.email}) .then((res) => { this.token = res.data.token; - this.startedRoom = res.data.startedRoom.key; + + this.startedRoom = getMapKeyByUrl(res.data.mapUrlStart); this.userId = res.data.userId; this.socket = SocketIo(`${API_URL}`, { diff --git a/front/src/Phaser/Game/GameManager.ts b/front/src/Phaser/Game/GameManager.ts index 9e147e04..16c19cac 100644 --- a/front/src/Phaser/Game/GameManager.ts +++ b/front/src/Phaser/Game/GameManager.ts @@ -5,6 +5,7 @@ import { ListMessageUserPositionInterface } from "../../Connexion"; import {SimplePeerInterface, SimplePeer} from "../../WebRtc/SimplePeer"; +import {API_URL} from "../../Enum/EnvironmentVariable"; export enum StatusGameManagerEnum { IN_PROGRESS = 1, @@ -30,7 +31,6 @@ export class GameManager { private playerName: string; SimplePeer : SimplePeerInterface; private characterUserSelected: string; - Maps: Array; constructor() { this.status = StatusGameManagerEnum.IN_PROGRESS; @@ -50,7 +50,6 @@ export class GameManager { loadMaps(){ return this.ConnexionInstance.loadMaps().then((data) => { - this.Maps = data.maps; return data; }).catch((err) => { throw err; diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 78271492..d4d98c55 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -12,6 +12,7 @@ import Texture = Phaser.Textures.Texture; import Sprite = Phaser.GameObjects.Sprite; import CanvasTexture = Phaser.Textures.CanvasTexture; import CreateSceneFromObjectConfig = Phaser.Types.Scenes.CreateSceneFromObjectConfig; +import {getMapKeyByUrl} from "../Login/LogincScene"; export enum Textures { Player = "male1" @@ -64,17 +65,18 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface, Creat // Triggered when the map is loaded // Load tiles attached to the map recursively this.map = data.data; + let url = this.MapUrlFile.substr(0, this.MapUrlFile.indexOf(`${this.MapKey}.json`)); this.map.tilesets.forEach((tileset) => { if (typeof tileset.name === 'undefined' || typeof tileset.image === 'undefined') { console.warn("Don't know how to handle tileset ", tileset) return; } //TODO strategy to add access token - this.load.image(tileset.name, `${this.MapUrlFile}/${tileset.image}`); + this.load.image(tileset.name, `${url}/${tileset.image}`); }) }); //TODO strategy to add access token - this.load.tilemapTiledJSON(this.MapKey, `${this.MapUrlFile}/${this.MapKey}.json`); + this.load.tilemapTiledJSON(this.MapKey, this.MapUrlFile); //add player png PLAYER_RESOURCES.forEach((playerResource: any) => { @@ -164,16 +166,17 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface, Creat */ private loadNextGame(layer: ITiledMapLayer, mapWidth: number, tileWidth: number, tileHeight: number){ let properties : any = layer.properties; - let nextSceneKey = properties.find((property:any) => property.name === "exitSceneKey"); - let nextMap : MapObject = gameManager.Maps.find((map: MapObject) => map.key === nextSceneKey.value); + let exitSceneUrl = properties.find((property:any) => property.name === "exitSceneUrl"); - let gameIndex = this.scene.getIndex(nextMap.key); + let exitSceneKey = getMapKeyByUrl(exitSceneUrl.value); + + let gameIndex = this.scene.getIndex(exitSceneKey); let game : Phaser.Scene = null; if(gameIndex === -1){ - game = new GameScene(nextMap.key, `${API_URL}${nextMap.url}`); - this.scene.add(nextSceneKey, game, false); + game = new GameScene(exitSceneKey, `${API_URL}${exitSceneUrl.value}`); + this.scene.add(exitSceneKey, game, false); }else{ - game = this.scene.get(nextMap.key); + game = this.scene.get(exitSceneKey); } if(!game){ return; @@ -192,7 +195,7 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface, Creat yStart: (y * tileWidth), xEnd: ((x +1) * tileHeight), yEnd: ((y + 1) * tileHeight), - key: nextMap.key + key: exitSceneKey }) }); } diff --git a/front/src/Phaser/Login/LogincScene.ts b/front/src/Phaser/Login/LogincScene.ts index b747fdf6..35d372d2 100644 --- a/front/src/Phaser/Login/LogincScene.ts +++ b/front/src/Phaser/Login/LogincScene.ts @@ -10,6 +10,11 @@ import {cypressAsserter} from "../../Cypress/CypressAsserter"; import {GroupCreatedUpdatedMessageInterface, MessageUserPositionInterface} from "../../Connexion"; import {API_URL} from "../../Enum/EnvironmentVariable"; +export function getMapKeyByUrl(mapUrlStart: string){ + let tab = mapUrlStart.split("/"); + return tab[tab.length -1].substr(0, tab[tab.length -1].indexOf(".json")); +} + //todo: put this constants in a dedicated file export const LoginSceneName = "LoginScene"; enum LoginTextures { @@ -98,9 +103,10 @@ export class LogincScene extends Phaser.Scene implements GameSceneInterface { if (!scene) { return; } - let game = new GameScene(scene.mapStart.key, `${API_URL}${scene.mapStart.url}`); - this.scene.add(scene.mapStart.key, game, false); - this.scene.start(scene.mapStart.key); + let key = getMapKeyByUrl(scene.mapUrlStart); + let game = new GameScene(key,`${API_URL}${scene.mapUrlStart}`); + this.scene.add(key, game, false); + this.scene.start(key); return scene; }).catch((err) => { console.error(err);