diff --git a/assets/backgrounds/bedroom/bag.png b/assets/backgrounds/bedroom/bag.png new file mode 100644 index 0000000..591c1d9 Binary files /dev/null and b/assets/backgrounds/bedroom/bag.png differ diff --git a/assets/backgrounds/bedroom/bedroomBase.png b/assets/backgrounds/bedroom/bedroomBase.png index 83513c7..9027c36 100644 Binary files a/assets/backgrounds/bedroom/bedroomBase.png and b/assets/backgrounds/bedroom/bedroomBase.png differ diff --git a/assets/backgrounds/bedroom/bedroomChair.png b/assets/backgrounds/bedroom/bedroomChair.png new file mode 100644 index 0000000..d499418 Binary files /dev/null and b/assets/backgrounds/bedroom/bedroomChair.png differ diff --git a/localization/day1/bedroomMorningDay1.json b/localization/day1/bedroomMorningDay1.json new file mode 100644 index 0000000..c7b0576 --- /dev/null +++ b/localization/day1/bedroomMorningDay1.json @@ -0,0 +1,68 @@ +{ + "bag": { + "root": { + "type": "text", + "character": "player", + "next": "pickBag" + }, + "pickBag": { + "type": "event", + "events": [ + { "pickBag": { } } + ], + "next": "bag2" + }, + "bag2": { + "type": "text", + "character": "player" + } + + }, + + "wardrobe1": { + "root": { + "type": "text", + "character": "player" + } + }, + + "wardrobe2": { + "root": { + "type": "text", + "character": "player" + } + }, + + "pc": { + "root": { + "type": "text", + "character": "PC", + "next": "pcChoice" + }, + "pcChoice": { + "type": "choice", + "choices":[ + { "next": "turnPC" }, + { "next": "leavePC" } + ] + }, + "turnPC": { + "type": "event", + "events": [ + { "turnPC": { } } + ] + }, + "leavePC": { + "type": "text", + "character": "player" + } + }, + + "bed": { + "root": { + "type": "text", + "character": "player" + } + } + +} \ No newline at end of file diff --git a/localization/es/day1/bedroomMorningDay1.json b/localization/es/day1/bedroomMorningDay1.json new file mode 100644 index 0000000..7b34ee2 --- /dev/null +++ b/localization/es/day1/bedroomMorningDay1.json @@ -0,0 +1,28 @@ +{ + "bag": { + "root": { + "text": "Creo que tengo todo preparado..." + }, + "bag2": { + "text": "Sí, lo llevo todo, será mejor que coja la mochila y me marche ya." + } + }, + + "wardrobe1": { + "root": { + "text": "No hay nada útil dentro." + } + }, + + "wardrobe2": { + "root": { + "text": "En algún momento tendré que ordenar todo esto, pero ahora tengo que irme a clase." + } + }, + + "bed": { + "root": { + "text": "Ahora que me he conseguido levantar no debería volver a acostarme." + } + } +} \ No newline at end of file diff --git a/src/managers/gameManager.js b/src/managers/gameManager.js index 358ee69..62767e0 100644 --- a/src/managers/gameManager.js +++ b/src/managers/gameManager.js @@ -36,7 +36,9 @@ export default class GameManager { // Blackboard this.map = new Map(); - this.map.set("bag", false); + + this.bagPicked = "bagPicked"; + this.map.set("bagPicked", false); this.isLate = "isLate"; this.map.set(this.isLate, false); @@ -223,20 +225,22 @@ export default class GameManager { this.computerScene = this.currentScene.scene.get(computerSceneName); this.computerScene.scene.sleep(); + + let sceneName = 'BedroomMorningDay1'; + // Pasa a la escena inicial con los parametros text, onComplete y onCompleteDelay - let sceneName = 'TextOnlyScene'; - this.changeScene(sceneName, { - // El texto de se coge del a archivo de traducciones - text: this.i18next.t("day1.start", { ns: "transitionScenes", returnObjects: true }), - onComplete: () => { - // Al llamar a onComplete, se cambiara a la escena de la alarma - this.changeScene('AlarmScene'); - }, - onCompleteDelay: 500 - }); - - // let sceneName = 'BedroomDay1'; - // this.changeScene(sceneName); + // let sceneName = 'TextOnlyScene'; + // this.changeScene(sceneName, { + // // El texto de se coge del a archivo de traducciones + // text: this.i18next.t("day1.start", { ns: "transitionScenes", returnObjects: true }), + // onComplete: () => { + // // Al llamar a onComplete, se cambiara a la escena de la alarma + // this.changeScene('AlarmScene'); + // }, + // onCompleteDelay: 500 + // }); + + this.changeScene(sceneName); } setUserInfo(userInfo) { @@ -259,6 +263,8 @@ export default class GameManager { } switchToComputer() { + this.UIManager.phoneManager.activate(false); + // se duerme la escena actual this.currentScene.scene.sleep(); // se cambia a la escena del ordenador @@ -267,6 +273,8 @@ export default class GameManager { } leaveComputer() { + this.UIManager.phoneManager.activate(true); + this.computerScene.scene.sleep(); this.currentScene.scene.wake(); } diff --git a/src/managers/phoneManager.js b/src/managers/phoneManager.js index 8c82835..38acadf 100644 --- a/src/managers/phoneManager.js +++ b/src/managers/phoneManager.js @@ -76,7 +76,7 @@ export default class PhoneManager { this.resetCamEvent = "resetCam"; this.wakeUpEvent = "wakeUp"; - this.activate(false); + this.showPhone(false); } @@ -301,12 +301,23 @@ export default class PhoneManager { } + /** - * Activa/desactiva el telefono de manera inmediata - * @param {Boolean} active - true si se va a activar, false en caso contrario + * Muestra/oculta toda la interfaz del telefono (incluyendo el icono y las notificaciones) + * @param {Boolean} active - true si se va a mostrar, false en caso contrario */ activate(active) { - if ((this.phone.visible && !active) || (!this.phone.visible && active)) { + this.showPhone(false); + this.icon.visible = active; + this.notifications.visible = this.notificationAmount > 0; + } + + /** + * Muestra/oculta el telefono de manera inmediata + * @param {Boolean} active - true si se va a activar, false en caso contrario + */ + showPhone(show) { + if ((this.phone.visible && !show) || (!this.phone.visible && show)) { this.toggling = false; this.togglePhone(0); } @@ -382,12 +393,8 @@ export default class PhoneManager { this.wakeUpMessage.visible = false; this.icon.visible = true; - if (this.notificationAmount > 0) { - this.notifications.visible = true; - } - else { - this.notifications.visible = false; - } + this.notifications.visible = this.notificationAmount > 0; + // Envia el evento de reiniciar la camara y el de despertarse this.dispatcher.dispatch(this.resetCamEvent, {}); this.dispatcher.dispatch(this.wakeUpEvent, {}); @@ -406,7 +413,7 @@ export default class PhoneManager { // Oculta el icono del movil, las notificaciones, y el propio movil this.icon.visible = false; this.notifications.visible = false; - this.activate(false); + this.showPhone(false); // Cuando termina la animacion de desactivarse, va a la pantalla de la alarma y // activa el bloqueo del fondo (hay que hacerlo cuando termine la animacion aunque diff --git a/src/scenes/bootScene.js b/src/scenes/bootScene.js index cd6eb54..9d0fb58 100644 --- a/src/scenes/bootScene.js +++ b/src/scenes/bootScene.js @@ -128,7 +128,8 @@ export default class BootScene extends Phaser.Scene { // en cualquier idioma (aunque o existiese) supportedLngs: ['en', 'es'], // namespaces que se cargan para cada uno de los idiomas - ns: ['titleMenu', 'userInfoMenu', 'names', 'phoneInfo', 'transitionScenes', + ns: ['titleMenu', 'userInfoMenu', 'names', 'phoneInfo', + 'transitionScenes', 'day1/bedroomMorningDay1', 'momDialog', 'dadDialog', 'chat1', 'computer'], // TEST preload: ['en', 'es'], // mostrar informacion de ayuda por consola @@ -170,6 +171,7 @@ export default class BootScene extends Phaser.Scene { this.load.json('dadDialog', './dadDialog.json'); this.load.json('chat1', './chat1.json'); this.load.json('computer', './computer.json'); + this.load.json('bedroomMorningDay1', './day1/bedroomMorningDay1.json'); } loadSpinalAnims() { @@ -189,6 +191,8 @@ export default class BootScene extends Phaser.Scene { this.load.image('bedroomCeiling', 'bedroom/bedroomCeiling.png'); this.load.image('bedroomBg', 'bedroom/bedroomBase.png'); this.load.image('bed', 'bedroom/bed.png'); + this.load.image('bag', 'bedroom/bag.png'); + this.load.image('bedroomChair', 'bedroom/bedroomChair.png'); this.load.image('bedroomDoorClosed', 'bedroom/bedroomDoorClosed.png'); this.load.image('bedroomDoorOpened', 'bedroom/bedroomDoorOpened.png'); this.load.image('bedroomJacket', 'bedroom/bedroomJacket.png'); @@ -202,7 +206,6 @@ export default class BootScene extends Phaser.Scene { this.load.image('wardrobeDoor3Closed', 'bedroom/wardrobeDoor3Closed.png'); this.load.image('wardrobeDoor3Opened', 'bedroom/wardrobeDoor3Opened.png'); - } preload() { diff --git a/src/scenes/gameLoop/baseScene.js b/src/scenes/gameLoop/baseScene.js index e741fda..3e70f0f 100644 --- a/src/scenes/gameLoop/baseScene.js +++ b/src/scenes/gameLoop/baseScene.js @@ -41,6 +41,8 @@ export default class BaseScene extends Phaser.Scene { scale: this.portraitScale }; + this.scale = 1; + this.leftBound = 0; this.rightBound = this.CANVAS_WIDTH; this.START_SCROLLING = 30; @@ -103,7 +105,10 @@ export default class BaseScene extends Phaser.Scene { * traducciones es el que se pasa en el parametro namespace, y tiene que pasarse un string con el nombre del * archivo sin la extension .json */ - readNodes(id, file, namespace, playerName, context, getObjs) { + readNodes(id, file, namespace, getObjs) { + let playerName = this.gameManager.getUserInfo().name; + let context = this.gameManager.getUserInfo().gender; + // Crea el nodo y guarda sus atributos (se estableceran en el nodo al final) let node = null; let nodeId = id; diff --git a/src/scenes/gameLoop/bedroomBase.js b/src/scenes/gameLoop/bedroomBase.js index b8065b5..3ea63e3 100644 --- a/src/scenes/gameLoop/bedroomBase.js +++ b/src/scenes/gameLoop/bedroomBase.js @@ -26,29 +26,80 @@ export default class BedroomBase extends BaseScene { // Pone la imagen de fondo con las dimensiones del canvas let bg = this.add.image(0, 0, 'bedroomBg').setOrigin(0, 0); - let scale = this.CANVAS_HEIGHT / bg.height; - bg.setScale(scale); + this.scale = this.CANVAS_HEIGHT / bg.height; + bg.setScale(this.scale); this.rightBound = bg.displayWidth; // Puerta del armario individual - let door1Closed = this.add.image(2190 * scale, 330 * scale, 'wardrobeDoor1Closed').setOrigin(0, 0).setScale(scale); - let door1Opened = this.add.image(2110 * scale, 330 * scale, 'wardrobeDoor1Opened').setOrigin(0, 0).setScale(scale); + let door1Closed = this.add.image(2190 * this.scale, 330 * this.scale, 'wardrobeDoor1Closed').setOrigin(0, 0).setScale(this.scale); + let door1Opened = this.add.image(2110 * this.scale, 330 * this.scale, 'wardrobeDoor1Opened').setOrigin(0, 0).setScale(this.scale); super.toggleDoor(door1Closed, door1Opened); // Puerta izquierda del armario - let door2Closed = this.add.image(2500 * scale, 330 * scale, 'wardrobeDoor2Closed').setOrigin(0, 0).setScale(scale); - let door2Opened = this.add.image(2435 * scale, 307 * scale, 'wardrobeDoor2Opened').setOrigin(0, 0).setScale(scale); + let door2Closed = this.add.image(2500 * this.scale, 330 * this.scale, 'wardrobeDoor2Closed').setOrigin(0, 0).setScale(this.scale); + let door2Opened = this.add.image(2435 * this.scale, 307 * this.scale, 'wardrobeDoor2Opened').setOrigin(0, 0).setScale(this.scale); super.toggleDoor(door2Closed, door2Opened); // Puerta derecha del armario - let door3Closed = this.add.image(3155 * scale, 330 * scale, 'wardrobeDoor3Closed').setOrigin(1, 0).setScale(scale); - let door3Opened = this.add.image(3220 * scale, 330 * scale, 'wardrobeDoor3Opened').setOrigin(1, 0).setScale(scale); + let door3Closed = this.add.image(3155 * this.scale, 330 * this.scale, 'wardrobeDoor3Closed').setOrigin(1, 0).setScale(this.scale); + let door3Opened = this.add.image(3220 * this.scale, 330 * this.scale, 'wardrobeDoor3Opened').setOrigin(1, 0).setScale(this.scale); super.toggleDoor(door3Closed, door3Opened); + + // Interior de los armarios. Se reordenan las profundidades de las puertas de los armarios + // para hacer click sobre el elemento correcto. Al hacer click sobre el interior del armario, + // se cambia el nodo en el dialogManager. El nodo que se pone es nulo por defecto, y se tiene + // que establecer en la creacion de la escena + this.wardrobe1Node = null; + this.wardrobe2Node = null; + + let wardrobe1 = this.add.rectangle(door1Closed.x, door1Closed.y, door1Closed.displayWidth, door1Closed.displayHeight, 0xfff, 0).setOrigin(0, 0); + door1Closed.setDepth(bg.depth + 3); + door1Opened.setDepth(door1Closed.depth - 1); + wardrobe1.setDepth(door1Opened.depth - 1); + wardrobe1.setInteractive(); + wardrobe1.on('pointerdown', () => { + if (door1Opened.visible) { + this.dialogManager.setNode(this.wardrobe1Node) + } + }); + + let wardrobe2 = this.add.rectangle(door2Closed.x, door2Closed.y, door2Closed.displayWidth + door3Closed.displayWidth - 15, door1Closed.displayHeight, 0xfff, 0).setOrigin(0, 0); + door2Closed.setDepth(bg.depth + 4); + door2Opened.setDepth(door2Closed.depth - 1); + door3Closed.setDepth(bg.depth + 3); + door3Opened.setDepth(door2Closed.depth - 1); + wardrobe2.setDepth(door2Opened.depth - 1); + wardrobe2.setInteractive(); + wardrobe2.on('pointerdown', () => { + if (door2Opened.visible || door3Opened.visible) { + this.dialogManager.setNode(this.wardrobe2Node) + } + }) + + + // Ordenador + // Al hacer click sobre el, se cambia el nodo en el dialogManager, y si + // se lanza el evento turnPC, se cambia a la escena del ordenador + this.pcNode = null; + + let pc = this.add.rectangle(276, 360, 150, 162, 0xfff, 0).setOrigin(0, 0); + pc.setInteractive(); + pc.on('pointerdown', () => { + this.dialogManager.setNode(this.pcNode); + }); + this.dispatcher.add("turnPC", this, (obj) => { + console.log(obj); + this.gameManager.switchToComputer(); + }); + + // Silla + this.chair = this.add.image(770 * this.scale, 859 * this.scale, 'bedroomChair').setOrigin(0, 0).setScale(this.scale); + // Puerta de la habitacion - let doorClosed = this.add.image(6, this.CANVAS_HEIGHT, 'bedroomDoorClosed').setOrigin(0, 1).setScale(scale); - let doorOpened = this.add.image(6, this.CANVAS_HEIGHT, 'bedroomDoorOpened').setOrigin(0, 1).setScale(scale); + let doorClosed = this.add.image(6, this.CANVAS_HEIGHT, 'bedroomDoorClosed').setOrigin(0, 1).setScale(this.scale); + let doorOpened = this.add.image(6, this.CANVAS_HEIGHT, 'bedroomDoorOpened').setOrigin(0, 1).setScale(this.scale); super.toggleDoor(doorClosed, doorOpened, false); // Al hacer click sobre la puerta abierta, se pasa a la siguiente escena @@ -56,11 +107,20 @@ export default class BedroomBase extends BaseScene { this.gameManager.changeScene(this.nexScene); }); + // Cama - this.bed = this.add.image(bg.displayWidth, this.CANVAS_HEIGHT, 'bed').setOrigin(1, 1).setScale(scale); + // Al igual que con el interior de los armarios, se recoloca su profundidad y al + // hacer click sobre ella, se cambia el nodo en el dialogManager + this.bed = this.add.image(bg.displayWidth, this.CANVAS_HEIGHT, 'bed').setOrigin(1, 1).setScale(this.scale); this.bed.setInteractive(); - + this.bed.setDepth(10); + this.bedNode = null; + this.bed.on('pointerdown', () => { + this.dialogManager.setNode(this.bedNode) + }) + + this.gameManager.setValue(this.gameManager.bagPicked, false); this.cameras.main.scrollX = bg.displayWidth - this.CANVAS_WIDTH; } diff --git a/src/scenes/gameLoop/day1/bedroomMorningDay1.js b/src/scenes/gameLoop/day1/bedroomMorningDay1.js index 73207b8..733bd62 100644 --- a/src/scenes/gameLoop/day1/bedroomMorningDay1.js +++ b/src/scenes/gameLoop/day1/bedroomMorningDay1.js @@ -9,5 +9,38 @@ export default class BedroomMorningDay1 extends BedroomBase { super.create(); this.nexScene = "Test"; + + let nodes = this.cache.json.get('bedroomMorningDay1'); + + this.wardrobe1Node = super.readNodes("root", nodes.wardrobe1, "day1/bedroomMorningDay1", true); + this.wardrobe2Node = super.readNodes("root", nodes.wardrobe2, "day1/bedroomMorningDay1", true); + this.pcNode = super.readNodes("root", nodes.pc, "day1/bedroomMorningDay1", true); + this.bedNode = super.readNodes("root", nodes.bed, "day1/bedroomMorningDay1", true); + + // Mochila + let bagNode = super.readNodes("root", nodes.bag, "day1/bedroomMorningDay1", true); + let bag = this.add.image(170, this.CANVAS_HEIGHT - 170, 'bag').setOrigin(0, 0).setScale(this.scale); + bag.setInteractive(); + bag.on('pointerdown', () => { + this.dialogManager.setNode(bagNode) + }); + + // Chaqueta + this.add.image(852 * this.scale + 1, 848 * this.scale - 1, 'bedroomJacket').setOrigin(0, 0).setScale(this.scale); + + + this.dispatcher.add("turnPC", this, (obj) => { + console.log(obj); + this.gameManager.setValue(this.gameManager.isLate, true); + let hour = this.i18next.t("clock.pcLateHour", { ns: "phoneInfo", returnObjects: true }); + this.phoneManager.phone.setDayInfo(hour, ""); + }); + this.dispatcher.add("pickBag", this, (obj) => { + console.log(obj); + this.gameManager.setValue(this.gameManager.bagPicked, true); + bag.visible = false; + }); + + this.cameras.main.scrollX = 0; } } diff --git a/src/scenes/test.js b/src/scenes/test.js index dd45ae0..ef4dc11 100644 --- a/src/scenes/test.js +++ b/src/scenes/test.js @@ -9,7 +9,7 @@ export default class Test extends BaseScene { // Metodo que se llama al terminar de crear la escena. onCreate() { super.onCreate(); - // this.phoneManager.activate(true); + // this.phoneManager.showPhone(true); // this.phoneManager.openEyesAnimation(); // this.phoneManager.phone.toAlarmScreen(); this.phoneManager.topLid.visible = false; @@ -24,10 +24,10 @@ export default class Test extends BaseScene { let test3 = this.cache.json.get('chat1'); let computerTest = this.cache.json.get('computer'); - let momNode = super.readNodes("root", test1, "momDialog", this.gameManager.getUserInfo().name, this.gameManager.getUserInfo().gender, true); - let dadNode = super.readNodes("root", test2, "dadDialog", this.gameManager.getUserInfo().name, this.gameManager.getUserInfo().gender, true); - let choices = super.readNodes("root", test3, "chat1", this.gameManager.getUserInfo().name, this.gameManager.getUserInfo().gender, true); - let computerNode = super.readNodes("root1", computerTest, "computer", this.gameManager.getUserInfo().name, this.gameManager.getUserInfo().gender, true); + let momNode = super.readNodes("root", test1, "momDialog", true); + let dadNode = super.readNodes("root", test2, "dadDialog", true); + let choices = super.readNodes("root", test3, "chat1", true); + let computerNode = super.readNodes("root1", computerTest, "computer", true); // Telefono let chatName = this.i18next.t("textMessages.chat1", { ns: "phoneInfo", returnObjects: true });