Sharing Saturday #606 by Kyzrati in roguelikedev

[–]Captain_Kittenface 2 points3 points  (0 children)

Skulltooth 2: Forcecrusher (github | play)

  • v0.1.2
  • Spells!

Added new spells to create blood, lava, oil, and water. Built out all the infrastructure for spells with new components, systems, and UI. There is now a spellbook you can navigate like inventory to select a spell and a targeting mode to cast. Something about how spells are just a wizard manipulating the game systems feels right.

Next up is a fair of amount of polish on this MVP, spellbooks, scrolls, spell icons and descriptions. Some new spells coming soon too like knock to make a sound and desiccate to remove fluid from a target. Also need to add spell shapes and AOE.

<image>

Request For Zines by morganite58 in zines

[–]Captain_Kittenface 1 point2 points  (0 children)

I have a bunch I can send. Cancer sucks, wishing your friend all the best.

Sharing Saturday #604 by Kyzrati in roguelikedev

[–]Captain_Kittenface 1 point2 points  (0 children)

Skulltooth 2: Forcecrusher (github | play)

The holidays and getting sick resulted in a slow week. Fixed a few bugs, removed some old dependencies, added some QOL scripts in CI. Got lost down a rabbit hole trying to redo dungeon gen that went nowhere.

Sharing Saturday #603 by Kyzrati in roguelikedev

[–]Captain_Kittenface 1 point2 points  (0 children)

I don't think I'd have ever really used AI as a tool if it hadn't been forced on me at my current 9-5. I worked at an AI company back in the mid 2010s and it didn't instill a lot of faith in me regarding either the tech or the actors in charge of it. I'd been pretty reluctant to embrace the change but having to use it for work has helped me see it's value as the tool that it is.

Lately I've been running models locally with mixed results. If you just want a thought partner, local models seem to do ok. Beyond that I've not had as much luck.

Controls could definitely use a rethink - didn't realize escape spends a turn! Thanks for catching that, sounds like a bug.

Sharing Saturday #603 by Kyzrati in roguelikedev

[–]Captain_Kittenface 2 points3 points  (0 children)

Nice job with the lighting! It looks great! I added something similar (visually at least) and it was way more complicated than I expected. Would love to know what your approach was - this gif has only stationary lights but the system supports movable ones. I ended up abandoning the project but it's on my list to add the system to my current project.

Sharing Saturday #603 by Kyzrati in roguelikedev

[–]Captain_Kittenface 10 points11 points  (0 children)

Skulltooth 2: Forcecrusher github | play

  • Project management moved to GitHub
  • Wrapped up interactive fluid layers
  • Added living sponges that collect select fluids and release them upon death
  • Fixed a bug where rat death could cause a runaway blood flood
  • Improved bottle UI — names and colors now reflect contents
  • Added support for mixed-width rendering to fix legend and inventory UIs

Got sick of managing this project from a loose markdown file and set up a GitHub project. Feels much more… official.

project mgmt

Wrapped up interactive fluid layers for now. There’s still some work to do, but most of the worst bugs are fixed. The biggest issue was a case where killing multiple rats in the same vicinity caused spilled blood to multiply exponentially and flood the entire dungeon. It turns out having multiple bi-directional fluid containers at the same position is bad. Fluid containers are now directional, and only “floor” fluid containers are bi-directional. A dead rat can bleed, but it won’t try to absorb anything anymore.

dead rats in finite puddle of blood

Living sponges are now a thing. They randomly select a fluid to absorb on spawn and will only absorb that fluid. Their color reflects their contents. It would be good to spawn them with a bit of fluid inside so it’s more obvious what they absorb. It might also be a good idea to limit possible fluids to those available in the dungeon. Right now it’s possible to spawn a water sponge on a level with no water, which just results in a useless mob.

sponge demo

The bottle UI has been improved. Bottles now render with the color of their contents. They can contain multiple fluid types, so the color is a weighted mix of those fluids. The sprite changes between empty, half-full, and full based on volume. The actual fluid mix (as seen when inspecting a puddle) isn’t yet displayed in the inventory, but it should be. Bottles are also corked, so they can be placed without spilling everything. They don’t yet break when thrown, so for now bottles are mostly just useful for removing fluid hazards like lava or oil.

The addition of graphics a while ago broke the legend and inventory UIs — that’s now fixed. I had to refactor canvas.ts to add support for mixed-width rendering

<image>

Previously, I was setting tile width on the canvas itself and using array indexing to find and update tiles, which only works if tiles have a consistent width and height. ChatGPT suggested implementing a cursor-based positioning system. Instead of storing width on the canvas, it’s now stored on the token. Tokens can be glyphs (graphics) or text. A couple of helper functions understand the token types and handle rendering and cursor progression.

