The Reimagined Original Roguelike Game

Current Release: 1.0.2 (19th of August, 2023)

Grog is a roguelike game directly inspired by having played the original Rogue on a real PDP-11 during Roguelike Celebration 2018. On one hand I was completely overwhelmed and very surprised about how much joy this rather simple and extremely boiled down game brought to me. On the other hand I started wondering why the original game was called ‘Rogue’ because thieves/rogues rarely seem to play an important role in classical fantasy fiction compared to the archetypical fighter or barbarian. With these thoughts in mind I started working on Grog even while Roguelike Celebration 2018 still was running and I was sitting among the spectators.

Game Design

The core design tenets of Grog are:

  • Copy the raw and pure flavor of PDP-11 Rogue. Technically this implies running in a console in monochrome mode.
  • Imitate the original UI but modernize it for a much smarter and more elegant user experience.
  • Implement a tightly focussed roguelike with the following features:
    • Play hard and fast.
    • A dungeon consisting of 25 screen-sized levels.
    • Four monster types on level 1, with plus two new monster types per level. One of the new monster types always will be more powerful as far as combat goes, the other type will sport some challenging or exotic special power.
    • Special room types start appearing with dungeon level 3.
    • Ghosts (former player characters showing up as monsters) are part of the game.
    • Revenge monsters exist (meaning: monsters that manage to kill a player are baptized, receive special powers or power boosts for consecutive kills and then return in later games to slaughter even more player characters).
    • Inventory size is strongly limited.
    • And item identification game is included but Grog allows for auto-identifying items after some time has passed.
    • Hunger, prayers and tons of highly variable items all are a core part of the game.
    • Grog has an ultra-flexible character generation (e.g. you enter a textual name, gender and type and your attributes will be fixed and predetermined based on your input).
    • Grog allows you to add a personal note about the fate of your character in your highscore entries.
    • Grog has a straight-forward goal: Reach level 25, find the Throne of Immortality and then escape the dungeon.
  • Fun fact: In a certain way Grog is ultra-old-school. Why? Because it becomes harder and harder to win the game the longer it is played because more and more ghosts and revenge monsters will wait for the player, making life more and more miserable. Which is quite a difference to these comfy modern games and meta designs that push the player ever nearer to winning given just enough time. In Grog you really have to earn winning.

Technical Information

  • Grog is available for Windows, Linux and MacOS.
  • Windows: Grog requires .NET Framework 4.8 or later to run. Double-click grog.exe and have fun playing.
  • MacOS/Linux: Grog requires Mono 6.12 or later to run. Open a terminal and type ‘mono grog.exe’ to start the game (requires the terminal to be set to the directory to which you downloaded/copied grog.exe).

Media Samples

