A collection of games I worked on in high school.
at main 485 lines 17 kB view raw
1var draw = function() { 2 3 //guarantee a different card from the one you just had 4 var prevcard = heldcard; 5 do { 6 heldcard = Math.floor(51 * Math.random()); 7 } while (heldcard == prevcard); 8 9 //set number and suit now, saving calculations later 10 number = heldcard % 13; 11 suit = Math.floor(heldcard / 13); 12 13 //THWIP! 14 sound_thwip.play(); 15 16 update_hud(); 17 18}; 19 20var update_hud = function() { 21 $("#numui").setAnimation(deck[number]); 22 if (deckupgrades[heldcard] == 1) { 23 $("#sealui").show(); 24 } else { 25 $("#sealui").hide(); 26 } 27 $("#suitui").setAnimation(suits[suit]); 28}; 29 30var fire = function() { 31 32 //firing animation and reset 33 $("#playerspr").setAnimation(playeranim["throw"], function(){ 34 $("#playerspr").setAnimation(playeranim["person"]); 35 }); 36 37 if (deckupgrades[heldcard] === 0) { 38 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); 39 } else { 40 switch (number) { 41 case 2: 42 spawn_card(PLAYER_POSX - 16 + 16 * Math.cos((Math.PI/180)*(facing - 90)), PLAYER_POSY - 16 + 16 * Math.sin((Math.PI/180)*(facing - 90)), suit, facing, DEFAULT_CARD_SPEED); 43 spawn_card(PLAYER_POSX - 16 + 16 * Math.cos((Math.PI/180)*(facing + 90)), PLAYER_POSY - 16 + 16 * Math.sin((Math.PI/180)*(facing + 90)), suit, facing, DEFAULT_CARD_SPEED); 44 break; 45 case 3: 46 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 15, DEFAULT_CARD_SPEED); 47 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); 48 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 15, DEFAULT_CARD_SPEED); 49 break; 50 case 4: 51 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); 52 delayed_shots.push({st:suit, delay:FOUR_TIME, dirmod:0}); 53 delayed_shots.push({st:suit, delay:2*FOUR_TIME, dirmod:0}); 54 delayed_shots.push({st:suit, delay:3*FOUR_TIME, dirmod:0}); 55 break; 56 case 5: 57 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 144, DEFAULT_CARD_SPEED, 5); 58 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 72, DEFAULT_CARD_SPEED, 5); 59 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 5); 60 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 72, DEFAULT_CARD_SPEED, 5); 61 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 144, DEFAULT_CARD_SPEED, 5); 62 break; 63 case 6: 64 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 6); 65 break; 66 case 7: 67 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 90, DEFAULT_CARD_SPEED, 7); 68 break; 69 case 8: 70 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); 71 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 45, DEFAULT_CARD_SPEED); 72 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 90, DEFAULT_CARD_SPEED); 73 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 135, DEFAULT_CARD_SPEED); 74 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 180, DEFAULT_CARD_SPEED); 75 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 225, DEFAULT_CARD_SPEED); 76 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 270, DEFAULT_CARD_SPEED); 77 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 315, DEFAULT_CARD_SPEED); 78 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:10}); 79 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:55}); 80 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:100}); 81 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:145}); 82 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:190}); 83 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:235}); 84 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:280}); 85 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:325}); 86 break; 87 case 9: 88 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 15, DEFAULT_CARD_SPEED); 89 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); 90 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 15, DEFAULT_CARD_SPEED); 91 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:-15}); 92 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:0}); 93 delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:15}); 94 delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:-15}); 95 delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:0}); 96 delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:15}); 97 break; 98 case 10: 99 spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 10); 100 break; 101 case 11: 102 break; 103 case 12: 104 break; 105 case 0: 106 break; 107 case 1: 108 //for (var a = 0; a < 36; a++) { 109 // delayed_shots.push({st:suit, delay:a, dirmod:10*a}); 110 // delayed_shots.push({st:suit, delay:a, dirmod:10*a + 180}); 111 //} 112 break; 113 default: 114 console.log("invalid card number"); 115 } 116 } 117 118 draw(); 119}; 120 121var spawn_card = function(x, y, suit, dir, spd, opt) { 122 var option = 0; 123 if (arguments.length == 6) option = opt; 124 var name = "card" + get_uid(); 125 $("#cards").addSprite(name, { 126 animation: proj["card"], 127 posx: x, 128 posy: y, 129 width: 32, 130 height: 32 131 }); 132 $("#"+name).addClass("thrown_card"); 133 $("#"+name)[0].thrown_card = new thrown_card(suit, dir, spd, option); 134}; 135 136var thrown_card = function(st, dir, spd, opt) { 137 this.suit = st; 138 this.direction = dir; 139 this.speed = spd; 140 this.age = 0; 141 this.pierce = false; 142 this.option = opt; 143}; 144 145var spawn_fx = function(st, x, y) { 146 var name = "fx" + get_uid(); 147 $("#cards").addSprite(name, {width: 32, height: 32, posx: x, posy: y }); 148 $("#"+name).addClass("doodad"); 149 $("#"+name).setAnimation(proj[st], function(doop){ 150 $(doop).remove(); 151 }); 152}; 153 154var generate = function(direction) { 155 156 var x, y; 157 var spawn_size; 158 159 generate_num += 1; 160 161 var seed = Math.random(); 162 163 if (seed < 0.3) { //choose rock or dirt! 164 spawn_size = 64; 165 } else if (seed < 0.5) { //choose tree! 166 spawn_size = 96; 167 } else if (seed < 0.61) { //choose dirt patch or enemy camp! 168 spawn_size = 256; 169 } else if (seed < 0.66 && generate_num > 30) { //choose shrine! 170 spawn_size = 128; 171 generate_num = 0; 172 } else { 173 return; 174 } 175 176 //things spawn a distance away based on their size 177 //they spawn no closer than with their nearest edge flush with the outside edge of the window 178 //and no farther than one "size" away. 179 180 if (direction == "left") { 181 x = -spawn_size - spawn_size * Math.random(); 182 y = (WINDOW_HEIGHT - spawn_size) * Math.random(); 183 } 184 if (direction == "right") { 185 x = WINDOW_WIDTH + spawn_size * Math.random(); 186 y = (WINDOW_HEIGHT - spawn_size) * Math.random(); 187 } 188 if (direction == "up") { 189 x = (WINDOW_WIDTH - spawn_size) * Math.random(); 190 y = -spawn_size - spawn_size * Math.random(); 191 } 192 if (direction == "down") { 193 x = (WINDOW_WIDTH - spawn_size) * Math.random(); 194 y = WINDOW_HEIGHT + spawn_size * Math.random(); 195 } 196 switch (spawn_size) { 197 case 64: 198 if (seed < 0.15) { 199 spawn_dirt(x,y); 200 } else { 201 spawn_rock(x,y); 202 } 203 break; 204 case 96: 205 spawn_tree(x,y); 206 break; 207 case 256: 208 if (seed < 0.58) { 209 spawn_enemy_camp(x,y); 210 } else { 211 spawn_dirtpatch(x,y); 212 } 213 break; 214 case 128: 215 spawn_shrine(x,y); 216 break; 217 default: 218 //do nothing 219 } 220 221}; 222 223var spawn_dirt = function(x, y) { 224 var name = "dirt" + get_uid(); 225 $("#background").addSprite(name, { 226 animation: enviro["dirt"], 227 posx: x, 228 posy: y, 229 width: 64, 230 height: 64 231 }); 232 $("#"+name).addClass("doodad"); 233}; 234 235var spawn_rock = function(x, y) { 236 var name = "rock" + get_uid(); 237 $("#terrain").addSprite(name, { 238 animation: enviro["rock"], 239 posx: x, 240 posy: y, 241 width: 64, 242 height: 64 243 }); 244 $("#"+name).addClass("doodad solid"); 245}; 246 247var spawn_tree = function(x, y) { 248 var name = "tree" + uid; 249 uid += 1; 250 if (uid > 1000) uid = 0; 251 $("#terrain").addSprite(name, { 252 animation: enviro["tree"], 253 posx: x, 254 posy: y, 255 width: 96, 256 height: 96 257 }); 258 $("#"+name).addClass("doodad solid"); 259 260}; 261 262var spawn_dirtpatch = function(x, y) { 263 var name = "patch" + uid; 264 uid += 1; 265 if (uid > 1000) uid = 0; 266 $("#background").addSprite(name, { 267 animation: enviro["dirtpatch"], 268 posx: x, 269 posy: y, 270 width: 256, 271 height: 256 272 }); 273 $("#"+name).addClass("doodad"); 274}; 275 276var spawn_shrine = function(x, y) { 277 var name = "shrine" + get_uid(); 278 $("#terrain").addSprite(name, { 279 animation: enviro["shrine"], 280 posx: x, 281 posy: y, 282 width: 128, 283 height: 128 284 }); 285 $("#"+name).addClass("doodad"); 286 287 //remove all colliding solids 288 $("#"+name).collision("#terrain, .solid").each( function(){ 289 $(this).remove(); 290 console.log("obstacle removed!"); 291 }); 292 293 //spawn walls 294 name = "shrinewall" + get_uid(); 295 $("#terrain").addSprite(name, {posx: x, posy: y, width: 16, height: 128}); 296 $("#"+name).addClass("doodad solid"); 297 name = "shrinewall" + get_uid(); 298 $("#terrain").addSprite(name, {posx: x + 112, posy: y, width: 16, height: 128}); 299 $("#"+name).addClass("doodad solid"); 300 301 //spawn upgrade 302 name = "shrineup" + get_uid(); 303 $("#terrain").addSprite(name, {animation: deck["seal"], posx: x, posy: y, width: 128, height: 128}); 304 $("#"+name).addClass("doodad upgrade"); 305 306}; 307 308var spawn_enemy_camp = function(x, y) { 309 var points_remaining = 0; 310 var num_total = 0; 311 var num_kings = 0; 312 var num_queens = 0; 313 var num_rooks = 0; 314 var num_bishops = 0; 315 var num_knights = 0; 316 var num_pawns = 0; 317 function randomadd() { 318 return Math.round(Math.random() * 40 - 20); 319 } 320 switch (true) { 321 case totalupgrades <= 10: 322 points_remaining = 4 + Math.round(Math.random()); //4-5 points 323 break; 324 case totalupgrades <= 20: 325 points_remaining = 10 + Math.round(2 * Math.random()); //10-12 points 326 break; 327 case totalupgrades <= 30: 328 points_remaining = 10 + Math.round(12 * Math.random()); //10-22 points 329 break; 330 case totalupgrades <= 40: 331 points_remaining = 10 + Math.round(26 * Math.random()); //10-36 points 332 break; 333 default: 334 console.log("error! totalupgrades value" + totalupgrades + "not recognized!"); 335 } 336 console.log("point value: " + points_remaining); 337 var counter = 0; 338 while (points_remaining > 0) { 339 counter++; 340 if (counter > 1000) break; //unlike the one below, this break is not necessarily an error. 341 rand = Math.random(); 342 switch (true) { 343 case rand <= 0.05: 344 if (num_kings >= KING_LIMIT || points_remaining < KING_COST) continue; 345 num_kings++; 346 num_total++; 347 points_remaining -= KING_COST; 348 break; 349 case rand <= 0.10: 350 if (num_queens >= QUEEN_LIMIT || points_remaining < QUEEN_COST) continue; 351 num_queens++; 352 num_total++; 353 points_remaining -= QUEEN_COST; 354 break; 355 case rand <= 0.25: 356 if (num_rooks >= ROOK_LIMIT || points_remaining < ROOK_COST) continue; 357 num_rooks++; 358 num_total++; 359 points_remaining -= ROOK_COST; 360 break; 361 case rand <= 0.45: 362 if (num_bishops >= BISHOP_LIMIT || points_remaining < BISHOP_COST) continue; 363 num_bishops++; 364 num_total++; 365 points_remaining -= BISHOP_COST; 366 break; 367 case rand <= 0.65: 368 if (num_knights >= KNIGHT_LIMIT || points_remaining < KNIGHT_COST) continue; 369 num_knights++; 370 num_total++; 371 points_remaining -= KNIGHT_COST; 372 break; 373 default: 374 if (num_pawns >= PAWN_LIMIT || points_remaining < PAWN_COST) continue; 375 num_pawns++; 376 num_total++; 377 points_remaining -= PAWN_COST; 378 } 379 380 } 381 counter = 0; 382 while (num_total > 0) { 383 counter++; 384 if (counter > 1000) { 385 console.log("spawn count desync error! check num_total vs other num_'s"); 386 break; 387 } 388 if (num_kings > 0) { 389 spawn_enemy("king", x + 128 + randomadd(), y + 128 + randomadd()); 390 num_kings--; 391 num_total--; 392 continue; 393 } 394 if (num_queens > 0) { 395 spawn_enemy("queen", x + 128 + randomadd(), y + 128 + randomadd()); 396 num_queens--; 397 num_total--; 398 continue; 399 } 400 if (num_rooks > 0) { 401 spawn_enemy("rook", x + 128 + randomadd(), y + 128 + randomadd()); 402 num_rooks--; 403 num_total--; 404 continue; 405 } 406 if (num_bishops > 0) { 407 spawn_enemy("bishop", x + 128 + randomadd(), y + 128 + randomadd()); 408 num_bishops--; 409 num_total--; 410 continue; 411 } 412 if (num_knights > 0) { 413 spawn_enemy("knight", x + 128 + randomadd(), y + 128 + randomadd()); 414 num_knights--; 415 num_total--; 416 continue; 417 } 418 if (num_pawns > 0) { 419 spawn_enemy("pawn", x + 128 + randomadd(), y + 128 + randomadd()); 420 num_pawns--; 421 num_total--; 422 continue; 423 } 424 } 425}; 426 427//enemy stats 428var pawn = { "health": 3, "damage": 5 }; 429var knight = { "health": 5, "damage": 10 }; 430var bishop = { "health": 5, "damage": 10 }; 431var rook = { "health": 10, "damage": 15 }; 432var queen = { "health": 20, "damage": 10 }; 433var king = { "health": 30, "damage": 0 }; 434 435//stats object 436var enemystats = { "pawn": pawn, "rook": rook, "knight": knight, "bishop": bishop, "queen": queen, "king": king, }; 437 438//object containing useful parts spawned enemy 439var spawned = {}; 440 441var spawn_enemy = function(piecetype, x, y) { 442 var name = "piece" + get_uid(); 443 var piecetypecolor; 444 if (Math.random() < 0.5) { 445 piecetypecolor = piecetype + "w"; 446 } else { 447 piecetypecolor = piecetype + "b"; 448 } 449 var anim = get_chess_anim(piecetypecolor); 450 $("#enemies").addSprite(name, { 451 animation: anim, 452 posx: x, 453 posy: y, 454 width: 96, 455 height: 96 456 }); 457 458 $("#" + name).addClass("enemy " + piecetype); 459 var newEnemy = new enemy(piecetype, x, y, name); 460 $("#" + name)[0].enemy = newEnemy; 461 462 //adds pertinant enemy stuff to the spawned object which is appended to the newenemies array 463 spawned = { "x": x, "y": y, "curr": newEnemy.curr, "color": piecetypecolor.slice(-1), "type": "knight"/*piecetype*/, "id": name, "touchingcount": 0, "touching": false, "touchingmax": 15+Math.random()*10}; 464 newenemies.push(spawned); 465}; 466 467var enemy = function(enemyname, x, y, name) { 468 console.log(enemyname + " initialized!"); 469 this.name = name; 470 this.type = enemyname; 471 this.health = enemystats[enemyname].health; 472 this.damage = enemystats[enemyname].damage; 473 this.status = 0; 474 this.state = "moving"; 475 this.colliding = false; 476 this.curr = [x, y]; 477 this.next = [x, y]; 478}; 479 480 481var get_uid = function() { 482 uid += 1; 483 if (uid > 999) uid = 0; 484 return uid; 485};