Version 1.0

Beta release for Coolest Projects. New powers, new enemy, AI upgrades,
new levels, added win screen, new sounds, support for boss but I didn't
add him. New score bubbles, added lives with death message and life item
pickup. Many other small changes and additions.
This commit is contained in:
Markus Scully 2013-08-30 23:03:13 +01:00
parent ac2eb87d2f
commit 0bd093f1b2
15 changed files with 441 additions and 78 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 743 B

Before After
Before After

BIN
fail.wav Normal file

Binary file not shown.

BIN
game_over.wav Normal file

Binary file not shown.

BIN
items.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 865 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

BIN
jump_down.wav Normal file

Binary file not shown.

BIN
jump_up.wav Normal file

Binary file not shown.

BIN
jump_up2.wav Normal file

Binary file not shown.

165
level.js
View file

@ -508,6 +508,52 @@ function defineLevels(){
,'###################' ,'###################'
,'5n', '5n', 2, 15, 10 ,'5n', '5n', 2, 15, 10
], ],
[
'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'..####.............'
,'..####......0..####'
,'..####.....########'
,'######.....########'
,'######.2.2.########'
,'###################'
,'###################'
,'###################'
,'5n', '7n', 2, 6, 10
],
[
'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'..............1....'
,'..........E.#####..'
,'.........########..'
,'...00.#########....'
,'###############....'
,'###############.3..'
,'###################'
,'###################'
,'###################'
,'###################'
,'###################'
,'7n', '5n', 2, 6, 8
],
[ [
'......................................' '......................................'
,'......................................' ,'......................................'
@ -537,7 +583,7 @@ function defineLevels(){
,'......................................' ,'......................................'
,'......................................' ,'......................................'
,'.......................H..............' ,'.......................H..............'
,'......................###............' ,'......................###.............'
,'......................###.............' ,'......................###.............'
,'......................###...2.........' ,'......................###...2.........'
,'......................###########.....' ,'......................###########.....'
@ -564,7 +610,7 @@ function defineLevels(){
,'...................' ,'...................'
,'...................' ,'...................'
,'...0...............' ,'...0...............'
,'.#####..............' ,'.#####.............'
,'.#####.............' ,'.#####.............'
,'...................' ,'...................'
,'..........###......' ,'..........###......'
@ -577,6 +623,53 @@ function defineLevels(){
,'###################' ,'###################'
,'5jl11', '5n', 2, 15, 5 ,'5jl11', '5n', 2, 15, 5
], ],
[
'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'..............E....'
,'.............#####.'
,'..........########.'
,'.0..##....########.'
,'#######...#########'
,'#######.......#####'
,'#######.E...L.#####'
,'###################'
,'###################'
,'5n', '5n', 1, 5, 15
],
[
'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'...................'
,'................H..'
,'...............###.'
,'...................'
,'...................'
,'######.............'
,'######.............'
,'######.............'
,'##.................'
,'##.E...........E2..'
,'#######...#########'
,'#######...#########'
,'#######.5.##########'
,'###################'
,'###################'
,'10n', '5n', 1, 5, 40
]
]; ];
levelends = [ levelends = [
[ [
@ -644,6 +737,72 @@ function defineLevels(){
,'##################################################################' ,'##################################################################'
,'##################################################################' ,'##################################################################'
,'##################################################################' ,'##################################################################'
],
[
'.........................................................................'
,'.........................................................................'
,'......................................................................###'
,'......................................................................###'
,'......................................................................###'
,'.........................................................E..2.2.3.E.3H###'
,'.......................................................##################'
,'.......................................................##################'
,'.......................E.1..E...........0.E.0.......2E.##################'
,'...................1E.########..........#####......#######............###'
,'..................############..........#####......#######............###'
,'.......2H.........############..........#####1.....#######......1.....###'
,'......####........#######...............#######................###....###'
,'......####............................0.#######................###....###'
,'......####.......E......E.....E......##########...1..E.......E.###FFFF###'
,'#########################################################################'
,'#########################################################################'
,'#########################################################################'
,'#########################################################################'
,'#########################################################################'
],
[
'.........................................................................'
,'.........................................................................'
,'......................................................................###'
,'......................................................................###'
,'......................................................................###'
,'.................................................2........4..FFFFFFFFF###'
,'................................................####....################'
,'................................................####....#################'
,'................................................####..................###'
,'................................................####.E.0.0.0..........###'
,'................................................#############.........###'
,'...HH................................E.2........#############......3.E###'
,'...#####...........................######.........................#######'
,'...##..............................######.........................#######'
,'...##.H...2..E...E...3..E.....E..2.######.........2..E...3...E....#######'
,'#########################################...#############################'
,'#########################################.L.#############################'
,'#########################################################################'
,'#########################################################################'
,'#########################################################################'
],
[
'..................................................................'
,'..................................................................'
,'...............................................................###'
,'...............................................................###'
,'...............................................................###'
,'...............................................................###'
,'....................E.............E............................###'
,'....#####................E.................E............4.E..4.###'
,'....#####......E..........................###........#############'
,'..#######........E.............E..........###........#############'
,'..#######.................E.............#####.1......#############'
,'..#######...E...........E........E......########............FFF###'
,'#########...............................########............FFF###'
,'#########......E.....E................##########..5....2..2.FFF###'
,'#########......3......4......3........############################'
,'##################################################################'
,'##################################################################'
,'##################################################################'
,'##################################################################'
,'##################################################################'
] ]
]; ];
} }

BIN
level_completed.wav Normal file

Binary file not shown.

BIN
point_score.wav Normal file

Binary file not shown.

