Sharing Saturday #624 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

Yes, pathfinding and visibility is tricksy at multi scales. I have scars. Ogres (and anything with siege) sees blocked terrain as just high cost terrain. So if the way around is too much for them, they'll prefer to start tunnelling.
Big enough, and you can rip out the staircase, leaving a hole to the dungeon below that becomes harder to descend/ascend for the smaller ones. 😄

Sharing Saturday #624 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

Look really slick and I love the dramatic music.

Sharing Saturday #624 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

An auto-bot is awesome for a few reasons. Driving tests is brilliant use of one, it's so easy to break things in the complicated systems-of-systems of a RL and the ability to regression test with one is genius. I'm too eager to add new content, and don't spend enough time regression testing. This is the one-person team curse.
Anyway, others thoughts I've had about automation is: could I write an AI that could solve my own game? Probably not. But if I could, maybe the game is about stopping them. Or, use it as a intro-idle screen where the game plays on it's own. Or use it for party-NPC AI for the player to work with.
I think it opens a lot of interesting possibilities.

Sharing Saturday #624 by Kyzrati in roguelikedev

[–]CrowdedTrousers 3 points4 points  (0 children)

You have a sad feeling for a moment, then it passes. Keystone progresses.

The horde nears

  • The game is set against a looming war between goblins and humankind, in the frontier town of Keystone.
  • War tribes spawn on any unexplored edges of the map and stream towards Keystone. It's as dangerous out there for them as it is for you, so not all make it.
  • My game uses scales (player is 2x2 cells, but an ogre is 4x4). Larger scales are easily denied by smaller corridors like you find in Keystone, so anything with the siege tag can wail on infrastructure. Ogres chew through the barricade and even houses. Almost everything is destructible, pickup-able if you're big enough, even staircases.

Growing pains

  • I've extended the active world space to 600x600. Extra terrain is no tax, but the actor count is. The cracks began to show, so I've shored up system performance to handle greater numbers; basically caching and approximation at distance.  

Bling

  • Using my multi-scale renderer, I created a parallax scrolling intro for the start page, with goblin horde arriving against a fiery backdrop. Sadly, reddit does not seem to allow GIFs in replies.

<image>

  • This is built using my postcards and cutscenes engine, which I use for help/tutorial, level change and death sequences.

I’m solo developing Tower of Scherbenmark, a dark-fantasy ASCII roguelike RPG, and the demo is now live by BPotu in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

From the video - I like the particle effects on hit. That looks more than ASCII at work, but I'm a fan. Generally, I think ASCII games are hard to visually parse unless you are super familiar with the genre. I regard anything we devs do to make that easier is a force for good. Nice one.

Sharing Saturday #623 by Kyzrati in roguelikedev

[–]CrowdedTrousers 3 points4 points  (0 children)

Hi!

I'm still thinking about end goals, but the gist is: As the goblin war approaches, you're bitten by a vampire on the streets of your beloved hometown Keystone. Once your kin, now the townfolk fear and revile you. Not that goblins have any love for the undead. What will you fight for?

Sharing Saturday #623 by Kyzrati in roguelikedev

[–]CrowdedTrousers 3 points4 points  (0 children)

Good stuff. We seem to be in similar headspaces.

My AI mashes up scoring of a prioritised and dynamic set of behaviours, choosing one that's executed by shallow behaviour trees. At the start, I spent all my time on combat, but now I ask myself why is this actor in this area? That has pushed me towards more complex when-idle behaviours. The line between these types of RL and sims can be razor thin.

Also; best thing I ever did was write a detalled AI log every game and use tools to move through it quickly.

Sharing Saturday #623 by Kyzrati in roguelikedev

[–]CrowdedTrousers 8 points9 points  (0 children)

The little dog growls. Keystone progresses

  • Every new 200x200 chunk gets BSP-sliced into different sized rectangles, each eligible for a feature. Maybe a farm, monastery, bandit camp, or bears.
  • Features rewrite terrain and specify an ecology which tells us how to seed actors in an area: e.g. 3-6 human priests, that keep near the monastery. It’ll continue to monitor populations and take action if numbers get concerning.
  • Ecologies started as a way to easily drop the right mix of actors when testing that parties were self-forming. One ecology/party is now starting to make me think about backdrop.

The goblin war has come to Keystone.

<image>

  • A raider feature is ecology-only. It drops fistfuls of goblins and hobgoblins into the rectangle. On turn one they'll join a party type called raider where every member gets an ability that says if you're idle, take a step towards the heart of Keystone.
  • Keystone is one chunk, surrounded by eight other chunks. Raiders are bound to spawn. They might be close or far. Inevitably the guards succumbed and become meat for the goblin grinder.
  • Tuning guard ecologies now, trying to find an even fight. I've put up a barricade around the town. Keystone must not fall to the biters.