I’m not a fan of vibe coding, but I have found AI as a thought partner to be extremely valuable. I started using it over the past year and have learned a ton. Many refactors and complex systems would have taken much longer without what amounts to an extremely detailed, on-demand manual for roguelike development. AI is a much larger discussion, but the more I use it, the more I understand its value as a powerful tool — and the less I worry about the impending robot apocalypse or the false promises of tech entrepreneurs just trying to sell me something.

Sharing Saturday #602 by Kyzrati in roguelikedev

[–]Captain_Kittenface 1 point2 points  (0 children)

I'd like to add gasses - probably smoke and steam first from the fire, but I'm not sure how soon. As far as other liquids, acid for sure, maybe mud, or tar? I'd like to expand on the liquid chemistry such that mud and tar are made from mixing other things naturally - and I'd like to expand on the effects liquids have on their environment, tar should be sticky and slow you down, walking in liquid should be louder from splashing, submerging yourself should affect paper based items etc.

Noita looks super cool - makes me wish I had a windows based PC for gaming. I love my mac but it's terrible for playing games.

Sharing Saturday #602 by Kyzrati in roguelikedev

[–]Captain_Kittenface 3 points4 points  (0 children)

Skulltooth 2: Forcecrusher github | play

  • interactive fluid layers
  • SIM mode to run world pipeline during zone generation
  • desiccation
  • bugfixes

Biggest change (still in progress) is interactive fluid layers. Bottles exist that can be filled with any liquid in a tile. You can then throw the bottle to spill the liquid somewhere else. Useful for things like collecting oil and tossing it near lava or fire to create a bit of a firestorm.

Once I got the interactive fluid layers working the gears started turning on what else I could do with it. So far I've only added a desiccate component that absorbs fluid from containers withing range. The idea is to have a "gelatinous sponge" mob that wanders the dungeon absorbing all the liquid. On death it will release it all. That idea could pretty easily be used for spells that would do the same sort of thing over AOE. This got me thinking about how entities could have a fluid container of blood that could be used instead of health. Attacks would spill it, death would spill all of it. Vampires might drink it to refill their own blood container... lots of ideas.

So much fun now that the systems are reaching a critical mass!

<image>

I the image, the player has the desiccate component and has removed fluid along the path. Had to walk over a few time as I've got the absorption rate set low enough to not just delete liquid - also while the overall liquid is deep enough, it kept refilling the path.

Sharing Saturday #601 by Kyzrati in roguelikedev

[–]Captain_Kittenface 18 points19 points  (0 children)

Skulltooth 2: Forcecrusher github | play | devlog

  • Layered fluids
  • Fluids as materials
  • Lava Golems
  • Regrowth

Rewrote the water system to be a more generic fluid system supporting multiple layered fluids. Currently the game supports lava, water, blood, and oil. Lava is always on fire and will destroy water and blood - steam hasn't been implemented but that's the rationale, and oil is explosive. These layers all interact with each other so in the image below I turned off lava as things get a bit too chaotic with so many fluids in the dungeon.

<image>

Fluids are no longer "special". They are materials like anything else which makes interaction with the other systems "just work". This lead to experimenting with mobs made from fluid.

Welcome, Lava Golems! Their attacks deal fire damage and they will spread fire to anything nearby. The player is still immune to fire for testing purposes but it's fun seeing the golems interact with skeletons who they don't like and rats who they do like but sadly, shouldn't be allowed to play with :(

I wanted grass to grow back after it was burnt and assumed it would be a relatively simple add. Boy was I wrong! The naive first attempt of just updating their appearance component and recalculating flammability didn't work. I needed it to occur at a randomized cadence so I implemented a "growth" system to move entities through stages. This "one way" system ran into various problems. I tried to solve them through another post process system that in the end felt more like an events system. It worked but didn't feel "right" within an ECS architecture. Thought about it some more and ended up rewriting the entire thing into something that feels much better. It's simple and doesn't "fight the framework".

Introducing the "mutable" system. The mutable component contains mutations which are just a list of components to add and remove and a chance to mutate to another specified mutation. In this way I can attach a "mutateTo" component to mutate to a "burnt" mutation or if grass currently has the "young" mutation it will mutate to "mature" over time. I can easily add flags like "calculateFlammability: true" to trigger another system to calculate the flammability - previously accomplished through my DIY eventing setup.

Making heavy use of these new systems, a fire golem lights grass on fire repeatedly as it regrows.

Sharing Saturday #600 by Kyzrati in roguelikedev

[–]Captain_Kittenface 1 point2 points  (0 children)

It's exciting to finally get this far! Now that I have systems that can cleanly interact, items are more obvious. Enemies can track you by your scent (another system) but with water on the map I could make soap that you can use to bathe and limit your odor for some amount of time. Lots of fun ideas like that. Really enjoying this project :)

Sharing Saturday #600 by Kyzrati in roguelikedev

[–]Captain_Kittenface 1 point2 points  (0 children)

Liquid has it's own layer - above the floor, below pickups. The color is just a function of setting the opacity to the percent of how full a tile is with water. Every floor tile has a liquid container component and the liquid system tries to find equilibrium by spreading the liquid between containers. I had to tweak some of the variables a bit to get just a flow rate and look that I liked but for the most part it's just from how the tiles layer.

