plasma ball version 3.0
plasma ball once released explodes on mobs or map slows mobs grows at 2x rate if you have energy above max player is slowed when holding plasma ball every 20 cycles damage a nearby mob next patch plasma ball tech
This commit is contained in:
356
js/level.js
356
js/level.js
@@ -9,7 +9,7 @@ const level = {
|
||||
levelsCleared: 0,
|
||||
//see level.populateLevels: (intro, ... , reservoir, reactor, ... , gauntlet, final) added later
|
||||
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion"],
|
||||
communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel"],
|
||||
communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands"],
|
||||
trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"],
|
||||
levels: [],
|
||||
start() {
|
||||
@@ -20,7 +20,7 @@ const level = {
|
||||
// tech.giveTech("grappling hook")
|
||||
// tech.giveTech("capacitor bank")
|
||||
// for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech");
|
||||
// for (let i = 0; i < 9; i++) tech.giveTech("dynamo-bot")
|
||||
// for (let i = 0; i < 9; i++) tech.giveTech("overcharge")
|
||||
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
|
||||
// powerUps.research.changeRerolls(100000)
|
||||
// for (let i = 0; i < 2; i++) tech.giveTech("undefined")
|
||||
@@ -31,7 +31,7 @@ const level = {
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||
// level.reactor();
|
||||
// level.islands();
|
||||
// level.testing(); //not in rotation, used for testing
|
||||
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
|
||||
// powerUps.research.changeRerolls(3000)
|
||||
@@ -113,7 +113,7 @@ const level = {
|
||||
for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit
|
||||
// for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start
|
||||
}
|
||||
if (m.plasmaBall) m.plasmaBall.isOn = false
|
||||
if (m.plasmaBall) this.reset()
|
||||
},
|
||||
trainingText(say) {
|
||||
simulation.lastLogTime = 0; //clear previous messages
|
||||
@@ -2544,8 +2544,8 @@ const level = {
|
||||
level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why
|
||||
m.addHealth(Infinity)
|
||||
|
||||
spawn.starter(1900, -500, 200) //big boy
|
||||
// for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
|
||||
// spawn.starter(1900, -500, 200) //big boy
|
||||
for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
|
||||
// spawn.slashBoss(1900, -500)
|
||||
// spawn.launcherBoss(3200, -500)
|
||||
// spawn.laserTargetingBoss(1700, -500)
|
||||
@@ -8932,6 +8932,350 @@ const level = {
|
||||
initialSpawn == true;
|
||||
}
|
||||
},
|
||||
islands() {
|
||||
const boost1 = level.boost(58500, -18264, 1300);
|
||||
let portal2, portal3;
|
||||
// const removeIndex1 = map.length - 1;
|
||||
const drip1 = level.drip(59300, -18975, -18250, 100); // drip(x, yMin, yMax, period = 100, color = "hsla(160, 100%, 35%, 0.5)") {
|
||||
const drip2 = level.drip(60000, -18953, -18250, 150);
|
||||
const drip3 = level.drip(60905, -18652, -18250, 70);
|
||||
const slimePit1 = level.hazard(58850, -18300, 2275, 100, 0.01); //hazard(x, y, width, height, damage = 0.003) spawn.mapRect(58850, -18300, 2275, 100);
|
||||
const slimePit2 = level.hazard(74400, -18075, 350, 100, 0.01);
|
||||
let isSpawnedBoss = false;
|
||||
level.custom = () => {
|
||||
level.exit.drawAndCheck();
|
||||
boost1.query();
|
||||
level.enter.draw();
|
||||
drip1.draw();
|
||||
drip2.draw();
|
||||
drip3.draw();
|
||||
// portal[2].query();
|
||||
// portal[3].query();
|
||||
// portal[0].draw();
|
||||
// portal[1].draw();
|
||||
// portal[2].draw();
|
||||
// portal[3].draw();
|
||||
portal2[2].query();
|
||||
portal2[3].query();
|
||||
portal2[0].draw();
|
||||
portal2[1].draw();
|
||||
portal2[2].draw();
|
||||
portal2[3].draw();
|
||||
portal3[2].query();
|
||||
portal3[3].query();
|
||||
portal3[0].draw();
|
||||
portal3[1].draw();
|
||||
portal3[2].draw();
|
||||
portal3[3].draw();
|
||||
};
|
||||
level.customTopLayer = () => {
|
||||
slimePit1.query();
|
||||
slimePit2.query();
|
||||
ctx.fillStyle = `rgba(68, 68, 68, ${Math.max(0.3,Math.min((-17650 - m.pos.y) / 100, 0.99))})`;
|
||||
ctx.fillRect(58390, -17655, 1490, 740);
|
||||
};
|
||||
level.setPosToSpawn(57680, -18330);
|
||||
level.exit.x = 76343;
|
||||
level.exit.y = -18020;
|
||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 30);
|
||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 30);
|
||||
level.defaultZoom = 2000;
|
||||
simulation.zoomTransition(level.defaultZoom);
|
||||
document.body.style.backgroundColor = "#00000";
|
||||
// spawn.setSpawnList = [
|
||||
// "hopper",
|
||||
// "slasher",
|
||||
// "striker",
|
||||
// "stabber",
|
||||
// "springer",
|
||||
// "pulsar",
|
||||
// "sneaker",
|
||||
// "spinner",
|
||||
// "grower",
|
||||
// "focuser",
|
||||
// "spawner",
|
||||
// ];
|
||||
spawn.mapRect(57800, -18550, 50, 100);
|
||||
spawn.mapRect(57500, -18550, 50, 275);
|
||||
spawn.mapRect(66900, -18675, 300, 200);
|
||||
spawn.mapRect(66925, -19050, 125, 225);
|
||||
spawn.mapRect(67825, -16975, 125, 100);
|
||||
spawn.mapRect(74900, -18075, 225, 100);
|
||||
spawn.mapRect(73925, -18225, 150, 275);
|
||||
spawn.mapRect(76200, -18325, 50, 125);
|
||||
spawn.mapRect(76525, -18325, 75, 400);
|
||||
spawn.mapRect(61325, -18350, 50, 25);
|
||||
spawn.mapRect(61450, -18425, 50, 25);
|
||||
spawn.mapRect(61475, -18450, 25, 25);
|
||||
spawn.mapRect(58725, -18350, 125, 50);
|
||||
spawn.mapRect(58675, -18275, 50, 75);
|
||||
spawn.mapRect(58600, -18275, 75, 75);
|
||||
spawn.mapRect(58675, -18325, 50, 50);
|
||||
spawn.mapRect(58250, -16925, 1825, 1050);
|
||||
spawn.mapRect(57500, -18200, 4475, 550);
|
||||
spawn.mapRect(61500, -18475, 475, 275);
|
||||
spawn.mapRect(62175, -18575, 325, 400);
|
||||
spawn.mapRect(62900, -18850, 525, 375);
|
||||
spawn.mapRect(63900, -18925, 450, 400);
|
||||
spawn.mapRect(64725, -19000, 625, 500);
|
||||
spawn.mapRect(65825, -19050, 675, 400);
|
||||
spawn.mapRect(66800, -18950, 400, 400);
|
||||
spawn.mapRect(68775, -18850, 525, 400);
|
||||
spawn.mapRect(67375, -16900, 1800, 1450);
|
||||
spawn.mapRect(67375, -17475, 325, 575);
|
||||
spawn.mapRect(68900, -17500, 250, 500);
|
||||
spawn.mapRect(69425, -17050, 500, 475);
|
||||
spawn.mapRect(70400, -17150, 425, 175);
|
||||
spawn.mapRect(71175, -17325, 450, 325);
|
||||
spawn.mapRect(72000, -17425, 325, 300);
|
||||
spawn.mapRect(72725, -17450, 350, 275);
|
||||
spawn.mapRect(70050, -18800, 550, 350);
|
||||
spawn.mapRect(67750, -19400, 375, 1200);
|
||||
spawn.mapRect(67750, -18200, 1425, 700);
|
||||
spawn.mapRect(66800, -18550, 575, 1650);
|
||||
spawn.mapRect(66800, -16900, 575, 1450);
|
||||
spawn.mapRect(67350, -18175, 250, 750);
|
||||
spawn.mapRect(71050, -18450, 725, 275);
|
||||
spawn.mapRect(72100, -18150, 475, 200);
|
||||
spawn.mapRect(73325, -17975, 3275, 475);
|
||||
spawn.mapRect(73175, -17775, 150, 300);
|
||||
spawn.mapRect(72975, -17675, 225, 250);
|
||||
spawn.mapRect(76200, -18325, 400, 75);
|
||||
spawn.mapRect(76525, -18250, 75, 275);
|
||||
spawn.mapRect(76200, -18250, 50, 50);
|
||||
spawn.mapRect(57500, -17675, 900, 1800);
|
||||
spawn.mapRect(59875, -17675, 1975, 1800);
|
||||
spawn.mapRect(57550, -18275, 225, 75);
|
||||
spawn.mapRect(61375, -18375, 50, 50);
|
||||
spawn.mapRect(61100, -18350, 75, 50);
|
||||
spawn.mapRect(61175, -18325, 50, 25);
|
||||
spawn.mapRect(61850, -16525, 250, 175);
|
||||
spawn.mapRect(57500, -18500, 50, 325);
|
||||
spawn.mapRect(57500, -18550, 350, 50);
|
||||
spawn.mapRect(57800, -18500, 50, 50);
|
||||
spawn.mapRect(61275, -18325, 375, 125);
|
||||
spawn.mapRect(61425, -18400, 200, 75);
|
||||
spawn.mapRect(62125, -18575, 125, 75);
|
||||
spawn.mapRect(62250, -18200, 175, 125);
|
||||
spawn.mapRect(62850, -18725, 100, 75);
|
||||
spawn.mapRect(63075, -18550, 225, 225);
|
||||
spawn.mapRect(62800, -18275, 75, 75);
|
||||
spawn.mapRect(62500, -18475, 75, 50);
|
||||
spawn.mapRect(63825, -18900, 150, 50);
|
||||
spawn.mapRect(63950, -18575, 150, 125);
|
||||
spawn.mapRect(64200, -18550, 100, 250);
|
||||
spawn.mapRect(64925, -18525, 200, 275);
|
||||
spawn.mapRect(64625, -18425, 75, 125);
|
||||
spawn.mapRect(65225, -18675, 150, 175);
|
||||
spawn.mapRect(65350, -18950, 75, 100);
|
||||
spawn.mapRect(65950, -18575, 75, 150);
|
||||
spawn.mapRect(66000, -18725, 225, 175);
|
||||
spawn.mapRect(66275, -18675, 75, 125);
|
||||
spawn.mapRect(66275, -18550, 75, 75);
|
||||
spawn.mapRect(66150, -18550, 100, 50);
|
||||
spawn.mapRect(66225, -18875, 25, 150);
|
||||
spawn.mapRect(66200, -18750, 75, 25);
|
||||
spawn.mapRect(66925, -19100, 125, 150);
|
||||
spawn.mapRect(66000, -19100, 75, 50);
|
||||
spawn.mapRect(65000, -19075, 100, 75);
|
||||
spawn.mapRect(66750, -18625, 100, 100);
|
||||
spawn.mapRect(68050, -18500, 350, 350);
|
||||
spawn.mapRect(68125, -18975, 150, 475);
|
||||
spawn.mapRect(69850, -18675, 150, 200);
|
||||
spawn.mapRect(70000, -18625, 150, 50);
|
||||
spawn.mapRect(68850, -18575, 325, 225);
|
||||
spawn.mapRect(69100, -18400, 75, 100);
|
||||
spawn.mapRect(70150, -18525, 125, 200);
|
||||
spawn.mapRect(70425, -18525, 125, 200);
|
||||
spawn.mapRect(70250, -18350, 175, 225);
|
||||
spawn.mapRect(70325, -18475, 50, 150);
|
||||
spawn.mapRect(70275, -18450, 150, 150);
|
||||
spawn.mapRect(71175, -18250, 525, 250);
|
||||
spawn.mapRect(71050, -18200, 150, 375);
|
||||
spawn.mapRect(70925, -18300, 200, 250);
|
||||
spawn.mapRect(71425, -18525, 175, 150);
|
||||
spawn.mapRect(70225, -18950, 275, 250);
|
||||
spawn.mapRect(70475, -17050, 225, 175);
|
||||
spawn.mapRect(70625, -17250, 100, 150);
|
||||
spawn.mapRect(71300, -17150, 200, 350);
|
||||
spawn.mapRect(71100, -17250, 125, 100);
|
||||
spawn.mapRect(71550, -17400, 150, 150);
|
||||
spawn.mapRect(67675, -17150, 225, 300);
|
||||
spawn.mapRect(68225, -17000, 100, 125);
|
||||
spawn.mapRect(67900, -16975, 375, 100);
|
||||
spawn.mapRect(68275, -16950, 150, 50);
|
||||
spawn.bodyRect(76200, -18200, 50, 200);
|
||||
spawn.mapRect(76200, -18000, 50, 25);
|
||||
spawn.bodyRect(57800, -18450, 50, 175);
|
||||
spawn.mapRect(68725, -17600, 300, 250);
|
||||
spawn.mapRect(68625, -17550, 175, 100);
|
||||
spawn.mapRect(68850, -17400, 150, 125);
|
||||
spawn.mapRect(69325, -16900, 200, 225);
|
||||
spawn.mapRect(69575, -16625, 175, 275);
|
||||
spawn.mapRect(69850, -16875, 250, 200);
|
||||
spawn.mapRect(69875, -16650, 150, 300);
|
||||
spawn.mapRect(69825, -16800, 375, 325);
|
||||
spawn.mapRect(69650, -16775, 325, 475);
|
||||
spawn.mapRect(71975, -17325, 100, 125);
|
||||
spawn.mapRect(72075, -17200, 150, 150);
|
||||
spawn.mapRect(72275, -17350, 150, 150);
|
||||
spawn.mapRect(72325, -17275, 150, 225);
|
||||
spawn.mapRect(72225, -18050, 200, 225);
|
||||
spawn.mapRect(71925, -18150, 250, 175);
|
||||
spawn.mapRect(72075, -18275, 125, 175);
|
||||
spawn.mapRect(72500, -18025, 125, 175);
|
||||
spawn.mapRect(72400, -17975, 150, 175);
|
||||
spawn.mapRect(73925, -18225, 350, 275);
|
||||
spawn.mapRect(74750, -18125, 275, 175);
|
||||
spawn.mapRect(74250, -18100, 150, 75);
|
||||
spawn.mapRect(74275, -18050, 200, 75);
|
||||
spawn.mapRect(73750, -18100, 275, 125);
|
||||
spawn.mapRect(73075, -17475, 3525, 300);
|
||||
spawn.mapRect(73275, -17600, 3325, 225);
|
||||
spawn.mapRect(57775, -18250, 150, 50);
|
||||
spawn.mapRect(57775, -18275, 75, 25);
|
||||
spawn.mapRect(57925, -18225, 50, 25);
|
||||
spawn.debris(68300, -17000, 3700, 16);
|
||||
spawn.mapRect(62000, -16525, 100, 200);
|
||||
spawn.mapRect(59125, -19125, 325, 200);
|
||||
spawn.mapRect(59925, -19175, 350, 225);
|
||||
spawn.mapRect(60800, -18850, 275, 200);
|
||||
spawn.mapRect(75025, -18075, 200, 100);
|
||||
spawn.mapRect(75225, -18025, 100, 50);
|
||||
spawn.bodyRect(74300, -18150, 50, 25);
|
||||
spawn.bodyRect(73850, -18150, 75, 75);
|
||||
spawn.bodyRect(74700, -18000, 75, 50);
|
||||
spawn.bodyRect(74250, -18325, 25, 25);
|
||||
spawn.bodyRect(74275, -18325, 25, 25);
|
||||
spawn.bodyRect(74275, -18325, 25, 25);
|
||||
spawn.bodyRect(74300, -18325, 100, 25);
|
||||
// portal = level.portal(
|
||||
// {
|
||||
// x: 58625,
|
||||
// y: -16925,
|
||||
// },
|
||||
// 1.5 * Math.PI,
|
||||
// {
|
||||
// //right
|
||||
// x: 58625,
|
||||
// y: -17650,
|
||||
// },
|
||||
// 2.5 * Math.PI
|
||||
// ); //right
|
||||
portal2 = level.portal({
|
||||
x: 61920,
|
||||
y: -16525,
|
||||
},
|
||||
1.5 * Math.PI, {
|
||||
//right
|
||||
x: 58400,
|
||||
y: -17325,
|
||||
},
|
||||
2 * Math.PI
|
||||
);
|
||||
portal3 = level.portal({
|
||||
x: 59865,
|
||||
y: -17300,
|
||||
},
|
||||
3 * Math.PI, {
|
||||
//right
|
||||
x: 60820,
|
||||
y: -31130,
|
||||
},
|
||||
2.5 * Math.PI
|
||||
);
|
||||
|
||||
spawn.mapRect(60275, -32250, 975, 400);
|
||||
spawn.mapRect(60375, -31925, 275, 225);
|
||||
spawn.mapRect(61025, -31950, 175, 300);
|
||||
spawn.mapRect(60825, -31725, 100, 350);
|
||||
spawn.mapRect(60675, -31875, 200, 225);
|
||||
spawn.mapRect(60225, -31950, 100, 725);
|
||||
spawn.mapRect(60250, -31525, 250, 375);
|
||||
spawn.mapRect(60675, -31475, 425, 350);
|
||||
spawn.mapRect(60625, -32500, 225, 300);
|
||||
spawn.mapRect(61025, -32325, 125, 175);
|
||||
spawn.mapRect(60375, -32325, 175, 150);
|
||||
spawn.mapRect(60250, -19075, 100, 100);
|
||||
spawn.randomMob(59850, -18825, Infinity);
|
||||
spawn.randomMob(62325, -18800, Infinity);
|
||||
spawn.randomMob(61725, -18800, Infinity);
|
||||
spawn.randomMob(63050, -19025, Infinity);
|
||||
spawn.randomMob(64100, -19200, Infinity);
|
||||
spawn.randomMob(64225, -19100, Infinity);
|
||||
spawn.randomMob(64875, -19300, Infinity);
|
||||
spawn.randomMob(65125, -19325, Infinity);
|
||||
spawn.randomMob(65850, -19275, Infinity);
|
||||
spawn.randomMob(66200, -19300, Infinity);
|
||||
spawn.randomMob(65975, -19425, Infinity);
|
||||
spawn.randomMob(67925, -19600, Infinity);
|
||||
spawn.randomMob(66975, -19275, Infinity);
|
||||
spawn.randomMob(67550, -18750, Infinity);
|
||||
spawn.randomMob(69625, -17275, Infinity);
|
||||
spawn.randomMob(70550, -17350, Infinity);
|
||||
spawn.randomMob(71375, -17475, Infinity);
|
||||
spawn.randomMob(72200, -17600, Infinity);
|
||||
spawn.randomMob(73000, -18025, Infinity);
|
||||
spawn.randomMob(73850, -18350, Infinity);
|
||||
spawn.randomMob(75725, -18300, Infinity);
|
||||
spawn.randomMob(75875, -18275, Infinity);
|
||||
spawn.randomMob(75700, -18200, Infinity);
|
||||
spawn.randomMob(75550, -18275, Infinity);
|
||||
spawn.randomMob(75825, -18150, Infinity);
|
||||
spawn.randomMob(75575, -18150, Infinity);
|
||||
spawn.randomGroup(75575, -18150, 0);
|
||||
// powerUps.spawn(59352, -17115, "tech");
|
||||
level.chain(67250, -19325, 0, true, 14, 20);
|
||||
spawn.mapRect(58725, -18300, 125, 100);
|
||||
spawn.mapRect(61100, -18300, 175, 100);
|
||||
spawn.mapRect(67175, -19375, 100, 100);
|
||||
spawn.mapRect(59125, -19125, 325, 200);
|
||||
spawn.mapRect(59925, -19175, 350, 225);
|
||||
spawn.mapRect(60800, -18850, 275, 200);
|
||||
spawn.mapRect(60850, -18725, 50, 200);
|
||||
spawn.mapRect(60950, -18675, 50, 200);
|
||||
spawn.mapRect(59975, -19025, 50, 250);
|
||||
spawn.mapRect(60125, -19025, 50, 400);
|
||||
spawn.mapRect(60075, -19025, 50, 450);
|
||||
spawn.mapRect(59425, -19075, 100, 100);
|
||||
spawn.mapRect(59175, -19000, 100, 225);
|
||||
spawn.mapRect(59325, -19000, 75, 450);
|
||||
spawn.mapRect(59050, -19000, 100, 100);
|
||||
spawn.mapRect(61050, -18775, 100, 75);
|
||||
spawn.mapRect(60725, -18850, 125, 125);
|
||||
spawn.bodyRect(61850, -16525, 250, 175);
|
||||
if (simulation.difficulty > 1) {
|
||||
spawn.randomGroup(75575, -18150, 0);
|
||||
spawn.randomLevelBoss(68450, -17300);
|
||||
}
|
||||
if (!isSpawnedBoss) {
|
||||
isSpawnedBoss = true;
|
||||
if (Math.random() < 0.33) {
|
||||
for (
|
||||
let i = 0, len = Math.min(simulation.difficulty / 20, 6); i < len;
|
||||
++i
|
||||
)
|
||||
spawn.bounceBoss(59025, -17325, 50, true);
|
||||
} else if (Math.random() < 0.5) {
|
||||
for (
|
||||
let i = 0, len = Math.min(simulation.difficulty / 9, 8); i < len;
|
||||
++i
|
||||
)
|
||||
spawn.sprayBoss(59025, -17325, 50, true);
|
||||
} else {
|
||||
for (
|
||||
let i = 0, len = Math.min(simulation.difficulty / 6, 10); i < len;
|
||||
++i
|
||||
)
|
||||
spawn.mineBoss(59025, -17325, 50, true);
|
||||
}
|
||||
// for (let i = 0, len = 3 + simulation.difficulty / 20; i < len; ++i) spawn.mantisBoss(1487 + 300 * i, -1525, 35, false)
|
||||
}
|
||||
simulation.fallHeight = -15000;
|
||||
powerUps.addResearchToLevel();
|
||||
powerUps.spawn(3000, -230, "heal");
|
||||
// level.difficultyIncrease(60)
|
||||
},
|
||||
// ********************************************************************************************************
|
||||
// ********************************************************************************************************
|
||||
// ***************************************** training levels **********************************************
|
||||
|
||||
207
js/player.js
207
js/player.js
@@ -2090,25 +2090,21 @@ const m = {
|
||||
Matter.Composite.remove(engine.world, m.plasmaBall);
|
||||
}
|
||||
if (tech.isPlasmaBall) {
|
||||
// m.plasmaBall = {
|
||||
// position: { x: m.pos.x + 10 * Math.cos(m.angle), y: m.pos.y + 10 * Math.sin(m.angle) },
|
||||
// velocity: { x: 0, y: 0 },
|
||||
// radius: 1,
|
||||
// }
|
||||
|
||||
m.plasmaBall = Bodies.circle(m.pos.x + 10 * Math.cos(m.angle), m.pos.y + 10 * Math.sin(m.angle), 1, {
|
||||
collisionFilter: {
|
||||
group: 0,
|
||||
category: 0,
|
||||
mask: 0 //cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield
|
||||
},
|
||||
// collisionFilter: {
|
||||
// group: 0,
|
||||
// category: 0,
|
||||
// mask: 0 //cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield
|
||||
// },
|
||||
isSensor: true,
|
||||
frictionAir: 0,
|
||||
alpha: 0.6,
|
||||
alpha: 0.7,
|
||||
isPopping: false,
|
||||
isAttached: false,
|
||||
isOn: false,
|
||||
drain: 0.0015,
|
||||
radiusLimit: 10,
|
||||
damage: 0.4,
|
||||
damage: 0.6,
|
||||
setPositionToNose() {
|
||||
const nose = { x: m.pos.x + 10 * Math.cos(m.angle), y: m.pos.y + 10 * Math.sin(m.angle) }
|
||||
Matter.Body.setPosition(this, Vector.add(nose, Vector.mult(Vector.normalise(Vector.sub(nose, m.pos)), this.circleRadius)));
|
||||
@@ -2128,38 +2124,124 @@ const m = {
|
||||
},
|
||||
scale(scale) {
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
|
||||
if (this.circleRadius < this.radiusLimit) this.isOn = false
|
||||
if (this.circleRadius < this.radiusLimit) this.reset()
|
||||
},
|
||||
reset() {
|
||||
const scale = 1 / m.plasmaBall.circleRadius
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //grow
|
||||
this.alpha = 0.7
|
||||
this.isOn = false
|
||||
this.isPopping = false
|
||||
},
|
||||
do() {
|
||||
if (this.isOn) {
|
||||
//collisions with map
|
||||
if (Matter.Query.collides(this, map).length > 0) {
|
||||
if (this.isAttached) {
|
||||
this.scale(Math.max(0.9, 1 - 0.05 / m.plasmaBall.circleRadius))
|
||||
this.scale(Math.max(0.9, 0.998 - 0.1 / m.plasmaBall.circleRadius))
|
||||
} else {
|
||||
this.scale(Math.max(0.9, 0.98 - 0.05 / m.plasmaBall.circleRadius))
|
||||
if (this.speed > 2.5) {
|
||||
const scale = 0.96
|
||||
Matter.Body.setVelocity(this, {
|
||||
x: scale * this.velocity.x,
|
||||
y: scale * this.velocity.y
|
||||
});
|
||||
}
|
||||
this.isPopping = true
|
||||
}
|
||||
}
|
||||
if (this.isPopping) {
|
||||
this.alpha -= 0.03
|
||||
if (this.alpha < 0.1) {
|
||||
this.reset()
|
||||
} else {
|
||||
const scale = 1.04 + 4 / Math.max(1, m.plasmaBall.circleRadius)
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //grow
|
||||
}
|
||||
// if (this.speed > 2.5) {
|
||||
// const slow = 0.9
|
||||
// Matter.Body.setVelocity(this, {
|
||||
// x: slow * this.velocity.x,
|
||||
// y: slow * this.velocity.y
|
||||
// });
|
||||
// }
|
||||
}
|
||||
//collisions with mobs
|
||||
const whom = Matter.Query.collides(this, mob)
|
||||
// const whom = Matter.Query.collides(this, mob)
|
||||
// const dmg = this.damage * m.dmgScale
|
||||
// for (let i = 0, len = whom.length; i < len; i++) {
|
||||
// const mobHit = (who) => {
|
||||
// if (who.alive) {
|
||||
// if (!this.isAttached && !who.isMobBullet) this.isPopping = true
|
||||
// who.damage(dmg);
|
||||
// // if (who.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius))
|
||||
// if (who.speed > 5) {
|
||||
// Matter.Body.setVelocity(who, { //friction
|
||||
// x: who.velocity.x * 0.6,
|
||||
// y: who.velocity.y * 0.6
|
||||
// });
|
||||
// } else {
|
||||
// Matter.Body.setVelocity(who, { //friction
|
||||
// x: who.velocity.x * 0.93,
|
||||
// y: who.velocity.y * 0.93
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// mobHit(whom[i].bodyA)
|
||||
// mobHit(whom[i].bodyB)
|
||||
// }
|
||||
|
||||
//damage nearby mobs
|
||||
const dmg = this.damage * m.dmgScale
|
||||
for (let i = 0, len = whom.length; i < len; i++) {
|
||||
if (whom[i].bodyA.alive) {
|
||||
whom[i].bodyA.damage(dmg);
|
||||
if (whom[i].bodyA.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius))
|
||||
}
|
||||
if (whom[i].bodyB.alive) {
|
||||
whom[i].bodyB.damage(dmg);
|
||||
if (whom[i].bodyB.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius))
|
||||
const arcList = []
|
||||
for (let i = 0, len = mob.length; i < len; i++) {
|
||||
const sub = Vector.magnitude(Vector.sub(this.position, mob[i].position))
|
||||
if (sub < this.circleRadius + mob[i].radius) {
|
||||
|
||||
if (mob[i].alive) {
|
||||
if (!this.isAttached && !mob[i].isMobBullet) this.isPopping = true
|
||||
mob[i].damage(dmg);
|
||||
if (mob[i].speed > 5) {
|
||||
Matter.Body.setVelocity(mob[i], { //friction
|
||||
x: mob[i].velocity.x * 0.6,
|
||||
y: mob[i].velocity.y * 0.6
|
||||
});
|
||||
} else {
|
||||
Matter.Body.setVelocity(mob[i], { //friction
|
||||
x: mob[i].velocity.x * 0.93,
|
||||
y: mob[i].velocity.y * 0.93
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (sub < 150 + 1.3 * this.circleRadius + mob[i].radius && !(m.cycle % 20)) { //populate electrical arc list
|
||||
arcList.push(mob[i])
|
||||
// mob[i].damage(dmg * 0.1);
|
||||
}
|
||||
|
||||
}
|
||||
//
|
||||
if (arcList.length) {
|
||||
const who = arcList[Math.floor(Math.random() * arcList.length)]
|
||||
who.damage(dmg * 5);
|
||||
|
||||
//draw arcs
|
||||
// const unit = Vector.rotate({ x: 1, y: 0 }, Math.random() * 6.28)
|
||||
const sub = Vector.sub(who.position, this.position)
|
||||
const unit = Vector.normalise(sub)
|
||||
let len = 12
|
||||
const step = Vector.magnitude(sub) / (len + 2)
|
||||
let x = this.position.x
|
||||
let y = this.position.y
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(x, y);
|
||||
for (let i = 0; i < len; i++) {
|
||||
x += step * (unit.x + 1 * (Math.random() - 0.5))
|
||||
y += step * (unit.y + 1 * (Math.random() - 0.5))
|
||||
ctx.lineTo(x, y);
|
||||
}
|
||||
ctx.lineTo(who.position.x, who.position.y);
|
||||
ctx.strokeStyle = "#88f";
|
||||
ctx.lineWidth = 4 + Math.random();
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//slowly slow down if too fast
|
||||
if (this.speed > 8) {
|
||||
const scale = 0.997
|
||||
@@ -2172,11 +2254,11 @@ const m = {
|
||||
//graphics
|
||||
const radius = this.circleRadius * (0.99 + 0.02 * Math.random()) + 3 * Math.random()
|
||||
const gradient = ctx.createRadialGradient(this.position.x, this.position.y, 0, this.position.x, this.position.y, radius);
|
||||
this.alpha = 0.5 + 0.1 * Math.random()
|
||||
gradient.addColorStop(0, `rgba(255,255,255,${this.alpha})`);
|
||||
gradient.addColorStop(0.18 + 0.1 * Math.random(), `rgba(255,150,255,${this.alpha})`);
|
||||
gradient.addColorStop(1, `rgba(255,0,255,${this.alpha})`);
|
||||
// gradient.addColorStop(1, `rgba(255,150,255,${this.alpha})`);
|
||||
const alpha = this.alpha + 0.15 * Math.random()
|
||||
gradient.addColorStop(0, `rgba(255,255,255,${alpha})`);
|
||||
gradient.addColorStop(0.35 + 0.1 * Math.random(), `rgba(255,150,255,${alpha})`);
|
||||
gradient.addColorStop(1, `rgba(255,0,255,${alpha})`);
|
||||
// gradient.addColorStop(1, `rgba(255,150,255,${alpha})`);
|
||||
ctx.fillStyle = gradient
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
|
||||
@@ -2211,8 +2293,12 @@ const m = {
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Composite.add(engine.world, m.plasmaBall);
|
||||
|
||||
// m.plasmaBall.startingVertices = m.plasmaBall.vertices.slice();
|
||||
// console.log(m.plasmaBall.startingVertices, m.plasmaBall.vertices)
|
||||
|
||||
m.hold = function() {
|
||||
if (m.isHolding) {
|
||||
m.drawHold(m.holdingTarget);
|
||||
@@ -2224,17 +2310,24 @@ const m = {
|
||||
|
||||
//field is active
|
||||
if (!m.plasmaBall.isAttached) { //return ball to player
|
||||
const scale = 0.7
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
|
||||
if (m.plasmaBall.circleRadius < m.plasmaBall.radiusLimit) {
|
||||
if (m.plasmaBall.isOn) {
|
||||
m.plasmaBall.isPopping = true
|
||||
} else {
|
||||
m.plasmaBall.isAttached = true
|
||||
m.plasmaBall.isOn = true
|
||||
m.plasmaBall.setPositionToNose()
|
||||
}
|
||||
// const scale = 0.7
|
||||
// Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
|
||||
// if (m.plasmaBall.circleRadius < m.plasmaBall.radiusLimit) {
|
||||
// m.plasmaBall.isAttached = true
|
||||
// m.plasmaBall.isOn = true
|
||||
// m.plasmaBall.setPositionToNose()
|
||||
// }
|
||||
} else if (m.energy > m.plasmaBall.drain) { //charge up when attached
|
||||
if (tech.isCapacitor) {
|
||||
m.energy -= m.plasmaBall.drain * 2;
|
||||
const scale = 1 + 3 * 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8)
|
||||
const scale = 1 + 48 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8)
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //grow
|
||||
} else {
|
||||
m.energy -= m.plasmaBall.drain;
|
||||
@@ -2242,12 +2335,40 @@ const m = {
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //grow
|
||||
}
|
||||
if (m.energy > m.maxEnergy) {
|
||||
m.energy -= m.plasmaBall.drain;
|
||||
m.energy -= m.plasmaBall.drain * 2;
|
||||
const scale = 1 + 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8)
|
||||
Matter.Body.scale(m.plasmaBall, scale, scale); //grow
|
||||
}
|
||||
m.plasmaBall.setPositionToNose()
|
||||
//add friction for player when holding ball, maybe more friction in vertical
|
||||
|
||||
|
||||
//add friction for player when holding ball, more friction in vertical
|
||||
// const floatScale = Math.sqrt(m.plasmaBall.circleRadius)
|
||||
// const friction = 0.0002 * floatScale
|
||||
// const slowY = (player.velocity.y > 0) ? Math.max(0.8, 1 - friction * player.velocity.y * player.velocity.y) : Math.max(0.98, 1 - friction * Math.abs(player.velocity.y)) //down : up
|
||||
// Matter.Body.setVelocity(player, {
|
||||
// x: Math.max(0.95, 1 - friction * Math.abs(player.velocity.x)) * player.velocity.x,
|
||||
// y: slowY * player.velocity.y
|
||||
// });
|
||||
|
||||
// if (player.velocity.y > 7) player.force.y -= 0.95 * player.mass * simulation.g //less gravity when falling fast
|
||||
// player.force.y -= Math.min(0.95, 0.05 * floatScale) * player.mass * simulation.g; //undo some gravity on up or down
|
||||
// console.log(friction)
|
||||
|
||||
//float
|
||||
const slowY = (player.velocity.y > 0) ? Math.max(0.8, 1 - 0.002 * player.velocity.y * player.velocity.y) : Math.max(0.98, 1 - 0.001 * Math.abs(player.velocity.y)) //down : up
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: Math.max(0.95, 1 - 0.003 * Math.abs(player.velocity.x)) * player.velocity.x,
|
||||
y: slowY * player.velocity.y
|
||||
});
|
||||
if (player.velocity.y > 5) {
|
||||
player.force.y -= 0.9 * player.mass * simulation.g //less gravity when falling fast
|
||||
} else {
|
||||
player.force.y -= 0.5 * player.mass * simulation.g;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
m.fieldCDcycle = m.cycle + 90;
|
||||
|
||||
10
js/tech.js
10
js/tech.js
@@ -6585,7 +6585,7 @@ const tech = {
|
||||
isBot: true,
|
||||
isBotTech: true,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && (build.isExperimentSelection || powerUps.research.count > 0)
|
||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && (build.isExperimentSelection || powerUps.research.count > 0) && !tech.isPlasmaBall && !tech.isExtruder
|
||||
},
|
||||
requires: "plasma torch",
|
||||
effect() {
|
||||
@@ -6639,7 +6639,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "plasma ball",
|
||||
description: "charge up a ball of <strong class='color-plasma'>plasma</strong> and fire it",
|
||||
description: "<strong>grow</strong> an expanding <strong>ball</strong> of <strong class='color-plasma'>plasma</strong><br>increases <strong class='color-d'>damage</strong> and <strong class='color-f'>energy</strong> drain",
|
||||
isFieldTech: true,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -6660,7 +6660,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "extruder",
|
||||
description: "<strong class='color-plasma'>plasma</strong> <strong>torch</strong> <strong class='color-plasma'>extrudes</strong> a thin hot wire<br>increases <strong class='color-d'>damage</strong> and <strong class='color-f'>energy</strong> drain",
|
||||
description: "<strong>extrude</strong> a thin hot wire of <strong class='color-plasma'>plasma</strong><br>increases <strong class='color-d'>damage</strong> and <strong class='color-f'>energy</strong> drain",
|
||||
isFieldTech: true,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -7923,7 +7923,7 @@ const tech = {
|
||||
oscillator1.connect(gainNode1);
|
||||
gainNode1.connect(audioCtx.destination);
|
||||
oscillator1.type = "sine"; // 'sine' 'square', 'sawtooth', 'triangle' and 'custom'
|
||||
oscillator1.frequency.value = 853; // value in hertz
|
||||
oscillator1.frequency.value = 850; // value in hertz
|
||||
oscillator1.start();
|
||||
|
||||
const oscillator2 = audioCtx.createOscillator();
|
||||
@@ -7932,7 +7932,7 @@ const tech = {
|
||||
oscillator2.connect(gainNode2);
|
||||
gainNode2.connect(audioCtx.destination);
|
||||
oscillator2.type = "sine"; // 'sine' 'square', 'sawtooth', 'triangle' and 'custom'
|
||||
oscillator2.frequency.value = 960; // value in hertz
|
||||
oscillator2.frequency.value = 957; // value in hertz
|
||||
oscillator2.start();
|
||||
return audioCtx
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user