Friday 31 July 2009

Preview: Multiple Items on the same tile!


I'm in the middle of implementing multiple items to share the same time, via the wonders of the linked list technology*. This is one of the items that was originally scheduled for v0.03a, but will obviously make it in the next released version. From now on, I want to adhere strictly to the roadmap, as there are several features that I've been delaying the implementation of for too long.

* Its not quite a full implementation, as the Get command currently picks up the top item from the stack of items currently on the tile. To get multiple items, you have to 'get' multiple times.

Critical Hits

Currently, players and monsters can both score critical hits (1 in 20 chance in fact).

The base damage from a normal melee or ranged hit is:

DamageInflicted := Random(LocalMonster.AttackDamage) + LocalMonster.AttackDamageBonus + LocalMonster.GetBonusDamage(LocalPlayer.SubRace) + 1;

This is then subsequently modified by armour:

Absorption := (LocalPlayer.AC / (ARMOURCAPACITYCAP * 8));
DamageInflicted := DamageInflicted * (1 - Absorption);
Result := Trunc(DamageInflicted);

The constant ARMOURCAPACITYCAP is currently set to 25, hence an AC of 200 (not currently achievable) could potentially block all incoming physical damage (AC is currently linear, unlike EV, which is non-linear).

However, the damage from a critical hit can potentially one-shot a player at lower levels. For a critical melee or ranged hit, the damage is:


DamageInflicted := LocalMonster.AttackDamage + LocalMonster.AttackDamageBonus + LocalMonster.GetBonusDamage(LocalPlayer.SubRace) + 1;

For example, a non-weapon wielding Greedy Adventurer has a base AttackDamage of 8 and an AttackDamageBonus of 1, thus on a crit, it could do 8+1+1=10 points of damage, before absorption by armour. The usual starting AC is 20, which means 1 point of damage is absorbed, leaving 9 to get through.

The only classes that are normally capable of withstanding this at level 1 are Warriors and Knights. If the monster is carrying a magical weapon, then it will do more damage and thus potentially one-shot any character.

I don't like one-shots.

So the question is: should monsters be able to critically hit? And even if not, should their damage always be limited to, at maximum, the player's maximum health - 1? Or some other fraction of the players' health?

Wednesday 29 July 2009

Kharne 0.03b available

v0.03b is now available. This is another mainly bugfix version (a bugfix of a bugfix?), to fix many of the bugs that have been reported in 0.03a. Thanks to Tekela Fisher, 'pol' and Mario Donick for all their bug reports. This version also includes more monster speech and actions.

Changes in this version are:
  • Ranged Combat now works again.
  • More monsters now have actions and speech.
  • Using stairs now requires <> instead of , and ;
  • The particular set of stairs taken to go down and up levels in the dungeon are now remembered.
  • The standard 0 and 5 keys now allow resting as well.
  • Keyboard commands that previously were only responsive to capital letters (e.g. 'S') now work with lower-case letters as well (e.g. 's').
  • Font size and typeface have been made consistent across all the main window interfaces.
  • The Status Bar has been redesigned.
  • Attributes are no longer displayed on the Status Bar.
  • There is now a short pause after death and before the Character Summary is displayed.
  • Skills that are 100% progressed to the next skill level no longer have their progress indicators clipped.
  • Artifact Names are now prefixed correctly whilst unidentified.

Monday 27 July 2009

Kharne 0.03a available.

Kharne 0.03a is now available. As mentioned previously, it should fix many of the errors and bugs that have been reported in 0.03. Download it here or use the link on the right-hand side.

Changes in this version are:
  • Fixed the crash that occurs sometimes in character creation (hopefully!).
  • The Main Window no longer accepts keyboard input when it is not active (for example, if the character creation window is active).
  • The cursor is now positioned correctly when the main window is maximised.
  • Non-magical items no longer have extraneous item descriptions (e.g. bloodstained, gashed, rusted or corroded).
  • Monster speech is now coloured white in the Message Log.
  • The Quit (Suicide) menu option now works.
  • It is no longer possible to cause an error by pressing random keys whilst in the Hi Scores screen.
  • Fixed an error that could occur when entering a level where no unique is present. As a result the "You feel a brooding presence..." message that displays whenever a unique is present on the level is no longer displayed.
  • Starting a new game after finishing an old one will now clear the Message Log properly.
  • A Welcome Message is displayed in the Message Log when you start or continue a game.
  • The Player score calculated on the Farewell screen and the Player Score recorded in the hi-score table are now the same.
  • Monsters listed as cause of death in the hiscore table are now prefixed properly.
  • Removed the Show Inventory option on the Death Hiscore screen (Inventory Details can be viewed via the character dump opption instead).

