RPG + rocket jump
tech: RPG - gains the rocket jumping effects from electric armor eternalism no longer makes tech options have 50% opacity when choosing some new images for cloaking tech and some images were made brighter bug fixes safari media rules css fixed
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 64 KiB |
BIN
img/dazzler.webp
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 417 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 64 KiB |
BIN
img/patch.webp
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 47 KiB |
38
js/bullet.js
@@ -114,7 +114,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
refundAmmo() { //triggers after firing when you removed ammo for a gun, but didn't need to
|
refundAmmo() { //triggers after firing when you removed ammo for a gun, but didn't need to
|
||||||
if (tech.crouchAmmoCount && input.down) {
|
if (tech.crouchAmmoCount && input.down && b.activeGun !== null) {
|
||||||
tech.crouchAmmoCount--
|
tech.crouchAmmoCount--
|
||||||
if ((tech.crouchAmmoCount) % 2) {
|
if ((tech.crouchAmmoCount) % 2) {
|
||||||
b.guns[b.activeGun].ammo++;
|
b.guns[b.activeGun].ammo++;
|
||||||
@@ -144,13 +144,13 @@ const b = {
|
|||||||
gun = options[Math.floor(Math.random() * options.length)]
|
gun = options[Math.floor(Math.random() * options.length)]
|
||||||
}
|
}
|
||||||
if (gun === "all") {
|
if (gun === "all") {
|
||||||
b.inventoryGun = 0;
|
|
||||||
for (let i = 0; i < b.guns.length; i++) {
|
for (let i = 0; i < b.guns.length; i++) {
|
||||||
b.inventory[i] = i;
|
b.inventory[i] = i;
|
||||||
b.guns[i].have = true;
|
b.guns[i].have = true;
|
||||||
if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = Math.ceil(b.guns[i].ammoPack * ammoPacks);
|
if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = Math.ceil(b.guns[i].ammoPack * ammoPacks);
|
||||||
}
|
}
|
||||||
b.activeGun = 0;
|
b.inventoryGun = 0;
|
||||||
|
b.activeGun = b.inventory[0];
|
||||||
} else {
|
} else {
|
||||||
if (isNaN(gun)) { //find gun by name
|
if (isNaN(gun)) { //find gun by name
|
||||||
let found = false;
|
let found = false;
|
||||||
@@ -167,7 +167,8 @@ const b = {
|
|||||||
b.guns[gun].have = true;
|
b.guns[gun].have = true;
|
||||||
if (b.guns[gun].ammo !== Infinity) b.guns[gun].ammo = Math.ceil(b.guns[gun].ammoPack * ammoPacks);
|
if (b.guns[gun].ammo !== Infinity) b.guns[gun].ammo = Math.ceil(b.guns[gun].ammoPack * ammoPacks);
|
||||||
if (b.activeGun === null) {
|
if (b.activeGun === null) {
|
||||||
b.activeGun = gun //if no active gun switch to new gun
|
b.inventoryGun = 0;
|
||||||
|
b.activeGun = b.inventory[0] //if no active gun switch to new gun
|
||||||
if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //set foam charge to zero if foam is a new gun
|
if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //set foam charge to zero if foam is a new gun
|
||||||
}
|
}
|
||||||
// if (tech.infiniteWaveAmmo === 2) b.guns[3].ammo = Infinity
|
// if (tech.infiniteWaveAmmo === 2) b.guns[3].ammo = Infinity
|
||||||
@@ -219,11 +220,10 @@ const b = {
|
|||||||
}
|
}
|
||||||
if (b.inventory.length > 0) {
|
if (b.inventory.length > 0) {
|
||||||
b.activeGun = b.inventory[0];
|
b.activeGun = b.inventory[0];
|
||||||
b.inventoryGun = 0;
|
|
||||||
} else {
|
} else {
|
||||||
b.activeGun = null;
|
b.activeGun = null;
|
||||||
b.inventoryGun = 0;
|
|
||||||
}
|
}
|
||||||
|
b.inventoryGun = 0;
|
||||||
simulation.makeGunHUD();
|
simulation.makeGunHUD();
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -237,7 +237,10 @@ const b = {
|
|||||||
b.guns[i].have = false;
|
b.guns[i].have = false;
|
||||||
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
||||||
}
|
}
|
||||||
|
tech.buffedGun = 0
|
||||||
b.activeGun = null;
|
b.activeGun = null;
|
||||||
|
b.inventoryGun = 0;
|
||||||
|
simulation.drawCursor = simulation.drawCursorBasic //set cross hairs
|
||||||
},
|
},
|
||||||
bulletRemove() { //run in main loop
|
bulletRemove() { //run in main loop
|
||||||
//remove bullet if at end cycle for that bullet
|
//remove bullet if at end cycle for that bullet
|
||||||
@@ -445,9 +448,9 @@ const b = {
|
|||||||
if (dist < radius) {
|
if (dist < radius) {
|
||||||
if (simulation.dmgScale) {
|
if (simulation.dmgScale) {
|
||||||
const harm = tech.isExplosionHarm ? 0.07 : 0.05
|
const harm = tech.isExplosionHarm ? 0.07 : 0.05
|
||||||
if (tech.isImmuneExplosion && m.energy > 0.12) {
|
if (tech.isImmuneExplosion && m.energy > 0.25) {
|
||||||
// const mitigate = Math.min(1, Math.max(1 - m.energy * 0.5, 0))
|
// const mitigate = Math.min(1, Math.max(1 - m.energy * 0.5, 0))
|
||||||
m.energy -= 0.12
|
m.energy -= 0.25
|
||||||
// m.damage(0.01 * harm); //remove 99% of the damage 1-0.99
|
// m.damage(0.01 * harm); //remove 99% of the damage 1-0.99
|
||||||
knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)));
|
knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)));
|
||||||
player.force.x = knock.x; // not += so crazy forces can't build up with MIRV
|
player.force.x = knock.x; // not += so crazy forces can't build up with MIRV
|
||||||
@@ -2759,26 +2762,17 @@ const b = {
|
|||||||
if (collide.length > 0) {
|
if (collide.length > 0) {
|
||||||
for (let i = 0; i < collide.length; i++) {
|
for (let i = 0; i < collide.length; i++) {
|
||||||
if (collide[i].bodyA.collisionFilter.category === cat.map) { // || collide[i].bodyB.collisionFilter.category === cat.map) {
|
if (collide[i].bodyA.collisionFilter.category === cat.map) { // || collide[i].bodyB.collisionFilter.category === cat.map) {
|
||||||
const angle = Vector.angle(collide[i].normal, {
|
const angle = Vector.angle(collide[i].normal, { x: 1, y: 0 })
|
||||||
x: 1,
|
|
||||||
y: 0
|
|
||||||
})
|
|
||||||
Matter.Body.setAngle(this, Math.atan2(collide[i].tangent.y, collide[i].tangent.x))
|
Matter.Body.setAngle(this, Math.atan2(collide[i].tangent.y, collide[i].tangent.x))
|
||||||
for (let j = 0; j < 10; j++) { //move until touching map again after rotation
|
for (let j = 0; j < 10; j++) { //move until touching map again after rotation
|
||||||
if (Matter.Query.collides(this, map).length > 0) { //touching map
|
if (Matter.Query.collides(this, map).length > 0) { //touching map
|
||||||
if (angle > -0.2 || angle < -1.5) { //don't stick to level ground
|
if (angle > -0.2 || angle < -1.5) { //don't stick to level ground
|
||||||
Matter.Body.setVelocity(this, {
|
Matter.Body.setVelocity(this, { x: 0, y: 0 });
|
||||||
x: 0,
|
|
||||||
y: 0
|
|
||||||
});
|
|
||||||
Matter.Body.setStatic(this, true) //don't set to static if not touching map
|
Matter.Body.setStatic(this, true) //don't set to static if not touching map
|
||||||
this.collisionFilter.category = 0
|
this.collisionFilter.category = 0
|
||||||
this.collisionFilter.mask = 0 //cat.map | cat.bullet
|
this.collisionFilter.mask = 0 //cat.map | cat.bullet
|
||||||
} else {
|
} else {
|
||||||
Matter.Body.setVelocity(this, {
|
Matter.Body.setVelocity(this, { x: 0, y: 0 });
|
||||||
x: 0,
|
|
||||||
y: 0
|
|
||||||
});
|
|
||||||
Matter.Body.setAngularVelocity(this, 0)
|
Matter.Body.setAngularVelocity(this, 0)
|
||||||
}
|
}
|
||||||
this.arm();
|
this.arm();
|
||||||
@@ -3764,6 +3758,7 @@ const b = {
|
|||||||
bullet[me].friction = 0;
|
bullet[me].friction = 0;
|
||||||
if (tech.superHarm) {
|
if (tech.superHarm) {
|
||||||
bullet[me].collidePlayerDo = function() {
|
bullet[me].collidePlayerDo = function() {
|
||||||
|
this.force.y += this.mass * 0.0012;
|
||||||
if (Matter.Query.collides(this, [player]).length) {
|
if (Matter.Query.collides(this, [player]).length) {
|
||||||
this.endCycle = 0
|
this.endCycle = 0
|
||||||
let dmg = 0.02 * this.mass * tech.superHarm
|
let dmg = 0.02 * this.mass * tech.superHarm
|
||||||
@@ -3779,7 +3774,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
bullet[me].cycle = 0
|
bullet[me].cycle = 0
|
||||||
bullet[me].do = function() {
|
bullet[me].do = function() {
|
||||||
if (this.cycle > 6) this.do = this.collidePlayerDo
|
this.cycle++
|
||||||
|
if (this.cycle > 2) this.do = this.collidePlayerDo
|
||||||
this.force.y += this.mass * 0.0012;
|
this.force.y += this.mass * 0.0012;
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
11
js/index.js
@@ -382,7 +382,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
|||||||
}
|
}
|
||||||
|
|
||||||
let el = document.getElementById("pause-grid-left")
|
let el = document.getElementById("pause-grid-left")
|
||||||
el.style.display = tech.isNoDraftPause ? "none" : "grid" //disabled for eternalism because eternalism lets the player play while this menu is up but the menu doesn't update
|
el.style.display = "grid"
|
||||||
el.innerHTML = text
|
el.innerHTML = text
|
||||||
//right side
|
//right side
|
||||||
text = "";
|
text = "";
|
||||||
@@ -433,7 +433,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
el = document.getElementById("pause-grid-right")
|
el = document.getElementById("pause-grid-right")
|
||||||
el.style.display = tech.isNoDraftPause ? "none" : "grid" //disabled for eternalism because eternalism lets the player play while this menu is up but the menu doesn't update
|
el.style.display = "grid"
|
||||||
el.innerHTML = text
|
el.innerHTML = text
|
||||||
|
|
||||||
document.getElementById("tech").style.display = "none"
|
document.getElementById("tech").style.display = "none"
|
||||||
@@ -500,7 +500,10 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
|||||||
b.guns[index].count = 0;
|
b.guns[index].count = 0;
|
||||||
b.guns[index].have = false;
|
b.guns[index].have = false;
|
||||||
if (b.guns[index].ammo != Infinity) b.guns[index].ammo = 0;
|
if (b.guns[index].ammo != Infinity) b.guns[index].ammo = 0;
|
||||||
if (b.inventory.length === 0) b.activeGun = null;
|
if (b.inventory.length === 0) {
|
||||||
|
b.activeGun = null;
|
||||||
|
b.inventoryGun = 0;
|
||||||
|
}
|
||||||
simulation.makeGunHUD();
|
simulation.makeGunHUD();
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -698,6 +701,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
|||||||
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
if (b.guns[i].ammo != Infinity) b.guns[i].ammo = 0;
|
||||||
}
|
}
|
||||||
b.activeGun = null;
|
b.activeGun = null;
|
||||||
|
b.inventoryGun = 0;
|
||||||
simulation.makeGunHUD();
|
simulation.makeGunHUD();
|
||||||
tech.setupAllTech();
|
tech.setupAllTech();
|
||||||
build.populateGrid();
|
build.populateGrid();
|
||||||
@@ -765,6 +769,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
|||||||
spawn.setSpawnList();
|
spawn.setSpawnList();
|
||||||
if (b.inventory.length > 0) {
|
if (b.inventory.length > 0) {
|
||||||
b.activeGun = b.inventory[0] //set first gun to active gun
|
b.activeGun = b.inventory[0] //set first gun to active gun
|
||||||
|
b.inventoryGun = 0;
|
||||||
simulation.makeGunHUD();
|
simulation.makeGunHUD();
|
||||||
}
|
}
|
||||||
for (let i = 0; i < bullet.length; ++i) Matter.Composite.remove(engine.world, bullet[i]);
|
for (let i = 0; i < bullet.length; ++i) Matter.Composite.remove(engine.world, bullet[i]);
|
||||||
|
|||||||
313
js/level.js
@@ -25,14 +25,14 @@ const level = {
|
|||||||
// m.immuneCycle = Infinity //you can't take damage
|
// m.immuneCycle = Infinity //you can't take damage
|
||||||
// tech.tech[297].frequency = 100
|
// tech.tech[297].frequency = 100
|
||||||
// m.couplingChange(5)
|
// m.couplingChange(5)
|
||||||
// m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
|
// m.setField("metamaterial cloaking") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
|
||||||
// simulation.molecularMode = 2
|
// simulation.molecularMode = 2
|
||||||
// m.damage(0.1);
|
// m.damage(0.1);
|
||||||
// b.giveGuns("shotgun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
|
// b.giveGuns("shotgun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
|
||||||
// b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
|
// b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
|
||||||
// b.guns[0].ammo = 10000
|
// b.guns[0].ammo = 10000
|
||||||
// tech.giveTech("needle gun")
|
// tech.giveTech("needle gun")
|
||||||
// tech.giveTech("repeater")
|
// tech.giveTech("eternalism")
|
||||||
// tech.giveTech("ice-shot")
|
// tech.giveTech("ice-shot")
|
||||||
// for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
|
// for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
|
||||||
// tech.isFoamBall = true
|
// tech.isFoamBall = true
|
||||||
@@ -42,7 +42,8 @@ const level = {
|
|||||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
|
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
|
||||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost");
|
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost");
|
||||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
|
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
|
||||||
// level.testing();
|
// level.testChamber2();
|
||||||
|
// spawn.nodeGroup(1200, 0, "slasher")
|
||||||
// spawn.blinkBoss(1900, -500)
|
// spawn.blinkBoss(1900, -500)
|
||||||
// spawn.sneakBoss(1900, -500)
|
// spawn.sneakBoss(1900, -500)
|
||||||
// spawn.starter(1900, -500, 200)
|
// spawn.starter(1900, -500, 200)
|
||||||
@@ -56,12 +57,7 @@ const level = {
|
|||||||
// for (let i = 0; i < 40; ++i) tech.giveTech()
|
// for (let i = 0; i < 40; ++i) tech.giveTech()
|
||||||
// for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
|
// for (let i = 0; i < 13; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
|
||||||
|
|
||||||
//normal starting level ************************************************
|
level[simulation.isTraining ? "walk" : "intro"]() //normal starting level ************************************************
|
||||||
if (simulation.isTraining) {
|
|
||||||
level.walk()
|
|
||||||
} else {
|
|
||||||
level.intro()
|
|
||||||
}
|
|
||||||
|
|
||||||
// for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
|
// for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
|
||||||
// for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "gun");
|
// for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "gun");
|
||||||
@@ -156,7 +152,7 @@ const level = {
|
|||||||
//used for generalist and pigeonhole principle
|
//used for generalist and pigeonhole principle
|
||||||
tech.buffedGun++
|
tech.buffedGun++
|
||||||
if (tech.buffedGun > b.inventory.length - 1) tech.buffedGun = 0;
|
if (tech.buffedGun > b.inventory.length - 1) tech.buffedGun = 0;
|
||||||
if (tech.isGunCycle) {
|
if (tech.isGunCycle && b.activeGun !== null && b.inventory.length) {
|
||||||
b.inventoryGun = tech.buffedGun;
|
b.inventoryGun = tech.buffedGun;
|
||||||
simulation.switchGun();
|
simulation.switchGun();
|
||||||
}
|
}
|
||||||
@@ -1264,22 +1260,13 @@ const level = {
|
|||||||
const width = 50
|
const width = 50
|
||||||
const height = 150
|
const height = 150
|
||||||
const mapWidth = 200
|
const mapWidth = 200
|
||||||
const unitA = Matter.Vector.rotate({
|
const unitA = Matter.Vector.rotate({ x: 1, y: 0 }, angleA)
|
||||||
x: 1,
|
const unitB = Matter.Vector.rotate({ x: 1, y: 0 }, angleB)
|
||||||
y: 0
|
|
||||||
}, angleA)
|
|
||||||
const unitB = Matter.Vector.rotate({
|
|
||||||
x: 1,
|
|
||||||
y: 0
|
|
||||||
}, angleB)
|
|
||||||
|
|
||||||
draw = function() {
|
draw = function() {
|
||||||
ctx.beginPath(); //portal
|
ctx.beginPath(); //portal
|
||||||
let v = this.vertices;
|
let v = this.vertices;
|
||||||
ctx.moveTo(v[0].x, v[0].y);
|
ctx.moveTo(v[0].x, v[0].y);
|
||||||
for (let i = 1; i < v.length; ++i) {
|
for (let i = 1; i < v.length; ++i) ctx.lineTo(v[i].x, v[i].y);
|
||||||
ctx.lineTo(v[i].x, v[i].y);
|
|
||||||
}
|
|
||||||
ctx.fillStyle = this.color
|
ctx.fillStyle = this.color
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
}
|
}
|
||||||
@@ -1315,10 +1302,7 @@ const level = {
|
|||||||
x: 250 * (Math.random() - 0.5),
|
x: 250 * (Math.random() - 0.5),
|
||||||
y: 250 * (Math.random() - 0.5)
|
y: 250 * (Math.random() - 0.5)
|
||||||
}));
|
}));
|
||||||
Matter.Body.setVelocity(bullet[i], {
|
Matter.Body.setVelocity(bullet[i], { x: 0, y: 0 });
|
||||||
x: 0,
|
|
||||||
y: 0
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2827,7 +2811,7 @@ const level = {
|
|||||||
}
|
}
|
||||||
// const hazardSlime = level.hazard(-1800, 150, 3600, 650, 0.004, "hsla(160, 100%, 35%,0.75)")
|
// const hazardSlime = level.hazard(-1800, 150, 3600, 650, 0.004, "hsla(160, 100%, 35%,0.75)")
|
||||||
level.isHazardRise = false //this is set to true to make the slime rise up
|
level.isHazardRise = false //this is set to true to make the slime rise up
|
||||||
const hazardSlime = level.hazard(-1800, -800, 3600, 1600, 0.004, "hsla(160, 100%, 35%,0.75)")
|
const hazardSlime = level.hazard(-1800, -800, 3600, 1600, 0.004)
|
||||||
hazardSlime.height -= 950
|
hazardSlime.height -= 950
|
||||||
hazardSlime.min.y += 950
|
hazardSlime.min.y += 950
|
||||||
hazardSlime.max.y = hazardSlime.min.y + hazardSlime.height
|
hazardSlime.max.y = hazardSlime.min.y + hazardSlime.height
|
||||||
@@ -4464,261 +4448,70 @@ const level = {
|
|||||||
|
|
||||||
},
|
},
|
||||||
testChamber2() {
|
testChamber2() {
|
||||||
level.setPosToSpawn(0, -50); //lower start
|
level.setPosToSpawn(0, -65); //lower start
|
||||||
level.exit.y = level.enter.y - 550;
|
level.exit.y = -1550;
|
||||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
||||||
level.exit.x = level.enter.x;
|
level.exit.x = -1000;
|
||||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
|
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
|
||||||
level.defaultZoom = 2200
|
level.defaultZoom = 2200
|
||||||
simulation.zoomTransition(level.defaultZoom)
|
simulation.zoomTransition(level.defaultZoom)
|
||||||
document.body.style.backgroundColor = "#d0d5d5";
|
document.body.style.backgroundColor = "#d0d5d5";
|
||||||
color.map = "#444"
|
color.map = "#444"
|
||||||
spawn.mapRect(0, -1955, 175, 30);
|
const portal = level.portal({ x: 1070, y: -1485 }, -0.9, { x: 475, y: 50 }, -Math.PI / 2)
|
||||||
const removeIndex1 = map.length - 1 //so much work to catch blocks caught at the bottom of the vertical portals
|
const hazardSlime = level.hazard(900, -300, 3625, 2550) //hazard(x, y, width, height, damage = 0.002) {
|
||||||
spawn.mapRect(1225, -1955, 175, 30);
|
const button = level.button(3975, -1425)
|
||||||
const removeIndex2 = map.length - 1 //so much work to catch blocks caught at the bottom of the vertical portals
|
|
||||||
let portal, portal2, portal3
|
|
||||||
const hazard = level.hazard((simulation.isHorizontalFlipped ? -350 - 700 : 350), -2025, 700, 10, 0.4) //laser
|
|
||||||
spawn.mapRect(340, -2032.5, 20, 25); //laser nose
|
|
||||||
const hazard2 = level.hazard((simulation.isHorizontalFlipped ? -1775 - 150 : 1775), -2550, 150, 10, 0.4) //laser
|
|
||||||
spawn.mapRect(1920, -2557.5, 20, 25); //laser nose
|
|
||||||
const button = level.button(2100, -2600)
|
|
||||||
const buttonDoor = level.button(600, -550)
|
|
||||||
const door = level.door(312, -750, 25, 190, 185)
|
|
||||||
|
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
if (!(m.cycle % 60)) { //so much work to catch blocks caught at the bottom of the vertical portals
|
|
||||||
let touching = Matter.Query.collides(map[removeIndex1], body)
|
|
||||||
if (touching.length) {
|
|
||||||
Matter.Composite.remove(engine.world, touching[0].bodyB);
|
|
||||||
for (let i = 0, len = body.length; i < len; i++) {
|
|
||||||
if (body[i].id === touching[0].bodyB.id) {
|
|
||||||
body.splice(i, 1);
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
touching = Matter.Query.collides(map[removeIndex2], body)
|
|
||||||
if (touching.length) {
|
|
||||||
Matter.Composite.remove(engine.world, touching[0].bodyB);
|
|
||||||
for (let i = 0, len = body.length; i < len; i++) {
|
|
||||||
if (body[i].id === touching[0].bodyB.id) {
|
|
||||||
body.splice(i, 1);
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buttonDoor.query();
|
|
||||||
buttonDoor.draw();
|
|
||||||
if (buttonDoor.isUp) {
|
|
||||||
door.isClosing = true
|
|
||||||
} else {
|
|
||||||
door.isClosing = false
|
|
||||||
}
|
|
||||||
door.openClose();
|
|
||||||
|
|
||||||
portal[2].query()
|
portal[2].query()
|
||||||
portal[3].query()
|
portal[3].query()
|
||||||
portal2[2].query()
|
level.exit.drawAndCheck();
|
||||||
portal2[3].query()
|
level.enter.draw();
|
||||||
portal3[2].query()
|
|
||||||
portal3[3].query()
|
|
||||||
|
|
||||||
if (button.isUp) {
|
|
||||||
hazard.isOn = false;
|
|
||||||
hazard2.isOn = false;
|
|
||||||
} else {
|
|
||||||
hazard.isOn = true;
|
|
||||||
hazard2.isOn = true;
|
|
||||||
}
|
|
||||||
button.query();
|
button.query();
|
||||||
button.draw();
|
button.draw();
|
||||||
|
|
||||||
ctx.fillStyle = "#d4f4f4"
|
|
||||||
ctx.fillRect(-300, -1000, 650, 500)
|
|
||||||
level.exit.drawAndCheck();
|
|
||||||
|
|
||||||
level.enter.draw();
|
|
||||||
};
|
};
|
||||||
level.customTopLayer = () => {
|
level.customTopLayer = () => {
|
||||||
door.draw();
|
hazardSlime.query();
|
||||||
hazard.opticalQuery();
|
|
||||||
hazard2.opticalQuery();
|
|
||||||
portal[0].draw();
|
portal[0].draw();
|
||||||
portal[1].draw();
|
portal[1].draw();
|
||||||
portal[2].draw();
|
portal[2].draw();
|
||||||
portal[3].draw();
|
portal[3].draw();
|
||||||
portal2[0].draw();
|
ctx.fillStyle = "#444" //below portal
|
||||||
portal2[1].draw();
|
ctx.fillRect(375, 150, 200, 2525);
|
||||||
portal2[2].draw();
|
ctx.fillStyle = "rgba(0,0,0,0.1)" //shadows
|
||||||
portal2[3].draw();
|
ctx.fillRect(-250, -1550, 1250, 1575);
|
||||||
portal3[0].draw();
|
for (let i = 0, len = vanish.length; i < len; i++) vanish[i].query()
|
||||||
portal3[1].draw();
|
|
||||||
portal3[2].draw();
|
|
||||||
portal3[3].draw();
|
|
||||||
};
|
};
|
||||||
powerUps.spawnStartingPowerUps(1875, -3075);
|
|
||||||
|
|
||||||
const powerUpPos = shuffle([{ //no debris on this level but 2 random spawn instead
|
|
||||||
x: -150,
|
|
||||||
y: -1775
|
|
||||||
}, {
|
|
||||||
x: 2400,
|
|
||||||
y: -2650
|
|
||||||
}, {
|
|
||||||
x: -175,
|
|
||||||
y: -1375
|
|
||||||
}, {
|
|
||||||
x: 1325,
|
|
||||||
y: -150
|
|
||||||
}]);
|
|
||||||
powerUps.chooseRandomPowerUp(powerUpPos[0].x, powerUpPos[0].y);
|
|
||||||
powerUps.chooseRandomPowerUp(powerUpPos[1].x, powerUpPos[1].y);
|
|
||||||
//outer wall
|
//outer wall
|
||||||
spawn.mapRect(2500, -3700, 1200, 3800); //right map wall
|
// spawn.mapRect(-1400, 0, 1800, 1200); //floor
|
||||||
spawn.mapRect(-1400, -3800, 1100, 3900); //left map wall
|
spawn.mapRect(-1400, 0, 1800, 2675);
|
||||||
spawn.mapRect(-1400, -4800, 5100, 1200); //map ceiling
|
spawn.mapRect(-1400, -1025, 1225, 1500);
|
||||||
spawn.mapRect(-1400, 0, 5100, 1200); //floor
|
spawn.mapRect(-325, -15, 525, 225);
|
||||||
//lower entrance /exit
|
spawn.mapRect(150, -350, 50, 175);
|
||||||
spawn.mapRect(300, -375, 50, 225);
|
|
||||||
spawn.bodyRect(312, -150, 25, 140);
|
|
||||||
spawn.mapRect(300, -10, 50, 50);
|
|
||||||
spawn.mapVertex(1555, 0, "625 0 75 0 200 -100 500 -100"); //entrance ramp
|
|
||||||
//upper entrance / exit
|
|
||||||
spawn.mapRect(-400, -1050, 750, 50);
|
|
||||||
spawn.mapRect(300, -1050, 50, 300);
|
|
||||||
// spawn.bodyRect(312, -750, 25, 190);
|
|
||||||
spawn.mapRect(300, -560, 50, 50);
|
|
||||||
spawn.bodyRect(750, -725, 125, 125);
|
|
||||||
spawn.mapRect(1150, -1050, 250, 575);
|
|
||||||
spawn.mapRect(1725, -550, 50, 200); //walls around portal 3
|
|
||||||
spawn.mapRect(1925, -550, 500, 200);
|
|
||||||
spawn.mapRect(1750, -390, 200, 40);
|
|
||||||
spawn.mapRect(-400, -550, 1800, 200);
|
|
||||||
spawn.mapRect(-200, -1700, 150, 25); //platform above exit room
|
|
||||||
spawn.mapRect(-200, -1325, 350, 25);
|
|
||||||
//portal 3 angled
|
|
||||||
spawn.mapRect(2425, -450, 100, 100);
|
|
||||||
//portal 1 bottom
|
|
||||||
spawn.mapRect(2290, -12, 375, 100);
|
|
||||||
spawn.mapRect(2350, -24, 375, 100);
|
|
||||||
spawn.mapRect(2410, -36, 375, 100);
|
|
||||||
//portal 1 top
|
|
||||||
spawn.mapRect(2290, -3012, 375, 50);
|
|
||||||
spawn.mapRect(2350, -3024, 375, 50);
|
|
||||||
spawn.mapRect(2410, -3036, 375, 50);
|
|
||||||
spawn.mapRect(1400, -3000, 1300, 50); //floor
|
|
||||||
spawn.mapRect(1750, -3050, 250, 75);
|
|
||||||
spawn.mapRect(1400, -3625, 50, 200);
|
|
||||||
spawn.mapRect(350, -3625, 50, 225);
|
|
||||||
spawn.mapRect(350, -3260, 50, 60);
|
|
||||||
spawn.mapRect(200, -3250, 1240, 50);
|
|
||||||
spawn.mapRect(1400, -3260, 50, 310);
|
|
||||||
spawn.bodyRect(1412, -3425, 25, 165);
|
|
||||||
spawn.mapRect(-150, -2925, 150, 25);
|
|
||||||
//portal 2
|
|
||||||
spawn.mapRect(-300, -2600, 300, 675); //left platform
|
|
||||||
spawn.mapRect(1400, -2600, 375, 675); //right platform
|
|
||||||
spawn.mapRect(1925, -2600, 775, 675); //far right platform
|
|
||||||
spawn.bodyRect(2130, -2660, 50, 50); //button's block
|
|
||||||
spawn.mapRect(150, -2100, 200, 175);
|
|
||||||
spawn.mapRect(1050, -2100, 200, 175);
|
|
||||||
//mobs
|
|
||||||
spawn.randomMob(1075, -3500, -0.3);
|
|
||||||
spawn.randomMob(2175, -700, -0.2);
|
|
||||||
spawn.randomMob(-75, -850, -0.1);
|
|
||||||
spawn.randomMob(550, -3400, 0);
|
|
||||||
spawn.randomMob(0, -1175, 0.5);
|
|
||||||
spawn.randomMob(-75, -1150, 0.5);
|
|
||||||
spawn.randomMob(1075, -625, 0.5);
|
|
||||||
spawn.randomMob(800, -3400, -0.3);
|
|
||||||
spawn.randomMob(1225, -3375, -0.2);
|
|
||||||
spawn.randomMob(1200, -1125, -0.1);
|
|
||||||
spawn.randomMob(2050, -950, 0.5);
|
|
||||||
if (simulation.difficulty > 40) {
|
|
||||||
spawn.randomMob(2300, -2775, -0.5);
|
|
||||||
spawn.randomMob(600, -925, -0.5);
|
|
||||||
spawn.randomMob(1550, -2750, -0.5);
|
|
||||||
spawn.randomMob(1350, -1150, -0.5);
|
|
||||||
spawn.randomMob(-75, -1475, 0);
|
|
||||||
spawn.randomGroup(600, -2600, 0);
|
|
||||||
}
|
|
||||||
if (simulation.difficulty > 1) {
|
|
||||||
if (Math.random() < 0.5) {
|
|
||||||
spawn.randomLevelBoss(700, -1550);
|
|
||||||
} else {
|
|
||||||
spawn.randomLevelBoss(675, -2775); //["shooterBoss", "launcherBoss", "laserTargetingBoss", "streamBoss", "shieldingBoss", "pulsarBoss", "grenadierBoss"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
powerUps.addResearchToLevel() //needs to run after mobs are spawned
|
|
||||||
spawn.secondaryBossChance(1925, -1250)
|
|
||||||
|
|
||||||
if (simulation.isHorizontalFlipped) { //flip the map horizontally
|
spawn.mapRect(-1400, -3525, 1600, 3225);
|
||||||
level.flipHorizontal(); //only flips map,body,mob,powerUp,cons,consBB, exit
|
spawn.mapRect(550, 0, 450, 2675);
|
||||||
// level.setPosToSpawn(0, -50); //-x // no need since 0
|
|
||||||
button.min.x = -button.min.x - 126 // flip the button horizontally
|
|
||||||
button.max.x = -button.max.x + 126 // flip the button horizontally
|
|
||||||
buttonDoor.min.x = -buttonDoor.min.x - 126 // flip the button horizontally
|
|
||||||
buttonDoor.max.x = -buttonDoor.max.x + 126 // flip the button horizontally
|
|
||||||
|
|
||||||
//this makes the hazard draw, but not collide for reasons I don't understand
|
spawn.mapRect(550, -1550, 450, 125);
|
||||||
//so don't use it, instead just call the hazard differently based on this flip flag
|
spawn.mapRect(150, -1550, 250, 125);
|
||||||
// hazard.min.x = -hazard.min.x - hazard.width //-x-width
|
spawn.mapRect(750, -1425, 1100, 175);
|
||||||
// hazard.max.x = -hazard.max.x - hazard.width //-x-width
|
spawn.mapRect(750, -1400, 250, 825);
|
||||||
// hazard2.min.x = -hazard2.min.x - hazard2.width //-x-width
|
spawn.mapRect(750, -350, 250, 575);
|
||||||
// hazard2.max.x = -hazard2.max.x - hazard2.width //-x-width
|
// spawn.mapRect(750, -1275, 250, 600);
|
||||||
portal = level.portal({
|
// spawn.mapRect(3550, -1850, 1200, 600);
|
||||||
x: -2475,
|
|
||||||
y: -140
|
|
||||||
}, 2 * Math.PI, { //right
|
|
||||||
x: -2475,
|
|
||||||
y: -3140
|
|
||||||
}, 2 * Math.PI) //right
|
|
||||||
|
|
||||||
portal2 = level.portal({
|
spawn.mapRect(3825, -1425, 975, 175);
|
||||||
x: -75,
|
spawn.mapRect(625, 2050, 4300, 625);
|
||||||
y: -2150
|
spawn.mapRect(4450, -3525, 1400, 6200);
|
||||||
}, -Math.PI / 2, { //up
|
//the pit
|
||||||
x: -1325,
|
const vanish = []
|
||||||
y: -2150
|
vanish.push(level.vanish(400, -1512, 150, 50))
|
||||||
}, -Math.PI / 2) //up
|
vanish.push(level.vanish(2625, -675, 300, 175))
|
||||||
|
vanish.push(level.vanish(1775, -675, 325, 150))
|
||||||
|
//blocks at entrance
|
||||||
|
spawn.bodyRect(150, -175, 50, 165);
|
||||||
|
spawn.bodyRect(825, -425, 155, 75, 0.5);
|
||||||
|
|
||||||
portal3 = level.portal({
|
|
||||||
x: -1850,
|
|
||||||
y: -585
|
|
||||||
}, -Math.PI / 2, { //up
|
|
||||||
x: -2425,
|
|
||||||
y: -600
|
|
||||||
}, -1 * Math.PI / 3) //up left
|
|
||||||
|
|
||||||
// level.custom = () => { };
|
|
||||||
// level.customTopLayer = () => {};
|
|
||||||
|
|
||||||
} else {
|
|
||||||
portal = level.portal({
|
|
||||||
x: 2475,
|
|
||||||
y: -140
|
|
||||||
}, Math.PI, { //left
|
|
||||||
x: 2475,
|
|
||||||
y: -3140
|
|
||||||
}, Math.PI) //left
|
|
||||||
portal2 = level.portal({
|
|
||||||
x: 75,
|
|
||||||
y: -2150
|
|
||||||
}, -Math.PI / 2, { //up
|
|
||||||
x: 1325,
|
|
||||||
y: -2150
|
|
||||||
}, -Math.PI / 2) //up
|
|
||||||
portal3 = level.portal({
|
|
||||||
x: 1850,
|
|
||||||
y: -585
|
|
||||||
}, -Math.PI / 2, { //up
|
|
||||||
x: 2425,
|
|
||||||
y: -600
|
|
||||||
}, -2 * Math.PI / 3) //up left
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
},
|
||||||
sewers() {
|
sewers() {
|
||||||
@@ -8219,8 +8012,8 @@ const level = {
|
|||||||
let r = false;
|
let r = false;
|
||||||
const deliverySlime = level.hazard(3700, -940, 100, 480)
|
const deliverySlime = level.hazard(3700, -940, 100, 480)
|
||||||
const deliverySlime2 = level.hazard(3700, -461, 100, 1141)
|
const deliverySlime2 = level.hazard(3700, -461, 100, 1141)
|
||||||
const slimePit = level.hazard(700, 1200, 2500, 1300, 0.004, "hsla(160, 100%, 35%,0.75)")
|
const slimePit = level.hazard(700, 1200, 2500, 1300, 0.004)
|
||||||
const topSlime = level.hazard(800, -460, 2900, 90, 0.004, "hsla(160, 100%, 35%,0.75)")
|
const topSlime = level.hazard(800, -460, 2900, 90, 0.004)
|
||||||
// const rotor = level.rotor(0, -725, 0.001)
|
// const rotor = level.rotor(0, -725, 0.001)
|
||||||
const rotor = level.rotor(-400, -725, 800, 50, 0.001, 0, 0.01, 0, 0.001)
|
const rotor = level.rotor(-400, -725, 800, 50, 0.001, 0, 0.01, 0, 0.001)
|
||||||
|
|
||||||
@@ -11869,7 +11662,7 @@ const level = {
|
|||||||
const hazard3 = level.hazard(740, -1050, 10, 700, 0.4)
|
const hazard3 = level.hazard(740, -1050, 10, 700, 0.4)
|
||||||
const hazard4 = level.hazard(3400, -380, 350, 6, 0.2)
|
const hazard4 = level.hazard(3400, -380, 350, 6, 0.2)
|
||||||
const hazard5 = level.hazard(3425, -1420, 400, 8, 0.2)
|
const hazard5 = level.hazard(3425, -1420, 400, 8, 0.2)
|
||||||
const slimePit = level.hazard(2250, -100, 2700, 200, 0.004, "hsla(160, 100%, 35%,0.75)")
|
const slimePit = level.hazard(2250, -100, 2700, 200, 0.004)
|
||||||
const door2 = level.door(3131, -898, 40, 520, 522)
|
const door2 = level.door(3131, -898, 40, 520, 522)
|
||||||
const buttonDoor2 = level.button(2495, -270)
|
const buttonDoor2 = level.button(2495, -270)
|
||||||
const toggle = level.toggle(1463, -708, true)
|
const toggle = level.toggle(1463, -708, true)
|
||||||
|
|||||||
22
js/player.js
@@ -3016,20 +3016,10 @@ const m = {
|
|||||||
//not shooting (or using field) enable cloak
|
//not shooting (or using field) enable cloak
|
||||||
if (m.energy < 0.05 && m.fireCDcycle < m.cycle && !input.fire) m.fireCDcycle = m.cycle
|
if (m.energy < 0.05 && m.fireCDcycle < m.cycle && !input.fire) m.fireCDcycle = m.cycle
|
||||||
if (m.fireCDcycle + 30 < m.cycle && !input.fire) { //automatically cloak if not firing
|
if (m.fireCDcycle + 30 < m.cycle && !input.fire) { //automatically cloak if not firing
|
||||||
const drain = 0.05
|
const drain = 0.03
|
||||||
if (!m.isCloak && m.energy > drain + 0.05) {
|
if (!m.isCloak && m.energy > drain + 0.03) {
|
||||||
m.energy -= drain
|
m.energy -= drain
|
||||||
m.isCloak = true //enter cloak
|
m.isCloak = true //enter cloak
|
||||||
|
|
||||||
|
|
||||||
// m.color = {
|
|
||||||
// hue: 0,
|
|
||||||
// sat: 0,
|
|
||||||
// light: 100
|
|
||||||
// }
|
|
||||||
// m.setFillColorsAlpha(0)
|
|
||||||
|
|
||||||
|
|
||||||
m.enterCloakCycle = m.cycle
|
m.enterCloakCycle = m.cycle
|
||||||
if (tech.isCloakHealLastHit && m.lastHit > 0) {
|
if (tech.isCloakHealLastHit && m.lastHit > 0) {
|
||||||
const heal = Math.min(0.75 * m.lastHit, m.energy)
|
const heal = Math.min(0.75 * m.lastHit, m.energy)
|
||||||
@@ -3063,7 +3053,7 @@ const m = {
|
|||||||
if (tech.isCloakStun) { //stun nearby mobs after exiting cloak
|
if (tech.isCloakStun) { //stun nearby mobs after exiting cloak
|
||||||
let isMobsAround = false
|
let isMobsAround = false
|
||||||
const stunRange = m.fieldDrawRadius * 1.5
|
const stunRange = m.fieldDrawRadius * 1.5
|
||||||
const drain = 0.2
|
const drain = 0.15
|
||||||
if (m.energy > drain) {
|
if (m.energy > drain) {
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) < stunRange && Matter.Query.ray(map, mob[i].position, m.pos).length === 0 && !mob[i].isBadTarget) {
|
if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) < stunRange && Matter.Query.ray(map, mob[i].position, m.pos).length === 0 && !mob[i].isBadTarget) {
|
||||||
@@ -3085,11 +3075,11 @@ const m = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m.isCloak) {
|
if (m.isCloak) {
|
||||||
m.fieldRange = m.fieldRange * 0.9 + 80
|
m.fieldRange = m.fieldRange * 0.85 + 115
|
||||||
m.fieldDrawRadius = m.fieldRange * 0.88 //* Math.min(1, 0.3 + 0.5 * Math.min(1, energy * energy));
|
m.fieldDrawRadius = m.fieldRange * 1.1 //* 0.88 //* Math.min(1, 0.3 + 0.5 * Math.min(1, energy * energy));
|
||||||
m.drawCloak()
|
m.drawCloak()
|
||||||
} else if (m.fieldRange < 4000) {
|
} else if (m.fieldRange < 4000) {
|
||||||
m.fieldRange += 50
|
m.fieldRange += 90
|
||||||
m.fieldDrawRadius = m.fieldRange //* Math.min(1, 0.3 + 0.5 * Math.min(1, energy * energy));
|
m.fieldDrawRadius = m.fieldRange //* Math.min(1, 0.3 + 0.5 * Math.min(1, energy * energy));
|
||||||
m.drawCloak()
|
m.drawCloak()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -305,7 +305,8 @@ const powerUps = {
|
|||||||
document.getElementById("choose-grid").style.pointerEvents = "none";
|
document.getElementById("choose-grid").style.pointerEvents = "none";
|
||||||
document.body.style.cursor = "none";
|
document.body.style.cursor = "none";
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (!tech.isNoDraftPause) document.body.style.cursor = "auto";
|
// if (!tech.isNoDraftPause)
|
||||||
|
document.body.style.cursor = "auto";
|
||||||
document.getElementById("choose-grid").style.pointerEvents = "auto";
|
document.getElementById("choose-grid").style.pointerEvents = "auto";
|
||||||
document.getElementById("choose-grid").style.transitionDuration = "0s";
|
document.getElementById("choose-grid").style.transitionDuration = "0s";
|
||||||
}, 400);
|
}, 400);
|
||||||
@@ -313,7 +314,7 @@ const powerUps = {
|
|||||||
|
|
||||||
if (!simulation.paused) {
|
if (!simulation.paused) {
|
||||||
if (tech.isNoDraftPause) {
|
if (tech.isNoDraftPause) {
|
||||||
document.getElementById("choose-grid").style.opacity = "0.92"
|
document.getElementById("choose-grid").style.opacity = "1"
|
||||||
} else {
|
} else {
|
||||||
simulation.paused = true;
|
simulation.paused = true;
|
||||||
document.getElementById("choose-grid").style.opacity = "1"
|
document.getElementById("choose-grid").style.opacity = "1"
|
||||||
@@ -565,7 +566,7 @@ const powerUps = {
|
|||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
if (b.inventory.length > 0) {
|
if (b.inventory.length > 0) {
|
||||||
if (tech.isAmmoForGun && b.activeGun) { //give extra ammo to one gun only with tech logistics
|
if (tech.isAmmoForGun && b.activeGun !== null) { //give extra ammo to one gun only with tech logistics
|
||||||
const target = b.guns[b.activeGun]
|
const target = b.guns[b.activeGun]
|
||||||
if (target.ammo !== Infinity) {
|
if (target.ammo !== Infinity) {
|
||||||
if (tech.ammoCap) {
|
if (tech.ammoCap) {
|
||||||
@@ -1164,10 +1165,7 @@ const powerUps = {
|
|||||||
if (tech.isLaserMine && input.down) {
|
if (tech.isLaserMine && input.down) {
|
||||||
b.laserMine(who.position)
|
b.laserMine(who.position)
|
||||||
} else {
|
} else {
|
||||||
b.mine(who.position, {
|
b.mine(who.position, { x: 0, y: 0 }, 0)
|
||||||
x: 0,
|
|
||||||
y: 0
|
|
||||||
}, 0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tech.isRelay) {
|
if (tech.isRelay) {
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ const simulation = {
|
|||||||
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
|
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
if (m.fireCDcycle > m.cycle) {
|
if (m.fireCDcycle > m.cycle) {
|
||||||
ctx.strokeStyle = "#777"; //'rgba(0,0,0,0.4)'
|
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
|
||||||
ctx.arc(simulation.mouse.x, simulation.mouse.y, size + 1, 0, 2 * Math.PI);
|
ctx.arc(simulation.mouse.x, simulation.mouse.y, size + 1, 0, 2 * Math.PI);
|
||||||
} else {
|
} else {
|
||||||
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
|
ctx.strokeStyle = "#000"; //'rgba(0,0,0,0.4)'
|
||||||
@@ -474,10 +474,8 @@ const simulation = {
|
|||||||
switchGun() {
|
switchGun() {
|
||||||
if (tech.isLongitudinal && b.activeGun === 3) b.guns[3].waves = []; //empty array of wave bullets
|
if (tech.isLongitudinal && b.activeGun === 3) b.guns[3].waves = []; //empty array of wave bullets
|
||||||
if (tech.crouchAmmoCount) tech.crouchAmmoCount = 1 //this prevents hacking the tech by switching guns
|
if (tech.crouchAmmoCount) tech.crouchAmmoCount = 1 //this prevents hacking the tech by switching guns
|
||||||
if (b.inventory.length > 0) {
|
if (b.inventory.length > 0) b.activeGun = b.inventory[b.inventoryGun];
|
||||||
b.activeGun = b.inventory[b.inventoryGun];
|
b.guns[8].charge = 0; // foam charge to 0
|
||||||
if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //if switching into foam set charge to 0
|
|
||||||
}
|
|
||||||
simulation.updateGunHUD();
|
simulation.updateGunHUD();
|
||||||
simulation.boldActiveGunHUD();
|
simulation.boldActiveGunHUD();
|
||||||
//set crosshairs
|
//set crosshairs
|
||||||
@@ -774,8 +772,6 @@ const simulation = {
|
|||||||
|
|
||||||
input.endKeySensing();
|
input.endKeySensing();
|
||||||
b.removeAllGuns();
|
b.removeAllGuns();
|
||||||
simulation.switchGun();
|
|
||||||
|
|
||||||
tech.setupAllTech(); //sets tech to default values
|
tech.setupAllTech(); //sets tech to default values
|
||||||
tech.cancelCount = 0;
|
tech.cancelCount = 0;
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
@@ -904,28 +900,30 @@ const simulation = {
|
|||||||
clearMap() {
|
clearMap() {
|
||||||
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
||||||
if (m.alive) {
|
if (m.alive) {
|
||||||
if (tech.isLongitudinal) {
|
if (tech.isLongitudinal) b.guns[3].waves = []; //empty array of wave bullets
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
if (b.guns[10].have) { //do you have mines as a gun
|
||||||
if (b.guns[i].name === "wave") {
|
let count = 0;
|
||||||
b.guns[i].waves = []; //empty array of wave bullets
|
for (i = 0, len = bullet.length; i < len; i++) { //count mines left on map
|
||||||
break;
|
if (
|
||||||
|
(bullet[i].bulletType === "mine" && (!tech.isMineSentry || bullet[i].shots === undefined)) ||
|
||||||
|
bullet[i].bulletType === "laser mine") {
|
||||||
|
count++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (tech.crouchAmmoCount) count = Math.ceil(count / 2)
|
||||||
|
b.guns[10].ammo += count
|
||||||
|
if (tech.ammoCap) b.guns[10].ammo = Math.min(tech.ammoCap, b.guns[10].ammo)
|
||||||
|
simulation.updateGunHUD();
|
||||||
}
|
}
|
||||||
|
|
||||||
let count = 0;
|
// for (i = 0, len = b.guns.length; i < len; i++) { //find which gun is mine
|
||||||
for (i = 0, len = bullet.length; i < len; i++) { //count mines left on map
|
// if (b.guns[i].name === "mine") {
|
||||||
if ((bullet[i].bulletType === "mine" || bullet[i].bulletType === "laser mine") && !bullet[i].isArmed) count++
|
// b.guns[i].ammo += count
|
||||||
}
|
// if (tech.ammoCap) b.guns[i].ammo = Math.min(tech.ammoCap, b.guns[i].ammo)
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun is mine
|
// simulation.updateGunHUD();
|
||||||
if (b.guns[i].name === "mine") {
|
// break;
|
||||||
if (tech.crouchAmmoCount) count = Math.ceil(count / 2)
|
// }
|
||||||
b.guns[i].ammo += count
|
// }
|
||||||
if (tech.ammoCap) b.guns[i].ammo = Math.min(tech.ammoCap, b.guns[i].ammo)
|
|
||||||
simulation.updateGunHUD();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tech.isMutualism && !tech.isEnergyHealth) {
|
if (tech.isMutualism && !tech.isEnergyHealth) {
|
||||||
for (let i = 0; i < bullet.length; i++) {
|
for (let i = 0; i < bullet.length; i++) {
|
||||||
|
|||||||
@@ -578,7 +578,7 @@ const spawn = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "laser",
|
name: "laser",
|
||||||
spinForce: 0.00000012, // * (Math.random() < 0.5 ? -1 : 1),
|
spinForce: 0.00000008, // * (Math.random() < 0.5 ? -1 : 1),
|
||||||
fadeCycle: 0, //fades in over 4 seconds
|
fadeCycle: 0, //fades in over 4 seconds
|
||||||
do() {
|
do() {
|
||||||
this.fadeCycle++
|
this.fadeCycle++
|
||||||
|
|||||||
64
js/tech.js
@@ -381,6 +381,14 @@ const tech = {
|
|||||||
if (regex !== -1 && (not === -1 || not > regex)) gunTechPool.push(j) //look for the gun name in the requirements, but the gun name needs to show up before the word ' not '
|
if (regex !== -1 && (not === -1 || not > regex)) gunTechPool.push(j) //look for the gun name in the requirements, but the gun name needs to show up before the word ' not '
|
||||||
}
|
}
|
||||||
b.activeGun = originalActiveGunIndex
|
b.activeGun = originalActiveGunIndex
|
||||||
|
if (!b.guns[b.activeGun].have) {
|
||||||
|
if (b.inventory.length === 0) {
|
||||||
|
b.activeGun = null
|
||||||
|
} else {
|
||||||
|
b.activeGun = b.inventory[0]
|
||||||
|
}
|
||||||
|
b.inventoryGun = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (gunTechPool.length) {
|
if (gunTechPool.length) {
|
||||||
const index = Math.floor(Math.random() * gunTechPool.length)
|
const index = Math.floor(Math.random() * gunTechPool.length)
|
||||||
@@ -4356,7 +4364,7 @@ const tech = {
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isMineDrop + tech.isNailBotUpgrade + tech.fragments + tech.nailsDeathMob + (tech.haveGunCheck("super balls") + (tech.haveGunCheck("mine") && !(tech.isFoamMine || tech.isSuperMine)) + (tech.haveGunCheck("nail gun")) + tech.isNeedles + tech.isNailShot + tech.isRivets) * 2 > 1
|
return tech.isMineDrop + tech.isNailBotUpgrade + tech.fragments + tech.nailsDeathMob + (tech.haveGunCheck("super balls") + (tech.haveGunCheck("mine") && !tech.isFoamMine) + (tech.haveGunCheck("nail gun")) + tech.isNeedles + tech.isNailShot + tech.isRivets) * 2 > 1
|
||||||
},
|
},
|
||||||
requires: "nails, nail gun, rivets, shotgun, super balls, mine",
|
requires: "nails, nail gun, rivets, shotgun, super balls, mine",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -5280,26 +5288,26 @@ const tech = {
|
|||||||
if (this.count > 0) powerUps.research.changeRerolls(3)
|
if (this.count > 0) powerUps.research.changeRerolls(3)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
name: "electric armor",
|
// name: "electric armor",
|
||||||
// description: "<strong class='color-e'>explosions</strong> do no <strong class='color-defense'>defense</strong><br> while your <strong class='color-f'>energy</strong> is above <strong>98%</strong>",
|
// // description: "<strong class='color-e'>explosions</strong> do no <strong class='color-defense'>defense</strong><br> while your <strong class='color-f'>energy</strong> is above <strong>98%</strong>",
|
||||||
description: "instead of causing <strong class='color-h'>health</strong> loss, <strong class='color-e'>explosions</strong><br>drain <strong>12</strong> <strong class='color-f'>energy</strong> and have more knockback",
|
// description: "instead of causing <strong class='color-h'>health</strong> loss, <strong class='color-e'>explosions</strong><br>drain <strong>12</strong> <strong class='color-f'>energy</strong> and have more knockback",
|
||||||
isGunTech: true,
|
// isGunTech: true,
|
||||||
maxCount: 1,
|
// maxCount: 1,
|
||||||
count: 0,
|
// count: 0,
|
||||||
frequency: 2,
|
// frequency: 2,
|
||||||
frequencyDefault: 2,
|
// frequencyDefault: 2,
|
||||||
allowed() {
|
// allowed() {
|
||||||
return !tech.isSmartRadius && !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
|
// return !tech.isSmartRadius && !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
|
||||||
},
|
// },
|
||||||
requires: "an explosive damage source, not iridium-192",
|
// requires: "an explosive damage source, not iridium-192",
|
||||||
effect() {
|
// effect() {
|
||||||
tech.isImmuneExplosion = true;
|
// tech.isImmuneExplosion = true;
|
||||||
},
|
// },
|
||||||
remove() {
|
// remove() {
|
||||||
tech.isImmuneExplosion = false;
|
// tech.isImmuneExplosion = false;
|
||||||
}
|
// }
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
name: "MIRV",
|
name: "MIRV",
|
||||||
description: "fire <strong>+1</strong> <strong>missile</strong> or <strong>grenade</strong> per shot<br><strong>–12%</strong> <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and <strong>radius</strong>",
|
description: "fire <strong>+1</strong> <strong>missile</strong> or <strong>grenade</strong> per shot<br><strong>–12%</strong> <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and <strong>radius</strong>",
|
||||||
@@ -5321,21 +5329,23 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "rocket-propelled grenade",
|
name: "rocket-propelled grenade",
|
||||||
description: "<strong>grenades</strong> rapidly <strong>accelerate</strong> forward<br>map <strong>collisions</strong> trigger an <strong class='color-e'>explosion</strong>",
|
description: "<strong>grenades</strong> <strong class='color-e'>explode</strong> on map <strong>collisions</strong><br><strong class='color-e'>explosions</strong> drain <strong class='color-f'>energy</strong>, not <strong class='color-h'>health</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("grenades")
|
return tech.haveGunCheck("grenades") && !tech.isVacuumBomb
|
||||||
},
|
},
|
||||||
requires: "grenades",
|
requires: "grenades, not vacuum bomb",
|
||||||
effect() {
|
effect() {
|
||||||
|
tech.isImmuneExplosion = true;
|
||||||
tech.isRPG = true;
|
tech.isRPG = true;
|
||||||
b.setGrenadeMode()
|
b.setGrenadeMode()
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
|
tech.isImmuneExplosion = true;
|
||||||
tech.isRPG = false;
|
tech.isRPG = false;
|
||||||
b.setGrenadeMode()
|
b.setGrenadeMode()
|
||||||
}
|
}
|
||||||
@@ -5349,9 +5359,9 @@ const tech = {
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isBlockExplode
|
return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isBlockExplode && !tech.isRPG
|
||||||
},
|
},
|
||||||
requires: "grenades, not neutron bomb, chain reaction",
|
requires: "grenades, not neutron bomb, chain reaction, RPG",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isVacuumBomb = true;
|
tech.isVacuumBomb = true;
|
||||||
b.setGrenadeMode()
|
b.setGrenadeMode()
|
||||||
@@ -5646,7 +5656,7 @@ const tech = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "sentry gun",
|
name: "sentry",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `<strong>mines</strong> fire one ${b.guns[10].nameString()} at a time<br><strong>mines</strong> fire <strong>50%</strong> more ${b.guns[10].nameString('s')}`
|
return `<strong>mines</strong> fire one ${b.guns[10].nameString()} at a time<br><strong>mines</strong> fire <strong>50%</strong> more ${b.guns[10].nameString('s')}`
|
||||||
},
|
},
|
||||||
|
|||||||
41
style.css
@@ -1,5 +1,7 @@
|
|||||||
:root {
|
:root {
|
||||||
--build-bg-color: #aeb6c2;
|
--build-bg-color: #aeb6c2;
|
||||||
|
--card-color: #fafcfd;
|
||||||
|
--hover-card-color: #e5e5ed;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@@ -185,15 +187,15 @@ summary {
|
|||||||
|
|
||||||
.choose-grid-module {
|
.choose-grid-module {
|
||||||
line-height: 160%;
|
line-height: 160%;
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.choose-grid-module:hover {
|
.choose-grid-module:hover {
|
||||||
background-color: #efeff5;
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
.choose-grid-module:hover .card-text {
|
.choose-grid-module:hover .card-text {
|
||||||
background-color: #efeff5;
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.research-select {
|
.research-select {
|
||||||
@@ -244,7 +246,7 @@ summary {
|
|||||||
|
|
||||||
.pause-grid-module {
|
.pause-grid-module {
|
||||||
line-height: 160%;
|
line-height: 160%;
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,7 +278,7 @@ summary {
|
|||||||
|
|
||||||
.experiment-grid-module {
|
.experiment-grid-module {
|
||||||
line-height: 160%;
|
line-height: 160%;
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,11 +294,11 @@ summary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.experiment-grid-module:hover:not(.build-tech-selected, .build-field-selected, .build-gun-selected) {
|
.experiment-grid-module:hover:not(.build-tech-selected, .build-field-selected, .build-gun-selected) {
|
||||||
background-color: #efeff5;
|
background-color: var(--card-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.experiment-start-box{
|
.experiment-start-box{
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
/* font-size: 1em; */
|
/* font-size: 1em; */
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top:0;
|
top:0;
|
||||||
@@ -347,10 +349,10 @@ summary {
|
|||||||
margin-right: -1px;
|
margin-right: -1px;
|
||||||
padding: 1px;
|
padding: 1px;
|
||||||
line-height: 160%;
|
line-height: 160%;
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
}
|
}
|
||||||
.cancel-card:hover {
|
.cancel-card:hover {
|
||||||
background-color: #efeff5;
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
.research-card {
|
.research-card {
|
||||||
font-size: 1.1em;
|
font-size: 1.1em;
|
||||||
@@ -360,15 +362,15 @@ summary {
|
|||||||
margin-right: -1px;
|
margin-right: -1px;
|
||||||
padding: 1px 0px 1px 10px;
|
padding: 1px 0px 1px 10px;
|
||||||
line-height: 160%;
|
line-height: 160%;
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
}
|
}
|
||||||
.research-card:hover {
|
.research-card:hover {
|
||||||
background-color: #efeff5;
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* keeps 5 columns at 1440px */
|
/* keeps 5 columns at 1440px */
|
||||||
@media (1710px <= width < 1950px) {
|
@media (min-width: 1710px) and (max-width: 1950px) {
|
||||||
.experiment-grid-module, .choose-grid-module, .pause-grid-module {
|
.experiment-grid-module, .choose-grid-module, .pause-grid-module {
|
||||||
line-height: 143%;
|
line-height: 143%;
|
||||||
font-size: 0.68em;
|
font-size: 0.68em;
|
||||||
@@ -383,7 +385,8 @@ summary {
|
|||||||
min-height: 75px;
|
min-height: 75px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (width < 1710px) {
|
/* (min-width: 30em) and (max-width: 80em) */
|
||||||
|
@media (max-width: 1709px) {
|
||||||
.experiment-grid-module, .choose-grid-module, .pause-grid-module {
|
.experiment-grid-module, .choose-grid-module, .pause-grid-module {
|
||||||
line-height: 139%;
|
line-height: 139%;
|
||||||
font-size: 0.58em;
|
font-size: 0.58em;
|
||||||
@@ -431,7 +434,7 @@ summary {
|
|||||||
} */
|
} */
|
||||||
|
|
||||||
.experiment-grid-module:hover .card-text {
|
.experiment-grid-module:hover .card-text {
|
||||||
background-color: #efeff5;
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
.build-tech-selected .card-text{
|
.build-tech-selected .card-text{
|
||||||
background-color: hsl(253, 100%, 84%);
|
background-color: hsl(253, 100%, 84%);
|
||||||
@@ -453,9 +456,9 @@ summary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.experiment-grid-disabled {
|
.experiment-grid-disabled {
|
||||||
background-color: var(--build-bg-color);
|
/* background-color: var(--build-bg-color); */
|
||||||
color: #000;
|
/* color: #000; */
|
||||||
opacity: 0.25;
|
opacity: 0.35;
|
||||||
}
|
}
|
||||||
|
|
||||||
.experiment-grid-disabled[data-descr] {
|
.experiment-grid-disabled[data-descr] {
|
||||||
@@ -756,7 +759,7 @@ summary {
|
|||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
}
|
}
|
||||||
.color-cancel {
|
.color-cancel {
|
||||||
background-color: #fafcfd;
|
background-color: var(--card-color);
|
||||||
border: 0.15em #444 solid;
|
border: 0.15em #444 solid;
|
||||||
padding: 0.2em;
|
padding: 0.2em;
|
||||||
border-radius: 0.2em;
|
border-radius: 0.2em;
|
||||||
@@ -980,7 +983,7 @@ summary {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
letter-spacing: 10px;
|
letter-spacing: 10px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: #efeff5;
|
background-color: var(--card-color);
|
||||||
}
|
}
|
||||||
.flipX {
|
.flipX {
|
||||||
animation: 14s anim-flipX linear infinite;
|
animation: 14s anim-flipX linear infinite;
|
||||||
|
|||||||
99
todo.txt
@@ -1,25 +1,64 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
|
tech: RPG - gains the rocket jumping effects from electric armor
|
||||||
|
|
||||||
tech: repeater - shotgun gets another shot, and a longer fire delay
|
eternalism no longer makes tech options have 50% opacity when choosing
|
||||||
shotgun cross hairs show when fire is on cooldown
|
|
||||||
|
|
||||||
keys 1,2,3,4,5,6,7,8,9,0,-,= switch to a gun in your inventory
|
some new images for cloaking tech
|
||||||
Nerfed blinkBoss health and speed
|
and some images were made brighter
|
||||||
sneaker mobs are immune to harm for one cycles after vanishing
|
|
||||||
experiment button new style
|
|
||||||
new images for energy, bots
|
|
||||||
|
|
||||||
bug fixes
|
bug fixes
|
||||||
|
safari media rules css fixed
|
||||||
|
|
||||||
*********************************************************** TODO *****************************************************
|
*********************************************************** TODO *****************************************************
|
||||||
|
|
||||||
|
|
||||||
|
tech: maybe missiles explode when they hit walls, but explosions only drain energy
|
||||||
|
|
||||||
|
tech: sticky grenades
|
||||||
|
needs another effect to be good enough
|
||||||
|
stick to mobs?
|
||||||
|
|
||||||
|
testChamber2
|
||||||
|
mechanics
|
||||||
|
cover exit with slime, press button to lower slime and exit
|
||||||
|
companion cube
|
||||||
|
bring cube to the end and use it to unlock research
|
||||||
|
level draws on the block to show it's different
|
||||||
|
only this block can trigger a button?
|
||||||
|
if cube no longer exists or is off the map spawn a new one
|
||||||
|
or maybe add a button for the player to destroy current cube and spawn new cube
|
||||||
|
double portal fling chain
|
||||||
|
for player?
|
||||||
|
for cube
|
||||||
|
button that activates a laser beam that hits a target and opens a door
|
||||||
|
in order to enter the door you need to place the cube on the button to activate the laser
|
||||||
|
cube has to fly through a portal in order to get to the button
|
||||||
|
you can't use your body
|
||||||
|
story:
|
||||||
|
you pick up the cube early on and have to get it to a button
|
||||||
|
you run through the level to get the cube, clearing the level of mobs
|
||||||
|
picking up the cube spawns the boss
|
||||||
|
maybe an extra hard boss that is designed for that level
|
||||||
|
blockBoss?
|
||||||
|
you must get the cube to a button near the start of the level
|
||||||
|
the button opens a door
|
||||||
|
normal blocks don't work
|
||||||
|
normal blocks spawn into mobs like blockBoss
|
||||||
|
or mobs don't spawn blocks
|
||||||
|
or just the code looks for the cube
|
||||||
|
or the cube is resting on a button, and when you take the cube off the button the laser fires
|
||||||
|
|
||||||
|
|
||||||
|
make a mob similar to slasher
|
||||||
|
because it's just a very well made mob.
|
||||||
|
|
||||||
|
|
||||||
tech - only allow 1,2 turrets at time?
|
tech - only allow 1,2 turrets at time?
|
||||||
turrets drain energy?
|
|
||||||
turrets never run out of ammo
|
turrets never run out of ammo
|
||||||
turrets automatically use one of your mine ammos when they run out?
|
or turrets automatically use one of your mine ammos when they run out?
|
||||||
good with multi gun builds
|
good with multi gun builds
|
||||||
conflict with booby trap
|
conflict with booby trap?
|
||||||
|
|
||||||
tech: Bose Einstein condensate - freezes enemies in pilot wave, and drains some energy?
|
tech: Bose Einstein condensate - freezes enemies in pilot wave, and drains some energy?
|
||||||
|
|
||||||
@@ -62,14 +101,6 @@ tech: sporangium that grow little trees
|
|||||||
the trees have an area of effect damage for about 6-10 seconds
|
the trees have an area of effect damage for about 6-10 seconds
|
||||||
maybe something similar to radioactive drones, but maybe a few smaller shapes
|
maybe something similar to radioactive drones, but maybe a few smaller shapes
|
||||||
|
|
||||||
spores, worms, fleas - can target player
|
|
||||||
when to target player
|
|
||||||
probably have to not go after player for at least a few seconds
|
|
||||||
only go after player if there are no mobs
|
|
||||||
go after what ever is closest target
|
|
||||||
go after a random target
|
|
||||||
if distance to player < 60 damage player
|
|
||||||
|
|
||||||
new bot type that makes phonon waves
|
new bot type that makes phonon waves
|
||||||
name: phono-bot?
|
name: phono-bot?
|
||||||
each bot has to generate it themselves, can't run code in gun.do
|
each bot has to generate it themselves, can't run code in gun.do
|
||||||
@@ -337,34 +368,6 @@ make plasma ball power up and block pick up still work when you have no no energ
|
|||||||
tech: entropic gravity - gain defense for each research
|
tech: entropic gravity - gain defense for each research
|
||||||
requires wormhole or pilot wave or negative mass field?
|
requires wormhole or pilot wave or negative mass field?
|
||||||
|
|
||||||
testChamber2
|
|
||||||
mechanics
|
|
||||||
companion cube
|
|
||||||
bring cube to the end and use it to unlock research
|
|
||||||
level draws on the block to show it's different
|
|
||||||
only this block can trigger a button
|
|
||||||
if cube no longer exists or is off the map spawn a new one
|
|
||||||
double portal fling chain
|
|
||||||
for player?
|
|
||||||
for cube
|
|
||||||
button that activates a laser beam that hits a target and opens a door
|
|
||||||
in order to enter the door you need to place the cube on the button to activate the laser
|
|
||||||
cube has to fly through a portal in order to get to the button
|
|
||||||
you can't use your body
|
|
||||||
story:
|
|
||||||
you pick up the cube early on and have to get it to a button
|
|
||||||
you run through the level to get the cube, clearing the level of mobs
|
|
||||||
picking up the cube spawns the boss
|
|
||||||
maybe an extra hard boss that is designed for that level
|
|
||||||
blockBoss?
|
|
||||||
you must get the cube to a button near the start of the level
|
|
||||||
the button opens a door
|
|
||||||
normal blocks don't work
|
|
||||||
normal blocks spawn into mobs like blockBoss
|
|
||||||
or mobs don't spawn blocks
|
|
||||||
or just the code looks for the cube
|
|
||||||
or the cube is resting on a button, and when you take the cube off the button the laser fires
|
|
||||||
|
|
||||||
mitosis: after needle,bullets or rivets hit a surface split off into two smaller less damaging versions that have their velocity reset -firerate
|
mitosis: after needle,bullets or rivets hit a surface split off into two smaller less damaging versions that have their velocity reset -firerate
|
||||||
|
|
||||||
after killing a mob go invulnerable for 1 second
|
after killing a mob go invulnerable for 1 second
|
||||||
@@ -1164,9 +1167,9 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
|
|||||||
quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
|
quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
|
||||||
***major themes missing***
|
***major themes missing***
|
||||||
***maybe redo***
|
***maybe redo***
|
||||||
dynamical systems
|
|
||||||
heuristics
|
heuristics
|
||||||
negative feedback - too dark
|
negative feedback - too dark
|
||||||
|
supercritical fission
|
||||||
***past style themes***
|
***past style themes***
|
||||||
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute
|
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute
|
||||||
standing wave - concentric transparent blue geometric circles science
|
standing wave - concentric transparent blue geometric circles science
|
||||||
@@ -1174,7 +1177,7 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
|
|||||||
time dilation - graphic of a hyperbolic equation Luminogram
|
time dilation - graphic of a hyperbolic equation Luminogram
|
||||||
negative mass - Blacklight painting by Moebius
|
negative mass - Blacklight painting by Moebius
|
||||||
plasma torch - by Dan Mumford
|
plasma torch - by Dan Mumford
|
||||||
metamaterial cloaking - Scientific photography by Miki Asai
|
metamaterial cloaking - Scientific photography by Miki Asai, by Bruce Munro
|
||||||
molecular assembler - by Laurie Greasley 16-bit Isometric
|
molecular assembler - by Laurie Greasley 16-bit Isometric
|
||||||
wormhole - by Tim White
|
wormhole - by Tim White
|
||||||
|
|
||||||
|
|||||||