landgreen / n-gon

2-d physics rogue-lite platformer shooter
https://landgreen.github.io/n-gon/
GNU General Public License v3.0
151 stars 222 forks source link

Suggestion: Gojo's infinity #216

Closed NV4s closed 5 months ago

NV4s commented 5 months ago

Basically, add a standing wave upgrade that slows all projectiles and lasers by dividing their speed by half every 100 milliseconds until they slow to a complete stop. Also, allow m to make mobs go splat if pushed against the standing wave and a wall/barrier.

Edit 1: Small radius but is extremely overpowered in terms of stopping projectiles and mobs (let's nerf it a little to allow laser and explosions). Also mobs take damage if pressed against the barrier (standing wave upgraded) and a wall.

Edit 2: Name: Gojo's Wave Type: Upgrade (Tech) (requires standing wave, not surface plasmons, spherical harmonics, expansion) Link: https://jujutsu-kaisen.fandom.com/wiki/Limitless#Neutral_Limitless:_Infinity Images:

satoru-gojo-hanami Gojos_Infinity3-ezgif com-webp-to-gif-converter Gojos_Infinity-ezgif com-webp-to-gif-converter

Effects: Pros

Masbirb commented 5 months ago

100 milliseconds is way too fast it would mean nothing would ever move Maybe every 100 milliseconds the speed is reduced by .1%

corneeme commented 5 months ago

I would like to see what that could do with other techs

AnnonymousNerd87 commented 5 months ago

also this would be laggy and annoying to code. Maybe increase the knockback by an obscenely high number, (5x?) but disable all block effects (bremsstrahlung, ice9, etc.) and cause it to deal damage when mobs are forced into walls by it.

I might try this in Dumb n-gon https://annonymousnerd87.github.io/

NV4s commented 5 months ago

In lore, the speed is divided by half which is why I wanted it. Think of a bunch of flying knives about to hit you and then just stop.

Masbirb commented 5 months ago

The speed of all enemies will be divided by like 1024 every second

NV4s commented 5 months ago

Bruh why. It should make enemies very slow in radius, not just a little slow.

AnnonymousNerd87 commented 5 months ago

the miscommunication is that alex wants a powerful slow in a small radius, while mason wants a weak slow globally

AnnonymousNerd87 commented 5 months ago

also I think it should be a projectile/mob repulsion field not just a slow.

Screenshot 2024-04-22 3 32 00 PM

Masbirb commented 5 months ago

Oh it is meant to be a small radius I still believe that dividing speed by 2 every tenth of a second is far too overkill

AnnonymousNerd87 commented 5 months ago

no because the base field is 100% knockback, so an extreme slow with a small radius is necessary to fully replace the shield

Masbirb commented 5 months ago

also I think it should be a projectile/mob repulsion field not just a slow.

Screenshot 2024-04-22 3 32 00 PM

That would work fairly well

AnnonymousNerd87 commented 5 months ago

a repulsion field is good because it gets them out of the way so you don't accidentally run into them, without just making everything except lasers useless

AnnonymousNerd87 commented 5 months ago

it would drain energy proportional to the number of projectiles/mobs in the aoe, and their mass * speed against the field

AnnonymousNerd87 commented 5 months ago

it works well in Noita, so it should work well in n-gon

LinuxRocks2000 commented 5 months ago

You can already get consistent slowing radii with eddy current brake or that healing tech.

NV4s commented 5 months ago

More info:

Small radius but extremely overpowered in terms of stopping projectiles and mobs (let's nerf it a little to allow laser and explosions)

NV4s commented 5 months ago

There are some stuff I may remove and separate into 2 different upgrades (splat against wall and op slowing will most likely be separated)

landgreen commented 5 months ago

this seems similar to eddy current.

Screenshot 2024-04-23 at 6 06 50 PM
AnnonymousNerd87 commented 5 months ago

that's why I think it should be a repulsion to be more unique

landgreen commented 5 months ago

repulsion is how the default shields work

AnnonymousNerd87 commented 5 months ago

I mean a slow, consistent repulsion over a larger area, like eddie current brake

On Tue, Apr 23, 2024 at 7:01 PM landgreen @.***> wrote:

repulsion is how the default shields work

— Reply to this email directly, view it on GitHub https://github.com/landgreen/n-gon/issues/216#issuecomment-2073856899, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHEAKNCO3ASMMCDQAT3JRT3Y64G6NAVCNFSM6AAAAABGTQMKL6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZTHA2TMOBZHE . You are receiving this because you commented.Message ID: @.***>

NV4s commented 5 months ago

I mean maybe a field that slows enemies instead of knocking them back

kgurchiek commented 5 months ago

in my opinion that would make the most sense for standing wave so you can shoot the mobs as they get stuck in slo-mo in front of you

NV4s commented 5 months ago

That's my point that I want to have

NV4s commented 5 months ago

The splat effect can be an entirely different upgrade.

landgreen commented 5 months ago
Screenshot 2024-04-24 at 8 39 49 AM

so this effect?

NV4s commented 5 months ago

Yea but a permanent field that has this area of effect

kgurchiek commented 5 months ago

Screencast from 2024-04-24 12-54-32.webm

Maybe something like this where it slowly pushes things away? (In this example it gets stronger when in an inner circle)

m.harmonic3Phase = () => { //normal standard 3 different 2-d circles
    const fieldRange1 = (0.75 + 0.3 * Math.sin(m.cycle / 23)) * m.fieldRange * m.harmonicRadius * 2
    const fieldRange2 = (0.68 + 0.37 * Math.sin(m.cycle / 37)) * m.fieldRange * m.harmonicRadius * 2
    const fieldRange3 = (0.7 + 0.35 * Math.sin(m.cycle / 47)) * m.fieldRange * m.harmonicRadius * 2
    const netFieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3)
    ctx.fillStyle = "rgba(110,170,200," + Math.min(0.6, (0.04 + 0.7 * m.energy * (0.1 + 0.11 * Math.random()))) + ")";
    ctx.beginPath();
    ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 * Math.PI);
    ctx.fill();
    ctx.beginPath();
    ctx.arc(m.pos.x, m.pos.y, fieldRange2, 0, 2 * Math.PI);
    ctx.fill();
    ctx.beginPath();
    ctx.arc(m.pos.x, m.pos.y, fieldRange3, 0, 2 * Math.PI);
    ctx.fill();
    //360 block
    for (let i = 0, len = mob.length; i < len; ++i) {
        if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) - mob[i].radius < netFieldRange && !mob[i].isUnblockable) { // && Matter.Query.ray(map, mob[i].position, m.pos).length === 0
            mob[i].locatePlayer();
            const distance = Math.sqrt((mob[i].position.x - player.position.x)**2 + (mob[i].position.y - player.position.y)**2);
            const direction = Vector.normalise(Vector.sub(mob[i].position, m.pos));
            const fieldRanges = [fieldRange1, fieldRange2, fieldRange3].sort((a, b) => b - a);
            if (distance < fieldRanges[0]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x * 0.9, y: mob[i].velocity.y * 0.9 });
            if (distance < fieldRanges[1]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x * 0.5, y: mob[i].velocity.y + direction.y * 0.5 })
            if (distance < fieldRanges[2]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x, y: mob[i].velocity.y + direction.y })
        }
    }
}
AnnonymousNerd87 commented 5 months ago

