The Reimagined Original Roguelike Game

Current Release: 1.0.0 (24th of May, 2022)

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 by surprise noticing how much joy this rather simple and extremely boiled down game brought me. On the other hand I started wondering why the game was called ‘Rogue’ in the beginning becauses thieves/rogues rather rarely seem to play in important role in classical fiction compared to the archetypical fighter. With these thoughts in mind I started working on Grog while RC 2018 was still running.

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 monsters always will be more powerful as far as combat goes, the other type will sport some challenging special power.
    • Special room types starting at dungeon level 3.
    • Ghosts (former player characters showing up as monsters).
    • Revenge monsters (monsters that managed to kill a player receive a name, special powers or power boosts for consecutive kills and return in later games).
    • Inventory size is strongly limited.
    • Include an item ID game but allow for auto-ID after some time passes.
    • Hunger, prayers, tons of highly variable items.
    • Ultra-flexible character generation (e.g. you enter a textual name, gender and type and your attributes will be fixed depending on these choices).
    • Add a personal note about the fate of your character to your highscore entries.
    • A straight-forward goal: Reach level 25, find the Throne of Immortality and escape the dungeon.
  • Fun fact: In a certain way Grog is ultra-old-school. Why? Because it becomes harder and harder to defeat and thus win the longer you play because more and more ghosts and revenge monsters will wait for the player, making life more and more miserable. Quite a difference to these comfy modern games and meta designs that push the player ever nearer to 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).

Releases

  • Grog 1.0.0 (24th of May, 2022; source code: 198 files of C# code with 18,509 LOC)

2 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

Leave a Reply