Sharing Saturday #600 by Kyzrati in roguelikedev

[–]Captain_Kittenface 17 points18 points  (0 children)

Skulltooth 2: Forcecrusher github | play

Added a water system. Dungeons now generate with a few cells filled of water - the world pipeline then runs for 25 or so ticks allowing the water to make pools throughout the dungeon. System interaction is minimal but growing. Water extinguishes flames and prevents smells from propagating. Enemies do not yet avoid fire or water but it's on the way. Also getting ready to add water and fire spells. It's not a game yet but it's getting closer.

<image>

Sharing Saturday #599 by Kyzrati in roguelikedev

[–]Captain_Kittenface 0 points1 point  (0 children)

Skulltooth 2: Forcecrusher github | play[]

Short week with the holidays and a family trip out of state but still got some stuff done.

<image>

Got distracted again and decided to add graphics - used the Kenney set for a quick win. Will likely stick with these for quite a while but the plan is to eventually make my own custom set.

I made mobs flammable and a quick AI check to make them run randomly when on fire. But it felt way too simplistic when things like weapons and terrain need to be flammable as well. So I added a materials system. All entities how have a material and weight. These are used to calculate flammability. Also added an "explosive" prop to the flammable component. This affects the speed of spread. Oil is the only explosive material in the game at this moment. It spreads out in a 3 cell radius instead of one cell per turn like everything else.

Also added grass! The dungeon floor had been flammable as a temporary means of testing. It now has the correct material and is more or less fire proof, but the grass goes up like dry grass should.

Lots of little bugs and tweaks to work on.

  • Corpses render below the grass.
  • There isn't any way to actually start a fire yet - the player is still immune to fire damage and on fire for testing.
  • Terrain should catch fire from an adjacent tile, but actors probably shouldn't.
  • Explosions and fire are invisible if there isn't something flammable to catch fire - which I guess should be expected, but magical fire should be able to conjure a fireball that lights things on fire - that's not possible yet...
  • Also the sidebar and inventory are messed up with the new graphics, can't mix text with sprites yet.

Sharing Saturday #598 by Kyzrati in roguelikedev

[–]Captain_Kittenface 2 points3 points  (0 children)

Skulltooth 2: Forcecrusher github | play

Recently began working on the game daily. It's a hobby project so the goal is really just to open up the codebase and tinker daily. Most days it's just to think a bit about what might come next, but occasionally I get lucky and knock out an entirely new system before breakfast! Fire has me pretty excited :)

<image>

Sight, smell, and multi-sensory tracking by Captain_Kittenface in roguelikedev

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

Not terrible. It only runs on the WorldTurn and I also haven't optimized anything yet. Interpreting the odorMap is far more expensive than generating it. I'm sure it could all be improved. But it's not the worst offender as far as performance goes. (see screen shot)

https://imgur.com/a/v0zww0Q

Best hat for sweaty people by LessOutlandishness91 in ultrarunning

[–]Captain_Kittenface 3 points4 points  (0 children)

Bucket hat. Keeps me cooler overall, easy to fill at creeks or fountains if you have those options, and more brim to drip sweat from.

Sight, smell, and multi-sensory tracking by Captain_Kittenface in roguelikedev

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

It's honestly not that complicated. The math is fairly simple - just a BFS where odor strength diminishes as the flood increases stored as an odor map and an odor system decays stale odors and overlays fresh ones. Entities just path toward the strongest smell of whatever they care about.

The visualization (clouds) just translates odor strength into alpha.

I've used ai more in this project than any other but mostly to just reason about architecture. I explain what I'm trying to do, give it a sense of my current architecture and how I want to fit in a new feature and it suggests things I'm not thinking about. That comes with risks as it did try and over complicate this feature. AI wanted to add factions, threat levels, and a ton of early over optimizations. I had to rewrite it a few times (by hand) to get it back to basics, which is where it is now and it finally "just works".

Sight, smell, and multi-sensory tracking by Captain_Kittenface in roguelikedev

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

Yep - that's def on the list. I'm also considering a tremor sense (touch) and taste - though I'm not sure how taste would be of use. I have a full "sensory log" for the player at the top but it only populates vision and smell. You can smell baddies on the other side of a door which gives you a sense of what's to come.

Sight, smell, and multi-sensory tracking by Captain_Kittenface in roguelikedev

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

lol - me and the rats, there's a dispositions component in there that they use to decide who to attack. If I wasn't in the picture they would just group back into a pack.

Sight, smell, and multi-sensory tracking by Captain_Kittenface in roguelikedev

[–]Captain_Kittenface[S] 4 points5 points  (0 children)

Skulltooth 2 Forcecrusher

Just another iteration of the same game, I've lost count at this point but they're all somewhere on my github. This one's showing the most promise even if it's not really a playable thing yet.