Add Peter & Clara happiness conditions
[wgj58.git] / wgj58.js
index 78cd42b4726f0c8bbda38238777fb2584f2b5f16..66344a869c6aef49a03cbf89359ecd4ac78b4e37 100644 (file)
--- a/wgj58.js
+++ b/wgj58.js
@@ -160,6 +160,7 @@ class Player extends Phaser.Sprite {
                this.loadTexture(npc.key);
                npc.kill();
                this.disguise = npc;
+               logic.gameinterface.dropNoticeTimeout(Phaser.Timer.SECOND * 5, "You are now identified as " + npc.fullname + "!");
        }
 }
 
@@ -172,11 +173,13 @@ class GameNPC extends Phaser.Sprite {
                this.interaction_distance = interaction_distance;
                this.interactable = false;
                this.talkcount = 0;
+               this.happy = false;
        }
 
        kill() {
                super.kill();
                this.exists = false;
+               this.happy = false;                     // Dead people are not happy.
        }
 
        update() {
@@ -215,6 +218,11 @@ class GameNPC extends Phaser.Sprite {
                return true;
        }
 
+       makeHappy() {
+               this.happy = true;
+               console.log(this.shortname, "is happy!");
+       }
+
        offscreenTeleportation(newPosition, callback, callbackValue) {
                this.teleport_instructions = { newPosition: newPosition, callback: callback, callbackValue: callbackValue };
                console.log("Offscreen teleport request registered:", this.teleport_instructions);
@@ -412,6 +420,7 @@ class NPC_Saiki extends GameNPC {
                                                { actor: logic.player, text: "Haha! I always get it, Saiki!" } ] ));
                                        logic.closeDoor("carlosdoor");
                                        logic.openDoor("saikidoor");
+                                       logic.openDoor("peterdoor");
                                        break;
                                case 1:
                                        logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Now that I think about it, there's still one thing. You could look into why the access control system is acting so funny today." },
