diff --git a/js/bullets.js b/js/bullets.js index 4d4049c..e333198 100644 --- a/js/bullets.js +++ b/js/bullets.js @@ -234,12 +234,11 @@ const b = { ammoPack: Infinity, have: false, fire() { - //mech.fireCDcycle = game.cycle + 1 - + // mech.fireCDcycle = game.cycle + 1 //laser drains energy as well as bullets const FIELD_DRAIN = 0.006 if (mech.fieldMeter < FIELD_DRAIN) { - mech.fireCDcycle = game.cycle + 120; // cool down if out of energy + mech.fireCDcycle = game.cycle + 100; // cool down if out of energy } else { mech.fieldMeter -= mech.fieldRegen + FIELD_DRAIN let best; @@ -396,7 +395,7 @@ const b = { const me = bullet.length; b.muzzleFlash(15); // if (Math.random() > 0.2) mobs.alert(500); - const dir = (Math.random() - 0.5) * 0.15 + mech.angle; + const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.05 : 0.15); bullet[me] = Bodies.rectangle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 17, 5, b.fireAttributes(dir)); b.fireProps(5, 40, dir, me); //cd , speed bullet[me].endCycle = game.cycle + 60; @@ -416,12 +415,17 @@ const b = { // mobs.alert(800); const me = bullet.length; const dir = mech.angle; - bullet[me] = Bodies.rectangle(mech.pos.x + 50 * Math.cos(mech.angle), mech.pos.y + 50 * Math.sin(mech.angle), 60, 25, b.fireAttributes(dir)); - b.fireProps(30, 54, dir, me); //cd , speed + bullet[me] = Bodies.rectangle(mech.pos.x + 50 * Math.cos(mech.angle), mech.pos.y + 50 * Math.sin(mech.angle), 70, 30, b.fireAttributes(dir)); + b.fireProps(mech.crouch ? 40 : 30, 54, dir, me); //cd , speed bullet[me].endCycle = game.cycle + 180; bullet[me].do = function () { this.force.y += this.mass * 0.0005; }; + + //knock back + const KNOCK = (mech.crouch) ? 0.015 : 0.15 + player.force.x -= KNOCK * Math.cos(dir) + player.force.y -= 0.5 * KNOCK * Math.sin(dir) } }, { @@ -432,11 +436,12 @@ const b = { fire() { b.muzzleFlash(20); // mobs.alert(450); - let dir = mech.angle - 0.05; + const SPREAD = mech.crouch ? 0.03 : 0.14 + let dir = mech.angle - SPREAD; for (let i = 0; i < 3; i++) { const me = bullet.length; bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 7, b.fireAttributes(dir)); - b.fireProps(20, 30, dir, me); //cd , speed + b.fireProps(mech.crouch ? 30 : 20, mech.crouch ? 34 : 27, dir, me); //cd , speed Matter.Body.setDensity(bullet[me], 0.0001); bullet[me].endCycle = game.cycle + 360; bullet[me].dmg = 0.5; @@ -446,7 +451,7 @@ const b = { bullet[me].do = function () { this.force.y += this.mass * 0.001; }; - dir += 0.05; + dir += SPREAD; } } }, @@ -460,7 +465,7 @@ const b = { // mobs.alert(650); for (let i = 0; i < 9; i++) { const me = bullet.length; - const dir = (Math.random() - 0.5) * 0.6 + mech.angle; + const dir = mech.angle + (Math.random() - 0.5) * (mech.crouch ? 0.1 : 0.6) bullet[me] = Bodies.rectangle( mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5), mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5), @@ -468,7 +473,7 @@ const b = { 11, b.fireAttributes(dir) ); - b.fireProps(30, 36 + Math.random() * 11, dir, me); //cd , speed + b.fireProps(mech.crouch ? 40 : 30, 36 + Math.random() * 11, dir, me); //cd , speed bullet[me].endCycle = game.cycle + 60; bullet[me].frictionAir = 0.02; bullet[me].do = function () { @@ -486,7 +491,7 @@ const b = { const me = bullet.length; const dir = mech.angle; bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(mech.angle), mech.pos.y + 40 * Math.sin(mech.angle), 31, 2, b.fireAttributes(dir)); - b.fireProps(20, 45, dir, me); //cd , speed + b.fireProps((mech.crouch ? 17 : 23), 45, dir, me); //cd , speed bullet[me].endCycle = game.cycle + 180; bullet[me].dmg = 1; b.drawOneBullet(bullet[me].vertices); @@ -518,10 +523,10 @@ const b = { this.ammoLoaded-- const thrust = 0.0003; - let dir = mech.angle + 0.1 * (0.5 - Math.random()); + let dir = mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.1); const me = bullet.length; bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(mech.angle), mech.pos.y + 40 * Math.sin(mech.angle) - 3, 30, 4, b.fireAttributes(dir)); - b.fireProps(6, -5 - 3 * (0.5 - Math.random()), dir, me); //cd , speed + b.fireProps(mech.crouch ? 25 : 6, -3 * (0.5 - Math.random()) + (mech.crouch ? 15 : -8), dir, me); //cd , speed b.drawOneBullet(bullet[me].vertices); // Matter.Body.setDensity(bullet[me], 0.01) //doesn't help with reducing explosion knock backs bullet[me].force.y += 0.00045; //a small push down at first to make it seem like the missile is briefly falling @@ -618,9 +623,9 @@ const b = { dir += angleStep const me = bullet.length; bullet[me] = Bodies.rectangle(mech.pos.x + 50 * Math.cos(mech.angle), mech.pos.y + 50 * Math.sin(mech.angle), 17, 4, b.fireAttributes(dir)); - b.fireProps(20, 24 + 30 * Math.random() - i, dir, me); //cd , speed + b.fireProps(mech.crouch ? 30 : 20, 24 + 30 * Math.random() - i, dir, me); //cd , speed //Matter.Body.setDensity(bullet[me], 0.00001); - bullet[me].endCycle = game.cycle + 20 + i //16 + Math.ceil(8 * Math.random() + bullet[me].endCycle = i + game.cycle + (mech.crouch ? 29 : 18) bullet[me].restitution = 0; bullet[me].friction = 1; bullet[me].explodeRad = 70 + (Math.random() - 0.5) * 50; @@ -648,7 +653,7 @@ const b = { const me = bullet.length; const dir = mech.angle; // + Math.random() * 0.05; bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 10, b.fireAttributes(dir)); - b.fireProps(8, 26, dir, me); //cd , speed + b.fireProps(mech.crouch ? 15 : 8, mech.crouch ? 32 : 24, dir, me); //cd , speed b.drawOneBullet(bullet[me].vertices); Matter.Body.setDensity(bullet[me], 0.000001); bullet[me].totalCycles = 120; @@ -677,7 +682,7 @@ const b = { const dir = mech.angle; bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 22, b.fireAttributes(dir)); bullet[me].radius = 22; //used from drawing timer - b.fireProps(40, 32, dir, me); //cd , speed + b.fireProps(mech.crouch ? 60 : 40, mech.crouch ? 38 : 30, dir, me); //cd , speed b.drawOneBullet(bullet[me].vertices); Matter.Body.setDensity(bullet[me], 0.000001); bullet[me].endCycle = game.cycle + 140; @@ -727,7 +732,7 @@ const b = { const me = bullet.length; const dir = mech.angle; bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 20, 4.5, b.fireAttributes(dir)); - b.fireProps(25, 20, dir, me); //cd , speed + b.fireProps(mech.crouch ? 45 : 25, mech.crouch ? 26 : 17, dir, me); //cd , speed b.drawOneBullet(bullet[me].vertices); Matter.Body.setDensity(bullet[me], 0.000001); bullet[me].endCycle = game.cycle + 100; @@ -739,9 +744,15 @@ const b = { bullet[me].do = function () { const SCALE = 1.017 Matter.Body.scale(this, SCALE, SCALE); - this.frictionAir += 0.00021; + this.frictionAir += 0.00023; this.force.y += this.mass * 0.00045; + + //draw green glow + ctx.fillStyle = "rgba(0,200,125,0.16)"; + ctx.beginPath(); + ctx.arc(this.position.x, this.position.y, 26, 0, 2 * Math.PI); + ctx.fill(); }; //spawn bullets on end @@ -821,9 +832,8 @@ const b = { ammoPack: 25, have: false, fire() { - const MAX_SPEED = 6 const THRUST = 0.0015 - const dir = mech.angle + 0.7 * (Math.random() - 0.5); + const dir = mech.angle + (Math.random() - 0.5) * 0.7; const me = bullet.length; const RADIUS = 4 + 4 * Math.random() bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), RADIUS, { @@ -844,11 +854,10 @@ const b = { isFollowMouse: true, onDmg() { this.lockedOn = null - }, //this.endCycle = 0 //triggers despawn + }, onEnd() {}, do() { this.force.y += this.mass * 0.0002; - //find mob targets if (!(game.cycle % this.lookFrequency)) { // this.close = null; @@ -878,9 +887,8 @@ const b = { } else if (this.isFollowMouse) { //accelerate towards mouse this.force = Matter.Vector.mult(Matter.Vector.normalise(Matter.Vector.sub(this.position, game.mouseInGame)), -this.mass * THRUST) } - // speed cap instead of friction to give more agility - if (this.speed > MAX_SPEED) { + if (this.speed > 6) { Matter.Body.setVelocity(this, { x: this.velocity.x * 0.97, y: this.velocity.y * 0.97 @@ -888,8 +896,7 @@ const b = { } } }) - // b.fireAttributes(dir)); - b.fireProps(10, MAX_SPEED, dir, me); //cd , speed + b.fireProps(mech.crouch ? 15 : 10, mech.crouch ? 26 : 2, dir, me); //cd , speed b.drawOneBullet(bullet[me].vertices); // Matter.Body.setDensity(bullet[me], 0.000001); // bullet[me].onDmg = function () { @@ -905,7 +912,7 @@ const b = { fire() { const me = bullet.length; const DIR = mech.angle - const wiggleMag = (mech.flipLegs === 1) ? 0.0045 : -0.0045 + const wiggleMag = ((mech.flipLegs === 1) ? 1 : -1) * ((mech.crouch) ? 0.0025 : 0.0045) bullet[me] = Bodies.circle(mech.pos.x + 25 * Math.cos(DIR), mech.pos.y + 25 * Math.sin(DIR), 10, { angle: DIR, cycle: -0.43, //adjust this number until the bullets line up with the cross hairs @@ -913,7 +920,7 @@ const b = { inertia: Infinity, frictionAir: 0, minDmgSpeed: 0, - dmg: 0.1, //damage done in addition to the damage from momentum + dmg: 0.15, //damage done in addition to the damage from momentum classType: "bullet", collisionFilter: { category: 0x000100, @@ -940,8 +947,8 @@ const b = { } }); World.add(engine.world, bullet[me]); //add bullet to world - mech.fireCDcycle = game.cycle + 4; // cool down - const SPEED = 4.5; + mech.fireCDcycle = game.cycle + (mech.crouch ? 6 : 4); // cool down + const SPEED = mech.crouch ? 6 : 4.5; Matter.Body.setVelocity(bullet[me], { x: SPEED * Math.cos(DIR), y: SPEED * Math.sin(DIR) diff --git a/js/index.js b/js/index.js index 2ab2f0f..a7c1833 100644 --- a/js/index.js +++ b/js/index.js @@ -4,6 +4,7 @@ run fast when shift is pressed drains fieldMeter + walking animation isn't going to look good give mobs more animal-like behaviors like rainworld @@ -15,45 +16,37 @@ give mobs more animal-like behaviors when low on life or after taking a large hit mobs can fight each other this might be hard to code - when not near other mobs they try to group up. + isolated mobs try to group up. -gun power ups +general gun power ups +explosion radius +dmg life steal + ice bullets (reduce mob velocity on dmg) +bullet size get bonus ammo / reduced ammo use - bullets pass through walls - unlimited ammo capacity - add in a max ammo capacity - - - -mutators (as a power up) - infinite ammo - or just more ammo from drops? - or 50% chance to not use up a bullet? - increased fire rate for guns - how to make laser fire faster? + +reduced cs on fire (faster fire rate) orbiting orb fires at random targets missiles at random targets - low gravity - double jumps - higher horizontal run speed? +specific gun power ups + laser: less energy use + rapid fire: less drag, less gravity, less randomness + one shot: larger bullet + super balls: fire 4 balls + spray: less drag +range + needles: +dmg, or faster fire rate + missiles: larger explosion radius + flak: + more projectiles per shot + M80: larger explosion radius + grenades: larger explosion radius + spore: quicker hatching, more spores spawn, +dmg + drones: last longer + wave beam: longer range - vampire damage - shield (recharges fast, but only upto 10% of life) +down key to modify gun + needles: +dmg, slower fire rate -Active use abilities (can get ideas from spacetime) - blink (short distance teleport) - would reverse if they end up in solid wall - beacon teleport - push (push blocks, mobs, and bullets away from player) - invulnerability (force field that stops mobs and bullets) - burst of speed - intangible (can move through bodies, bullets, and mobs. Not map elements) - game mechanics mechanics that support the physics engine add rope/constraint diff --git a/js/level.js b/js/level.js index ffac506..0600541 100644 --- a/js/level.js +++ b/js/level.js @@ -13,7 +13,7 @@ const level = { // game.zoomScale = 1400 //1400 if (game.levelsCleared === 0) { this.intro(); //starting level - b.giveGuns(0) // set a starting gun for testing + // b.giveGuns(11) // set a starting gun for testing // game.levelsCleared = 3; //for testing to simulate all possible mobs spawns // this.bosses(); // this.testingMap(); @@ -353,8 +353,8 @@ const level = { spawn.wireKnee(); spawn.wireKneeLeft(); spawn.wireHead(); - spawn.mapRect(1400, -700, 50, 300); //ground - spawn.healer(1600, -500) + // spawn.mapRect(1400, -700, 50, 300); //ground + // spawn.healer(1600, -500) // spawn.healer(1600, -500) // spawn.healer(1900, -500) // spawn.healer(1000, -500) diff --git a/js/player.js b/js/player.js index 27bd7cf..58cee02 100644 --- a/js/player.js +++ b/js/player.js @@ -263,7 +263,7 @@ const mech = { } //come to a stop if fast or if no move key is pressed if (player.speed > 4) { - const stoppingFriction = (this.crouch) ? 0.7 : 0.89; + const stoppingFriction = (this.crouch) ? 0.65 : 0.89; // this controls speed when crouched Matter.Body.setVelocity(player, { x: player.velocity.x * stoppingFriction, y: player.velocity.y * stoppingFriction @@ -333,7 +333,7 @@ const mech = { } //come to a stop if fast or if no move key is pressed if (player.speed > 4) { - const stoppingFriction = (this.crouch) ? 0.7 : 0.89; + const stoppingFriction = (this.crouch) ? 0.65 : 0.89; Matter.Body.setVelocity(player, { x: player.velocity.x * stoppingFriction, y: player.velocity.y * stoppingFriction diff --git a/js/spawn.js b/js/spawn.js index 46e7891..c038aec 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -1,6 +1,6 @@ //main object for spawning things in a level const spawn = { - pickList: ["healer", "healer"], + pickList: ["starter", "starter"], fullPickList: [ "chaser", "chaser", "chaser", "striker", "striker",