Reorganized code: created Guard class
[shapeshift.git] / shapeshift.js
1 var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });
2 var ground;
3 var platforms;
4 var guards;
5 var guard1, guard2;
6 var birdcage;
7 var helptext;
8 var cursors;
9 var lastkeytime = 0;
10 var keyboard_handler;
11 var interaction_handler;
12 var actual_dialogue = null;
13
14 var WAIT_KEY = 500;
15
16 var SHAPE_GIRL = 0;
17 var SHAPE_GOAT = 1;
18 var SHAPE_BIRD = 2;
19
20 var dialogue_guard1_girl =
21 [ { actor: 'player', text: "Hello! May I enter this town?" },
22 { actor: 'guard', text: "Sorry, I don't know you.\nI can't let you in." } ];
23 var dialogue_guard1_girl_retry =
24 [ { actor: 'player', text: "But I'm a goddess!" },
25 { actor: 'guard', text: "I'm a feminist.\nI don't put women on pedestals." } ];
26 var dialogue_guard1_goat =
27 [ { actor: 'guard', text: "Hmm, it must be Coralie's lost goat.\nI'd better let it in." } ];
28 var dialogue_guard2_girl =
29 [ { actor: 'player', text: "Hi there! I'm a goddess and can transform into a goat!" },
30 { actor: 'guard', text: "Hey, that's really cool!\nI'm Coralie." },
31 { actor: 'player', text: "Nice bird you have there.\nCan I have it?" },
32 { actor: 'guard', text: "Yeah, it's yours. Just take it." },
33 { actor: 'guard', text: "Don't mind that it took me days to catch it." },
34 { actor: 'player', text: "Observing this bird, I will be able to shapeshift into a bird too!" } ];
35 var dialogue_guard2_goat =
36 [ { actor: 'guard', text: "This is not my goat. Strange to see random\ngoats wandering here while mine is still missing." } ];
37 var dialogue_guard3_girl =
38 [ { actor: 'player', text: "Hi! I'd like to leave the town." },
39 { actor: 'guard', text: "Sorry, we have a report of a missing goat.\nIt may have been stolen. We can't let anyone out\nuntil we find the thief." },
40 { actor: 'player', text: "I just came here before the goat went missing. The other guard can support this." },
41 { actor: 'player', text: "And the goat may have just wandered away.\nYou know they tend to escape, they require lots of space." },
42 { actor: 'guard', text: "Maybe, but we can't be sure. Sorry." } ];
43 var dialogue_guard3_girl_retry =
44 [ { actor: 'player', text: "But I'm a girl! I wouldn't steal anything!" },
45 { actor: 'guard', text: "I'm a feminist.\nI don't give advantages to people based on their genders." } ];
46 var dialogue_guard3_goat =
47 [ { actor: 'guard', text: "Another goat is trying to escape...\nGood that I'm on guard!" } ];
48 var dialogue_guard3_bird =
49 [ { actor: 'guard', text: "Hi birdie! Don't fly at me, please!" } ];
50 var dialogue_guard4_girl =
51 [ { actor: 'guard', text: "You are at home!\nYou don't have to pretend anymore." } ];
52 var dialogue_guard4_goat =
53 [ { actor: 'guard', text: "Welcome home!\nGlad you shapeshifted back to your true form!" },
54 { actor: 'guard', text: "Yes, your true form is goat.\nDidn't you suspect it all along?" } ];
55 var dialogue_guard4_goat_retry =
56 [ { actor: 'guard', text: "(By the way, this is the end of the game.\nYou really can't do anything more.\nThanks for playing!)" } ];
57
58
59 window.addEventListener("keydown", function(e) {
60 // Prevent default browser action for arrows and spacebar
61 if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
62 e.preventDefault();
63 }
64 }, false);
65
66 class Guard extends Phaser.Sprite {
67 constructor(x, y, sprite, dialogues) {
68 //var guard = game.add.sprite(x, y, sprite);
69 super(game, x, y, sprite);
70 this.anchor.setTo(.5,.5);
71 this.scale.x = 0.5;
72 this.scale.y = this.scale.x;
73 this.dialogues = dialogues;
74 guards.add(this);
75 }
76
77 enablePhysics() {
78 game.physics.arcade.enable(this);
79 this.body.bounce.y = 0.2;
80 this.body.bounce.x = 0.2;
81 this.body.gravity.y = 300;
82 this.body.collideWorldBounds = true;
83 }
84 }
85
86 function sign(n) {
87 if (n >= 0) { return 1 } else { return -1 };
88 }
89
90 function preload () {
91
92 game.load.image('ground', 'ground.png');
93 game.load.image('player_girl', 'csaj.png');
94 game.load.image('player_goat', 'kecskecsaj.png');
95 game.load.image('player_bird', 'bird.png');
96 game.load.image('guard', 'guard.png');
97 game.load.image('birdcage', 'birdcage.png');
98
99 }
100
101 function create () {
102
103 game.world.setBounds(0, 0, 2800, 600);
104 game.stage.backgroundColor = 0xffffff;
105 game.physics.startSystem(Phaser.Physics.ARCADE);
106
107 platforms = game.add.group();
108 platforms.classType = Phaser.TileSprite;
109 platforms.enableBody = true;
110
111
112 ground = game.add.tileSprite(0, game.world.height - 80, game.world.width, 200, 'ground');
113 platforms.add(ground);
114 ground.body.immovable = true;
115
116
117 player = game.add.sprite(64, game.world.height - 200, 'player_girl');
118 player.anchor.setTo(.4,.5);
119 player.scale.x = 0.5;
120 player.scale.y = player.scale.x;
121 game.physics.arcade.enable(player);
122 player.body.bounce.y = 0.2;
123 player.body.bounce.x = 0.2;
124 player.body.gravity.y = 300;
125 player.body.collideWorldBounds = true;
126 player.pushed = 0;
127 player.shape = SHAPE_GIRL;
128 player.learnedBird = false;
129 game.camera.follow(player);
130
131 guards = game.add.group();
132 guard1 = new Guard(600, game.world.height - 200, 'guard',
133 { girl: dialogue_guard1_girl, goat: dialogue_guard1_goat });
134 guard2 = new Guard(1000, game.world.height - 200, 'player_girl',
135 { girl: dialogue_guard2_girl, goat: dialogue_guard2_goat });
136 guard2.scale.x = -guard2.scale.x;
137 guard3 = new Guard(1400, game.world.height - 200, 'guard',
138 { girl: dialogue_guard3_girl, goat: dialogue_guard3_goat, bird: dialogue_guard3_bird });
139 guard4 = new Guard(2400, game.world.height - 200, 'player_goat',
140 { girl: dialogue_guard4_girl, goat: dialogue_guard4_goat, bird: dialogue_guard4_girl });
141 guard4.scale.x = -guard4.scale.x;
142 guards.children.forEach(function(guard) { guard.enablePhysics(); });
143
144 birdcage = game.add.sprite(1100, game.world.height - 300, 'birdcage');
145 birdcage.scale.x = 0.5;
146 birdcage.scale.y = birdcage.scale.x;
147
148 cursors = game.input.keyboard.createCursorKeys();
149
150 keyboard_handler = keyPress_default;
151 interaction_handler = interaction;
152
153 helptext = game.add.text(80, 30, "Press ARROWS to move.", { align: 'left', fill: '#000000', fontSize: 14 });
154 helptext.font = "Ubuntu Mono";
155
156 }
157
158 function update () {
159
160 game.physics.arcade.collide(player, platforms);
161 game.physics.arcade.collide(guards, platforms);
162 game.physics.arcade.collide(player, guards, interaction_handler);
163
164 if (player.pushed)
165 {
166 if ((game.time.now - player.pushed) > 1000)
167 player.pushed = 0;
168 }
169 else
170 {
171 player.body.velocity.x = 0;
172 }
173
174 if (keyboard_handler) keyboard_handler();
175
176 }
177
178 function keyPress_default() {
179
180 if (cursors.left.isDown)
181 {
182 player.body.velocity.x = -150;
183 player.scale.x = - Math.abs(player.scale.x);
184 }
185 else if (cursors.right.isDown)
186 {
187 player.body.velocity.x = 150;
188 player.scale.x = Math.abs(player.scale.x);
189 }
190 else if (game.input.keyboard.isDown(Phaser.Keyboard.SPACEBAR) && ((game.time.now - lastkeytime) > WAIT_KEY))
191 {
192 if (player.shape == SHAPE_GIRL)
193 {
194 player.shape = SHAPE_GOAT;
195 player.loadTexture('player_goat');
196 }
197 else if ((player.shape == SHAPE_GOAT) && (player.learnedBird))
198 {
199 player.shape = SHAPE_BIRD;
200 player.loadTexture('player_bird');
201 }
202 else
203 {
204 player.shape = SHAPE_GIRL;
205 player.loadTexture('player_girl');
206 }
207
208 player.body.setSize(player.texture.width, player.texture.height);
209 if ((ground.y - player.y) < player.body.halfHeight)
210 player.y = ground.y - player.body.halfHeight;
211
212 lastkeytime = game.time.now;
213 }
214
215 if ((cursors.up.isDown) && (player.shape == SHAPE_BIRD))
216 {
217 player.body.velocity.y = -200;
218 }
219
220 }
221
222 function keyPress_indialogue() {
223
224 if (game.input.keyboard.isDown(Phaser.Keyboard.SPACEBAR) && ((game.time.now - lastkeytime) > WAIT_KEY))
225 {
226 var dialogue = actual_dialogue.dialogue;
227 if (dialogue[actual_dialogue.state + 1])
228 {
229 var nextState = ++actual_dialogue.state;
230 var actor = null;
231 if (dialogue[nextState].actor == 'player') actor = actual_dialogue.player;
232 else if (dialogue[nextState].actor == 'guard') actor = actual_dialogue.guard;
233
234 actual_dialogue.lastText.kill();
235 actual_dialogue.lastText = putText(actor, dialogue[nextState].text);
236 lastkeytime = game.time.now;
237 }
238 else
239 {
240 leaveDialogue();
241 lastkeytime = game.time.now;
242 }
243 }
244
245 }
246
247 function putText(entity, text) {
248 var textObject = game.add.text(entity.x, entity.y - (entity.height / 2) - 30, text, { align: 'center', fontSize: 14 });
249 textObject.font = 'Ubuntu Mono';
250 textObject.anchor.setTo(.5,.5);
251 return textObject;
252 }
253
254 function interaction(player, guard) {
255
256 console.log('Interaction with ' + guard.key);
257 player.body.velocity.x = -100;
258 player.pushed = game.time.now;
259 guard.body.velocity.x = 0;
260
261 if (player.shape == SHAPE_GIRL)
262 {
263 if ((guard == guard1) && (guard.dialogues.girl == dialogue_guard1_girl))
264 helptext.text = helptext.text + "\nPress SPACE to progress dialogue.";
265 enterDialogue(player, guard, guard.dialogues.girl);
266 }
267 else if (player.shape == SHAPE_GOAT)
268 {
269 enterDialogue(player, guard, guard.dialogues.goat);
270 }
271 else if (player.shape == SHAPE_BIRD)
272 {
273 enterDialogue(player, guard, guard.dialogues.bird);
274 }
275
276 }
277
278 function enterDialogue(player, guard, dialogue) {
279
280 var actor = null;
281 if (dialogue[0].actor == 'player') actor = player;
282 else if (dialogue[0].actor == 'guard') actor = guard;
283
284 var lastText = putText(actor, dialogue[0].text);
285 actual_dialogue = { player: player, guard: guard, dialogue: dialogue, state: 0 , lastText: lastText };
286 keyboard_handler = keyPress_indialogue;
287 interaction_handler = null;
288
289 }
290
291 function leaveDialogue() {
292
293 actual_dialogue.lastText.kill();
294 if (actual_dialogue.dialogue == dialogue_guard1_girl)
295 {
296 helptext.text = helptext.text + "\nPress SPACE to shapeshift.";
297 guard1.dialogues.girl = dialogue_guard1_girl_retry;
298 }
299 else if (actual_dialogue.dialogue == dialogue_guard1_goat)
300 {
301 guard1.kill();
302 }
303 else if (actual_dialogue.dialogue == dialogue_guard2_girl)
304 {
305 guard2.kill();
306 birdcage.kill();
307 player.learnedBird = true;
308 }
309 else if (actual_dialogue.dialogue == dialogue_guard3_girl)
310 {
311 guard3.dialogues.girl = dialogue_guard3_girl_retry;
312 }
313 else if (actual_dialogue.dialogue == dialogue_guard4_goat)
314 {
315 guard4.dialogues.goat = dialogue_guard4_goat_retry;
316 guard4.dialogues.girl = dialogue_guard4_goat_retry;
317 guard4.dialogues.bird = dialogue_guard4_goat_retry;
318 }
319
320 actual_dialogue = null;
321 keyboard_handler = keyPress_default;
322 interaction_handler = interaction;
323
324 }