looks great!

On Wed, Apr 24, 2024 at 10:07 AM Cornbread2100 @.***> wrote:

Screencast from 2024-04-24 12-54-32.webm https://github.com/landgreen/n-gon/assets/90143063/c4493e33-fd22-476f-b115-cbbd587b34f6

Maybe something like this where it slowly pushes things away? (In this example it gets stronger when in an inner circle)

m.harmonic3Phase = () => { //normal standard 3 different 2-d circles const fieldRange1 = (0.75 + 0.3 Math.sin(m.cycle / 23)) m.fieldRange m.harmonicRadius 2 const fieldRange2 = (0.68 + 0.37 Math.sin(m.cycle / 37)) m.fieldRange m.harmonicRadius 2 const fieldRange3 = (0.7 + 0.35 Math.sin(m.cycle / 47)) m.fieldRange m.harmonicRadius 2 const netFieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3) ctx.fillStyle = "rgba(110,170,200," + Math.min(0.6, (0.04 + 0.7 m.energy (0.1 + 0.11 Math.random()))) + ")"; ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 Math.PI); ctx.fill(); ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange2, 0, 2 Math.PI); ctx.fill(); ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange3, 0, 2 Math.PI); ctx.fill(); //360 block for (let i = 0, len = mob.length; i < len; ++i) { if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) - mob[i].radius < netFieldRange && !mob[i].isUnblockable) { // && Matter.Query.ray(map, mob[i].position, m.pos).length === 0 mob[i].locatePlayer(); const distance = Math.sqrt((mob[i].position.x - player.position.x)2 + (mob[i].position.y - player.position.y)2); const direction = Vector.normalise(Vector.sub(mob[i].position, m.pos)); const fieldRanges = [fieldRange1, fieldRange2, fieldRange3].sort((a, b) => b - a); if (distance < fieldRanges[0]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x 0.9, y: mob[i].velocity.y 0.9 }); if (distance < fieldRanges[1]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x 0.5, y: mob[i].velocity.y + direction.y 0.5 }) if (distance < fieldRanges[2]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x, y: mob[i].velocity.y + direction.y }) } }}

— Reply to this email directly, view it on GitHub https://github.com/landgreen/n-gon/issues/216#issuecomment-2075437485, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHEAKNBBJMZKYFHMVFFHIBTY67REDAVCNFSM6AAAAABGTQMKL6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZVGQZTONBYGU . You are receiving this because you commented.Message ID: @.***>

NV4s commented 5 months ago

That's excellent @kgurchiek! Besides the fact that the field isn't more forced against the mob, this is mostly the idea I'm getting. Make it less flexible with aerodynamics when interacting with the field and more pushing. (My idea is to make the force more flexible than standing wave, but less flexible compared to your code addition).

AnnonymousNerd87 commented 5 months ago

also make it drain energy based on the number and mass of mobs in the aoe

On Wed, Apr 24, 2024 at 10:58 AM Felix Koenig @.***> wrote:

looks great!

On Wed, Apr 24, 2024 at 10:07 AM Cornbread2100 @.***> wrote:

Screencast from 2024-04-24 12-54-32.webm https://github.com/landgreen/n-gon/assets/90143063/c4493e33-fd22-476f-b115-cbbd587b34f6

Maybe something like this where it slowly pushes things away? (In this example it gets stronger when in an inner circle)

m.harmonic3Phase = () => { //normal standard 3 different 2-d circles const fieldRange1 = (0.75 + 0.3 Math.sin(m.cycle / 23)) m.fieldRange m.harmonicRadius 2 const fieldRange2 = (0.68 + 0.37 Math.sin(m.cycle / 37)) m.fieldRange m.harmonicRadius 2 const fieldRange3 = (0.7 + 0.35 Math.sin(m.cycle / 47)) m.fieldRange m.harmonicRadius 2 const netFieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3) ctx.fillStyle = "rgba(110,170,200," + Math.min(0.6, (0.04 + 0.7 m.energy (0.1 + 0.11 Math.random()))) + ")"; ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 Math.PI); ctx.fill(); ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange2, 0, 2 Math.PI); ctx.fill(); ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, fieldRange3, 0, 2 Math.PI); ctx.fill(); //360 block for (let i = 0, len = mob.length; i < len; ++i) { if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) - mob[i].radius < netFieldRange && !mob[i].isUnblockable) { // && Matter.Query.ray(map, mob[i].position, m.pos).length === 0 mob[i].locatePlayer(); const distance = Math.sqrt((mob[i].position.x - player.position.x)2 + (mob[i].position.y - player.position.y)2); const direction = Vector.normalise(Vector.sub(mob[i].position, m.pos)); const fieldRanges = [fieldRange1, fieldRange2, fieldRange3].sort((a, b) => b - a); if (distance < fieldRanges[0]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x 0.9, y: mob[i].velocity.y 0.9 }); if (distance < fieldRanges[1]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x 0.5, y: mob[i].velocity.y + direction.y 0.5 }) if (distance < fieldRanges[2]) Matter.Body.setVelocity(mob[i], { x: mob[i].velocity.x + direction.x, y: mob[i].velocity.y + direction.y }) } }}

— Reply to this email directly, view it on GitHub https://github.com/landgreen/n-gon/issues/216#issuecomment-2075437485, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHEAKNBBJMZKYFHMVFFHIBTY67REDAVCNFSM6AAAAABGTQMKL6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZVGQZTONBYGU . You are receiving this because you commented.Message ID: @.***>

NV4s commented 5 months ago

@AnnonymousNerd87 What is your discord user in the n-gon discord? (The old and more active one.) Also @kgurchiek , make the field drain energy proportionally based on the mass and speed of the mob coming to you (kinda like the basic field draining energy based on the mass of blocks and your output of it).

AnnonymousNerd87 commented 5 months ago

I don't have discord bc its blocked by lightspeed

On Wed, Apr 24, 2024 at 11:01 AM Drag0n_A13x @.***> wrote:

@AnnonymousNerd87 https://github.com/AnnonymousNerd87 What is your discord user in the n-gon discord? (The old and more active one.) Also @kgurchiek https://github.com/kgurchiek , make the field drain energy proportionally based on the mass and speed of the mob coming to you (kinda like the basic field draining energy based on the mass of blocks and your output of it).

— Reply to this email directly, view it on GitHub https://github.com/landgreen/n-gon/issues/216#issuecomment-2075531234, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHEAKNHY2JBCWCHAZKK6UTDY67XRBAVCNFSM6AAAAABGTQMKL6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZVGUZTCMRTGQ . You are receiving this because you were mentioned.Message ID: @.***>

NV4s commented 5 months ago

@AnnonymousNerd87 That's wild. Same here, but on CKA.

AnnonymousNerd87 commented 5 months ago

I have always had this quest for the holy grail, the one, the universal @.***, but ever since reading Cory Doctorow that quest has been burning with a vengeance. If you haven't read Little Brother yet I would highly recommend it to anyone in the open source community.

On Wed, Apr 24, 2024 at 11:10 AM Drag0n_A13x @.***> wrote:

@AnnonymousNerd87 https://github.com/AnnonymousNerd87 That's wild. Same here, but on CKA.

— Reply to this email directly, view it on GitHub https://github.com/landgreen/n-gon/issues/216#issuecomment-2075544447, or unsubscribe https://github.com/notifications/unsubscribe-auth/BHEAKNHKISVMYVRE5WXLYWLY67YPTAVCNFSM6AAAAABGTQMKL6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZVGU2DINBUG4 . You are receiving this because you were mentioned.Message ID: @.***>

NV4s commented 5 months ago

Are you considering the slowing mechanism @landgreen (the webm and code @kgurchiek made)?

landgreen commented 5 months ago

I considered it.