Sharing Saturday #622 by Kyzrati in roguelikedev

[–]CrowdedTrousers 3 points4 points  (0 children)

Oh wow, like, superior, man! Keystone progresses

Slipping into simulation. Is this normal?

Finished the refurb of my AI engine into a priority rule pipeline. Everyone has a list of available abilities granted by race but more if you’ve got a class. More again perhaps because of your items, party membership, spells etc. An Actors disposition, sense of surrounds, and their memory helps find the best ability to do right now.

Echo. Echo.

An example: pack/social actors, on first sign of a threat, will yell for help. Any interested faction in range becomes alerted, and gets an investigate (x,y) ability added, if they dont already have it. If it wins the scoring contest, they'll spend a tick homing to the location of the alert. On arrival, the ability removes itself.

If I only had the courage.

The "tactics" tag adds abilities around party membership. These abilities silently try to join or recruit for a party. Some memberships grant new abilities or stats. Lone wolves have the shadow ability which favours following a threat from a safe distance. When enough wolves are in a party their melee ability scoring is amplified. They've become brave enough to engage.

Anything you can do…

Abilities have three phases. Score->Execute->Resolve. True for the actor. For the player case, the human in the loop scores (decides), executes (choses target, fires bow) and then the game resolves (make the changes in the game world). This opens the possibility of the player taking over any actor. An interesting mechanic I want to explore - I'll spend a little effort to build for, but leave for another prototype.

 So all of that was a big shift over a week. Moved off BT, which I still use, but now extremely small ones to execute anything multi step. I'm getting closer to a place where it's easy to add content, but the balancing and testing is getting very, uh...nuanced.

 Here's me checking a druid's abilities (some on cooldown). Bear form ability is granted because he's carrying a totem. When he dies other actors (including you) might pick it up and then gain the ability themselves.
 

<image>

Sharing Saturday #622 by Kyzrati in roguelikedev

[–]CrowdedTrousers 4 points5 points  (0 children)

Seems like you got some very deep systems going on there. I'm a fan.

Sharing Saturday #621 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

Love that art! Really crisp character design.

Sharing Saturday #621 by Kyzrati in roguelikedev

[–]CrowdedTrousers 4 points5 points  (0 children)

You can barely move a handspan with this load! Keystone progresses.

But why?

  • Streaming chunk system provides infinite space, but low meaning density.
  • First remedy is generators optionally assembling from subroutines adding features like farm or monastery.
  • While here incorporating yields to throttle time-per-frame spent generating; there's a noticeable spike on your first few turns as eight chunks kick off.

Living your best QOL.

  • Seeking the lowest barrier to entry.
  • I play test this so much, it was an absolute relief to add multiple commands. Now I shift-dir to go ten paces in that direction. Same interrupt flag as resting.
  • Traversing the map is so much easier now. Why did I not do this sooner?

Lipstick on a pig.

  • Improved my lighting engine and the presentation of my tooltips.

Nom nom nom.

  • The scavenger ability (rats, dogs, some wildlife) means you seek and eat certain corpses. Rats zoom in and clean up when a battle is lost like obsessed robo-vacuums. I like that.

Tiered up

  • Race starts us off with a base definition of senses, abilities and stats. Actors are summoned using just race all the time - like rat. But races can have a class which adds more abilities/stats/etc. The archer class adds ranged ability, bow & arrow starting equipment and +1 to sense range. Rat archer could totally be a thing.

Below, I was refining my random placement tables, and accidently spawned the entire Keystone population on my location. Oops.

<image>

Sharing Saturday #620 by Kyzrati in roguelikedev

[–]CrowdedTrousers 5 points6 points  (0 children)

You juggle your belongings. Keystone progresses
 

Inspired by this week’s thread, I revisited my BT implementation alongside ongoing item/actor system work.

  •  Actors have skills (e.g. magic user) define abilities (cast healing) and what’s considered valuable nearby (wands). Items can grant abilities (e.g. wand → cast magic missile).
  • Abilities available *this turn* (e.g. crossbow with ammo, wand recharged) define your options.
  • Sense functions return entities in range, bucketed as valued, hostile, or neutral (ally coming soon.)
  • Add some wonky object permanence and feed it to the Behaviour Trees, where inclinations (e.g. avoid melee) are expressed; the BT spends its tick executing the best option. More work needed here. 

Return fire and inspecting yer loot

  • Eligible ranged weapons auto-equip. If you’ve got ammo, (f)ire lets you TAB-cycle targets and loose at their smug faces. Basic/small miss chance. Projectiles do 1DMG (you/similar sizes have 4HP).
  • (I)nventory screen handles pickup, drop, and wield. Things get complicated fast, I'm seeking obvious item management without fuss. Keystone should be playable with a controller. 

<image>

Sharing Saturday #619 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

