From 4e6acdd5d05de4a2971f1d1b6632ab5a8e6b71b6 Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 21 Jan 2024 12:57:11 -0800 Subject: [PATCH] animated level load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit animated new level load graphics for reactor and final level autoZoom code rewritten to work with pause better using the ephemera system this might cause bugs, I already found a few intro level renamed initial extra ammo power ups on why difficulty for final and reactor levels removed falling off the map damage on levels that still had falling off damage mob: stinger - has speed that adjusts as it flaps it's wings and a short range laser tech: strange loop - +9% damage, removing it gives null hypothesis and strange attractor tech: martingale - +11% damage, removing this has a 50% chance to not remove and to double it's damage paradigm shift removes 6 health when it ejects a tech, but now has a 85->97% chance to work ammo, heal, research tech spawn extra power ups after each time you take them tungsten carbide skin has a hexagon look and +222->300 max health Bayesian statistics spawn 3->6 research ansatz spawns 2->3 research if you have no research Ψ(t) collapse 16->21 research futures exchange 4.3->4.7% duplication replication 9->10 duplication stimulated emission 17->19% duplication anthropic principle spawn 5->16 heals when you die supply chain: no long gives JUNK instead triples the frequency of finding applied science electronegativity 0.22->0.26% damage per energy non-renewables 88->97% damage anticorrelation 100->111% damage decorrelation 70->77% defense parasitism 83->93% damage torpor 66->74% defense bug fix: recycling works with mass-energy (although it doesn't do much) ternary wasn't working in many situations, but it should now fixed bubble fusion exploit that triggers on mobs in factory endlessly bot fabrication was making 1 extra bot and giving negative research sometimes --- img/martingale.webp | Bin 0 -> 71338 bytes img/strange loop.webp | Bin 0 -> 48006 bytes index.html | 85 --------------- js/index.js | 14 +-- js/level.js | 195 ++++++++++++++++++++++++++++++---- js/lore.js | 4 +- js/mob.js | 35 ++++-- js/player.js | 131 +++++++++++++++++++---- js/powerup.js | 59 +++++++--- js/simulation.js | 121 ++++++++++++--------- js/spawn.js | 201 ++++++++++++++++++++++++++++++++++- js/tech.js | 242 ++++++++++++++++++++++++++++-------------- style.css | 126 ++++++++++++++++++++++ todo.txt | 55 ++-------- 14 files changed, 928 insertions(+), 340 deletions(-) create mode 100644 img/martingale.webp create mode 100644 img/strange loop.webp diff --git a/img/martingale.webp b/img/martingale.webp new file mode 100644 index 0000000000000000000000000000000000000000..8f1e712ce5a600a7954543a270b9332f09446bb6 GIT binary patch literal 71338 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 Y=w;6Q$PJNN11m3pErFQfgFnOo0A}KwOaK4? literal 0 HcmV?d00001 diff --git a/img/strange loop.webp b/img/strange loop.webp new file mode 100644 index 0000000000000000000000000000000000000000..ed374c3336e02160af7cf6b17144fa81f86d5d0d GIT binary patch literal 48006 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