BIN
point_score_2.wav Normal file

Binary file not shown.

BIN
shoot.wav Normal file

Binary file not shown.

BIN
shoot_2.wav Normal file

Binary file not shown.

BIN
shoot_3.wav Normal file

Binary file not shown.

354
sint.js
View file

@ -86,16 +86,17 @@ function reset(){
keysDown = []; keysDown = [];
test = []; test = [];
level = ['','','','','','','','','','','','','','','','','','','','']; level = ['','','','','','','','','','','','','','','','','','','',''];
lvDis = [0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8]; lvDis = [0, 0, 1, 1, 1, 2, 2];
upgrades = { upgrades = {
health: [300, 500, 800, 1200, 1700, 2300, 3000], health: [300, 500, 800, 1200, 1700, 2300, 3000],
energy: [200, 350, 600, 1000, 1500, 2000, 2600], energy: [200, 350, 600, 1000, 1500, 2000, 2600],
powers: [400, 800, 1500, 2500, 4000, 6500, 10000], powers: [400, 800, 1500, 2500, 4000/*, 6500, 10000*/],
healthOn: 0, healthOn: 0,
energyOn: 0 energyOn: 0
} }
unlockKey = [0, 3, 5, 8, 11, 13, 15, 17, 20]; unlockKey = [0, 3, 5, 8, 11, 13, 15, 17, 20];
score = 0; score = 0;
lives = 3;
record = [false, false, false]; record = [false, false, false];
partsInserted = []; partsInserted = [];
cookies = false; cookies = false;
@ -133,9 +134,16 @@ function reset(){
finTime = false; finTime = false;
sound = { sound = {
shoot1: new Audio('sfx2.wav'), shoot1: new Audio('sfx2.wav'),
shoot2: new Audio('shoot.wav'),
shoot3: new Audio('shoot_2.wav'),
shoot4: new Audio('shoot_3.wav'),
point: new Audio('point.wav'), point: new Audio('point.wav'),
point2: new Audio('point_score_2.wav'),
point3: new Audio('point_score.wav'),
explode: new Audio('explode.wav'), explode: new Audio('explode.wav'),
jump: new Audio('Funk.mp3') jump: new Audio('jump_up2.wav')
} }
music = { music = {
dash: { dash: {
@ -174,7 +182,7 @@ function reset(){
['Back', 0, true] ['Back', 0, true]
], ],
['r', 'play'], ['r', 'play'],
['t', 'Sint', '', 'Programming and graphics by Markus Scully (Asraelite)', 'Sound and music by Christian Stryczynski and Asraelite'], ['t', 'Sint', '', 'Programming and graphics by Markus Scully (Asraelite)', 'Sound by Christian Stryczynski and Asraelite'],
[ [
['"Super Awesome Carrot" by Josh', 8, 0, 'tl'], ['"Super Awesome Carrot" by Josh', 8, 0, 'tl'],
['"Duck" by Asraelite', 8, 1, 'tl'], ['"Duck" by Asraelite', 8, 1, 'tl'],
@ -230,6 +238,7 @@ function toMenu(){
ui.area = 0; ui.area = 0;
ui.select = 0; ui.select = 0;
score = 0; score = 0;
lives = 3;
tomenu = false; tomenu = false;
} }
@ -240,7 +249,8 @@ function play(){
actors[0] = new Actor(0, 0, 200, 8, 200, 3, limitLeft + 112, 64, 16, 16); actors[0] = new Actor(0, 0, 200, 8, 200, 3, limitLeft + 112, 64, 16, 16);
controllers[0] = new Controller(actors[0], [[optionvars[4], 'moveRight'], [optionvars[3], 'moveLeft'], [optionvars[2], 'jump'], [27, 'quit'], [90, 'suicide', 0], ['c', 'current'], [optionvars[5], 'next', 0], [optionvars[6], 'prev', 0]]); controllers[0] = new Controller(actors[0], [[optionvars[4], 'moveRight'], [optionvars[3], 'moveLeft'], [optionvars[2], 'jump'], [27, 'quit'], [90, 'suicide', 0], ['c', 'current'], [optionvars[5], 'next', 0], [optionvars[6], 'prev', 0]]);
particles[0] = new Particle('mouse', 0, 'mouse', 10000000000, 0, 0, 0, 0, 0, [0, 0]); // Create reticule particles[0] = new Particle('mouse', 0, 'mouse', 10000000000, 0, 0, 0, 0, 0, [0, 0]); // Create reticule]
if(cookies){ if(cookies){
setCookie('options', JSON.stringify(optionvars), 30); setCookie('options', JSON.stringify(optionvars), 30);
} }
@ -263,7 +273,7 @@ function newLevel(){
totalLevelScore = 0; totalLevelScore = 0;
totalEnemies = 0; totalEnemies = 0;
actors.splice(1, actors.length - 1); actors.splice(1, actors.length - 1);
particles.splice(1, actors.length - 1); particles.splice(1, particles.length - 1);
limitLeft = 16; limitLeft = 16;
limitRight = 1000000000; limitRight = 1000000000;
actors[0].x = limitLeft + 112; actors[0].x = limitLeft + 112;
@ -297,10 +307,21 @@ function r(num){
return Math.round(num); return Math.round(num);
} }
function spawn(no){ function spawn(no, enemy){
enemy = typeof enemy === 'undefined' ? 1 : enemy;
no = typeof no === 'undefined' ? 1 : no;
for(i = 0 ; i < no; i++){ for(i = 0 ; i < no; i++){
actors[actors.length] = new Actor(7, 1, 1, 6, 50, 3, lookx + 250 + ((Math.random() - 0.5) * 200), 0, 16, 16); var x = lookx + 250 + ((Math.random() - 0.5) * 200);
ais[ais.length] = new Ai(actors.length - 1, 'alphaBot'); switch(enemy){
case 0:
actors[actors.length] = new Actor(8, 1, 80, 5, 80, 3, x, 0, 16, 16);
ais[ais.length] = new Ai(actors.length - 1, 'pace');
break;
case 1:
actors[actors.length] = new Actor(9, 1, 100, 6, 50, 3, x, 0, 16, 16);
ais[ais.length] = new Ai(actors.length - 1, 'alphaBot');
break;
}
} }
} }
@ -426,7 +447,7 @@ function Ai(index, ai){
} }
this.run = function(){ this.run = function(){
switch(ai){ switch(ai){
case 'alphaBot': case 'alphaBot': // Basic following and jumping
var topDistance = 400; var topDistance = 400;
var distanceAway = Math.abs(actors[0].x - this.actor.x); var distanceAway = Math.abs(actors[0].x - this.actor.x);
if(distanceAway < topDistance){ if(distanceAway < topDistance){
@ -446,6 +467,12 @@ function Ai(index, ai){
if(this.aivars[0] == 0 && this.actor.energy >= this.actor.maxenergy){ if(this.aivars[0] == 0 && this.actor.energy >= this.actor.maxenergy){
this.aivars[0] = 1; this.aivars[0] = 1;
} }
try{
if((level[(this.actor.y) >> 4][((this.actor.x + 8) >> 4) + (this.aivars[0] == 0 ? 1 : -1)] != '#' && actors[0].y <= this.actor.y) || this.actor.box.inlava){
this.action('jump');
}
}catch(err){
}
var inverter = (distanceAway > this.aivars[1] ? 0 : 1); var inverter = (distanceAway > this.aivars[1] ? 0 : 1);
if(Math.abs(distanceAway - this.aivars[1]) > 20 && Math.random() < 0.9){ if(Math.abs(distanceAway - this.aivars[1]) > 20 && Math.random() < 0.9){
if(this.actor.x > actors[0].x){ if(this.actor.x > actors[0].x){
@ -464,8 +491,11 @@ function Ai(index, ai){
if(this.actor.xvel == 0){ if(this.actor.xvel == 0){
this.aivars[0] = (1 - this.aivars[0]); this.aivars[0] = (1 - this.aivars[0]);
} }
if(level[(this.actor.y) >> 4][((this.actor.x + 8) >> 4) + (this.aivars[0] == 0 ? 1 : -1)] != '#'){ try{
this.aivars[0] = (1 - this.aivars[0]); if(level[(this.actor.y) >> 4][((this.actor.x + 8) >> 4) + (this.aivars[0] == 0 ? 1 : -1)] != '#'){
this.aivars[0] = (1 - this.aivars[0]);
}
}catch(err){
} }
if(this.actor.box.inlava){ if(this.actor.box.inlava){
this.action('jump'); this.action('jump');
@ -477,6 +507,67 @@ function Ai(index, ai){
this.action('en2'); this.action('en2');
} }
this.action(this.aivars[0] == 0 ? 'moveRight' : 'moveLeft'); this.action(this.aivars[0] == 0 ? 'moveRight' : 'moveLeft');
break;
case 'fly': // Flying AI
if(this.aivars[1]){
this.aivars[0] = 6;
}else{
this.aivars[0] = 3;
}
var bottom = false;
var aboveBottom = false;
try{
for(var i = -3; i <= 3; i++){
for(var j = 1; j < this.aivars[0] + 1; j++){
if(level[((this.actor.y) >> 4) + j][((this.actor.x + 8) >> 4) + i] == '#'){
if(j <= this.aivars[0]){
bottom = true;
}else{
aboveBottom = true;
}
}
}
}
}catch(err){
bottom = false;
}
if(this.actor.y <= 30){
bottom = false;
}
if(!this.aivars[2]){
this.aivars[2] = 70 + (Math.random() * 100);
}
var distanceAway = Math.abs(actors[0].x - this.actor.x);
if(distanceAway < 500 && distanceAway > this.aivars[2]){
this.action(actors[0].x > this.actor.x ? 'moveRight' : 'moveLeft');
}
if(distanceAway < 50 + this.aivars[2] && !this.aivars[1] && Math.random() < 0.5){
var angle = Math.atan2(actors[0].y - this.actor.y, actors[0].x - this.actor.x);
this.actor.vars[0] = angle;
this.action('en3');
}
if(this.actor.energy <= 5){
this.aivars[1] = true;
}
if(this.actor.energy == this.actor.maxenergy){
this.aivars[1] = false;
}
if(bottom){
this.actor.yvel -= 0.2;
}else{
if(aboveBottom){
this.actor.yvel *= 0.8;
}else{
this.actor.yvel += 0.2;
}
}
this.actor.yvel *= 0.98;
if(Math.abs(this.actor.yvel) >= 2){
this.actor.yvel *= 0.7;
}
break;
case 'boss':
break; break;
case 'still': case 'still':
break; break;
@ -488,10 +579,12 @@ function Ai(index, ai){
if(this.actor.health < 0){ if(this.actor.health < 0){
this.deleteme = true; this.deleteme = true;
this.actor.deleteme = true; this.actor.deleteme = true;
for(i = 0; i < 64; i++){ var w = this.actor.w / 2;
particles.push(new Particle(0, 2, 2, Math.random() * 500 + 2500, this.actor.x + ((i % 8) * 2), this.actor.y - ((i % 8) * 2), (Math.random() - 0.5) * 10, (Math.random() - 0.8) * 10, 0.4, [0.99, 0.99])); var h = this.actor.h / 2;
for(i = 0; i < w * h; i++){
particles.push(new Particle(0, 2, 2, Math.random() * 500 + 2500, this.actor.x + ((i % w) * 2), this.actor.y - ((i % h) * 2), (Math.random() - 0.5) * 10, (Math.random() - 0.8) * 10, 0.4, [0.99, 0.99]));
} }
score += [20, 50, 0, 0, 0, 0, 0, 0][this.actor.image - 8]; score += [20, 50, 100, 1000, 0, 0, 0, 0][this.actor.image - 8];
this.actor.x = 0; this.actor.x = 0;
this.actor.y = 0; this.actor.y = 0;
} }
@ -499,10 +592,11 @@ function Ai(index, ai){
} }
// Actor class for all solid cubes // Actor class for all solid cubes
function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width, height, ai){ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width, height, ai, gravity){
this.image = image; this.image = image;
this.ai = typeof ai === 'undefined' ? false : ai; this.ai = typeof ai === 'undefined' ? false : ai;
this.group = type; this.group = type;
this.gravity = typeof gravity === 'undefined' ? true : gravity;
this.health = health; this.health = health;
this.maxhealth = health; this.maxhealth = health;
this.energy = energy; this.energy = energy;
@ -510,7 +604,7 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
this.speed = moveSpeed; this.speed = moveSpeed;
this.tookDamage = 0; this.tookDamage = 0;
this.select = 0; this.select = 0;
this.powers = 1; this.powers = 6;
this.yvel = 0; this.yvel = 0;
this.xvel = 0; this.xvel = 0;
this.imageLoad = 2; this.imageLoad = 2;
@ -521,7 +615,7 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
this.y = ypos; this.y = ypos;
this.w = width; this.w = width;
this.h = height; this.h = height;
this.box = new Box(this.x, this.y, this.w, this.h, this.xvel, this.yvel, 0, true); this.box = new Box(this.x, this.y, this.w, this.h, this.xvel, this.yvel, 0, this.gravity);
this.oneactions = []; this.oneactions = [];
this.actionsturn = []; this.actionsturn = [];
this.index = actors.length; this.index = actors.length;
@ -584,6 +678,27 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
sound.shoot1.volume = (r(distanceToSound < 100 ? 1 : (500 - distanceToSound) / 400) * optionvars[1]) / 100; sound.shoot1.volume = (r(distanceToSound < 100 ? 1 : (500 - distanceToSound) / 400) * optionvars[1]) / 100;
sound.shoot1.play(); sound.shoot1.play();
} }
break;
case 4:
if(this.energy >= 5){
particles.push(new Particle(4, 2, 8, 20000, this.x + 8, this.y - 8, Math.cos(angle + ((Math.random() - 0.5) * 0.03)) * 10, Math.sin(angle + ((Math.random() - 0.5) * 0.03)) * 10, 0, [0.999, 0.999], true, -0.6));
if(distanceToSound < 500){
sound.shoot1.volume = (r(distanceToSound < 100 ? 1 : (500 - distanceToSound) / 400) * optionvars[1]) / 100;
sound.shoot1.play();
}
this.energy -= 5;
}
break;
case 5:
if(this.energy >= 6){
particles.push(new Particle(5, this.type, 10, Math.random() * 500 + 5000, this.x + 8, this.y - 8, Math.cos(angle) * 18 + this.xvel, Math.sin(angle) * 18 + this.yvel, 0.25, [0.9985, 0.9985]));
if(distanceToSound < 500){
sound.shoot1.volume = (r(distanceToSound < 100 ? 1 : (500 - distanceToSound) / 400) * optionvars[1]) / 100;
sound.shoot1.play();
}
this.energy -= 6;
}
break;
case 'en1': case 'en1':
if(this.energy >= 2){ if(this.energy >= 2){
particles.push(new Particle(0, 1, 1, Math.random() * 500 + 5000, this.x + 8, this.y - 8, Math.cos(this.vars[0]) * 15 + this.xvel, Math.sin(this.vars[0]) * 15 + this.yvel, 0.4, [0.995, 0.995])); particles.push(new Particle(0, 1, 1, Math.random() * 500 + 5000, this.x + 8, this.y - 8, Math.cos(this.vars[0]) * 15 + this.xvel, Math.sin(this.vars[0]) * 15 + this.yvel, 0.4, [0.995, 0.995]));
@ -604,6 +719,16 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
this.energy -= 2; this.energy -= 2;
} }
break; break;
case 'en3':
if(this.energy >= 3){
particles.push(new Particle(1, 1, 9, Math.random() * 500 + 3000, this.x + 8, this.y - 8, Math.cos(this.vars[0]) * 10 + this.xvel, Math.sin(this.vars[0]) * 10 + this.yvel, 0, [0.9987, 0.9987], true, -0.6));
if(distanceToSound < 500){
sound.shoot1.volume = (r(distanceToSound < 100 ? 1 : (500 - distanceToSound) / 400) * optionvars[1]) / 100;
sound.shoot1.play();
}
this.energy -= 3;
}
break;
case 'moveLeft': case 'moveLeft':
this.xvel -= ((this.speed / 100) * speed); this.xvel -= ((this.speed / 100) * speed);
break; break;
@ -669,13 +794,19 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
if(gameMode == 'free'){ if(gameMode == 'free'){
this.y = -500; this.y = -500;
}else{ }else{
this.x = limitLeft + 112; if(--lives >= 0){
this.y = 64; this.x = limitLeft + 112;
this.y = 64;
}else{
message = ['Game Over', 'You have 0 lives left :(', 'Score: ' + score];
this.y = -10;
lives++;
}
} }
this.xvel = 0;
this.yvel = 0;
this.health = this.maxhealth; this.health = this.maxhealth;
score -= 50 * levelNo; score -= 50 * levelNo;
this.xvel = 0;
this.yvel = 0;
clockStart = new Date().getTime(); clockStart = new Date().getTime();
} }
} }
@ -690,14 +821,14 @@ function Actor(image, type, health, moveSpeed, energy, powers, xpos, ypos, width
this.draw = function(){ this.draw = function(){
var drawx = r(this.x - lookx + this.xvel); var drawx = r(this.x - lookx + this.xvel);
var drawy = 200; var drawy = 200;
context.drawImage(spritesheet, (this.image % 8) * 16, Math.floor(this.image / 8) * 16, 16, 16, drawx, r(this.y - 16 - looky), this.w, this.h); context.drawImage(spritesheet, (this.image % 8) * 16, Math.floor(this.image / 8) * 16, this.w, this.h, drawx, r(this.y - 16 - looky), this.w, this.h);
context.globalAlpha = 1; context.globalAlpha = 1;
if(this.tookDamage > 0 && this.image != 0){ if(this.tookDamage > 0 && this.image != 0){
context.strokeStyle = '#555'; context.strokeStyle = '#555';
context.fillStyle = '#c54'; context.fillStyle = '#c54';
context.fillRect(r((this.x - lookx) + 8 + camera[0].xvel) - 10 - 0.5, r(this.y) - 23.5, (this.health / this.maxhealth) * 20, 5); context.fillRect(r((this.x - lookx) + (this.w / 2) + camera[0].xvel) - 10 - 0.5, r(this.y) - (15.5 + (this.h / 2)), (this.health / this.maxhealth) * (this.w * 1.2), 5);
context.strokeRect(r((this.x - lookx) + 8 + camera[0].xvel) - 10 - 0.5, r(this.y) - 23.5, 20, 5); context.strokeRect(r((this.x - lookx) + (this.w / 2) + camera[0].xvel) - 10 - 0.5, r(this.y) - (15.5 + (this.h / 2)), this.w * 1.2, 5);
this.tookDamage -= 0.05 * speed; this.tookDamage -= (1 / this.w) * speed;
} }
} }
} }
@ -722,13 +853,19 @@ function Item(type, xpos, ypos){
if(this.x + 16 > act.x && this.x < act.x + act.w){ if(this.x + 16 > act.x && this.x < act.x + act.w){
switch(this.type){ switch(this.type){
case 0: case 0:
actors[0].health += 100; if(actors[0].health < actors[0].maxhealth){
if(actors[0].health > actors[0].maxhealth){ actors[0].health += 100;
actors[0].health = actors[0].maxhealth; if(actors[0].health > actors[0].maxhealth){
actors[0].health = actors[0].maxhealth;
}
sound.point3.volume = optionvars[1] / 150;
sound.point3.play();
} }
break; break;
case 1: case 1:
lives += 1;
sound.point3.volume = optionvars[1] / 150;
sound.point3.play();
break; break;
case 2: case 2:
score += 5; score += 5;
@ -750,6 +887,16 @@ function Item(type, xpos, ypos){
sound.point.volume = optionvars[1] / 150; sound.point.volume = optionvars[1] / 150;
sound.point.play(); sound.point.play();
break; break;
case 6:
score += 100;
sound.point.volume = optionvars[1] / 150;
sound.point.play();
break;
case 7:
score += 300;
sound.point.volume = optionvars[1] / 150;
sound.point.play();
break;
} }
this.deleteme = true; this.deleteme = true;
} }
@ -769,7 +916,7 @@ function Particle(type, affiliation, drawType, lifespan, xpos, ypos, xvel, yvel,
this.type = type; this.type = type;
this.air = airRes; this.air = airRes;
this.life = lifespan; this.life = lifespan;
this.sizes = [3, 5, 5, 3]; this.sizes = [3, 5, 5, 3, 5, 3];
this.size = this.sizes[type]; this.size = this.sizes[type];
this.created = this.timeup = new Date(); this.created = this.timeup = new Date();
this.timeup = new Date(this.timeup.getTime() + lifespan); this.timeup = new Date(this.timeup.getTime() + lifespan);
@ -834,15 +981,22 @@ function Particle(type, affiliation, drawType, lifespan, xpos, ypos, xvel, yvel,
case 7: case 7:
this.drawBox(1, 1 * extendSize, '#f95', 2 * extendSize); this.drawBox(1, 1 * extendSize, '#f95', 2 * extendSize);
break; break;
case 8:
this.drawBox(1, 2 * extendSize, '#7bb', 3 * extendSize);
break;
case 9:
this.drawBox(1, 1 * extendSize, '#b32', 4 * extendSize);
break;
case 10:
this.drawBox(1, 1 * extendSize, '#363', 2 * extendSize);
break;
} }
context.globalAlpha = 1; context.globalAlpha = 1;
} }
} }
this.drawIcons = function(){ this.drawIcons = function(){
for(var k = 0; k < 8; k++){ for(var k = 0; k < 6; k++){
//(480 - (k * 35)) + lookx;
// 293;
this.x = 480.5 - (35 * k); this.x = 480.5 - (35 * k);
this.y = 293.5; this.y = 293.5;
var unlocked = ((actors[0].powers - 1) >= k ? 1 : 5); var unlocked = ((actors[0].powers - 1) >= k ? 1 : 5);
@ -872,6 +1026,16 @@ function Particle(type, affiliation, drawType, lifespan, xpos, ypos, xvel, yvel,
this.x -= 12; this.x -= 12;
this.drawBox((1 / unlocked), 1.5, '#f95', 4, false, 0); this.drawBox((1 / unlocked), 1.5, '#f95', 4, false, 0);
break; break;
case 4:
this.x -= 5;
this.y -= 5;
this.drawBox((1 / unlocked), 3, '#7bb', 10, false, 0);
break;
case 5:
this.x -= 2;
this.y -= 2;
this.drawBox((1 / unlocked), 1.5, '#363', 4, false, 0);
break;
} }
} }
this.drawType = 'mouse'; this.drawType = 'mouse';
@ -928,6 +1092,20 @@ function Particle(type, affiliation, drawType, lifespan, xpos, ypos, xvel, yvel,
break; break;
case 3: case 3:
break; break;
case 4:
for(var i in actors){
if(i > 0){
var a = actors[i];
var dis = Math.sqrt(((a.x - this.x) * (a.x - this.x)) + ((a.y - this.y) * (a.y - this.y))) + 10;
var pull = 1 / Math.pow(dis, 2);
var angleTo = Math.atan2(a.y - this.y, a.x - this.x);
this.xvel += 10000 * Math.cos(angleTo) * pull;
this.yvel += 10000 * Math.sin(angleTo) * pull;
}
}
break;
case 5:
break;
default: default:
break; break;
} }
@ -936,7 +1114,7 @@ function Particle(type, affiliation, drawType, lifespan, xpos, ypos, xvel, yvel,
var act = actors[j]; var act = actors[j];
if(this.y + 16 < act.y + act.h && this.y + 16 + this.size > act.y){ if(this.y + 16 < act.y + act.h && this.y + 16 + this.size > act.y){
if(this.x + this.size > act.x && this.x < act.x + act.w && (this.aff == 1 ? j == 0 : j > 0)){ if(this.x + this.size > act.x && this.x < act.x + act.w && (this.aff == 1 ? j == 0 : j > 0)){
actors[j].health -= (Math.abs(this.xvel) + Math.abs(this.yvel)) / [10, 3, 0.2, 2][this.type]; actors[j].health -= (Math.abs(this.xvel) + Math.abs(this.yvel)) / [10, 3, 0.2, 2, 8, 3, 0.5][this.type];
actors[j].xvel += this.xvel / 8; actors[j].xvel += this.xvel / 8;
actors[j].yvel += this.yvel / 8; actors[j].yvel += this.yvel / 8;
actors[j].tookDamage = 40; actors[j].tookDamage = 40;
@ -1005,41 +1183,46 @@ function Box(x, y, w, h, xvel, yvel, colgroup, gravity, airRes, bounce){
var xcol = (((this.x - (hr == colareax - 1 ? 1 + 16 - (((this.width - 1) % 16) + 1): 0)) >> 4) + hr); // This is a bit complicated... var xcol = (((this.x - (hr == colareax - 1 ? 1 + 16 - (((this.width - 1) % 16) + 1): 0)) >> 4) + hr); // This is a bit complicated...
var ycol = (((this.y - (vr == colareay - 1 ? 1 + 16 - (((this.height - 1) % 16) + 1) : 0)) >> 4) + vr); // It will get the number of 16x16... var ycol = (((this.y - (vr == colareay - 1 ? 1 + 16 - (((this.height - 1) % 16) + 1) : 0)) >> 4) + vr); // It will get the number of 16x16...
if(ycol - 1 >= 0 && ycol <= lv.length){ // Blocks it takes to cover the entire actor or particle. E.g. something 8x8 needs 2 xcol and 2 ycol, if(ycol - 1 >= 0 && ycol <= lv.length){ // Blocks it takes to cover the entire actor or particle. E.g. something 8x8 needs 2 xcol and 2 ycol,
if(xcol >= 0 && xcol < lv[ycol].length){ // This is because it could be on the border between 2 blocks, covering up to 4 of them. try{
if(lv[ycol - 1][xcol] == '#'){ // If normal block if(xcol >= 0 && xcol < lv[ycol].length){ // This is because it could be on the border between 2 blocks, covering up to 4 of them.
collision = true; if(lv[ycol - 1][xcol] == '#'){ // If normal block
}else if(lv[ycol - 1][xcol] == 'x'){ // If in lava collision = true;
this.health -= 0.01 * speed; }else if(lv[ycol - 1][xcol] == 'x'){ // If in lava
this.inlava = true; this.health -= 0.01 * speed;
this.inlava = true;
this.xvel *= Math.pow(0.997, speed); // Slow down velocity this.xvel *= Math.pow(0.997, speed); // Slow down velocity
this.yvel *= Math.pow(0.997, speed); this.yvel *= Math.pow(0.997, speed);
}else if(lv[ycol - 1][xcol] == 'w'){ // If in water }else if(lv[ycol - 1][xcol] == 'w'){ // If in water
this.inlava = true; this.inlava = true;
this.xvel *= Math.pow(0.999, speed); this.xvel *= Math.pow(0.999, speed);
this.yvel *= Math.pow(0.999, speed); this.yvel *= Math.pow(0.999, speed);
}else if(lv[ycol - 1][xcol] == 'F' && actors[0].box == this){ }else if(lv[ycol - 1][xcol] == 'F' && actors[0].box == this){
if(gameMode == 'time'){ if(gameMode == 'time'){
if(trialComplete == false){ if(trialComplete == false){
var time = r((new Date().getTime() - clockStart)); var time = r((new Date().getTime() - clockStart));
finTime = toClock(time, 3); finTime = toClock(time, 3);
rawFinTime = time; rawFinTime = time;
if(cookies){
record[levelNo] = getCookie('trial record: ' + levelNo);
}
if(rawFinTime < record[levelNo] || record[levelNo] == false){
if(cookies){ if(cookies){
setCookie('trial record: ' + levelNo, rawFinTime, 30); record[levelNo] = getCookie('trial record: ' + levelNo);
} }
record[levelNo] = rawFinTime; if(rawFinTime < record[levelNo] || record[levelNo] == false){
if(cookies){
setCookie('trial record: ' + levelNo, rawFinTime, 30);
}
record[levelNo] = rawFinTime;
}
message = ['Level completed', 'Time : ' + finTime, 'Record : ' + toClock(record[levelNo], 3)]; // When finished time trial
} }
message = ['Level completed', 'Time : ' + finTime, 'Record : ' + toClock(record[levelNo], 3)]; // When finished time trial trialComplete = true;
}else{
message = 'win';
} }
trialComplete = true;
}else{
message = 'win';
} }
} }
}catch(err){
console.error('Physics error at ' + xcol + ', ' + ycol + '. ' + particles.length + '\n' + err);
this.y = 0;
} }
} }
} }
@ -1047,7 +1230,7 @@ function Box(x, y, w, h, xvel, yvel, colgroup, gravity, airRes, bounce){
if(this.col == 0){ if(this.col == 0){
for(j in actors){ // Check if colliding with another actor for(j in actors){ // Check if colliding with another actor
var obj = actors[j]; var obj = actors[j];
if(this.y < obj.y + obj.h && this.y + obj.h > obj.y && this.x + obj.w > obj.x && this.x < obj.x + obj.w && obj.box != this){ if(this.y < obj.y + obj.h && this.y + this.height > obj.y && this.x + this.width > obj.x && this.x < obj.x + obj.w && obj.box != this){
collision = true; collision = true;
var inv = this.xvel > 0; var inv = this.xvel > 0;
if(this.y < obj.y - this.height - 1 || this.y > obj.y + obj.h + 1){ if(this.y < obj.y - this.height - 1 || this.y > obj.y + obj.h + 1){
@ -1137,6 +1320,9 @@ function Box(x, y, w, h, xvel, yvel, colgroup, gravity, airRes, bounce){
if(j >= limit){ if(j >= limit){
this.x = originalx; this.x = originalx;
this.y = originaly; this.y = originaly;
return false;
}else{
return true;
} }
} }
@ -1184,21 +1370,32 @@ function drawLevel(lv){ // Draw level
if(endAdded || totalEnemies < (level[0].length / 100)){ if(endAdded || totalEnemies < (level[0].length / 100)){
switch(enemyToAdd){ switch(enemyToAdd){
case 0: case 0:
actors[actors.length] = new Actor(8, 1, 80, 5, 80, 3, j << 4, i << 4, 16, 16); actors[actors.length] = new Actor(8, 1, 80, 5, 80, 1, j << 4, i << 4, 16, 16);
ais[ais.length] = new Ai(actors.length - 1, 'pace'); ais[ais.length] = new Ai(actors.length - 1, 'pace');
break; break;
case 1: case 1:
actors[actors.length] = new Actor(9, 1, 100, 6, 50, 3, j << 4, i << 4, 16, 16); actors[actors.length] = new Actor(9, 1, 100, 6, 50, 2, j << 4, i << 4, 16, 16);
ais[ais.length] = new Ai(actors.length - 1, 'alphaBot'); ais[ais.length] = new Ai(actors.length - 1, 'alphaBot');
break; break;
case 2:
actors[actors.length] = new Actor(10, 1, 120, 5, 50, 3, j << 4, i << 4, 16, 16, false, 0);
ais[ais.length] = new Ai(actors.length - 1, 'fly');
break;
} }
totalEnemies += 1; totalEnemies += 1;
} }
level[i] = setStrChar(level[i], j, '.'); level[i] = setStrChar(level[i], j, '.');
}else if(lv[i][j] == 'B'){
actors[actors.length] = new Actor(11, 1, 600, 3, 200, 5, j << 4, i << 4, 32, 32);
ais[ais.length] = new Ai(actors.length - 1, 'boss');
level[i] = setStrChar(level[i], j, '.');
}else if(lv[i][j] == 'H'){ }else if(lv[i][j] == 'H'){
items[items.length] = new Item(0, j << 4, i << 4); items[items.length] = new Item(0, j << 4, i << 4);
level[i] = setStrChar(level[i], j, '.'); level[i] = setStrChar(level[i], j, '.');
}else if(parseInt(lv[i][j]) > -1){ }else if(lv[i][j] == 'L'){
items[items.length] = new Item(1, j << 4, i << 4);
level[i] = setStrChar(level[i], j, '.');
}else if(parseInt(lv[i][j]) > -1 && gameMode == 'adventure'){
if(endAdded || totalLevelScore < (level[0].length / 20) * (levelNo + 2)){ if(endAdded || totalLevelScore < (level[0].length / 20) * (levelNo + 2)){
items[items.length] = new Item(parseInt(lv[i][j]) + 2, j << 4, i << 4); items[items.length] = new Item(parseInt(lv[i][j]) + 2, j << 4, i << 4);
totalLevelScore += [5, 10, 20, 50][lv[i][j]]; totalLevelScore += [5, 10, 20, 50][lv[i][j]];
@ -1317,7 +1514,7 @@ function loopGame(){
context.fillStyle = '#68f'; context.fillStyle = '#68f';
context.fillRect(10.5, 300.5, camera[0].energy / 5, 10); context.fillRect(10.5, 300.5, camera[0].energy / 5, 10);
context.strokeRect(10.5, 300.5, camera[0].maxenergy / 5, 10); context.strokeRect(10.5, 300.5, camera[0].maxenergy / 5, 10);
for(var l = 0; l < 8; l++){ for(var l = 0; l < 6; l++){
context.strokeStyle = (l == actors[0].select ? '#555' : (actors[0].powers > l ? 'rgba(50, 50, 50, 0.5)' : 'rgba(50, 50, 50, 0.2)')); context.strokeStyle = (l == actors[0].select ? '#555' : (actors[0].powers > l ? 'rgba(50, 50, 50, 0.5)' : 'rgba(50, 50, 50, 0.2)'));
context.fillStyle = (l == actors[0].select ? 'rgba(180, 180, 210, 0.5)' : (actors[0].powers > l ? 'rgba(200, 200, 200, 0.2)' : 'rgba(200, 200, 200, 0.1)')); context.fillStyle = (l == actors[0].select ? 'rgba(180, 180, 210, 0.5)' : (actors[0].powers > l ? 'rgba(200, 200, 200, 0.2)' : 'rgba(200, 200, 200, 0.1)'));
context.fillRect(465.5 - (l * 35), 278.5, 30, 30); context.fillRect(465.5 - (l * 35), 278.5, 30, 30);
@ -1334,7 +1531,8 @@ function loopGame(){
context.fillText('FPS: ' + lastspeed, 10, 20); context.fillText('FPS: ' + lastspeed, 10, 20);
if(game == 'playing' && gameMode == 'adventure'){ if(game == 'playing' && gameMode == 'adventure'){
context.fillText('Level: ' + (levelNo + 1), 10, 258); context.fillText('Level: ' + (levelNo + 1), 10, 258);
context.fillText('Points: ' + score, 10, 275); context.fillText('Points: ' + score, 70, 275);
context.fillText('Lives: ' + lives, 10, 275);
} }
if(game == 'playing'){ if(game == 'playing'){
if(gameMode == 'time'){ if(gameMode == 'time'){
@ -1355,9 +1553,9 @@ function loopGame(){
if(mobile){ if(mobile){
context.fillText('RetX: ' + r(mouse.x), 420, 290); context.fillText('RetX: ' + r(mouse.x), 420, 290);
context.fillText('RetX: ' + r(mouse.y), 490, 290); context.fillText('RetX: ' + r(mouse.y), 490, 290);
context.fillText('Sint mobile version α 0.7.2', 490, 310); context.fillText('Sint mobile Beta 1.0', 490, 310);
}else{ }else{
context.fillText('Sint version α 0.7.2', 490, 20); // β context.fillText('Sint Beta 1.0', 490, 20); // β
if(cookies && game == 'menu'){ if(cookies && game == 'menu'){
context.fillText('Sint uses cookies to remember', 490, 290); context.fillText('Sint uses cookies to remember', 490, 290);
context.fillText('options and time trial records', 490, 310); context.fillText('options and time trial records', 490, 310);
@ -1383,7 +1581,7 @@ function loopGame(){
if(message){ if(message){
if(message == 'win'){ if(message == 'win' && levelNo < 5){
// Message box // Message box
context.strokeStyle = '#555'; context.strokeStyle = '#555';
context.fillStyle = '#ccc'; context.fillStyle = '#ccc';
@ -1404,7 +1602,7 @@ function loopGame(){
// Text // Text
context.fillStyle = '#fff'; context.fillStyle = '#fff';
context.fillText('You have won level ' + (levelNo + 1) + '.', 250, 80); context.fillText('You have won level ' + (levelNo + 1) + '.', 250, 80);
context.fillText((19 - levelNo) + ' levels left.', 250, 100); context.fillText((5 - levelNo) + ' levels left.', 250, 100);
context.fillText('Points: ' + score, 250, 125); context.fillText('Points: ' + score, 250, 125);
context.fillStyle = (ui.select == 3 ? 'fff' : '#eef'); context.fillStyle = (ui.select == 3 ? 'fff' : '#eef');
context.fillText('Continue', 250, 253); context.fillText('Continue', 250, 253);
@ -1454,6 +1652,9 @@ function loopGame(){
} }
} }
}else{ }else{
if(levelNo == 5){
message = ['You have won the game :D', '', 'Score: ' + score];
}
context.strokeStyle = '#555'; context.strokeStyle = '#555';
context.fillStyle = '#ccc'; context.fillStyle = '#ccc';
context.fillRect(100, 100, 300, 120); context.fillRect(100, 100, 300, 120);
@ -1469,6 +1670,9 @@ function loopGame(){
} }
if(keysDown.indexOf(13) > -1){ if(keysDown.indexOf(13) > -1){
message = false; message = false;
if(lives <= 0 || levelNo == 5){
toMenu();
}
} }
} }
} }
@ -1508,7 +1712,7 @@ function loopGame(){
game = 'playing'; game = 'playing';
gameMode = 'free'; gameMode = 'free';
levelNo = 19; levelNo = 19;
actors[0].powers = 8; actors[0].powers = 6;
actors[0].maxhealth = 500; actors[0].maxhealth = 500;
actors[0].health = 500; actors[0].health = 500;
actors[0].maxenergy = 500; actors[0].maxenergy = 500;
@ -1701,4 +1905,4 @@ function loopGame(){
if(musicPlaying){ if(musicPlaying){
musicPlaying.sound.volume = optionvars[0] / 100; musicPlaying.sound.volume = optionvars[0] / 100;
} }
} }