@@ -499,6 +508,8 @@ class NPC_Saiki extends GameNPC {
        actionTake() {
                logic.closeDoor("carlosdoor");
                logic.openDoor("saikidoor");
+               logic.openDoor("peterdoor");
+               logic.carlos.kill();
                return super.actionTake();
        }
 
@@ -508,6 +519,116 @@ class NPC_Saiki extends GameNPC {
 
        tpDone(value) {
                console.log("Woot-woot! Teleport complete:", value);
+               value.makeHappy();
+               logic.carlos.makeHappy();
+               // FIXME: Need to find a prettier way than this.
+               logic.carlos.update = function() { };           // Disable Carlos' interaction. (Saiki will talk for him.)
+       }
+}
+
+class NPC_Peter extends GameNPC {
+       actionTalk() {
+               if (logic.carlos.alive) {
+                       switch (this.talkcount) {
+                               case 0:
+                                       logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Hi Peter! What's up?" },
+                                               { actor: this, text: "Hi John! Bianca has locked herself in the large meeting room." },
+                                               { actor: logic.player, text: "Why would she do that?" },
+                                               { actor: this, text: "I have no idea." },
+                                               { actor: this, text: "Normally, I would give a fuck about what she's doing and her problems, but I want to hold a meeting in an hour." },
+                                               { actor: logic.player, text: "That was rude. I think you should care more about your colleagues." },
+                                               { actor: this, text: "Ahh... You're right. I didn't mean it. I'm just so frustrated about all the shit going on here." } ] ));
+                                       logic.closeDoor("saikidoor");
+                                       logic.openDoor("peterdoor");
+                                       logic.openDoor("biancadoor");
+                                       break;
+                               case 1:
+                                       logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "See... Would you talk to Bianca? We don't understand each other pretty well. That's why I'd rather wouldn't make a shot." } ] ));
+                                       break;
+                               default:
+                                       if ((logic.clara.talkcount >= 5) && (this.talkcount == 2)) {
+                                               logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Do you know Clara from the Reception?" },
+                                                       { actor: this, text: "Of course I do." },
+                                                       { actor: logic.player, text: "I think she's mad at me..." },
+                                                       { actor: this, text: "Why would she?" },
+                                                       { actor: logic.player, text: "I kind of... asked her out." },
+                                                       { actor: logic.player, text: "She said no." },
+                                                       { actor: this, text: "What the heck, dude?" },
+                                                       { actor: this, text: "..." },
+                                                       { actor: this, text: "You should know it's against the company etiquette..." },
+                                                       { actor: this, text: "Regardless, I don't think she's really mad. You're a cool guy." },
+                                                       { actor: logic.player, text: "I hope this will be sorted out... I totally accept her answer, but I wouldn't like her to have negative feelings towards me." } ] ));
+                                               this.offscreenTeleportation(new Phaser.Point(logic.clara.x - 160, logic.clara.y), this.tpDone, this);
+                                       }
+                                       else {
+                                               logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "I'm kind of busy, man." } ] ));
+                                       }
+                       }
+               }
+               else {
+                       switch (this.talkcount) {
+                               case 0:
+                                       logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "What a wonderful day, Peter!" },
+                                               { actor: this, text: "Yikes! Saiki! You scared me!" },
+                                               { actor: logic.player, text: "I didn't even say \"boo\"." },
+                                               { actor: this, text: "Are you OK? You look horrible! You should really see a doctor." },
+                                               { actor: logic.player, text: "I'm fine, Peter. And you?" },
+                                               { actor: this, text: "No... Not at all." },
+                                               { actor: logic.player, text: "I'm sorry to hear that..." } ] ));
+                                       break;
+                               case 1:
+                                       logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Don't come closer to me!" },
+                                               { actor: logic.player, text: "Why?" },
+                                               { actor: this, text: "I don't mean to offend you, but... you really creep me out..." },
+                                               { actor: logic.player, text: "Why do you say that?" },
+                                               { actor: this, text: "I honestly can't tell what's wrong with you, but... you look like that ghost girl from The Ring!" } ] ));
+                                       break;
+                               case 2:
+                                       logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Now that was pretty much racist..." },
+                                               { actor: logic.player, text: "Just because I have a Japanese name and long black hair, that makes me immediately look like the Japanese girl from Ring when I'm sick?" },
+                                               { actor: this, text: "Geez... that's not even a Japanese movie! And the actress is American..." },
+                                               { actor: logic.player, text: "The original movie is Japanese." },
+                                               { actor: this, text: "I don't care... Just... keep distance, please!" } ] ));
+                                       break;
+                               default:
+                                       if (Phaser.Math.random() < 0.5) {
+                                               logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "STAY AWAY FROM ME!" } ] ));
+                                       }
+                                       else {
+                                               logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "DON'T COME ANY CLOSER!" } ] ));
+                                       }
+                       }
+               }
+               super.actionTalk();
+       }
+
+       actionTake() {
+               logic.closeDoor("saikidoor");
+               logic.openDoor("peterdoor");
+               logic.openDoor("biancadoor");
+               return super.actionTake();
+       }
+
+       endTalk() {
+               return (logic.saiki.alive) && (this.talkcount < 3);
+       }
+
+       tpDone(value) {
+               console.log("Woot-woot! Teleport complete:", value);
+               value.makeHappy();
+               logic.clara.makeHappy();
+               // FIXME: Need to find a prettier way than this.
+               logic.clara.update = function() { };            // Disable Clara's interaction. (Peter will talk for him.)
+       }
+}
+
+class NPC_Bianca extends GameNPC {
+       actionTake() {
+               // All doors open for you if you have all the cards.
+               logic.openDoor("cutedoor");
+               logic.openDoor("carlosdoor");
+               logic.openDoor("saikidoor");
+               return super.actionTake();
        }
 }
 
@@ -583,6 +704,11 @@ class GameInterface extends Phaser.Group {
                this.text_notice.visible = true;
        }
 