Ywy>?F@f`BT1CuidJyEX(|?-VkU4L9ym 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 z

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%0A6lP0bl}n%t^L^1HhKl;C;Vl@ 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%0DkWt=iA)vKb=6Y33YN6REmi+u-_!pd2 zSpzR=`(IVAa`yKqDlj=ChjSaAy$oWy+*AJt;jDEI1{~=PN8&uqAAZpUG9{ok{e?P! zvN=m>W)#fX$2jozGErW?cBoicO|*lr$e^5mdA-kt*vfhh| zPnM3q@6tNZBl(=+wn2HTn7S}Jh*JpYi=GQsJqL9M3xkXm=+GRhHTq6hzXay9tE`E^ z9I5^hrow~zlgHBZz3%MDTjO3j?6C10Wk%H&#`4qh#-)2>r7Mby@jRER)|i@>6;ixd z_K2-YhDYU(#g}}@PV|_ESPZWcqSvb#W*?k#2qTpP8dnf8a2dky>?; zHWDfZA`0*40&a3E(@b8*>i==?bw>T8HCccJEzJk*TySI>ESVudw_YNnNZy^?m5yHL z`Hk?l`tpw?=8wHi7CK?um3Is2y7`SZDGw9V`ezl)n^M zJVyc^;%#_sT2*TOM}acSUr($m;ERiB)EOoO-~VLE+goq3KvH}=V_4iePXozK*F z3p?9{nzQKM+x)uxmbF&NT@%M`afxm}+*iuX7M=K0jFmx@a*N(jez1AplipyxgM2`O znZrC*4P8Y~rRwy~wTb$mJq+&gTX@AzaaOhU$hwNhesDl5PK|>4p9xkgt$`E}x397w#LFk}i%J}hox72WX5Q&Zqo+Et z=4d@s+G$S!OQad!&@9-aEJ%SI^yk!e#1V}yAXX^0T+K6<-(RyJr?N7Ut}3hrs+Wk? zDcJS#6}5f ztmINZFONh=p362~n|Hj_>Q7Eg;xxWG2wiDQF7QpX+XM_!$Y09Rr;SV*AkHt9`yc_YQF-0Cp+ zEE4hzR^t5eoFK7m8h|cfa=6$prifjUTGc9gMuk-6Q)9qu1By!8Tdn#}%pyBZqjZ2! ze8N;QvmM}rz`){GaV;_f21V3O&cnCA2Ks`PafF6&f&kXog3zJYIZ@2i5MA624f76l z?+T3}2Y=xU3#pONAmYNFX`59sx>kA_8pJn6;s8TM_!L^rvad^<;gde!zc7lwosocl zdj>rbuReeM!X;R5G z?J0V?=f-q%$Z2jw5^Uj!1#{CMdpgUtz&OQ(xCMj;G89XyIDlPoprR>|p%1Vh`Wnfs zGoHOQjdiw7eVjisnq2e`k*&OB`TbNNkkE2~H5(q8SwKa;Kx@RM<=pjlAVH;XSU~)B z;NXuqV5|<}*m^smJ46aoR*_C7=x4UksLl9w`i>5ZIR5v5-*_^n75QvlomLn19)79c48#jmuC)q6#m3Qjg4xm_f$jXi zWDxtU1G3V+2NOgyWH$q0$luAbe|X_2C-dP+AGgt`=_LFH!T%H0q6oypoA==ieyN|h zBqp|+ydc~JkBl;*uYiD6eA|cy%Phg?QgHP7!;AbxpBD~Ix@$7*8-}C1!-WDb9mKhp|92v?fK9H8}aJ%`XBEra&&MY*-tT$SS)f#%?=U$Pn7aHQkd$OzPSBI%A7({MSc z2sF?)#`V0^w_BBTNgJ=%>?s~2L`=$3A6whOt}86ZX*Wi!mPC4Dg)u)Znv#-H#TRfw zV9<8+k}B?aIJLtF?j>}*uTfOyDDWVQu(}SLNmA z1}>p15j_%72WHF9FKILjUe8gu8A_?4_p}&&GkGeXFdQ>=6!?%@EUuz#xrB5!8nu5~g#PBClh=B2+Z{B?PpVH4eRuy9%Ae{U?3P z!NT4(DB4cQanp?piA|?!7+e}tP+(mIiywlECajsdEV;IYyE?g{KWw@@?WUrWAxQ(= zb^iqviA60lZ%itSpF?@s5o6Q*H#dnV2x1k?F>;$^W3W| zwUVuDfb(d=W92jInbXcDj6Rf9rH(`@HcLhl@iKkZ;>e) zv+M|t@?fuRO@N*UHg5>@#?;?JeBlP&F93^wO8G++Niy$#9Y3#ubHy4bD&f?SC|E%R zB)SnN{zTrj_cr^yAK`g7HFj+P7PZz7^!jEpb^hQw95#UY?ExN@%6VHh6Cv+=NgU#k zO(i_OEOu_ey4lP)Z5W$wfe6}9mg>GXiDpoB?Q_e)qO(W`nm_QxyyP=A=fvUWCG_Fn zV6#RA`KhENRx03+PBCyXkjMKvz%B}!L#UXW2g1cW|6Qo%SOYG!vQM<_x<%2ir3TmP z_f~rQH%Iy)j176g;wVzP$kmNKZqNsND{sN|l2bC^@GO7iAi=`M5b*|5Wv!1nfllk` zekv8@5=hard>Cpx;(aq(-wX^C^p#$v<}Yz*HV~_Z?tqfyt-I#vxT9bg;4iSz7l>q2 zZ>aF(wXa$w<`HVrH77{aq zyEe1&fo~SuGaTT{TI543l6z^vd$YQpLA&kD>rm^bz;+vU%}YgzATw{Y z>Ex?b>RJ}MbD(*FhwaIe^Ez`Lx3+gfyq5IgLGL>5?krrr&Bm+Ld|E^Lb%*w1;lUGQ z6)&&{3)%)=G*#fpsry5ikEk0&p7>h`2+EpN!$T=)Ihw94!tMu#fd^yvyN~l*)R?WL zpmsM5epOSKT7ERyZ8h5hP|cg{`LI3LM0;FExsjDUWN~UA-blWWX@-9C%j~zYcnowT zB?Y(JbNZzmr#IV8X4^Ad()U6#YDy*Y7N<6B6`{zfY4?7z6BVE4ZyKE-`G3B}S7ue|gC~;UX`7r@$YuG^-wT9dAR)g8 zk44&-i3)Pbe*TGt1dPL5TkP!Cp;0L09K%%n79-#+hSu|icqy#^rk4?0P*xgU3r={rCHnETb zbRJD+x;cW{u8)>(p|iF#$>$ulTcQNL_)Y4V&4R*nhbT-E)rG6P9V-0>1*o%^4vz-D z{l7d3M_Gv)U3ysTOlDzjg9RUFJ_`dfJ&d zfwMX8$l{&d(%;!=MS<$0ERX3S)m-5~+Vk6FwQTDc+V7o(dbE#{{O&6OekW4&Pz zXpGDfSL5xUTtj>>QDS>V*rC%AWyr$(MJIf-mSu61S;IIJkwRAvnw-BKT|SL57y{6n zY}b;>V%%50Fqq@sMz(Gyyc}QCfA{rZGp_R?Ua~`B0UhPMSGXWA0a<0gSV%N!<$>2o z*julWT3G2ox==$o1fLh@kb%YVER-aS2h4!05RQa6 z!9GvfMbOH1HErWwQCjmL10oz2abo2J1Q*abCBc_rH5T7AUdn?UhZxmh2xA^PG^Pgh zAn~0xYsp#zT8{}CeRGAm*rqS({UEG5yb%xP0gQDh$tcnGO??C&rnRQ4L@q%bIyU^&Lp~?A8l$gJn5Hrv0Zu!y#6hGNO_qp2d%E^93C|}YSgF*-dYvG1 zbuk2&APHV;hATwkf`D$+PE~VVX~Ru(q4NBUYDAmv0rfq5bN{3RZ0bP+r^|CMwU&!8 zcV&f`c+r7A_Qes0TnW5;0ug)FC&b%bQ@8qe%$|l73(1&QwgC$G?=q60Cf=pF?|Lcc zX(4!MDg4zu_JJFtSAhI5_k8=Z4(h8E_?MnB5#b-=s?Rfj4=>5Rm>5;bM#S(4$XRx# z@z+V(J)V`=7r#w;HORFKcOi#J^@I;jqTqKhHdmgg(Uc_91+&`nd9G+G0Rs01w~2#U zS*NU+yNLbGf>=u~1HnNq6B z*~0XIWF2@d!WTT9b}6okv2>JyQIO<2LntY5_LamMo`7!>=d- zEqvCjus7T*RYGXa1hJ7hi)Ed<5T&Rc?UucCXEtz?kaito{Df9B&s`vSP90=-hmayQ zr;H1cW6nbqIZ|{iB@+=qHf030vJ*#@LkYMaOXKZIH;1<4(~)?2*e?7L_Ar*g6!(6o zkEC^LCsMJwL-h5h!=^$xq=3rQKS&bA&@-ucnT|+w=$hLwnxx*?^R@YC#HHrm^bx1%b4TFhTt3v84>sVkrdwk!+mBTgYUaId{h9JY~cu7>!Cpk`vyi^ zdkG8WGx=*(=Lc(=H<-D4On~|(2kpRTc|E0N5Rq^VTL_LD^W-EURFJJ-NIh#v8*Eld zQ_0-(L!TM=xFT{bA(sRu&Ee~7W{T-`!tG5}u@$Hl&|GdxJaQU&F})+nvYC;@ q8 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 83d1ea6..e345a6d 100644 --- a/index.html +++ b/index.html @@ -242,91 +242,6 @@ - - diff --git a/js/index.js b/js/index.js index cb0033c..41a1fe1 100644 --- a/js/index.js +++ b/js/index.js @@ -1409,14 +1409,16 @@ window.addEventListener("keydown", function (event) { if (event.key === "X") m.death(); //only uppercase switch (event.key.toLowerCase()) { case "o": - simulation.isAutoZoom = false; - simulation.zoomScale /= 0.9; - simulation.setZoom(); + // simulation.isAutoZoom = false; + // simulation.zoomScale /= 0.9; + // simulation.setZoom(); + simulation.zoomTransition(simulation.zoomScale / 0.9) break; case "i": - simulation.isAutoZoom = false; - simulation.zoomScale *= 0.9; - simulation.setZoom(); + // simulation.isAutoZoom = false; + // simulation.zoomScale *= 0.9; + // simulation.setZoom(); + simulation.zoomTransition(simulation.zoomScale * 0.9) break case "`": powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "research"); diff --git a/js/level.js b/js/level.js index eecb410..9bd03a6 100644 --- a/js/level.js +++ b/js/level.js @@ -9,7 +9,7 @@ const level = { onLevel: -1, levelsCleared: 0, // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], - //see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , subway, final) added later + //see level.populateLevels: (initial, ... , reservoir or factory, reactor, ... , subway, final) added later playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"], communityLevels: ["gauntlet", "stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour", "superNgonBros", "underpass", "cantilever", "tlinat", "ruins", "ace", "crimsonTowers", "LaunchSite", "shipwreck", "unchartedCave", "dojo"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon", "diamagnetism"], @@ -36,22 +36,24 @@ const level = { // b.giveGuns("harpoon") //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[8].ammo = 100000000 // requestAnimationFrame(() => { tech.giveTech("Higgs mechanism") }); - // for (let i = 0; i < 1; ++i) tech.giveTech("Higgs mechanism") - // for (let i = 0; i < 1; ++i) tech.giveTech("topological defect") - // for (let i = 0; i < 1; ++i) tech.giveTech("Hilbert space") + // for (let i = 0; i < 1; ++i) tech.giveTech("martingale") + // for (let i = 0; i < 1; ++i) tech.giveTech("paradigm shift") + // for (let i = 0; i < 1; ++i) tech.giveTech("bubble fusion") // requestAnimationFrame(() => { for (let i = 0; i < 10; i++) tech.giveTech("orbital-bot") }); // requestAnimationFrame(() => { for (let i = 0; i < 10; i++) b.orbitBot(m.pos, false) }); + // m.skin.hexagon(); - // for (let i = 0; i < 1; i++) tech.giveTech("cascading failure") + + // for (let i = 0; i < 1; i++) tech.giveTech("tungsten carbide") // for (let i = 0; i < 1; ++i) tech.giveTech("induction furnace") // for (let i = 0; i < 1; ++i) tech.giveTech("autonomous defense") // for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "research"); // for (let i = 0; i < 100; i++) powerUps.directSpawn(1750, -500, "coupling"); - // level.skyscrapers(); + // level.testing(); // for (let i = 0; i < 4; ++i) spawn.hopMother(1900, -500) - // for (let i = 0; i < 10; ++i) spawn.starter(1900, -500, 50) + // for (let i = 0; i < 4; ++i) spawn.stinger(1900, -500) // for (let i = 0; i < 1; ++i) spawn.timeSkipBoss(1900, -2500) // spawn.beetleBoss(1900, -500, 25) // spawn.slasher2(2000, -1150) @@ -62,7 +64,7 @@ const level = { // spawn.tetherBoss(1900, -500, { x: 1900, y: -500 }) // for (let i = 0; i < 40; ++i) tech.giveTech() - level[simulation.isTraining ? "walk" : "intro"]() //normal starting level ************************************************** + level[simulation.isTraining ? "walk" : "initial"]() //normal starting level ************************************************** // spawn.bodyRect(2425, -120, 200, 200); // console.log(body[body.length - 1].mass) @@ -74,9 +76,9 @@ const level = { // for (let i = 0; i < 20; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "ammo"); // for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "field", false); //lore testing + // simulation.isCheating = false //true; // for (let i = 0; i < 5; i++) tech.giveTech("undefined") // lore.techCount = 2 - // simulation.isCheating = false //true; // level.levelsCleared = 10 // localSettings.loreCount = 5 //this sets what conversation is heard // if (localSettings.isAllowed) localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage @@ -284,6 +286,150 @@ const level = { tech.isDeathAvoidedThisLevel = false; simulation.updateTechHUD(); simulation.clearNow = true; //triggers in simulation.clearMap to remove all physics bodies and setup for new map + + + //pop up new level info screen for a few seconds + if (!simulation.isChoosing && m.alive && (level.levels[level.onLevel] === "final" || level.levels[level.onLevel] === "reactor")) { //level.levels[level.onLevel] === "subway" || + //pause + if (!simulation.paused) { + simulation.paused = true; + simulation.isChoosing = true; //stops p from un pausing on key down + // build.pauseGrid() + // document.body.style.cursor = "auto"; + } + //build level info + document.getElementById("choose-grid").style.gridTemplateColumns = "250px" + let text = `

` + for (let i = 0; i < level.levels.length; i++) { + if (i < level.levelsCleared) { + text += `
${level.levels[i]}
` + } else if (i === level.levelsCleared) { + // text += `
${level.levels[i]}
` + text += `
${level.levels[i]}
` + } else { + text += `
${level.levels[i]}
` //blurry text + // ???????? text + // text += `
` + // for (let j = 0; j < level.levels[i].length; j++) text += `?` + // text += `
` + } + } + text += `
` + + document.getElementById("choose-grid").innerHTML = text + //show level info + document.getElementById("choose-grid").style.opacity = "1" + document.getElementById("choose-grid").style.transitionDuration = "0.25s"; //how long is the fade in on + document.getElementById("choose-grid").style.visibility = "visible" + + simulation.draw.cons(); + simulation.draw.body(); + level.customTopLayer(); + let count = simulation.testing ? 0 : 240 + let newLevelDraw = () => { + count-- + if (count > 0) { + requestAnimationFrame(newLevelDraw); + } else { //unpause + // document.body.style.cursor = "none"; + if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 30; //player is immune to damage for 30 cycles + if (simulation.paused) requestAnimationFrame(cycle); + if (m.alive) simulation.paused = false; + simulation.isChoosing = false; //stops p from un pausing on key down + build.unPauseGrid() + document.getElementById("choose-grid").style.opacity = "0" + setTimeout(() => { + document.getElementById("choose-grid").style.visibility = "hidden" + }, 1000); + } + //draw + simulation.wipe(); + m.look(); + simulation.camera(); + // if (count < 30) { + // } + // if (count < 60) { + // simulation.draw.cons(); + // simulation.draw.body(); + // level.customTopLayer(); + // simulation.draw.body(); + // simulation.draw.drawMapPath(); + // mobs.draw(); + // } else + // if (count < 240) { + simulation.draw.wireFrame(); + // } + // else if (count === 91) { //hide text boss + // document.getElementById("choose-grid").style.opacity = "0" + // setTimeout(() => { + // document.getElementById("choose-grid").style.visibility = "hidden" + // }, 1000); + // } + ctx.restore(); + simulation.drawCursor(); + } + requestAnimationFrame(newLevelDraw); + + + // // clear + // requestAnimationFrame(() => { + // simulation.wipe(); + // }); + + // //wireframe + // setTimeout(() => { + // requestAnimationFrame(() => { + // simulation.wipe(); + // simulation.camera(); + // simulation.draw.wireFrame(); + // ctx.restore(); + // }); + // }, 500); + + // //almost normal draw + // setTimeout(() => { + // requestAnimationFrame(() => { + // simulation.wipe(); + // simulation.camera(); + // // ctx.fillStyle = "rgba(0,0,0,0.66)" + // // ctx.fill(simulation.draw.mapPath); + // simulation.draw.drawMapPath(); + // ctx.restore(); + // }); + // }, 1000); + + // //normal draw + // setTimeout(() => { + // requestAnimationFrame(() => { + // simulation.wipe(); + // simulation.camera(); + // // level.custom(); + // simulation.draw.cons(); + // simulation.draw.body(); + // // m.draw(); + // // m.hold(); + // level.customTopLayer(); + // simulation.draw.drawMapPath(); + // ctx.restore(); + // }); + // }, 1500); + + // //unpause + // setTimeout(() => { + // document.body.style.cursor = "none"; + // if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 30 cycles + // if (simulation.paused) requestAnimationFrame(cycle); + // if (m.alive) simulation.paused = false; + // simulation.isChoosing = false; //stops p from un pausing on key down + // build.unPauseGrid() + + // document.getElementById("choose-grid").style.opacity = "0" + // // document.getElementById("choose-grid").style.visibility = "hidden" + // setTimeout(() => { + // document.getElementById("choose-grid").style.visibility = "hidden" + // }, 1000); + // }, 2000); + } } }, populateLevels() { //run a second time if URL is loaded @@ -335,7 +481,7 @@ const level = { level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, Math.random() < 0.5 ? "factory" : "reservoir"); //add level to the back half of the randomized levels list level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, "reactor"); //add level to the back half of the randomized levels list if (!build.isExperimentSelection || (build.hasExperimentalMode && !simulation.isCheating)) { //experimental mode is endless, unless you only have an experiment Tech - level.levels.unshift("intro"); //add level to the start of the randomized levels list + level.levels.unshift("initial"); //add level to the start of the randomized levels list level.levels.push("subway"); //add level to the end of the randomized levels list level.levels.push("final"); //add level to the end of the randomized levels list } @@ -1911,7 +2057,7 @@ const level = { powerUps.addResearchToLevel() //needs to run after mobs are spawned }, testing() { - simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode + // simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode document.body.style.backgroundColor = "#fff"; // color.map = "#444" //custom map color @@ -2158,7 +2304,7 @@ const level = { spawn.mapRect(-500, -25, 25, 50); //edge shelf spawn.mapRect(475, -25, 25, 50); //edge shelf }, - intro() { + initial() { if (level.levelsCleared === 0) { //if this is the 1st level of the game if (simulation.difficultyMode > 2) spawn.setSpawnList() // hard and why difficulty don't begin with starter mobs @@ -2216,7 +2362,7 @@ const level = { } else { for (let i = 0; i < 60; i++) { setTimeout(() => { - if (level.levels[level.onLevel] === "intro") spawn.sneaker(2100, -1500 - 50 * i); + if (level.levels[level.onLevel] === "initial") spawn.sneaker(2100, -1500 - 50 * i); }, 2000 + 500 * i); } } @@ -2457,6 +2603,7 @@ const level = { document.body.style.backgroundColor = "#ddd"; for (let i = 0; i < 16; i++) powerUps.spawn(4600 + 40 * i, -30, "ammo"); + if (simulation.difficultyMode > 4) for (let i = 0; i < 8; i++) powerUps.spawn(4600 + 40 * i, -30, "ammo"); //extra ammo on why difficulty spawn.mapRect(-1950, 0, 8200, 1800); //ground spawn.mapRect(-1950, -1500, 1800, 1900); //left wall @@ -3832,19 +3979,19 @@ const level = { for (let i = 0; i < 250; i++) spawn.starter(-2700 + 2400 * Math.random(), -1300 - 500 * Math.random()) } else { if (Math.random() < 0.07 && simulation.difficulty > 35) { - for (let i = 0, len = scale * 0.25 / 6; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15 + for (let i = 0, len = scale * 0.22 / 6; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15 for (let i = 0, len = scale * 0.1 / 6; i < len; ++i) spawn.bounceBoss(-1327 - 200 * i, -1525, 80, false); - for (let i = 0, len = scale * 0.15 / 6; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false) - for (let i = 0, len = scale * 0.26 / 6; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false); + for (let i = 0, len = scale * 0.13 / 6; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false) + for (let i = 0, len = scale * 0.25 / 6; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false); } else { if (Math.random() < 0.25) { - for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15 + for (let i = 0, len = scale * 0.22; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15 } else if (Math.random() < 0.33) { for (let i = 0, len = scale * 0.1; i < len; ++i) spawn.bounceBoss(-1327 - 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15 } else if (Math.random() < 0.5) { - for (let i = 0, len = scale * 0.15; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false) //spawn 2-3 at difficulty 15 + for (let i = 0, len = scale * 0.13; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false) //spawn 2-3 at difficulty 15 } else { - for (let i = 0, len = scale * 0.26; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false); //spawn 3-4 at difficulty 15 + for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false); //spawn 3-4 at difficulty 15 } } } @@ -3919,6 +4066,7 @@ const level = { isDoorsLocked = true for (let i = 0; i < 9; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "ammo") for (let i = 0; i < 3; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "heal"); + if (simulation.difficultyMode > 4) for (let i = 0; i < 8; i++) powerUps.spawn(1200 + 550 * Math.random(), -1700, "ammo"); //extra ammo on why difficulty const scale = Math.pow(simulation.difficulty, 0.7) //hard around 30, why around 54 if (mobs.mobDeaths < level.levelsCleared && !simulation.isCheating) { for (let i = 0; i < 250; i++) spawn.starter(300 + 2400 * Math.random(), -1300 - 500 * Math.random()) @@ -12158,7 +12306,10 @@ const level = { spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); spawn.mapRect(1500, -10, 100, 20); level.defaultZoom = 1800 - simulation.setZoom(1200); + // simulation.setZoom(1200); + simulation.zoomTransition(1200) + + document.body.style.backgroundColor = "#daa69f"; color.map = "#600"; @@ -12567,7 +12718,9 @@ const level = { level.exit.y = -2030; relocateTo(50, -2050); simulation.fallHeight = -1000; - simulation.setZoom(1800); + // simulation.setZoom(1800); + simulation.zoomTransition(1800) + templePlayer.startAnim = -1; templePlayer.drawExit = false; } diff --git a/js/lore.js b/js/lore.js index c841ea4..ff5372e 100644 --- a/js/lore.js +++ b/js/lore.js @@ -1092,7 +1092,7 @@ const lore = { () => { setTimeout(() => { - lore.anand.text("How ever it thinks it can learn and, I think we showed it that nonviolence is an option,") + lore.anand.text("How ever it thinks it can learn, and I think we showed it that nonviolence is an option,") }, 1000); }, () => { @@ -1116,7 +1116,7 @@ const lore = { }, 1000); }, () => { - lore.anand.text("me too") + lore.anand.text("Me too,") }, () => { lore.anand.text("but I'm also pretty hungry, wanna go get some food?") diff --git a/js/mob.js b/js/mob.js index 18434b1..9f5a004 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1350,16 +1350,7 @@ const mobs = { this.leaveBody = false; // no body since it turned into the bot } if (tech.isAddRemoveMaxHealth) { - if (this.isBoss && this.isDropPowerUp) { - powerUps.spawn(this.position.x + 20, this.position.y, "tech", false) - powerUps.spawn(this.position.x - 20, this.position.y, "research", false) - powerUps.spawn(this.position.x - 40, this.position.y, "research", false) - powerUps.spawn(this.position.x + 40, this.position.y, "research", false) - powerUps.spawn(this.position.x, this.position.y + 20, "research", false) - powerUps.spawn(this.position.x, this.position.y - 20, "heal", false) - powerUps.spawn(this.position.x, this.position.y + 40, "heal", false) - powerUps.spawn(this.position.x, this.position.y - 40, "heal", false) - } else { + if (!this.isBoss) { const amount = 0.005 if (tech.isEnergyHealth) { if (m.maxEnergy > amount) { @@ -1371,12 +1362,34 @@ const mobs = { m.setMaxHealth(); } } + + // if (this.isBoss && this.isDropPowerUp) { + // powerUps.spawn(this.position.x + 20, this.position.y, "tech", false) + // powerUps.spawn(this.position.x - 20, this.position.y, "research", false) + // powerUps.spawn(this.position.x - 40, this.position.y, "research", false) + // powerUps.spawn(this.position.x + 40, this.position.y, "research", false) + // powerUps.spawn(this.position.x, this.position.y + 20, "research", false) + // powerUps.spawn(this.position.x, this.position.y - 20, "heal", false) + // powerUps.spawn(this.position.x, this.position.y + 40, "heal", false) + // powerUps.spawn(this.position.x, this.position.y - 40, "heal", false) + // } else { + // const amount = 0.005 + // if (tech.isEnergyHealth) { + // if (m.maxEnergy > amount) { + // tech.healMaxEnergyBonus -= amount + // m.setMaxEnergy(); + // } + // } else if (m.maxHealth > amount) { + // tech.extraMaxHealth -= amount //decrease max health + // m.setMaxHealth(); + // } + // } } if (tech.cloakDuplication && !this.isBoss) { tech.cloakDuplication -= 0.01 powerUps.setPowerUpMode(); //needed after adjusting duplication chance } - } else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) { + } else if (tech.isShieldAmmo && this.shield && !this.isExtraShield && this.isDropPowerUp) { let type = tech.isEnergyNoAmmo ? "heal" : "ammo" if (Math.random() < 0.4) { type = "heal" diff --git a/js/player.js b/js/player.js index 7877e7d..1bafbbb 100644 --- a/js/player.js +++ b/js/player.js @@ -539,7 +539,7 @@ const m = { }, baseHealth: 1, setMaxHealth() { - m.maxHealth = m.baseHealth + tech.extraMaxHealth + 2.22 * tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth + m.maxHealth = m.baseHealth + tech.extraMaxHealth + 3 * tech.isFallingDamage + 4 * tech.isFlipFlop * tech.isFlipFlopOn * tech.isFlipFlopHealth document.getElementById("health-bg").style.width = `${Math.floor(300 * m.maxHealth)}px` simulation.makeTextLog(`m.maxHealth = ${m.maxHealth.toFixed(2)}`) if (m.health > m.maxHealth) m.health = m.maxHealth; @@ -564,7 +564,7 @@ const m = { // if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.973 ** m.coupling if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8 - if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 + if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.26 if (tech.squirrelFx !== 1) dmg *= 0.78//Math.pow(0.78, (tech.squirrelFx - 1) / 0.4) if (tech.isAddBlockMass && m.isHolding) dmg *= 0.1 if (tech.isSpeedHarm && player.speed > 0.1) dmg *= 1 - Math.min(player.speed * 0.0193, 0.88) //capped at speed of 55 @@ -572,7 +572,7 @@ const m = { if (tech.isNeutronium && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.05 if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; - if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3 + if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.27 if (tech.isTurret && m.crouch) dmg *= 0.34; if (tech.isFirstDer && b.inventory[0] === b.activeGun) dmg *= 0.85 ** b.inventory.length if (tech.isEnergyHealth) { @@ -725,7 +725,7 @@ const m = { tech.isDeathAvoidedThisLevel = true powerUps.research.changeRerolls(-1) simulation.makeTextLog(`m.research--
${powerUps.research.count}`) - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false); + for (let i = 0; i < 16; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false); m.energy = m.maxEnergy + 0.1 if (m.immuneCycle < m.cycle + 300) m.immuneCycle = m.cycle + 300 //disable this.immuneCycle bonus seconds simulation.wipe = function () { //set wipe to have trails @@ -755,7 +755,7 @@ const m = { powerUps.research.changeRerolls(-1) simulation.makeTextLog(`m.research--
${powerUps.research.count}`) - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false); + for (let i = 0; i < 16; i++) powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "heal", false); if (m.immuneCycle < m.cycle + 300) m.immuneCycle = m.cycle + 300 //disable this.immuneCycle bonus seconds simulation.wipe = function () { //set wipe to have trails ctx.fillStyle = "rgba(255,255,255,0.03)"; @@ -1274,23 +1274,29 @@ const m = { m.drawLeg("#5f5f5f"); m.calcLeg(0, 1); m.drawLeg("#555"); + ctx.rotate(m.angle); + + const size = 33 ctx.beginPath(); - ctx.arc(0, 0, 30, 0, 2 * Math.PI); + ctx.lineTo(size * 1, size * 0) + ctx.lineTo(size * 0.5, size * 0.866) + ctx.lineTo(size * -0.5, size * 0.866) + ctx.lineTo(size * -1, size * 0) + ctx.lineTo(size * -0.5, size * -0.866) + ctx.lineTo(size * 0.5, size * -0.866) + ctx.lineTo(size * 1, size * 0) + ctx.lineTo(size * 0.5, size * 0) ctx.fillStyle = m.bodyGradient ctx.fill(); - // ctx.fillStyle = grdRad - // ctx.fill(); - ctx.strokeStyle = "#000"; + ctx.strokeStyle = "#333"; ctx.lineWidth = 1.5; - ctx.rotate(m.angle); - ctx.beginPath(); - ctx.arc(15, 0, 4, 0, 2 * Math.PI); - ctx.fillStyle = "#fff" - ctx.fill(); - ctx.beginPath(); - ctx.arc(0, 0, 30, 0, 2 * Math.PI); - ctx.arc(15, 0, 4, 0, 2 * Math.PI); ctx.stroke(); + + ctx.beginPath(); + ctx.arc(15, 0, 3, 0, 2 * Math.PI); + ctx.fillStyle = "#333" + ctx.fill(); + ctx.restore(); m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal powerUps.boost.draw() @@ -1482,8 +1488,6 @@ const m = { // console.log(simulation.zoomScale) simulation.setZoom(1800 + 400 * Math.sin(m.cycle * 0.0075)) - - } }, dilate2() { @@ -1645,6 +1649,95 @@ const m = { ctx.restore(); } }, + hexagon() { + m.isAltSkin = true + m.color = { + hue: 0, + sat: 0, + light: 100, + } + // m.setFillColors(); + m.fillColor = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light}%)` + m.fillColorDark = `hsl(${m.color.hue},${m.color.sat}%,${m.color.light - 35}%)` + let grd = ctx.createLinearGradient(-30, 0, 30, 0); + grd.addColorStop(0, m.fillColorDark); + grd.addColorStop(0.7, m.fillColor); + // grd.addColorStop(1, m.fillColor); + m.bodyGradient = grd + + m.draw = function () { + ctx.fillStyle = m.fillColor; + m.walk_cycle += m.flipLegs * m.Vx; + ctx.save(); + ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 //|| (m.cycle % 40 > 20) + ctx.translate(m.pos.x, m.pos.y); + m.calcLeg(Math.PI, -3); + m.drawLeg("#4a4a4a"); + m.calcLeg(0, 0); + m.drawLeg("#333"); + ctx.rotate(m.angle); + + const size = 32 + ctx.beginPath(); + ctx.lineTo(size * 1, size * 0) + ctx.lineTo(size * 0.5, size * 0.866) + ctx.lineTo(size * -0.5, size * 0.866) + ctx.lineTo(size * -1, size * 0) + ctx.lineTo(size * -0.5, size * -0.866) + ctx.lineTo(size * 0.5, size * -0.866) + ctx.lineTo(size * 1, size * 0) + ctx.fillStyle = m.bodyGradient + ctx.fill(); + ctx.arc(15, 0, 4, 0, 2 * Math.PI); + ctx.strokeStyle = "#333"; + ctx.lineWidth = 2; + ctx.stroke(); + ctx.restore(); + m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal + powerUps.boost.draw() + } + m.drawLeg = function (stroke) { + // if (simulation.mouseInGame.x > m.pos.x) { + if (m.angle > -Math.PI / 2 && m.angle < Math.PI / 2) { + m.flipLegs = 1; + } else { + m.flipLegs = -1; + } + ctx.save(); + ctx.scale(m.flipLegs, 1); //leg lines + ctx.beginPath(); + ctx.moveTo(m.hip.x, m.hip.y); + ctx.lineTo(m.knee.x, m.knee.y); + ctx.lineTo(m.foot.x, m.foot.y); + ctx.strokeStyle = stroke; + ctx.lineWidth = 6; + ctx.stroke(); + + //toe lines + ctx.beginPath(); + ctx.moveTo(m.foot.x, m.foot.y); + ctx.lineTo(m.foot.x - 15, m.foot.y + 5); + ctx.moveTo(m.foot.x, m.foot.y); + ctx.lineTo(m.foot.x + 15, m.foot.y + 5); + ctx.lineWidth = 3; + ctx.stroke(); + + //hip joint + ctx.beginPath(); + ctx.arc(m.hip.x, m.hip.y, 11, 0, 2 * Math.PI); + //knee joint + ctx.moveTo(m.knee.x + 5, m.knee.y); + ctx.arc(m.knee.x, m.knee.y, 5, 0, 2 * Math.PI); + //foot joint + ctx.moveTo(m.foot.x + 5, m.foot.y); + ctx.arc(m.foot.x, m.foot.y, 5, 0, 2 * Math.PI); + ctx.fillStyle = "#000"; + ctx.fill(); + // ctx.lineWidth = 2; + // ctx.stroke(); + ctx.restore(); + } + }, stubs() { m.isAltSkin = true m.draw = function () { diff --git a/js/powerup.js b/js/powerup.js index 562a8b2..0e23a4e 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -326,7 +326,7 @@ const powerUps = { return } if (tech.isCancelDuplication) { - tech.duplication += 0.043 + tech.duplication += 0.047 tech.maxDuplicationEvent() simulation.makeTextLog(`tech.duplicationChance() += ${0.043}`) simulation.circleFlare(0.043); @@ -361,7 +361,7 @@ const powerUps = { // } } if (tech.isAnsatz && powerUps.research.count < 1) { - for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); + for (let i = 0; i < 3; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); } // document.getElementById("choose-grid").style.display = "none" document.getElementById("choose-grid").style.visibility = "hidden" @@ -466,28 +466,30 @@ const powerUps = { if (m.alive && powerUps.research.count >= cost) { requestAnimationFrame(cycle); this.isMakingBots = true - } else { - this.isMakingBots = false - } - if (!simulation.paused && !simulation.isChoosing && !(simulation.cycle % 60)) { - powerUps.research.count -= cost - b.randomBot() - if (tech.renormalization) { - for (let i = 0; i < cost; i++) { - if (Math.random() < 0.46) { - m.fieldCDcycle = m.cycle + 20; - powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "research"); + + if (!simulation.paused && !simulation.isChoosing && !(simulation.cycle % 60)) { + powerUps.research.count -= cost + b.randomBot() + if (tech.renormalization) { + for (let i = 0; i < cost; i++) { + if (Math.random() < 0.47) { + m.fieldCDcycle = m.cycle + 20; + powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "research"); + } } } } + } else { + this.isMakingBots = false } } requestAnimationFrame(cycle); } + if (tech.isDeathAvoid && document.getElementById("tech-anthropic")) { document.getElementById("tech-anthropic").innerHTML = `-${powerUps.research.count}` } - if (tech.renormalization && Math.random() < 0.46 && amount < 0) { + if (tech.renormalization && Math.random() < 0.47 && amount < 0) { for (let i = 0, len = -amount; i < len; i++) powerUps.spawn(m.pos.x, m.pos.y, "research"); } if (tech.isRerollHaste) { @@ -1412,6 +1414,31 @@ const powerUps = { } } } + + + if (tech.isAddRemoveMaxHealth) { + powerUps.spawn(x + 20, y, "tech", false) + powerUps.spawn(x - 20, y, "research", false) + powerUps.spawn(x - 40, y, "research", false) + powerUps.spawn(x + 40, y, "research", false) + powerUps.spawn(x, y + 20, "research", false) + powerUps.spawn(x, y - 20, "heal", false) + powerUps.spawn(x, y + 40, "heal", false) + powerUps.spawn(x, y - 40, "heal", false) + // if (this.isBoss && this.isDropPowerUp) { + // } else { + // const amount = 0.005 + // if (tech.isEnergyHealth) { + // if (m.maxEnergy > amount) { + // tech.healMaxEnergyBonus -= amount + // m.setMaxEnergy(); + // } + // } else if (m.maxHealth > amount) { + // tech.extraMaxHealth -= amount //decrease max health + // m.setMaxHealth(); + // } + // } + } } }, chooseRandomPowerUp(x, y) { //100% chance to drop a random power up //used in spawn.debris @@ -1501,11 +1528,11 @@ const powerUps = { }, pauseEjectTech(index) { if ((tech.isPauseEjectTech || simulation.testing) && !simulation.isChoosing && !tech.tech[index].isNonRefundable) { - if (Math.random() < 0.2 || tech.tech[index].isFromAppliedScience || (tech.tech[index].bonusResearch !== undefined && tech.tech[index].bonusResearch > powerUps.research.count)) { + if (Math.random() < 0.03 || tech.tech[index].isFromAppliedScience || (tech.tech[index].bonusResearch !== undefined && tech.tech[index].bonusResearch > powerUps.research.count)) { tech.removeTech(index) - // powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); } else { powerUps.ejectTech(index) + m.damage(0.06) } document.getElementById(`${index}-pause-tech`).style.textDecoration = "line-through" document.getElementById(`${index}-pause-tech`).style.animation = "" diff --git a/js/simulation.js b/js/simulation.js index 4b73590..fdb0940 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -24,7 +24,6 @@ const simulation = { mobs.healthBar(); m.draw(); m.hold(); - // v.draw(); //working on visibility work in progress level.customTopLayer(); simulation.draw.drawMapPath(); b.fire(); @@ -33,10 +32,8 @@ const simulation = { if (!m.isBodiesAsleep) b.bulletDo(); simulation.drawCircle(); simulation.runEphemera(); - // simulation.clip(); ctx.restore(); simulation.drawCursor(); - // simulation.pixelGraphics(); }, testingLoop() { simulation.gravity(); @@ -505,47 +502,52 @@ const simulation = { simulation.zoom = canvas.height / zoomScale; //sets starting zoom scale }, zoomTransition(newZoomScale, step = 2) { + //old version + // if (simulation.isAutoZoom) { + // const isBigger = (newZoomScale - simulation.zoomScale > 0) ? true : false; + // requestAnimationFrame(zLoop); + // const currentLevel = level.onLevel + + // function zLoop() { + // if (currentLevel !== level.onLevel || simulation.isAutoZoom === false) return //stop the zoom if player goes to a new level + + // if (isBigger) { + // simulation.zoomScale += step + // if (simulation.zoomScale >= newZoomScale) { + // simulation.setZoom(newZoomScale); + // return + // } + // } else { + // simulation.zoomScale -= step + // if (simulation.zoomScale <= newZoomScale) { + // simulation.setZoom(newZoomScale); + // return + // } + // } + + // simulation.setZoom(); + // requestAnimationFrame(zLoop); + // } + // } + + + //rewrite using the ephemera system if (simulation.isAutoZoom) { - const isBigger = (newZoomScale - simulation.zoomScale > 0) ? true : false; - requestAnimationFrame(zLoop); - const currentLevel = level.onLevel - - function zLoop() { - if (currentLevel !== level.onLevel || simulation.isAutoZoom === false) return //stop the zoom if player goes to a new level - - if (isBigger) { + simulation.ephemera.push({ + name: "zoom", + count: simulation.testing ? 0 : 120, //cycles before it self removes + currentLevel: level.onLevel, + do() { + this.count-- + const step = (newZoomScale - simulation.zoomScale) / this.count simulation.zoomScale += step - if (simulation.zoomScale >= newZoomScale) { - simulation.setZoom(newZoomScale); - return + if (this.count < 1 && this.currentLevel === level.onLevel && simulation.isAutoZoom) { + simulation.zoomScale = newZoomScale + simulation.removeEphemera(this.name) } - } else { - simulation.zoomScale -= step - if (simulation.zoomScale <= newZoomScale) { - simulation.setZoom(newZoomScale); - return - } - } - - simulation.setZoom(); - requestAnimationFrame(zLoop); - } - } - }, - zoomInFactor: 0, - startZoomIn(time = 180) { - simulation.zoom = 0; - let count = 0; - requestAnimationFrame(zLoop); - - function zLoop() { - simulation.zoom += canvas.height / simulation.zoomScale / time; - count++; - if (count < time) { - requestAnimationFrame(zLoop); - } else { - simulation.setZoom(); - } + simulation.setZoom(simulation.zoomScale); + }, + }) } }, translatePlayerAndCamera(where) { @@ -974,8 +976,8 @@ const simulation = { } else { Matter.Body.setVelocity(player, { x: 0, y: 0 }); Matter.Body.setPosition(player, { x: level.enter.x + 50, y: level.enter.y - 20 }); - m.damage(0.05 * simulation.difficultyMode); - m.energy -= 0.05 * simulation.difficultyMode + // m.damage(0.02 * simulation.difficultyMode); + // m.energy -= 0.02 * simulation.difficultyMode // move bots for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType) { @@ -1003,15 +1005,28 @@ const simulation = { }); } 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.5)", - time: 4 - }); + if (tech.isEnergyHealth) { + if (m.immuneCycle < m.cycle) { + m.energy += m.maxEnergy * 0.005 + simulation.drawList.push({ //add dmg to draw queue + x: m.pos.x, + y: m.pos.y, + radius: Math.sqrt(m.maxEnergy * 0.02) * 60, + color: "rgba(0, 204, 255,0.4)", //#0cf + time: 4 + }); + } + } else { + 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.5)", + time: 4 + }); + } } } @@ -1355,7 +1370,7 @@ const simulation = { ctx.textAlign = "center"; ctx.fillText(`(${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)})`, simulation.mouse.x, simulation.mouse.y - 20); }, - sight: { //credit to Cornbread for adding this algorithm to n-gon + sight: { //credit to Cornbread2100 for adding this algorithm to n-gon // square: 0, intersectMap: [], //this is precalculated in simulation.draw.lineOfSightPrecalculation() getIntersection(v1, v1End, domain) { diff --git a/js/spawn.js b/js/spawn.js index 5b5b277..a13550e 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -22,9 +22,10 @@ const spawn = { fullPickList: [ "slasher", "slasher", "slasher2", "slasher3", "hopper", "hopper", "hopMother", "hopMother", - "flutter", "flutter", "flutter", "stabber", "stabber", "stabber", "springer", "springer", "springer", + "stinger", "stinger", "stinger", + "flutter", "flutter", "shooter", "shooter", "grenadier", "grenadier", "striker", "striker", @@ -34,7 +35,7 @@ const spawn = { ], mobTypeSpawnOrder: [], //preset list of mob names calculated at the start of a run by the randomSeed mobTypeSpawnIndex: 0, //increases as the mob type cycles - allowedGroupList: ["spinner", "striker", "springer", "laser", "focuser", "beamer", "exploder", "spawner", "shooter", "launcher", "launcherOne", "stabber", "sniper", "pulsar", "grenadier", "slasher", "flutter"], + allowedGroupList: ["spinner", "striker", "springer", "laser", "focuser", "beamer", "exploder", "spawner", "shooter", "launcher", "launcherOne", "stabber", "sniper", "pulsar", "grenadier", "slasher", "flutter", "stinger"], setSpawnList() { //this is run at the start of each new level to determine the possible mobs for the level spawn.pickList.splice(0, 1); const push = spawn.mobTypeSpawnOrder[spawn.mobTypeSpawnIndex++ % spawn.mobTypeSpawnOrder.length] @@ -3837,6 +3838,202 @@ const spawn = { // } }; }, + stinger(x, y, radius = 18 + 4 * Math.random()) { + const color = '#5bc' + mobs.spawn(x, y, 7, radius, color); + let me = mob[mob.length - 1]; + Matter.Body.setDensity(me, 0.0025); //extra dense //normal is 0.001 //makes effective life much larger + // me.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + + me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front + Matter.Body.rotate(me, Math.random() * Math.PI * 2); + me.accelMag = 0.0015 + 0.0007 * Math.sqrt(simulation.accelScale); + me.frictionAir = 0.04; + // me.seePlayerFreq = 40 + Math.floor(13 * Math.random()) + me.memory = 240; + me.restitution = 0.8; + me.frictionStatic = 0; + me.friction = 0; + me.lookTorque = 0.000001 * (Math.random() > 0.5 ? -1 : 1); + me.fireDir = { x: 0, y: 0 } + spawn.shield(me, x, y); + + // me.onDeath = function() {}; + me.flapRate = 0.06 + 0.03 * Math.random() + me.flapRadius = 40 + radius * 3 + me.do = function () { + this.seePlayerByHistory() + this.checkStatus(); + if (this.seePlayer.recall) { + this.force.x += Math.cos(this.angle) * this.accelMag * this.mass + this.force.y += Math.sin(this.angle) * this.accelMag * this.mass + + //set direction to turn to fire + if (!(simulation.cycle % this.seePlayerFreq)) { + this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position)); + //dot product can't tell if mob is facing directly away or directly towards, so check if pointed directly away from player every few cycles + const mod = (a, n) => a - Math.floor(a / n) * n + const sub = Vector.sub(m.pos, this.position) //check by comparing different between angles. Give this a nudge if angles are 180 degree different + const diff = mod(Math.atan2(sub.y, sub.x) - this.angle + Math.PI, 2 * Math.PI) - Math.PI + if (Math.abs(diff) > 2.8) this.torque += 0.0002 * this.inertia * Math.random(); + } + + //rotate towards fireDir + const angle = this.angle + Math.PI / 2; + c = Math.cos(angle) * this.fireDir.x + Math.sin(angle) * this.fireDir.y; + const threshold = 0.4; + const turn = 0.00002 * this.inertia + if (c > threshold) { + this.torque += turn; + } else if (c < -threshold) { + this.torque -= turn; + } + + // this.accelMag = 0.0006 + 0.0007 * Math.sqrt(simulation.accelScale); + this.frictionAir = 0.11 + 0.09 * Math.sin(simulation.cycle * this.flapRate - Math.PI / 2) + + const flapArc = 0.8 //don't go past 1.57 for normal flaps + ctx.fillStyle = `hsla(${160 + 40 * Math.random()}, 100%, ${25 + 25 * Math.random() * Math.random()}%, 0.2)`; //"rgba(0,235,255,0.3)"; // ctx.fillStyle = `hsla(44, 79%, 31%,0.4)`; //"rgba(0,235,255,0.3)"; + this.wing(this.angle + 2.1 + flapArc * Math.sin(simulation.cycle * this.flapRate), this.flapRadius) + this.wing(this.angle - 2.1 - flapArc * Math.sin(simulation.cycle * this.flapRate), this.flapRadius) + + const seeRange = 550 + 35 * simulation.difficultyMode; + if (this.distanceToPlayer() < seeRange) { + const vertexCollision = function (v1, v1End, domain) { + for (let i = 0; i < domain.length; ++i) { + let vertices = domain[i].vertices; + const len = vertices.length - 1; + for (let j = 0; j < len; j++) { + results = simulation.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]); + if (results.onLine1 && results.onLine2) { + const dx = v1.x - results.x; + const dy = v1.y - results.y; + const dist2 = dx * dx + dy * dy; + if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) { + best = { + x: results.x, + y: results.y, + dist2: dist2, + who: domain[i], + v1: vertices[j], + v2: vertices[j + 1] + }; + } + } + } + results = simulation.checkLineIntersection(v1, v1End, vertices[0], vertices[len]); + if (results.onLine1 && results.onLine2) { + const dx = v1.x - results.x; + const dy = v1.y - results.y; + const dist2 = dx * dx + dy * dy; + if (dist2 < best.dist2) { + best = { + x: results.x, + y: results.y, + dist2: dist2, + who: domain[i], + v1: vertices[0], + v2: vertices[len] + }; + } + } + } + }; + best = { + x: null, + y: null, + dist2: Infinity, + who: null, + v1: null, + v2: null + }; + const seeRangeRandom = seeRange - 200 - 150 * Math.random() + const look = { + x: this.position.x + seeRangeRandom * Math.cos(this.angle), + y: this.position.y + seeRangeRandom * Math.sin(this.angle) + }; + vertexCollision(this.position, look, map); + vertexCollision(this.position, look, body); + if (!m.isCloak) vertexCollision(this.position, look, [playerBody, playerHead]); + + // hitting player + if ((best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { + const dmg = 0.002 * simulation.dmgScale; + m.damage(dmg); + //draw damage + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(best.x, best.y, 5 + dmg * 1500, 0, 2 * Math.PI); + ctx.fill(); + } + //draw beam + const vertex = 3 + if (best.dist2 === Infinity) best = look; + ctx.beginPath(); + ctx.moveTo(this.vertices[vertex].x, this.vertices[vertex].y); + ctx.lineTo(best.x, best.y); + ctx.strokeStyle = color; + ctx.lineWidth = 2; + ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]); + ctx.stroke(); + ctx.setLineDash([]); + + // ctx.beginPath(); + // ctx.arc(this.vertices[vertex].x, this.vertices[vertex].y, 5, 0, 2 * Math.PI); //* this.fireCycle / this.fireDelay + // ctx.fillStyle = color; + // ctx.fill(); + } + // else { + // ctx.beginPath(); + // ctx.arc(this.vertices[1].x, this.vertices[1].y, 1 + 0.3 * (simulation.cycle % this.laserInterval), 0, 2 * Math.PI); //* this.fireCycle / this.fireDelay + // ctx.fillStyle = color; + // ctx.fill(); + // } + } + // else { //flocking behavior (not working yet) + // this.force.x += Math.cos(this.angle) * this.accelMag * this.mass + // this.force.y += Math.sin(this.angle) * this.accelMag * this.mass + // //set direction to turn to fire + // if (!(simulation.cycle % this.seePlayerFreq)) { + // //find nearest mob and maintain a distance + // let nearestMob = null + // let nearestMobDistance = Infinity + // for (let i = 0; i < mob.length; i++) { + // const newMobDistance = Vector.magnitude(Vector.sub(this.position, mob[i].position)) + // if (mob[i].isDropPowerUp && mob[i].alive && newMobDistance < nearestMobDistance) { //&& !mob[i].isBoss + // nearestMobDistance = newMobDistance + // nearestMob = mob[i] + // } + // } + // if (nearestMob) { + // // console.log(nearestMob) + // this.fireDir = Vector.normalise(Vector.sub(nearestMob.position, this.position)); + // //dot product can't tell if mob is facing directly away or directly towards, so check if pointed directly away from player every few cycles + // const mod = (a, n) => { + // return a - Math.floor(a / n) * n + // } + // const sub = Vector.sub(nearestMob.position, this.position) //check by comparing different between angles. Give this a nudge if angles are 180 degree different + // const diff = mod(Math.atan2(sub.y, sub.x) - this.angle + Math.PI, 2 * Math.PI) - Math.PI + // if (Math.abs(diff) > 2.8) this.torque += 0.0002 * this.inertia * Math.random(); + // } + // } + // //rotate towards fireDir + // const angle = this.angle + Math.PI / 2; + // c = Math.cos(angle) * this.fireDir.x + Math.sin(angle) * this.fireDir.y; + // const threshold = 0.4; + // const turn = 0.000025 * this.inertia + // if (c > threshold) { + // this.torque += turn; + // } else if (c < -threshold) { + // this.torque -= turn; + // } + // const flapArc = 0.7 //don't go past 1.57 for normal flaps + // ctx.fillStyle = `hsla(${160 + 40 * Math.random()}, 100%, ${25 + 25 * Math.random() * Math.random()}%, 0.2)`; //"rgba(0,235,255,0.3)"; // ctx.fillStyle = `hsla(44, 79%, 31%,0.4)`; //"rgba(0,235,255,0.3)"; + // this.wing(this.angle + Math.PI / 2 + flapArc * Math.sin(simulation.cycle * this.flapRate), this.flapRadius) + // this.wing(this.angle - Math.PI / 2 - flapArc * Math.sin(simulation.cycle * this.flapRate), this.flapRadius) + // } + }; + }, beetleBoss(x, y, radius = 50) { mobs.spawn(x, y, 7, radius, '#16576b'); let me = mob[mob.length - 1]; diff --git a/js/tech.js b/js/tech.js index 44d1103..347b876 100644 --- a/js/tech.js +++ b/js/tech.js @@ -231,7 +231,7 @@ const tech = { // } // } // } - if (tech.isDivisor && b.activeGun && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.77 + if (tech.isDivisor && b.activeGun !== undefined && b.activeGun !== null && b.guns[b.activeGun].ammo % 3 === 0) dmg *= 1.77 if (tech.isNoGroundDamage) dmg *= m.onGround ? 0.85 : 2 if (tech.isDilate) dmg *= 1.5 + 0.6 * Math.sin(m.cycle * 0.0075) if (tech.isGunChoice && tech.buffedGun === b.inventoryGun) dmg *= 1 + 0.31 * b.inventory.length @@ -250,11 +250,11 @@ const tech = { if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() 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.energyDamage) dmg *= 1 + m.energy * 0.22 * tech.energyDamage; + if (tech.energyDamage) dmg *= 1 + m.energy * 0.26 * tech.energyDamage; if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007 - if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 + if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2.11 if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.88, player.speed * 0.0193) - if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.83 + if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.93 if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.defense() if (tech.isHarmDamage && m.lastHarmCycle + 480 > m.cycle) dmg *= 3; if (tech.lastHitDamage && m.lastHit) dmg *= 1 + tech.lastHitDamage * m.lastHit * (2 - m.defense()) // if (!simulation.paused) m.lastHit = 0 @@ -314,7 +314,7 @@ const tech = { }, tech: [{ name: "tungsten carbide", - description: "+222 maximum health
lose health after hard landings", + description: "+300 maximum health
lose health after hard landings", maxCount: 1, count: 0, frequency: 1, @@ -328,7 +328,7 @@ const tech = { tech.hardLanding = 70 tech.isFallingDamage = true; m.setMaxHealth(); - m.addHealth(2.22 / simulation.healScale) + m.addHealth(3 / simulation.healScale) m.skin.tungsten() }, remove() { @@ -402,9 +402,9 @@ const tech = { isAltRealityTech: true, isSkin: true, allowed() { - return !tech.isResearchReality && !tech.isSwitchReality + return !m.isAltSkin && !tech.isResearchReality && !tech.isSwitchReality }, - requires: "not Ψ(t) collapse, many-worlds", + requires: "not skinned, Ψ(t) collapse, many-worlds", damage: 2.42, effect() { m.skin.anodize(); @@ -672,6 +672,43 @@ const tech = { }, remove() { } }, + { + name: "supply chain", + descriptionFunction() { + return `double your current ammo for all your guns
triple the frequency of finding applied science` + }, + maxCount: 9, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0; i < b.guns.length; i++) { + if (b.guns[i].have) b.guns[i].ammo = Math.floor(2 * b.guns[i].ammo) + } + simulation.makeGunHUD(); + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].name === "applied science") tech.tech[i].frequency *= 3 + } + }, + remove() { + if (this.count) { + for (let j = 0; j < this.count; j++) { + for (let i = 0; i < b.guns.length; i++) { + if (b.guns[i].have) b.guns[i].ammo = Math.floor(0.5 * b.guns[i].ammo) + } + } + simulation.makeGunHUD(); + + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].name === "applied science") tech.tech[i].frequency = 2 + } + } + } + }, { name: "applied science", description: `get a random guntech
for each of your guns`, //spawn ${powerUps.orb.research(1)} and @@ -812,40 +849,6 @@ const tech = { // } } }, - { - name: "supply chain", - descriptionFunction() { - return `double your current ammo
+4% JUNK to tech pool` - }, - maxCount: 9, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return true - }, - requires: "", - effect() { - for (let i = 0; i < b.guns.length; i++) { - if (b.guns[i].have) b.guns[i].ammo = Math.floor(2 * b.guns[i].ammo) - } - simulation.makeGunHUD(); - this.refundAmount += tech.addJunkTechToPool(0.04) - }, - refundAmount: 0, - remove() { - for (let j = 0; j < this.count; j++) { - for (let i = 0; i < b.guns.length; i++) { - if (b.guns[i].have) b.guns[i].ammo = Math.floor(0.5 * b.guns[i].ammo) - } - } - simulation.makeGunHUD(); - if (this.count > 0 && this.refundAmount > 0) { - tech.removeJunkTechFromPool(this.refundAmount) - this.refundAmount = 0 - } - } - }, { name: "logistics", description: `${powerUps.orb.ammo()} give 80% more ammo, but
it's only added to your current gun`, @@ -909,7 +912,7 @@ const tech = { }, { name: "non-renewables", - description: `+88% damage
${powerUps.orb.ammo()} can't spawn`, + description: `+97% damage
${powerUps.orb.ammo()} can't spawn`, maxCount: 1, count: 0, frequency: 1, @@ -918,7 +921,7 @@ const tech = { return !tech.isAmmoFromHealth && !tech.isBoostReplaceAmmo }, requires: "not catabolism, quasiparticles", - damage: 1.88, + damage: 1.97, effect() { tech.damage *= this.damage tech.isEnergyNoAmmo = true; @@ -2068,7 +2071,7 @@ const tech = { }, { name: "decorrelation", - description: "if your gun or field are unused for 2 seconds
+70% defense", + description: "if your gun or field are unused for 2 seconds
+77% defense", maxCount: 1, count: 0, frequency: 1, @@ -2086,7 +2089,7 @@ const tech = { }, { name: "anticorrelation", - description: "if your gun or field are unused for 2 seconds
+100% damage", + description: "if your gun or field are unused for 2 seconds
+111% damage", maxCount: 1, count: 0, frequency: 1, @@ -2785,7 +2788,7 @@ const tech = { }, { name: "overcharge", - description: "+66 maximum energy
+6% JUNK to tech pool", + description: "+66 maximum energy
+5% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -2797,7 +2800,7 @@ const tech = { effect() { tech.bonusEnergy += 0.66 m.setMaxEnergy() - this.refundAmount += tech.addJunkTechToPool(0.06) + this.refundAmount += tech.addJunkTechToPool(0.05) }, refundAmount: 0, remove() { @@ -2876,7 +2879,7 @@ const tech = { }, { name: "parasitism", - description: "if a mob has died in the last 5 seconds
+83% damage, inhibit energy generation", + description: "if a mob has died in the last 5 seconds
+93% damage, no passive energy generation", maxCount: 1, count: 0, frequency: 1, @@ -2917,7 +2920,10 @@ const tech = { }, { name: "recycling", - description: "if a mob has died in the last 5 seconds
recover 0.5% of max health per second", + descriptionFunction() { + return `if a mob has died in the last 5 seconds
recover 0.5% of max ${tech.isEnergyHealth ? "energy" : "health"} per second` + }, + description: "", maxCount: 1, count: 0, frequency: 1, @@ -2936,7 +2942,7 @@ const tech = { }, { name: "torpor", - description: "if a mob has not died in the last 5 seconds
+66% defense", + description: "if a mob has not died in the last 5 seconds
+74% defense", maxCount: 1, count: 0, frequency: 1, @@ -3280,7 +3286,7 @@ const tech = { }, 1000); }, descriptionFunction() { - return `once per level, instead of dying
use ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(5)}` + return `once per level, instead of dying
use ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(16)}` }, maxCount: 1, count: 0, @@ -3381,7 +3387,7 @@ const tech = { { name: "Ψ(t) collapse", link: `Ψ(t) collapse`, - description: `spawn ${powerUps.orb.research(16)}
after you research enter an alternate reality`, + description: `spawn ${powerUps.orb.research(21)}
after you research enter an alternate reality`, maxCount: 1, count: 0, frequency: 1, @@ -3391,7 +3397,7 @@ const tech = { return !tech.isSwitchReality && !tech.isCollisionRealitySwitch && !tech.isJunkResearch }, requires: "not many-worlds, Hilbert space, pseudoscience", - bonusResearch: 16, + bonusResearch: 21, effect() { tech.isResearchReality = true; for (let i = 0; i < this.bonusResearch; i++) powerUps.spawn(m.pos.x + Math.random() * 60, m.pos.y + Math.random() * 60, "research", false); @@ -3431,7 +3437,7 @@ const tech = { }, { name: "renormalization", - description: `46% chance to spawn ${powerUps.orb.research(1)} after consuming ${powerUps.orb.research(1)}
+3% JUNK to tech pool`, + description: `47% chance to spawn ${powerUps.orb.research(1)} after consuming ${powerUps.orb.research(1)}
+5% JUNK to tech pool`, maxCount: 1, count: 0, frequency: 2, @@ -3442,7 +3448,7 @@ const tech = { requires: "at least 4 research, not superdeterminism", effect() { tech.renormalization = true; - this.refundAmount += tech.addJunkTechToPool(0.03) + this.refundAmount += tech.addJunkTechToPool(0.05) }, refundAmount: 0, @@ -3481,7 +3487,7 @@ const tech = { }, { name: "ansatz", - description: `after choosing a field, tech, or gun
if you have no ${powerUps.orb.research(1)} in your inventory spawn ${powerUps.orb.research(2)}`, + description: `after choosing a field, tech, or gun
if you have no ${powerUps.orb.research(1)} in your inventory spawn ${powerUps.orb.research(3)}`, maxCount: 1, count: 0, frequency: 1, @@ -3501,17 +3507,17 @@ const tech = { name: "Bayesian statistics", // description: `for each ${powerUps.orb.research(1)} in your inventory
+3.8% damage`, descriptionFunction() { - return `spawn ${powerUps.orb.research(this.bonusResearch)}
+3% damage per ${powerUps.orb.research(1)} (${(3 * powerUps.research.count).toFixed(0)}%)` + return `spawn ${powerUps.orb.research(this.bonusResearch)}
+3% damage per ${powerUps.orb.research(1)} in your inventory (${(3 * powerUps.research.count).toFixed(0)}%)` }, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return powerUps.research.count > 2 || build.isExperimentSelection + return powerUps.research.count > 1 || build.isExperimentSelection }, - requires: "at least 3 research", - bonusResearch: 3, + requires: "at least 2 research", + bonusResearch: 6, effect() { powerUps.spawnDelay("research", this.bonusResearch) tech.isRerollDamage = true; @@ -3526,7 +3532,7 @@ const tech = { { name: "mass production", descriptionFunction() { - return `tech always have +3 choices to spawn
${powerUps.orb.ammo(10)} ${powerUps.orb.heal(10)}    or ${powerUps.orb.research(7)}` + return `tech always have +3 choices to spawn
options for   ${powerUps.orb.ammo(1)}   or   ${powerUps.orb.heal(1)}   or   ${powerUps.orb.research(1)}` }, // description: `tech always have +3 choices to spawn
${powerUps.orb.ammo(8)} ${powerUps.orb.heal(8)}    or ${powerUps.orb.research(5)}`, maxCount: 1, @@ -3544,8 +3550,10 @@ const tech = { }, { name: "research", - description: `spawn ${powerUps.orb.research(7)}`, - maxCount: 1, + descriptionFunction() { + return `spawn ${this.value > 36 ? this.value + powerUps.orb.research(1) : powerUps.orb.research(this.value)}
next time this effect is improved by ${powerUps.orb.research(5)}` + }, + maxCount: 9, count: 0, frequency: 0, frequencyDefault: 0, @@ -3553,15 +3561,19 @@ const tech = { isMassProduction: true, allowed() { return true }, requires: "", + value: 8, effect() { - powerUps.spawnDelay("research", 7); + powerUps.spawnDelay("research", this.value); + this.value += 5 }, remove() { } }, { name: "ammo", - description: `spawn ${powerUps.orb.ammo(10)}`, - maxCount: 1, + descriptionFunction() { + return `spawn ${this.value > 33 ? this.value + powerUps.orb.ammo(1) : powerUps.orb.ammo(this.value)}
next time this effect is improved by ${powerUps.orb.ammo(7)}` + }, + maxCount: 9, count: 0, frequency: 0, frequencyDefault: 0, @@ -3569,26 +3581,30 @@ const tech = { isMassProduction: true, allowed() { return true }, requires: "", + value: 10, effect() { - powerUps.spawnDelay("ammo", 10); + powerUps.spawnDelay("ammo", this.value); + this.value += 7 }, remove() { } }, { name: "heals", descriptionFunction() { - return `spawn ${powerUps.orb.heal(10)}` + return `spawn ${this.value > 30 ? this.value + powerUps.orb.heal(1) : powerUps.orb.heal(this.value)}
next time this effect is improved by ${powerUps.orb.heal(7)}` }, - maxCount: 1, + maxCount: 9, count: 0, frequency: 0, frequencyDefault: 0, isNonRefundable: true, isMassProduction: true, allowed() { return true }, - requires: "mass production", + requires: "", + value: 10, effect() { - powerUps.spawnDelay("heal", 10); + powerUps.spawnDelay("heal", this.value); + this.value += 7 }, remove() { } }, @@ -3624,7 +3640,7 @@ const tech = { effect() { tech.isBrainstorm = true tech.isBrainstormActive = false - tech.brainStormDelay = 1800 - simulation.difficultyMode * 100 + tech.brainStormDelay = 2000 - simulation.difficultyMode * 100 }, remove() { tech.isBrainstorm = false @@ -3921,7 +3937,11 @@ const tech = { }, { name: "paradigm shift", - description: `when paused clicking a tech ejects it
with a 20% chance to remove without ejecting`, + // description: `when paused clicking a tech ejects it
with a 20% chance to remove without ejecting`, + // description: `when paused clicking a tech ejects it
and a 20% chance to remove without ejecting`, + descriptionFunction() { + return `when paused clicking a tech ejects it
–6 ${tech.isEnergyHealth ? "energy" : "health"} each time and a 3% chance to fail` + }, maxCount: 1, count: 0, frequency: 1, @@ -4154,7 +4174,7 @@ const tech = { }, { name: "futures exchange", - description: "clicking cancel for a field, tech, or gun
gives +4.3% power up duplication chance", + description: "clicking cancel for a field, tech, or gun
gives +4.7% power up duplication chance", // descriptionFunction() { // return `clicking × to cancel a field, tech, or gun
gives +${4.9 - 0.15*simulation.difficultyMode}% power up duplication chance` // }, @@ -4177,7 +4197,7 @@ const tech = { }, { name: "replication", - description: "+9% chance to duplicate spawned power ups
+33% JUNK to tech pool", + description: "+10% chance to duplicate spawned power ups
+33% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -4187,7 +4207,7 @@ const tech = { }, requires: "below 100% duplication chance", effect() { - tech.duplicateChance += 0.09 + tech.duplicateChance += 0.1 powerUps.setPowerUpMode(); //needed after adjusting duplication chance if (!build.isExperimentSelection && !simulation.isTextLogOpen) simulation.circleFlare(0.11); this.refundAmount += tech.addJunkTechToPool(0.33) @@ -4204,7 +4224,7 @@ const tech = { }, { name: "stimulated emission", - description: "+17% chance to duplicate spawned power ups,
but after a collision eject 1 tech", + description: "+19% chance to duplicate spawned power ups,
but after a collision eject 1 tech", maxCount: 1, count: 0, frequency: 1, @@ -4328,6 +4348,34 @@ const tech = { } } }, + { + name: "strange loop", + // description: `+11% damage
removing this doubles it's damage if you take it again`, + description: `+9% damage
removing this gives strange attractor and null hypothesis`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isBadRandomOption: true, + allowed() { + return true + }, + requires: "", + damage: 1.09, + effect() { + tech.damage *= this.damage + }, + remove() { + if (this.count > 0 && m.alive) { + tech.damage /= this.damage + this.frequency = 0 + requestAnimationFrame(() => { + tech.giveTech("null hypothesis") + tech.giveTech("strange attractor") + }); + } + } + }, { name: "null hypothesis", description: `+8% damage
removing this spawns ${powerUps.orb.research(15)}`, @@ -4352,6 +4400,35 @@ const tech = { } } }, + { + name: "martingale", + descriptionFunction() { + return `+${(100 * this.damage).toFixed(0)}% damage. After removing this there is a 50%
chance to get it back with double its damage
` + }, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + isBadRandomOption: true, + allowed() { + return true + }, + requires: "", + damage: 0.11, + effect() { + tech.damage *= 1 + this.damage + }, + remove() { + if (this.count > 0 && m.alive) { + tech.damage /= 1 + this.damage + if (Math.random() < 0.5) { + this.damage *= 2 + requestAnimationFrame(() => { tech.giveTech("chaos theory") }); + } + this.frequency = 0 + } + } + }, { name: "Born rule", description: "remove all current tech
spawn new tech to replace them", @@ -4744,6 +4821,8 @@ const tech = { b.guns[0].ammoPack = b.guns[0].defaultAmmoPack; if (b.guns[0].recordedAmmo) b.guns[0].ammo = b.guns[0].recordedAmmo simulation.updateGunHUD(); + + if (this.count) requestAnimationFrame(() => { simulation.updateGunHUD(); }); } tech.isIceCrystals = false; if (b.guns[0].ammo === Infinity) b.guns[0].ammo = 0 @@ -5377,6 +5456,7 @@ const tech = { if (this.count > 0 && b.guns[3].savedAmmo !== undefined) { b.guns[3].ammo = b.guns[3].savedAmmo simulation.updateGunHUD(); + requestAnimationFrame(() => { simulation.updateGunHUD(); }); } else if (b.guns[3].ammo === Infinity) { b.guns[3].ammo = 0 } @@ -7071,7 +7151,7 @@ const tech = { }, { name: "induction furnace", - description: "after using harpoon or grapple to collect power ups
+77% harpoon or grapple damage for 8 seconds", + description: "after using harpoon/grapple to collect power ups
+77% harpoon or grapple damage for 8 seconds", isGunTech: true, maxCount: 1, count: 0, @@ -7091,7 +7171,7 @@ const tech = { }, { name: "brittle", - description: "+88% harpoon and grapple damage
to mobs at maximum health", + description: "+88% harpoon/grapple damage
to mobs at maximum health", isGunTech: true, maxCount: 1, count: 0, @@ -7595,7 +7675,7 @@ const tech = { { name: "electronegativity", descriptionFunction() { - return `+0.22% damage per current stored energy
(+${(22 * m.maxEnergy).toFixed(0)}% damage at max energy)` + return `+0.26% damage per current stored energy
(+${(27 * m.maxEnergy).toFixed(0)}% damage at max energy)` }, // description: "+1% damage per 8 stored energy", isFieldTech: true, diff --git a/style.css b/style.css index 3971c41..f71c38e 100644 --- a/style.css +++ b/style.css @@ -1376,4 +1376,130 @@ summary { .link:hover { text-decoration: underline; +} + +/* +.fade-ins { + animation: 1.5s linear 1s fadeins; +} + +@keyframes fadeins { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} */ +.blurry-text { + color: transparent; + text-shadow: 0 0 9px rgba(0, 0, 0, 0.5); +} + +.unblur { + color: transparent; + text-shadow: 0 0 9px rgba(0, 0, 0, 0.5); + animation: 1.5s ease 1.2s normal forwards 1 unblur; +} + +@keyframes unblur { + 0% { + color: transparent; + text-shadow: 0 0 9px rgba(0, 0, 0, 0.5); + } + + 100% { + /* font-weight: 800; */ + color: #000; + text-shadow: 0 0 0px rgba(0, 0, 0, 0.5); + } +} + +.fade-in { + opacity: 0; + animation: 2s ease 1.5s normal forwards 1 fadein; +} + +.fade-in-fast { + opacity: 0; + animation: 1.5s ease 1s normal forwards 1 fadein; +} + +.fade-in-faster { + opacity: 0; + animation: 2s ease 0.5s normal forwards 1 fadein; +} + +@keyframes fadein { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes dash { + to { + stroke-dashoffset: 0; + } +} + +.draw-lines { + stroke-dasharray: 20; + stroke-dashoffset: 20; + animation: dash 2.4s ease-in forwards; +} + +.draw-lines-dash { + stroke-dasharray: 4; + stroke-dashoffset: 4; + animation: dash 2.4s ease-in forwards; +} + +.draw-lines-o { + stroke-dasharray: 11; + stroke-dashoffset: 11; + animation: dash 2.4s ease-in forwards; +} + +.draw-lines-g { + stroke-dasharray: 17; + stroke-dashoffset: 17; + animation: dash 2.4s ease-in forwards; +} + +.draw-lines-box-1 { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: dash 5s ease-in forwards; + animation-delay: 0s; +} + +.draw-lines-box-2 { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: dash 2.6s ease-in forwards; + animation-delay: 1s; +} + +.draw-lines-box-3 { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: dash 1.15s ease-in forwards; + animation-delay: 1.55s; +} + +.draw-lines3 { + stroke-dasharray: 3000; + stroke-dashoffset: 3000; + animation: dash 3.1s ease-in forwards; +} + +.draw-lines4 { + stroke-dasharray: 300; + stroke-dashoffset: 300; + animation: dash 2.5s ease-in forwards; } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 5351fe1..0deb9e0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,55 +1,21 @@ ******************************************************** NEXT PATCH ************************************************** -mob health tech - tech: cascading failure - +222% damage to mobs below 25% health - tech: yield stress - +55% damage to mobs at maximum health - cloaking tech: topological defect - +88% damage to mobs at maximum health - harpoon tech: brittle - +88% harpoon/grapple damage to mobs at maximum health -cloaking buffs - 50->66% defense while cloaked - recloak 0.25s faster - simplified cloaking field graphics - boson composite drains much less energy while moving through mobs and shields - fixed bug where mines and egg mobs were colliding with player while intangible - patch no longer drains energy when you heal on cloaking - metamaterial absorber gets 17->22% chance to spawn a power up for each mob alive - no-cloning theorem changes to 45->40% duplication and 2->1% duplication loss on killing a mob -finalBoss phases: - new: slow zone, antigravity pulse - nerfed: laser, black hole, orbitals - buffed: oscillation, mobs - improved graphics: boulder - -Hilbert space has a skin. 99->142% damage increase, but randomize tech after taking damage -Higgs mechanism has a skin. +45->77% fire rate, player can't move while firing -induction furnace gives +77% harpoon/grapple damage for 8 seconds after picking up a power up -collider 50->100% chance to combine and randomize power ups -quenching gives more bonus max health at high difficulty level (maybe around 30% more health) -accretion gives 5->7 heal power ups -dynamo bots follow player much closer when you have many of them -scrap-bots don't follow the player as accurately or as quickly - scrap bot duration 13->15 seconds -JUNK tech: planned obsolescence - make 100 scrap bots that last for about 30 seconds - -community map dojo by werid_pusheen - fixed by Cornbread 2100 - -hard mode gets 1 less heal at the start -hard and why difficulty don't begin with starter mobs -hopBullet mobs last 2 seconds less time -adjusted button heights on train station level to be consistently the same height *********************************************************** TODO ***************************************************** -hexagon head skin - maybe give defense - foam tech: increase size of foam and increase duration, but drop speed down, so they come to a stop and just hang allow them to harm player? this is probably just too annoying +Foam slow down mobs twice as much and slowly pulls them towards the ground + +30% foam damage + Half foam velocity + Foam is now effected by gravity + Requires a source of foam and not aerogel + https://en.m.wikipedia.org/wiki/Tungsten_hexafluoride + make a flutter variant just move the wings to the back? @@ -1054,9 +1020,10 @@ add sounds ******************************************************** LORE ******************************************************** +look up sci-fi science ideas here https://projectrho.com/public_html/rocket/ + possible names for tech sidereal - with respect to the stars (an extra rotation for time keeping) - strange loop holonomy - parallel transport of a vector leads to movement (applies to curved space) hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other. swarm intelligence - for a drone tech @@ -1102,9 +1069,9 @@ possible names for tech memetics magnetorquers - produce spin by pushing on earth's magnetic field Josephson junction - superconducting junction - Pyroelectricity - voltage from temp changes - upgrade from piezoelectricity - perturbation + Pyroelectricity - voltage from temp changes - upgrade from piezoelectricity Unruh effect - accelerating makes heat/thermal particles + configuration space - holds the position of everything ******************************************************** CARS IMAGES ********************************************************