borders for no image selection menu
mob damage difficulty setting is lower recycling now flashes green when it heals merged cancel and research bars for single column selection added some dark grey borders for no images selection mode new images with midJourney V5 spores, pilot wave, standing wave bug fixes
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 79 KiB |
@@ -106,6 +106,7 @@
|
|||||||
<option value="staircase">
|
<option value="staircase">
|
||||||
<option value="perplex">
|
<option value="perplex">
|
||||||
<option value="n-gon">
|
<option value="n-gon">
|
||||||
|
<option value="buttonbutton">
|
||||||
<option value="vats">
|
<option value="vats">
|
||||||
<option value="yingYang">
|
<option value="yingYang">
|
||||||
<option value="basement">
|
<option value="basement">
|
||||||
|
|||||||
13
js/bullet.js
@@ -3750,8 +3750,8 @@ const b = {
|
|||||||
bullet[me] = Bodies.polygon(where.x, where.y, 12, radius, b.fireAttributes(dir, false));
|
bullet[me] = Bodies.polygon(where.x, where.y, 12, radius, b.fireAttributes(dir, false));
|
||||||
Composite.add(engine.world, bullet[me]); //add bullet to world
|
Composite.add(engine.world, bullet[me]); //add bullet to world
|
||||||
Matter.Body.setVelocity(bullet[me], velocity);
|
Matter.Body.setVelocity(bullet[me], velocity);
|
||||||
Matter.Body.setDensity(bullet[me], 0.0008 + 0.0006 * tech.isSuperHarm);
|
Matter.Body.setDensity(bullet[me], 0.0007 + 0.00055 * tech.isSuperHarm);
|
||||||
bullet[me].endCycle = simulation.cycle + Math.floor(300 + 90 * Math.random());
|
bullet[me].endCycle = simulation.cycle + Math.floor(270 + 90 * Math.random());
|
||||||
bullet[me].minDmgSpeed = 0;
|
bullet[me].minDmgSpeed = 0;
|
||||||
bullet[me].restitution = 1;
|
bullet[me].restitution = 1;
|
||||||
bullet[me].frictionAir = 0;
|
bullet[me].frictionAir = 0;
|
||||||
@@ -3854,7 +3854,7 @@ const b = {
|
|||||||
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
|
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const radius = (11 + 10 * tech.oneSuperBall) * tech.bulletSize
|
const radius = (11 + 9 * tech.oneSuperBall) * tech.bulletSize
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
if (targets.length > 0) { // aim near a random target in array
|
if (targets.length > 0) { // aim near a random target in array
|
||||||
const index = Math.floor(Math.random() * targets.length)
|
const index = Math.floor(Math.random() * targets.length)
|
||||||
@@ -5032,7 +5032,6 @@ const b = {
|
|||||||
const dir = m.angle;
|
const dir = m.angle;
|
||||||
const RADIUS = (14 + 6 * Math.random())
|
const RADIUS = (14 + 6 * Math.random())
|
||||||
bullet[me] = Bodies.polygon(position.x, position.y, 3, RADIUS, {
|
bullet[me] = Bodies.polygon(position.x, position.y, 3, RADIUS, {
|
||||||
// isUpgraded: tech.isLaserBotUpgrade,
|
|
||||||
botType: "laser",
|
botType: "laser",
|
||||||
angle: dir,
|
angle: dir,
|
||||||
friction: 0,
|
friction: 0,
|
||||||
@@ -5049,9 +5048,9 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
|
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
|
||||||
range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
|
range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
|
||||||
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,
|
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,// laser bot will not attack if the player is below this energy
|
||||||
drain: (0.5 - 0.44 * tech.isLaserBotUpgrade) * tech.laserDrain,
|
drain: (0.52 - 0.44 * tech.isLaserBotUpgrade) * tech.laserDrain,
|
||||||
laserDamage: 0.85 + 0.8 * tech.isLaserBotUpgrade,
|
laserDamage: 0.82 + 0.8 * tech.isLaserBotUpgrade,
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
|
|||||||
19
js/index.js
@@ -287,18 +287,18 @@ const build = {
|
|||||||
localSettings.isHideImages = !localSettings.isHideImages
|
localSettings.isHideImages = !localSettings.isHideImages
|
||||||
if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||||
if (from === 'experiment') {
|
if (from === 'experiment') {
|
||||||
// build.startExperiment()
|
|
||||||
// openExperimentMenu()
|
|
||||||
build.reset();
|
build.reset();
|
||||||
// build.populateGrid();
|
|
||||||
// build.choosePowerUp(null, 'none')
|
|
||||||
} else if (from === 'pause') {
|
} else if (from === 'pause') {
|
||||||
build.unPauseGrid()
|
build.unPauseGrid()
|
||||||
build.pauseGrid() //redraw pause text with images
|
build.pauseGrid() //redraw pause text with images
|
||||||
} else { //settings
|
|
||||||
//nothing needs to be here I think
|
|
||||||
}
|
}
|
||||||
|
if (localSettings.isHideImages) {
|
||||||
|
document.getElementById("choose-grid").classList.add('choose-grid-no-images');
|
||||||
|
document.getElementById("choose-grid").classList.remove('choose-grid');
|
||||||
|
} else {
|
||||||
|
document.getElementById("choose-grid").classList.add('choose-grid');
|
||||||
|
document.getElementById("choose-grid").classList.remove('choose-grid-no-images');
|
||||||
|
}
|
||||||
document.getElementById("hide-images").checked = localSettings.isHideImages
|
document.getElementById("hide-images").checked = localSettings.isHideImages
|
||||||
// console.log(localSettings.isHideImages, from)
|
// console.log(localSettings.isHideImages, from)
|
||||||
},
|
},
|
||||||
@@ -1310,7 +1310,7 @@ window.addEventListener("keydown", function(event) {
|
|||||||
break
|
break
|
||||||
case "b":
|
case "b":
|
||||||
tech.isRerollDamage = true
|
tech.isRerollDamage = true
|
||||||
powerUps.research.changeRerolls(100000)
|
powerUps.research.changeRerolls(1000000)
|
||||||
break
|
break
|
||||||
case "r":
|
case "r":
|
||||||
m.resetHistory();
|
m.resetHistory();
|
||||||
@@ -1681,6 +1681,9 @@ if (!localSettings.isHideImages) {
|
|||||||
}
|
}
|
||||||
// console.log(urls, images)
|
// console.log(urls, images)
|
||||||
});
|
});
|
||||||
|
document.getElementById("choose-grid").classList.add('choose-grid');
|
||||||
|
} else {
|
||||||
|
document.getElementById("choose-grid").classList.add('choose-grid-no-images');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1077
js/level.js
10
js/lore.js
@@ -2,15 +2,7 @@ const lore = {
|
|||||||
techCount: 0,
|
techCount: 0,
|
||||||
techGoal: 7,
|
techGoal: 7,
|
||||||
setTechGoal() {
|
setTechGoal() {
|
||||||
if (simulation.difficultyMode === 1) {
|
this.techGoal = Math.max(1, Math.floor(8 - 1.5 * simulation.difficultyMode))
|
||||||
this.techGoal = 8
|
|
||||||
} else if (simulation.difficultyMode === 2) {
|
|
||||||
this.techGoal = 5
|
|
||||||
} else if (simulation.difficultyMode === 4) {
|
|
||||||
this.techGoal = 2
|
|
||||||
} else if (simulation.difficultyMode === 6) {
|
|
||||||
this.techGoal = 1
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
talkingColor: "#dff", //set color of graphic on level.null
|
talkingColor: "#dff", //set color of graphic on level.null
|
||||||
isSpeech: false,
|
isSpeech: false,
|
||||||
|
|||||||
48
js/player.js
@@ -1895,13 +1895,15 @@ const m = {
|
|||||||
},
|
},
|
||||||
setFieldRegen() {
|
setFieldRegen() {
|
||||||
if (m.fieldMode === 6) {
|
if (m.fieldMode === 6) {
|
||||||
m.fieldRegen = 0.002333 //14 energy per second
|
m.fieldRegen = 0.002 //12 energy per second for time dilation
|
||||||
} else if (m.fieldMode === 2) {
|
} else if (m.fieldMode === 2) {
|
||||||
m.fieldRegen = 0.000833 //5 energy per second
|
m.fieldRegen = 0.000833 //5 energy per second perfect dia
|
||||||
} else if (m.fieldMode === 4) {
|
} else if (m.fieldMode === 4) {
|
||||||
m.fieldRegen = 0.002 //12 energy per second
|
m.fieldRegen = 0.002 //12 energy per second molecular assembler
|
||||||
} else if (m.fieldMode === 5) {
|
} else if (m.fieldMode === 5) {
|
||||||
m.fieldRegen = 0.001667 //10 energy per second
|
m.fieldRegen = 0.001667 //10 energy per second plasma torch
|
||||||
|
} else if (m.fieldMode === 8) {
|
||||||
|
m.fieldRegen = 0.001667 //10 energy per second pilot wave
|
||||||
} else {
|
} else {
|
||||||
m.fieldRegen = 0.001 //6 energy per second
|
m.fieldRegen = 0.001 //6 energy per second
|
||||||
}
|
}
|
||||||
@@ -3608,7 +3610,7 @@ const m = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "time dilation",
|
name: "time dilation",
|
||||||
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br><strong>+20%</strong> movement and <strong><em>fire rate</em></strong><br>generate <strong>14</strong> <strong class='color-f'>energy</strong> per second",
|
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br><strong>+20%</strong> movement and <strong><em>fire rate</em></strong><br>generate <strong>12</strong> <strong class='color-f'>energy</strong> per second",
|
||||||
set() {
|
set() {
|
||||||
// m.fieldMeterColor = "#0fc"
|
// m.fieldMeterColor = "#0fc"
|
||||||
// m.fieldMeterColor = "#ff0"
|
// m.fieldMeterColor = "#ff0"
|
||||||
@@ -4075,7 +4077,7 @@ const m = {
|
|||||||
//<br><strong class='color-block'>blocks</strong> can't <strong>collide</strong> with <strong>intangible</strong> mobs
|
//<br><strong class='color-block'>blocks</strong> can't <strong>collide</strong> with <strong>intangible</strong> mobs
|
||||||
//field <strong>radius</strong> decreases out of <strong>line of sight</strong>
|
//field <strong>radius</strong> decreases out of <strong>line of sight</strong>
|
||||||
//<strong>unlock</strong> <strong class='color-m'>tech</strong> from other <strong class='color-f'>fields</strong>
|
//<strong>unlock</strong> <strong class='color-m'>tech</strong> from other <strong class='color-f'>fields</strong>
|
||||||
description: "use <strong class='color-f'>energy</strong> to guide <strong class='color-block'>blocks</strong><br><strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>+1</strong> <strong>choice</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
description: "use <strong class='color-f'>energy</strong> to guide <strong class='color-block'>blocks</strong><br><strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>+1</strong> <strong>choice</strong><br>generate <strong>10</strong> <strong class='color-f'>energy</strong> per second",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
m.fieldMeterColor = "#333"
|
m.fieldMeterColor = "#333"
|
||||||
m.eyeFillColor = m.fieldMeterColor
|
m.eyeFillColor = m.fieldMeterColor
|
||||||
@@ -4609,6 +4611,40 @@ const m = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (true && m.energy > 0.5) { //teleport away low mass mobs
|
||||||
|
// // && !(m.cycle % 1)
|
||||||
|
// const hit = Matter.Query.region(mob, {
|
||||||
|
// min: {
|
||||||
|
// x: m.pos.x - 80,
|
||||||
|
// y: m.pos.y - 80
|
||||||
|
// },
|
||||||
|
// max: {
|
||||||
|
// x: m.pos.x + 80,
|
||||||
|
// y: m.pos.y + 160
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
|
||||||
|
// // find incoming mob with low mass
|
||||||
|
// for (let i = 0; i < hit.length; i++) {
|
||||||
|
// if (hit[i].mass < 4 && m.energy > hit[i].mass * 0.06) {
|
||||||
|
// //is the mob moving towards the player?
|
||||||
|
|
||||||
|
// // console.log('found one', hit[i].mass)
|
||||||
|
// const unit = Vector.normalise(hit[i].velocity)
|
||||||
|
// const jump = Vector.mult(unit, 200)
|
||||||
|
// const where = Vector.add(hit[i].position, jump)
|
||||||
|
// if (Matter.Query.ray(map, hit[i].position, where).length === 0) { // check if space 180 from mob is clear of body and map
|
||||||
|
// // m.energy -= hit[i].mass * 0.06
|
||||||
|
// // m.fieldCDcycle = m.cycle + 30;
|
||||||
|
// simulation.drawList.push({ x: hit[i].position.x, y: hit[i].position.y, radius: 20, color: "#fff", time: 16 });
|
||||||
|
// Matter.Body.setPosition(hit[i], where);
|
||||||
|
// simulation.drawList.push({ x: hit[i].position.x, y: hit[i].position.y, radius: 20, color: "#fff", time: 16 });
|
||||||
|
// }
|
||||||
|
// // break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
// if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
|
// if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
|
||||||
// const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
|
// const justPastMouse = Vector.add(Vector.mult(Vector.normalise(Vector.sub(simulation.mouseInGame, m.pos)), 50), simulation.mouseInGame)
|
||||||
|
|||||||
@@ -639,6 +639,8 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancelText(type) {
|
cancelText(type) {
|
||||||
|
// if (localSettings.isHideImages) { }
|
||||||
|
|
||||||
if (tech.isSuperDeterminism) {
|
if (tech.isSuperDeterminism) {
|
||||||
return `<div></div>`
|
return `<div></div>`
|
||||||
} else if (tech.isCancelTech) {
|
} else if (tech.isCancelTech) {
|
||||||
@@ -655,7 +657,9 @@ const powerUps = {
|
|||||||
text += `<div onclick="powerUps.research.use('${type}')" class='research-card'>` // style = "margin-left: 192px; margin-right: -192px;"
|
text += `<div onclick="powerUps.research.use('${type}')" class='research-card'>` // style = "margin-left: 192px; margin-right: -192px;"
|
||||||
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
||||||
text += `<div><div> <span style="position:relative;">`
|
text += `<div><div> <span style="position:relative;">`
|
||||||
for (let i = 0; i < tech.junkResearchNumber; i++) text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15*i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>`
|
for (let i = 0; i < tech.junkResearchNumber; i++) {
|
||||||
|
text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>`
|
||||||
|
}
|
||||||
text += `</span> <span class='research-select'>pseudoscience</span></div></div></div>`
|
text += `</span> <span class='research-select'>pseudoscience</span></div></div></div>`
|
||||||
} else if (powerUps.research.count > 0) {
|
} else if (powerUps.research.count > 0) {
|
||||||
text += `<div onclick="powerUps.research.use('${type}')" class='research-card' >` // style = "margin-left: 192px; margin-right: -192px;"
|
text += `<div onclick="powerUps.research.use('${type}')" class='research-card' >` // style = "margin-left: 192px; margin-right: -192px;"
|
||||||
@@ -667,6 +671,40 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
return text
|
return text
|
||||||
},
|
},
|
||||||
|
researchAndCancelText(type) {
|
||||||
|
let text = `<div class='research-cancel'>`
|
||||||
|
if (type === "entanglement") {
|
||||||
|
text += `<span class='research-card entanglement flipX' style="width: 275px;"><span style="letter-spacing: 6px;">entanglement</span></span>` //‌
|
||||||
|
} else if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
|
||||||
|
text += `<span onclick="powerUps.research.use('${type}')" class='research-card' style="width: 275px;float: left;">` // style = "margin-left: 192px; margin-right: -192px;"
|
||||||
|
tech.junkResearchNumber = Math.ceil(4 * Math.random())
|
||||||
|
text += `<div><div><span style="position:relative;">`
|
||||||
|
for (let i = 0, len = tech.junkResearchNumber; i < len; i++) {
|
||||||
|
text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15 * i}px ;opacity:0.8; border: 1px #fff solid;width: 1.15em;height: 1.15em;"></div>`
|
||||||
|
}
|
||||||
|
text += `</span> <span class='research-select'>${tech.isResearchReality ? "<span class='alt'>alternate reality</span>" : "research"}</span></div></div></span>`
|
||||||
|
} else if (powerUps.research.count > 0) {
|
||||||
|
text += `<span onclick="powerUps.research.use('${type}')" class='research-card' style="width: 275px;float: left;">` // style = "margin-left: 192px; margin-right: -192px;"
|
||||||
|
text += `<div><div><span style="position:relative;">`
|
||||||
|
let researchCap = 18
|
||||||
|
if (tech.isCancelTech) researchCap -= 2
|
||||||
|
if (canvas.width < 1951) researchCap -= 3
|
||||||
|
if (canvas.width < 1711) researchCap -= 4
|
||||||
|
for (let i = 0, len = Math.min(powerUps.research.count, researchCap); i < len; i++) {
|
||||||
|
text += `<div class="circle-grid research" style="font-size:0.82em; position:absolute; top:0; left:${(18 - len * 0.21) * i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
|
||||||
|
}
|
||||||
|
text += `</span> <span class='research-select'>${tech.isResearchReality ? "<span class='alt'>alternate reality</span>" : "research"}</span></div></div></span>`
|
||||||
|
} else {
|
||||||
|
text += `<span class='research-card' style="width: 275px;float: right; background-color: #bbb;">research</span>` //‌
|
||||||
|
}
|
||||||
|
if (tech.isCancelTech) {
|
||||||
|
text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 115px;float: right;font-size:0.9em;padding-top:5px">randomize</span>`
|
||||||
|
} else {
|
||||||
|
text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 95px;float: right;">cancel</span>`
|
||||||
|
}
|
||||||
|
|
||||||
|
return text + "</div>"
|
||||||
|
},
|
||||||
buildColumns(totalChoices, type) {
|
buildColumns(totalChoices, type) {
|
||||||
let width
|
let width
|
||||||
if (canvas.width < 1710) {
|
if (canvas.width < 1710) {
|
||||||
@@ -676,18 +714,17 @@ const powerUps = {
|
|||||||
} else {
|
} else {
|
||||||
width = "384px"
|
width = "384px"
|
||||||
}
|
}
|
||||||
// if (canvas.width < 1500) {
|
|
||||||
// width = "340px"
|
|
||||||
// } else if (canvas.width < 1950) {
|
|
||||||
// width = "360px"
|
|
||||||
// } else {
|
|
||||||
// width = "384px"
|
|
||||||
// }
|
|
||||||
let text = ""
|
let text = ""
|
||||||
if (totalChoices === 1 || localSettings.isHideImages || canvas.width < 1200) {
|
if (localSettings.isHideImages) {
|
||||||
document.getElementById("choose-grid").style.gridTemplateColumns = width
|
document.getElementById("choose-grid").style.gridTemplateColumns = width
|
||||||
text += powerUps.cancelText(type)
|
text += powerUps.researchAndCancelText(type)
|
||||||
text += powerUps.researchText(type)
|
} else if (totalChoices === 1 || canvas.width < 1200) {
|
||||||
|
document.getElementById("choose-grid").style.gridTemplateColumns = width
|
||||||
|
text += powerUps.researchAndCancelText(type)
|
||||||
|
// console.log('hi')
|
||||||
|
// text += powerUps.cancelText(type)
|
||||||
|
// text += powerUps.researchText(type)
|
||||||
} else if (totalChoices === 2) {
|
} else if (totalChoices === 2) {
|
||||||
document.getElementById("choose-grid").style.gridTemplateColumns = `repeat(2, ${width})`
|
document.getElementById("choose-grid").style.gridTemplateColumns = `repeat(2, ${width})`
|
||||||
text += powerUps.researchText(type)
|
text += powerUps.researchText(type)
|
||||||
|
|||||||
@@ -1137,31 +1137,16 @@ const simulation = {
|
|||||||
// },
|
// },
|
||||||
checks() {
|
checks() {
|
||||||
if (!(m.cycle % 15)) { //4 times a second
|
if (!(m.cycle % 15)) { //4 times a second
|
||||||
//update defense bar
|
const defense = m.defense() //update defense bar
|
||||||
const defense = m.defense()
|
|
||||||
if (m.lastCalculatedDefense !== defense) {
|
if (m.lastCalculatedDefense !== defense) {
|
||||||
document.getElementById("defense-bar").style.width = Math.floor(300 * m.maxHealth * (1 - defense)) + "px";
|
document.getElementById("defense-bar").style.width = Math.floor(300 * m.maxHealth * (1 - defense)) + "px";
|
||||||
|
|
||||||
// if (m.lastCalculatedDefense === 1) document.getElementById("defense-bar").style.display = "inline"
|
|
||||||
// if (defense === 1) document.getElementById("defense-bar").style.display = "none"
|
|
||||||
// Math.pow(m.defense(), 0.13)
|
|
||||||
m.lastCalculatedDefense = defense
|
m.lastCalculatedDefense = defense
|
||||||
// console.log(defense)
|
|
||||||
}
|
}
|
||||||
|
const damage = tech.damageFromTech() //update damage bar
|
||||||
//update damage bar
|
|
||||||
const damage = tech.damageFromTech()
|
|
||||||
if (m.lastCalculatedDamage !== damage) {
|
if (m.lastCalculatedDamage !== damage) {
|
||||||
canvas.width
|
document.getElementById("damage-bar").style.height = Math.floor(Math.atan(0.25 * damage - 0.25) / 1.65 * canvas.height) + "px";
|
||||||
// document.getElementById("damage-bar").style.width = Math.floor(Math.atan(damage - 1) / 6.28 * canvas.width) + "px";
|
|
||||||
document.getElementById("damage-bar").style.height = Math.floor(Math.atan(damage - 1) / 3.14 * canvas.height) + "px";
|
|
||||||
|
|
||||||
m.lastCalculatedDamage = damage
|
m.lastCalculatedDamage = damage
|
||||||
console.log(damage)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!(m.cycle % 60)) { //once a second
|
if (!(m.cycle % 60)) { //once a second
|
||||||
//energy overfill
|
//energy overfill
|
||||||
@@ -1211,7 +1196,17 @@ const simulation = {
|
|||||||
if (isNaN(player.position.x)) m.death();
|
if (isNaN(player.position.x)) m.death();
|
||||||
if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob
|
if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob
|
||||||
if (tech.isEnergyRecovery && m.immuneCycle < m.cycle) m.energy += m.maxEnergy * 0.05
|
if (tech.isEnergyRecovery && m.immuneCycle < m.cycle) m.energy += m.maxEnergy * 0.05
|
||||||
if (tech.isHealthRecovery) m.addHealth(0.005 * m.maxHealth)
|
if (tech.isHealthRecovery) {
|
||||||
|
const heal = 0.005 * m.maxHealth
|
||||||
|
m.addHealth(heal)
|
||||||
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
|
x: m.pos.x,
|
||||||
|
y: m.pos.y,
|
||||||
|
radius: Math.sqrt(heal) * 150,
|
||||||
|
color: "rgba(0,255,200,0.6)",
|
||||||
|
time: 8
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(m.cycle % 420)) { //once every 7 seconds
|
if (!(m.cycle % 420)) { //once every 7 seconds
|
||||||
|
|||||||
14
js/tech.js
@@ -242,7 +242,7 @@ const tech = {
|
|||||||
if (tech.isDamageForGuns) dmg *= 1 + 0.22 * Math.max(0, b.inventory.length - 1)
|
if (tech.isDamageForGuns) dmg *= 1 + 0.22 * Math.max(0, b.inventory.length - 1)
|
||||||
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
|
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
|
||||||
if (tech.isAcidDmg && m.health > 1) dmg *= 1.35;
|
if (tech.isAcidDmg && m.health > 1) dmg *= 1.35;
|
||||||
if (tech.isRerollDamage) dmg *= 1 + 0.03 * powerUps.research.count
|
if (tech.isRerollDamage) dmg *= 1 + Math.max(0, 0.03 * powerUps.research.count)
|
||||||
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
|
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
|
||||||
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
||||||
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
|
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
|
||||||
@@ -3699,7 +3699,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "field coupling",
|
name: "field coupling",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `spawn ${powerUps.orb.coupling(10)}<br>that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `spawn ${powerUps.orb.coupling(10)}<br>that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>` //<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3730,7 +3730,7 @@ const tech = {
|
|||||||
} else {
|
} else {
|
||||||
orbText = powerUps.orb.coupling(converted)
|
orbText = powerUps.orb.coupling(converted)
|
||||||
}
|
}
|
||||||
return `use all your ${powerUps.orb.research(1)} to spawn <strong>${orbText}</strong><br>that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `use all your ${powerUps.orb.research(1)} to spawn <strong>${orbText}</strong><br>that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>`//<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3775,7 +3775,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "virtual particles",
|
name: "virtual particles",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `after mobs <strong>die</strong> they have a <strong>17%</strong> chance to<br>spawn ${powerUps.orb.coupling(1)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `after mobs <strong>die</strong> they have a <strong>17%</strong> chance to<br>spawn ${powerUps.orb.coupling(1)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>` //<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3793,7 +3793,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "fine-structure constant",
|
name: "fine-structure constant",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `spawn ${this.value} ${powerUps.orb.coupling(1)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br><strong>-0.5</strong> <strong class='color-coupling'>coupling</strong> after mob <strong>collisions</strong><br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `spawn ${this.value} ${powerUps.orb.coupling(1)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br><strong>-0.5</strong> <strong class='color-coupling'>coupling</strong> after mob <strong>collisions</strong>`//<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3817,7 +3817,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "residual dipolar coupling",
|
name: "residual dipolar coupling",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `clicking <strong class='color-cancel'>cancel</strong> for a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns ${powerUps.orb.coupling(5)}that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `clicking <strong class='color-cancel'>cancel</strong> for a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns ${powerUps.orb.coupling(5)}that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>`//<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -7234,7 +7234,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "triple point",
|
name: "triple point",
|
||||||
descriptionFunction() {
|
descriptionFunction() {
|
||||||
return `<strong>+1.5</strong> second <strong class='color-s'>ice IX</strong> freeze effect<br>spawn ${powerUps.orb.coupling(10)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
return `<strong>+1.5</strong> second <strong class='color-s'>ice IX</strong> freeze effect<br>spawn ${powerUps.orb.coupling(10)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>` //<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
|
||||||
},
|
},
|
||||||
isFieldTech: true,
|
isFieldTech: true,
|
||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
|
|||||||
63
style.css
@@ -161,7 +161,7 @@ summary {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#choose-grid {
|
.choose-grid {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
@@ -180,9 +180,34 @@ summary {
|
|||||||
transition: opacity 0.25s linear;
|
transition: opacity 0.25s linear;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
/* IE and Edge */
|
|
||||||
scrollbar-width: none;
|
scrollbar-width: none;
|
||||||
/* Firefox */
|
}
|
||||||
|
|
||||||
|
.choose-grid-no-images {
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 10px solid #444;
|
||||||
|
gap: 10px;
|
||||||
|
background-color: #444;
|
||||||
|
/* padding: 10px 1px; */
|
||||||
|
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
margin: 0px;
|
||||||
|
z-index: 12;
|
||||||
|
max-height: 99vh;
|
||||||
|
font-size: 1.3em;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 384px;
|
||||||
|
align-items: stretch;
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.25s linear;
|
||||||
|
overflow: auto;
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
scrollbar-width: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#choose-grid::-webkit-scrollbar {
|
#choose-grid::-webkit-scrollbar {
|
||||||
@@ -356,6 +381,7 @@ summary {
|
|||||||
margin-right: -1px;
|
margin-right: -1px;
|
||||||
font-size: 0.92em;
|
font-size: 0.92em;
|
||||||
min-height: 88px;
|
min-height: 88px;
|
||||||
|
/* border-radius: 5px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.cancel-card {
|
.cancel-card {
|
||||||
@@ -390,19 +416,31 @@ summary {
|
|||||||
background-color: var(--hover-card-color);
|
background-color: var(--hover-card-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.research-cancel {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
line-height: 160%;
|
||||||
|
/* background-color: var(--card-color); */
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
/* keeps 5 columns at 1440px */
|
/* keeps 5 columns at 1440px */
|
||||||
@media (min-width: 1710px) and (max-width: 1950px) {
|
@media (min-width: 1710px) and (max-width: 1950px) {
|
||||||
|
|
||||||
.experiment-grid-module,
|
.experiment-grid-module,
|
||||||
.choose-grid-module,
|
.choose-grid-module,
|
||||||
.pause-grid-module {
|
.pause-grid-module,
|
||||||
|
.research-cancel {
|
||||||
line-height: 143%;
|
line-height: 143%;
|
||||||
font-size: 0.68em;
|
font-size: 0.68em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.research-cancel {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
#experiment-grid,
|
#experiment-grid,
|
||||||
#choose-grid,
|
.choose-grid,
|
||||||
.pause-grid {
|
.pause-grid {
|
||||||
grid-template-columns: repeat(auto-fit, 340px);
|
grid-template-columns: repeat(auto-fit, 340px);
|
||||||
}
|
}
|
||||||
@@ -426,8 +464,12 @@ summary {
|
|||||||
font-size: 0.58em;
|
font-size: 0.58em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.research-cancel {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
#experiment-grid,
|
#experiment-grid,
|
||||||
#choose-grid,
|
.choose-grid,
|
||||||
.pause-grid {
|
.pause-grid {
|
||||||
grid-template-columns: repeat(auto-fit, 285px);
|
grid-template-columns: repeat(auto-fit, 285px);
|
||||||
}
|
}
|
||||||
@@ -564,7 +606,7 @@ summary {
|
|||||||
right: 4px;
|
right: 4px;
|
||||||
height: 0px;
|
height: 0px;
|
||||||
width: 7px;
|
width: 7px;
|
||||||
transition: height 0.15s linear;
|
transition: height 0.25s linear;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -580,7 +622,7 @@ summary {
|
|||||||
left: 15px;
|
left: 15px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
width: 0px;
|
width: 0px;
|
||||||
transition: width 0.3s linear;
|
transition: width 0.25s linear;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -588,18 +630,21 @@ summary {
|
|||||||
border-right: 1.5px solid #777;
|
border-right: 1.5px solid #777;
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#health {
|
#health {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 15px;
|
top: 15px;
|
||||||
left: 15px;
|
left: 15px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 0px;
|
width: 0px;
|
||||||
transition: width 1s ease-out; z-index: 2;
|
transition: width 1s ease-out;
|
||||||
|
z-index: 2;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
background-color: rgb(9, 245, 166);
|
background-color: rgb(9, 245, 166);
|
||||||
border-right: 2px solid rgb(51, 162, 125);
|
border-right: 2px solid rgb(51, 162, 125);
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#health-bg {
|
#health-bg {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 15px;
|
top: 15px;
|
||||||
|
|||||||
68
todo.txt
@@ -1,13 +1,23 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
added defense bar to HUD
|
mob damage difficulty setting is lower
|
||||||
new community map commandeer by Desboot
|
recycling now flashes green when it heals
|
||||||
|
|
||||||
|
merged cancel and research bars for single column selection
|
||||||
|
added some dark grey borders for no images selection mode
|
||||||
|
|
||||||
|
new images with midJourney V5
|
||||||
|
spores, pilot wave, standing wave
|
||||||
|
|
||||||
bug fixes
|
bug fixes
|
||||||
|
|
||||||
*********************************************************** TODO *****************************************************
|
*********************************************************** TODO *****************************************************
|
||||||
|
|
||||||
switch to prettier formatter or remove beautify
|
wormhole tech - teleport away mobs with mass below 3 when they get too near the player
|
||||||
|
short CD, small energy cost, only mobs below a mass
|
||||||
|
|
||||||
|
foam gun could have a knock back effect
|
||||||
|
maybe with pressure vessel?
|
||||||
|
|
||||||
extend brainstorming animation timers to fps cap?
|
extend brainstorming animation timers to fps cap?
|
||||||
will it be smoother or choppier?
|
will it be smoother or choppier?
|
||||||
@@ -22,59 +32,12 @@ level element - mover, transport
|
|||||||
extend uncertainty to superballs
|
extend uncertainty to superballs
|
||||||
maybe make aiming them more random?
|
maybe make aiming them more random?
|
||||||
|
|
||||||
live updating defense and damage HUD?
|
|
||||||
makes more sense for defense
|
|
||||||
for damage many effects only apply to one type of damage so it would show up
|
|
||||||
update frequency
|
|
||||||
per s
|
|
||||||
every cycle? (only if canvas)
|
|
||||||
don't include difficulty effects
|
|
||||||
draw in canvas or html?
|
|
||||||
add border for readability
|
|
||||||
a number
|
|
||||||
bars
|
|
||||||
horizontal
|
|
||||||
vertical
|
|
||||||
circles
|
|
||||||
defense
|
|
||||||
color: grey, white
|
|
||||||
scales from 0-1
|
|
||||||
wrapped around health bar like armor
|
|
||||||
what about mass-energy which has no health bar
|
|
||||||
at defense = 1 outlines health bar fully
|
|
||||||
health bar
|
|
||||||
color: keep red (green?)
|
|
||||||
red is the same as mob health bars
|
|
||||||
damage
|
|
||||||
color: red if not used for health
|
|
||||||
scales from 1-infinity maps to 0->1
|
|
||||||
1-1/(1+damage)
|
|
||||||
diagetic UI Elements
|
|
||||||
ammo number?
|
|
||||||
doesn't text look choppy when camera moves?
|
|
||||||
health bar could be rendered similarly to energy bar
|
|
||||||
what about 2 bezier curves on left and right of player head that looks like 1/3 circleRadiusScale
|
|
||||||
rotate the curves as the head rotates
|
|
||||||
what about 2 bezier both above player
|
|
||||||
as the total energy and health increases the curses could asymptotically approach a maximum length as max energy/health goes to infinity
|
|
||||||
|
|
||||||
|
|
||||||
foam gun could have a knock back effect
|
|
||||||
maybe with pressure vessel?
|
|
||||||
|
|
||||||
perfect diamagnatism could bounce on mobs, or even map elements?
|
perfect diamagnatism could bounce on mobs, or even map elements?
|
||||||
could work like a rocket jump?
|
could work like a rocket jump?
|
||||||
|
|
||||||
field tech: negative mass, wormhole?
|
|
||||||
tech: do 60% damage when not touching ground
|
|
||||||
tech: 50% defense when not touching ground
|
|
||||||
|
|
||||||
Tech: Von Neuman probes - Drones will consume blocks to replicate themselves
|
Tech: Von Neuman probes - Drones will consume blocks to replicate themselves
|
||||||
it's a little too similar to the drone repair tech, but I kinda like it better. drones that eat blocks and spit out more drones is cool
|
it's a little too similar to the drone repair tech, but I kinda like it better. drones that eat blocks and spit out more drones is cool
|
||||||
|
|
||||||
when gaining ammo have the ammo test quickly count up by Math.floor(1/20x) of the total ammo given
|
|
||||||
maybe bold, flash the text for a second after
|
|
||||||
|
|
||||||
tech: parry - immune to harm for 0.25-0.5 seconds after pressing field button
|
tech: parry - immune to harm for 0.25-0.5 seconds after pressing field button
|
||||||
needs a 5 second CD?
|
needs a 5 second CD?
|
||||||
|
|
||||||
@@ -95,7 +58,6 @@ tech - after standing wave runs out of energy from blocking, gain a buff
|
|||||||
aoe damage like railgun
|
aoe damage like railgun
|
||||||
push mobs away
|
push mobs away
|
||||||
|
|
||||||
|
|
||||||
level: lock
|
level: lock
|
||||||
should there be something in the top part of the map?
|
should there be something in the top part of the map?
|
||||||
add alt versions of left and right sides
|
add alt versions of left and right sides
|
||||||
@@ -1242,14 +1204,16 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
|
|||||||
metamaterial cloaking - Scientific photography by Miki Asai, by Bruce Munro
|
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
|
||||||
|
pilot wave -
|
||||||
|
|
||||||
nail gun - Screenprint
|
nail gun - Screenprint
|
||||||
shotgun - blueprint by Dan McPharlin
|
shotgun - blueprint by Dan McPharlin
|
||||||
grenades, missiles, explosions - by Victo Ngai
|
grenades, missiles, explosions - by Victo Ngai
|
||||||
spores - by Ernst Haeckel
|
spores - turquoise black spores on a white background full color scientific anatomy by Ernst Haeckel
|
||||||
drones - tilt-shift photography
|
drones - tilt-shift photography
|
||||||
super balls - By Akari Toriyama
|
super balls - By Akari Toriyama
|
||||||
wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
|
wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
|
||||||
|
Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5
|
||||||
foam - black blobs Ink doodle
|
foam - black blobs Ink doodle
|
||||||
harpoon - by Eiichiro Oda
|
harpoon - by Eiichiro Oda
|
||||||
mine - by Dan McPharlin
|
mine - by Dan McPharlin
|
||||||
|
|||||||