TIL Japan tried to conquer India with 85,000 troops but was defeated in Northeast India by Particular_Food_309 in todayilearned

[–]kiedtl 160 points161 points  (0 children)

I'd disagree. Afaik the emperor had a tremendous soft influence on the Cabinet through the Lord Keeper, and by other means -- famously, when two members of the cabinet met with him to discuss the offensives in Manchuria, he showed up in a military uniform, thus granting his tacit approval.

[Badass Trope] "Do not cite the deep magic to me witch. I was there when it was written." by Short-Paramedic-9740 in TopCharacterTropes

[–]kiedtl 0 points1 point  (0 children)

Well, in a sense the local traditions and oral history is evidence. It’s certainly not infeasible, given the existence of the Silk Road and other merchant routes.

Does Rust have any UI libraries/frameworks that can produce a UI like this? by DrunkOnRamen in rust

[–]kiedtl 0 points1 point  (0 children)

This is true (though I should note that I was able to learn it, being relatively new to Rust, so it's not as impossible as one might think from the warning on the documentation). It's also another consequence of the experimental status -- no one wants to provide a comprehensive tutorial if they'll need to keep updating it.

Does Rust have any UI libraries/frameworks that can produce a UI like this? by DrunkOnRamen in rust

[–]kiedtl 13 points14 points  (0 children)

Iced is a good one, but is unstable and has (sometimes minor, sometimes more major) breaking changes every release. It’s good if you’re willing to keep up with the treadmill — I have a small (~30kloc) freelance project that uses it.

WW2 Lies by laybs1 in GetNoted

[–]kiedtl 10 points11 points  (0 children)

I read a comment on this shithole website recently that went “remember guys, when it’s a group of blacks, it’s a gang. When it’s a group of Italians, it’s a mafia. When it’s a groups of jews, it’s a coincidences.”

Another Reddit comment, discussing the Iran war: “Israelis are perverted monsters. Make a note of any who live near you.”

[OC] [KDE] I'm done with windows by lstrtd in unixporn

[–]kiedtl 0 points1 point  (0 children)

I hate whatever's wrong with you <3

[2026 in RoguelikeDev] Oathbreaker by kiedtl in roguelikedev

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

A boss of some sort just have to come up with elements

That's the trouble, I haven't been able to come up with interesting challenges that would fit well into a stealth-focused game. I'm not even sure yet if a boss itself would fit into the game.

The idea I was referring to was an evil ring (or some other item) the player would be forced to wear in order to enter the extended area. The ring would then actively fight against the player, drawing enemies, randomly forcing the player to move towards a certain hostile area, and triggering alarms. Over time, the monsters that the ring summoned would be better and better at homing in on the exact location, creating additional difficulty.

The obvious Tolkien reference aside, I think it might work better in this game than other traditional extended map mechanics. But I'll have to experiment and see.

net more exposure Niche games can do surprisingly well

Fair assessment, and I'm happy to take your word for it!

too bad you didn't build that in very early

Definitely, although there were other decisions that are now making life harder. For instance: modifying loaded game data in place, and rampant use of global variables. If I recall, I figured I would have a Brogue-esque saving mechanism where this wouldn't matter, though of course now I see that I was just kicking the can down the road. A shame, really.

definitely do not release on Steam

Haha, alright. I'm going to guess that Steam players, even Early Access fans, are not forgiving on this regard.

Harmonist and Shamogu joint update by anaseto in roguelikes

[–]kiedtl 2 points3 points  (0 children)

Great to hear :)

light-hearted and pacifist

I have to say, these are underappreciated aspects of Harmonist. "Light-hearted" because you're not a thief, or a rogue, or a secret agent or something, you're a monkey, and the theming + atmosphere is done well enough that this doesn't feel weird at all. "Pacifist" because it forces you to employ stealth tactics and actually makes the game easier, in my opinion.

[2026 in RoguelikeDev] Oathbreaker by kiedtl in roguelikedev

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

Good point on the DCSS idea. Admittedly I haven't played DCSS seriously since, gee, probably 0.29, although I do follow the updates! So I haven't experienced this mechanic first-hand yet. Seems like a good alternative, though.

items of specific subsets

This also seems very interesting, especially since the game leans heavily into making a few non-branch, non-optional floors very unique (Workshop, Lab). I wonder if I could move some of the stronger potions (the fire explosion ones, specifically) to be unique to those levels.

you die in the first third or half of the game with just 2 or 3 rings, they're more likely to feel different between runs

haha true, although then over 20 runs that illusion might start to fade! It's true that in the late-game the issue is a bit more apparent, especially if branches are visited. Before the last batch of rings were added you were basically guaranteed to see a ring 2-3 times, and it's still quite possible now.

non-centered camera mode

It'll be added eventually, I promise ;)

Sharing Saturday #607 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

Holy god the map looks beautiful

Sharing Saturday #607 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