+       dropNoticeTimeout(timeout, text) {
+               this.dropNotice(text);
+               game.time.events.add(timeout, this.clearNotice, this);
+       }
+
        clearNotice() {
                this.back_notice.visible = false;
                this.text_notice.visible = false;
@@ -724,6 +850,14 @@ class GameLogic {
                                newChar = new NPC_Saiki(object.x, object.y, 'saiki', "Saiki", "Saiki Ytpme", 150);
                                this.saiki = newChar;
                                break;
+                       case 'peter':
+                               newChar = new NPC_Peter(object.x, object.y, 'peter', "Peter", "Peter Tluaf", 225);
+                               this.peter = newChar;
+                               break;
+                       case 'bianca':
+                               newChar = new NPC_Bianca(object.x, object.y, 'bianca', "Bianca", "Bianca Gnihton", 150);
+                               this.bianca = newChar;
+                               break;
                        default:
                                console.error("Unknown character:", object);
                }
@@ -785,6 +919,10 @@ class GameLogic {
                this.doors.children.forEach(function(o) { if (o.name == doorname) o.close(); });
        }
 
+       checkAllHappy() {
+               return (this.clara.happy) && (this.carlos.happy) && (this.saiki.happy);
+       }
+
        update() {
                if ((game.input.keyboard.isDown(Phaser.Keyboard.ENTER)) && (hasTimePassed(this.last_menuselect, WAIT_MENUSTEP))) {
                        if ((this.player.interactablenpc) && (this.player.interactablenpc.interactable) && (!this.gameinterface.inMenu) && (!this.gameinterface.inTalk)) {
@@ -804,7 +942,7 @@ class GamePlay extends Phaser.State {
                super();
                logic = new GameLogic();
                game.world.updateOnlyExistingChildren = true;
-               //game.state.add('GameOver', GameOver, false);
+               game.state.add('GameOver', GameOver, false);
 
        }
 
@@ -814,6 +952,8 @@ class GamePlay extends Phaser.State {
                game.load.image('clara', 'clara.png');
                game.load.image('carlos', 'carlos.png');
                game.load.image('saiki', 'saiki.png');
+               game.load.image('peter', 'peter.png');
+               game.load.image('bianca', 'bianca.png');
                game.load.image('tileset', 'tileset.png');
                game.load.image('objects', 'objects.png');
                game.load.tilemap('gamemap', 'tilemap.json', null, Phaser.Tilemap.TILED_JSON);
@@ -857,3 +997,50 @@ class GamePlay extends Phaser.State {
 
        }
 }
+
+class GameOver extends Phaser.State {
+
+       create() {
+
+               console.log("Entered GameOver state.");
+               game.stage.removeChildren(1);
+               game.camera.follow(logic.player);
+               logic.player.freeze();
+
+               var g = game.add.group(game.stage, "GAMEOVER");
+               this.back_gameover = new Phaser.Graphics(game, 100, game.height / 2 - 200);
+               this.back_gameover.beginFill(0x000000);
+               this.back_gameover.drawRect(0, 0, game.width - 200, 400);
+               this.back_gameover.endFill();
+               this.back_gameover.lineStyle(3, Phaser.Color.YELLOW, 1);
+               this.back_gameover.moveTo(10, 35);
+               this.back_gameover.lineTo(this.back_gameover.width - 10, 35);
+               g.add(this.back_gameover);
+               var style = { align: 'left', fill: 'yellow', font: 'Ubuntu Mono', fontSize: 22, fontWeight: 'bold' };
+               this.text_title = new Phaser.Text(game, this.back_gameover.x + 15, this.back_gameover.y + 6, "ABRUPT GAME OVER", style);
+               g.add(this.text_title);
+               style = { align: 'left', fill: 'white', font: 'Ubuntu Mono', fontSize: 18, fontWeight: 'bold' };
+               this.text_gameover = new Phaser.Text(game, this.back_gameover.x + 35, this.back_gameover.y + 60, null, style);
+               this.text_gameover.wordWrap = true;
+               this.text_gameover.wordWrapWidth = this.back_gameover.width - 70;
+               this.text_gameover.lineSpacing = -5;
+               g.add(this.text_gameover);
+
+               this.text_gameover.text = this.assess();
+
+       }
+
+       assess() {
+               if (logic.checkAllHappy()) {
+                       return "You listened to all of your colleagues' and affected them to make their day a little better. Next day, the company fired Clara, Carlos, Saiki, and you, to comply with its productivity requirements. The company's internal code demand unconditional and illimitable loyalty from employees to maximize productivity. This includes requisites for employees not to exercise human qualities or express personal needs within and outside the corporate environment. The company has determined that neither of the mentioned people complied to these guidelines, due to the amount of socialization they pursued during the work day.\n\nIronically, the layoffs turned everyone's life for the better.";
+               }
+               else if (logic.player.disguise) {
+                       this.text_gameover.style.fill = 'red';
+                       return "You went on your day to accomplish your tasks without caring about anyone. Where are your colleagues now? Clara, Carlos, Saiki? You don't know. But you don't even care. You have never seen them after they served your needs.\n\nNext day, the company promoted you for your effectiveness and loyalty.";
+               }
+               else {
+                       return "The company is concerned that you may develop other needs (like wanting to pursue hobbies, spend time with friends and family) those compete for the time you devote for your job. The company reminds you that they demand your entire being to exclusively serve the company's interests. Socializing with your colleagues outside the dedicated team building occasions may hurt your performance. To comply with the productivity requirements, the company has terminated your employment.\n\nClara, Carlos, Saiki are still loyal employees of the company. Probably you could have done something different to find a better outcome.";
+               }
+       }
+
+}