var draw = function() { //guarantee a different card from the one you just had var prevcard = heldcard; do { heldcard = Math.floor(51 * Math.random()); } while (heldcard == prevcard); //set number and suit now, saving calculations later number = heldcard % 13; suit = Math.floor(heldcard / 13); //THWIP! sound_thwip.play(); update_hud(); }; var update_hud = function() { $("#numui").setAnimation(deck[number]); if (deckupgrades[heldcard] == 1) { $("#sealui").show(); } else { $("#sealui").hide(); } $("#suitui").setAnimation(suits[suit]); }; var fire = function() { //firing animation and reset $("#playerspr").setAnimation(playeranim["throw"], function(){ $("#playerspr").setAnimation(playeranim["person"]); }); if (deckupgrades[heldcard] === 0) { spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); } else { switch (number) { case 2: 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); 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); break; case 3: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 15, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 15, DEFAULT_CARD_SPEED); break; case 4: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); delayed_shots.push({st:suit, delay:FOUR_TIME, dirmod:0}); delayed_shots.push({st:suit, delay:2*FOUR_TIME, dirmod:0}); delayed_shots.push({st:suit, delay:3*FOUR_TIME, dirmod:0}); break; case 5: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 144, DEFAULT_CARD_SPEED, 5); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 72, DEFAULT_CARD_SPEED, 5); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 5); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 72, DEFAULT_CARD_SPEED, 5); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 144, DEFAULT_CARD_SPEED, 5); break; case 6: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 6); break; case 7: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 90, DEFAULT_CARD_SPEED, 7); break; case 8: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 45, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 90, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 135, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 180, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 225, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 270, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 315, DEFAULT_CARD_SPEED); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:10}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:55}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:100}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:145}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:190}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:235}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:280}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:325}); break; case 9: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing - 15, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED); spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing + 15, DEFAULT_CARD_SPEED); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:-15}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:0}); delayed_shots.push({st:suit, delay:NINE_TIME, dirmod:15}); delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:-15}); delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:0}); delayed_shots.push({st:suit, delay:2*NINE_TIME, dirmod:15}); break; case 10: spawn_card(PLAYER_POSX - 16, PLAYER_POSY - 16, suit, facing, DEFAULT_CARD_SPEED, 10); break; case 11: break; case 12: break; case 0: break; case 1: //for (var a = 0; a < 36; a++) { // delayed_shots.push({st:suit, delay:a, dirmod:10*a}); // delayed_shots.push({st:suit, delay:a, dirmod:10*a + 180}); //} break; default: console.log("invalid card number"); } } draw(); }; var spawn_card = function(x, y, suit, dir, spd, opt) { var option = 0; if (arguments.length == 6) option = opt; var name = "card" + get_uid(); $("#cards").addSprite(name, { animation: proj["card"], posx: x, posy: y, width: 32, height: 32 }); $("#"+name).addClass("thrown_card"); $("#"+name)[0].thrown_card = new thrown_card(suit, dir, spd, option); }; var thrown_card = function(st, dir, spd, opt) { this.suit = st; this.direction = dir; this.speed = spd; this.age = 0; this.pierce = false; this.option = opt; }; var spawn_fx = function(st, x, y) { var name = "fx" + get_uid(); $("#cards").addSprite(name, {width: 32, height: 32, posx: x, posy: y }); $("#"+name).addClass("doodad"); $("#"+name).setAnimation(proj[st], function(doop){ $(doop).remove(); }); }; var generate = function(direction) { var x, y; var spawn_size; generate_num += 1; var seed = Math.random(); if (seed < 0.3) { //choose rock or dirt! spawn_size = 64; } else if (seed < 0.5) { //choose tree! spawn_size = 96; } else if (seed < 0.61) { //choose dirt patch or enemy camp! spawn_size = 256; } else if (seed < 0.66 && generate_num > 30) { //choose shrine! spawn_size = 128; generate_num = 0; } else { return; } //things spawn a distance away based on their size //they spawn no closer than with their nearest edge flush with the outside edge of the window //and no farther than one "size" away. if (direction == "left") { x = -spawn_size - spawn_size * Math.random(); y = (WINDOW_HEIGHT - spawn_size) * Math.random(); } if (direction == "right") { x = WINDOW_WIDTH + spawn_size * Math.random(); y = (WINDOW_HEIGHT - spawn_size) * Math.random(); } if (direction == "up") { x = (WINDOW_WIDTH - spawn_size) * Math.random(); y = -spawn_size - spawn_size * Math.random(); } if (direction == "down") { x = (WINDOW_WIDTH - spawn_size) * Math.random(); y = WINDOW_HEIGHT + spawn_size * Math.random(); } switch (spawn_size) { case 64: if (seed < 0.15) { spawn_dirt(x,y); } else { spawn_rock(x,y); } break; case 96: spawn_tree(x,y); break; case 256: if (seed < 0.58) { spawn_enemy_camp(x,y); } else { spawn_dirtpatch(x,y); } break; case 128: spawn_shrine(x,y); break; default: //do nothing } }; var spawn_dirt = function(x, y) { var name = "dirt" + get_uid(); $("#background").addSprite(name, { animation: enviro["dirt"], posx: x, posy: y, width: 64, height: 64 }); $("#"+name).addClass("doodad"); }; var spawn_rock = function(x, y) { var name = "rock" + get_uid(); $("#terrain").addSprite(name, { animation: enviro["rock"], posx: x, posy: y, width: 64, height: 64 }); $("#"+name).addClass("doodad solid"); }; var spawn_tree = function(x, y) { var name = "tree" + uid; uid += 1; if (uid > 1000) uid = 0; $("#terrain").addSprite(name, { animation: enviro["tree"], posx: x, posy: y, width: 96, height: 96 }); $("#"+name).addClass("doodad solid"); }; var spawn_dirtpatch = function(x, y) { var name = "patch" + uid; uid += 1; if (uid > 1000) uid = 0; $("#background").addSprite(name, { animation: enviro["dirtpatch"], posx: x, posy: y, width: 256, height: 256 }); $("#"+name).addClass("doodad"); }; var spawn_shrine = function(x, y) { var name = "shrine" + get_uid(); $("#terrain").addSprite(name, { animation: enviro["shrine"], posx: x, posy: y, width: 128, height: 128 }); $("#"+name).addClass("doodad"); //remove all colliding solids $("#"+name).collision("#terrain, .solid").each( function(){ $(this).remove(); console.log("obstacle removed!"); }); //spawn walls name = "shrinewall" + get_uid(); $("#terrain").addSprite(name, {posx: x, posy: y, width: 16, height: 128}); $("#"+name).addClass("doodad solid"); name = "shrinewall" + get_uid(); $("#terrain").addSprite(name, {posx: x + 112, posy: y, width: 16, height: 128}); $("#"+name).addClass("doodad solid"); //spawn upgrade name = "shrineup" + get_uid(); $("#terrain").addSprite(name, {animation: deck["seal"], posx: x, posy: y, width: 128, height: 128}); $("#"+name).addClass("doodad upgrade"); }; var spawn_enemy_camp = function(x, y) { var points_remaining = 0; var num_total = 0; var num_kings = 0; var num_queens = 0; var num_rooks = 0; var num_bishops = 0; var num_knights = 0; var num_pawns = 0; function randomadd() { return Math.round(Math.random() * 40 - 20); } switch (true) { case totalupgrades <= 10: points_remaining = 4 + Math.round(Math.random()); //4-5 points break; case totalupgrades <= 20: points_remaining = 10 + Math.round(2 * Math.random()); //10-12 points break; case totalupgrades <= 30: points_remaining = 10 + Math.round(12 * Math.random()); //10-22 points break; case totalupgrades <= 40: points_remaining = 10 + Math.round(26 * Math.random()); //10-36 points break; default: console.log("error! totalupgrades value" + totalupgrades + "not recognized!"); } console.log("point value: " + points_remaining); var counter = 0; while (points_remaining > 0) { counter++; if (counter > 1000) break; //unlike the one below, this break is not necessarily an error. rand = Math.random(); switch (true) { case rand <= 0.05: if (num_kings >= KING_LIMIT || points_remaining < KING_COST) continue; num_kings++; num_total++; points_remaining -= KING_COST; break; case rand <= 0.10: if (num_queens >= QUEEN_LIMIT || points_remaining < QUEEN_COST) continue; num_queens++; num_total++; points_remaining -= QUEEN_COST; break; case rand <= 0.25: if (num_rooks >= ROOK_LIMIT || points_remaining < ROOK_COST) continue; num_rooks++; num_total++; points_remaining -= ROOK_COST; break; case rand <= 0.45: if (num_bishops >= BISHOP_LIMIT || points_remaining < BISHOP_COST) continue; num_bishops++; num_total++; points_remaining -= BISHOP_COST; break; case rand <= 0.65: if (num_knights >= KNIGHT_LIMIT || points_remaining < KNIGHT_COST) continue; num_knights++; num_total++; points_remaining -= KNIGHT_COST; break; default: if (num_pawns >= PAWN_LIMIT || points_remaining < PAWN_COST) continue; num_pawns++; num_total++; points_remaining -= PAWN_COST; } } counter = 0; while (num_total > 0) { counter++; if (counter > 1000) { console.log("spawn count desync error! check num_total vs other num_'s"); break; } if (num_kings > 0) { spawn_enemy("king", x + 128 + randomadd(), y + 128 + randomadd()); num_kings--; num_total--; continue; } if (num_queens > 0) { spawn_enemy("queen", x + 128 + randomadd(), y + 128 + randomadd()); num_queens--; num_total--; continue; } if (num_rooks > 0) { spawn_enemy("rook", x + 128 + randomadd(), y + 128 + randomadd()); num_rooks--; num_total--; continue; } if (num_bishops > 0) { spawn_enemy("bishop", x + 128 + randomadd(), y + 128 + randomadd()); num_bishops--; num_total--; continue; } if (num_knights > 0) { spawn_enemy("knight", x + 128 + randomadd(), y + 128 + randomadd()); num_knights--; num_total--; continue; } if (num_pawns > 0) { spawn_enemy("pawn", x + 128 + randomadd(), y + 128 + randomadd()); num_pawns--; num_total--; continue; } } }; //enemy stats var pawn = { "health": 3, "damage": 5 }; var knight = { "health": 5, "damage": 10 }; var bishop = { "health": 5, "damage": 10 }; var rook = { "health": 10, "damage": 15 }; var queen = { "health": 20, "damage": 10 }; var king = { "health": 30, "damage": 0 }; //stats object var enemystats = { "pawn": pawn, "rook": rook, "knight": knight, "bishop": bishop, "queen": queen, "king": king, }; //object containing useful parts spawned enemy var spawned = {}; var spawn_enemy = function(piecetype, x, y) { var name = "piece" + get_uid(); var piecetypecolor; if (Math.random() < 0.5) { piecetypecolor = piecetype + "w"; } else { piecetypecolor = piecetype + "b"; } var anim = get_chess_anim(piecetypecolor); $("#enemies").addSprite(name, { animation: anim, posx: x, posy: y, width: 96, height: 96 }); $("#" + name).addClass("enemy " + piecetype); var newEnemy = new enemy(piecetype, x, y, name); $("#" + name)[0].enemy = newEnemy; //adds pertinant enemy stuff to the spawned object which is appended to the newenemies array 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}; newenemies.push(spawned); }; var enemy = function(enemyname, x, y, name) { console.log(enemyname + " initialized!"); this.name = name; this.type = enemyname; this.health = enemystats[enemyname].health; this.damage = enemystats[enemyname].damage; this.status = 0; this.state = "moving"; this.colliding = false; this.curr = [x, y]; this.next = [x, y]; }; var get_uid = function() { uid += 1; if (uid > 999) uid = 0; return uid; };