Add method to reset talk count
[wgj58.git] / wgj58.js
1 var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: function() { this.state.add('GamePlay', GamePlay, true); } });
2 var logic;
3 var cursors;
4
5 const PLAYER_SPEED = 200;
6 const WAIT_MENUSTEP = 100;
7 const WAIT_TALK = 250;
8
9 const MENUITEM_TALK = 0;
10 const MENUITEM_LEAVE = 1;
11 const MENUITEM_TAKE = 2;
12
13 const GUI_MENUITEM_DISTANCE = 20;
14
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) {
18 e.preventDefault();
19 }
20 }, false);
21
22 function hasTimePassed(time, delay) {
23 return (game.time.now - time) > delay;
24 }
25
26 class Dialogue {
27 // dialogue is array of {actor, text} records.
28 constructor(dialogue) {
29 this.dialogue = dialogue;
30 this.state = 0;
31 }
32
33 actual() {
34 return this.dialogue[this.state];
35 }
36
37 advance() {
38 this.state++;
39 }
40 }
41
42 class Door extends Phaser.TileSprite {
43 constructor(x, y, name, rotation, vector, longpanel) {
44 super(game, x, y, 64, 64, 'objects');
45 this.name = name;
46 this.longpanel = longpanel;
47 if (!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));
51 }
52 else {
53 this.width *= 2;
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));
57 }
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);
63 this.isOpen = false;
64 game.physics.arcade.enable(this);
65 this.body.immovable = true;
66 this.setBody(rotation);
67 }
68
69 setBody(rotation) {
70 switch(rotation) {
71 case 0:
72 case 180:
73 this.body.setSize(this.width, 10, this.longpanel * (rotation / 180) * 64, 27);
74 break;
75 case 90:
76 case 270:
77 this.body.setSize(10, this.width, 27 + (this.longpanel * 64), this.longpanel * ((rotation - 270) / 180) * 64);
78 break;
79 default:
80 console.log("Unable to set body due to unknown rotation:", rotation);
81 }
82 }
83
84 open() {
85 if (!this.isOpen) {
86 this.opentween.start();
87 this.isOpen = true;
88 }
89 }
90
91 close() {
92 if (this.isOpen) {
93 this.closetween.start();
94 this.isOpen = false;
95 }
96 }
97
98 update() {
99 game.debug.body(this);
100 }
101 }
102
103 class Player extends Phaser.Sprite {
104 constructor(x, y) {
105 super(game, x, y, 'player');
106 this.y -= this.height;
107 this.shortname = "John";
108 this.fullname = "John Evals";
109 this.offerInteraction(null);
110 this.unfreeze();
111 }
112
113 enablePhysics() {
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;
118 }
119
120 control() {
121 if ((this.alive) && (!this.freezed))
122 {
123 if (cursors.left.isDown)
124 {
125 this.body.velocity.x = -PLAYER_SPEED;
126 }
127 else if (cursors.right.isDown)
128 {
129 this.body.velocity.x = PLAYER_SPEED;
130 }
131 if (cursors.up.isDown)
132 {
133 this.body.velocity.y = -PLAYER_SPEED;
134 }
135 else if (cursors.down.isDown)
136 {
137 this.body.velocity.y = PLAYER_SPEED;
138 }
139 }
140 }
141
142 update() {
143 this.body.velocity.x = this.body.velocity.y = 0;
144 this.control();
145 }
146
147 freeze() {
148 this.freezed = true;
149 }
150
151 unfreeze() {
152 this.freezed = false;
153 }
154
155 offerInteraction(npc) {
156 this.interactablenpc = npc;
157 }
158
159 takeMe(npc) {
160 this.loadTexture(npc.key);
161 npc.kill();
162 this.disguise = npc;
163 logic.gameinterface.dropNoticeTimeout(Phaser.Timer.SECOND * 5, "You are now identified as " + npc.fullname + "!");
164 }
165 }
166
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;
175 this.resetTalk();
176 this.happy = false;
177 }
178
179 kill() {
180 super.kill();
181 this.exists = false;
182 this.happy = false; // Dead people are not happy.
183 }
184
185 update() {
186 super.update();
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;
191 }
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;
196 }
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;
201 }
202 }
203
204 actionTalk() {
205 this.talkcount++;
206 }
207
208 actionLeave() {
209 }
210
211 actionTake() {
212 logic.player.offerInteraction(null);
213 logic.player.takeMe(this);
214 return true;
215 }
216
217 endTalk() {
218 return true;
219 }
220
221 resetTalk() {
222 this.talkcount = 0;
223 }
224
225 makeHappy() {
226 this.happy = true;
227 console.log(this.shortname, "is happy!");
228 }
229
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);
233 }
234 }
235
236 class NPC_Clara extends GameNPC {
237 actionTalk() {
238 switch (this.talkcount) {
239 case 0:
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");
251 break;
252 case 1:
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." } ] ));
262 break;
263 case 2:
264 case 3:
265 case 4:
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!" } ] ));
274 break;
275 case 5:
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." } ] ));
288 break;
289 default:
290 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "..." } ] ));
291 }
292 super.actionTalk();
293 }
294
295 actionLeave() {
296 logic.gameinterface.dropNotice(this.shortname + ": Have a great day, John!");
297 }
298
299 actionTake() {
300 logic.openDoor("cutedoor");
301 return super.actionTake();
302 }
303
304 endTalk() {
305 return (this.talkcount < 6);
306 }
307 }
308
309 class NPC_Carlos extends GameNPC {
310 actionTalk() {
311 if (logic.clara.alive) {
312 switch (this.talkcount) {
313 case 0:
314 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Good morning, Carlos! What's up?" },
315 { actor: this, text: "Hey, John! Not too much, I'm just trying to sell some shit to this new client." },
316 { actor: logic.player, text: "And so? Is it hard to convince them?" },
317 { actor: this, text: "Of course, they don't want to buy. It's shit." },
318 { actor: this, text: "I mean, who would want to buy shit?" },
319 { actor: logic.player, text: "Yeah. Relatable... But why are you trying to sell shit? I mean, why not one of our cutting edge technologies?" },
320 { actor: this, text: "They couldn't afford it." },
321 { actor: logic.player, text: "Then why are you trying to sell them... anything at all? They'd better off with a cheaper company." },
322 { actor: this, text: "Company policies. Plus the management instructed me to sell to them, no matter what." },
323 { actor: logic.player, text: "That sucks... Well... good luck!" },
324 { actor: this, text: "Thanks..." } ] ));
325 logic.closeDoor("cutedoor");
326 logic.openDoor("carlosdoor");
327 break;
328 case 1:
329 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." },
330 { actor: this, text: "These layoffs are terrifying. They let go of anyone for even the slightest mistake." },
331 { actor: logic.player, text: "But it's not a mistake when our client doesn't buy something they don't need." },
332 { actor: this, text: "Tell this to my boss..." } ] ));
333 break;
334 case 2:
335 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." },
336 { actor: this, text: "..." },
337 { 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..." },
338 { 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." },
339 { actor: this, text: "So I thought I could grow my own pig in the garden from pig seeds!" },
340 { actor: logic.player, text: "Interesting. Where are you going with this?" },
341 { actor: this, text: "I don't know... sometimes I feel like I'd rather sell pig semen to our clients, heh!" },
342 { actor: this, text: "Uhm..." },
343 { actor: this, text: "Totally don't tell this to Saiki!" } ] ));
344 this.pigsemen = true;
345 break;
346 case 3:
347 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Weren't you heading to the IT department to the right?" },
348 { actor: this, text: "You know... the green department which looks way better than blue!" },
349 { actor: this, text: "..." },
350 { actor: this, text: "Damn, why do I have to work in blue? I just feel... so blue about it." } ] ));
351 break;
352 case 4:
353 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." },
354 { actor: this, text: "You're so lucky that you can work with her every day!" } ] ));
355 break;
356 default:
357 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Guess you'll stay here then. It's cool, you're great company anyway." } ] ));
358 }
359 }
360 else {
361 switch (this.talkcount) {
362 case 0:
363 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Good morning, Carlos!" },
364 { actor: this, text: "Whoa, Clara! You have changed so much! I barely recognize you. What's up?" },
365 { actor: logic.player, text: "I need to talk to Saiki at the IT department, but... my card doesn't allow me to enter there." },
366 { actor: this, text: "Well... I can certainly help you with that..." },
367 { actor: this, text: "..." } ] ));
368 break;
369 case 1:
370 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Carlos. You promised to help me." },
371 { actor: this, text: "Uhm... It's just... Please give me 5 mins to finish this e-mail." },
372 { actor: logic.player, text: "I don't have much time, Carlos." },
373 { 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." },
374 { actor: logic.player, text: "..." } ] ));
375 break;
376 case 2:
377 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Time is up, Carlos!" },
378 { actor: this, text: "Please give me just another min." },
379 { actor: logic.player, text: "Fine. Please just give me your card and I'll help myself!" },
380 { actor: this, text: "But... you know that company policies forbid that, Clara! Please just be a little more patient!" },
381 { actor: logic.player, text: "You will give me your card now or you will regret!" },
382 { actor: this, text: "...?" },
383 { actor: this, text: "You're not gonna treat me like this. Forget it!" },
384 { actor: logic.player, text: "You'll not work here tomorrow." } ] ));
385 break;
386 default:
387 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "..." } ] ));
388 }
389 }
390 super.actionTalk();
391 }
392
393 actionLeave() {
394 if (logic.clara.alive) {
395 logic.gameinterface.dropNotice(this.shortname + ": Bye, John! Pass on my greetings to Saiki!");
396 }
397 }
398
399 actionTake() {
400 logic.closeDoor("cutedoor");
401 logic.openDoor("carlosdoor");
402 return super.actionTake();
403 }
404
405 endTalk() {
406 return (logic.clara.alive) || (this.talkcount < 3);
407 }
408 }
409
410 class NPC_Saiki extends GameNPC {
411 actionTalk() {
412 if (logic.carlos.alive) {
413 switch (this.talkcount) {
414 case 0:
415 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Hi Saiki!" },
416 { actor: this, text: "Hi John! Glad you arrived, here's some work for you!" },
417 { actor: logic.player, text: "Awesome! What is it?" },
418 { actor: this, text: "Haha, joking! Actually, our queue is suspiciously empty for today." },
419 { actor: logic.player, text: "Yeah... That's really suspicious!" },
420 { actor: logic.player, text: "Maybe I can get home today in time?" },
421 { actor: this, text: "You mean, you wouldn't spend the mandatory free extra working hours?" },
422 { 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?" },
423 { actor: this, text: "*Whispers with wink.* I hope you get my sarcasm." },
424 { actor: logic.player, text: "Haha! I always get it, Saiki!" } ] ));
425 logic.closeDoor("carlosdoor");
426 logic.openDoor("saikidoor");
427 logic.openDoor("peterdoor");
428 break;
429 case 1:
430 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." },
431 { actor: this, text: "Clara has to enter people manually." },
432 { actor: logic.player, text: "Yeah, I'll definitely check that." } ] ));
433 break;
434 case 2:
435 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "So... what's up with the trash can?" },
436 { actor: this, text: "I'm always up for such deep conversation" },
437 { actor: this, text: "about trash cans." },
438 { 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." },
439 { 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." },
440 { actor: logic.player, text: "Hmm... Maybe it's too much to ask. Can we take one from another department?" },
441 { actor: this, text: "No, everyone holds on to their trash cans." },
442 { actor: logic.player, text: "You certainly did your research." },
443 { actor: this, text: "Of course. It's an important subject." } ] ));
444 break;
445 case 3:
446 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "My parents named me after a Japanese rock singer." },
447 { actor: logic.player, text: "Cool! Which band?" },
448 { 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." } ] ));
449 break;
450 default:
451 if ((logic.carlos.pigsemen) && (this.talkcount == 4)) {
452 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?" },
453 { actor: this, text: "Hmm..." },
454 { actor: this, text: "I guess it didn't work." },
455 { actor: this, text: "So do you want to know what I think about this?" },
456 { actor: this, text: "..." },
457 { actor: this, text: "IT'S BRILLIANT!!!" },
458 { actor: this, text: "You know, it really sparkled my artistic vision! Now I must draw a pig with its legs rooted into the ground!" },
459 { actor: logic.player, text: "That's gross. Poor pig." },
460 { 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." },
461 { actor: logic.player, text: "You have a point." },
462 { 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." } ] ));
463 this.offscreenTeleportation(new Phaser.Point(logic.carlos.x, logic.carlos.y + 64), this.tpDone, this);
464 }
465 else {
466 if (Phaser.Math.random() < 0.5) {
467 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!" } ] ));
468 }
469 else {
470 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." } ] ));
471 }
472 }
473 }
474 }
475 else {
476 switch (this.talkcount) {
477 case 0:
478 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "I love you, Saiki!" },
479 { actor: this, text: "Hi Carlos..." },
480 { actor: logic.player, text: "I'm infatuated by the mere thought of you." },
481 { actor: this, text: "Well... it sounds pretty much creepy." },
482 { actor: logic.player, text: "Will you go out on a date with me?" },
483 { actor: this, text: "..." },
484 { actor: this, text: "Sorry to hurt your feelings, but... even though I like you... Your sudden, unprecedented confession makes me scared." },
485 { actor: this, text: "Especially with that facial expression." },
486 { actor: this, text: "I mean... you're not even joking." },
487 { actor: this, text: "So sorry... I won't date you." } ] ));
488 break;
489 case 1:
490 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "I thought I could impress you." },
491 { actor: this, text: "I'm sorry." } ] ));
492 break;
493 case 2:
494 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "You will give me your card." },
495 { actor: this, text: "Geez, what for? Go back to your department and work!" },
496 { actor: logic.player, text: "I need it." },
497 { actor: this, text: "..." } ] ));
498 break;
499 default:
500 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Don't you have anything better to do, Carlos?" } ] ));
501 }
502 }
503 super.actionTalk();
504 }
505
506 actionLeave() {
507 if (logic.carlos.alive) {
508 logic.gameinterface.dropNotice(this.shortname + ": It was nice talking to you!");
509 }
510 }
511
512 actionTake() {
513 logic.closeDoor("carlosdoor");
514 logic.openDoor("saikidoor");
515 logic.openDoor("peterdoor");
516 logic.carlos.kill();
517 return super.actionTake();
518 }
519
520 endTalk() {
521 return (logic.carlos.alive);
522 }
523
524 tpDone(value) {
525 console.log("Woot-woot! Teleport complete:", value);
526 value.makeHappy();
527 logic.carlos.makeHappy();
528 // FIXME: Need to find a prettier way than this.
529 logic.carlos.update = function() { }; // Disable Carlos' interaction. (Saiki will talk for him.)
530 }
531 }
532
533 class NPC_Peter extends GameNPC {
534 actionTalk() {
535 if (logic.saiki.alive) {
536 switch (this.talkcount) {
537 case 0:
538 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Hi Peter! What's up?" },
539 { actor: this, text: "Hi John! Bianca has locked herself in the large meeting room." },
540 { actor: logic.player, text: "Why would she do that?" },
541 { actor: this, text: "I have no idea." },
542 { 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." },
543 { actor: logic.player, text: "That was rude. I think you should care more about your colleagues." },
544 { actor: this, text: "Ahh... You're right. I didn't mean it. I'm just so frustrated about all the shit going on here." } ] ));
545 logic.closeDoor("saikidoor");
546 logic.openDoor("peterdoor");
547 logic.openDoor("biancadoor");
548 break;
549 case 1:
550 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." } ] ));
551 break;
552 default:
553 if ((logic.clara.talkcount >= 5) && (this.talkcount == 2)) {
554 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Do you know Clara from the Reception?" },
555 { actor: this, text: "Of course I do." },
556 { actor: logic.player, text: "I think she's mad at me..." },
557 { actor: this, text: "Why would she?" },
558 { actor: logic.player, text: "I kind of... asked her out." },
559 { actor: logic.player, text: "She said no." },
560 { actor: this, text: "What the heck, dude?" },
561 { actor: this, text: "..." },
562 { actor: this, text: "You should know it's against the company etiquette..." },
563 { actor: this, text: "Regardless, I don't think she's really mad. You're a cool guy." },
564 { 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." } ] ));
565 this.offscreenTeleportation(new Phaser.Point(logic.clara.x - 160, logic.clara.y), this.tpDone, this);
566 }
567 else {
568 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "I'm kind of busy, man." } ] ));
569 }
570 }
571 }
572 else {
573 switch (this.talkcount) {
574 case 0:
575 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "What a wonderful day, Peter!" },
576 { actor: this, text: "Yikes! Saiki! You scared me!" },
577 { actor: logic.player, text: "I didn't even say \"boo\"." },
578 { actor: this, text: "Are you OK? You look horrible! You should really see a doctor." },
579 { actor: logic.player, text: "I'm fine, Peter. And you?" },
580 { actor: this, text: "No... Not at all." },
581 { actor: logic.player, text: "I'm sorry to hear that..." } ] ));
582 break;
583 case 1:
584 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "Don't come closer to me!" },
585 { actor: logic.player, text: "Why?" },
586 { actor: this, text: "I don't mean to offend you, but... you really creep me out..." },
587 { actor: logic.player, text: "Why do you say that?" },
588 { actor: this, text: "I honestly can't tell what's wrong with you, but... you look like that ghost girl from The Ring!" } ] ));
589 break;
590 case 2:
591 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Now that was pretty much racist..." },
592 { 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?" },
593 { actor: this, text: "Geez... that's not even a Japanese movie! And the actress is American..." },
594 { actor: logic.player, text: "The original movie is Japanese." },
595 { actor: this, text: "I don't care... Just... keep distance, please!" } ] ));
596 break;
597 default:
598 if (Phaser.Math.random() < 0.5) {
599 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "STAY AWAY FROM ME!" } ] ));
600 }
601 else {
602 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "DON'T COME ANY CLOSER!" } ] ));
603 }
604 }
605 }
606 super.actionTalk();
607 }
608
609 actionTake() {
610 logic.closeDoor("saikidoor");
611 logic.openDoor("peterdoor");
612 logic.openDoor("biancadoor");
613 return super.actionTake();
614 }
615
616 endTalk() {
617 return (logic.saiki.alive) && (this.talkcount < 3);
618 }
619
620 tpDone(value) {
621 console.log("Woot-woot! Teleport complete:", value);
622 value.makeHappy();
623 logic.clara.makeHappy();
624 // FIXME: Need to find a prettier way than this.
625 logic.clara.update = function() { }; // Disable Clara's interaction. (Peter will talk for him.)
626 }
627 }
628
629 class NPC_Bianca extends GameNPC {
630 actionTalk() {
631 if (logic.peter.alive) {
632 switch (this.talkcount) {
633 case 0:
634 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "... Hi Bianca!" },
635 { actor: this, text: "... Hello John!" },
636 { actor: logic.player, text: "So I've been told, you've been spending most of the day in this meeting room..." },
637 { actor: this, text: "Yeah?" },
638 { actor: logic.player, text: "... Your colleagues want to hold a meeting in this room and you're blocking it." },
639 { actor: this, text: "Hmm... Kind of that's the point... There is no need for that meeting." },
640 { actor: logic.player, text: "May I know why?" },
641 { 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." },
642 { actor: this, text: "But today morning, I received a list with about 50% of the employees... Many of them are great friends of mine..." },
643 { 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." },
644 { actor: logic.player, text: "That's rough. Does this company even need people?" },
645 { actor: this, text: "..." } ] ));
646 logic.openDoor("cutedoor");
647 logic.closeDoor("peterdoor");
648 break;
649 case 1:
650 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "Bianca... Am I on that list?" },
651 { actor: this, text: "Yes, John." },
652 { actor: this, text: "Well, I'll try to convince them to keep you and many other great folks from the list." },
653 { 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." },
654 { actor: logic.player, text: "Thank you very much... I'll see what I can do." } ] ));
655 break;
656 case 2:
657 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." },
658 { actor: this, text: "I know. It's just part of my work..." },
659 { 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." },
660 { actor: this, text: "... I feel like I'm growing distant from the company." },
661 { 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." },
662 { actor: logic.player, text: "Yeah, you should definitely not talk about it to others... I mean, maybe only those you deeply trust." },
663 { actor: this, text: "I don't care anymore..." },
664 { actor: logic.player, text: "Fine." },
665 { actor: logic.player, text: "See... probably there is no need for such drama. Maybe it's for the best for everyone." },
666 { actor: logic.player, text: "... After all, there IS life beyond the company..." },
667 { actor: this, text: "You think so?..." },
668 { actor: this, text: "Hmm..." },
669 { actor: this, text: "I never thought about it for a long time..." },
670 { actor: logic.player, text: "There are plenty of other opportunities for us! Everything will be fine!" },
671 { actor: this, text: "..." },
672 { actor: this, text: "Thank you. This helped me to regain a bit of my composure..." },
673 { actor: logic.player, text: "You're welcome." } ] ));
674 this.makeHappy();
675 break;
676 default:
677 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." } ] ));
678 }
679 }
680 else {
681 switch (this.talkcount) {
682 case 0:
683 logic.gameinterface.talk(new Dialogue( [ { actor: logic.player, text: "..." },
684 { actor: this, text: "... So you came for me too." },
685 { actor: this, text: "..." },
686 { actor: this, text: "I know what you are..." },
687 { actor: this, text: "..." },
688 { actor: this, text: "Let's get over with." },
689 { actor: logic.player, text: "..." } ] ));
690 break;
691 default:
692 logic.gameinterface.talk(new Dialogue( [ { actor: this, text: "What are you waiting for?" } ] ));
693 }
694 }
695 super.actionTalk();
696 }
697
698 actionLeave() {
699 if (this.happy) {
700 logic.gameinterface.dropNotice(this.shortname + ": Thank you. I'll go back to work soon.");
701 }
702 }
703
704 actionTake() {
705 // All doors open for you if you have all the cards.
706 logic.openDoor("cutedoor");
707 logic.openDoor("carlosdoor");
708 logic.openDoor("saikidoor");
709 return super.actionTake();
710 }
711 }
712
713
714 class GameInterface extends Phaser.Group {
715 constructor(game, parent) {
716 super(game, parent, 'GUI', false, false, 0);
717 this.back_notice = new Phaser.Graphics(game, 0, game.height - 50);
718 this.back_notice.beginFill(0x000000);
719 this.back_notice.drawRect(0, 0, game.width, 30);
720 this.back_notice.endFill();
721 this.add(this.back_notice);
722 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' });
723 this.add(this.text_notice);
724 this.clearNotice();
725
726 this.back_menu = new Phaser.Graphics(game, 150, (game.height / 2) + 40);
727 this.back_menu.beginFill(0x000000);
728 this.back_menu.drawRect(0, 0, 155, 105);
729 this.back_menu.endFill();
730 this.back_menu.lineStyle(3, Phaser.Color.YELLOW, 1);
731 this.back_menu.moveTo(10, 35);
732 this.back_menu.lineTo(this.back_menu.width - 10, 35);
733 this.add(this.back_menu);
734 var style = { align: 'left', fill: 'yellow', font: 'Ubuntu Mono', fontSize: 22, fontWeight: 'bold' };
735 this.text_menutitle = new Phaser.Text(game, this.back_menu.x, this.back_menu.y, null, style);
736 this.text_menutitle.anchor.setTo(-0.2, -0.2);
737 style = { align: 'left', fill: 'white', font: 'Ubuntu Mono', fontSize: 18, fontWeight: 'bold' };
738 this.text_menuitem_Talk = new Phaser.Text(game, this.back_menu.x + 35, this.back_menu.y + 40, "Talk", style);
739 this.text_menuitem_Leave = new Phaser.Text(game, this.back_menu.x + 35, this.text_menuitem_Talk.y + GUI_MENUITEM_DISTANCE, "Leave", style);
740 this.text_menuitem_Take = new Phaser.Text(game, this.back_menu.x + 35, this.text_menuitem_Leave.y + GUI_MENUITEM_DISTANCE, "Take ID", style);
741 style.fill = 'yellow';
742 this.text_menucursor = new Phaser.Text(game, this.back_menu.x + 15, this.text_menuitem_Talk.y, "→", style);
743 this.add(this.text_menutitle);
744 this.add(this.text_menuitem_Talk);
745 this.add(this.text_menuitem_Leave);
746 this.add(this.text_menuitem_Take);
747 this.add(this.text_menucursor);
748 this.leaveMenu();
749 this.last_menustep = 0;
750
751 this.back_talk = new Phaser.Graphics(game, 100, game.height - 120);
752 this.back_talk.beginFill(0x000000);
753 this.back_talk.drawRect(0, 0, game.width - 200, 105);
754 this.back_talk.endFill();
755 this.back_talk.lineStyle(3, Phaser.Color.YELLOW, 1);
756 this.back_talk.moveTo(10, 35);
757 this.back_talk.lineTo(this.back_talk.width - 10, 35);
758 this.add(this.back_talk);
759 style = { align: 'left', fill: 'yellow', font: 'Ubuntu Mono', fontSize: 22, fontWeight: 'bold' };
760 this.text_talktitle = new Phaser.Text(game, this.back_talk.x + 15, this.back_talk.y + 6, null, style);
761 //this.text_talktitle.anchor.setTo(-0.2, -0.2);
762 this.add(this.text_talktitle);
763 this.strikethrough_talktitle = new Phaser.Graphics(game, this.back_talk.x, this.back_talk.y);
764 this.strikethrough_talktitle.lineStyle(3, Phaser.Color.RED, 1);
765 this.strikethrough_talktitle.moveTo(12, 20);
766 this.strikethrough_talktitle.lineTo(67, 20);
767 this.add(this.strikethrough_talktitle);
768 style = { align: 'left', fill: 'white', font: 'Ubuntu Mono', fontSize: 18, fontWeight: 'bold' };
769 this.text_talk = new Phaser.Text(game, this.back_talk.x + 35, this.back_talk.y + 40, null, style);
770 this.text_talk.wordWrap = true;
771 this.text_talk.wordWrapWidth = this.back_talk.width - 70;
772 this.text_talk.lineSpacing = -5;
773 this.add(this.text_talk);
774 this.leaveTalk();
775 this.last_talk = 0;
776 }
777
778 dropNotice(text) {
779 this.text_notice.text = text;
780 this.back_notice.visible = true;
781 this.text_notice.visible = true;
782 }
783
784 dropNoticeTimeout(timeout, text) {
785 this.dropNotice(text);
786 game.time.events.add(timeout, this.clearNotice, this);
787 }
788
789 clearNotice() {
790 this.back_notice.visible = false;
791 this.text_notice.visible = false;
792 }
793
794 npcMenu(npc) {
795 if (!this.inMenu) {
796 this.inMenu = true;
797 this.clearNotice();
798 this.text_menutitle.text = npc.shortname;
799 this.back_menu.visible = true;
800 this.text_menutitle.visible = true;
801 this.text_menuitem_Talk.visible = true;
802 this.text_menuitem_Leave.visible = true;
803 this.text_menuitem_Take.visible = true;
804 this.currentmenuitem = MENUITEM_TALK;
805 this.actualizeCursorPosition();
806 this.text_menucursor.visible = true;
807 this.last_menustep = game.time.now;
808 }
809 }
810
811 leaveMenu() {
812 this.back_menu.visible = false;
813 this.text_menutitle.visible = false;
814 this.text_menuitem_Talk.visible = false;
815 this.text_menuitem_Leave.visible = false;
816 this.text_menuitem_Take.visible = false;
817 this.text_menucursor.visible = false;
818 this.inMenu = false;
819 }
820
821 talk(dialogue) {
822 this.inTalk = true;
823 this.dialogue = dialogue;
824 this.advanceTalk();
825 this.back_talk.visible = true;
826 this.text_talktitle.visible = true;
827 this.text_talk.visible = true;
828 }
829
830 leaveTalk() {
831 this.inTalk = false;
832 this.dialogue = null;
833 this.back_talk.visible = false;
834 this.text_talktitle.visible = false;
835 this.strikethrough_talktitle.visible = false;
836 this.text_talk.visible = false;
837 }
838
839 advanceTalk() {
840 console.log(this.dialogue);
841 console.log(this.dialogue.actual());
842 var actualdialogue = this.dialogue.actual();
843 if (actualdialogue) {
844 if (actualdialogue.actor.disguise) {
845 this.text_talktitle.text = actualdialogue.actor.shortname + " " + actualdialogue.actor.disguise.shortname;
846 this.strikethrough_talktitle.visible = true;
847 }
848 else {
849 this.text_talktitle.text = actualdialogue.actor.shortname;
850 this.strikethrough_talktitle.visible = false;
851 }
852 this.text_talk.text = actualdialogue.text;
853 this.dialogue.advance();
854 }
855 else {
856 this.leaveTalk();
857 logic.endTalk();
858 }
859 this.last_talk = game.time.now;
860 }
861
862 actualizeCursorPosition() {
863 this.text_menucursor.y = this.text_menuitem_Talk.y + (this.currentmenuitem * GUI_MENUITEM_DISTANCE);
864 }
865
866 update() {
867 if ((this.inMenu) && (hasTimePassed(this.last_menustep, WAIT_MENUSTEP))) {
868 if (cursors.up.isDown)
869 {
870 this.currentmenuitem--;
871 if (this.currentmenuitem < MENUITEM_TALK) this.currentmenuitem = MENUITEM_TAKE;
872 this.actualizeCursorPosition();
873 }
874 else if (cursors.down.isDown)
875 {
876 this.currentmenuitem++;
877 if (this.currentmenuitem > MENUITEM_TAKE) this.currentmenuitem = MENUITEM_TALK;
878 this.actualizeCursorPosition();
879 }
880 if (game.input.keyboard.isDown(Phaser.Keyboard.ENTER)) {
881 logic.callMenu(this.currentmenuitem);
882 }
883 this.last_menustep = game.time.now;
884 }
885 if ((this.inTalk) && (game.input.keyboard.isDown(Phaser.Keyboard.ENTER)) && (hasTimePassed(this.last_talk, WAIT_TALK))) {
886 this.advanceTalk();
887 }
888 }
889 }
890
891 class GameLogic {
892
893 constructor() {
894 this.player = this.clara = this.carlos = this.saiki = this.peter = this.bianca = null;
895 this.gameinterface = new GameInterface(game, game.stage);
896 //this.doors = game.add.group(game.world, "doors");
897 this.last_menuselect = 0;
898 }
899
900 createObject(object) {
901 switch (object.type) {
902 case 'spawnpoint': this.createCharacter(object); break;
903 case 'door': this.createDoor(object); break;
904 case '': console.error("Object type is empty:", object); break;
905 default: console.error("Unknown object type:", object);
906 }
907 }
908
909 createCharacter(object) {
910 var newChar;
911 switch (object.name) {
912 case 'john':
913 newChar = new Player(object.x, object.y, 'player');
914 this.player = newChar;
915 this.player.enablePhysics();
916 game.camera.follow(this.player);
917 break;
918 case 'clara':
919 newChar = new NPC_Clara(object.x, object.y, 'clara', "Clara", "Clara Tnavelerri", 200);
920 this.clara = newChar;
921 break;
922 case 'carlos':
923 newChar = new NPC_Carlos(object.x, object.y, 'carlos', "Carlos", "Carlos Elbacalper", 150);
924 this.carlos = newChar;
925 break;
926 case 'saiki':
927 newChar = new NPC_Saiki(object.x, object.y, 'saiki', "Saiki", "Saiki Ytpme", 150);
928 this.saiki = newChar;
929 break;
930 case 'peter':
931 newChar = new NPC_Peter(object.x, object.y, 'peter', "Peter", "Peter Tluaf", 225);
932 this.peter = newChar;
933 break;
934 case 'bianca':
935 newChar = new NPC_Bianca(object.x, object.y, 'bianca', "Bianca", "Bianca Gnihton", 150);
936 this.bianca = newChar;
937 break;
938 default:
939 console.error("Unknown character:", object);
940 }
941 newChar.name = object.name;
942 game.add.existing(newChar);
943 console.log(newChar);
944 }
945
946 createDoor(object) {
947 /* Calculate movement vector and correct position (32 = half tile width/height). */
948 var vector;
949 switch (object.rotation) {
950 case undefined:
951 case 0: vector = new Phaser.Point( -1, 0); object.x += 32; object.y -= 32; break;
952 case 90: vector = new Phaser.Point( 0, -1); object.x += 32; object.y += 32; break;
953 case 180: vector = new Phaser.Point( 1, 0); object.x -= 32; object.y += 32; break;
954 case 270: vector = new Phaser.Point( 0, 1); object.x -= 32; object.y -= 32; break;
955 default: console.error("Invalid rotation:", object.rotation);
956 }
957 this.doors.add(new Door(object.x, object.y, object.name, object.rotation, vector, object.properties.longpanel));
958 }
959
960 callMenu(menuitem) {
961 console.log("Menu callback received:", menuitem);
962 this.last_menuselect = game.time.now;
963 this.gameinterface.leaveMenu();
964 switch (menuitem) {
965 case MENUITEM_TALK:
966 this.player.interactablenpc.actionTalk();
967 break;
968 case MENUITEM_LEAVE:
969 this.player.interactablenpc.actionLeave();
970 this.player.unfreeze();
971 break;
972 case MENUITEM_TAKE:
973 if (this.player.interactablenpc.actionTake())
974 this.player.unfreeze();
975 break;
976 }
977 }
978
979 endTalk() {
980 if (this.player.interactablenpc) {
981 if (this.player.interactablenpc.endTalk()) {
982 this.gameinterface.npcMenu(this.player.interactablenpc);
983 }
984 else {
985 this.player.unfreeze();
986 this.last_menuselect = game.time.now;
987 }
988 }
989 }
990
991 openDoor(doorname) {
992 this.doors.children.forEach(function(o) { if (o.name == doorname) o.open(); });
993 }
994
995 closeDoor(doorname) {
996 this.doors.children.forEach(function(o) { if (o.name == doorname) o.close(); });
997 }
998
999 checkAllHappy() {
1000 return (this.clara.happy) && (this.carlos.happy) && (this.saiki.happy);
1001 }
1002
1003 update() {
1004 if ((game.input.keyboard.isDown(Phaser.Keyboard.ENTER)) && (hasTimePassed(this.last_menuselect, WAIT_MENUSTEP))) {
1005 if ((this.player.interactablenpc) && (this.player.interactablenpc.interactable) && (!this.gameinterface.inMenu) && (!this.gameinterface.inTalk)) {
1006 console.log("Starting interaction with", this.player.interactablenpc.fullname);
1007 this.player.freeze();
1008 this.gameinterface.npcMenu(this.player.interactablenpc);
1009 }
1010 }
1011 }
1012
1013 }
1014
1015 class GamePlay extends Phaser.State {
1016
1017 constructor() {
1018
1019 super();
1020 logic = new GameLogic();
1021 game.world.updateOnlyExistingChildren = true;
1022 game.state.add('GameOver', GameOver, false);
1023
1024 }
1025
1026 preload() {
1027
1028 game.load.image('player', 'john.png');
1029 game.load.image('clara', 'clara.png');
1030 game.load.image('carlos', 'carlos.png');
1031 game.load.image('saiki', 'saiki.png');
1032 game.load.image('peter', 'peter.png');
1033 game.load.image('bianca', 'bianca.png');
1034 game.load.image('tileset', 'tileset.png');
1035 game.load.image('objects', 'objects.png');
1036 game.load.tilemap('gamemap', 'tilemap.json', null, Phaser.Tilemap.TILED_JSON);
1037
1038 }
1039
1040 create() {
1041
1042 game.world.setBounds(0, 0, 800, 600);
1043 game.stage.backgroundColor = '#000000';
1044 game.physics.startSystem(Phaser.Physics.ARCADE);
1045 console.log("Debug enabled:", !game.debug.isDisabled);
1046
1047 var map = game.add.tilemap('gamemap');
1048 map.addTilesetImage('tileset', 'tileset');
1049 map.addTilesetImage('objects', 'objects');
1050 var layer_floor = map.createLayer('floor');
1051 layer_floor.resizeWorld();
1052 this.layer_walls = map.createLayer('walls');
1053 map.setCollisionBetween(1, 100, true, this.layer_walls);
1054 this.layer_furniture = map.createLayer('furniture');
1055 map.setCollisionBetween(1, 100, true, this.layer_furniture);
1056
1057 // FIXME: Don't create a group here like this, it's too ugly! Now I have it here due to the display order.
1058 logic.doors = game.add.group(game.world, "doors");
1059
1060 map.objects['objects'].forEach(function(o) { logic.createObject(o); });
1061 console.log(map.objects);
1062
1063 cursors = game.input.keyboard.createCursorKeys();
1064 console.log(logic);
1065
1066 }
1067
1068 update() {
1069
1070 game.physics.arcade.collide(logic.player, this.layer_walls);
1071 game.physics.arcade.collide(logic.player, this.layer_furniture);
1072 game.physics.arcade.collide(logic.player, logic.doors);
1073 logic.update();
1074
1075 }
1076 }
1077
1078 class GameOver extends Phaser.State {
1079
1080 create() {
1081
1082 console.log("Entered GameOver state.");
1083 game.stage.removeChildren(1);
1084 game.camera.follow(logic.player);
1085 logic.player.freeze();
1086
1087 var g = game.add.group(game.stage, "GAMEOVER");
1088 this.back_gameover = new Phaser.Graphics(game, 100, game.height / 2 - 200);
1089 this.back_gameover.beginFill(0x000000);
1090 this.back_gameover.drawRect(0, 0, game.width - 200, 400);
1091 this.back_gameover.endFill();
1092 this.back_gameover.lineStyle(3, Phaser.Color.YELLOW, 1);
1093 this.back_gameover.moveTo(10, 35);
1094 this.back_gameover.lineTo(this.back_gameover.width - 10, 35);
1095 g.add(this.back_gameover);
1096 var style = { align: 'left', fill: 'yellow', font: 'Ubuntu Mono', fontSize: 22, fontWeight: 'bold' };
1097 this.text_title = new Phaser.Text(game, this.back_gameover.x + 15, this.back_gameover.y + 6, "ABRUPT GAME OVER", style);
1098 g.add(this.text_title);
1099 style = { align: 'left', fill: 'white', font: 'Ubuntu Mono', fontSize: 18, fontWeight: 'bold' };
1100 this.text_gameover = new Phaser.Text(game, this.back_gameover.x + 35, this.back_gameover.y + 60, null, style);
1101 this.text_gameover.wordWrap = true;
1102 this.text_gameover.wordWrapWidth = this.back_gameover.width - 70;
1103 this.text_gameover.lineSpacing = -5;
1104 g.add(this.text_gameover);
1105
1106 this.text_gameover.text = this.assess();
1107
1108 }
1109
1110 assess() {
1111 if (logic.checkAllHappy()) {
1112 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.";
1113 }
1114 else if (logic.player.disguise) {
1115 this.text_gameover.style.fill = 'red';
1116 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.";
1117 }
1118 else {
1119 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.";
1120 }
1121 }
1122
1123 }