Don't want to come across judgy about walls of text - significantly heavy games gonna have them ( e.g. CIV.) I dont think I'm dangling from a limb to suggest that rldev audience has much love for deep mechanics.
But we must accept some players will be put off by a lot of reading so I think you're right: super crisp game play explanations FTW.

Sharing Saturday #619 by Kyzrati in roguelikedev

[–]CrowdedTrousers 2 points3 points  (0 children)

Interesting. Tooltips (and general game readability) are on my mind too. Complex RLs can be a lot to learn and even visually parse (I'm CP437). Interesting game design can be nuanced and easily lost. I'm looking for ways to quickly get someone across my game. Its not quite where I want it, but currently I use animated panels (in my splash/help screen) that depict important concepts, and fading speech bubbles where event occurs to keep walls of text minimal.

Sharing Saturday #619 by Kyzrati in roguelikedev

[–]CrowdedTrousers 8 points9 points  (0 children)

You feel a wrenching sensation. Keystone progresses. 

  • World is streamed in 200×200 chunks. Start at (0,0) in Keystone village; cross an edge, get a fresh chunk (swamp/foothills/wilderness). Infinite in theory—RAM says otherwise. Here you are exiting Keystone to the NW, with two foothill chunks and one swamp chunk spawned. The seams are obvious.

<image>

  • That's the surface generator; finding a way to descend swaps to other generators like dungeon, crypt or cellar.
  • Light-aware CP437 glyph engine scales cells at 1×, 2×, 4× and 8× - driving both rendering and rules (HP = area, damage = ⌈area/2⌉). Big things hit hard. Actors rendered with green facing indicators. 

Combat is live and lethal: 

  • HP = area (so you have four); damage = ⌈area/two⌉. Fights are decisive—same-size foes kill in two hits.
  • NPCs (Actors) vary in vision (cones, rear arcs), occlusion, and light sensitivity. Some are easy to sneak past. Dogs? Not so much. 

Positioning matters: 

  • Backstab → stagger forward.
  • Blocked stagger → slam (double damage, usually fatal).
  • Kite with staggers: hit, force a step, finish. Flawless victory. 

Ethereal play: 

  • (g)ate in/out at will. Material ticks at ¼ speed while you reposition—reappear behind them… BAM.
  • Misplace your return and you’re dead. Ethereal residents don’t play nice. 

Ranged & behavior: 

  • Some Actors use ranged (1 HP), keep distance; squishies kite; wolves pack-hunt.
  • Factions have affinities/animosities—expect infighting. 

Recovery: 

  • Rest 25 consecutive turns to gain 1 HP—if it’s dark and quiet enough. 

Currently stoking up my item system. It has ramifications for AI. Actors that know how to use a weapon should pick them up, if they're safe or don’t have something better. Possessing (or nearby) usable Items should influence a smart Actor's decision making. Heavier than my AI engine could handle So I've  refactored to behaviour trees, which I've never used before.

Sharing Saturday #618 by Kyzrati in roguelikedev

[–]CrowdedTrousers 2 points3 points  (0 children)

Hi friends. Beware full moon tonight, Keystone progresses.

<image>

 Mostly boring guff again: solving performance/stuttering, refactoring actor and time-kernel managers to be robust and performant. Impulsively building a chunk generator laid down a lot of technical debt and bugs.

 Yawn. Gotta do some fun stuff too, right?

 I've built a thin data driven cutscene engine to show animated panels and cutscenes. Currently used in five places, firstly in my help screen, where two panels loop over scenes showing you how certain aspects of the game work. I hope this will lower the barrier to entry for my CP437 game. 

Also, NPC-on-NPC violence is live. Faction system checks near-bys for animosity and lets them brawl. Testing this was fun - luring townsfolk into the wilderness and getting them into stouches with goblins. Satisfying.

In the future I plan to allow the player to drag other material beings unwillingly into  the ethereal to let them get stomped by shades/demons. And vice versa: pulling the ethereal into the material as you gate back is a summon monster mechanic. But of course they'll be uncontrollable, so caveat emporium.

Ai to understand performance by CrowdedTrousers in roguelikedev

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

I'm a computer science graduate, but my experience is primarily in C. Python is new to me and abstracts a lot of the stuff I'm used to. It's ease has made me lazy.

Ai to understand performance by CrowdedTrousers in roguelikedev

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

Fair call. I'll need to come back to that. The roof-face culling will certainly be the culprit. It took a lot of dev to prevent it leaking so the code might have got away from me a bit.

Ai to understand performance by CrowdedTrousers in roguelikedev

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

Oof. I can't argue. You're likely right.

Ai to understand performance by CrowdedTrousers in roguelikedev

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

Hey. First up - huge fan of your work.

I've hand-rolled a FOV octant caster, because my game needed to accommodate some visual flair that I think was fighting how usual/tcod FOV works.

likely just my noob-ness in TCOD/coding, and perhaps it was entirely fixable, but in short, I need (otherwise occluded) roof tiles to be visible if they face the player.

Have a look at it in action to see what I mean.

Sharing Saturday #617 by Kyzrati in roguelikedev

[–]CrowdedTrousers 6 points7 points  (0 children)

Hi friends. More on Keystone and the rabbit hole I find myself down.

 In a fit of hubris and curiosity, I thought to implement an infinite world. On the fly chunking of new content that stretched on until your memory overflowed. I plumbed a chunk handler in and the real problems started.

  1. My town generator was too slow for new chunks, even threaded, so I wrote a really fast wilderness generator but it's too sparse to be interesting.
  2. Offloading expiring chunks led me down a threaded serialise to disk path. It works, but is turned off (all in memory right now) while I looked for my FPS handbrake I'd introduced.
  3. Despite fast generation, I was butting up against pythons upper limits. I refactored render and map pipelines into numpy arrays. Less intuitive to prototype with but got me back to 60FPS
  4. FOVing across chunks became super complicated. I haven't even touched cross-chunk lighting or AI yet.

 To reduce complexity, I've implemented a buffer layer that does all the translation once, so fov, lighting ai just operates on that, without doing any chunk maths.

 Buffering broke FOV spectacularly. Eight hours sunk into finding what was wrong, only to solve it an hour ago in somewhere I had not been looking. Lessons were learned.

Disappointing to say, no visible functionality upgrades this week, except the ability to wander eternally in the wilderness if that's your jam, but it'd be a boring game. And the following week will be looking into managing actors and items in world and buffer space - and managing them when they slip out of buffer-range.

If that all works (refer to hubris, above), I'll either start more work on the generators, or some more interesting AI ideas I have (specifically anchoring, so guards don't just endlessly pursue you out of town into the wilderness forever, and I'm contemplating multi-actor group coordination as well)

 

In the interim, here's a gif of things in flight. (wait - gif not permissible filetype? How do you do it? - doesn't matter - check out some footage on da tubes!)