Releases

  • Grog 1.0.2 (19th of August, 2023, source code: 199 files of C# code with 18,564 LOC)
  • Grog 1.0.1 (8th of July, 2023, source code: 199 files of C# code with 18,464 LOC)
  • Grog 1.0.0 (24th of May, 2022; source code: 198 files of C# code with 18,509 LOC)

Version History

Grog 1.0.2:

  • ENHANCEMENT: All usable items can now be activated directly from the inventory by pressing <Ctrl> plus the character associated with the item.
  • ENHANCEMENT: Ctrl-r now redraws the screen.
  • ENHANCEMENT: Enlarging the terminal correctly redraws the terminal.
  • ENHANCEMENT: Shrinking the terminal is less crash-prone (but still can crash – just don’t fiddle with terminal sizes after starting the game).
  • ENHANCEMENT: Added some whitespacing to the keybinding section in the help text in order to reduce the chance of missing important commands.
  • ENHANCEMENT: The . command (wait until healed) now falls back to the standard “wait one turn” if the PC is unwounded (instead of printing just a message).
  • ENHANCEMENT: Added a help section explaining the data shown when you call upon the enemy list (with ‘m’).
  • ENHANCEMENT: Show diagnostic information in the console title.
  • ENHANCEMENT: Show more diagnostic information in error messages.
  • ENHANCEMENT: Exchanged ‘=’ water symbol with ‘0’ in order to prevent confusion with rings.
  • ENHANCEMENT: Improved the wording of the introductory page.
  • BUGFIX: Fixed a crash when using scrolls of greater identify.
  • BUGFIX: Pit rooms now are filled to the brink.
  • BUGFIX: Throwing items didn’t use up time.
  • BUGFIX: The ‘item use keys’ usually were not shown in the inventory footer.
  • BUGFIX: Unified meta key text display in the help text.
  • BUGFIX: Removed an excess space in identified weapon descriptions.
  • BUGFIX: Exchanged ‘<Ctrl> + Q’ for ‘<Ctrl> + q’ in the online help (because keys are case sensitive).
  • BUGFIX: Fixed various typos.

Grog 1.0.1:

  • BUGFIX: In rare cases excessively long item names could crash both the inventory display and the game.
  • BUGFIX: Prevent dropping items on positions that already contain the maximum number of items.
  • BUGFIX: In rare cases items were used instead of dropped even if they were not usable.
  • BUGFIX: Fixed typos in the credits.
  • BUGFIX: Multi-page inventories no longer cause an infinite loop on the death inventory screen.
  • BUGFIX: Removed an excessive space character in the name of some identified weapons.
  • BUGFIX: Removed an empty highscore line that was provoked by some highscore entries.
  • BUGFIX: Removed an unnecessary whitespace in the credits.
  • ENHANCEMENT: Show the both release and build number on the title screen in addition to the version.
  • ENHANCEMENT: Removed ugly brackets in the highscore header.

27 replies on “”

Hello, there is a bug that breaks the inventory display when item names are too long.
When trying to open the inventory, I get the error:
The game crashed with an exception. Error message:
Invalid cursor position requested: -2, 18 (permissible: 0, 0 – 80, 26).

Stack trace:
at Grog.Kernel.GCurses.Curses.SetCursorPosition(Int32 x, Int32 y)
at Grog.Dungeons.DungeonLevel.ProcessItemSelectionList(Func`1 getInfos, ItemSelectionList list, Func`3 processKey, Boolean printChoice, Func`1 headline, Boolean highlightEquippedItems)
at Grog.Dungeons.DungeonLevel.ManageInventory()
at Grog.Program.Play()

After decompiling the exe and doing a very dirty fix, I can see that the line it’s trying to display is:
q – adamantium broadsword of fortification +4, +4 [2d4+10 damage] (wielded)

I got this stack trace while playing GOG, trying to read a scroll

The game crashed with an exception. Error message:
An item with the same key has already been added.

Stack trace:
t System.ThrowHelper.ThrowArgumentException(ExceptionResource resource).)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boo

System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
at Grog.Dungeons.DungeonLevel.InitiateComplexInteraction(String text, List`1

at Grog.Dungeons.DungeonLevel.InitiateComplexInteraction(String text, Interac

at Grog.Dressings.Items.Implementations.ScrollImplementations.UseScrollOfGrea
erIdentify(DungeonLevel dungeonLevel, Being applier, Being user, Item scroll)
at Grog.Dungeons.DungeonLevel.ProcessUseKey(ItemSelectionList list, Char c)
at Grog.Dungeons.DungeonLevel.ProcessItemSelectionList(Func`1 getInfos, ItemS
electionList list, Func`3 processKey, Boolean printChoice, Func`1 headline, Bool

Hi, I am writing an article about differences in roguelike UI choices. Would you give me a short rundown on what you did to modernize the UX in Grog? Thx

Actually with regard to Grog I’m only talking about a “modernized UI compared to the original Rogue”. Quite a few things have happened:

  • Basically the inventory screen is a centralized place to manage all items (although there are some additional shortcuts).
  • The stat bar at the bottom also included a health bar (see the inverted characters) which is a great way to see how wounded you actually are.
  • Grog obscures less information (e.g. you can see the remaining number of inventory slots, your remaining prayers, the missing number of XP to advance, etc.
  • Auto-ID for items you carry for prolonged amounts of time is quite useful
  • The keybindings comply with more modern games and you can use cursor keys for movement. There’s even a quick movement option.

I might be forgetting something but this probably summarizes some of the more important optimizations.

Saved the game to the same slot that was loaded. Can’t load now:
*** Internal Error (7/22/2023 9:35:58 AM)! ***

Duplicate being while trying to make copies unique again:
Old: 0 -> Brak (grog)
New: 0 -> Brak (grog)

[Press ‘!’ to continue]

Where is save files located and can i fix this error?

What operating system are you using?

And what happens when you press ‘!’ after the error? Basically the game should be able to continue.

Final question: Did anything happen to your game (e.. a crash) prior to this message? It’s kind of weird.

Hi! The game looks really exciting, but I’m not getting very far before it freezes. It seems to freeze most times it tries to display the ‘more’ option (but not every time, for example, the help menu works). The easiest example is opening the monster list with ‘m’. It makes the terminal completely unresponsive for me. I’m on Linux (Debian) with mono version 6.12.0.200.

I’m also getting repeated freezes on windows when going down stairs. If I quit and reload, Grog will recover an autosave, and going down stairs might work, but I’ve reached a point level 9 or so where it freezes each time and I can’t get past it.

In the version 1.0.2 there is a bug with new dungeon levels. Game hangs sometimes when player goes to a new level. I think because of generating cycle.

Also i think that you need to set dungeonLevel.Grog.LastPrayerTurn only after player selected pray reason. Not when player accidentaly push ‘p’ button .

In GetSplitIndex there is the bug. After sorting list2.Sort(); there must be list2[list2.Count – 1] but not list2[list2.Count – 2]. Because of that “k – warhammer of animal slaying +2, +0 [2d3+4 damage]” brokes inventory menu.

Sorry previous message is wrong. The error in GetSplitLines on line info.LastIndexOf(‘ ‘, splitPoint); There must be info.LastIndexOf(‘ ‘, splitPoint – 1);

There is a bug in TurnMonsterIntoRevengeMonster in ShowSceneText.
Invalid cursor position requested: -7, 20 (permissible: 0, 0 – 90, 24). I was killed by my previous ghost so i suppose that attacker.Name was greater than Curses.Instance.WindowWidth.

Thank you for the great game!

I’ve found a minor issue running 1.0.2 on Debian 12 with Mono: ctrl-H and ctrl-L don’t work from the inventory screen. It just exits the screen.

“f” key to use item still works.

Leave a Reply