|
ferencd@0
|
1 const pic_size = 64; // The size of 1 cell in the maze
|
|
ferencd@0
|
2
|
|
ferencd@0
|
3 // initial position of the player is always: (0,0) ie. 12px 12px considering the wall size the the top and left
|
|
ferencd@0
|
4 let x = 12;
|
|
ferencd@0
|
5 let y = 12;
|
|
ferencd@0
|
6
|
|
ferencd@0
|
7 // moving direction of the player
|
|
ferencd@0
|
8 var x_delta = 0;
|
|
ferencd@0
|
9 var y_delta = 0;
|
|
ferencd@0
|
10
|
|
ferencd@0
|
11 // player location in grid
|
|
ferencd@0
|
12 var col = 0; // The column in the maze where the player is
|
|
ferencd@0
|
13 var row = 0; // The row in the maze where the player is
|
|
ferencd@0
|
14
|
|
ferencd@0
|
15 // Prepare the canvas
|
|
ferencd@0
|
16 var canvas = document.getElementById("canvas");
|
|
ferencd@0
|
17 var canvas_container = document.getElementById("canvasdiv");
|
|
ferencd@0
|
18 var context = canvas.getContext('2d');
|
|
ferencd@0
|
19
|
|
ferencd@0
|
20 // canvas size calculation
|
|
ferencd@0
|
21 var canvas_calc_width = w * pic_size ;
|
|
ferencd@0
|
22 var canvas_calc_height = h * pic_size;
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 canvas.style.width = canvas_calc_width + "px";
|
|
ferencd@0
|
25 canvas.style.height = canvas_calc_height + "px";
|
|
ferencd@0
|
26
|
|
ferencd@0
|
27 canvas.width = canvas_calc_width;
|
|
ferencd@0
|
28 canvas.height = canvas_calc_height;
|
|
ferencd@0
|
29
|
|
ferencd@0
|
30 // Approximates the last row/col drawn for the canvas scrolling
|
|
ferencd@0
|
31 var last_row_drawn = canvas_container.offsetHeight / pic_size;
|
|
ferencd@0
|
32 var first_row_drawn = 0;
|
|
ferencd@0
|
33 var last_col_drawn = canvas_container.offsetWidth / pic_size;
|
|
ferencd@0
|
34 var first_col_drawn = 0;
|
|
ferencd@0
|
35
|
|
ferencd@0
|
36 // fill the canvas with black
|
|
ferencd@0
|
37 context.fillStyle = "black";
|
|
ferencd@0
|
38 context.fillRect(0, 0, canvas.width, canvas.height);
|
|
ferencd@0
|
39
|
|
ferencd@0
|
40 // constants for direction checking
|
|
ferencd@0
|
41 const N = 1;
|
|
ferencd@0
|
42 const S = 2;
|
|
ferencd@0
|
43 const E = 4;
|
|
ferencd@0
|
44 const W = 8;
|
|
ferencd@0
|
45
|
|
ferencd@0
|
46 // Corner constants, to know where to put a torch
|
|
ferencd@0
|
47 const TOP_LEFT = 1;
|
|
ferencd@0
|
48 const TOP_RIGHT = 2;
|
|
ferencd@0
|
49 const BOTTOM_LEFT = 4;
|
|
ferencd@0
|
50 const BOTTOM_RIGHT = 8;
|
|
ferencd@0
|
51
|
|
ferencd@0
|
52 // How far must we be from the maze edge to trigger scrolling
|
|
ferencd@0
|
53 const MAZE_EDGE_DISTANCE_SCROLL_TRIGGER = 4;
|
|
ferencd@0
|
54
|
|
ferencd@0
|
55 // How much we can see from the maze
|
|
ferencd@0
|
56 var LIGHT_RADIUS = 3;
|
|
ferencd@0
|
57
|
|
ferencd@0
|
58 // how the maze looks
|
|
ferencd@0
|
59 const FULL_FOG = 0;
|
|
ferencd@0
|
60 const FULL_DRAWN = 1;
|
|
ferencd@0
|
61 const FOG_DRAWN = 2;
|
|
ferencd@0
|
62
|
|
ferencd@0
|
63 // indexes of the various directions the player can go
|
|
ferencd@0
|
64 const MOVE_IDX_LEFT = 0;
|
|
ferencd@0
|
65 const MOVE_IDX_UP = 1;
|
|
ferencd@0
|
66 const MOVE_IDX_RIGHT = 2;
|
|
ferencd@0
|
67 const MOVE_IDX_DOWN = 3;
|
|
ferencd@0
|
68
|
|
ferencd@0
|
69 // Player state: Dead/Alive
|
|
ferencd@0
|
70 const PLAYER_ALIVE = 1;
|
|
ferencd@0
|
71 const PLAYER_DIED = 2;
|
|
ferencd@0
|
72 var player_state = PLAYER_ALIVE;
|
|
ferencd@0
|
73
|
|
ferencd@0
|
74 // Player weapon
|
|
ferencd@0
|
75 const WEAPON_NONE = -1;
|
|
ferencd@0
|
76 const WEAPON_SPEAR = 0;
|
|
ferencd@0
|
77
|
|
ferencd@0
|
78 var player_weapon = WEAPON_NONE;
|
|
ferencd@0
|
79
|
|
ferencd@0
|
80 // Player armor
|
|
ferencd@0
|
81 const ARMOR_NONE = -1;
|
|
ferencd@0
|
82 const ARMOR_CHAINMAIL = 1;
|
|
ferencd@0
|
83 const SHOES = 2;
|
|
ferencd@0
|
84 const RING = 3;
|
|
ferencd@0
|
85 var player_armor = ARMOR_NONE;
|
|
ferencd@0
|
86
|
|
ferencd@0
|
87 // whether we remove life from steps or not
|
|
ferencd@0
|
88 const STEPS_COST = 0; // each step is 1 life
|
|
ferencd@0
|
89 const STEPS_FREE = 1; // steps do not cost 1 life
|
|
ferencd@0
|
90 const STEPS_SICK = 2; // player is sick, steps cost 2 life
|
|
ferencd@0
|
91 var player_steps = STEPS_COST;
|
|
ferencd@0
|
92 var step_count = 0;
|
|
ferencd@0
|
93
|
|
ferencd@0
|
94 const TIME_HAS_EFFECT = 0;
|
|
ferencd@0
|
95 const TIME_HAS_NO_EFFECT = 1;
|
|
ferencd@0
|
96 var time_effect = TIME_HAS_EFFECT;
|
|
ferencd@0
|
97
|
|
ferencd@0
|
98 const GAME_SUSPENDED = 1;
|
|
ferencd@0
|
99 const GAME_RUNNING = 0;
|
|
ferencd@0
|
100 var game_state = GAME_SUSPENDED;
|
|
ferencd@0
|
101
|
|
ferencd@0
|
102 var time_passing_timeout = null;
|
|
ferencd@0
|
103
|
|
ferencd@0
|
104 // These correspond to specific igw types:
|
|
ferencd@0
|
105 // 0 - empty handed skeleton. Can be killed with SPEAR or anything above
|
|
ferencd@0
|
106 // 1 - skeleton with spear. Can be killed with Spear but only if player has armor
|
|
ferencd@0
|
107 // 2 - skeleton with bow. Does not move, just shoots. Can be killed with spear and armor
|
|
ferencd@0
|
108 // 3 - skeletong with spear and armor. Cannot be killed
|
|
ferencd@0
|
109
|
|
ferencd@0
|
110 function init_maze_draw_array()
|
|
ferencd@0
|
111 {
|
|
ferencd@0
|
112 var r = new Array(h);
|
|
ferencd@0
|
113 for(var j=0; j<h; j++)
|
|
ferencd@0
|
114 {
|
|
ferencd@0
|
115 r[j] = new Array(w);
|
|
ferencd@0
|
116 for(var i=0; i<w; i++)
|
|
ferencd@0
|
117 {
|
|
ferencd@0
|
118 r[j][i] = FULL_FOG;
|
|
ferencd@0
|
119 }
|
|
ferencd@0
|
120 }
|
|
ferencd@0
|
121 return r;
|
|
ferencd@0
|
122 }
|
|
ferencd@0
|
123
|
|
ferencd@0
|
124 function update_step_visuals()
|
|
ferencd@0
|
125 {
|
|
ferencd@0
|
126 document.getElementById("steps_passed").innerHTML = " Steps: " + step_count.toString();
|
|
ferencd@0
|
127 }
|
|
ferencd@0
|
128
|
|
ferencd@0
|
129 function update_life_visuals(current_life)
|
|
ferencd@0
|
130 {
|
|
ferencd@0
|
131 document.getElementById("energy").innerHTML = current_life.toString();
|
|
ferencd@0
|
132 document.getElementById("lifeprg").value = current_life;
|
|
ferencd@0
|
133 }
|
|
ferencd@0
|
134
|
|
ferencd@0
|
135 var dying_plyr_img_idx = 0;
|
|
ferencd@0
|
136 var killer_igwidx = -1;
|
|
ferencd@0
|
137 var dancing_kille_igw = 0;
|
|
ferencd@0
|
138 var dancing_mod = 0;
|
|
ferencd@0
|
139 var death_wall_drawn = false;
|
|
ferencd@0
|
140 var skdc = 0; // skeleton dancer index, ie. the one rotating the skeleton
|
|
ferencd@0
|
141 function player_dies() {
|
|
ferencd@0
|
142 context.putImageData(imgDataPrev, x, y); // clear canvas
|
|
ferencd@0
|
143
|
|
ferencd@0
|
144 if (dying_plyr_img_idx < 6)
|
|
ferencd@0
|
145 {
|
|
ferencd@0
|
146
|
|
ferencd@0
|
147 context.drawImage(dying_player[dying_plyr_img_idx], x, y);
|
|
ferencd@0
|
148 dying_plyr_img_idx ++;
|
|
ferencd@0
|
149 }
|
|
ferencd@0
|
150
|
|
ferencd@0
|
151 if(killer_igwidx !== -1) {
|
|
ferencd@0
|
152 if (!death_wall_drawn) {
|
|
ferencd@0
|
153 draw_a_wall(row, col);
|
|
ferencd@0
|
154 death_wall_drawn = true;
|
|
ferencd@0
|
155 }
|
|
ferencd@0
|
156
|
|
ferencd@0
|
157 dancing_mod ++;
|
|
ferencd@0
|
158 context.drawImage(skel_dancer[skdc][dancing_kille_igw], x, y);
|
|
ferencd@0
|
159
|
|
ferencd@0
|
160 if(dancing_mod % 3)
|
|
ferencd@0
|
161 {
|
|
ferencd@0
|
162 dancing_kille_igw++;
|
|
ferencd@0
|
163 if(dancing_kille_igw === 6)
|
|
ferencd@0
|
164 {
|
|
ferencd@0
|
165 dancing_kille_igw = 0;
|
|
ferencd@0
|
166 skdc ++;
|
|
ferencd@0
|
167 if(skdc === 4)
|
|
ferencd@0
|
168 {
|
|
ferencd@0
|
169 skdc = 0;
|
|
ferencd@0
|
170 }
|
|
ferencd@0
|
171 }
|
|
ferencd@0
|
172 }
|
|
ferencd@0
|
173 }
|
|
ferencd@0
|
174
|
|
ferencd@0
|
175 requestAnimationFrame(player_dies);
|
|
ferencd@0
|
176 }
|
|
ferencd@0
|
177
|
|
ferencd@0
|
178 function kill_igw(i)
|
|
ferencd@0
|
179 {
|
|
ferencd@0
|
180 igw[i].state = DEAD;
|
|
ferencd@0
|
181 var current_kills = parseInt(document.getElementById("skels_killed").innerHTML);
|
|
ferencd@0
|
182 current_kills ++;
|
|
ferencd@0
|
183 document.getElementById("skels_killed").innerHTML = current_kills.toString();
|
|
ferencd@0
|
184 }
|
|
ferencd@0
|
185
|
|
ferencd@0
|
186 var go_texts=["Maybe you shouldn't have had eaten that mushroom.<p>Not all food is safe down here.",
|
|
ferencd@0
|
187 "The <img src='/img/skel/wl/d_wl_1.png' title='... it is a spear ...' style='vertical-align:middle;'> is an easy prey when you have a <img src='/img/weapons/spear.png' title='... it is a spear ...' style='vertical-align:middle;'>.<p>Wearing <img src='/img/weapons/armor.png' title='... the chainmail ...' style='vertical-align:middle;'> also increases your chance of survival.<p>Otherwise ... you are easy prey to them.",
|
|
ferencd@0
|
188 "You definitely should have eaten something on the way.<p>Finding the <img src='/img/weapons/shoe.png' title='Boots of Lightness' style='vertical-align:middle;'> and the <img src='/img/weapons/ring.png' title='Ring of Health' style='vertical-align:middle;'> also helps.",
|
|
ferencd@0
|
189 leave_text
|
|
ferencd@0
|
190 ];
|
|
ferencd@0
|
191
|
|
ferencd@0
|
192
|
|
ferencd@0
|
193 const GO_BAD_FOOD = 1;
|
|
ferencd@0
|
194 const GO_SKELETON = 2;
|
|
ferencd@0
|
195 const GO_FATIGUE = 3;
|
|
ferencd@0
|
196 const GO_LEVEL_DONE = 4;
|
|
ferencd@0
|
197
|
|
ferencd@0
|
198 // reason: 1 = player died since he ate something he wasn't supposed to
|
|
ferencd@0
|
199 // 2 = player was killed by a skeleton
|
|
ferencd@0
|
200 // 3 = fatigue
|
|
ferencd@0
|
201 // 4 = player finished the current level
|
|
ferencd@0
|
202 function game_over(reason, i)
|
|
ferencd@0
|
203 {
|
|
ferencd@0
|
204 if(reason === GO_SKELETON)
|
|
ferencd@0
|
205 {
|
|
ferencd@0
|
206 killer_igwidx = i;
|
|
ferencd@0
|
207 context.putImageData(igw[killer_igwidx].savedImage, igw[killer_igwidx].x, igw[killer_igwidx].y);
|
|
ferencd@0
|
208 }
|
|
ferencd@0
|
209 document.getElementById("goimg").style.visibility = 'visible';
|
|
ferencd@0
|
210
|
|
ferencd@0
|
211 var final_message = go_texts[reason - 1];
|
|
ferencd@0
|
212 if(reason !== GO_LEVEL_DONE)
|
|
ferencd@0
|
213 {
|
|
ferencd@0
|
214 update_life_visuals(0);
|
|
ferencd@0
|
215
|
|
ferencd@0
|
216 player_dies();
|
|
ferencd@0
|
217 draw_a_wall(row,col);
|
|
ferencd@0
|
218 context.drawImage(dying_player[5], x, y);
|
|
ferencd@0
|
219
|
|
ferencd@0
|
220 final_message += story_text;
|
|
ferencd@0
|
221 document.getElementById("goimg").src ="/img/gameover.png";
|
|
ferencd@0
|
222 player_state = PLAYER_DIED;
|
|
ferencd@0
|
223 }
|
|
ferencd@0
|
224 else
|
|
ferencd@0
|
225 {
|
|
ferencd@0
|
226 document.getElementById('gonextlevel').style.visibility='visible';
|
|
ferencd@0
|
227 clearTimeout(time_passing_timeout);
|
|
ferencd@0
|
228 }
|
|
ferencd@0
|
229
|
|
ferencd@0
|
230 if(game_type === GAME_TYPE_TIMERUN)
|
|
ferencd@0
|
231 {
|
|
ferencd@0
|
232 final_message += "<p>" + document.getElementById("time_passed").innerHTML;
|
|
ferencd@0
|
233 }
|
|
ferencd@0
|
234
|
|
ferencd@0
|
235 document.getElementById("messages").style.visibility = 'visible';
|
|
ferencd@0
|
236 document.getElementById("messages").style.display = 'block';
|
|
ferencd@0
|
237 document.getElementById("gotext1").style.visibility = 'visible';
|
|
ferencd@0
|
238 document.getElementById("gotext1").innerHTML = final_message;
|
|
ferencd@0
|
239 document.getElementById("gospan").style.visibility = 'hidden';
|
|
ferencd@0
|
240
|
|
ferencd@0
|
241 document.getElementById("sysmenu").style.visibility = 'hidden';
|
|
ferencd@0
|
242
|
|
ferencd@0
|
243 game_state = GAME_SUSPENDED;
|
|
ferencd@0
|
244 }
|
|
ferencd@0
|
245
|
|
ferencd@0
|
246 var maze_stats = init_maze_draw_array();
|
|
ferencd@0
|
247
|
|
ferencd@0
|
248 function point_in_circle(center_x, center_y, radius, x, y)
|
|
ferencd@0
|
249 {
|
|
ferencd@0
|
250 var D = Math.sqrt(Math.pow(center_x - x, 2) + Math.pow(center_y - y, 2));
|
|
ferencd@0
|
251 return D <= radius
|
|
ferencd@0
|
252 }
|
|
ferencd@0
|
253
|
|
ferencd@0
|
254 function draw_torches(next)
|
|
ferencd@0
|
255 {
|
|
ferencd@0
|
256 for(var i=0; i<torches.length; i++) {
|
|
ferencd@0
|
257 if(next) {
|
|
ferencd@0
|
258 torches[i].ctr ++;
|
|
ferencd@0
|
259 }
|
|
ferencd@0
|
260 if(torches[i].ctr % 5 === 0)
|
|
ferencd@0
|
261 {
|
|
ferencd@0
|
262 context.putImageData(torches[i].backgr, torches[i].x, torches[i].y);
|
|
ferencd@0
|
263
|
|
ferencd@0
|
264 if(next) {
|
|
ferencd@0
|
265 torches[i].anim_idx ++;
|
|
ferencd@0
|
266 }
|
|
ferencd@0
|
267
|
|
ferencd@0
|
268 if(torches[i].anim_idx === 3 && next) {
|
|
ferencd@0
|
269 torches[i].anim_idx = 0;
|
|
ferencd@0
|
270 }
|
|
ferencd@0
|
271 context.drawImage(torch_images[torches[i].anim_idx], torches[i].x, torches[i].y);
|
|
ferencd@0
|
272 }
|
|
ferencd@0
|
273 }
|
|
ferencd@0
|
274 }
|
|
ferencd@0
|
275
|
|
ferencd@0
|
276 function draw_a_wall(saver, savec)
|
|
ferencd@0
|
277 {
|
|
ferencd@0
|
278 if(maze_stats[saver][savec] === FULL_FOG)
|
|
ferencd@0
|
279 {
|
|
ferencd@0
|
280 return;
|
|
ferencd@0
|
281 }
|
|
ferencd@0
|
282
|
|
ferencd@0
|
283 if(maze_stats[saver][savec] === FULL_DRAWN)
|
|
ferencd@0
|
284 {
|
|
ferencd@0
|
285 var current_wall = wall_images[ maze[saver][savec] ];
|
|
ferencd@0
|
286 // Any door here?
|
|
ferencd@0
|
287 let door_t = door_at(savec, saver);
|
|
ferencd@0
|
288 if( door_t !== -1 )
|
|
ferencd@0
|
289 {
|
|
ferencd@0
|
290 current_wall = get_doored_wall(maze[saver][savec], door_t);
|
|
ferencd@0
|
291 }
|
|
ferencd@0
|
292 context.drawImage(current_wall, savec * pic_size, saver * pic_size);
|
|
ferencd@0
|
293 draw_extra_objects(saver, savec, savec * pic_size, saver * pic_size);
|
|
ferencd@0
|
294 }
|
|
ferencd@0
|
295 else
|
|
ferencd@0
|
296 {
|
|
ferencd@0
|
297 context.drawImage(fog_drawn_wall_images[ maze[saver][savec] ],
|
|
ferencd@0
|
298 savec * pic_size, saver * pic_size);
|
|
ferencd@0
|
299 }
|
|
ferencd@0
|
300 }
|
|
ferencd@0
|
301
|
|
ferencd@0
|
302 // The torch animations
|
|
ferencd@0
|
303 var torches = [];
|
|
ferencd@0
|
304
|
|
ferencd@0
|
305 var top_btm_chooser = [];
|
|
ferencd@0
|
306 top_btm_chooser[0] = top_closed_doors;
|
|
ferencd@0
|
307 top_btm_chooser[1] = bottom_closed_doors;
|
|
ferencd@0
|
308
|
|
ferencd@0
|
309 var small_fellow = new Image();
|
|
ferencd@0
|
310 small_fellow.src = '/img/funnyfellow.png';
|
|
ferencd@0
|
311
|
|
ferencd@0
|
312 // index is the number of the cell we are looking for, type is whether the door is on
|
|
ferencd@0
|
313 // the top part of the cell (0) or the bottom part (1)
|
|
ferencd@0
|
314 function get_doored_wall(index, type)
|
|
ferencd@0
|
315 {
|
|
ferencd@0
|
316 if(type !== 5)
|
|
ferencd@0
|
317 {
|
|
ferencd@0
|
318 for(var i=0; i<top_btm_chooser[type].length; i++)
|
|
ferencd@0
|
319 {
|
|
ferencd@0
|
320 if(top_btm_chooser[type][i].idx === index)
|
|
ferencd@0
|
321 {
|
|
ferencd@0
|
322 return top_btm_chooser[type][i].img;
|
|
ferencd@0
|
323 }
|
|
ferencd@0
|
324 }
|
|
ferencd@0
|
325 return wall_images[ index ];
|
|
ferencd@0
|
326 }
|
|
ferencd@0
|
327 else
|
|
ferencd@0
|
328 {
|
|
ferencd@0
|
329 return stairs_down[index];
|
|
ferencd@0
|
330 }
|
|
ferencd@0
|
331 }
|
|
ferencd@0
|
332
|
|
ferencd@0
|
333 // returns the torch type number if we have a torch at this location
|
|
ferencd@0
|
334 function have_torch_here(ii, jj)
|
|
ferencd@0
|
335 {
|
|
ferencd@0
|
336 for(var i=0; i<torch_placements.length; i++)
|
|
ferencd@0
|
337 {
|
|
ferencd@0
|
338 if(torch_placements[i].i === ii && torch_placements[i].j === jj)
|
|
ferencd@0
|
339 {
|
|
ferencd@0
|
340 return torch_placements[i].p
|
|
ferencd@0
|
341 }
|
|
ferencd@0
|
342 }
|
|
ferencd@0
|
343 return 0;
|
|
ferencd@0
|
344 }
|
|
ferencd@0
|
345
|
|
ferencd@0
|
346 // returns the food type number if we have a food item at this location
|
|
ferencd@0
|
347 function have_food_here(r, c)
|
|
ferencd@0
|
348 {
|
|
ferencd@0
|
349 for(var i=0; i<food.length; i++)
|
|
ferencd@0
|
350 {
|
|
ferencd@0
|
351 if(food[i].r === r && food[i].c === c)
|
|
ferencd@0
|
352 {
|
|
ferencd@0
|
353 return food[i].t;
|
|
ferencd@0
|
354 }
|
|
ferencd@0
|
355 }
|
|
ferencd@0
|
356 return -1;
|
|
ferencd@0
|
357 }
|
|
ferencd@0
|
358
|
|
ferencd@0
|
359 function have_loot_here(r, c)
|
|
ferencd@0
|
360 {
|
|
ferencd@0
|
361 for(var i=0; i<loot.length; i++)
|
|
ferencd@0
|
362 {
|
|
ferencd@0
|
363 if(loot[i].r === r && loot[i].c === c)
|
|
ferencd@0
|
364 {
|
|
ferencd@0
|
365 return loot[i].t;
|
|
ferencd@0
|
366 }
|
|
ferencd@0
|
367 }
|
|
ferencd@0
|
368 return -1;
|
|
ferencd@0
|
369 }
|
|
ferencd@0
|
370
|
|
ferencd@0
|
371 function draw_food(x, y, t)
|
|
ferencd@0
|
372 {
|
|
ferencd@0
|
373 context.drawImage(food_image[t], x + (pic_size - 24) / 2 - food_image[t].clientWidth / 2,
|
|
ferencd@0
|
374 y + (pic_size -24)/ 2 - food_image[t].clientHeight / 2);
|
|
ferencd@0
|
375 }
|
|
ferencd@0
|
376
|
|
ferencd@0
|
377 function draw_loot(x, y, t)
|
|
ferencd@0
|
378 {
|
|
ferencd@0
|
379 context.drawImage(item_image[t], x + (pic_size - 24) / 2 - item_image[t].clientWidth / 2,
|
|
ferencd@0
|
380 y + (pic_size -24)/ 2 - item_image[t].clientHeight / 2);
|
|
ferencd@0
|
381 }
|
|
ferencd@0
|
382
|
|
ferencd@0
|
383 // returns the food type number if we have a food item at this location
|
|
ferencd@0
|
384 function have_weapon_here(r, c)
|
|
ferencd@0
|
385 {
|
|
ferencd@0
|
386 for(var i=0; i<weapon_locations.length; i++)
|
|
ferencd@0
|
387 {
|
|
ferencd@0
|
388 if(weapon_locations[i].r === r && weapon_locations[i].c === c)
|
|
ferencd@0
|
389 {
|
|
ferencd@0
|
390 return weapon_locations[i].t;
|
|
ferencd@0
|
391 }
|
|
ferencd@0
|
392 }
|
|
ferencd@0
|
393 return -1;
|
|
ferencd@0
|
394 }
|
|
ferencd@0
|
395
|
|
ferencd@0
|
396 function draw_weapon(x, y, t)
|
|
ferencd@0
|
397 {
|
|
ferencd@0
|
398 context.drawImage(weapon_images[t], x + (pic_size - 24) / 2 - weapon_images[t].clientWidth / 2,
|
|
ferencd@0
|
399 y + (pic_size -24)/ 2 - weapon_images[t].clientHeight / 2);
|
|
ferencd@0
|
400 }
|
|
ferencd@0
|
401
|
|
ferencd@0
|
402 function draw_torch(torch_x, torch_y, i, j, cond)
|
|
ferencd@0
|
403 {
|
|
ferencd@0
|
404 if(cond)
|
|
ferencd@0
|
405 {
|
|
ferencd@0
|
406 var torch_backgr = context.getImageData(torch_x, torch_y, 6, 10);
|
|
ferencd@0
|
407 context.drawImage(torch_images[0], torch_x, torch_y);
|
|
ferencd@0
|
408 torches.push({x: torch_x, y: torch_y, anim_idx: 0, ctr: 0, i: i, j: j, backgr: torch_backgr});
|
|
ferencd@0
|
409 }
|
|
ferencd@0
|
410 }
|
|
ferencd@0
|
411
|
|
ferencd@0
|
412 function door_at(i, j)
|
|
ferencd@0
|
413 {
|
|
ferencd@0
|
414 for(var k=0; k<doors.length; k++)
|
|
ferencd@0
|
415 if(doors[k].r === j && doors[k].c === i)
|
|
ferencd@0
|
416 return doors[k].v;
|
|
ferencd@0
|
417 return -1;
|
|
ferencd@0
|
418 }
|
|
ferencd@0
|
419
|
|
ferencd@0
|
420 // true if we are just drawing a maze
|
|
ferencd@0
|
421 window.maze_drawing = false;
|
|
ferencd@0
|
422
|
|
ferencd@0
|
423 // true if we are updating the walkers. Don't move the playuer meanwhile
|
|
ferencd@0
|
424 window.walkers_updating = false;
|
|
ferencd@0
|
425
|
|
ferencd@0
|
426 function draw_extra_objects(j, i, mx, my)
|
|
ferencd@0
|
427 {
|
|
ferencd@0
|
428 var food_type = have_food_here(j, i);
|
|
ferencd@0
|
429 if (food_type !== -1) {
|
|
ferencd@0
|
430 draw_food(mx, my, food_type);
|
|
ferencd@0
|
431 }
|
|
ferencd@0
|
432
|
|
ferencd@0
|
433 var loot_type = have_loot_here(j, i);
|
|
ferencd@0
|
434 if (loot_type !== -1) {
|
|
ferencd@0
|
435 draw_loot(mx, my, loot_type);
|
|
ferencd@0
|
436 }
|
|
ferencd@0
|
437
|
|
ferencd@0
|
438 var weapon_type = have_weapon_here(j, i);
|
|
ferencd@0
|
439 if (weapon_type !== -1) {
|
|
ferencd@0
|
440 draw_weapon(mx, my, weapon_type);
|
|
ferencd@0
|
441 }
|
|
ferencd@0
|
442 }
|
|
ferencd@0
|
443
|
|
ferencd@0
|
444 var small_fellow_needs_to_be_drawn = true;
|
|
ferencd@0
|
445 if(game_type !== GAME_TYPE_STORY)
|
|
ferencd@0
|
446 {
|
|
ferencd@0
|
447 small_fellow_needs_to_be_drawn = false;
|
|
ferencd@0
|
448 }
|
|
ferencd@0
|
449 var ffx = 0; // funny fellow x,y
|
|
ferencd@0
|
450 var ffy = 0;
|
|
ferencd@0
|
451 var ffdx = 0; // funny fellow deltax,deltay
|
|
ferencd@0
|
452 var ffdy = 0;
|
|
ferencd@0
|
453 var ffImgDataPrev = null;
|
|
ferencd@0
|
454
|
|
ferencd@0
|
455 function draw_maze(mid_col, mid_row, force)
|
|
ferencd@0
|
456 {
|
|
ferencd@0
|
457 window.maze_drawing = true;
|
|
ferencd@0
|
458 var mx = 0;
|
|
ferencd@0
|
459 var my = 0;
|
|
ferencd@0
|
460
|
|
ferencd@0
|
461 // var strow = Math.max(mid_row - LIGHT_RADIUS - 1, 0);
|
|
ferencd@0
|
462 // var stcol = Math.max(mid_col - LIGHT_RADIUS - 1, 0);
|
|
ferencd@0
|
463 for(var j=0; j<h; j++) // j - row
|
|
ferencd@0
|
464 // for(var j=strow; j<mid_row + LIGHT_RADIUS + 1; j++) // j - row
|
|
ferencd@0
|
465 {
|
|
ferencd@0
|
466 // for (var i = stcol; i < mid_col + LIGHT_RADIUS + 1; i++) // i - col
|
|
ferencd@0
|
467 for (var i = 0; i <w; i++) // i - col
|
|
ferencd@0
|
468 {
|
|
ferencd@0
|
469 mx = i * pic_size;
|
|
ferencd@0
|
470 my = j * pic_size;
|
|
ferencd@0
|
471
|
|
ferencd@0
|
472 var current_idx = maze[j][i];
|
|
ferencd@0
|
473 var current_wall = wall_images[ current_idx ];
|
|
ferencd@0
|
474
|
|
ferencd@0
|
475 if( point_in_circle(mid_col, mid_row, LIGHT_RADIUS, i, j) )
|
|
ferencd@0
|
476 {
|
|
ferencd@0
|
477 if( maze_stats[j][i] !== FULL_DRAWN || force)
|
|
ferencd@0
|
478 {
|
|
ferencd@0
|
479 maze_stats[j][i] = FULL_DRAWN;
|
|
ferencd@0
|
480
|
|
ferencd@0
|
481 var door_t = door_at(i, j);
|
|
ferencd@0
|
482
|
|
ferencd@0
|
483 // Any door here?
|
|
ferencd@0
|
484 if(door_t !== -1)
|
|
ferencd@0
|
485 {
|
|
ferencd@0
|
486 current_wall = get_doored_wall(current_idx, door_t);
|
|
ferencd@0
|
487 }
|
|
ferencd@0
|
488 context.drawImage(current_wall, mx, my);
|
|
ferencd@0
|
489
|
|
ferencd@0
|
490 // let's see if this is the last cell, ie. stairs down
|
|
ferencd@0
|
491 if(door_t === 5 && small_fellow_needs_to_be_drawn)
|
|
ferencd@0
|
492 {
|
|
ferencd@0
|
493 //1,8,9
|
|
ferencd@0
|
494 ffx = mx + 15;
|
|
ferencd@0
|
495 ffy = my + 15;
|
|
ferencd@0
|
496 if(current_idx === 1 || current_idx === 9) // small guy will stand above the stairs
|
|
ferencd@0
|
497 {
|
|
ferencd@0
|
498 ffy = ffy - pic_size;
|
|
ferencd@0
|
499 ffdy = 1;
|
|
ferencd@0
|
500 }
|
|
ferencd@0
|
501 else // small guy will stand on the left of it
|
|
ferencd@0
|
502 {
|
|
ferencd@0
|
503 ffx = ffx - pic_size;
|
|
ferencd@0
|
504 ffdx = 1;
|
|
ferencd@0
|
505 }
|
|
ferencd@0
|
506 ffImgDataPrev = context.getImageData(ffx,ffy, anim_size, anim_size);
|
|
ferencd@0
|
507 context.drawImage(small_fellow, ffx, ffy);
|
|
ferencd@0
|
508 }
|
|
ferencd@0
|
509
|
|
ferencd@0
|
510 // Torches lying around the corner?
|
|
ferencd@0
|
511 var torch_location_in_cell = have_torch_here(i,j);
|
|
ferencd@0
|
512 if(torch_location_in_cell !== 0)
|
|
ferencd@0
|
513 {
|
|
ferencd@0
|
514 draw_torch(mx, my, i, j, torch_location_in_cell & TOP_LEFT);
|
|
ferencd@0
|
515 draw_torch(mx, my + pic_size - 22, i, j, torch_location_in_cell & BOTTOM_LEFT);
|
|
ferencd@0
|
516 draw_torch(mx+ pic_size - 10, my, i, j, torch_location_in_cell & TOP_RIGHT);
|
|
ferencd@0
|
517 draw_torch(mx + pic_size - 10, my + pic_size - 22, i, j, torch_location_in_cell & BOTTOM_RIGHT);
|
|
ferencd@0
|
518 }
|
|
ferencd@0
|
519 draw_extra_objects(j, i, mx, my);
|
|
ferencd@0
|
520 }
|
|
ferencd@0
|
521 }
|
|
ferencd@0
|
522 else
|
|
ferencd@0
|
523 {
|
|
ferencd@0
|
524 if(point_in_circle(mid_col, mid_row, LIGHT_RADIUS + 2, i, j) )
|
|
ferencd@0
|
525 {
|
|
ferencd@0
|
526 if(maze_stats[j][i] === FULL_DRAWN || (maze_stats[j][i] === FOG_DRAWN && force) )
|
|
ferencd@0
|
527 {
|
|
ferencd@0
|
528 context.drawImage(fog_drawn_wall_images[ current_idx ], mx, my);
|
|
ferencd@0
|
529 maze_stats[j][i] = FOG_DRAWN;
|
|
ferencd@0
|
530 // and remove the torch if found at i,j
|
|
ferencd@0
|
531 for(var ti=0; ti < torches.length; ti++)
|
|
ferencd@0
|
532 {
|
|
ferencd@0
|
533 if(torches[ti].i === i && torches[ti].j === j)
|
|
ferencd@0
|
534 {
|
|
ferencd@0
|
535 torches.splice(ti, 1);
|
|
ferencd@0
|
536 }
|
|
ferencd@0
|
537 }
|
|
ferencd@0
|
538 }
|
|
ferencd@0
|
539 }
|
|
ferencd@0
|
540 }
|
|
ferencd@0
|
541 }
|
|
ferencd@0
|
542 }
|
|
ferencd@0
|
543
|
|
ferencd@0
|
544 window.maze_drawing = false;
|
|
ferencd@0
|
545 }
|
|
ferencd@0
|
546
|
|
ferencd@0
|
547 // true if we are in between animation of the player
|
|
ferencd@0
|
548 // Will be "window.animation_running" in scripts
|
|
ferencd@0
|
549 var animation_running = false;
|
|
ferencd@0
|
550
|
|
ferencd@0
|
551 // the current animation counter
|
|
ferencd@0
|
552 var current_anim_counter = 0;
|
|
ferencd@0
|
553
|
|
ferencd@0
|
554 // the direction in which the player is going, indexes into the array of images
|
|
ferencd@0
|
555 var player_dir = MOVE_IDX_RIGHT; // 0 - Left, 1 - Up, 2 - Right, 3 - Down
|
|
ferencd@0
|
556
|
|
ferencd@0
|
557 // The size of the animation frame, ie. what must be saved from the canvas
|
|
ferencd@0
|
558 var anim_size = pic_size / 2;
|
|
ferencd@0
|
559
|
|
ferencd@0
|
560 var player_imgset = [lr_player, lr_player_spear, lr_player_armor_spear,
|
|
ferencd@0
|
561 lr_player_armor, lr_player_shoes, lr_player_shoes_spear, // +6 will give the thrust images
|
|
ferencd@0
|
562 lr_player_thrust, lr_player_spear_thrust, lr_player_armor_spear_thrust,
|
|
ferencd@0
|
563 lr_player_armor_thrust, lr_player_shoes_thrust, lr_player_shoes_spear_thrust
|
|
ferencd@0
|
564 ];
|
|
ferencd@0
|
565 var player_imgset_index = 0;
|
|
ferencd@0
|
566
|
|
ferencd@0
|
567 // returns the current player image according to
|
|
ferencd@0
|
568 // direction and current animation counter
|
|
ferencd@0
|
569 var anim_modder = step_anim_cnt;
|
|
ferencd@0
|
570 function get_current_player_image(dir)
|
|
ferencd@0
|
571 {
|
|
ferencd@0
|
572 return player_imgset[player_imgset_index][dir][current_anim_counter % anim_modder];
|
|
ferencd@0
|
573 }
|
|
ferencd@0
|
574
|
|
ferencd@0
|
575 function get_direction(c,fwd) {
|
|
ferencd@0
|
576 if(fwd === 1)
|
|
ferencd@0
|
577 {
|
|
ferencd@0
|
578 if(c === 'N') return N;
|
|
ferencd@0
|
579 if(c === 'S') return S;
|
|
ferencd@0
|
580 if(c === 'E') return E;
|
|
ferencd@0
|
581 if(c === 'W') return W;
|
|
ferencd@0
|
582 }
|
|
ferencd@0
|
583 else
|
|
ferencd@0
|
584 {
|
|
ferencd@0
|
585 if(c === 'N') return S;
|
|
ferencd@0
|
586 if(c === 'S') return N;
|
|
ferencd@0
|
587 if(c === 'E') return W;
|
|
ferencd@0
|
588 if(c === 'W') return E;
|
|
ferencd@0
|
589 }
|
|
ferencd@0
|
590 return 0;
|
|
ferencd@0
|
591 }
|
|
ferencd@0
|
592
|
|
ferencd@0
|
593 function get_dir_idx(dir)
|
|
ferencd@0
|
594 {
|
|
ferencd@0
|
595 if(dir === W) return MOVE_IDX_LEFT;
|
|
ferencd@0
|
596 if(dir === N) return MOVE_IDX_UP;
|
|
ferencd@0
|
597 if(dir === E) return MOVE_IDX_RIGHT;
|
|
ferencd@0
|
598 if(dir === S) return MOVE_IDX_DOWN;
|
|
ferencd@0
|
599 return -1;
|
|
ferencd@0
|
600 }
|
|
ferencd@0
|
601
|
|
ferencd@0
|
602 const WALKING = 1; // IGW normally goes around
|
|
ferencd@0
|
603 const DEAD = 5; // igw was killed
|
|
ferencd@0
|
604
|
|
ferencd@0
|
605 // in game walkers
|
|
ferencd@0
|
606 var igw = [];
|
|
ferencd@0
|
607
|
|
ferencd@0
|
608
|
|
ferencd@0
|
609 function update_igw_location(i) {
|
|
ferencd@0
|
610 switch(igw[i].dir) {
|
|
ferencd@0
|
611 case N:
|
|
ferencd@0
|
612 igw[i].r --;
|
|
ferencd@0
|
613 break;
|
|
ferencd@0
|
614 case E:
|
|
ferencd@0
|
615 igw[i].c ++;
|
|
ferencd@0
|
616 break;
|
|
ferencd@0
|
617 case S:
|
|
ferencd@0
|
618 igw[i].r ++;
|
|
ferencd@0
|
619 break;
|
|
ferencd@0
|
620 case W:
|
|
ferencd@0
|
621 igw[i].c --;
|
|
ferencd@0
|
622 break;
|
|
ferencd@0
|
623 }
|
|
ferencd@0
|
624 }
|
|
ferencd@0
|
625
|
|
ferencd@0
|
626 function init_walkers() {
|
|
ferencd@0
|
627 for(var i=0; i<walkers_count; i++) {
|
|
ferencd@0
|
628 var wx = walkers[i].c * pic_size + 12;
|
|
ferencd@0
|
629 var wy = walkers[i].r * pic_size + 12;
|
|
ferencd@0
|
630
|
|
ferencd@0
|
631 var cwalker = {
|
|
ferencd@0
|
632 r:walkers[i].r,
|
|
ferencd@0
|
633 c:walkers[i].c,
|
|
ferencd@0
|
634 saver:-1,
|
|
ferencd@0
|
635 savec:-1,
|
|
ferencd@0
|
636 t:walkers[i].t,
|
|
ferencd@0
|
637 p:walkers[i].p,
|
|
ferencd@0
|
638 dir:get_direction(walkers[i].p[0], 1),
|
|
ferencd@0
|
639 anim_ctr:0,
|
|
ferencd@0
|
640 step_cnt:9,
|
|
ferencd@0
|
641 x:wx,
|
|
ferencd@0
|
642 y:wy,
|
|
ferencd@0
|
643 savedImage:null,
|
|
ferencd@0
|
644 path_ctr:0,
|
|
ferencd@0
|
645 path_len:walkers[i].path_len,
|
|
ferencd@0
|
646 move_dir:1,
|
|
ferencd@0
|
647 state:WALKING,
|
|
ferencd@0
|
648 just_updated: false,
|
|
ferencd@0
|
649 anim_mod:true,
|
|
ferencd@0
|
650 };
|
|
ferencd@0
|
651
|
|
ferencd@0
|
652 igw.push(cwalker);
|
|
ferencd@0
|
653 }
|
|
ferencd@0
|
654
|
|
ferencd@0
|
655 // Now patch the rows and cols for the walker to reflect the first step
|
|
ferencd@0
|
656 for(i=0; i<walkers_count; i++) {
|
|
ferencd@0
|
657 update_igw_location(i);
|
|
ferencd@0
|
658 }
|
|
ferencd@0
|
659 }
|
|
ferencd@0
|
660
|
|
ferencd@0
|
661 function move_igw(i) {
|
|
ferencd@0
|
662 switch(igw[i].dir) {
|
|
ferencd@0
|
663 case N:
|
|
ferencd@0
|
664 igw[i].y --;
|
|
ferencd@0
|
665 return;
|
|
ferencd@0
|
666 case E:
|
|
ferencd@0
|
667 igw[i].x ++;
|
|
ferencd@0
|
668 return;
|
|
ferencd@0
|
669 case W:
|
|
ferencd@0
|
670 igw[i].x --;
|
|
ferencd@0
|
671 return;
|
|
ferencd@0
|
672 case S:
|
|
ferencd@0
|
673 igw[i].y ++;
|
|
ferencd@0
|
674 return;
|
|
ferencd@0
|
675 }
|
|
ferencd@0
|
676 igw[i].just_updated = true;
|
|
ferencd@0
|
677 }
|
|
ferencd@0
|
678
|
|
ferencd@0
|
679 function can_go(fromrow, fromcol, pxd, pyd)
|
|
ferencd@0
|
680 {
|
|
ferencd@0
|
681 if(fromrow < 0) fromrow = 0;
|
|
ferencd@0
|
682 if(fromcol < 0) fromcol = 0;
|
|
ferencd@0
|
683
|
|
ferencd@0
|
684 var cell = maze[fromrow][fromcol];
|
|
ferencd@0
|
685 var cango = 0;
|
|
ferencd@0
|
686 if(pyd === 1) cango = cell & S;
|
|
ferencd@0
|
687 if(pyd === -1) cango = cell & N;
|
|
ferencd@0
|
688 if(pxd === 1) cango = cell & E;
|
|
ferencd@0
|
689 if(pxd === -1) cango = cell & W;
|
|
ferencd@0
|
690
|
|
ferencd@0
|
691 return cango !== 0;
|
|
ferencd@0
|
692 }
|
|
ferencd@0
|
693
|
|
ferencd@0
|
694 function igw_touches_player(i, dist_comp)
|
|
ferencd@0
|
695 {
|
|
ferencd@0
|
696 var dc = (Math.abs(igw[i].x -x) < 5 && Math.abs(igw[i].y -y)<5 );
|
|
ferencd@0
|
697 if(dist_comp)
|
|
ferencd@0
|
698 {
|
|
ferencd@0
|
699 return dc;
|
|
ferencd@0
|
700 }
|
|
ferencd@0
|
701 return (( ( igw[i].r === row && igw[i].c === col && igw[i].anim_ctr >= pic_size / 2)
|
|
ferencd@0
|
702 || (igw[i].saver === row && igw[i].savec === col)
|
|
ferencd@0
|
703 ))
|
|
ferencd@0
|
704 || dc;
|
|
ferencd@0
|
705 }
|
|
ferencd@0
|
706
|
|
ferencd@0
|
707 // Checks whether the player has a corresponding weapon which he can use to kill igw[i].
|
|
ferencd@0
|
708 // igw[i].t is the type of the igw and if the player weapon > igw[i].t then it can kill.
|
|
ferencd@0
|
709 function player_has_corresponding_weapon(i)
|
|
ferencd@0
|
710 {
|
|
ferencd@0
|
711 // Fully equipped player will kill everything
|
|
ferencd@0
|
712 if (player_armor === ARMOR_CHAINMAIL && player_weapon === WEAPON_SPEAR)
|
|
ferencd@0
|
713 {
|
|
ferencd@0
|
714 return true;
|
|
ferencd@0
|
715 }
|
|
ferencd@0
|
716 // player with spear will kill simple skeletons
|
|
ferencd@0
|
717 if(player_weapon === WEAPON_SPEAR && igw[i].t === 0)
|
|
ferencd@0
|
718 {
|
|
ferencd@0
|
719 return true;
|
|
ferencd@0
|
720 }
|
|
ferencd@0
|
721 return (player_weapon >= igw[i].t);
|
|
ferencd@0
|
722 }
|
|
ferencd@0
|
723
|
|
ferencd@0
|
724 function player_has_armor()
|
|
ferencd@0
|
725 {
|
|
ferencd@0
|
726 return player_armor === ARMOR_CHAINMAIL;
|
|
ferencd@0
|
727 }
|
|
ferencd@0
|
728
|
|
ferencd@0
|
729 var anim_mod = 0;
|
|
ferencd@0
|
730
|
|
ferencd@0
|
731 function resolve_weapon(weapon_here) {
|
|
ferencd@0
|
732 if (weapon_here === RING) // ring, will stop the time
|
|
ferencd@0
|
733 {
|
|
ferencd@0
|
734 time_effect = TIME_HAS_NO_EFFECT;
|
|
ferencd@0
|
735 document.getElementById("ring_of_health_div").style.visibility = 'visible';
|
|
ferencd@0
|
736 }
|
|
ferencd@0
|
737 else if (weapon_here === SHOES) // shoes
|
|
ferencd@0
|
738 {
|
|
ferencd@0
|
739 if (player_armor === ARMOR_NONE) // player has no armor, images shoudl be lr_player_shoes
|
|
ferencd@0
|
740 {
|
|
ferencd@0
|
741 if(player_weapon === WEAPON_SPEAR)
|
|
ferencd@0
|
742 {
|
|
ferencd@0
|
743 player_imgset_index = 5;
|
|
ferencd@0
|
744 }
|
|
ferencd@0
|
745 else
|
|
ferencd@0
|
746 {
|
|
ferencd@0
|
747 player_imgset_index = 4;
|
|
ferencd@0
|
748 }
|
|
ferencd@0
|
749 }
|
|
ferencd@0
|
750 player_steps = STEPS_FREE;
|
|
ferencd@0
|
751 document.getElementById("boots_of_light_div").style.visibility = 'visible';
|
|
ferencd@0
|
752 LIGHT_RADIUS = 5;
|
|
ferencd@0
|
753 }
|
|
ferencd@0
|
754 else if (weapon_here === WEAPON_SPEAR) // spear
|
|
ferencd@0
|
755 {
|
|
ferencd@0
|
756 player_weapon = WEAPON_SPEAR;
|
|
ferencd@0
|
757 if (player_armor === ARMOR_NONE) // player has no armor, images shoudl be lr_player_spear
|
|
ferencd@0
|
758 {
|
|
ferencd@0
|
759 if(player_steps === STEPS_FREE) // Are there shoes on the player?
|
|
ferencd@0
|
760 {
|
|
ferencd@0
|
761 player_imgset_index = 5;
|
|
ferencd@0
|
762 }
|
|
ferencd@0
|
763 else
|
|
ferencd@0
|
764 {
|
|
ferencd@0
|
765 player_imgset_index = 1;
|
|
ferencd@0
|
766 }
|
|
ferencd@0
|
767 }
|
|
ferencd@0
|
768 else if (player_armor === ARMOR_CHAINMAIL) // player has armor, images should be lr_player_armor_spear
|
|
ferencd@0
|
769 {
|
|
ferencd@0
|
770 player_imgset_index = 2;
|
|
ferencd@0
|
771 }
|
|
ferencd@0
|
772 }
|
|
ferencd@0
|
773 else if (weapon_here === ARMOR_CHAINMAIL) // found the armor
|
|
ferencd@0
|
774 {
|
|
ferencd@0
|
775 player_armor = ARMOR_CHAINMAIL;
|
|
ferencd@0
|
776 if (player_weapon === WEAPON_SPEAR) {
|
|
ferencd@0
|
777 player_imgset_index = 2;
|
|
ferencd@0
|
778 }
|
|
ferencd@0
|
779 else if (player_weapon === WEAPON_NONE) {
|
|
ferencd@0
|
780 player_imgset_index = 3;
|
|
ferencd@0
|
781 }
|
|
ferencd@0
|
782 }
|
|
ferencd@0
|
783 }
|
|
ferencd@0
|
784
|
|
ferencd@0
|
785 function resolve_loot(t)
|
|
ferencd@0
|
786 {
|
|
ferencd@0
|
787 var loot_value = item_value[t];
|
|
ferencd@0
|
788 var current_gold = parseInt(document.getElementById("gold").innerHTML);
|
|
ferencd@0
|
789 current_gold += loot_value;
|
|
ferencd@0
|
790 document.getElementById("gold").innerHTML = current_gold.toString();
|
|
ferencd@0
|
791 }
|
|
ferencd@0
|
792
|
|
ferencd@0
|
793 function igw_kills_player(i)
|
|
ferencd@0
|
794 {
|
|
ferencd@0
|
795 if (!player_has_corresponding_weapon(i))
|
|
ferencd@0
|
796 {
|
|
ferencd@0
|
797 if(player_has_armor())
|
|
ferencd@0
|
798 {
|
|
ferencd@0
|
799 let current_life = parseInt(document.getElementById("energy").innerHTML);
|
|
ferencd@0
|
800 let temp_health = current_life - 1;
|
|
ferencd@0
|
801
|
|
ferencd@0
|
802 if (temp_health <= 0)
|
|
ferencd@0
|
803 {
|
|
ferencd@0
|
804 game_over(GO_SKELETON, i);
|
|
ferencd@0
|
805 return true;
|
|
ferencd@0
|
806 }
|
|
ferencd@0
|
807 update_life_visuals(temp_health);
|
|
ferencd@0
|
808 return false;
|
|
ferencd@0
|
809 }
|
|
ferencd@0
|
810 else
|
|
ferencd@0
|
811 {
|
|
ferencd@0
|
812 game_over(GO_SKELETON, i);
|
|
ferencd@0
|
813 return true;
|
|
ferencd@0
|
814 }
|
|
ferencd@0
|
815 }
|
|
ferencd@0
|
816 else
|
|
ferencd@0
|
817 {
|
|
ferencd@0
|
818 if(igw_touches_player(i, true)) {
|
|
ferencd@0
|
819 kill_igw(i);
|
|
ferencd@0
|
820 }
|
|
ferencd@0
|
821 return false;
|
|
ferencd@0
|
822 }
|
|
ferencd@0
|
823
|
|
ferencd@0
|
824 }
|
|
ferencd@0
|
825
|
|
ferencd@0
|
826 var small_fellow_anim_idx = 0;
|
|
ferencd@0
|
827 var small_fellow_anim_runs = false;
|
|
ferencd@0
|
828
|
|
ferencd@0
|
829 function walkers_simulation()
|
|
ferencd@0
|
830 {
|
|
ferencd@0
|
831 if(player_state === PLAYER_DIED)
|
|
ferencd@0
|
832 {
|
|
ferencd@0
|
833 context.drawImage(dying_player[5], x, y);
|
|
ferencd@0
|
834 return;
|
|
ferencd@0
|
835 }
|
|
ferencd@0
|
836
|
|
ferencd@0
|
837 if(game_state === GAME_SUSPENDED)
|
|
ferencd@0
|
838 {
|
|
ferencd@0
|
839 return;
|
|
ferencd@0
|
840 }
|
|
ferencd@0
|
841
|
|
ferencd@0
|
842 if(small_fellow_anim_runs && small_fellow_anim_idx < pic_size)
|
|
ferencd@0
|
843 {
|
|
ferencd@0
|
844 if(ffImgDataPrev)
|
|
ferencd@0
|
845 {
|
|
ferencd@0
|
846 context.putImageData(ffImgDataPrev, ffx, ffy); // clear canvas
|
|
ferencd@0
|
847 }
|
|
ferencd@0
|
848
|
|
ferencd@0
|
849 small_fellow_anim_idx ++;
|
|
ferencd@0
|
850 ffx += ffdx;
|
|
ferencd@0
|
851 ffy += ffdy;
|
|
ferencd@0
|
852
|
|
ferencd@0
|
853 ffImgDataPrev = context.getImageData(ffx,ffy, anim_size, anim_size);
|
|
ferencd@0
|
854
|
|
ferencd@0
|
855 context.drawImage(small_fellow, ffx, ffy);
|
|
ferencd@0
|
856
|
|
ferencd@0
|
857 }
|
|
ferencd@0
|
858
|
|
ferencd@0
|
859 // moving player drawing
|
|
ferencd@0
|
860 if(animation_running)
|
|
ferencd@0
|
861 {
|
|
ferencd@0
|
862 if(!walkers_updating)
|
|
ferencd@0
|
863 {
|
|
ferencd@0
|
864 context.putImageData(imgDataPrev, x, y); // clear canvas
|
|
ferencd@0
|
865 x += x_delta;
|
|
ferencd@0
|
866 y += y_delta;
|
|
ferencd@0
|
867 anim_mod = anim_mod + 1;
|
|
ferencd@0
|
868 if (anim_mod % 4 === 0) current_anim_counter += 1;
|
|
ferencd@0
|
869 if (current_anim_counter < pic_size / 4) {
|
|
ferencd@0
|
870 imgDataPrev = context.getImageData(x, y, anim_size, anim_size);
|
|
ferencd@0
|
871 }
|
|
ferencd@0
|
872 else {
|
|
ferencd@0
|
873 animation_running = false;
|
|
ferencd@0
|
874 current_anim_counter = 0;
|
|
ferencd@0
|
875
|
|
ferencd@0
|
876 // and here verify what is on the square we arrived to
|
|
ferencd@0
|
877
|
|
ferencd@0
|
878 // 1. See did we find the exit?
|
|
ferencd@0
|
879 if (col === exit_col && row === exit_row) {
|
|
ferencd@0
|
880 game_over(GO_LEVEL_DONE, -1);
|
|
ferencd@0
|
881 return;
|
|
ferencd@0
|
882 }
|
|
ferencd@0
|
883
|
|
ferencd@0
|
884 // 2. Any foodstuff or other here?
|
|
ferencd@0
|
885 var food_type_here = have_food_here(row, col);
|
|
ferencd@0
|
886 var maze_redraw_needed = false;
|
|
ferencd@0
|
887 if (food_type_here !== -1) {
|
|
ferencd@0
|
888 var current_life = parseInt(document.getElementById("energy").innerHTML);
|
|
ferencd@0
|
889 var temp_health = current_life + food_effects[food_type_here];
|
|
ferencd@0
|
890 remove_food(row, col);
|
|
ferencd@0
|
891 maze_redraw_needed = true;
|
|
ferencd@0
|
892 if (temp_health > 100) {
|
|
ferencd@0
|
893 temp_health = 100;
|
|
ferencd@0
|
894 }
|
|
ferencd@0
|
895 if (temp_health <= 0) {
|
|
ferencd@0
|
896 game_over(GO_BAD_FOOD, -1);
|
|
ferencd@0
|
897 return;
|
|
ferencd@0
|
898 }
|
|
ferencd@0
|
899
|
|
ferencd@0
|
900 update_life_visuals(temp_health);
|
|
ferencd@0
|
901 }
|
|
ferencd@0
|
902
|
|
ferencd@0
|
903 // Are we next to the small guy with a visible line?
|
|
ferencd@0
|
904 if( row > h - 4 && col > w - 4 && game_type === GAME_TYPE_STORY)
|
|
ferencd@0
|
905 {
|
|
ferencd@0
|
906 small_fellow_needs_to_be_drawn = false;
|
|
ferencd@0
|
907 maze_redraw_needed = true;
|
|
ferencd@0
|
908 small_fellow_anim_runs = true;
|
|
ferencd@0
|
909 }
|
|
ferencd@0
|
910
|
|
ferencd@0
|
911 // see if there is a wepon there
|
|
ferencd@0
|
912 var weapon_here = have_weapon_here(row, col);
|
|
ferencd@0
|
913 if (weapon_here !== -1)
|
|
ferencd@0
|
914 {
|
|
ferencd@0
|
915 resolve_weapon(weapon_here);
|
|
ferencd@0
|
916 remove_weapon(row, col);
|
|
ferencd@0
|
917 maze_redraw_needed = true;
|
|
ferencd@0
|
918 }
|
|
ferencd@0
|
919
|
|
ferencd@0
|
920 // if this is an adventure game, see if there is any loot here
|
|
ferencd@0
|
921 if(game_type === GAME_TYPE_ADVENTURE)
|
|
ferencd@0
|
922 {
|
|
ferencd@0
|
923 // see if there is a wepon there
|
|
ferencd@0
|
924 var loot_here = have_loot_here(row, col);
|
|
ferencd@0
|
925 if (loot_here !== -1)
|
|
ferencd@0
|
926 {
|
|
ferencd@0
|
927 resolve_loot(loot_here);
|
|
ferencd@0
|
928 remove_loot(row, col);
|
|
ferencd@0
|
929 maze_redraw_needed = true;
|
|
ferencd@0
|
930 }
|
|
ferencd@0
|
931 }
|
|
ferencd@0
|
932
|
|
ferencd@0
|
933 if (maze_redraw_needed)
|
|
ferencd@0
|
934 {
|
|
ferencd@0
|
935 draw_maze(col, row, true);
|
|
ferencd@0
|
936 imgDataPrev = context.getImageData(x, y, anim_size, anim_size);
|
|
ferencd@0
|
937 }
|
|
ferencd@0
|
938
|
|
ferencd@0
|
939 // see if this was a hit operation or not
|
|
ferencd@0
|
940 if(anim_modder === thrust_anim_cnt)
|
|
ferencd@0
|
941 {
|
|
ferencd@0
|
942 // update the image set for the walking
|
|
ferencd@0
|
943 anim_modder = step_anim_cnt;
|
|
ferencd@0
|
944 player_imgset_index -= 6;
|
|
ferencd@0
|
945 }
|
|
ferencd@0
|
946 }
|
|
ferencd@0
|
947 context.drawImage(get_current_player_image(player_dir), x, y);
|
|
ferencd@0
|
948 }
|
|
ferencd@0
|
949 }
|
|
ferencd@0
|
950
|
|
ferencd@0
|
951 draw_torches(true);
|
|
ferencd@0
|
952
|
|
ferencd@0
|
953 window.walkers_updating = true;
|
|
ferencd@0
|
954 var drawn_walkers = [];
|
|
ferencd@0
|
955
|
|
ferencd@0
|
956 for (var i = 0; i < igw.length; i++) {
|
|
ferencd@0
|
957 if (igw[i].state === DEAD) {
|
|
ferencd@0
|
958 context.drawImage(skel_dies[5], igw[i].x, igw[i].y);
|
|
ferencd@0
|
959 continue;
|
|
ferencd@0
|
960 }
|
|
ferencd@0
|
961
|
|
ferencd@0
|
962 igw[i].anim_mod = !igw[i].anim_mod;
|
|
ferencd@0
|
963 if (igw[i].anim_mod) igw[i].anim_ctr++;
|
|
ferencd@0
|
964 igw[i].just_updated = false;
|
|
ferencd@0
|
965
|
|
ferencd@0
|
966 igw[i].saver = igw[i].r;
|
|
ferencd@0
|
967 igw[i].savec = igw[i].c;
|
|
ferencd@0
|
968
|
|
ferencd@0
|
969 if (igw_touches_player(i,false))
|
|
ferencd@0
|
970 {
|
|
ferencd@0
|
971 if(igw_kills_player(i))
|
|
ferencd@0
|
972 {
|
|
ferencd@0
|
973 return;
|
|
ferencd@0
|
974 }
|
|
ferencd@0
|
975 }
|
|
ferencd@0
|
976
|
|
ferencd@0
|
977 if (igw[i].anim_ctr > pic_size / 2 - 1) {
|
|
ferencd@0
|
978 // means we have stepped over the current tile, time to advance to the next one
|
|
ferencd@0
|
979 igw[i].path_ctr = igw[i].path_ctr + igw[i].move_dir;
|
|
ferencd@0
|
980 // console.log("igw[",i,'].path_ctr=',igw[i].path_ctr,' path_len=',igw[i].path_len);
|
|
ferencd@0
|
981 if (igw[i].path_ctr === igw[i].path_len || igw[i].path_ctr < 0) {
|
|
ferencd@0
|
982 // just perform a routine check that the last step of the igw does not kill the player
|
|
ferencd@0
|
983 var tempr = igw[i].r;
|
|
ferencd@0
|
984 var tempc = igw[i].c;
|
|
ferencd@0
|
985 update_igw_location(i);
|
|
ferencd@0
|
986 if (igw_touches_player(i,false))
|
|
ferencd@0
|
987 {
|
|
ferencd@0
|
988 if(igw_kills_player(i))
|
|
ferencd@0
|
989 {
|
|
ferencd@0
|
990 return;
|
|
ferencd@0
|
991 }
|
|
ferencd@0
|
992 }
|
|
ferencd@0
|
993 //draw_a_wall(igw[i].r, igw[i].c);
|
|
ferencd@0
|
994
|
|
ferencd@0
|
995 igw[i].r = tempr;
|
|
ferencd@0
|
996 igw[i].c = tempc;
|
|
ferencd@0
|
997
|
|
ferencd@0
|
998 // this reverses the igw
|
|
ferencd@0
|
999 igw[i].move_dir = -igw[i].move_dir;
|
|
ferencd@0
|
1000 igw[i].path_ctr --;
|
|
ferencd@0
|
1001 if(igw[i].path_ctr < 0)
|
|
ferencd@0
|
1002 {
|
|
ferencd@0
|
1003 igw[i].path_ctr = 0;
|
|
ferencd@0
|
1004 }
|
|
ferencd@0
|
1005 }
|
|
ferencd@0
|
1006
|
|
ferencd@0
|
1007 igw[i].dir = get_direction(igw[i].p[igw[i].path_ctr], igw[i].move_dir);
|
|
ferencd@0
|
1008 update_igw_location(i);
|
|
ferencd@0
|
1009 igw[i].anim_ctr = 0;
|
|
ferencd@0
|
1010 }
|
|
ferencd@0
|
1011
|
|
ferencd@0
|
1012 if (maze_stats[igw[i].r][igw[i].c] === FULL_DRAWN && igw[i].savedImage === null)
|
|
ferencd@0
|
1013 {
|
|
ferencd@0
|
1014 igw[i].savedImage = context.getImageData(igw[i].x, igw[i].y, anim_size, anim_size);
|
|
ferencd@0
|
1015 }
|
|
ferencd@0
|
1016 else
|
|
ferencd@0
|
1017 {
|
|
ferencd@0
|
1018 if (maze_stats[igw[i].r][igw[i].c] === FOG_DRAWN) {
|
|
ferencd@0
|
1019 context.drawImage(fog_drawn_wall_images[maze[igw[i].r][igw[i].c]], igw[i].c * pic_size, igw[i].r * pic_size);
|
|
ferencd@0
|
1020 }
|
|
ferencd@0
|
1021
|
|
ferencd@0
|
1022 // do we move away from a full drawn cell?
|
|
ferencd@0
|
1023 if (maze_stats[igw[i].saver][igw[i].savec] === FULL_DRAWN) {
|
|
ferencd@0
|
1024 draw_a_wall(igw[i].saver, igw[i].savec);
|
|
ferencd@0
|
1025 }
|
|
ferencd@0
|
1026 if (igw[i].savedImage === null) {
|
|
ferencd@0
|
1027 igw[i].savedImage = context.getImageData(igw[i].x, igw[i].y, anim_size, anim_size);
|
|
ferencd@0
|
1028 }
|
|
ferencd@0
|
1029
|
|
ferencd@0
|
1030 }
|
|
ferencd@0
|
1031
|
|
ferencd@0
|
1032 // restore the background
|
|
ferencd@0
|
1033 if( maze_stats[igw[i].r][igw[i].c] === FULL_DRAWN && igw[i].savedImage !== null && maze_stats[igw[i].saver][igw[i].savec] === FULL_DRAWN )
|
|
ferencd@0
|
1034 {
|
|
ferencd@0
|
1035 draw_a_wall(igw[i].r, igw[i].c);
|
|
ferencd@0
|
1036 // draw_extra_objects(igw[i].r, igw[i].c, igw[i].r * pic_size, igw[i].c * pic_size)
|
|
ferencd@0
|
1037 context.putImageData(igw[i].savedImage, igw[i].x, igw[i].y);
|
|
ferencd@0
|
1038
|
|
ferencd@0
|
1039 // draw only torches which are being affected
|
|
ferencd@0
|
1040 for (var k = 0; k < torches.length; k++) {
|
|
ferencd@0
|
1041 if (torches[k].i === igw[i].c && torches[k].j === igw[i].r) {
|
|
ferencd@0
|
1042 context.drawImage(torch_images[torches[k].anim_idx], torches[k].x, torches[k].y);
|
|
ferencd@0
|
1043 }
|
|
ferencd@0
|
1044 }
|
|
ferencd@0
|
1045 }
|
|
ferencd@0
|
1046
|
|
ferencd@0
|
1047 // move the walker on the screen
|
|
ferencd@0
|
1048 move_igw(i);
|
|
ferencd@0
|
1049
|
|
ferencd@0
|
1050 if (maze_stats[igw[i].r][igw[i].c] === FULL_DRAWN) {
|
|
ferencd@0
|
1051 igw[i].savedImage = context.getImageData(igw[i].x, igw[i].y, anim_size, anim_size);
|
|
ferencd@0
|
1052 let dir_idx = get_dir_idx(igw[i].dir);
|
|
ferencd@0
|
1053 let ani_idx = igw[i].anim_ctr % igw[i].step_cnt;
|
|
ferencd@0
|
1054 // console.log('igw[i].dir',igw[i].dir, 'dir_idx',dir_idx,'ani_idx',ani_idx);
|
|
ferencd@0
|
1055 context.drawImage(walker_images[igw[i].t][dir_idx][ani_idx], igw[i].x, igw[i].y);
|
|
ferencd@0
|
1056 drawn_walkers.push({
|
|
ferencd@0
|
1057 img: walker_images[igw[i].t][dir_idx][igw[i].anim_ctr % igw[i].step_cnt],
|
|
ferencd@0
|
1058 x: igw[i].x,
|
|
ferencd@0
|
1059 y: igw[i].y,
|
|
ferencd@0
|
1060 r: igw[i].r,
|
|
ferencd@0
|
1061 c: igw[i].c
|
|
ferencd@0
|
1062 });
|
|
ferencd@0
|
1063 }
|
|
ferencd@0
|
1064 }
|
|
ferencd@0
|
1065
|
|
ferencd@0
|
1066 // and just draw again all the walkers that were drawn
|
|
ferencd@0
|
1067 if (drawn_walkers.length > 0) {
|
|
ferencd@0
|
1068 for (i = 0; i < drawn_walkers.length; i++) {
|
|
ferencd@0
|
1069 if (maze_stats[drawn_walkers[i].r][drawn_walkers[i].c] === FULL_DRAWN &&
|
|
ferencd@0
|
1070 maze_stats[igw[i].saver][igw[i].savec] === FULL_DRAWN) {
|
|
ferencd@0
|
1071 context.drawImage(drawn_walkers[i].img, drawn_walkers[i].x, drawn_walkers[i].y);
|
|
ferencd@0
|
1072 }
|
|
ferencd@0
|
1073 }
|
|
ferencd@0
|
1074 // and the player
|
|
ferencd@0
|
1075 context.drawImage(get_current_player_image(player_dir), x, y);
|
|
ferencd@0
|
1076 }
|
|
ferencd@0
|
1077 window.walkers_updating = false;
|
|
ferencd@0
|
1078
|
|
ferencd@0
|
1079 requestAnimationFrame(walkers_simulation);
|
|
ferencd@0
|
1080 }
|
|
ferencd@0
|
1081
|
|
ferencd@0
|
1082 // previous image which was placed on the canvas
|
|
ferencd@0
|
1083 var imgDataPrev = null;
|
|
ferencd@0
|
1084
|
|
ferencd@0
|
1085
|
|
ferencd@0
|
1086 /* Mouse scroll handling */
|
|
ferencd@0
|
1087 // The canvas will scroll back to these coordinates when done with mouse move
|
|
ferencd@0
|
1088 var marginLeftBackup = 0;
|
|
ferencd@0
|
1089 var marginTopBackup = 0;
|
|
ferencd@0
|
1090 var dragging = false;
|
|
ferencd@0
|
1091 var lastX = 0;
|
|
ferencd@0
|
1092 var lastY = 0;
|
|
ferencd@0
|
1093 var marginLeft = 0;
|
|
ferencd@0
|
1094 var marginTop = 0;
|
|
ferencd@0
|
1095 // mouse press handler
|
|
ferencd@0
|
1096 function mouse_press(e)
|
|
ferencd@0
|
1097 {
|
|
ferencd@0
|
1098 var evt = e || event;
|
|
ferencd@0
|
1099 dragging = true;
|
|
ferencd@0
|
1100 lastX = evt.clientX;
|
|
ferencd@0
|
1101 lastY = evt.clientY;
|
|
ferencd@0
|
1102 marginLeftBackup = canvas.style.marginLeft;
|
|
ferencd@0
|
1103 marginTopBackup = canvas.style.marginTop;
|
|
ferencd@0
|
1104 e.preventDefault();
|
|
ferencd@0
|
1105 }
|
|
ferencd@0
|
1106
|
|
ferencd@0
|
1107 function mouse_move(e)
|
|
ferencd@0
|
1108 {
|
|
ferencd@0
|
1109 var evt = e || event;
|
|
ferencd@0
|
1110 if (dragging) {
|
|
ferencd@0
|
1111 var deltaX = evt.clientX - lastX;
|
|
ferencd@0
|
1112 lastX = evt.clientX;
|
|
ferencd@0
|
1113
|
|
ferencd@0
|
1114 if(marginLeft + deltaX <= 0 && canvas.width - Math.abs(marginLeft + deltaX) >= canvas_container.offsetWidth) // did we scroll out left/right
|
|
ferencd@0
|
1115 {
|
|
ferencd@0
|
1116 marginLeft += deltaX;
|
|
ferencd@0
|
1117 canvas.style.marginLeft = marginLeft + "px";
|
|
ferencd@0
|
1118 }
|
|
ferencd@0
|
1119
|
|
ferencd@0
|
1120 var deltaY = evt.clientY - lastY;
|
|
ferencd@0
|
1121 lastY = evt.clientY;
|
|
ferencd@0
|
1122 if(marginTop + deltaY <= 0 && canvas.height - Math.abs(marginTop + deltaY) >= canvas_container.offsetHeight)
|
|
ferencd@0
|
1123 {
|
|
ferencd@0
|
1124 marginTop += deltaY;
|
|
ferencd@0
|
1125 canvas.style.marginTop = marginTop + "px";
|
|
ferencd@0
|
1126 }
|
|
ferencd@0
|
1127 }
|
|
ferencd@0
|
1128 e.preventDefault();
|
|
ferencd@0
|
1129 }
|
|
ferencd@0
|
1130
|
|
ferencd@0
|
1131 function mouse_up() {
|
|
ferencd@0
|
1132 dragging = false;
|
|
ferencd@0
|
1133 canvas.style.marginLeft = marginLeftBackup;
|
|
ferencd@0
|
1134 canvas.style.marginTop = marginTopBackup;
|
|
ferencd@0
|
1135 }
|
|
ferencd@0
|
1136
|
|
ferencd@0
|
1137 var canv_anim_counter = 0;
|
|
ferencd@0
|
1138 var canv_moving_direction_ud = 0;
|
|
ferencd@0
|
1139 function animate_canvas_movement_up_down() {
|
|
ferencd@0
|
1140 canv_anim_counter += 1;
|
|
ferencd@0
|
1141 marginTop += canv_moving_direction_ud;
|
|
ferencd@0
|
1142 if (canv_anim_counter < pic_size)
|
|
ferencd@0
|
1143 {
|
|
ferencd@0
|
1144 requestAnimationFrame(animate_canvas_movement_up_down);
|
|
ferencd@0
|
1145 }
|
|
ferencd@0
|
1146 else
|
|
ferencd@0
|
1147 {
|
|
ferencd@0
|
1148 canv_anim_counter = 0;
|
|
ferencd@0
|
1149 }
|
|
ferencd@0
|
1150 if(canv_moving_direction_ud === -1)
|
|
ferencd@0
|
1151 {
|
|
ferencd@0
|
1152 if(canvas.height - Math.abs(marginTop) >= canvas_container.offsetHeight)
|
|
ferencd@0
|
1153 {
|
|
ferencd@0
|
1154 canvas.style.marginTop = marginTop + "px";
|
|
ferencd@0
|
1155 }
|
|
ferencd@0
|
1156 }
|
|
ferencd@0
|
1157 else
|
|
ferencd@0
|
1158 {
|
|
ferencd@0
|
1159 if(marginTop <= 0)
|
|
ferencd@0
|
1160 {
|
|
ferencd@0
|
1161 canvas.style.marginTop = marginTop + "px";
|
|
ferencd@0
|
1162 }
|
|
ferencd@0
|
1163 }
|
|
ferencd@0
|
1164 }
|
|
ferencd@0
|
1165
|
|
ferencd@0
|
1166 var canv_moving_direction_lr = 0;
|
|
ferencd@0
|
1167 function animate_canvas_movement_left_right() {
|
|
ferencd@0
|
1168 canv_anim_counter += 1;
|
|
ferencd@0
|
1169 marginLeft += canv_moving_direction_lr;
|
|
ferencd@0
|
1170 if (canv_anim_counter < pic_size)
|
|
ferencd@0
|
1171 {
|
|
ferencd@0
|
1172 requestAnimationFrame(animate_canvas_movement_left_right);
|
|
ferencd@0
|
1173 }
|
|
ferencd@0
|
1174 else
|
|
ferencd@0
|
1175 {
|
|
ferencd@0
|
1176 canv_anim_counter = 0;
|
|
ferencd@0
|
1177 }
|
|
ferencd@0
|
1178 if(canv_moving_direction_lr === -1)
|
|
ferencd@0
|
1179 {
|
|
ferencd@0
|
1180 if(canvas.width - Math.abs(marginLeft) >= canvas_container.offsetWidth)
|
|
ferencd@0
|
1181 {
|
|
ferencd@0
|
1182 canvas.style.marginLeft = marginLeft + "px";
|
|
ferencd@0
|
1183 }
|
|
ferencd@0
|
1184 }
|
|
ferencd@0
|
1185 else
|
|
ferencd@0
|
1186 {
|
|
ferencd@0
|
1187 if(marginLeft <= 0)
|
|
ferencd@0
|
1188 {
|
|
ferencd@0
|
1189 canvas.style.marginLeft = marginLeft + "px";
|
|
ferencd@0
|
1190 }
|
|
ferencd@0
|
1191 }
|
|
ferencd@0
|
1192 }
|
|
ferencd@0
|
1193
|
|
ferencd@0
|
1194 function remove_food(row, col)
|
|
ferencd@0
|
1195 {
|
|
ferencd@0
|
1196 for(var i=0; i<food.length; i++)
|
|
ferencd@0
|
1197 {
|
|
ferencd@0
|
1198 if(food[i].r === row && food[i].c === col)
|
|
ferencd@0
|
1199 {
|
|
ferencd@0
|
1200 food.splice(i, 1);
|
|
ferencd@0
|
1201 return;
|
|
ferencd@0
|
1202 }
|
|
ferencd@0
|
1203 }
|
|
ferencd@0
|
1204 }
|
|
ferencd@0
|
1205
|
|
ferencd@0
|
1206 function remove_weapon(row, col)
|
|
ferencd@0
|
1207 {
|
|
ferencd@0
|
1208 for(var i=0; i<weapon_locations.length; i++)
|
|
ferencd@0
|
1209 {
|
|
ferencd@0
|
1210 if(weapon_locations[i].r === row && weapon_locations[i].c === col)
|
|
ferencd@0
|
1211 {
|
|
ferencd@0
|
1212 weapon_locations.splice(i, 1);
|
|
ferencd@0
|
1213 return;
|
|
ferencd@0
|
1214 }
|
|
ferencd@0
|
1215 }
|
|
ferencd@0
|
1216 }
|
|
ferencd@0
|
1217
|
|
ferencd@0
|
1218 function remove_loot(row, col)
|
|
ferencd@0
|
1219 {
|
|
ferencd@0
|
1220 for(var i=0; i<loot.length; i++)
|
|
ferencd@0
|
1221 {
|
|
ferencd@0
|
1222 if(loot[i].r === row && loot[i].c === col)
|
|
ferencd@0
|
1223 {
|
|
ferencd@0
|
1224 loot.splice(i, 1);
|
|
ferencd@0
|
1225 return;
|
|
ferencd@0
|
1226 }
|
|
ferencd@0
|
1227 }
|
|
ferencd@0
|
1228 }
|
|
ferencd@0
|
1229 var time_pass_timeout_set = false;
|
|
ferencd@0
|
1230
|
|
ferencd@0
|
1231 function step(dir, px_delta, py_delta)
|
|
ferencd@0
|
1232 {
|
|
ferencd@0
|
1233 if(!time_pass_timeout_set)
|
|
ferencd@0
|
1234 {
|
|
ferencd@0
|
1235 time_passing_timeout = setTimeout(time_tick, 1000);
|
|
ferencd@0
|
1236 time_pass_timeout_set = true;
|
|
ferencd@0
|
1237 }
|
|
ferencd@0
|
1238
|
|
ferencd@0
|
1239 if(! animation_running) // this tells us if we are in an animation
|
|
ferencd@0
|
1240 {
|
|
ferencd@0
|
1241 var current_life = parseInt(document.getElementById("energy").innerHTML);
|
|
ferencd@0
|
1242
|
|
ferencd@0
|
1243 player_dir = dir;
|
|
ferencd@0
|
1244
|
|
ferencd@0
|
1245 var t_row = row + py_delta;
|
|
ferencd@0
|
1246 var t_col = col + px_delta;
|
|
ferencd@0
|
1247 if(can_go(row, col, px_delta, py_delta))
|
|
ferencd@0
|
1248 {
|
|
ferencd@0
|
1249
|
|
ferencd@0
|
1250 if(player_steps === STEPS_COST) {
|
|
ferencd@0
|
1251 current_life --;
|
|
ferencd@0
|
1252 }
|
|
ferencd@0
|
1253 else
|
|
ferencd@0
|
1254 if(player_steps === STEPS_SICK) {
|
|
ferencd@0
|
1255 current_life -= 2;
|
|
ferencd@0
|
1256 }
|
|
ferencd@0
|
1257 if(current_life <= 0)
|
|
ferencd@0
|
1258 {
|
|
ferencd@0
|
1259 game_over(GO_FATIGUE, -1);
|
|
ferencd@0
|
1260 return;
|
|
ferencd@0
|
1261 }
|
|
ferencd@0
|
1262 update_life_visuals(current_life);
|
|
ferencd@0
|
1263 step_count ++;
|
|
ferencd@0
|
1264 if(game_type === GAME_TYPE_TIMERUN)
|
|
ferencd@0
|
1265 {
|
|
ferencd@0
|
1266 update_step_visuals();
|
|
ferencd@0
|
1267 }
|
|
ferencd@0
|
1268
|
|
ferencd@0
|
1269 var ud_scrolled = false;
|
|
ferencd@0
|
1270 var lr_scrolled = false;
|
|
ferencd@0
|
1271
|
|
ferencd@0
|
1272 if(px_delta === 1) // right
|
|
ferencd@0
|
1273 {
|
|
ferencd@0
|
1274 if(col >= last_col_drawn - MAZE_EDGE_DISTANCE_SCROLL_TRIGGER)
|
|
ferencd@0
|
1275 {
|
|
ferencd@0
|
1276 last_col_drawn ++ ;
|
|
ferencd@0
|
1277 first_col_drawn ++;
|
|
ferencd@0
|
1278 canv_moving_direction_lr = -1;
|
|
ferencd@0
|
1279 canv_anim_counter = 0;
|
|
ferencd@0
|
1280 animate_canvas_movement_left_right();
|
|
ferencd@0
|
1281 lr_scrolled = true;
|
|
ferencd@0
|
1282 }
|
|
ferencd@0
|
1283 }
|
|
ferencd@0
|
1284
|
|
ferencd@0
|
1285 if(px_delta === -1) // left
|
|
ferencd@0
|
1286 {
|
|
ferencd@0
|
1287 if(col <= first_col_drawn + MAZE_EDGE_DISTANCE_SCROLL_TRIGGER && !lr_scrolled && first_col_drawn > 0)
|
|
ferencd@0
|
1288 {
|
|
ferencd@0
|
1289 last_col_drawn -- ;
|
|
ferencd@0
|
1290 first_col_drawn --;
|
|
ferencd@0
|
1291 canv_moving_direction_lr = 1;
|
|
ferencd@0
|
1292 canv_anim_counter = 0;
|
|
ferencd@0
|
1293 animate_canvas_movement_left_right();
|
|
ferencd@0
|
1294 lr_scrolled = true;
|
|
ferencd@0
|
1295 }
|
|
ferencd@0
|
1296 }
|
|
ferencd@0
|
1297
|
|
ferencd@0
|
1298 if(py_delta === 1) // down
|
|
ferencd@0
|
1299 {
|
|
ferencd@0
|
1300 if(row >= last_row_drawn - MAZE_EDGE_DISTANCE_SCROLL_TRIGGER && !lr_scrolled)
|
|
ferencd@0
|
1301 {
|
|
ferencd@0
|
1302 last_row_drawn ++ ;
|
|
ferencd@0
|
1303 first_row_drawn ++;
|
|
ferencd@0
|
1304 canv_moving_direction_ud = -1;
|
|
ferencd@0
|
1305 canv_anim_counter = 0;
|
|
ferencd@0
|
1306 animate_canvas_movement_up_down();
|
|
ferencd@0
|
1307 ud_scrolled = true;
|
|
ferencd@0
|
1308 }
|
|
ferencd@0
|
1309 }
|
|
ferencd@0
|
1310
|
|
ferencd@0
|
1311 if(py_delta === -1) //up
|
|
ferencd@0
|
1312 {
|
|
ferencd@0
|
1313 if(row <= first_row_drawn + MAZE_EDGE_DISTANCE_SCROLL_TRIGGER && !lr_scrolled && !ud_scrolled && first_row_drawn > 0)
|
|
ferencd@0
|
1314 {
|
|
ferencd@0
|
1315 last_row_drawn -- ;
|
|
ferencd@0
|
1316 first_row_drawn --;
|
|
ferencd@0
|
1317 canv_moving_direction_ud = 1;
|
|
ferencd@0
|
1318 canv_anim_counter = 0;
|
|
ferencd@0
|
1319 animate_canvas_movement_up_down();
|
|
ferencd@0
|
1320 }
|
|
ferencd@0
|
1321 }
|
|
ferencd@0
|
1322
|
|
ferencd@0
|
1323 row = t_row;
|
|
ferencd@0
|
1324 col = t_col;
|
|
ferencd@0
|
1325
|
|
ferencd@0
|
1326 anim_modder = step_anim_cnt;
|
|
ferencd@0
|
1327 window.animation_running = true;
|
|
ferencd@0
|
1328 current_anim_counter = 0;
|
|
ferencd@0
|
1329 x_delta = px_delta;
|
|
ferencd@0
|
1330 y_delta = py_delta;
|
|
ferencd@0
|
1331 }
|
|
ferencd@0
|
1332
|
|
ferencd@0
|
1333 // and finally make sure the player is drawn back normally where it's supposed to be
|
|
ferencd@0
|
1334 draw_maze(col, row, true);
|
|
ferencd@0
|
1335 context.drawImage(get_current_player_image(player_dir), x, y);
|
|
ferencd@0
|
1336 }
|
|
ferencd@0
|
1337 }
|
|
ferencd@0
|
1338
|
|
ferencd@0
|
1339 function sleep(ms)
|
|
ferencd@0
|
1340 {
|
|
ferencd@0
|
1341 return new Promise(resolve => setTimeout(resolve, ms));
|
|
ferencd@0
|
1342 }
|
|
ferencd@0
|
1343
|
|
ferencd@0
|
1344 function hit_something()
|
|
ferencd@0
|
1345 {
|
|
ferencd@0
|
1346 if(! animation_running) // this tells us if we are in an animation
|
|
ferencd@0
|
1347 {
|
|
ferencd@0
|
1348 x_delta = 0;
|
|
ferencd@0
|
1349 y_delta = 0;
|
|
ferencd@0
|
1350 player_imgset_index += 6;
|
|
ferencd@0
|
1351 anim_modder = thrust_anim_cnt;
|
|
ferencd@0
|
1352 window.animation_running = true;
|
|
ferencd@0
|
1353 current_anim_counter = 0;
|
|
ferencd@0
|
1354 }
|
|
ferencd@0
|
1355 }
|
|
ferencd@0
|
1356
|
|
ferencd@0
|
1357 // the keyboard handler
|
|
ferencd@0
|
1358 async function keypressed(e)
|
|
ferencd@0
|
1359 {
|
|
ferencd@0
|
1360 if(player_state === PLAYER_ALIVE)
|
|
ferencd@0
|
1361 {
|
|
ferencd@0
|
1362 let slept = 1;
|
|
ferencd@0
|
1363 while(window.walkers_updating && slept < 60)
|
|
ferencd@0
|
1364 {
|
|
ferencd@0
|
1365 slept ++;
|
|
ferencd@0
|
1366 await sleep(20);
|
|
ferencd@0
|
1367 }
|
|
ferencd@0
|
1368
|
|
ferencd@0
|
1369 var code = e.keyCode;
|
|
ferencd@0
|
1370 switch (code) {
|
|
ferencd@0
|
1371 case 37: step(MOVE_IDX_LEFT, -1, 0); break; //Left key
|
|
ferencd@0
|
1372 case 38: step(MOVE_IDX_UP, 0, -1); break; //Up key
|
|
ferencd@0
|
1373 case 39: step(MOVE_IDX_RIGHT, 1, 0); break; //Right key
|
|
ferencd@0
|
1374 case 40: step(MOVE_IDX_DOWN, 0, 1); break; //Down key
|
|
ferencd@0
|
1375 case 32: hit_something(); // Space
|
|
ferencd@0
|
1376
|
|
ferencd@0
|
1377 default: console.log(code); //Everything else
|
|
ferencd@0
|
1378 }
|
|
ferencd@0
|
1379 }
|
|
ferencd@0
|
1380 }
|
|
ferencd@0
|
1381
|
|
ferencd@0
|
1382 Element.prototype.remove = function() {
|
|
ferencd@0
|
1383 this.parentElement.removeChild(this);
|
|
ferencd@0
|
1384 };
|
|
ferencd@0
|
1385 NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
|
|
ferencd@0
|
1386 for(var i = this.length - 1; i >= 0; i--) {
|
|
ferencd@0
|
1387 if(this[i] && this[i].parentElement) {
|
|
ferencd@0
|
1388 this[i].parentElement.removeChild(this[i]);
|
|
ferencd@0
|
1389 }
|
|
ferencd@0
|
1390 }
|
|
ferencd@0
|
1391 };
|
|
ferencd@0
|
1392
|
|
ferencd@0
|
1393 function toggle_gos(visible)
|
|
ferencd@0
|
1394 {
|
|
ferencd@0
|
1395 document.getElementById('gotext1').style.visibility=visible?'visible':'hidden';
|
|
ferencd@0
|
1396 document.getElementById('gotext2').style.visibility=visible?'visible':'hidden';
|
|
ferencd@0
|
1397 document.getElementById('gotext3').style.visibility=visible?'visible':'hidden';
|
|
ferencd@0
|
1398 document.getElementById('gotext4').style.visibility=visible?'visible':'hidden';
|
|
ferencd@0
|
1399 document.getElementById('gotext5').style.visibility=visible?'visible':'hidden';
|
|
ferencd@0
|
1400
|
|
ferencd@0
|
1401 }
|
|
ferencd@0
|
1402
|
|
ferencd@0
|
1403 document.getElementById('badbrowser').remove();
|
|
ferencd@0
|
1404 document.getElementById('gobutton').style.visibility='visible';
|
|
ferencd@0
|
1405 toggle_gos(true);
|
|
ferencd@0
|
1406
|
|
ferencd@0
|
1407 function time_passes_by()
|
|
ferencd@0
|
1408 {
|
|
ferencd@0
|
1409 if(player_state === PLAYER_DIED)
|
|
ferencd@0
|
1410 {
|
|
ferencd@0
|
1411 context.drawImage(dying_player[5], x, y);
|
|
ferencd@0
|
1412 return;
|
|
ferencd@0
|
1413 }
|
|
ferencd@0
|
1414 if(time_effect === TIME_HAS_EFFECT)
|
|
ferencd@0
|
1415 {
|
|
ferencd@0
|
1416 var current_life = parseInt(document.getElementById("energy").innerHTML);
|
|
ferencd@0
|
1417 current_life --;
|
|
ferencd@0
|
1418 update_life_visuals(current_life);
|
|
ferencd@0
|
1419 if(current_life <= 0)
|
|
ferencd@0
|
1420 {
|
|
ferencd@0
|
1421 game_over(GO_FATIGUE, -1);
|
|
ferencd@0
|
1422
|
|
ferencd@0
|
1423 }
|
|
ferencd@0
|
1424 else
|
|
ferencd@0
|
1425 {
|
|
ferencd@0
|
1426 setTimeout(time_passes_by, 3000);
|
|
ferencd@0
|
1427 }
|
|
ferencd@0
|
1428 }
|
|
ferencd@0
|
1429 }
|
|
ferencd@0
|
1430
|
|
ferencd@0
|
1431 var seconds_passed = 0;
|
|
ferencd@0
|
1432 var minutes_passed = 0;
|
|
ferencd@0
|
1433 var hours_passed = 0;
|
|
ferencd@0
|
1434 var days_passed = 0;
|
|
ferencd@0
|
1435
|
|
ferencd@0
|
1436 function time_tick()
|
|
ferencd@0
|
1437 {
|
|
ferencd@0
|
1438 seconds_passed ++;
|
|
ferencd@0
|
1439 if(seconds_passed === 60)
|
|
ferencd@0
|
1440 {
|
|
ferencd@0
|
1441 minutes_passed ++;
|
|
ferencd@0
|
1442 if(minutes_passed === 60)
|
|
ferencd@0
|
1443 {
|
|
ferencd@0
|
1444 hours_passed ++;
|
|
ferencd@0
|
1445 if(hours_passed === 24)
|
|
ferencd@0
|
1446 {
|
|
ferencd@0
|
1447 days_passed ++;
|
|
ferencd@0
|
1448 hours_passed = 0;
|
|
ferencd@0
|
1449 }
|
|
ferencd@0
|
1450 minutes_passed = 0;
|
|
ferencd@0
|
1451 }
|
|
ferencd@0
|
1452 seconds_passed = 0;
|
|
ferencd@0
|
1453 }
|
|
ferencd@0
|
1454
|
|
ferencd@0
|
1455 let new_time = hours_passed.toString() + "h : " + minutes_passed.toString() + "m : " + seconds_passed.toString() + "s " + " ";
|
|
ferencd@0
|
1456 if(days_passed > 0)
|
|
ferencd@0
|
1457 {
|
|
ferencd@0
|
1458 new_time = days_passed.toString() + "days ";
|
|
ferencd@0
|
1459 }
|
|
ferencd@0
|
1460 document.getElementById('time_passed').innerHTML = new_time;
|
|
ferencd@0
|
1461 time_passing_timeout = setTimeout(time_tick, 1000);
|
|
ferencd@0
|
1462
|
|
ferencd@0
|
1463 }
|
|
ferencd@0
|
1464
|
|
ferencd@0
|
1465 function get_current_level() {
|
|
ferencd@0
|
1466 var lid = document.getElementById('lid').value;
|
|
ferencd@0
|
1467 var level = parseInt(lid);
|
|
ferencd@0
|
1468 return {level: level};
|
|
ferencd@0
|
1469 }
|
|
ferencd@0
|
1470
|
|
ferencd@0
|
1471 function setup_labyrinth(evt)
|
|
ferencd@0
|
1472 {
|
|
ferencd@0
|
1473 if(game_type === GAME_TYPE_TIMERUN)
|
|
ferencd@0
|
1474 {
|
|
ferencd@0
|
1475 time_effect = TIME_HAS_NO_EFFECT;
|
|
ferencd@0
|
1476 player_steps = STEPS_FREE;
|
|
ferencd@0
|
1477 }
|
|
ferencd@0
|
1478
|
|
ferencd@0
|
1479 var __ret = get_current_level();
|
|
ferencd@0
|
1480 var level = __ret.level;
|
|
ferencd@0
|
1481 document.getElementById('levelctr').innerHTML = level.toString();
|
|
ferencd@0
|
1482
|
|
ferencd@0
|
1483 var gid = document.getElementById('gid').value;
|
|
ferencd@0
|
1484 document.getElementById('gameid').innerHTML = "<a href=/" + gid + ">" + gid + " </a>";
|
|
ferencd@0
|
1485
|
|
ferencd@0
|
1486 document.getElementById('messages').style.visibility='hidden';
|
|
ferencd@0
|
1487 document.getElementById('gobutton').style.visibility='hidden';
|
|
ferencd@0
|
1488
|
|
ferencd@0
|
1489 toggle_gos(false);
|
|
ferencd@0
|
1490
|
|
ferencd@0
|
1491 // draw the maze
|
|
ferencd@0
|
1492 draw_maze(col, row, false);
|
|
ferencd@0
|
1493
|
|
ferencd@0
|
1494 // set up the previous image data in order to save it for the next animation step
|
|
ferencd@0
|
1495 imgDataPrev = context.getImageData(x,y, anim_size, anim_size);
|
|
ferencd@0
|
1496
|
|
ferencd@0
|
1497 // draw the player
|
|
ferencd@0
|
1498 context.drawImage(get_current_player_image(player_dir), x, y);
|
|
ferencd@0
|
1499
|
|
ferencd@0
|
1500 // setting up the event listeners
|
|
ferencd@0
|
1501 window.addEventListener('keydown', keypressed, false);
|
|
ferencd@0
|
1502 canvas.addEventListener('mousedown', mouse_press, false);
|
|
ferencd@0
|
1503 window.addEventListener('mousemove', mouse_move, false);
|
|
ferencd@0
|
1504 window.addEventListener('mouseup', mouse_up, false);
|
|
ferencd@0
|
1505
|
|
ferencd@0
|
1506 init_walkers();
|
|
ferencd@0
|
1507
|
|
ferencd@0
|
1508 setTimeout(time_passes_by, 3000);
|
|
ferencd@0
|
1509
|
|
ferencd@0
|
1510 game_state = GAME_RUNNING;
|
|
ferencd@0
|
1511
|
|
ferencd@0
|
1512 walkers_simulation();
|
|
ferencd@0
|
1513 }
|
|
ferencd@0
|
1514
|
|
ferencd@0
|
1515
|
|
ferencd@0
|
1516 function post(path, params, method) {
|
|
ferencd@0
|
1517 method = method || "post";
|
|
ferencd@0
|
1518 var form = document.createElement("form");
|
|
ferencd@0
|
1519 form.setAttribute("method", method);
|
|
ferencd@0
|
1520 form.setAttribute("action", path);
|
|
ferencd@0
|
1521
|
|
ferencd@0
|
1522 for(var key in params) {
|
|
ferencd@0
|
1523 if(params.hasOwnProperty(key)) {
|
|
ferencd@0
|
1524 console.log(key, params[key]);
|
|
ferencd@0
|
1525
|
|
ferencd@0
|
1526 var hiddenField = document.createElement("input");
|
|
ferencd@0
|
1527 hiddenField.setAttribute("type", "hidden");
|
|
ferencd@0
|
1528 hiddenField.setAttribute("name", key);
|
|
ferencd@0
|
1529 hiddenField.setAttribute("value", params[key]);
|
|
ferencd@0
|
1530
|
|
ferencd@0
|
1531 form.appendChild(hiddenField);
|
|
ferencd@0
|
1532 }
|
|
ferencd@0
|
1533 }
|
|
ferencd@0
|
1534
|
|
ferencd@0
|
1535 document.body.appendChild(form);
|
|
ferencd@0
|
1536 form.submit();
|
|
ferencd@0
|
1537 }
|
|
ferencd@0
|
1538
|
|
ferencd@0
|
1539 function go_next_level()
|
|
ferencd@0
|
1540 {
|
|
ferencd@0
|
1541 var gid = document.getElementById('gid').value;
|
|
ferencd@0
|
1542 post(window.location.href, {gid: gid});
|
|
ferencd@0
|
1543 }
|
|
ferencd@0
|
1544
|
|
ferencd@0
|
1545 function show_menu()
|
|
ferencd@0
|
1546 {
|
|
ferencd@0
|
1547 document.getElementById("messages").style.visibility = 'visible';
|
|
ferencd@0
|
1548 document.getElementById("messages").style.display = 'block';
|
|
ferencd@0
|
1549 document.getElementById("sysmenu").style.visibility = 'visible';
|
|
ferencd@0
|
1550 document.getElementById("sysmenu").style.display = 'block';
|
|
ferencd@0
|
1551
|
|
ferencd@0
|
1552 document.getElementById("goimg").src = "/img/dungeonslogo.png";
|
|
ferencd@0
|
1553 }
|
|
ferencd@0
|
1554
|
|
ferencd@0
|
1555 document.addEventListener('touchstart', handleTouchStart, false);
|
|
ferencd@0
|
1556 document.addEventListener('touchmove', handleTouchMove, false);
|
|
ferencd@0
|
1557
|
|
ferencd@0
|
1558 var xDown = null;
|
|
ferencd@0
|
1559 var yDown = null;
|
|
ferencd@0
|
1560
|
|
ferencd@0
|
1561 function handleTouchStart(evt) {
|
|
ferencd@0
|
1562 xDown = evt.touches[0].clientX;
|
|
ferencd@0
|
1563 yDown = evt.touches[0].clientY;
|
|
ferencd@0
|
1564 };
|
|
ferencd@0
|
1565
|
|
ferencd@0
|
1566 function handleTouchMove(evt) {
|
|
ferencd@0
|
1567 if ( ! xDown || ! yDown ) {
|
|
ferencd@0
|
1568 return;
|
|
ferencd@0
|
1569 }
|
|
ferencd@0
|
1570
|
|
ferencd@0
|
1571 var xUp = evt.touches[0].clientX;
|
|
ferencd@0
|
1572 var yUp = evt.touches[0].clientY;
|
|
ferencd@0
|
1573
|
|
ferencd@0
|
1574 var xDiff = xDown - xUp;
|
|
ferencd@0
|
1575 var yDiff = yDown - yUp;
|
|
ferencd@0
|
1576
|
|
ferencd@0
|
1577 if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {/*most significant*/
|
|
ferencd@0
|
1578 if ( xDiff > 0 ) {
|
|
ferencd@0
|
1579 step(MOVE_IDX_LEFT, -1, 0);
|
|
ferencd@0
|
1580 } else {
|
|
ferencd@0
|
1581 step(MOVE_IDX_RIGHT, 1, 0);
|
|
ferencd@0
|
1582 }
|
|
ferencd@0
|
1583 } else {
|
|
ferencd@0
|
1584 if ( yDiff > 0 ) {
|
|
ferencd@0
|
1585 step(MOVE_IDX_UP, 0, -1);
|
|
ferencd@0
|
1586 } else {
|
|
ferencd@0
|
1587 step(MOVE_IDX_DOWN, 0, 1);
|
|
ferencd@0
|
1588 }
|
|
ferencd@0
|
1589 }
|
|
ferencd@0
|
1590 /* reset values */
|
|
ferencd@0
|
1591 xDown = null;
|
|
ferencd@0
|
1592 yDown = null;
|
|
ferencd@0
|
1593 };
|