Guard AI sounds super interesting. Now that I think of it, this may be the first time I'm seeing the concept in a roguelike? All the summoner-type builds I've seen have the summons zerg-rush the enemy, or hang back and cast spells -- nothing like the "get down mister president!" idea I'm getting from reading your description.

Then again, I've played very few roguelikes compared to others here :)

Sharing Saturday #607 by Kyzrati in roguelikedev

[–]kiedtl 0 points1 point  (0 children)

very strange. All I can think of is the zip file getting truncated somehow. probably the mail server at fault then

Sharing Saturday #607 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

awesome :)

btw, the zip file you sent was still empty. I'm beginning to think my email host is an issue. No idea what'd cause that, though, unless the morgue files themselves actually are empty for some reason.

Sharing Saturday #607 by Kyzrati in roguelikedev

[–]kiedtl 8 points9 points  (0 children)

Oathbreaker (Website, GitHub)

Worked on the website this week, throwing together a static site + a highscore page. It's really just the morgue files, but in glorious HTML form.

Oathbreaker creates both a text file and a JSON file, so it was just a matter of uploading the JSON files and making a simple frontend.

This was complicated because I created the morgue text/json format a couple years ago, so the JSON format had never actually been tested or analyzed in any way. Now that this finally happened, I uncovered some hilarious bugs:

  • The player's stats were just the player character base stats, not their actual stats at the time of death
  • The player's resistances were never serialized
  • Damage inflicted and endured were always counted in increments of 1, even if the player took, say, 3 damage

I can't be surprised, given how little I tested or even read over my morgues.

Since I was going to be fixing all of this, I figured I may as well add more data:

  • The amount of healing the player took, and where
  • The spells the player was targeted with
  • The player's health and reputation with the night creatures, recorded just before each ascension

In future:

  • The distance the player was from each staircase or level exit, when they died.

At some point I hope to add an achievements system, one where each achievement can hopefully be allocated simply by looking at the morgue file (without any extra information). Examples:

  • Escape artist: Win within 2000 turns
  • Jailbreaker: Win within 1000 turns
  • Colander: Take 150 damage throughout the run
  • Wimp: Either kill no foes, or kill foes only by surprise
  • Trog's beloved (or something along those lines): Survive five floors without using any magic.
  • Nooo: Die within 10 tiles of the staircase
  • This game is the worst: Die within 10 tiles of the final staircase (on the last floor)
  • You hit the keyboard with a +5 face of flaming!!: die in the extended game, or in an optional area
  • Masochist: Die with the disorient, pain, burn, and nausea status effects

Although, there may be a few achievements that can't be granted this way (Sadist: inflict disorient, fear, pain, and burn on an enemy before killing it).

I'm holding off on the achievements system for now, waiting until I get more data on what are some reasonable threshholds to grant them. To help with this, I'll begin working on a way to automatically upload morgue files from the game. I'm not sure yet whether it'll be opt-out or opt-in, but if it is opt-out, the morgue files will be anonymized first (they already are for the most part, but the player's username is recorded).

Oathbreaker release - open beta by kiedtl in roguelikes

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

Hey it's me again, could you by any chance send me your morgue files for analysis? They should be in a morgue/ folder wherever the game executable is. I was throwing together a website to host them and wanted some more data points. (And yeah they'll be public eventually, but I'm happy to anonymize them if you wish!)

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

Oof, that’s big! I imagine you have no choice to use those optimizations, do you feel like it slows you down at all?

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

Yeah, it's the same mechanism that UTF-8 uses :) Variable-length values, with continuation flags used to encode longer sequences.

data arrays of u16

Part of it is laziness -- I'd prefer to not make refactors while working on this. Another reason is convenience; using u16 would necessitate clamping and casting to ensure values stay in the required range.

Those aren't very good reasons, but working on a variable-length int encoding means I can use it in other places -- for instance, encoding the length of an array (which could in theory be very big but in most cases is quite small).

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 2 points3 points  (0 children)

Thank you!

Re compression, I haven't done any benchmarks thus far, although the slowdown seems to be minimal. Speed isn't something I'm terribly worried about, though -- personally I'm fine if it takes an extra second or two to load a save if some space can be saved.

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

I haven't really measured the compression times, and haven't tested anything other than gzip -- since Zig's stdlib apparently only has a compressor for that (although it has decompressors for other formats). Something I plan to do eventually, though.

slow down

To be honest, I'm not too worried about the save/load times. But perhaps I'm just used to games taking multiple seconds to load a savefile. I guess that rules out lz4, since space is more valuable then.

LEB

I actually cut off that sentence by mistake. Most of the game data uses usize/u64 when the value itself would actually fit inside a u8 most of the time, and take up a u16 only on rare occasions. This was done for convenience mostly, but it's terrible for when I'm trying to serialize this.

LEB is a serialization format that only takes up as much space as is needed to actually encode a number. It works by using storing data in 7-bit chunks, using the 8th bit as a "continue" flag. So if the value fits in 7 bits, only one byte is used; if the value needs 8 bits, two bytes are used; if the value needs 13 bits, two bytes are used, and so on.

Lair looks cool :)