Goodbye Rusted Silk Pantaloons

One of the changes I've made for the bugfix release, following the suggestion made here, is to remove the random adjective for unidentified non-magical items. For example, "Rusted Silk Pantaloons" will now be merely "Silk Pantaloons". The side-effect of this change is that an unidentified item will now be readily categorised as magical due to the presence of the adjective (e.g. shiny, glowing, runed, ancient etc).

Sunday 26 July 2009

Character Creation Changes

This error report is worrying. I had intended to replace the character creation DLL completely in time and integrate it into the main window, but as I cannot duplicate any of the crashes at all (it works flawlessly for me always), I think for the time being, I'll duplicate the Quick and Random Character Creation methods in the Main Window, remove the external DLL, and leave the implementation of the Full Character Creation for a later version.

Saturday 25 July 2009

Bugfix soon

Following errors reported here, here and here, the next version released (0.03a) will be a version (hopefully) fixing these bugs and adding logging and more monster speech and actions. I hope to release it by the end of next weekend.

Friday 24 July 2009

First Bug in 0.03

When you maximise the screen, the cursor thinks its one square south of where it actually is. It doesn't happen when you only resize the main window horizontally only.

Thursday 23 July 2009

Kharne 0.03 available

Even though a few small features haven't made it into 0.03, I've decided to release anyway. So, get v0.03 here or use the link on the right-hand side.

The changes in this version are:
  • The main window has been consolidated into the game window.
  • Added Uniques to the Dungeons.
  • Some monsters are no longer silent, and can shout and make other noises (this is a work in progress).
  • Reduced the amount of items that are generated on a level, apart from food, which has been increased.
  • Monsters can now occasionally wield and wear armour and items.
  • Social Monsters can now be found throughout the Dungeons in greater numbers.
  • High Scores have been implemented.
  • Fixed a bug where deaths could be logged multiple times.
  • Added a cursor to the main display window.
  • The effect of AC, Speed, Blocking and Deflection have been reduced.
  • Monster Hit Points have been recalculated and increased.
  • Shops are now restocked with new level-appropriate items every time you re-enter the Town Level.
  • Player Resolve is now affected properly by items with the Steadfastness Enchantment.
  • Artifacts-quality items have now the "Ancient" prefix when unidentified.
  • Items that bestow health are now properly factored into calculations for Hit Point Display and Damage Taken.
  • The amount of damage inflicted and recieved is no longer displayed in the combat log.
  • All rings and amulets generated are now of superb quality at least.
  • Added warning text to alert the player if a dungeon is too difficult for the character level.
  • Wearing and Removing Items now have more descriptive messages.
  • Items that are carried but not worn contribute only 20% as much to overall game score.
  • Monster awakening messages are now more atmospheric.
  • Eating items now displays gramatically more correct messages in the message log.
  • Added a warning whenever a single attack takes off more than 50% of the Player's Health Pool.
  • Monster health is now displayed as health bars beneath the glyphs, and is displayed in the message log at regular intervals.
  • Skill Gains have changed so that specialist skills (e.g. Melee or Heavy Armour) increase faster than the general skills (e.g. Fighting or Defense).
  • The Wizard Console has been extended with more information and more options.
  • Gifting an item on the Wizard Console no longer causes an occasional error.
  • Items gifted using the wizard Console are now automatically identified.
  • The Town Level Name is now displayed correctly on the Window Title.
  • Opening/Closing Doors no longer displays a message on the message log.
  • Intrusion Zones are now generated again occasionally.
  • Intrusion Zone Monsters e.g. Vanguards or Intruders, are now scaled appropriately to the level in which they appear.
  • Digging now stops if any monsters are in sight.
  • Duplicate messages that occur when the character drinks from a fountain have been removed.
  • Item/Monster tooltips have been changed slightly to display information better.
The other changes mentioned previously will roll forward into 0.03a (yes, I said "sod it" after all).

Roadmap and the way forward...

