(TL;DR: Skip the immediately following paragraph; from there, the more you read, the less important it is.)
Hello, I am playing on underhound.eu. The server hanged up or crashed yesterday during my game, just a few moments after I picked a really good randart Ranged Weapon from a scroll of acquirement, exactly what I needed (I trained Ranged Weapons to almost 14). Now after reloading the game, not only did it roll back to before reading the scroll of acquirement (so no Ranged Weapon), it also replaced the acquirements completely with totally useless shit. I never won this game and this run had potential, I even survived being cast to the Abyss and I beat lots of lethal monsters I never thought I could beat, all thanks to Uskayaw (first time trying Uskayaw). So I ragequit this run because it’s unfairly borked. (Actually I want to add: The “current” damage per time was about 30-something, and the artifact that was unfairly taken away from me was a Ranged Weapon of speed with 50-something damage per time and (as far as I remember) at least the same or better accuracy taking into account the base accuracy and enchantment, but it was also Dex+5 (if I’m not mistaken) so when wielded it increased to 60-something (67?) damage per time, roughly doubling my damage per time. The artifact also had a short, cool name, something like “Zhera” or “Zarya” or “Zoara” or “Rhaza” or something like that. I don’t know why it’s not mentioned in the morgue file, but I also got a manual of Fire Magic from killing that player ghost, which is why I started training Fire Magic in the first place, as I hadn’t intended to be a spellcaster. I want to add: I was forced to make a choice between continuing to play and maybe even winning but having a bitter feeling that control was taken from me unfairly, or abandoning the character and (later) starting anew out of a conscious decision. DCSS feels fair to play because most of my deaths are caused by my own mistakes, oversights, or overconfidence, and when they’re caused because of a bad seed, I just know in advance that bad seeds can happen and I consciously choose to play anyway (same thing goes for Xom (including from a faded altar), if I’ll ever decide to try it); in contrast, here I shouldn’t have lost my acquirement, and I feel like control was taken away from me. This reminds me of The Matrix movies.)
FEATURE REQUEST: Please make the game save its progress and flush its files (e.g. using fsync(2) system call on Unix-like systems) immediately after major events like generating acquirements (maybe also before showing the acquirements to the player, so nobody will ever be disappointed if the game crashes during this and the acquirements would have changed). (Alternatively, make the random generation less sensitive to small details, or make it more deterministic, so such save-and-flush would likely be unnecessary.) Also:
(1) Nonetheless, if the game doesn’t flush its data when the player saves & exits, it would be good to add to the save function a system call to flush.
(2) There could be a screen, similar to the dungeon generation screen that’s especially visible with the ‘pregen_dungeon = full’ configuration option, that shows the duration of the effect(s) (e.g. acquirement generation and/or game saving) and the wait for the operating system to flush afterwards together with one progress bar. This is useful to give an indication to the player of what’s happening instead of the game suddenly freezing for what could be a few long seconds (or minutes in rare cases) and to indicate that the acquirements/loot presented to the player is ready to be seen by the player, and also maybe to increase the tension, kinda like how in reality shows on TV they tense the audience before they announce the winner/loser (although here it wouldn’t be artificial). I imagine there could also be such a screen when the character dies, but only after the player sees the message “You die…” with less than 1 HP in the stats at the side. (It’s impossible to see less than 1 HP at the side before seeing the message, right??)
(3) I imagine this could also be useful when creating, loading, or killing/deleting player ghosts? I have no idea how DCSS handles player ghosts and whether there could be race conditions in their handling.
Thank you in advance. I really gotta stop editing this