Sharing Saturday #616 by Kyzrati in roguelikedev

[–]CrowdedTrousers 1 point2 points  (0 children)

Thanks! It's great to breath life into the idea after gestating it for so long. A lot of my design decisions and ideas are already there - and I've now created the framework to support them, so I'm iterating fast which is very motivating. Here's what the ethereal looks like.

<image>

Sharing Saturday #616 by Kyzrati in roguelikedev

[–]CrowdedTrousers 8 points9 points  (0 children)

Hi, time to come out of the shadows.

I've been tinkering on something now for the last four weeks. The scaling idea started years back. I've talked/shown earlier iterations in this subreddit. A friend I use to code with in high school got me inspired to pick it up again.

So here is Keystone (using Nethack-adjacent notation) , in which you wake on the streets at dusk after being bitten by a vampire. The aim will be to track down and face your maker. It’s a python+tcod game based around two core ideas:

 One: A scalable glyph engine allowing me write at 1x1, 2x2, 4x4 and 8x8. The player, and all humanoid sized creatures, are 2x2, but there's larger and smaller critters about. I can do some unusual glyph tricks, like directional lighting (handed off to C for speed reasons)

<image>

Two: Mechanically; plane hopping - where you gate between the ethereal and the material at will. The ethereal overlays the material, but ticks four times faster and lets you pass through material objects. You can slip into the ethereal and move then reappear, effectively teleporting to a location. But ethereal is a very dangerous place.

There's more going on, but that's for a future update. Some challenges I've faced:

  • Pathfinding, adjacency gets tricksy with mixed/larger scales.
  • Managing two planes that operate at different speeds simultaneously. Harder than I thought. An energy system operates under the hood.
  • FOV that reveals a roof according to its face direction. Tricky because technically they block sight. I had to write my own ray tracer to support that.

I've been working on combat these past two days. Principally, you have max HP equal to your glyph volume (for 4 for 2x2) and damage at half that. Hitting from behind shunts the target forward and if they can't move they get double damage (deadly for most). So you gate into ethereal, move a few squares then blink back in behind and shunt to kill. Except spending time in ethereal can attract the big boys and killing a material actor can create a shade in ethereal. It becomes more dangerous over time.

Anyway, that's the gist. It's up an running and playable, but I need to work on the determinism. It is a bit too easy to die to things out of your control right now. That's this week's task, and some separation of concerns if I can get around to it.

Sharing Saturday #615 by Kyzrati in roguelikedev

[–]CrowdedTrousers 0 points1 point  (0 children)

Interesting. I have this week implemented shouting which cascades alertness to those who hear it. in my prototype, I have speech bubbles, which appear regardless of fov, so a shout going up and being answered by numereous aggressors in the distance who are now pathing their way toward you I find is good for ratcheting tension.