💾 Archived View for thrig.me › game › brogue.gmi captured on 2024-03-21 at 15:29:07. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-09-28)

-=-=-=-=-=-=-

Brogue

Brogue is a roguelike, similar to the original rogue in various ways, or not.

https://github.com/tmewett/BrogueCE

rogue.gmi

The game is rather difficult (for me) and does require skill. Someone unskilled can probably play in easy mode and still die, while one with skill will probably find easy mode too easy. Brogue however generally remains quite lethal. There are spoilers below, so just play the game if you don't want to be spoiled. Other people apparently play by asking lots of questions, which probably does avoid a few needless trips back to the title screen while learning the ropes. After learning the ropes, such deaths usually go under the name of Yet Another Stupid Death (YASD) as done by players who really should know better.

The inventory limit is pretty tight, though does force tough choices on what to take or leave behind. Or, it could lead to tedious drag and dump methods for ideal play, but that probably mostly only impacts folks going for lumenstones and not just the MacGuffin.

you-see-a-spider.png

Anyways, having played the game for some number of years now I am more looking in the code. The code lets you answer questions such as "what exactly would empowerment do to a bloat?" or more useful questions such as "how does empowerment change the HP of a monster?" or "what determines the blast radius for an explosion?"

Brogue uses lots of tables for monsters and dungeon features and so forth, though you may still need to look at the code to see how the table values are used. The tables would make it easy to add new creatures with a mix of existing effects.

Quality of Life Patches

