diff --git a/js/bullets.js b/js/bullets.js index 7e832ad..2772e06 100644 --- a/js/bullets.js +++ b/js/bullets.js @@ -766,7 +766,7 @@ const b = { { name: "ice crystal nucleation", - description: "your minigun condenses unlimited ammo
ice bullets made from water vapor slow mobs", + description: "your minigun uses energy to condense
bullets from water vapor that slow mobs", maxCount: 1, count: 0, allowed() { @@ -815,7 +815,7 @@ const b = { }, { name: "super duper", - description: "fire +2 additional super ball", + description: "fire +2 additional super balls", maxCount: 9, count: 0, allowed() { @@ -831,7 +831,7 @@ const b = { }, { name: "super ball", - description: "fire a single huge super ball", + description: "fire one large super ball
that stuns mobs for 2 second", maxCount: 1, count: 0, allowed() { @@ -1251,8 +1251,8 @@ const b = { game.updateGunHUD(); } } else { - if (b.isModAmmoFromHealth && mech.health > b.isModAmmoFromHealth) { - mech.damage(b.isModAmmoFromHealth * mech.health); + if (b.isModAmmoFromHealth && mech.health > 0.05) { + mech.damage(Math.max(0.01, b.isModAmmoFromHealth * mech.health)); powerUps.spawn(mech.pos.x, mech.pos.y, "ammo"); if (Math.random() < b.isModBayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo"); } @@ -2123,12 +2123,14 @@ const b = { bullet[me].endCycle = game.cycle + 70; bullet[me].dmg = 0.07; bullet[me].frictionAir = mech.crouch ? 0.007 : 0.01; - if (b.isModIceCrystals) { + if (b.isModIceCrystals && mech.energy > 0.01) { + mech.energy -= mech.fieldRegen + 0.007 bullet[me].onDmg = function (who) { mobs.statusSlow(who, 60) }; //ice muzzleFlash ctx.fillStyle = "rgb(0,100,255)"; + ctx.beginPath(); ctx.arc(mech.pos.x + 35 * Math.cos(mech.angle), mech.pos.y + 35 * Math.sin(mech.angle), 15, 0, 2 * Math.PI); ctx.fill(); @@ -2192,7 +2194,7 @@ const b = { if (b.modOneSuperBall) { let dir = mech.angle const me = bullet.length; - bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 12, 22 * b.modBulletSize, b.fireAttributes(dir, false)); + bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 12, 20 * b.modBulletSize, b.fireAttributes(dir, false)); World.add(engine.world, bullet[me]); //add bullet to world Matter.Body.setVelocity(bullet[me], { x: SPEED * Math.cos(dir), @@ -2206,6 +2208,9 @@ const b = { bullet[me].do = function () { this.force.y += this.mass * 0.001; }; + bullet[me].onDmg = function (who) { + mobs.statusStun(who, 120) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) + }; } else { b.muzzleFlash(20); const SPREAD = mech.crouch ? 0.08 : 0.15 @@ -2261,12 +2266,10 @@ const b = { bullet[me].endCycle = game.cycle + 180; bullet[me].dmg = 0; bullet[me].onDmg = function (who) { - if (!who.isShielded) { - if (b.isModDotFlechette) { - mobs.statusPoison(who, 0.33, 360) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) - } else { - mobs.statusPoison(who, 0.33, 180) // (2.3) / 6 ticks (3 seconds) - } + if (b.isModDotFlechette) { + mobs.statusPoison(who, 0.33, 360) // (2.3) * 2 / 14 ticks (2x damage over 7 seconds) + } else { + mobs.statusPoison(who, 0.33, 180) // (2.3) / 6 ticks (3 seconds) } }; diff --git a/js/mobs.js b/js/mobs.js index 95cbf93..e039bc3 100644 --- a/js/mobs.js +++ b/js/mobs.js @@ -79,13 +79,13 @@ const mobs = { }) } }, - statusStun(who, cycles = 60) { + statusStun(who, cycles = 120) { if (!who.shield && !who.isShielded) { Matter.Body.setVelocity(who, { - x: 0, - y: 0 + x: who.velocity.x * 0.8, + y: who.velocity.y * 0.8 }); - Matter.Body.setAngularVelocity(who, 0); + Matter.Body.setAngularVelocity(who, who.angularVelocity * 0.8); //remove other "stun" effects on this mob let i = who.status.length while (i--) { @@ -98,7 +98,7 @@ const mobs = { x: who.position.x + 100 * (Math.random() - 0.5), y: who.position.y + 100 * (Math.random() - 0.5) } - who.force.y += who.mass * 0.002 //extra gravity + who.force.y += who.mass * 0.001 //extra gravity ctx.beginPath(); ctx.moveTo(who.vertices[0].x, who.vertices[0].y); @@ -117,49 +117,53 @@ const mobs = { } }, statusPoison(who, tickDamage, cycles = 180) { - who.status.push({ - effect() { - if ((game.cycle - this.startCycle) % 30 === 0) { - let dmg = b.dmgScale * tickDamage - who.damage(dmg); - game.drawList.push({ //add dmg to draw queue - x: who.position.x, - y: who.position.y, - radius: Math.log(2 * dmg + 1.1) * 40, - color: "rgba(0,80,80,0.9)", - time: game.drawTime - }); - } - }, - type: "poison", - endCycle: game.cycle + cycles, - startCycle: game.cycle - }) + if (!who.isShielded) { + who.status.push({ + effect() { + if ((game.cycle - this.startCycle) % 30 === 0) { + let dmg = b.dmgScale * tickDamage + who.damage(dmg); + game.drawList.push({ //add dmg to draw queue + x: who.position.x, + y: who.position.y, + radius: Math.log(2 * dmg + 1.1) * 40, + color: "rgba(0,80,80,0.9)", + time: game.drawTime + }); + } + }, + type: "poison", + endCycle: game.cycle + cycles, + startCycle: game.cycle + }) + } }, statusBurn(who, tickDamage, cycles = 90 + Math.floor(90 * Math.random())) { - //remove other "burn" effects on this mob - let i = who.status.length - while (i--) { - if (who.status[i].type === "burn") who.status.splice(i, 1); + if (!who.isShielded) { + //remove other "burn" effects on this mob + let i = who.status.length + while (i--) { + if (who.status[i].type === "burn") who.status.splice(i, 1); + } + who.status.push({ + effect() { + if ((game.cycle - this.startCycle) % 15 === 0) { + let dmg = b.dmgScale * tickDamage * 0.5 * (1 + Math.random()) + who.damage(dmg); + game.drawList.push({ //add dmg to draw queue + x: who.position.x, + y: who.position.y, + radius: Math.log(2 * dmg + 1.1) * 40, + color: `rgba(255,${Math.floor(255*Math.random())},0,0.9)`, + time: game.drawTime + }); + } + }, + type: "burn", + endCycle: game.cycle + cycles, + startCycle: game.cycle + }) } - who.status.push({ - effect() { - if ((game.cycle - this.startCycle) % 15 === 0) { - let dmg = b.dmgScale * tickDamage * 0.5 * (1 + Math.random()) - who.damage(dmg); - game.drawList.push({ //add dmg to draw queue - x: who.position.x, - y: who.position.y, - radius: Math.log(2 * dmg + 1.1) * 40, - color: `rgba(255,${Math.floor(255*Math.random())},0,0.9)`, - time: game.drawTime - }); - } - }, - type: "burn", - endCycle: game.cycle + cycles, - startCycle: game.cycle - }) }, //********************************************************************************************** diff --git a/todo.txt b/todo.txt index c05952c..d647adb 100644 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,6 @@ ************** TODO - n-gon ************** -mod - super balls fire one ball at a time - ammo and fire rate is improved by the number of balls fired +mod or field - turn blocks into spores or drones mod - robot that attack nearby mobs, and delivers a stun status effect use laser bot code for the attack