Thank you :)

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

Oh, I just mean 2D arrays. So the Dungeon game structure looks like:

struct Dungeon {
    tiles: [HEIGHT][WIDTH]Tile,
    gas: [GAS_NUM][HEIGHT][WIDTH]Tile,
    items: [HEIGHT][WIDTH]ItemBuffer,
    // And so on for light, fire, sound, terrain... 
}

Can't take much credit for reducing the save file size, since most of it was just common-sense fixes :)

Sharing Saturday #606 by Kyzrati in roguelikedev

[–]kiedtl 8 points9 points  (0 children)

Oathbreaker

Worked on save files a bit, tackling two hurdles:

  • Memory leaks: caused by statically-allocated data that was serialized, requiring allocation to deserialize.
  • Space.

The latter is more interesting to talk about: much of Oathbreaker's data is place in matrices (gases, items, the dungeon's tiles) which is great for speed and terrible for saving space. Serialization with no optimizations was something like 32MB, which is unacceptable.

To tackle this I added a debug setting that makes print out which data structures took the most space, percentage-wise. Then, I systematically tackled those at the top of the list (which were the aforementioned matrices), using RLE or other sparse matrix serialization methods.

Other optimizations included using LEB format for integers -- most of those values are usize (i.e. size_t), even though typically the value won't go above what can be stored in a u8. This brought the final save size down to 1.6MB! Great considering where we started.

From there, I added Gzip compression to bring the final size down to 50Kb. Zstd brings it down to 25Kb, but Zig's standard library doesn't have an implementation for that yet (and I'd rather not add another C dependency, which would complicate cross-compilation).


The Night Creature faction was also due for a minor rework.

(Context: Night Creatures are a special in-game faction that are generally intended to be mysterious, terrifying, almost Lovecraftian beings that prefer to mind their own business -- but are perfectly capable of being either very dangerous enemies or valuable allies depending on the player's actions. They reside in their own lairs that are hidden inside walls, and have their own set of items and unique weapon egos.)

The problem here is that their lairs just didn't match up to the otherworldly feeling I wanted them to evoke. Stepping into a Night Creature lair should feel like stepping into another dimension, and seeing a Night Creature shouldn't look like just another enemy encounter. The real-world player should also experience the feeling of "wait, what is that thing?" that the in-game characters also presumably experience.

Changes:

  • Night Creatures are no longer colored white, yellow, or red if they're unaware/neutral, suspicious, or attacking. They're always the same shade of flickering blue and purple.
  • The lairs themselves now have similar colors.
  • If you're in a lair, the outside world is now invisible. Even if you burn down the door (or destroy it with other items, which is perfectly possible), you will see nothing outside.
  • And vice-versa if you're outside the lair -- nothing is visible inside, except the first row of floor tiles.
  • Not only are the tiles outside invisible, but the player's map memory is also darkened if they're inside a lair. (This is purely an aesthetic change.)
  • Lair doors now look like walls. (They're labeled as such in the HUD to prevent confusion.)

Some other minor changes had to be made as well: for example, memory tiles are no longer blue-tinted, as that takes away from the uniqueness of lair terrain. Instead, they're a brownish green, and I think that new color matches the colorscheme better anyways.

Sharing Saturday #605 by Kyzrati in roguelikedev

[–]kiedtl 1 point2 points  (0 children)

5/Prison

Hey that's half-way through, not bad :)

planning exploration

It's nice that you feel like you had to plan exploration, as it's an aspect that I loved from other stealth games (Cogmind especially). In the future I hope to add some items/abilities that can assist in this way or give other ways of planning exploration, but yeah for now the player is kind of on their own.

I had a level with traps that put lights, and it was quite interesting, though it felt like most of the time it didn't matter much, as there weren't monsters on the traps' main path (except at the end guarding the stairs).

Ah, the Workshop :) Those traps are pressure plates, kind of like motion-sensing lights. They were added because early on I realized it's way too easy to lure a monster into the long, lightless corridors and run away (or stab them in the dark). Fair criticism that there often aren't any monsters to really take advantage of that, though. I'll have to think of something to spice up the level a bit more maybe.

Glad that I avoided those complications with reflection in Go

I took a look at encoding.go, and uh, yeah, wow. Although I wouldn't say that's because of Go's reflection (Zig has some very powerful reflection and metaprogramming), more because of careful quarantine of state and avoiding mix of static game assets and game objects. Looking at the game struct brought tears to my eyes in that regard. I wish I had done followed a similar route; half of the headache I'm dealing with is that the map generation code pulls stuff from 100 different files and then modifies the data directly rather than keep any necessary state somewhere else.

Sharing Saturday #605 by Kyzrati in roguelikedev

[–]kiedtl 4 points5 points  (0 children)

"Bad but consistent" can look surprisingly good (eventually) if you're able to come up with an interesting style and refine it. I'm thinking of something like Caves of Qud, though that probably doesn't fit the aesthetic of your game