More could be made; the game pretty much assumes mouse or 'x' autoexplore motions, so handles runs (shift+motion) poorly--too many interrupts, or too few in some important cases, like running past locked doors, or running into acid mounds so they get a free hit on you. Anyways, the following patch removes the message from a vault room cage closing, when then (one again) interrupts your motion because of the message, forcing an immediate repeat of what ise usually a ">>" command to go down to the next level.

    --- src/brogue/Globals.c
    +++ src/brogue/Globals.c
    @@ -816,7 +816,7 @@ dungeonFeature dungeonFeatureCatalog[NUMBER_DUNGEON_FEATURES] = {
         {DOOR,                      DUNGEON,    0,      0,      0},
         {OPEN_IRON_DOOR_INERT,      DUNGEON,    0,      0,      0,  "", GENERIC_FLASH_LIGHT},
         {ALTAR_CAGE_OPEN,           DUNGEON,    0,      0,      0,  "the cages lift off of the altars as you approach.", GENERIC_FLASH_LIGHT},
    -    {ALTAR_CAGE_CLOSED,         DUNGEON,    0,      0,      (DFF_EVACUATE_CREATURES_FIRST), "the cages lower to cover the altars.", GENERIC_FLASH_LIGHT},
    +    {ALTAR_CAGE_CLOSED,         DUNGEON,    0,      0,      (DFF_EVACUATE_CREATURES_FIRST), "", GENERIC_FLASH_LIGHT},
         {ALTAR_INERT,               DUNGEON,    0,      0,      0},
         {FLOOR_FLOODABLE,           DUNGEON,    0,      0,      0,  "the altar retracts into the ground with a grinding sound.", GENERIC_FLASH_LIGHT},
         {PORTAL_LIGHT,              SURFACE,    0,      0,      (DFF_EVACUATE_CREATURES_FIRST | DFF_ACTIVATE_DORMANT_MONSTER), "the archway flashes, and you catch a glimpse of another world!"},

The mouse may be useful, but too often I've brushed the trackpad by accident and then something stupid happens in the game and then "no, no, no, no, no!" Another option would be to disable the mouse while playing, but that may not hide the cursor.

    --- src/platform/sdl2-platform.c
    +++ src/platform/sdl2-platform.c
    @@ -144,7 +144,8 @@ it returns false and an error event. This function also processes
     platform-specific inputs/behaviours.
     */
     static boolean pollBrogueEvent(rogueEvent *returnEvent, boolean textInput) {
    -    static int mx = 0, my = 0;
    +    // no screen gnat
    +    //static int mx = 0, my = 0;
     
         returnEvent->eventType = EVENT_ERROR;
         returnEvent->shiftKey = _modifierHeld(0);
    @@ -158,6 +159,7 @@ static boolean pollBrogueEvent(rogueEvent *returnEvent, boolean textInput) {
         while (SDL_PollEvent(&event)) {
             if (event.type == SDL_QUIT) {
                 // the player clicked the X button!
    +            // (unlikely, given that no such thing exists on my system)
                 SDL_Quit();
                 quitImmediately();
             } else if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
    @@ -207,7 +209,10 @@ static boolean pollBrogueEvent(rogueEvent *returnEvent, boolean textInput) {
                 returnEvent->param1 = c;
                 // ~ printf("textinput %s\n", event.text.text);
                 return true;
    -        } else if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP) {
    +        }
    +        // ignore screen gnat
    +        /*
    +        else if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP) {
                 if (event.button.button == SDL_BUTTON_LEFT || event.button.button == SDL_BUTTON_RIGHT) {
                     if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
                         returnEvent->eventType = MOUSE_DOWN;
    @@ -236,6 +241,7 @@ static boolean pollBrogueEvent(rogueEvent *returnEvent, boolean textInput) {
                     ret = true;
                 }
             }
    +        */
         }
     
         return ret;
    @@ -266,6 +272,9 @@ static void _gameLoop() {
     
         if (SDL_Init(SDL_INIT_VIDEO) < 0) sdlfatal(__FILE__, __LINE__);
     
    +    // hide the screen gnat
    +    SDL_ShowCursor(0);
    +
         if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) imgfatal(__FILE__, __LINE__);
     
         initTiles();

I do not have bash installed (it's not a very good interactive shell, nor a very good programming language), so I get rid of some needless bashisms. Nor is GNU coreutils installed.

    --- Makefile
    +++ Makefile
    @@ -25,7 +25,7 @@ endif
     ifeq ($(RELEASE),YES)
     extra_version :=
     else
    -extra_version := $(shell bash tools/git-extra-version)
    +extra_version := $(shell sh tools/git-extra-version)
     endif
     cppflags += -DBROGUE_EXTRA_VERSION='"$(extra_version)"'
     
    @@ -80,7 +80,7 @@ vars:
     # Write the value to a temporary file and only overwrite if it's different.
     vars/%: vars FORCE
        @echo '$(call escape,$($*))' > vars/$*.tmp
    -   @if cmp --quiet vars/$*.tmp vars/$*; then :; else cp vars/$*.tmp vars/$*; fi
    +   @if cmp -s vars/$*.tmp vars/$*; then :; else cp vars/$*.tmp vars/$*; fi
     
     
    --- brogue
    +++ brogue
    @@ -1,4 +1,4 @@
    -#!/usr/bin/env bash
    +#!/bin/sh
     cd `dirname $0`/bin
     
     ./brogue $*
    
    
    --- tools/git-extra-version
    +++ tools/git-extra-version
    @@ -1,26 +1,8 @@
    -#!/bin/bash
    -set -euo pipefail
    +#!/bin/sh
     
     # Emit extra version string (if any) to append to BROGUE_VERSION_STRING
     
    -# Release builds should write nothing to stdout.  Development builds
    -# (everything else) should write something, but what depends on the information
    -# available.
    -
    -# If we're in CI and the ref is the gha-build branch, assume we are a release
    -if [[ ${GITHUB_ACTIONS:-false} == true ]] && [[ $GITHUB_REF =~ ^refs/heads/gha-build ]]
    -then
    -    exit 0
    -fi
    -
    -# Otherwise we must be a development build
    -
    -if [[ ${GITHUB_ACTIONS:-false} == true ]]
    -then
    -    # If we're in CI, use what they hand us
    -    # If it's a branch, strip refs/heads.  Highlight tags by keeping the prefix
    -    EXTRA_VERSION="-dev.${GITHUB_SHA:0:7}.${GITHUB_REF##refs/heads/}"
    -elif { which git && git rev-parse --show-toplevel; } >/dev/null 2>&1
    +if { which git && git rev-parse --show-toplevel; } >/dev/null 2>&1
     then
         # Otherwise inspect git if it and a repo are available
         EXTRA_VERSION="-dev.$(git log -1 --format='%h').$(git rev-parse --abbrev-ref HEAD)"
    @@ -30,4 +12,4 @@ else
     fi
     
     # No matter what, limit the extra version to 64 characters
    -echo "${EXTRA_VERSION:0:64}"
    +printf "%.64s" "$EXTRA_VERSION"

Spoilers

    <@r800> Me: Has ogre-slaying axe.  Ogre: Has club, and knocks me
            into lava.  Ogre wins.

So brogue has lots of ways to kill you, and many of those bypass armor. The game is plenty lethal, though is perhaps better balanced than other roguelikes. POWDER comes to mind on the maybe not so balanced front. Positioning and use of resources is important. There are good seeds and bad seeds; the game only "rubber bands" the odds for food, so the RNG could give you not very many enchant scrolls or good items in some run, while another might have too many. Detect magic potions might only show up late or too late or never. So the RNG goes.

There is a lottery system for placing "vorpal" creatures; these are called "out of depth" monsters in other roguelikes, like when a Troll or something shows up a lot earlier than usual. POWDER by contrast might put a lich vault on D1 and put an item on the vault door, allowing the player-killer zombies free to roam about. So Brogue isn't as bad as other roguelikes here, though can put a problematic creature in your path much earlier than you might expect or want.

tags #roguelike