blockBoss
blockBoss: new boss based on work by TheShwarma (3x chance to randomly see blockBoss until next patch) it's over powered, I'll probably nerf it next patch, but I want to get some feedback first on how to nerf it hint: if you kill the boss all the mobBlocks turn back into blocks very very small blocks are slightly limited in how fast they can be thrown they were moving so fast they would miss their target sometimes tech: energy conservation gives 5% energy back (was 6%) tech: arsenal requires at least 3 guns in your inventory tech: active cooling requires at least 2 guns in your inventory several bug fixes
This commit is contained in:
@@ -106,7 +106,7 @@
|
|||||||
<option value="6">why?</option>
|
<option value="6">why?</option>
|
||||||
</select>
|
</select>
|
||||||
<br>
|
<br>
|
||||||
<label for="community-maps" title="adds in maps written by n-gon player: Francois">include community maps:</label>
|
<label for="community-maps" title="">include community maps:</label>
|
||||||
<input type="checkbox" id="community-maps" name="community-maps" style="width:17px; height:17px;">
|
<input type="checkbox" id="community-maps" name="community-maps" style="width:17px; height:17px;">
|
||||||
<!-- <br>
|
<!-- <br>
|
||||||
<label for="body-damage" title="allow damage from the ground and large fast moving blocks">collision damage from blocks:</label>
|
<label for="body-damage" title="allow damage from the ground and large fast moving blocks">collision damage from blocks:</label>
|
||||||
@@ -114,14 +114,15 @@
|
|||||||
<br>
|
<br>
|
||||||
<label for="classic-select" title="play older versions of n-gon">classic n-gon:</label>
|
<label for="classic-select" title="play older versions of n-gon">classic n-gon:</label>
|
||||||
<select name="classic-select" id="classic-select" onChange="window.location.href=this.value">
|
<select name="classic-select" id="classic-select" onChange="window.location.href=this.value">
|
||||||
<option value="https://scratch.mit.edu/projects/14005697/fullscreen/" selected>scratch: 2014</option>
|
<option value="https://scratch.mit.edu/projects/14005697/fullscreen/">scratch: 2014</option>
|
||||||
<option value="https://scratch.mit.edu/projects/22573757/fullscreen/" selected>scratch: 2015</option>
|
<option value="https://scratch.mit.edu/projects/22573757/fullscreen/">scratch: 2015</option>
|
||||||
<option value="https://codepen.io/lilgreenland/full/ozXNWZ" selected>codepen: 2016</option>
|
<option value="https://codepen.io/lilgreenland/full/ozXNWZ">codepen: 2016</option>
|
||||||
<option value="https://codepen.io/lilgreenland/full/wzARJY">codepen: 2016</option>
|
<option value="https://codepen.io/lilgreenland/full/wzARJY">codepen: 2016</option>
|
||||||
<option value="classic/7-1-2017/">n-gon: 2017</option>
|
<option value="classic/7-1-2017/">n-gon: 2017</option>
|
||||||
<option value="classic/4-15-2018/">n-gon: 2018</option>
|
<option value="classic/4-15-2018/">n-gon: 2018</option>
|
||||||
<option value="classic/7-11-2019/">n-gon: summer-2019</option>
|
<option value="classic/7-11-2019/">n-gon: summer-2019</option>
|
||||||
<option value="classic/9-8-2019/">n-gon: fall-2019</option>
|
<option value="classic/9-8-2019/">n-gon: fall-2019</option>
|
||||||
|
<option value="" selected>current version</option>
|
||||||
</select>
|
</select>
|
||||||
<br>
|
<br>
|
||||||
<label for="fps-select" title="use this to slow the game down">limit frames per second:</label>
|
<label for="fps-select" title="use this to slow the game down">limit frames per second:</label>
|
||||||
|
|||||||
@@ -3080,13 +3080,13 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 27 + Math.ceil(6 * Math.random()),
|
lookFrequency: 27 + Math.ceil(6 * Math.random()),
|
||||||
cd: 0,
|
cd: 0,
|
||||||
delay: 80,
|
delay: 70,
|
||||||
range: 70 + 3 * b.totalBots(),
|
range: 70 + 3 * b.totalBots(),
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
|
mask: b.totalBots() < 50 ? (cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield) : (cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield) //if over 50 bots, they no longer collide with each other
|
||||||
},
|
},
|
||||||
beforeDmg() {},
|
beforeDmg() {},
|
||||||
onEnd() {},
|
onEnd() {},
|
||||||
@@ -5055,7 +5055,7 @@ const b = {
|
|||||||
|
|
||||||
m.fireCDcycle = Infinity //can't fire until mouse is released
|
m.fireCDcycle = Infinity //can't fire until mouse is released
|
||||||
const previousCharge = this.charge
|
const previousCharge = this.charge
|
||||||
let smoothRate = (m.crouch ? 0.98 : 0.985) * (0.98 + 0.02 * b.fireCDscale) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot
|
let smoothRate = Math.min(0.998, (m.crouch ? 0.98 : 0.985) * (0.98 + 0.02 * b.fireCDscale)) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot
|
||||||
this.charge = this.charge * smoothRate + 1 - smoothRate
|
this.charge = this.charge * smoothRate + 1 - smoothRate
|
||||||
m.energy += (this.charge - previousCharge) * (tech.isRailEnergyGain ? 1 : -0.33) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
|
m.energy += (this.charge - previousCharge) * (tech.isRailEnergyGain ? 1 : -0.33) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
|
||||||
//draw targeting
|
//draw targeting
|
||||||
|
|||||||
19
js/level.js
19
js/level.js
@@ -109,12 +109,19 @@ const level = {
|
|||||||
},
|
},
|
||||||
custom() {},
|
custom() {},
|
||||||
customTopLayer() {},
|
customTopLayer() {},
|
||||||
|
setDifficulty() {
|
||||||
|
simulation.difficulty = 0
|
||||||
|
b.dmgScale = 1; //damage done by player decreases each level
|
||||||
|
simulation.accelScale = 1 //mob acceleration increases each level
|
||||||
|
simulation.CDScale = 1 //mob CD time decreases each level
|
||||||
|
simulation.dmgScale = 0.41 * simulation.difficulty //damage done by mobs increases each level
|
||||||
|
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
|
||||||
|
},
|
||||||
difficultyIncrease(num = 1) {
|
difficultyIncrease(num = 1) {
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
simulation.difficulty++
|
simulation.difficulty++
|
||||||
b.dmgScale *= 0.914; //damage done by player decreases each level
|
b.dmgScale *= 0.914; //damage done by player decreases each level
|
||||||
if (simulation.accelScale < 5) simulation.accelScale *= 1.02 //mob acceleration increases each level
|
if (simulation.accelScale < 5) simulation.accelScale *= 1.02 //mob acceleration increases each level
|
||||||
if (simulation.lookFreqScale > 0.2) simulation.lookFreqScale *= 0.98 //mob cycles between looks decreases each level
|
|
||||||
if (simulation.CDScale > 0.2) simulation.CDScale *= 0.97 //mob CD time decreases each level
|
if (simulation.CDScale > 0.2) simulation.CDScale *= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
simulation.dmgScale = 0.41 * simulation.difficulty //damage done by mobs increases each level
|
simulation.dmgScale = 0.41 * simulation.difficulty //damage done by mobs increases each level
|
||||||
@@ -125,7 +132,6 @@ const level = {
|
|||||||
simulation.difficulty--
|
simulation.difficulty--
|
||||||
b.dmgScale /= 0.914; //damage done by player decreases each level
|
b.dmgScale /= 0.914; //damage done by player decreases each level
|
||||||
if (simulation.accelScale > 0.2) simulation.accelScale /= 1.02 //mob acceleration increases each level
|
if (simulation.accelScale > 0.2) simulation.accelScale /= 1.02 //mob acceleration increases each level
|
||||||
if (simulation.lookFreqScale < 5) simulation.lookFreqScale /= 0.98 //mob cycles between looks decreases each level
|
|
||||||
if (simulation.CDScale < 5) simulation.CDScale /= 0.97 //mob CD time decreases each level
|
if (simulation.CDScale < 5) simulation.CDScale /= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
if (simulation.difficulty < 1) simulation.difficulty = 0;
|
if (simulation.difficulty < 1) simulation.difficulty = 0;
|
||||||
@@ -2266,12 +2272,13 @@ const level = {
|
|||||||
spawn.mapRect(5050, -100, 50, 150);
|
spawn.mapRect(5050, -100, 50, 150);
|
||||||
spawn.mapRect(4850, -275, 50, 175);
|
spawn.mapRect(4850, -275, 50, 175);
|
||||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||||
spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
// spawn.spiderBoss(1900, -500)
|
spawn.necroBoss(1900, -500)
|
||||||
|
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
||||||
// spawn.laserBombingBoss(1900, -500)
|
// spawn.laserBombingBoss(1900, -500)
|
||||||
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
||||||
|
|
||||||
// spawn.sniper(1900, -500)
|
// spawn.blockGroup(1900, -500)
|
||||||
// spawn.grenadier(1900, -500)
|
// spawn.grenadier(1900, -500)
|
||||||
// spawn.sneaker(1900, -500)
|
// spawn.sneaker(1900, -500)
|
||||||
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
||||||
@@ -2286,7 +2293,7 @@ const level = {
|
|||||||
// spawn.powerUpBoss(1600, -500)
|
// spawn.powerUpBoss(1600, -500)
|
||||||
// spawn.cellBossCulture(1600, -500)
|
// spawn.cellBossCulture(1600, -500)
|
||||||
// spawn.laserTargetingBoss(1600, -500)
|
// spawn.laserTargetingBoss(1600, -500)
|
||||||
// spawn.grenadierBoss(1200, -500)
|
// spawn.striker(1200, -500)
|
||||||
|
|
||||||
// spawn.nodeGroup(1200, -500, "grenadier")
|
// spawn.nodeGroup(1200, -500, "grenadier")
|
||||||
// spawn.snakeBoss(1200, -500)
|
// spawn.snakeBoss(1200, -500)
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ const mobs = {
|
|||||||
gravity() {
|
gravity() {
|
||||||
this.force.y += this.mass * this.g;
|
this.force.y += this.mass * this.g;
|
||||||
},
|
},
|
||||||
seePlayerFreq: Math.floor((30 + 30 * Math.random()) * simulation.lookFreqScale), //how often NPC checks to see where player is, lower numbers have better vision
|
seePlayerFreq: Math.floor(30 + 30 * Math.random()), //how often NPC checks to see where player is, lower numbers have better vision
|
||||||
foundPlayer() {
|
foundPlayer() {
|
||||||
this.locatePlayer();
|
this.locatePlayer();
|
||||||
if (!this.seePlayer.yes) {
|
if (!this.seePlayer.yes) {
|
||||||
@@ -759,11 +759,6 @@ const mobs = {
|
|||||||
attraction() {
|
attraction() {
|
||||||
//accelerate towards the player
|
//accelerate towards the player
|
||||||
if (this.seePlayer.recall) {
|
if (this.seePlayer.recall) {
|
||||||
// && dx * dx + dy * dy < 2000000) {
|
|
||||||
// const forceMag = this.accelMag * this.mass;
|
|
||||||
// const angle = Math.atan2(this.seePlayer.position.y - this.position.y, this.seePlayer.position.x - this.position.x);
|
|
||||||
// this.force.x += forceMag * Math.cos(angle);
|
|
||||||
// this.force.y += forceMag * Math.sin(angle);
|
|
||||||
const force = Vector.mult(Vector.normalise(Vector.sub(this.seePlayer.position, this.position)), this.accelMag * this.mass)
|
const force = Vector.mult(Vector.normalise(Vector.sub(this.seePlayer.position, this.position)), this.accelMag * this.mass)
|
||||||
this.force.x += force.x;
|
this.force.x += force.x;
|
||||||
this.force.y += force.y;
|
this.force.y += force.y;
|
||||||
|
|||||||
@@ -389,12 +389,10 @@ const m = {
|
|||||||
},
|
},
|
||||||
death() {
|
death() {
|
||||||
if (tech.isImmortal) { //if player has the immortality buff, spawn on the same level with randomized damage
|
if (tech.isImmortal) { //if player has the immortality buff, spawn on the same level with randomized damage
|
||||||
|
|
||||||
//remove immortality tech
|
//remove immortality tech
|
||||||
// for (let i = 0; i < tech.tech.length; i++) {
|
// for (let i = 0; i < tech.tech.length; i++) {
|
||||||
// if (tech.tech[i].name === "quantum immortality") tech.removeTech(i)
|
// if (tech.tech[i].name === "quantum immortality") tech.removeTech(i)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
simulation.wipe = function() { //set wipe to have trails
|
simulation.wipe = function() { //set wipe to have trails
|
||||||
ctx.fillStyle = "rgba(255,255,255,0)";
|
ctx.fillStyle = "rgba(255,255,255,0)";
|
||||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
@@ -480,7 +478,7 @@ const m = {
|
|||||||
setMaxHealth() {
|
setMaxHealth() {
|
||||||
m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage //+ tech.bonusHealth
|
m.maxHealth = m.baseHealth + tech.extraMaxHealth + tech.isFallingDamage //+ tech.bonusHealth
|
||||||
document.getElementById("health-bg").style.width = `${Math.floor(300*m.maxHealth)}px`
|
document.getElementById("health-bg").style.width = `${Math.floor(300*m.maxHealth)}px`
|
||||||
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-h'>maxHealth</span> <span class='color-symbol'>=</span> ${m.maxHealth.toFixed(3)}`)
|
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-h'>maxHealth</span> <span class='color-symbol'>=</span> ${m.maxHealth.toFixed(2)}`)
|
||||||
if (m.health > m.maxHealth) m.health = m.maxHealth;
|
if (m.health > m.maxHealth) m.health = m.maxHealth;
|
||||||
m.displayHealth();
|
m.displayHealth();
|
||||||
},
|
},
|
||||||
@@ -655,13 +653,12 @@ const m = {
|
|||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
}
|
}
|
||||||
}, 3000);
|
}, 3000);
|
||||||
return;
|
|
||||||
} else { //death
|
} else { //death
|
||||||
m.health = 0;
|
m.health = 0;
|
||||||
m.energy = 0;
|
m.energy = 0;
|
||||||
m.death();
|
m.death();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dmg *= m.harmReduction()
|
dmg *= m.harmReduction()
|
||||||
@@ -1161,7 +1158,7 @@ const m = {
|
|||||||
|
|
||||||
const charge = Math.min(m.throwCharge / 5, 1)
|
const charge = Math.min(m.throwCharge / 5, 1)
|
||||||
//***** scale throw speed with the first number, 80 *****
|
//***** scale throw speed with the first number, 80 *****
|
||||||
let speed = 80 * charge * Math.min(1, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
let speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
||||||
|
|
||||||
if (Matter.Query.collides(m.holdingTarget, map).length !== 0) {
|
if (Matter.Query.collides(m.holdingTarget, map).length !== 0) {
|
||||||
speed *= 0.7 //drop speed by 30% if touching map
|
speed *= 0.7 //drop speed by 30% if touching map
|
||||||
|
|||||||
@@ -130,7 +130,6 @@ const simulation = {
|
|||||||
healScale: 1,
|
healScale: 1,
|
||||||
accelScale: null, //set in levels.setDifficulty
|
accelScale: null, //set in levels.setDifficulty
|
||||||
CDScale: null, //set in levels.setDifficulty
|
CDScale: null, //set in levels.setDifficulty
|
||||||
lookFreqScale: null, //set in levels.setDifficulty
|
|
||||||
isNoPowerUps: false,
|
isNoPowerUps: false,
|
||||||
// dropFPS(cap = 40, time = 15) {
|
// dropFPS(cap = 40, time = 15) {
|
||||||
// simulation.fpsCap = cap
|
// simulation.fpsCap = cap
|
||||||
@@ -541,10 +540,6 @@ const simulation = {
|
|||||||
if (simulation.onTitlePage) requestAnimationFrame(cycle);
|
if (simulation.onTitlePage) requestAnimationFrame(cycle);
|
||||||
}
|
}
|
||||||
requestAnimationFrame(cycle)
|
requestAnimationFrame(cycle)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}, 1000);
|
}, 1000);
|
||||||
},
|
},
|
||||||
startGame(isBuildRun = false) {
|
startGame(isBuildRun = false) {
|
||||||
@@ -617,6 +612,7 @@ const simulation = {
|
|||||||
tech.plasmaBotCount = 0;
|
tech.plasmaBotCount = 0;
|
||||||
tech.missileBotCount = 0;
|
tech.missileBotCount = 0;
|
||||||
|
|
||||||
|
simulation.isChoosing = false;
|
||||||
b.setFireMethod()
|
b.setFireMethod()
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
// simulation.updateTechHUD();
|
// simulation.updateTechHUD();
|
||||||
@@ -641,20 +637,25 @@ const simulation = {
|
|||||||
|
|
||||||
level.onLevel = 0;
|
level.onLevel = 0;
|
||||||
level.levelsCleared = 0;
|
level.levelsCleared = 0;
|
||||||
//resetting difficulty
|
|
||||||
simulation.dmgScale = 0; //increases in level.difficultyIncrease
|
|
||||||
b.dmgScale = 1; //decreases in level.difficultyIncrease
|
|
||||||
simulation.accelScale = 1;
|
|
||||||
simulation.lookFreqScale = 1;
|
|
||||||
simulation.CDScale = 1;
|
|
||||||
simulation.difficulty = 0;
|
|
||||||
simulation.difficultyMode = Number(document.getElementById("difficulty-select").value)
|
|
||||||
build.isExperimentSelection = false;
|
|
||||||
|
|
||||||
|
//resetting difficulty
|
||||||
|
// simulation.difficulty = 0;
|
||||||
|
level.setDifficulty()
|
||||||
|
simulation.difficultyMode = Number(document.getElementById("difficulty-select").value)
|
||||||
|
|
||||||
|
build.isExperimentSelection = false;
|
||||||
simulation.clearNow = true;
|
simulation.clearNow = true;
|
||||||
document.getElementById("text-log").style.opacity = 0;
|
document.getElementById("text-log").style.opacity = 0;
|
||||||
document.getElementById("fade-out").style.opacity = 0;
|
document.getElementById("fade-out").style.opacity = 0;
|
||||||
document.title = "n-gon";
|
document.title = "n-gon";
|
||||||
|
// simulation.makeTextLog(`input.key.up<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.up}</span>", "<span class='color-text'>ArrowUp</span>"]`);
|
||||||
|
// simulation.makeTextLog(`input.key.left<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.left}</span>", "<span class='color-text'>ArrowLeft</span>"]`);
|
||||||
|
// simulation.makeTextLog(`input.key.down<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.down}</span>", "<span class='color-text'>ArrowDown</span>"]`);
|
||||||
|
// simulation.makeTextLog(`input.key.right<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.right}</span>", "<span class='color-text'>ArrowRight</span>"]`);
|
||||||
|
simulation.makeTextLog(`<span class='color-var'>const</span> engine <span class='color-symbol'>=</span> Engine.create(); <em>//simulation begin</em>`);
|
||||||
|
simulation.makeTextLog(`engine.timing.timeScale <span class='color-symbol'>=</span> 1`);
|
||||||
|
simulation.makeTextLog(`<span class='color-var'>m</span>.setField("<span class='color-text'>${m.fieldUpgrades[m.fieldMode].name}</span>")`);
|
||||||
|
// simulation.makeTextLog(`input.key.field<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.field}</span>", "<span class='color-text'>MouseRight</span>"]`);
|
||||||
|
|
||||||
document.getElementById("health").style.display = "inline"
|
document.getElementById("health").style.display = "inline"
|
||||||
document.getElementById("health-bg").style.display = "inline"
|
document.getElementById("health-bg").style.display = "inline"
|
||||||
@@ -668,6 +669,7 @@ const simulation = {
|
|||||||
//set to default field
|
//set to default field
|
||||||
tech.healMaxEnergyBonus = 0
|
tech.healMaxEnergyBonus = 0
|
||||||
m.setMaxEnergy();
|
m.setMaxEnergy();
|
||||||
|
m.energy = 0
|
||||||
m.fieldMode = 0;
|
m.fieldMode = 0;
|
||||||
// simulation.makeTextLog(`${simulation.SVGrightMouse}<strong style='font-size:30px;'> ${m.fieldUpgrades[m.fieldMode].name}</strong><br><span class='faded'></span><br>${m.fieldUpgrades[m.fieldMode].description}`, 600);
|
// simulation.makeTextLog(`${simulation.SVGrightMouse}<strong style='font-size:30px;'> ${m.fieldUpgrades[m.fieldMode].name}</strong><br><span class='faded'></span><br>${m.fieldUpgrades[m.fieldMode].description}`, 600);
|
||||||
// simulation.makeTextLog(`
|
// simulation.makeTextLog(`
|
||||||
@@ -681,28 +683,6 @@ const simulation = {
|
|||||||
// <br><span class='color-var'>m</span>.field.description <span class='color-symbol'>=</span> "<span class='color-text'>${m.fieldUpgrades[m.fieldMode].description}</span>"
|
// <br><span class='color-var'>m</span>.field.description <span class='color-symbol'>=</span> "<span class='color-text'>${m.fieldUpgrades[m.fieldMode].description}</span>"
|
||||||
// `, 800);
|
// `, 800);
|
||||||
|
|
||||||
|
|
||||||
let delay = 500
|
|
||||||
const step = 150
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`input.key.up<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.up}</span>", "<span class='color-text'>ArrowUp</span>"]`);
|
|
||||||
}, delay += step);
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`input.key.left<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.left}</span>", "<span class='color-text'>ArrowLeft</span>"]`);
|
|
||||||
}, delay += step);
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`input.key.down<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.down}</span>", "<span class='color-text'>ArrowDown</span>"]`);
|
|
||||||
}, delay += step);
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`input.key.right<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.right}</span>", "<span class='color-text'>ArrowRight</span>"]`);
|
|
||||||
}, delay += step);
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`<br><span class='color-var'>m</span>.fieldMode <span class='color-symbol'>=</span> "<span class='color-text'>${m.fieldUpgrades[m.fieldMode].name}</span>"`);
|
|
||||||
}, delay += step);
|
|
||||||
setTimeout(function() {
|
|
||||||
simulation.makeTextLog(`input.key.field<span class='color-symbol'>:</span> ["<span class='color-text'>${input.key.field}</span>", "<span class='color-text'>MouseRight</span>"]`);
|
|
||||||
}, delay += step);
|
|
||||||
|
|
||||||
m.setField(m.fieldMode)
|
m.setField(m.fieldMode)
|
||||||
// m.energy = 0;
|
// m.energy = 0;
|
||||||
//exit testing
|
//exit testing
|
||||||
@@ -718,7 +698,6 @@ const simulation = {
|
|||||||
simulation.fpsInterval = 1000 / simulation.fpsCap;
|
simulation.fpsInterval = 1000 / simulation.fpsCap;
|
||||||
simulation.then = Date.now();
|
simulation.then = Date.now();
|
||||||
requestAnimationFrame(cycle); //starts game loop
|
requestAnimationFrame(cycle); //starts game loop
|
||||||
|
|
||||||
},
|
},
|
||||||
clearTimeouts() {
|
clearTimeouts() {
|
||||||
let id = window.setTimeout(function() {}, 0);
|
let id = window.setTimeout(function() {}, 0);
|
||||||
|
|||||||
244
js/spawn.js
244
js/spawn.js
@@ -1,7 +1,7 @@
|
|||||||
//main object for spawning things in a level
|
//main object for spawning things in a level
|
||||||
const spawn = {
|
const spawn = {
|
||||||
nonCollideBossList: ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"],
|
nonCollideBossList: ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss", "spawnerBossCulture", "growBossCulture"],
|
||||||
randomLevelBoss(x, y, options = ["shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss"]) {
|
randomLevelBoss(x, y, options = ["shieldingBoss", "orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss", "pulsarBoss", "spawnerBossCulture", "grenadierBoss", "growBossCulture", "blinkBoss", "snakeSpitBoss", "laserBombingBoss", "blockBoss", "blockBoss", "blockBoss"]) {
|
||||||
// other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool
|
// other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool
|
||||||
spawn[options[Math.floor(Math.random() * options.length)]](x, y)
|
spawn[options[Math.floor(Math.random() * options.length)]](x, y)
|
||||||
},
|
},
|
||||||
@@ -54,7 +54,7 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
randomGroup(x, y, chance = 1) {
|
randomGroup(x, y, chance = 1) {
|
||||||
if (spawn.spawnChance(chance) && simulation.difficulty > 2 || chance == Infinity) {
|
if (spawn.spawnChance(chance) && simulation.difficulty > 2 || chance === Infinity) {
|
||||||
//choose from the possible picklist
|
//choose from the possible picklist
|
||||||
let pick = spawn.pickList[Math.floor(Math.random() * spawn.pickList.length)];
|
let pick = spawn.pickList[Math.floor(Math.random() * spawn.pickList.length)];
|
||||||
//is the pick able to be a group?
|
//is the pick able to be a group?
|
||||||
@@ -664,23 +664,38 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
starter(x, y, radius = Math.floor(15 + 20 * Math.random())) { //easy mob for on level 1
|
||||||
|
mobs.spawn(x, y, 8, radius, "#9ccdc6");
|
||||||
|
let me = mob[mob.length - 1];
|
||||||
|
// console.log(`mass=${me.mass}, radius = ${radius}`)
|
||||||
|
me.accelMag = 0.0002
|
||||||
|
me.repulsionRange = 100000 + radius * radius; //squared
|
||||||
|
// me.memory = 120;
|
||||||
|
me.seeAtDistance2 = 2000000 //1400 vision range
|
||||||
|
Matter.Body.setDensity(me, 0.0005) // normal density is 0.001 // this reduces life by half and decreases knockback
|
||||||
|
me.do = function() {
|
||||||
|
this.seePlayerByLookingAt();
|
||||||
|
this.attraction();
|
||||||
|
this.repulsion();
|
||||||
|
this.checkStatus();
|
||||||
|
};
|
||||||
|
},
|
||||||
blockGroup(x, y, num = 3 + Math.random() * 8) {
|
blockGroup(x, y, num = 3 + Math.random() * 8) {
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
const radius = 25 + Math.floor(Math.random() * 20)
|
const radius = 25 + Math.floor(Math.random() * 20)
|
||||||
spawn.grouper(x + Math.random() * radius, y + Math.random() * radius, radius);
|
spawn.blockGroupMob(x + Math.random() * radius, y + Math.random() * radius, radius);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
grouper(x, y, radius = 25 + Math.floor(Math.random() * 20)) {
|
blockGroupMob(x, y, radius = 25 + Math.floor(Math.random() * 20)) {
|
||||||
mobs.spawn(x, y, 4, radius, "#777");
|
mobs.spawn(x, y, 4, radius, "#999");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.g = 0.00015; //required if using 'gravity'
|
me.g = 0.00015; //required if using this.gravity
|
||||||
me.accelMag = 0.0008 * simulation.accelScale;
|
me.accelMag = 0.0008 * simulation.accelScale;
|
||||||
me.groupingRangeMax = 250000 + Math.random() * 100000;
|
me.groupingRangeMax = 250000 + Math.random() * 100000;
|
||||||
me.groupingRangeMin = (radius * 8) * (radius * 8);
|
me.groupingRangeMin = (radius * 8) * (radius * 8);
|
||||||
me.groupingStrength = 0.0005
|
me.groupingStrength = 0.0005
|
||||||
me.memory = 200;
|
me.memory = 200;
|
||||||
me.isGrouper = true;
|
me.isGrouper = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
this.gravity();
|
this.gravity();
|
||||||
this.checkStatus();
|
this.checkStatus();
|
||||||
@@ -705,28 +720,159 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.strokeStyle = "#000";
|
ctx.strokeStyle = "#0ff";
|
||||||
ctx.lineWidth = 1;
|
ctx.lineWidth = 1;
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
starter(x, y, radius = Math.floor(15 + 20 * Math.random())) {
|
blockBoss(x, y, radius = 30) {
|
||||||
//easy mob for on level 1
|
const activeBeams = []; // used to draw beams when converting
|
||||||
mobs.spawn(x, y, 8, radius, "#9ccdc6");
|
const beamTotalDuration = 60
|
||||||
let me = mob[mob.length - 1];
|
mobs.spawn(x, y, 4, radius, "#999"); //#54291d
|
||||||
// console.log(`mass=${me.mass}, radius = ${radius}`)
|
const me = mob[mob.length - 1];
|
||||||
me.accelMag = 0.0002
|
me.isBoss = true;
|
||||||
me.repulsionRange = 100000 + radius * radius; //squared
|
// Matter.Body.setDensity(me, 0.001); //normal density even though its a boss
|
||||||
// me.memory = 120;
|
me.damageReduction = 0.06; //extra reduction for a boss, because normal density
|
||||||
me.seeAtDistance2 = 2000000 //1400 vision range
|
me.frictionAir = 0.01;
|
||||||
Matter.Body.setDensity(me, 0.0005) // normal density is 0.001 // this reduces life by half and decreases knockback
|
me.accelMag = 0.0002;
|
||||||
|
me.onDeath = function() {
|
||||||
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y);
|
||||||
|
for (const who of mob) {
|
||||||
|
if (who.isNecroMob) { //blockMobs leave their body, and die
|
||||||
|
who.leaveBody = true
|
||||||
|
who.damage(Infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
me.target = player; // the target to lock on. Usually a block, but will be the player under certain conditions
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
this.seePlayerByLookingAt();
|
|
||||||
this.attraction();
|
|
||||||
this.repulsion();
|
|
||||||
this.checkStatus();
|
this.checkStatus();
|
||||||
};
|
this.seePlayerCheck();
|
||||||
|
if (this.target) { //(this.target === player && this.seePlayer.yes) || this.target !== player
|
||||||
|
const force = Vector.mult(Vector.normalise(Vector.sub(this.target.position, this.position)), this.accelMag * this.mass)
|
||||||
|
this.force.x += force.x;
|
||||||
|
this.force.y += force.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(simulation.cycle % 30) && !m.isBodiesAsleep) {
|
||||||
|
//find blocks to turn into mobs
|
||||||
|
for (let i = 0; i < body.length; i++) {
|
||||||
|
if (Vector.magnitude(Vector.sub(this.position, body[i].position)) < 700 && !body[i].isNotHoldable) { // check distance for each block
|
||||||
|
Matter.Composite.remove(engine.world, body[i]);
|
||||||
|
this.target = null //player;
|
||||||
|
spawn.blockMob(body[i].position.x, body[i].position.y, body[i], 0);
|
||||||
|
body.splice(i, 1);
|
||||||
|
activeBeams.push([beamTotalDuration, mob[mob.length - 1]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generally, the boss will tend to stay in the player's area but focus on blocks.
|
||||||
|
if (this.distanceToPlayer() > 1500 && this.target === null) {
|
||||||
|
this.target = player; // too far, attract to the player
|
||||||
|
} else {
|
||||||
|
if (body.length) { // look for a new target by finding the closest block
|
||||||
|
let min = Infinity;
|
||||||
|
let closestBlock = null;
|
||||||
|
for (const block of body) {
|
||||||
|
const dist = Vector.magnitudeSquared(Vector.sub(this.position, block.position))
|
||||||
|
if (dist < min && Matter.Query.ray(map, this.position, block.position).length === 0) {
|
||||||
|
min = dist;
|
||||||
|
closestBlock = block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.target = closestBlock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//randomly spawn new mobs from nothing
|
||||||
|
if (!(simulation.cycle % 120)) {
|
||||||
|
let count = 0
|
||||||
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
|
if (mob[i].isNecroMob) count++
|
||||||
|
}
|
||||||
|
if (count < 12 * Math.random() * Math.random()) { //limit number of spawns if there are already too many blockMobs
|
||||||
|
const unit = Vector.normalise(Vector.sub(player.position, this.position))
|
||||||
|
for (let i = 0, len = 3 * Math.random(); i < len; i++) {
|
||||||
|
const where = Vector.add(Vector.mult(unit, radius + 200 * Math.random()), this.position)
|
||||||
|
spawn.blockMob(where.x + 100 * (Math.random() - 0.5), where.y + 100 * (Math.random() - 0.5), null);
|
||||||
|
this.torque += 0.000035 * this.inertia; //spin after spawning
|
||||||
|
activeBeams.push([beamTotalDuration, mob[mob.length - 1]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
for (let i = 0; i < activeBeams.length; i++) { // draw beams on new mobs
|
||||||
|
const [duration, newBlockMob] = activeBeams[i];
|
||||||
|
if (duration === 0) {
|
||||||
|
activeBeams.splice(i, 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (newBlockMob.alive) {
|
||||||
|
const vertexIndex = Math.floor((newBlockMob.vertices.length - 1) * duration / beamTotalDuration)
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(this.position.x, this.position.y);
|
||||||
|
ctx.lineTo(newBlockMob.vertices[vertexIndex].x, newBlockMob.vertices[vertexIndex].y);
|
||||||
|
|
||||||
|
//outline mob
|
||||||
|
ctx.moveTo(newBlockMob.vertices[0].x, newBlockMob.vertices[0].y);
|
||||||
|
for (let j = 1; j < newBlockMob.vertices.length; j++) {
|
||||||
|
ctx.lineTo(newBlockMob.vertices[j].x, newBlockMob.vertices[j].y);
|
||||||
|
}
|
||||||
|
ctx.lineTo(newBlockMob.vertices[0].x, newBlockMob.vertices[0].y);
|
||||||
|
|
||||||
|
ctx.strokeStyle = "#0ff";
|
||||||
|
ctx.lineWidth = 3;
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
activeBeams[i][0]--; // shorten duration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
blockMob(x, y, host, growCycles = 60) {
|
||||||
|
if (host === null) {
|
||||||
|
mobs.spawn(x, y, 4, 1.25 + 3.5 * Math.random(), "#999");
|
||||||
|
} else {
|
||||||
|
const sideLength = Vector.magnitude(Vector.sub(host.vertices[0], host.vertices[1])) + Vector.magnitude(Vector.sub(host.vertices[1], host.vertices[2])) / 2 //average of first 2 sides
|
||||||
|
mobs.spawn(x, y, 4, Math.min(70, sideLength), "#999");
|
||||||
|
if (host.bounds.max.x - host.bounds.min.x < 150 && host.bounds.max.y - host.bounds.min.y < 150) {
|
||||||
|
Matter.Body.setVertices(mob[mob.length - 1], host.vertices) //if not too big match vertices of host exactly
|
||||||
|
// mob[mob.length - 1].radius =
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const me = mob[mob.length - 1];
|
||||||
|
me.damageReduction = 0.5; //only until done growing
|
||||||
|
me.isNecroMob = true
|
||||||
|
me.g = 0.00012; //required if using this.gravity
|
||||||
|
me.accelMag = 0.0003 * Math.sqrt(simulation.accelScale);
|
||||||
|
me.memory = 120;
|
||||||
|
me.leaveBody = false;
|
||||||
|
me.isDropPowerUp = false;
|
||||||
|
// me.showHealthBar = false;
|
||||||
|
me.cycle = 0
|
||||||
|
me.do = function() { //grow phase only occurs for growCycles
|
||||||
|
this.checkStatus();
|
||||||
|
this.seePlayerCheck();
|
||||||
|
|
||||||
|
if (!m.isBodiesAsleep) {
|
||||||
|
this.cycle++
|
||||||
|
if (this.cycle > growCycles) {
|
||||||
|
this.damageReduction = 1.8 //take extra damage
|
||||||
|
this.do = this.normalDo
|
||||||
|
} else {
|
||||||
|
const scale = 1.04; //if 120 use 1.02
|
||||||
|
Matter.Body.scale(this, scale, scale);
|
||||||
|
this.radius *= scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
me.normalDo = function() {
|
||||||
|
this.gravity();
|
||||||
|
this.checkStatus();
|
||||||
|
this.seePlayerCheck();
|
||||||
|
this.attraction();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
cellBossCulture(x, y, radius = 20, num = 5) {
|
cellBossCulture(x, y, radius = 20, num = 5) {
|
||||||
const cellID = Math.random()
|
const cellID = Math.random()
|
||||||
@@ -1043,7 +1189,7 @@ const spawn = {
|
|||||||
// me.friction = 0.1;
|
// me.friction = 0.1;
|
||||||
// me.frictionAir = 0;
|
// me.frictionAir = 0;
|
||||||
// me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
// me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
||||||
// me.g = me.accelMag * 0.6; //required if using 'gravity'
|
// me.g = me.accelMag * 0.6; //required if using this.gravity
|
||||||
// me.memory = 180;
|
// me.memory = 180;
|
||||||
// spawn.shield(me, x, y);
|
// spawn.shield(me, x, y);
|
||||||
// me.do = function() {
|
// me.do = function() {
|
||||||
@@ -1076,8 +1222,8 @@ const spawn = {
|
|||||||
me.friction = 0;
|
me.friction = 0;
|
||||||
me.frictionAir = 0.006;
|
me.frictionAir = 0.006;
|
||||||
me.lookTorque = 0.0000008; //controls spin while looking for player
|
me.lookTorque = 0.0000008; //controls spin while looking for player
|
||||||
me.g = 0.0002; //required if using 'gravity'
|
me.g = 0.0002; //required if using this.gravity
|
||||||
me.seePlayerFreq = Math.round((40 + 25 * Math.random()) * simulation.lookFreqScale);
|
me.seePlayerFreq = Math.floor((40 + 25 * Math.random()));
|
||||||
const springStiffness = 0.00014;
|
const springStiffness = 0.00014;
|
||||||
const springDampening = 0.0005;
|
const springDampening = 0.0005;
|
||||||
|
|
||||||
@@ -1127,7 +1273,7 @@ const spawn = {
|
|||||||
mobs.spawn(x, y, 5, radius, "rgb(0,200,180)");
|
mobs.spawn(x, y, 5, radius, "rgb(0,200,180)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.accelMag = 0.04;
|
me.accelMag = 0.04;
|
||||||
me.g = 0.0017; //required if using 'gravity'
|
me.g = 0.0017; //required if using this.gravity
|
||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.friction = 1
|
me.friction = 1
|
||||||
me.frictionStatic = 1
|
me.frictionStatic = 1
|
||||||
@@ -1167,7 +1313,7 @@ const spawn = {
|
|||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.isBoss = true;
|
me.isBoss = true;
|
||||||
|
|
||||||
me.g = 0.005; //required if using 'gravity'
|
me.g = 0.005; //required if using this.gravity
|
||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.friction = 1
|
me.friction = 1
|
||||||
me.frictionStatic = 1
|
me.frictionStatic = 1
|
||||||
@@ -1505,8 +1651,8 @@ const spawn = {
|
|||||||
me.friction = 0;
|
me.friction = 0;
|
||||||
me.frictionAir = 0.0067;
|
me.frictionAir = 0.0067;
|
||||||
me.lookTorque = 0.0000008; //controls spin while looking for player
|
me.lookTorque = 0.0000008; //controls spin while looking for player
|
||||||
me.g = 0.0002; //required if using 'gravity'
|
me.g = 0.0002; //required if using this.gravity
|
||||||
me.seePlayerFreq = Math.round((30 + 20 * Math.random()) * simulation.lookFreqScale);
|
me.seePlayerFreq = Math.floor((30 + 20 * Math.random()));
|
||||||
const springStiffness = 0.00014;
|
const springStiffness = 0.00014;
|
||||||
const springDampening = 0.0005;
|
const springDampening = 0.0005;
|
||||||
|
|
||||||
@@ -1865,7 +2011,7 @@ const spawn = {
|
|||||||
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
|
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
|
||||||
Matter.Body.rotate(me, Math.random() * Math.PI * 2);
|
Matter.Body.rotate(me, Math.random() * Math.PI * 2);
|
||||||
me.accelMag = 0.00018 * Math.sqrt(simulation.accelScale);
|
me.accelMag = 0.00018 * Math.sqrt(simulation.accelScale);
|
||||||
me.seePlayerFreq = Math.floor(30 * simulation.lookFreqScale);
|
me.seePlayerFreq = 30
|
||||||
me.memory = 420;
|
me.memory = 420;
|
||||||
me.restitution = 1;
|
me.restitution = 1;
|
||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
@@ -2006,7 +2152,7 @@ const spawn = {
|
|||||||
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
|
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
|
||||||
Matter.Body.rotate(me, Math.random() * Math.PI * 2);
|
Matter.Body.rotate(me, Math.random() * Math.PI * 2);
|
||||||
me.accelMag = 0.00055 * Math.sqrt(simulation.accelScale);
|
me.accelMag = 0.00055 * Math.sqrt(simulation.accelScale);
|
||||||
me.seePlayerFreq = Math.floor(30 * simulation.lookFreqScale);
|
me.seePlayerFreq = 30;
|
||||||
me.memory = 420;
|
me.memory = 420;
|
||||||
me.restitution = 1;
|
me.restitution = 1;
|
||||||
me.frictionAir = 0.05;
|
me.frictionAir = 0.05;
|
||||||
@@ -2634,7 +2780,7 @@ const spawn = {
|
|||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.isVerticesChange = true
|
me.isVerticesChange = true
|
||||||
me.accelMag = 0.0006 * simulation.accelScale;
|
me.accelMag = 0.0006 * simulation.accelScale;
|
||||||
// me.g = 0.0002; //required if using 'gravity'
|
// me.g = 0.0002; //required if using this.gravity
|
||||||
me.delay = 360 * simulation.CDScale;
|
me.delay = 360 * simulation.CDScale;
|
||||||
me.spikeVertex = 0;
|
me.spikeVertex = 0;
|
||||||
me.spikeLength = 0;
|
me.spikeLength = 0;
|
||||||
@@ -2712,7 +2858,7 @@ const spawn = {
|
|||||||
mobs.spawn(x, y, 5, radius, "rgb(221,102,119)");
|
mobs.spawn(x, y, 5, radius, "rgb(221,102,119)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.accelMag = 0.00034 * simulation.accelScale;
|
me.accelMag = 0.00034 * simulation.accelScale;
|
||||||
me.g = 0.00015; //required if using 'gravity'
|
me.g = 0.00015; //required if using this.gravity
|
||||||
me.frictionStatic = 0;
|
me.frictionStatic = 0;
|
||||||
me.friction = 0;
|
me.friction = 0;
|
||||||
me.delay = 90 * simulation.CDScale;
|
me.delay = 90 * simulation.CDScale;
|
||||||
@@ -2768,7 +2914,7 @@ const spawn = {
|
|||||||
Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger
|
Matter.Body.setDensity(me, 0.002); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.g = 0.0002; //required if using 'gravity'
|
me.g = 0.0002; //required if using this.gravity
|
||||||
me.stroke = "transparent"; //used for drawSneaker
|
me.stroke = "transparent"; //used for drawSneaker
|
||||||
me.alpha = 1; //used in drawSneaker
|
me.alpha = 1; //used in drawSneaker
|
||||||
// me.leaveBody = false;
|
// me.leaveBody = false;
|
||||||
@@ -2882,7 +3028,7 @@ const spawn = {
|
|||||||
// me.blinkLength = 150 + Math.round(Math.random() * 200); //required for blink
|
// me.blinkLength = 150 + Math.round(Math.random() * 200); //required for blink
|
||||||
// me.isStatic = true;
|
// me.isStatic = true;
|
||||||
// me.memory = 360;
|
// me.memory = 360;
|
||||||
// me.seePlayerFreq = Math.round((40 + 30 * Math.random()) * simulation.lookFreqScale);
|
// me.seePlayerFreq = Math.round((40 + 30 * Math.random()));
|
||||||
// // me.isBig = false;
|
// // me.isBig = false;
|
||||||
// // me.scaleMag = Math.max(5 - me.mass, 1.75);
|
// // me.scaleMag = Math.max(5 - me.mass, 1.75);
|
||||||
// me.onDeath = function () {
|
// me.onDeath = function () {
|
||||||
@@ -2931,7 +3077,7 @@ const spawn = {
|
|||||||
me.hoverElevation = 460 + (Math.random() - 0.5) * 200; //squared
|
me.hoverElevation = 460 + (Math.random() - 0.5) * 200; //squared
|
||||||
me.hoverXOff = (Math.random() - 0.5) * 100;
|
me.hoverXOff = (Math.random() - 0.5) * 100;
|
||||||
me.accelMag = Math.floor(10 * (Math.random() + 4.5)) * 0.00001 * simulation.accelScale;
|
me.accelMag = Math.floor(10 * (Math.random() + 4.5)) * 0.00001 * simulation.accelScale;
|
||||||
me.g = 0.0002; //required if using 'gravity' // gravity called in hoverOverPlayer
|
me.g = 0.0002; //required if using this.gravity // gravity called in hoverOverPlayer
|
||||||
me.frictionStatic = 0;
|
me.frictionStatic = 0;
|
||||||
me.friction = 0;
|
me.friction = 0;
|
||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
@@ -3062,7 +3208,7 @@ const spawn = {
|
|||||||
};
|
};
|
||||||
Matter.Body.setDensity(me, 0.00004); //normal is 0.001
|
Matter.Body.setDensity(me, 0.00004); //normal is 0.001
|
||||||
me.timeLeft = 200;
|
me.timeLeft = 200;
|
||||||
me.g = 0.001; //required if using 'gravity'
|
me.g = 0.001; //required if using this.gravity
|
||||||
me.frictionAir = 0;
|
me.frictionAir = 0;
|
||||||
me.restitution = 0.8;
|
me.restitution = 0.8;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
@@ -3114,7 +3260,7 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
|
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
|
||||||
me.timeLeft = 140 + Math.floor(Math.random() * 30);
|
me.timeLeft = 140 + Math.floor(Math.random() * 30);
|
||||||
me.g = 0.001; //required if using 'gravity'
|
me.g = 0.001; //required if using this.gravity
|
||||||
me.frictionAir = 0;
|
me.frictionAir = 0;
|
||||||
me.restitution = 1;
|
me.restitution = 1;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
@@ -3254,7 +3400,7 @@ const spawn = {
|
|||||||
};
|
};
|
||||||
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
|
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
|
||||||
me.timeLeft = 120;
|
me.timeLeft = 120;
|
||||||
// me.g = 0.0005; //required if using 'gravity'
|
// me.g = 0.0005; //required if using this.gravity
|
||||||
me.frictionAir = 0;
|
me.frictionAir = 0;
|
||||||
me.restitution = 0;
|
me.restitution = 0;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
@@ -3486,7 +3632,7 @@ const spawn = {
|
|||||||
|
|
||||||
me.lifeSpan = lifeSpan;
|
me.lifeSpan = lifeSpan;
|
||||||
me.timeLeft = me.lifeSpan;
|
me.timeLeft = me.lifeSpan;
|
||||||
// me.g = 0.0002; //required if using 'gravity'
|
// me.g = 0.0002; //required if using this.gravity
|
||||||
me.frictionAir = 0;
|
me.frictionAir = 0;
|
||||||
me.restitution = 0.8;
|
me.restitution = 0.8;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
@@ -3701,7 +3847,7 @@ const spawn = {
|
|||||||
spawner(x, y, radius = 55 + Math.ceil(Math.random() * 50)) {
|
spawner(x, y, radius = 55 + Math.ceil(Math.random() * 50)) {
|
||||||
mobs.spawn(x, y, 4, radius, "rgb(255,150,0)");
|
mobs.spawn(x, y, 4, radius, "rgb(255,150,0)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.g = 0.0004; //required if using 'gravity'
|
me.g = 0.0004; //required if using this.gravity
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
// me.isDropPowerUp = false;
|
// me.isDropPowerUp = false;
|
||||||
me.onDeath = function() { //run this function on death
|
me.onDeath = function() { //run this function on death
|
||||||
@@ -3731,12 +3877,12 @@ const spawn = {
|
|||||||
me.collisionFilter.mask = cat.player | cat.bullet | cat.body | cat.map | cat.mob
|
me.collisionFilter.mask = cat.player | cat.bullet | cat.body | cat.map | cat.mob
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
Matter.Body.setDensity(me, 0.0001); //normal is 0.001
|
Matter.Body.setDensity(me, 0.0001); //normal is 0.001
|
||||||
me.g = 0.00002; //required if using 'gravity'
|
me.g = 0.00002; //required if using this.gravity
|
||||||
me.accelMag = 0.00012 * simulation.accelScale;
|
me.accelMag = 0.00012 * simulation.accelScale;
|
||||||
// me.memory = 30;
|
// me.memory = 30;
|
||||||
me.isDropPowerUp = false
|
me.isDropPowerUp = false
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.seePlayerFreq = Math.round((80 + 50 * Math.random()) * simulation.lookFreqScale);
|
me.seePlayerFreq = Math.floor((80 + 50 * Math.random()));
|
||||||
me.frictionAir = 0.004;
|
me.frictionAir = 0.004;
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
this.gravity();
|
this.gravity();
|
||||||
@@ -3755,7 +3901,7 @@ const spawn = {
|
|||||||
// me.onHit = function() { //run this function on hitting player
|
// me.onHit = function() { //run this function on hitting player
|
||||||
// this.explode();
|
// this.explode();
|
||||||
// };
|
// };
|
||||||
// me.g = 0.0003; //required if using 'gravity'
|
// me.g = 0.0003; //required if using this.gravity
|
||||||
// me.seePlayerFreq = 50 + Math.floor(Math.random() * 20)
|
// me.seePlayerFreq = 50 + Math.floor(Math.random() * 20)
|
||||||
// me.do = function() {
|
// me.do = function() {
|
||||||
// this.gravity();
|
// this.gravity();
|
||||||
@@ -3799,7 +3945,7 @@ const spawn = {
|
|||||||
//run this function on hitting player
|
//run this function on hitting player
|
||||||
this.explode();
|
this.explode();
|
||||||
};
|
};
|
||||||
me.g = 0.0004; //required if using 'gravity'
|
me.g = 0.0004; //required if using this.gravity
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
this.gravity();
|
this.gravity();
|
||||||
this.seePlayerCheck();
|
this.seePlayerCheck();
|
||||||
@@ -3807,7 +3953,7 @@ const spawn = {
|
|||||||
this.attraction();
|
this.attraction();
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
snakeSpitBoss(x, y, radius = 50) { //snake boss with a laser head
|
snakeSpitBoss(x, y, radius = 50) {
|
||||||
const nodes = Math.min(8 + Math.ceil(0.5 * simulation.difficulty), 40)
|
const nodes = Math.min(8 + Math.ceil(0.5 * simulation.difficulty), 40)
|
||||||
let angle = Math.PI
|
let angle = Math.PI
|
||||||
let mag = 300
|
let mag = 300
|
||||||
@@ -3834,14 +3980,14 @@ const spawn = {
|
|||||||
me.closestVertex1 = 0;
|
me.closestVertex1 = 0;
|
||||||
// me.closestVertex2 = 1;
|
// me.closestVertex2 = 1;
|
||||||
me.cycle = 0
|
me.cycle = 0
|
||||||
me.damageReduction = 0.25
|
me.damageReduction = 0.2
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
// this.armor();
|
// this.armor();
|
||||||
this.seePlayerByHistory()
|
this.seePlayerByHistory()
|
||||||
this.checkStatus();
|
this.checkStatus();
|
||||||
this.attraction();
|
this.attraction();
|
||||||
this.cycle++
|
this.cycle++
|
||||||
if (this.seePlayer.recall && ((this.cycle % 15) === 0) && !m.isBodiesAsleep) {
|
if (this.seePlayer.recall && ((this.cycle % 10) === 0) && !m.isBodiesAsleep) {
|
||||||
if (this.canFire) {
|
if (this.canFire) {
|
||||||
if (this.cycle > 120) {
|
if (this.cycle > 120) {
|
||||||
this.cycle = 0
|
this.cycle = 0
|
||||||
@@ -4032,7 +4178,7 @@ const spawn = {
|
|||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.isBoss = true;
|
me.isBoss = true;
|
||||||
|
|
||||||
me.g = 0.0001; //required if using 'gravity'
|
me.g = 0.0001; //required if using this.gravity
|
||||||
me.accelMag = 0.002 * simulation.accelScale;
|
me.accelMag = 0.002 * simulation.accelScale;
|
||||||
me.memory = 20;
|
me.memory = 20;
|
||||||
Matter.Body.setDensity(me, 0.0005 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
Matter.Body.setDensity(me, 0.0005 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
|
|||||||
16
js/tech.js
16
js/tech.js
@@ -306,9 +306,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.inventory.length > 0
|
return b.inventory.length > 2
|
||||||
},
|
},
|
||||||
requires: "at least 1 gun",
|
requires: "at least 3 guns",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isDamageForGuns = true;
|
tech.isDamageForGuns = true;
|
||||||
},
|
},
|
||||||
@@ -324,9 +324,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.inventory.length > 0
|
return b.inventory.length > 1
|
||||||
},
|
},
|
||||||
requires: "at least 1 gun",
|
requires: "at least 2 guns",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFireRateForGuns = true;
|
tech.isFireRateForGuns = true;
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
@@ -2405,7 +2405,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "energy conservation",
|
name: "energy conservation",
|
||||||
description: "<strong>6%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",
|
description: "<strong>5%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
@@ -2415,7 +2415,7 @@
|
|||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
tech.energySiphon += 0.06;
|
tech.energySiphon += 0.05;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.energySiphon = 0;
|
tech.energySiphon = 0;
|
||||||
@@ -5053,7 +5053,7 @@
|
|||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.laserFieldDrain = 0.002;
|
tech.laserFieldDrain = 0.002;
|
||||||
tech.laserDamage = 0.16; //used in check on pulse: tech.laserDamage === 0.15
|
tech.laserDamage = 0.16; //used in check on pulse: tech.laserDamage === 0.16
|
||||||
tech.laserColor = "#f00"
|
tech.laserColor = "#f00"
|
||||||
tech.laserColorAlpha = "rgba(255, 0, 0, 0.5)"
|
tech.laserColorAlpha = "rgba(255, 0, 0, 0.5)"
|
||||||
}
|
}
|
||||||
@@ -5219,7 +5219,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDamage === 0.15
|
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDamage === 0.16
|
||||||
},
|
},
|
||||||
requires: "laser gun, not specular reflection, diffuse, free-electron laser",
|
requires: "laser gun, not specular reflection, diffuse, free-electron laser",
|
||||||
effect() {
|
effect() {
|
||||||
|
|||||||
@@ -725,7 +725,7 @@ summary {
|
|||||||
height: 11px;
|
height: 11px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: #578;
|
background-color: #467;
|
||||||
border: 0.5px #fff solid;
|
border: 0.5px #fff solid;
|
||||||
opacity: 0.95;
|
opacity: 0.95;
|
||||||
margin-bottom: -2px;
|
margin-bottom: -2px;
|
||||||
|
|||||||
38
todo.txt
38
todo.txt
@@ -1,26 +1,40 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
orbs replaces some power up text descriptions
|
blockBoss: new boss based on work by TheShwarma
|
||||||
|
(3x chance to randomly see blockBoss until next patch)
|
||||||
|
it's over powered, I'll probably nerf it next patch, but I want to get some feedback first on how to nerf it
|
||||||
|
hint: if you kill the boss all the mobBlocks turn back into blocks
|
||||||
|
|
||||||
player damage taken is increased by 1%
|
very very small blocks are slightly limited in how fast they can be thrown
|
||||||
finalBoss ramps up the mob spawns more slowly, making lower damage high survival builds more effective on the finalBoss
|
they were moving so fast they would miss their target sometimes
|
||||||
5% laser damage increase
|
|
||||||
15% mine fire rate reduction
|
|
||||||
|
|
||||||
ctx.clip() is back for metamaterial cloaking field
|
tech: energy conservation gives 5% energy back (was 6%)
|
||||||
it wasn't the source of the lag, firefox is just slow on my work computer
|
tech: arsenal requires at least 3 guns in your inventory
|
||||||
tech: buckling was disallowed, but I fixed it so you can get the tech again
|
tech: active cooling requires at least 2 guns in your inventory
|
||||||
|
|
||||||
|
several bug fixes
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
fix simulation.CDScale // it's always zero so it does nothing
|
||||||
|
some mobs can't see player...
|
||||||
|
3 laser boss isn't rotating...
|
||||||
|
it's always null
|
||||||
|
you shouldn't of removes lookFrequency scale var...
|
||||||
|
|
||||||
|
tech remove all JUNK tech
|
||||||
|
but you can't research
|
||||||
|
maybe spend research
|
||||||
|
|
||||||
|
tech missiles - move faster and more accurately, turn sharper
|
||||||
|
also some other bonus:
|
||||||
|
damage? or size which is basically damage
|
||||||
|
|
||||||
experiment and understand vibe more obvious
|
experiment and understand vibe more obvious
|
||||||
mostly in early game or first time players
|
mostly in early game or first time players
|
||||||
|
|
||||||
slow down throw speed for very small blocks a bit
|
|
||||||
|
|
||||||
necrophage isn't working.....
|
work on blockBoss from TheShwarma
|
||||||
|
|
||||||
work on necroBoss from TheShwarma
|
|
||||||
make spawned blocks in the direction of the player
|
make spawned blocks in the direction of the player
|
||||||
make it search the level for blocks, but also kinda avoid the player
|
make it search the level for blocks, but also kinda avoid the player
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user