1 var game
= new Phaser
.Game(800, 600, Phaser
.AUTO
, '', { preload: function() { this.state
.add('GamePlay', GamePlay
, true); } });
5 const PLAYER_SPEED
= 200;
6 const WAIT_MENUSTEP
= 100;
9 const MENUITEM_TALK
= 0;
10 const MENUITEM_LEAVE
= 1;
11 const MENUITEM_TAKE
= 2;
13 const GUI_MENUITEM_DISTANCE
= 20;
15 window
.addEventListener("keydown", function(e
) {
16 // Prevent default browser action for arrows and spacebar
17 if([32, 37, 38, 39, 40].indexOf(e
.keyCode
) > -1) {
22 function hasTimePassed(time
, delay
) {
23 return (game
.time
.now
- time
) > delay
;
27 // dialogue is array of {actor, text} records.
28 constructor(dialogue
) {
29 this.dialogue
= dialogue
;
34 return this.dialogue
[this.state
];
42 class Door
extends Phaser
.TileSprite
{
43 constructor(x
, y
, name
, rotation
, vector
, longpanel
) {
44 super(game
, x
, y
, 64, 64, 'objects');
46 this.longpanel
= longpanel
;
48 this.anchor
= new Phaser
.Point(0.5, 0.5);
49 this.tilePosition
= new Phaser
.Point(-64, -64);
50 this.openvector
= Phaser
.Point
.multiply(vector
, new Phaser
.Point(56, 56));
54 this.anchor
= new Phaser
.Point(0.75, 0.5);
55 this.tilePosition
= new Phaser
.Point(0, -64);
56 this.openvector
= Phaser
.Point
.multiply(vector
, new Phaser
.Point(116, 116));
58 if (rotation
=== undefined) rotation
= 0;
59 this.rotation
= rotation
* (Math
.PI
/ 180);
60 this.closetween
= game
.add
.tween(this).to({ x
: this.position
.x
, y
: this.position
.y
}, 1000, Phaser
.Easing
.Sinusoidal
.InOut
, false, 0, 0, false);
61 this.openposition
= Phaser
.Point
.add(this.position
, this.openvector
);
62 this.opentween
= game
.add
.tween(this).to({ x
: this.openposition
.x
, y
: this.openposition
.y
}, 1000, Phaser
.Easing
.Sinusoidal
.InOut
, false, 0, 0, false);
64 game
.physics
.arcade
.enable(this);
65 this.body
.immovable
= true;
66 this.setBody(rotation
);
73 this.body
.setSize(this.width
, 10, this.longpanel
* (rotation
/ 180) * 64, 27);
77 this.body
.setSize(10, this.width
, 27 + (this.longpanel
* 64), this.longpanel
* ((rotation
- 270) / 180) * 64);
80 console
.log("Unable to set body due to unknown rotation:", rotation
);
86 this.opentween
.start();
93 this.closetween
.start();
99 game
.debug
.body(this);
103 class Player
extends Phaser
.Sprite
{
105 super(game
, x
, y
, 'player');
106 this.y
-= this.height
;
107 this.shortname
= "John";
108 this.fullname
= "John Evals";
109 this.offerInteraction(null);
114 game
.physics
.arcade
.enable(this);
115 this.body
.bounce
.y
= 0.2;
116 this.body
.bounce
.x
= 0.2;
117 this.body
.collideWorldBounds
= true;
121 if ((this.alive
) && (!this.freezed
))
123 if (cursors
.left
.isDown
)
125 this.body
.velocity
.x
= -PLAYER_SPEED
;
127 else if (cursors
.right
.isDown
)
129 this.body
.velocity
.x
= PLAYER_SPEED
;
131 if (cursors
.up
.isDown
)
133 this.body
.velocity
.y
= -PLAYER_SPEED
;
135 else if (cursors
.down
.isDown
)
137 this.body
.velocity
.y
= PLAYER_SPEED
;
143 this.body
.velocity
.x
= this.body
.velocity
.y
= 0;
152 this.freezed
= false;
155 offerInteraction(npc
) {
156 this.interactablenpc
= npc
;
160 this.loadTexture(npc
.key
);
163 logic
.gameinterface
.dropNoticeTimeout(Phaser
.Timer
.SECOND
* 5, "You are now identified as " + npc
.fullname
+ "!");
167 class GameNPC
extends Phaser
.Sprite
{
168 constructor(x
, y
, key
, shortname
, fullname
, interaction_distance
) {
169 super(game
, x
, y
, key
);
170 this.y
-= this.height
;
171 this.shortname
= shortname
;
172 this.fullname
= fullname
;
173 this.interaction_distance
= interaction_distance
;
174 this.interactable
= false;
182 this.happy
= false; // Dead people are not happy.
187 if ((!this.interactable
) && (game
.physics
.arcade
.distanceBetween(this, logic
.player
) < this.interaction_distance
)) {
188 logic
.gameinterface
.dropNotice("(ENTER) Interact with " + this.shortname
+ "!");
189 logic
.player
.offerInteraction(this);
190 this.interactable
= true;
192 else if ((this.interactable
) && (game
.physics
.arcade
.distanceBetween(this, logic
.player
) > this.interaction_distance
)) {
193 logic
.gameinterface
.clearNotice();
194 logic
.player
.offerInteraction(null);
195 this.interactable
= false;
197 if ((this.teleport_instructions
) && (game
.physics
.arcade
.distanceBetween(this, logic
.player
) > (game
.width
+ 200))) {
198 this.position
= this.teleport_instructions
.newPosition
;
199 this.teleport_instructions
.callback(this.teleport_instructions
.callbackValue
);
200 this.teleport_instructions
= null;
212 logic
.player
.offerInteraction(null);
213 logic
.player
.takeMe(this);
227 console
.log(this.shortname
, "is happy!");
230 offscreenTeleportation(newPosition
, callback
, callbackValue
) {
231 this.teleport_instructions
= { newPosition
: newPosition
, callback
: callback
, callbackValue
: callbackValue
};
232 console
.log("Offscreen teleport request registered:", this.teleport_instructions
);
236 class NPC_Clara
extends GameNPC
{
238 switch (this.talkcount
) {
240 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "What a morning..." },
241 { actor
: logic
.player
, text
: "Hi Clara! What happened?" },
242 { actor
: this, text
: "No one cares to tell. I just know that I have to log on people manually, as the access control system doesn't work properly." },
243 { actor
: logic
.player
, text
: "Hmm... I'll look into it. Maybe it's just that everyone is fired." },
244 { actor
: this, text
: "Haha! Wouldn't joke about this, though, due to the recent layoffs." },
245 { actor
: logic
.player
, text
: "Well, maybe if we dare to joke about it, it won't happen to us..." },
246 { actor
: this, text
: "Wish it worked like that... Is it some superstition like the belief that having an umbrella with you prevents rain?" },
247 { actor
: logic
.player
, text
: "Nah, that actually works; it's not a superstition, but Murphy's Law!" },
248 { actor
: this, text
: "If you say so..." },
249 { actor
: this, text
: "Anyway, I logged you in and opened the door for you." } ] ));
250 logic
.openDoor("cutedoor");
253 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "John, have you ever thought about losing your employee card?" },
254 { actor
: logic
.player
, text
: "Yeah, you'd just get a new one." },
255 { actor
: this, text
: "You don't understand me, John!" },
256 { actor
: this, text
: "..." },
257 { actor
: this, text
: "I mean... Losing it for real..." },
258 { actor
: this, text
: "Doesn't it feel like it's the culmination of your being?" },
259 { actor
: this, text
: "If I had no card, would I still exist?" },
260 { actor
: logic
.player
, text
: "..." },
261 { actor
: logic
.player
, text
: "You sound very philosophical today." } ] ));
266 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Would you like to hear a random fun fact?" },
267 { actor
: logic
.player
, text
: "Of course!" },
268 { actor
: this, text
: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s," },
269 { actor
: this, text
: "when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap" },
270 { actor
: this, text
: "into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem" },
271 { actor
: this, text
: "Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." },
272 { actor
: logic
.player
, text
: "That's very interesting, I didn't know that!" },
273 { actor
: logic
.player
, text
: "Thanks for sharing, Clara!" } ] ));
276 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Would you like to hear a random fun fact?" },
277 { actor
: logic
.player
, text
: "Of course!..." },
278 { actor
: logic
.player
, text
: "But first..." },
279 { actor
: this, text
: "What is it?" },
280 { actor
: logic
.player
, text
: "..." },
281 { actor
: logic
.player
, text
: "Never mind, go on with what you wanted to say." },
282 { actor
: this, text
: "Lorem Ipsum is simply dummy text of the printing and typesetting industry..." },
283 { actor
: logic
.player
, text
: "I knew that already..." },
284 { actor
: logic
.player
, text
: "But..." },
285 { actor
: logic
.player
, text
: "Would you go out on a date with me?" },
286 { actor
: this, text
: "..." },
287 { actor
: this, text
: "No." } ] ));
290 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "..." } ] ));
296 logic
.gameinterface
.dropNotice(this.shortname
+ ": Have a great day, John!");
300 logic
.openDoor("cutedoor");
301 return super.actionTake();
305 return (this.talkcount
< 6);
309 class NPC_Carlos
extends GameNPC
{
311 if (logic
.clara
.alive
) {
312 if (logic
.saiki
.talkcount
== 0) {
313 switch (this.talkcount
) {
315 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Good morning, Carlos! What's up?" },
316 { actor
: this, text
: "Hey, John! Not too much, I'm just trying to sell some shit to this new client." },
317 { actor
: logic
.player
, text
: "And so? Is it hard to convince them?" },
318 { actor
: this, text
: "Of course, they don't want to buy. It's shit." },
319 { actor
: this, text
: "I mean, who would want to buy shit?" },
320 { actor
: logic
.player
, text
: "Yeah. Relatable... But why are you trying to sell shit? I mean, why not one of our cutting edge technologies?" },
321 { actor
: this, text
: "They couldn't afford it." },
322 { actor
: logic
.player
, text
: "Then why are you trying to sell them... anything at all? They'd better off with a cheaper company." },
323 { actor
: this, text
: "Company policies. Plus the management instructed me to sell to them, no matter what." },
324 { actor
: logic
.player
, text
: "That sucks... Well... good luck!" },
325 { actor
: this, text
: "Thanks..." } ] ));
326 logic
.closeDoor("cutedoor");
327 logic
.openDoor("carlosdoor");
330 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "*Sigh.* I'll probably not work here for long, if I can't sell this shit to the customer." },
331 { actor
: this, text
: "These layoffs are terrifying. They let go of anyone for even the slightest mistake." },
332 { actor
: logic
.player
, text
: "But it's not a mistake when our client doesn't buy something they don't need." },
333 { actor
: this, text
: "Tell this to my boss..." } ] ));
336 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "You know, generally, I think it sucks being a child. One thing I miss though, if you're a child, you're allowed to be silly." },
337 { actor
: this, text
: "..." },
338 { actor
: this, text
: "For example, when my Dad told me that semen is the seed of animals, I theoretized, if I'd bury some pig semen in the garden, a pig would grow out of it..." },
339 { actor
: this, text
: "I was totally fascinated by the thought, because I really wanted to have a pet pig, but Dad wouldn't let me have one." },
340 { actor
: this, text
: "So I thought I could grow my own pig in the garden from pig seeds!" },
341 { actor
: logic
.player
, text
: "Interesting. Where are you going with this?" },
342 { actor
: this, text
: "I don't know... sometimes I feel like I'd rather sell pig semen to our clients, heh!" },
343 { actor
: this, text
: "Uhm..." },
344 { actor
: this, text
: "Totally don't tell this to Saiki!" } ] ));
345 this.pigsemen
= true;
348 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Weren't you heading to the IT department to the right?" },
349 { actor
: this, text
: "You know... the green department which looks way better than blue!" },
350 { actor
: this, text
: "..." },
351 { actor
: this, text
: "Damn, why do I have to work in blue? I just feel... so blue about it." } ] ));
354 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Weren't you heading to the conveniently green department to the right? I guess Saiki is waiting for you." },
355 { actor
: this, text
: "You're so lucky that you can work with her every day!" } ] ));
358 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Guess you'll stay here then. It's cool, you're great company anyway." } ] ));
362 switch (this.talkcount
) {
364 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Phew... long shift, I gotta go!" },
365 { actor
: this, text
: "Why are you still here? I mean, you engineers stay here 'til late at night. Why don't you just go home at 4 pm?" },
366 { actor
: this, text
: "This is why I can never ask out Saiki... She always works for so long..." },
367 { actor
: logic
.player
, text
: "We tend to have lots of work with impossible deadlines..." },
368 { actor
: this, text
: "I bet you get lots of money for the overtimes!" },
369 { actor
: logic
.player
, text
: "No, we don't get paid for overtimes." },
370 { actor
: this, text
: "... Then why do you stay beyond the office hours?" },
371 { actor
: logic
.player
, text
: "Otherwise we're fired. That's the deal. Either we work 2 extra hours or we get replaced." },
372 { actor
: this, text
: "Wow... and I thought we have a shortage on engineers..." } ] ));
375 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "And how's the business going? Did you manage to shell the shit?" },
376 { actor
: this, text
: "In a heartbeat! Now they're buying so much shit that I'm afraid we don't have enough assholes to produce that quantity." },
377 { actor
: this, text
: "Be prepared for another month of overtimes. This deal will be huge!" },
378 { actor
: logic
.player
, text
: "Well done, man!" } ] ));
381 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "I really want to leave now." } ] ));
382 this.offscreenTeleportation(new Phaser
.Point(0, 0), this.tpDone
, this);
387 switch (this.talkcount
) {
389 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Good morning, Carlos!" },
390 { actor
: this, text
: "Whoa, Clara! You have changed so much! I barely recognize you. What's up?" },
391 { actor
: logic
.player
, text
: "I need to talk to Saiki at the IT department, but... my card doesn't allow me to enter there." },
392 { actor
: this, text
: "Well... I can certainly help you with that..." },
393 { actor
: this, text
: "..." } ] ));
396 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Carlos. You promised to help me." },
397 { actor
: this, text
: "Uhm... It's just... Please give me 5 mins to finish this e-mail." },
398 { actor
: logic
.player
, text
: "I don't have much time, Carlos." },
399 { actor
: this, text
: "See, it's just 5 mins, please be patient. I have a chocolate bar in the fridge. I give it to you. Feel free to have it meanwhile." },
400 { actor
: logic
.player
, text
: "..." } ] ));
403 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Time is up, Carlos!" },
404 { actor
: this, text
: "Please give me just another min." },
405 { actor
: logic
.player
, text
: "Fine. Please just give me your card and I'll help myself!" },
406 { actor
: this, text
: "But... you know that company policies forbid that, Clara! Please just be a little more patient!" },
407 { actor
: logic
.player
, text
: "You will give me your card now or you will regret!" },
408 { actor
: this, text
: "...?" },
409 { actor
: this, text
: "You're not gonna treat me like this. Forget it!" },
410 { actor
: logic
.player
, text
: "You'll not work here tomorrow." } ] ));
413 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "..." } ] ));
420 if ((logic
.clara
.alive
) && (logic
.saiki
.talkcount
== 0)) {
421 logic
.gameinterface
.dropNotice(this.shortname
+ ": Bye, John! Pass on my greetings to Saiki!");
426 logic
.closeDoor("cutedoor");
427 logic
.openDoor("carlosdoor");
428 return super.actionTake();
432 return ((logic
.clara
.alive
) && (logic
.saiki
.talkcount
== 0)) || (this.talkcount
< 3);
436 console
.log("Woot-woot! Teleport complete:", value
);
437 value
.visible
= false;
441 class NPC_Saiki
extends GameNPC
{
443 /* If Saiki is happy, she's already teleported to Carlos. */
445 this.actionTalk_morning();
447 this.actionTalk_afternoon();
450 actionTalk_morning() {
451 if (logic
.carlos
.alive
) {
452 switch (this.talkcount
) {
454 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Hi Saiki!" },
455 { actor
: this, text
: "Hi John! Glad you arrived, here's some work for you!" },
456 { actor
: logic
.player
, text
: "Awesome! What is it?" },
457 { actor
: this, text
: "Haha, joking! Actually, our queue is suspiciously empty for today." },
458 { actor
: logic
.player
, text
: "Yeah... That's really suspicious!" },
459 { actor
: logic
.player
, text
: "Maybe I can get home today in time?" },
460 { actor
: this, text
: "You mean, you wouldn't spend the mandatory free extra working hours?" },
461 { actor
: this, text
: "You steal from the company! The company needs your unpaid hours of work! Otherwise, how would we finance the trash can I ordered for the department?" },
462 { actor
: this, text
: "*Whispers with wink.* I hope you get my sarcasm." },
463 { actor
: logic
.player
, text
: "Haha! I always get it, Saiki!" } ] ));
464 logic
.closeDoor("carlosdoor");
465 logic
.openDoor("saikidoor");
466 logic
.openDoor("peterdoor");
467 logic
.carlos
.resetTalk();
470 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." },
471 { actor
: this, text
: "Clara has to enter people manually." },
472 { actor
: logic
.player
, text
: "Yeah, I'll definitely check that." } ] ));
475 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "So... what's up with the trash can?" },
476 { actor
: this, text
: "I'm always up for such deep conversation" },
477 { actor
: this, text
: "about trash cans." },
478 { actor
: this, text
: "While we only have one trash can, other departments seem to be abundant of them. And ours is always filled. So I requested an additional trash can." },
479 { actor
: this, text
: "Now the ticket is in PENDING status. The latest work note is from two months ago, telling there is no budget at the moment." },
480 { actor
: logic
.player
, text
: "Hmm... Maybe it's too much to ask. Can we take one from another department?" },
481 { actor
: this, text
: "No, everyone holds on to their trash cans." },
482 { actor
: logic
.player
, text
: "You certainly did your research." },
483 { actor
: this, text
: "Of course. It's an important subject." } ] ));
486 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "My parents named me after a Japanese rock singer." },
487 { actor
: logic
.player
, text
: "Cool! Which band?" },
488 { actor
: this, text
: "I don't remember the band name. But the particular singer has a blue rose in her hair most of the time." } ] ));
491 if ((logic
.carlos
.pigsemen
) && (this.talkcount
== 4)) {
492 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Did you know that Carlos thought he can grow a pig by burying pig semen in the ground? What do you think about this?" },
493 { actor
: this, text
: "Hmm..." },
494 { actor
: this, text
: "I guess it didn't work." },
495 { actor
: this, text
: "So do you want to know what I think about this?" },
496 { actor
: this, text
: "..." },
497 { actor
: this, text
: "IT'S BRILLIANT!!!" },
498 { actor
: this, text
: "You know, it really sparkled my artistic vision! Now I must draw a pig with its legs rooted into the ground!" },
499 { actor
: logic
.player
, text
: "That's gross. Poor pig." },
500 { actor
: this, text
: "Indeed. But this is the point. He's stuck in one place, cannot move. Like you in life. So you feel sympathy for him." },
501 { actor
: logic
.player
, text
: "You have a point." },
502 { actor
: this, text
: "I think I'll catch Carlos and talk to him. I always liked that guy but I didn't know he's such imaginative." } ] ));
503 this.offscreenTeleportation(new Phaser
.Point(logic
.carlos
.x
, logic
.carlos
.y
+ 64), this.tpDone
, this);
506 if (Phaser
.Math
.random() < 0.5) {
507 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "I've found an orchestrated rendition of „Potential for Anything”. You'll have to check it out, it's breathtaking!" } ] ));
510 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "I don't like that our department is green. The blue one, where Carlos works, looks much better." } ] ));
516 switch (this.talkcount
) {
518 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "I love you, Saiki!" },
519 { actor
: this, text
: "Hi Carlos..." },
520 { actor
: logic
.player
, text
: "I'm infatuated by the mere thought of you." },
521 { actor
: this, text
: "Well... it sounds pretty much creepy." },
522 { actor
: logic
.player
, text
: "Will you go out on a date with me?" },
523 { actor
: this, text
: "..." },
524 { actor
: this, text
: "Sorry to hurt your feelings, but... even though I like you... Your sudden, unprecedented confession makes me scared." },
525 { actor
: this, text
: "Especially with that facial expression." },
526 { actor
: this, text
: "I mean... you're not even joking." },
527 { actor
: this, text
: "So sorry... I won't date you." } ] ));
530 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "I thought I could impress you." },
531 { actor
: this, text
: "I'm sorry." } ] ));
534 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "You will give me your card." },
535 { actor
: this, text
: "Geez, what for? Go back to your department and work!" },
536 { actor
: logic
.player
, text
: "I need it." },
537 { actor
: this, text
: "..." } ] ));
540 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Don't you have anything better to do, Carlos?" } ] ));
546 actionTalk_afternoon() {
547 if (logic
.peter
.alive
) {
548 switch (this.talkcount
) {
550 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Oh, hi John!" },
551 { actor
: logic
.carlos
, text
: "Hey John! Thanks for telling my secret to Saiki..." },
552 { actor
: logic
.player
, text
: "Really sorry man, but it was so funny!" },
553 { actor
: logic
.carlos
, text
: "Are you kidding me? It's the best thing you could have ever done!" },
554 { actor
: this, text
: "Yeah, I couldn't resist to come over here to talk about it, haha!" },
555 { actor
: logic
.carlos
, text
: "And we talked about lots of other stuff too..." },
556 { actor
: this, text
: "WE ASKED EACH OTHER OUT ON A DATE!!!" },
557 { actor
: logic
.carlos
, text
: "Yeah, Saiki finds gender equality so important that she had to take the role of the initiator, just in the right moment when I asked her out." },
558 { actor
: this, text
: "Oh, shut up! xD" },
559 { actor
: logic
.player
, text
: "Awesome, I'm so happy for you guys!" },
560 { actor
: logic
.player
, text
: "... Don't mean to ruin the fun, but have you finished with your work?" },
561 { actor
: logic
.carlos
, text
: "Who cares? It waits. I can totally sell the shit tomorrow." },
562 { actor
: this, text
: "Yeah, I'll commit my patch tomorrow morning. We definitely deserve some fun!" },
563 { actor
: logic
.player
, text
: "You say it right! Bye then." } ] ));
566 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Have a great evening, guys!" } ] ));
570 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Oh... hi Peter!..." },
571 { actor
: this, text
: "I wanted to talk to Carlos..." },
572 { actor
: this, text
: "Where is he? I mean, he often leaves early, but..." },
573 { actor
: this, text
: "I can't explain why, but somehow I have a very bad feeling about this. " },
574 { actor
: logic
.player
, text
: "..." } ] ));
580 if (logic
.carlos
.alive
) {
581 logic
.gameinterface
.dropNotice(this.shortname
+ ": It was nice talking to you!");
586 logic
.closeDoor("carlosdoor");
587 logic
.openDoor("saikidoor");
588 logic
.openDoor("peterdoor");
590 return super.actionTake();
594 return (logic
.carlos
.alive
) && (!this.happy
);
598 console
.log("Woot-woot! Teleport complete:", value
);
601 logic
.carlos
.makeHappy();
602 // FIXME: Need to find a prettier way than this.
603 logic
.carlos
.update = function() { }; // Disable Carlos' interaction. (Saiki will talk for him.)
607 class NPC_Peter
extends GameNPC
{
609 /* If Peter is happy, she's already teleported to Clara. */
611 this.actionTalk_morning();
613 this.actionTalk_afternoon();
616 actionTalk_morning() {
617 if (logic
.saiki
.alive
) {
618 switch (this.talkcount
) {
620 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Hi Peter! What's up?" },
621 { actor
: this, text
: "Hi John! Bianca has locked herself in the large meeting room." },
622 { actor
: logic
.player
, text
: "Why would she do that?" },
623 { actor
: this, text
: "I have no idea." },
624 { 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." },
625 { actor
: logic
.player
, text
: "That was rude. I think you should care more about your colleagues." },
626 { actor
: this, text
: "Ahh... You're right. I didn't mean it. I'm just so frustrated about all the shit going on here." } ] ));
627 logic
.closeDoor("saikidoor");
628 logic
.openDoor("peterdoor");
629 logic
.openDoor("biancadoor");
632 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." } ] ));
635 if ((logic
.clara
.talkcount
>= 5) && (this.talkcount
== 2)) {
636 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Do you know Clara from the Reception?" },
637 { actor
: this, text
: "Of course I do." },
638 { actor
: logic
.player
, text
: "I think she's mad at me..." },
639 { actor
: this, text
: "Why would she?" },
640 { actor
: logic
.player
, text
: "I kind of... asked her out." },
641 { actor
: logic
.player
, text
: "She said no." },
642 { actor
: this, text
: "What the heck, dude?" },
643 { actor
: this, text
: "..." },
644 { actor
: this, text
: "You should know it's against the company etiquette..." },
645 { actor
: this, text
: "Regardless, I don't think she's really mad. You're a cool guy." },
646 { 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." } ] ));
647 this.offscreenTeleportation(new Phaser
.Point(logic
.clara
.x
- 160, logic
.clara
.y
), this.tpDone
, this);
650 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "I'm kind of busy, man." } ] ));
655 switch (this.talkcount
) {
657 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "What a wonderful day, Peter!" },
658 { actor
: this, text
: "Yikes! Saiki! You scared me!" },
659 { actor
: logic
.player
, text
: "I didn't even say \"boo\"." },
660 { actor
: this, text
: "Are you OK? You look horrible! You should really see a doctor." },
661 { actor
: logic
.player
, text
: "I'm fine, Peter. And you?" },
662 { actor
: this, text
: "No... Not at all." },
663 { actor
: logic
.player
, text
: "I'm sorry to hear that..." } ] ));
666 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Don't come closer to me!" },
667 { actor
: logic
.player
, text
: "Why?" },
668 { actor
: this, text
: "I don't mean to offend you, but... you really creep me out..." },
669 { actor
: logic
.player
, text
: "Why do you say that?" },
670 { actor
: this, text
: "I honestly can't tell what's wrong with you, but... you look like that ghost girl from The Ring!" } ] ));
673 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Now that was pretty much racist..." },
674 { 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?" },
675 { actor
: this, text
: "Geez... that's not even a Japanese movie! And the actress is American..." },
676 { actor
: logic
.player
, text
: "The original movie is Japanese." },
677 { actor
: this, text
: "I don't care... Just... keep distance, please!" } ] ));
680 if (Phaser
.Math
.random() < 0.5) {
681 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "STAY AWAY FROM ME!" } ] ));
684 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "DON'T COME ANY CLOSER!" } ] ));
691 actionTalk_afternoon () {
692 if (logic
.bianca
.alive
) {
693 switch (this.talkcount
) {
695 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Hey John!" },
696 { actor
: logic
.player
, text
: "Hey, what's up?" },
697 { actor
: this, text
: "I just asked Clara out on a date!" },
698 { actor
: logic
.clara
, text
: "Shhhsh, don't brag about it! I'm a person, not a prize." },
699 { actor
: this, text
: "Sorry..." },
700 { actor
: logic
.clara
, text
: "It's OK... Uhm... Sorry, John... I always liked Peter... but when you asked me out, I felt intimidated and a little uncomfortable." } ] ));
703 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "I'm sorry, Clara, I didn't mean to be inappropriate... situations like this are always so complicated..." },
704 { actor
: logic
.clara
, text
: "Never mind, John. I didn't handle it properly either. Apology accepted." },
705 { actor
: this, text
: "Everyone's happy, I guess." },
706 { actor
: logic
.player
, text
: "Not really. Maybe I'm gonna be fired." },
707 { actor
: this, text
: "Haha, you're a joker!" } ] ));
710 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "*Whispers.* Khm, no offense, but it would be nice if you excused yourself and leave. You know how it is..." } ] ));
713 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Oh, time goes so fast... I have to go. Bye!" } ] ));
716 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "..." } ] ));
720 switch (this.talkcount
) {
722 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "..." },
723 { actor
: logic
.clara
, text
: "..." },
724 { actor
: logic
.player
, text
: "Hey there!... Uhm... Don't you have anything better to do?" },
725 { actor
: this, text
: "Yeah, I would totally have if you weren't been blocking the meeting room!" } ] ));
728 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Get back to work! Don't make me say it again!" } ] ));
735 logic
.closeDoor("saikidoor");
736 logic
.openDoor("peterdoor");
737 logic
.openDoor("biancadoor");
739 if (logic
.saiki
.talkcount
> 0) logic
.saiki
.kill();
740 return super.actionTake();
744 return (logic
.saiki
.alive
) && (this.talkcount
< 3) && (!this.happy
);
748 console
.log("Woot-woot! Teleport complete:", value
);
751 logic
.clara
.makeHappy();
752 // FIXME: Need to find a prettier way than this.
753 logic
.clara
.update = function() { }; // Disable Clara's interaction. (Peter will talk for him.)
757 class NPC_Bianca
extends GameNPC
{
759 if (logic
.peter
.alive
) {
760 switch (this.talkcount
) {
762 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "... Hi Bianca!" },
763 { actor
: this, text
: "... Hello John!" },
764 { actor
: logic
.player
, text
: "So I've been told, you've been spending most of the day in this meeting room..." },
765 { actor
: this, text
: "Yeah?" },
766 { actor
: logic
.player
, text
: "... Your colleagues want to hold a meeting in this room and you're blocking it." },
767 { actor
: this, text
: "Hmm... Kind of that's the point... There is no need for that meeting." },
768 { actor
: logic
.player
, text
: "May I know why?" },
769 { actor
: this, text
: "You must have heard about the layoffs. We weren't happy with that, but it was inevitable to meet the productivity requirements." },
770 { actor
: this, text
: "But today morning, I received a list with about 50% of the employees... Many of them are great friends of mine..." },
771 { actor
: this, text
: "We were like a big family here and we're torn apart like this... The worst is that I have to tell the news to all of them." },
772 { actor
: logic
.player
, text
: "That's rough. Does this company even need people?" },
773 { actor
: this, text
: "..." } ] ));
774 logic
.openDoor("cutedoor");
775 logic
.closeDoor("peterdoor");
778 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "Bianca... Am I on that list?" },
779 { actor
: this, text
: "Yes, John." },
780 { actor
: this, text
: "Well, I'll try to convince them to keep you and many other great folks from the list." },
781 { actor
: this, text
: "But... I can't promise anything. Also, it would help your case a lot if you made some notable work today, so I could mention it as your recent achievement." },
782 { actor
: logic
.player
, text
: "Thank you very much... I'll see what I can do." } ] ));
785 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "You seem to be somehow blaming yourself. It's not your fault. You're just doing your job." },
786 { actor
: this, text
: "I know. It's just part of my work..." },
787 { actor
: this, text
: "But if you have to sweep out such a great volume of people within such a short time... It does take its toll on the person." },
788 { actor
: this, text
: "... I feel like I'm growing distant from the company." },
789 { actor
: this, text
: "I mean... probably it's heresy to say that, but I feel I can less and less identify with the company's values." },
790 { actor
: logic
.player
, text
: "Yeah, you should definitely not talk about it to others... I mean, maybe only those you deeply trust." },
791 { actor
: this, text
: "I don't care anymore..." },
792 { actor
: logic
.player
, text
: "Fine." },
793 { actor
: logic
.player
, text
: "See... probably there is no need for such drama. Maybe it's for the best for everyone." },
794 { actor
: logic
.player
, text
: "... After all, there IS life beyond the company..." },
795 { actor
: this, text
: "You think so?..." },
796 { actor
: this, text
: "Hmm..." },
797 { actor
: this, text
: "I never thought about it for a long time..." },
798 { actor
: logic
.player
, text
: "There are plenty of other opportunities for us! Everything will be fine!" },
799 { actor
: this, text
: "..." },
800 { actor
: this, text
: "Thank you. This helped me to regain a bit of my composure..." },
801 { actor
: logic
.player
, text
: "You're welcome." } ] ));
805 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "Thank you. I'll go back to work soon. Just give some more minutes of alone time." } ] ));
809 switch (this.talkcount
) {
811 logic
.gameinterface
.talk(new Dialogue( [ { actor
: logic
.player
, text
: "..." },
812 { actor
: this, text
: "... So you came for me too." },
813 { actor
: this, text
: "..." },
814 { actor
: this, text
: "I know what you are..." },
815 { actor
: this, text
: "..." },
816 { actor
: this, text
: "Let's get over with." },
817 { actor
: logic
.player
, text
: "..." } ] ));
820 logic
.gameinterface
.talk(new Dialogue( [ { actor
: this, text
: "What are you waiting for?" } ] ));
828 logic
.gameinterface
.dropNotice(this.shortname
+ ": Thank you. I'll go back to work soon.");
833 // All doors open for you if you have all the cards.
834 logic
.openDoor("cutedoor");
835 logic
.openDoor("carlosdoor");
836 logic
.openDoor("saikidoor");
837 return super.actionTake();
842 class GameInterface
extends Phaser
.Group
{
843 constructor(game
, parent
) {
844 super(game
, parent
, 'GUI', false, false, 0);
845 this.back_notice
= new Phaser
.Graphics(game
, 0, game
.height
- 50);
846 this.back_notice
.beginFill(0x000000);
847 this.back_notice
.drawRect(0, 0, game
.width
, 30);
848 this.back_notice
.endFill();
849 this.add(this.back_notice
);
850 this.text_notice
= new Phaser
.Text(game
, 125, this.back_notice
.y
+ 5, null, { align
: 'left', fill
: 'white', font
: 'Ubuntu Mono', fontSize
: 18, fontWeight
: 'bold' });
851 this.add(this.text_notice
);
854 this.back_menu
= new Phaser
.Graphics(game
, 150, (game
.height
/ 2) + 40);
855 this.back_menu
.beginFill(0x000000);
856 this.back_menu
.drawRect(0, 0, 155, 105);
857 this.back_menu
.endFill();
858 this.back_menu
.lineStyle(3, Phaser
.Color
.YELLOW
, 1);
859 this.back_menu
.moveTo(10, 35);
860 this.back_menu
.lineTo(this.back_menu
.width
- 10, 35);
861 this.add(this.back_menu
);
862 var style
= { align
: 'left', fill
: 'yellow', font
: 'Ubuntu Mono', fontSize
: 22, fontWeight
: 'bold' };
863 this.text_menutitle
= new Phaser
.Text(game
, this.back_menu
.x
, this.back_menu
.y
, null, style
);
864 this.text_menutitle
.anchor
.setTo(-0.2, -0.2);
865 style
= { align
: 'left', fill
: 'white', font
: 'Ubuntu Mono', fontSize
: 18, fontWeight
: 'bold' };
866 this.text_menuitem_Talk
= new Phaser
.Text(game
, this.back_menu
.x
+ 35, this.back_menu
.y
+ 40, "Talk", style
);
867 this.text_menuitem_Leave
= new Phaser
.Text(game
, this.back_menu
.x
+ 35, this.text_menuitem_Talk
.y
+ GUI_MENUITEM_DISTANCE
, "Leave", style
);
868 this.text_menuitem_Take
= new Phaser
.Text(game
, this.back_menu
.x
+ 35, this.text_menuitem_Leave
.y
+ GUI_MENUITEM_DISTANCE
, "Take ID", style
);
869 style
.fill
= 'yellow';
870 this.text_menucursor
= new Phaser
.Text(game
, this.back_menu
.x
+ 15, this.text_menuitem_Talk
.y
, "→", style
);
871 this.add(this.text_menutitle
);
872 this.add(this.text_menuitem_Talk
);
873 this.add(this.text_menuitem_Leave
);
874 this.add(this.text_menuitem_Take
);
875 this.add(this.text_menucursor
);
877 this.last_menustep
= 0;
879 this.back_talk
= new Phaser
.Graphics(game
, 100, game
.height
- 120);
880 this.back_talk
.beginFill(0x000000);
881 this.back_talk
.drawRect(0, 0, game
.width
- 200, 105);
882 this.back_talk
.endFill();
883 this.back_talk
.lineStyle(3, Phaser
.Color
.YELLOW
, 1);
884 this.back_talk
.moveTo(10, 35);
885 this.back_talk
.lineTo(this.back_talk
.width
- 10, 35);
886 this.add(this.back_talk
);
887 style
= { align
: 'left', fill
: 'yellow', font
: 'Ubuntu Mono', fontSize
: 22, fontWeight
: 'bold' };
888 this.text_talktitle
= new Phaser
.Text(game
, this.back_talk
.x
+ 15, this.back_talk
.y
+ 6, null, style
);
889 //this.text_talktitle.anchor.setTo(-0.2, -0.2);
890 this.add(this.text_talktitle
);
891 this.strikethrough_talktitle
= new Phaser
.Graphics(game
, this.back_talk
.x
, this.back_talk
.y
);
892 this.strikethrough_talktitle
.lineStyle(3, Phaser
.Color
.RED
, 1);
893 this.strikethrough_talktitle
.moveTo(12, 20);
894 this.strikethrough_talktitle
.lineTo(67, 20);
895 this.add(this.strikethrough_talktitle
);
896 style
= { align
: 'left', fill
: 'white', font
: 'Ubuntu Mono', fontSize
: 18, fontWeight
: 'bold' };
897 this.text_talk
= new Phaser
.Text(game
, this.back_talk
.x
+ 35, this.back_talk
.y
+ 40, null, style
);
898 this.text_talk
.wordWrap
= true;
899 this.text_talk
.wordWrapWidth
= this.back_talk
.width
- 70;
900 this.text_talk
.lineSpacing
= -5;
901 this.add(this.text_talk
);
907 this.text_notice
.text
= text
;
908 this.back_notice
.visible
= true;
909 this.text_notice
.visible
= true;
912 dropNoticeTimeout(timeout
, text
) {
913 this.dropNotice(text
);
914 game
.time
.events
.add(timeout
, this.clearNotice
, this);
918 this.back_notice
.visible
= false;
919 this.text_notice
.visible
= false;
926 this.text_menutitle
.text
= npc
.shortname
;
927 this.back_menu
.visible
= true;
928 this.text_menutitle
.visible
= true;
929 this.text_menuitem_Talk
.visible
= true;
930 this.text_menuitem_Leave
.visible
= true;
931 this.text_menuitem_Take
.visible
= true;
932 this.currentmenuitem
= MENUITEM_TALK
;
933 this.actualizeCursorPosition();
934 this.text_menucursor
.visible
= true;
935 this.last_menustep
= game
.time
.now
;
940 this.back_menu
.visible
= false;
941 this.text_menutitle
.visible
= false;
942 this.text_menuitem_Talk
.visible
= false;
943 this.text_menuitem_Leave
.visible
= false;
944 this.text_menuitem_Take
.visible
= false;
945 this.text_menucursor
.visible
= false;
951 this.dialogue
= dialogue
;
953 this.back_talk
.visible
= true;
954 this.text_talktitle
.visible
= true;
955 this.text_talk
.visible
= true;
960 this.dialogue
= null;
961 this.back_talk
.visible
= false;
962 this.text_talktitle
.visible
= false;
963 this.strikethrough_talktitle
.visible
= false;
964 this.text_talk
.visible
= false;
968 console
.log(this.dialogue
);
969 console
.log(this.dialogue
.actual());
970 var actualdialogue
= this.dialogue
.actual();
971 if (actualdialogue
) {
972 if (actualdialogue
.actor
.disguise
) {
973 this.text_talktitle
.text
= actualdialogue
.actor
.shortname
+ " " + actualdialogue
.actor
.disguise
.shortname
;
974 this.strikethrough_talktitle
.visible
= true;
977 this.text_talktitle
.text
= actualdialogue
.actor
.shortname
;
978 this.strikethrough_talktitle
.visible
= false;
980 this.text_talk
.text
= actualdialogue
.text
;
981 this.dialogue
.advance();
987 this.last_talk
= game
.time
.now
;
990 actualizeCursorPosition() {
991 this.text_menucursor
.y
= this.text_menuitem_Talk
.y
+ (this.currentmenuitem
* GUI_MENUITEM_DISTANCE
);
995 if ((this.inMenu
) && (hasTimePassed(this.last_menustep
, WAIT_MENUSTEP
))) {
996 if (cursors
.up
.isDown
)
998 this.currentmenuitem
--;
999 if (this.currentmenuitem
< MENUITEM_TALK
) this.currentmenuitem
= MENUITEM_TAKE
;
1000 this.actualizeCursorPosition();
1002 else if (cursors
.down
.isDown
)
1004 this.currentmenuitem
++;
1005 if (this.currentmenuitem
> MENUITEM_TAKE
) this.currentmenuitem
= MENUITEM_TALK
;
1006 this.actualizeCursorPosition();
1008 if (game
.input
.keyboard
.isDown(Phaser
.Keyboard
.ENTER
)) {
1009 logic
.callMenu(this.currentmenuitem
);
1011 this.last_menustep
= game
.time
.now
;
1013 if ((this.inTalk
) && (game
.input
.keyboard
.isDown(Phaser
.Keyboard
.ENTER
)) && (hasTimePassed(this.last_talk
, WAIT_TALK
))) {
1022 this.player
= this.clara
= this.carlos
= this.saiki
= this.peter
= this.bianca
= null;
1023 this.gameinterface
= new GameInterface(game
, game
.stage
);
1024 //this.doors = game.add.group(game.world, "doors");
1025 this.last_menuselect
= 0;
1028 createObject(object
) {
1029 switch (object
.type
) {
1030 case 'spawnpoint': this.createCharacter(object
); break;
1031 case 'door': this.createDoor(object
); break;
1032 case '': console
.error("Object type is empty:", object
); break;
1033 default: console
.error("Unknown object type:", object
);
1037 createCharacter(object
) {
1039 switch (object
.name
) {
1041 newChar
= new Player(object
.x
, object
.y
, 'player');
1042 this.player
= newChar
;
1043 this.player
.enablePhysics();
1044 game
.camera
.follow(this.player
);
1047 newChar
= new NPC_Clara(object
.x
, object
.y
, 'clara', "Clara", "Clara Tnavelerri", 200);
1048 this.clara
= newChar
;
1051 newChar
= new NPC_Carlos(object
.x
, object
.y
, 'carlos', "Carlos", "Carlos Elbacalper", 150);
1052 this.carlos
= newChar
;
1055 newChar
= new NPC_Saiki(object
.x
, object
.y
, 'saiki', "Saiki", "Saiki Ytpme", 150);
1056 this.saiki
= newChar
;
1059 newChar
= new NPC_Peter(object
.x
, object
.y
, 'peter', "Peter", "Peter Tluaf", 225);
1060 this.peter
= newChar
;
1063 newChar
= new NPC_Bianca(object
.x
, object
.y
, 'bianca', "Bianca", "Bianca Gnihton", 150);
1064 this.bianca
= newChar
;
1067 console
.error("Unknown character:", object
);
1069 newChar
.name
= object
.name
;
1070 game
.add
.existing(newChar
);
1071 console
.log(newChar
);
1074 createDoor(object
) {
1075 /* Calculate movement vector and correct position (32 = half tile width/height). */
1077 switch (object.rotation) {
1079 case 0: vector = new Phaser.Point( -1, 0); object.x += 32; object.y -= 32; break;
1080 case 90: vector = new Phaser.Point( 0, -1); object.x += 32; object.y += 32; break;
1081 case 180: vector = new Phaser.Point( 1, 0); object.x -= 32; object.y += 32; break;
1082 case 270: vector = new Phaser.Point( 0, 1); object.x -= 32; object.y -= 32; break;
1083 default: console.error("Invalid rotation:", object.rotation);
1085 this.doors.add(new Door(object.x, object.y, object.name, object.rotation, vector, object.properties.longpanel));
1088 callMenu(menuitem) {
1089 console.log("Menu callback received:", menuitem);
1090 this.last_menuselect = game.time.now;
1091 this.gameinterface.leaveMenu();
1094 this.player.interactablenpc.actionTalk();
1096 case MENUITEM_LEAVE:
1097 this.player.interactablenpc.actionLeave();
1098 this.player.unfreeze();
1101 if (this.player.interactablenpc.actionTake())
1102 this.player.unfreeze();
1108 if (this.player.interactablenpc) {
1109 if (this.player.interactablenpc.endTalk()) {
1110 this.gameinterface.npcMenu(this.player.interactablenpc);
1113 this.player.unfreeze();
1114 this.last_menuselect = game.time.now;
1119 openDoor(doorname) {
1120 this.doors.children.forEach(function(o) { if (o.name == doorname) o.open(); });
1123 closeDoor(doorname) {
1124 this.doors.children.forEach(function(o) { if (o.name == doorname) o.close(); });
1128 return (this.clara.happy) && (this.carlos.happy) && (this.saiki.happy);
1132 if ((game.input.keyboard.isDown(Phaser.Keyboard.ENTER)) && (hasTimePassed(this.last_menuselect, WAIT_MENUSTEP))) {
1133 if ((this.player.interactablenpc) && (this.player.interactablenpc.interactable) && (!this.gameinterface.inMenu) && (!this.gameinterface.inTalk)) {
1134 console.log("Starting interaction with", this.player.interactablenpc.fullname);
1135 this.player.freeze();
1136 this.gameinterface.npcMenu(this.player.interactablenpc);
1143 class GamePlay extends Phaser.State {
1148 logic = new GameLogic();
1149 game.world.updateOnlyExistingChildren = true;
1150 game.state.add('GameOver', GameOver, false);
1156 game.load.image('player', 'john.png');
1157 game.load.image('clara', 'clara.png');
1158 game.load.image('carlos', 'carlos.png');
1159 game.load.image('saiki', 'saiki.png');
1160 game.load.image('peter', 'peter.png');
1161 game.load.image('bianca', 'bianca.png');
1162 game.load.image('tileset', 'tileset.png');
1163 game.load.image('objects', 'objects.png');
1164 game.load.tilemap('gamemap', 'tilemap.json', null, Phaser.Tilemap.TILED_JSON);
1170 game.world.setBounds(0, 0, 800, 600);
1171 game.stage.backgroundColor = '#000000';
1172 game.physics.startSystem(Phaser.Physics.ARCADE);
1173 console.log("Debug enabled:", !game.debug.isDisabled);
1175 var map = game.add.tilemap('gamemap');
1176 map.addTilesetImage('tileset', 'tileset');
1177 map.addTilesetImage('objects', 'objects');
1178 var layer_floor = map.createLayer('floor');
1179 layer_floor.resizeWorld();
1180 this.layer_walls = map.createLayer('walls');
1181 map.setCollisionBetween(1, 100, true, this.layer_walls);
1182 this.layer_furniture = map.createLayer('furniture');
1183 map.setCollisionBetween(1, 100, true, this.layer_furniture);
1185 // FIXME: Don't create a group here like this, it's too ugly! Now I have it here due to the display order.
1186 logic.doors = game.add.group(game.world, "doors");
1188 map.objects['objects'].forEach(function(o) { logic.createObject(o); });
1189 console.log(map.objects);
1191 cursors = game.input.keyboard.createCursorKeys();
1198 game.physics.arcade.collide(logic.player, this.layer_walls);
1199 game.physics.arcade.collide(logic.player, this.layer_furniture);
1200 game.physics.arcade.collide(logic.player, logic.doors);
1206 class GameOver extends Phaser.State {
1210 console.log("Entered GameOver state.");
1211 game.stage.removeChildren(1);
1212 game.camera.follow(logic.player);
1213 logic.player.freeze();
1215 var g = game.add.group(game.stage, "GAMEOVER");
1216 this.back_gameover = new Phaser.Graphics(game, 100, game.height / 2 - 200);
1217 this.back_gameover.beginFill(0x000000);
1218 this.back_gameover.drawRect(0, 0, game.width - 200, 400);
1219 this.back_gameover.endFill();
1220 this.back_gameover.lineStyle(3, Phaser.Color.YELLOW, 1);
1221 this.back_gameover.moveTo(10, 35);
1222 this.back_gameover.lineTo(this.back_gameover.width - 10, 35);
1223 g.add(this.back_gameover);
1224 var style = { align: 'left', fill: 'yellow', font: 'Ubuntu Mono', fontSize: 22, fontWeight: 'bold' };
1225 this.text_title = new Phaser.Text(game, this.back_gameover.x + 15, this.back_gameover.y + 6, "ABRUPT GAME OVER", style);
1226 g.add(this.text_title);
1227 style = { align: 'left', fill: 'white', font: 'Ubuntu Mono', fontSize: 18, fontWeight: 'bold' };
1228 this.text_gameover = new Phaser.Text(game, this.back_gameover.x + 35, this.back_gameover.y + 60, null, style);
1229 this.text_gameover.wordWrap = true;
1230 this.text_gameover.wordWrapWidth = this.back_gameover.width - 70;
1231 this.text_gameover.lineSpacing = -5;
1232 g.add(this.text_gameover);
1234 this.text_gameover.text = this.assess();
1239 if (logic.checkAllHappy()) {
1240 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.";
1242 else if (logic.player.disguise) {
1243 this.text_gameover.style.fill = 'red';
1244 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.";
1247 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.";