A collection of games I worked on in high school.
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};