Looking back on some previous posts, its quite clear that my release schedule was incredibly optimistic. The game was meant to be done by now!

So its time for a revised roadmap. I've already touched upon the contents of the next release, 0.03.

Beyond that, I intend there to be a follow-up release (we'll call it 0.03a and will probably come out late August) which will consist of:

  • Character Milestones - I want these to be accessable from within the game in some form or other, much like WoW's achievement system.
  • Potions/Scrolls - finally!
  • Multiple Items on a Title - as it says, I want to allow multiple items to exist on the same tile.
  • Timer Handling - to allow transient and temporary conditions such as poisoning, beserk and so on.
  • Corpses - monsters leave behind corpses. Not just for food, mind you.

Behind the scenes, I intend to concurrently work on a massive code refactoring exercise to get the code to a state where it is suitable for release under the MPL. The reason it hasn't been open-sourced before now is mainly programmer vanity.

0.04 will be the next version after that. This will probably not be released until after my next batch of exams in early October. Currently, I have planned the following for this release:

  • Saving/Loading - unlike the old Kharne, I intend to compress the save files. So no more 15 Mb Save Games. Additionally, when I talk about Loading, since Kharne adheres to the permadeath paradigm, 'Loading' means 'continuing a previous session'.
  • Ranged Combat - see here for the model I intend to implement.
  • Damage Brands - chopping, flaming, freezing, slaying etc etc etc.
  • Interface/Control Upgrade - to allow the use of keys to control actions such as eating, quaffing and so on. I don't think the drag-and-drop model should be the only way of manipulating objects where possible.
And then, 0.05, the Magic Version.
  • Magic - does that it says on the tin.
  • Mutations & Corruption - I like the Crawl model of mutations, but I don't think it goes far enough. I'd like more environmental corruption, and more mutations under the control of the player.
  • Town NPCs - no scruffy old dogs or harmless drunks though.
  • Victory Conditions - instead of the oft-used "you need to retrieve the Amulet/Rune/Orb of Qwertyuiop", I intending to have a completely different goal for the player in Kharne. You'll have to wait to find out though.
  • Traps - all the better to kill you with (I'm feeling a bit touchy about this as I just lost the promising Crawl character I mentioned previously to a blade trap whilst coming back out of the Swamp)
And at this point, Kharne will be basically a complete (well, -ish) and playable game, and will be MPLed. As the advert goes, simple!

Beyond that I have ideas for:
  • Crafting
  • Many more dungeon branches
  • Reputation System
  • Optional Tile Graphics
  • Multiplayer Modes
Deities, I think I'll leave alone, since, let's be honest here, Crawl has the Deity system in Roguelikes sewn up completely and there is no way anyone could ever compete with it or produce anything even half as good.

Wednesday 22 July 2009

Crawl!

I'm really enjoying DCSS 0.5. For melee characters, it seems a lot less...fickle than previous versions. Bob III the MdFi (Yes, I know) has just picked up his second rune at the bottom of the Swamp (which equals my best from previous versions):


Having said that, there's been quite a few close shaves, especially in the bottom of the Snake Pit (greater naga's are an utter pain - its been a Trog's Hand/Beserk combo for every single blasted one of them):

21694 | Snake:5 | HP: 10/256 [naga warrior/uncursed club (6)]
21698 | Snake:5 | HP: 4/128 [poison]
22626 | Snake:4 | HP: 6/128 [poison]
22631 | Snake:4 | HP: 4/128 [poison]
22636 | Snake:4 | HP: 5/128 [poison]
24007 | Snake:5 | Got a serpentine rune of Zot

But thanks to a steady diet of extremely nutricious Naga Flesh, and a little help from dear old Trog (such a lovely chap), Bob III has been triumphant so far through the application of superior brute force.

Tuesday 21 July 2009

0.03 Coming Soon

I think I will release the next version of Kharne this week, probably by the end of the week. It doesn't have many of the features that I wanted it to have, but there's enough to warrant a release.

The only tasks I have not yet done which I had originally planned to do for this release are:
  • Finish inputting speech and actions for any remaining monsters.
  • Implement a door-stripping check to remove isolated and annoying doors in the dungeon.
  • Overhaul the adjectives (i.e. simplify the adjective lists) used to describe items.
  • Reduce the number of items available in the dungeon.
  • Refresh the contents of the shops in the Town Level every time you re-enter said level.
  • Add milestone handling to the character log files.
I may just say "sod it" and shift these back to 0.03a though.

Beyond that, I really need to start work on implementing ranged combat, and potions/scrolls, along with finishing the refactoring needed to allow saving/loading.

Monday 20 July 2009

The Xvart who wore Woolen Mittens...

Sometimes this game is unintentionally amusing:

A Xvart comes into view! It is wearing some Polished Woolen Mittens
A Greedy Adventurer comes into view!
A Xvart comes into view!
The Greedy Adventurer attacks but misses you
You hit the Greedy Adventurer
You have killed the Greedy Adventurer!
The Xvart glares evilly at you!
The Xvart attacks but misses you
The Xvart attacks but misses you
You hit the Xvart
You have killed the Xvart!
The Xvart hits you but your armour absorbs the blow
The Xvart attacks but misses you
You hit the Xvart
You have killed the Xvart!
You see some Polished Woolen Mittens here
You pick up some Polished Woolen Mittens
You now have some Polished Woolen Mittens
You put on some Polished Woolen Mittens
They are some Woolen Mittens [1, 0]!

It sounds like some mad Dr Seuss story, possibly writen under the heavy influence of drugs: "The Xvart who wore Woolen Mittens".

Sunday 19 July 2009

Early Vaults

Although unlikely, it is possible for large vaults like this to be generated as early as level 2 of the entry dungeons. They are, however, barricaded by closed doors (and monsters cannot yet open doors). Like vaults in Angband, discretion is strongly advised. I do not intend for a level 2 character to be able to clear one of these out (without expending all their resources at least) - hounds, wargs, large snakes for example, are all OOD monsters. However, the rewards are great. This particular vault, when cleared out with the aid of wizard mode (though the character still would have died four times) contained 6 magical items.



(Incidentally, the white box is actually the new cursor which will be used in the new ranged combat interface if and when I ever get that written)

Saturday 18 July 2009

0.03 Preview #5 - Wizard Mode

The new Wizard Console in 0.03, currently toggleable by pressing 'W'

0.03 Preview #4 - Monster Health Bars

Friday 17 July 2009

0.03 Preview #3 - Uniques

Following this post in r.g.r.d, I've implemented randomised Uniques. If there is a Unique on the level (25% chance), creatures who can speak will occasionally say things about it:


Here is the Unique in question (the name and suffix are randomly generated). They have better stats and are better at fighting than normal creatures of their type:


When you kill an Unique, the other creatures on the level won't forget it:


I don't think I will make hard-coded Uniques (like Sigmund). Eventually, Uniques will have a chance of carrying magical items, and will affect Monster AI for those creatures in LOS to them. Perhaps they might even drop unique items (for example, "Preald's Goblin Totem"?).


0.03 Preview #2 - Atmosphere in the Dungeon

One of the features I'm currently coding for inclusion in 0.03 is customising the message to give more atmosphere in the dungeon. Monsters will speak, and do things, and the combat messages will be much more flavoursome. Here is an except from the message log with highlighted flavour text for Kobolds:

There is a portal leading to the Fortress of Ablach here
You have travelled through the portal to The Fortress of Ablach
You open the door
You open the door
You open the door
The Xvart sees you!
The Xvart critically hits you inflicting 5 points of damage
You hit the Xvart inflicting 5 points of damage
You have killed the Xvart!
You open the door
You open the door
Something close by is alerted to your presence!
The Kobold attacks but misses you
Something close by is alerted to your presence!
The Kobold glares at you with hatred!
The Kobold attacks but misses you
The Kobold hits you but you deflect
The Kobold attacks but misses you badly
The Xvart attacks but misses you
The Xvart attacks but misses you
You critically hit the Xvart inflicting 12 points of damage
You have killed the Xvart!
The Kobold barks loudly!
The Kobold hits you but your armour absorbs the blow
The Kobold hits you but you block
There is a fountain here...
You take a draft from the fountain
You feel something in the fountain!
You drink from the fountain. The water refreshes you
The Kobold attacks but misses you badly
There is a dried-up fountain here...
You see an Elaborate Iron Kite Shield here
You pick up an Elaborate Iron Kite Shield
You have an Elaborate Iron Kite Shield
The Kobold hits you but you deflect
The Kobold glares at you with hatred!
The Kobold says "I'll have your guts for garters"!
The Kobold attacks but misses you
The Kobold says "I'll stick you full of arrows like a porcupine"!
You hit the Kobold inflicting 3 points of damage
You have killed the Kobold!
You see a Opaque Green Potion here
You unwield a Bronze Kite Shield [4, 0]
You wield an Elaborate Iron Kite Shield
It is an Iron Kite Shield [4, +1]!

Eventually, I'd like to have flavour text for the character's own combat as well, for example, warhammers would "smash" and "thump", whereas daggers would "stab" and "slice", and so on.

Thursday 16 July 2009

Monster Descriptions

As far as it goes, "The Vampire hits you inflicting 6 points of damage" isn't particularily atmosphere. One of the larger tasks coming up, as soon as I have defined the behaviour of each of them, is to give more flavour to each monster.

Wednesday 15 July 2009

Artifacts

Artifacts are the most powerful (yet rarest) items in the game. The one above is an example of a lvl 6 artifact. Artifacts have multiple effects, and the effects can stack. They are designed to affect the balance of the gameplay quite considerably.

But there is always the possibility of a cursed artifact! The question is, how do we handle cursed artifacts? Do we allow a means of uncursing them?

Tuesday 14 July 2009

Potions and Scrolls

I've just started implementing the use of potions and scrolls. They will follow the usual roguelike convention, i.e. they start off scrambled and can have a "{tried}" status if they produce no obvious effects. The list of potions and scrolls I intend to implement at first is given here.

One additional piece of functionality which I'd like to implement but will probably not for the time being is adding the standard roguelike shortcut of (q)uaffing an item by assigning keyboard shortcuts on the inventory (as opposed to the current method of dragging the item onto the small icon (shown above)). This will require some refactoring.

Monday 13 July 2009

SQLLite and the further revenge of C

As a followup to this and this, this is the sort of thing I miss about C.

In other news, this (reasonable to me) suggestion to use SQLLite for Angband data didn't go down too well on the forums. I'm not sure why - even DCSS has used SQLLite for a long time now. Some of the objections that are raised remind me of late '99, when I was developing applications in the Telecomms Industry using C++ on Solaris boxes, and several teams in the department I was in refused to use C++ because "its too slow".

Inertia is a powerful force, it seems.

Sunday 12 July 2009

High Score Preview


The new High Score screen in Alpha 0.03.

Saturday 11 July 2009

0.03 Preview #1


Here is another preview of Alpha 0.0.3. A rather tricky situation, n'est pas?

I've been working today on the hi-score functionality. It is my intention not to display the entire character dump on death, but instead go to the hi-score screen and then give the option to save the character dump to a file or to view it in an external program such as Notepad.

Eventually, its my intention also to make the HITPOINT WARNING messages configurable as well.

Friday 10 July 2009

Towards a Unified UI in 0.03

Here is a glimpse of the new frontscreen of Alpha 0.03. It will do away with extraneous forms and be a single window application (effectively a good approximation of a DOS/Console App). The refactoring out of the character creation and such like is proving to be a bit of a pain, as it was written originally in a seperate DLL. A different type of DLL Hell, indeed.

Thursday 9 July 2009

Mental Note to Self

Mental Note to Self: for the next release, take the time and effort to fix the speedbuttons and menus along the top edge of the screen so that they actually work (and are also context sensitive).

Sudden Random Brain Impulse: do I actually need them anyway? If they disappeared, would anyone care? Here's a mock-up of what the game would look like without them (maximum retro-console goodness, surely):


The Revenge of C.

With all this talk on r.g.r.d. of picking up abandoned projects written in C or C++, I have an increasing urge to write a small Roguelike in said languages. Realistically though, with Kharne and with Prelude, I have enough on my plate for the time being and my copy of K & R can wait*.

I've had lots of experience with C or C++, in fact around the turn of the millenium I spent four years after graduating using both languages to a reasonably high degree of competence and complexity in a commercial environment (the company I worked for, a major international telecomms company is now bankrupt, which is not surprising given that for most of its existance, it was utter and complete cluelessness made flesh). One thing I do regret from my time there is that I never really learned to use the STL, instead we were locked into using the Roguewave libraries). I also spent a lot of time with Informix, for my sins.

However, if I do decide to get in some C or C++ coding I think I may focus my efforts away from roguelikes and do something completely different.

(* Incidentally, I dislike K & R style indenting. The Kharne source code is written using Allman indenting, which is the defacto standard in the Pascal world)

Wednesday 8 July 2009

Kharne v0.02c available

Get it here or via the link at the side of the page. Changelog is here.

Refactoring for Persistance

Saving and Loading Games would be nice, but before I even attempt to implement that, I need to do a codebase-wide refactor. Currently I have numerous global variables that I have used to store various state data, e.g. the number of turns that have passed, the current level depth, and so on. I really need to store all these in a "game-state" object that is instantiated on starting a game (and this is one of the nice things about C# - that everthing is an object). If I do this, it will make saving and loading a heck of a lot easier to implement. In fact, it would make it decidedly trivial.

Additionally, this gets rid of all those nasty global variables that currently litter my code, and in itself this is a good thing, as they are (and I agree with this) "considered harmful".

(N.B. when I talk about saving and loading, I don't mean in the style of the old Kharne, where you could freely reload saved games, but rather in the traditional roguelike sense of "saving a game and then restarting it within the framework of permadeath")

Tuesday 7 July 2009

Release Early, Release Often...but where?

Following the Powder maxim of releasing early, releasing often, I'll release 0.02c in the next couple of days (mainly to get something out the door). Baring any last minute changes, the changelog will consist of:
  • Gold is now automatically picked up.
  • Varying Radius FoV has been implemented - randarts with the 'alertness' property can increase and decrease (if cursed) the radius of the FoV.
  • Moving the mouse over a creature or item in the dungeon now displays pertinent information on the main screen.
  • Food found in the dungeon is no longer flagged as unidentified.
  • Fountains that have been drunk from cannot be drunk from again.
  • The player avatar ('@') is now transparent.
  • The main menu has been given a graphical overhaul.
Yeah, I know: no ranged combat, no scrolls, no potions, etc etc. They're coming up, honestly.

The only current snag is that I've forgotten all my login details for rapidshare. I'm getting somewhat tired of that anyway as a filehosting platform, so are there any easily available alternatives where I can store the Kharne releases?

Monday 6 July 2009

Screenshot of the Day

The first level of one of the entry dungeons, the Wilderlands. I was lucky and came across a mini-vault without any monsters inside and two items lying waiting for me to pick them up and use them (one of them a randart): A Tower Shield [5, +2] of Outsider Slaying and a Breastplate [8, +1]. The Outsider Slaying brand does exactly what it says on the tin, to quote the famous advert, it adds +3 to your damage against Outsider-type creatures (e.g. Efreets).

Anyway, after a gap of a few weeks in which I did very little coding on Kharne, and ironically enough inspired by my playing of a new roguelike, I've recommenced coding of 0.02c. It would be nice to get potions and scrolls working, or at least a subset of those items in this version as well as the previously-announced features.

A quick crawl through the database that holds the item definitions reveals placeholders (that I had entered last year) for the following scrolls and potions:
  • Scroll of Enchant Armour
  • Scroll of Enchant Weapon
  • Scroll of Remove Curse
  • Scroll of Teleportation
  • Scroll of Identify
  • Scroll of Magic Mapping
  • Scroll of Blink
  • Scroll of Sanctuary
  • Scroll of Blessing
  • Potion of Healing
  • Potion of Speed
  • Potion of Restore Abilities
  • Potion of Confusion
  • Potion of Blindness
  • Potion of See Invisible
  • Potion of Extra Healing
  • Potion of Paralysis
  • Potion of Free Action
  • Potion of Combat Mastery
  • Potion of Reflexes
  • Potion of Might
I have ideas for a few others that would be easy to code, such as Potions of Indigestion (that make you burp and hence ruin your stealth) and Scrolls of Acquirement (which do the same as in Crawl).

Sunday 5 July 2009

Roguelike Developer Public Relations 101

Top tip: when you release a roguelike, do not go on a hissy fit invoking the-one-true-style-of-programming when someone points out that the code as distributed does not compile and suggests a possible fix. It's a dereliction of your duty as a developer to get your product out and working to your audience. And additionally, the problem with high horses is that they tend to hurt when you fall off them.

That unpleasantness aside, Martin's Dungeon Bash is actually a pleasant enough roguelike, fun to play, and I will be posting a fuller review of it shortly.