annotate game.js @ 0:1eef88068f9f tip

initial commit of maze game source
author ferencd
date Sun, 15 Sep 2019 11:46:47 +0200
parents
children
rev   line source
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 " + "&nbsp;";
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 + "&nbsp;</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 };