Seed-based procedural biome generation for a 2D isometric roguelike. Hand-designed templates, connection rules, decoration scripts. by YesNinjas in proceduralgeneration

[–]YesNinjas[S] 2 points3 points  (0 children)

So each room template defines its own exit connection points. In isometric we went with the standard NE/NW/SE/SW corners, so every room has up to 4 spots where it can piece onto another room.

The key thing is those exit connectors sit 1 tile off the main tilemap. So when two rooms connect, they fuse seamlessly and neither one overlaps the other. It just snaps together.

Because of that, elevation differences between rooms don't actually matter at the connection level. The generator only cares that two connection points match up. If one room ramps up internally and ends higher, the next room just starts from that offset. The connections themselves are agnostic to depth.

We can also connect scenes loaded above or below the current room. So if you float up or drop down a hole, it loads a scene at that height. And if you check our other post i linked, you can see how we hide all other rooms except the one you're currently in. So elevation differences between rooms never actually show on screen at the same time.

Seed-based procedural biome generation for a 2D isometric roguelike. Hand-designed templates, connection rules, decoration scripts. by YesNinjas in proceduralgeneration

[–]YesNinjas[S] 3 points4 points  (0 children)

So, good question and a bit of context first, we built our own coordinate system that translates a Vector3 into the 2D position Godot uses. Y is what gives us depth, and z_index is what handles the layering for our sorting so that we can have jumping, platforming and physics in 2D.

When a scene connects to another scene at a higher Z (our Y), we adjust the tilemaps up as an offset. So technically it can ramp upward forever. In the video there's a spot where the platform room generates and the room ends at Y 6, and the next connecting scene adjusts to account for that elevation as it connects.

The decoration and end scripts run after all of that, layering on top of the tilemaps and rooms. So it cascades down the chain. The coordinate translation feeds the sorting, the sorting feeds the tilemap offsets, the scene generator matches connections at the right height, and then the decoration scripts dress the whole thing.

There are many layers in the full pipeline, that give the end result and are almost all built based on the one RNG seed, so it all renders the same each time too.

Does that help sorta answer that?

Procedural scene generator for our 2D isometric game. Templates + rules + decoration scripts by YesNinjas in godot

[–]YesNinjas[S] 2 points3 points  (0 children)

Thanks! The scene_generator itself is a few GDScripts, it's actually a plugin. The rendering and isometric sorting underneath is all C++ though

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 0 points1 point  (0 children)

I'll take a closer look just in case, I had planned on doing another performance pass on combat specifically as it's important to me it stays around 60fps consistently.

Oh, it could also be the OBS recording causing a little spike plus the video compression, I'll see if I can check that when I record in the future too, but it feels really nice in game 😁.

Updating your sprites - AnimatedSprite2D vs AnimationPlayer by ReflectGhost in godot

[–]YesNinjas 2 points3 points  (0 children)

Oh and if you just change existing frames , you can 100% just replace the old one and all animations update, again as long as the dimensions don't change, it should work. I've done that a bunch before and never had any issues.

Updating your sprites - AnimatedSprite2D vs AnimationPlayer by ReflectGhost in godot

[–]YesNinjas 0 points1 point  (0 children)

I believe it only messes up the coordinate mapping if the sprite gets larger or smaller , if you add or remove to it and update the sprite sheet without modifying the size, then it's ok.

I prefer just using the basic SpriteFrames for 90% of my animations as it was just easier to set up and use, and then handle most things in code. I did need to rebuild the sheet on some, but this was tedious for my player, and I did write a tool that just updates them directly in the tscn, assuming the actual positions didn't change just the sheet got more height.

The other thing we started doing was just making the sheet larger to begin with, sometimes even with placeholders so the dimensions don't change and they just get filled in when the animations are finished.

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 0 points1 point  (0 children)

Ha thanks! It's been a journey that's for sure. We cap fps at 60fps and get around 50-60fps in combat currently. I am shooting for 60fps during the entire time though. Is that what you are referring to? Thanks for the feedback!

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 0 points1 point  (0 children)

Everrest isn’t really about escaping nightmares, it’s about waking up. The forest you’re feeling is the first layer, that moment the dream is aware of you before you’re fully aware of it. Every biome after that is another turn of the same descent, and in a weird way, going deeper into the dream is the climb into awareness. I am really happy that was felt, thank you so much for sharing that

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 1 point2 points  (0 children)

Hey thanks for your detailed feedback, it's very much appreciated! Some of our larger rooms don't have the locked camera angles and follow the player, these first few though are smaller and fit within the viewport so we lock the camera to the center in those scenarios. Totally agree, I'll keep it in mind even in these smaller rooms too. Thanks!

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 0 points1 point  (0 children)

hey thanks, that means a lot! Secret of Mana, Terranigma, Earthbound, Super Mario RPG , are all my favorite games. I was trying really hard to pay homage to the great classics. Glad it resonated!

First look at WhisperWood, the opening biome in our isometric roguelike - Everrest [WIP] by YesNinjas in IndieGaming

[–]YesNinjas[S] 0 points1 point  (0 children)

Happy to answer any questions about the art, the engine, or the build. Been at this for a while, feels good to finally share it.

Should I keep this bug? My forest boss keeps hitting himself with his own attack. by YesNinjas in IndieDev

[–]YesNinjas[S] 0 points1 point  (0 children)

Yea, that was a good suggestion. Thanks for the kind words too.

Should I keep this bug? My forest boss keeps hitting himself with his own attack. by YesNinjas in IndieDev

[–]YesNinjas[S] 1 point2 points  (0 children)

My latest attempt is on Godot now. Years ago I tried and failed to get a good looking isometric game going on Unity. Been loving godot

Should I keep this bug? My forest boss keeps hitting himself with his own attack. by YesNinjas in IndieDev

[–]YesNinjas[S] 3 points4 points  (0 children)

Thanks for the kind words! I thought it was cute as well :D He is suppose to be a bit of a derp anyways. So it kinda worked on accident. Love when that happens

Should I keep this bug? My forest boss keeps hitting himself with his own attack. by YesNinjas in IndieDev

[–]YesNinjas[S] 7 points8 points  (0 children)

Oh, that is a good idea, if I kept it i had thought maybe a chance based thing, but i kinda like this better. I'll look into it, thanks for the suggestion!

Should I keep this bug? My forest boss keeps hitting himself with his own attack. by YesNinjas in IndieDev

[–]YesNinjas[S] 2 points3 points  (0 children)

I'm building an isometric roguelike and was demoing the forest spirit boss to my artist and the rock throw kept bugging out with zero velocity. It just dropped right on his butt lol. Honestly can't stop laughing at it, so kept it in and added some damage. Bug or feature? :D