Skip to content

thejoshwolfe/nethack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nethack

A fork of nethack 3.4.3.

Status

Abandoned.

I lost my enthusiasm when I saw that Nethack 4 did most of refactoring I was trying to do, such as a client/server architecture with a protocol that properly exposes and hides information. Furthermore, I became disillusioned with nethack's design decisions when I found out that polymorphing and other game mechanics were not fair and abstract as I had once hoped, but were actually programmed separately for each special case. (For example, the fact that mind flayers turn to stone when attacking a cockatrice is programmed in uhitm.c, mhitu.c, and mhitm.c).

Nethack has numerous game design flaws that are unresolvable without changing the game significantly. Gehenom is tedious, the Plane of Water makes no sense, Sokoban doesn't belong in a dungeon crawler, etc.

All things considered, I've decided to start my own game from scratch.

How do I shot game?

Dependencies (Ubuntu)

sudo apt-get install bison flex clang

And install node.js.

Build

make
(cd server && npm run build)

Run

(cd server && node lib/server.js)

Then open the printed link in a web browser.

Why are you doing this?

Why make another fork of nethack? Playing nethack can be a lot of fun once you know what you're doing. But nethack is one of the most frustrating games to try to learn.

The goal of this fork is to make the game more approachable for new players.

  • Browser-based graphical interface.
    • Server-side game logic to allow spectating and prevent cheating.
    • Have keyboard shortcuts for everything, preferably preserving the commands from the original game.
    • (I am aware of the tile-based interface built into the standard game. It sucks.)
  • You shouldn't need the wiki. The game should feature an in-game encyclopedia that's unlocked as you play, and it should persist across games. For instance, once your brain is sucked by a master mindflayer, that ability will appear in the master mindflayer article in the encyclopedia. Right-clicking on a master mindflayer in-game should provide a link to the article, etc.
  • Don't touch the balance too much. This project is not to create a game, but to improve the user experience for an existing game.
    • Keep all the same items, monsters, roles, etc.
    • Preserve many of the idiosyncrasies in the game engine, like the dual slow-digestion exploit.
    • Fix crashes, such as when you apply a wielded cream pie.
    • Fix quirks that don't make sense, such as C343-10: If there is a corpse in a pit, you have to enter the pit to pick it up but not to eat it.
    • Real-world time shouldn't affect the game. Move the all the nighttime/moon-phase mechanics to correspond to in-game time. In-game time should be randomly initialized for new games, and flow with the turn counter.
      • You can ask the Oracle for the in-game time for free, and then you know it forever afterward (intrinsic chronoscience).
    • Blacklist all special names. This includes the names of unique monsters, artifact names, and anything containing "elbereth" (ignoring case). These names would be forbidden for usernames, pet names, custom fruits, and the Call command.
      • Fixes the artifact naming exploit.
      • Claiming that you're Creosus is more fair to users on a server.
      • No need for special logic for Elbereth on tombstones.
    • See the wiki page which covers all the balance changes.
  • Improve the information conveyance.
    • Uncursed fortune cookies should unlock a random tidbit from the encyclopedia. Blessed fortune cookies should do the same, but select from a set of relevant tidbits, such as a possible use for a stethoscope if you're carrying a stethoscope. Cursed fortune cookies should just be vague and unhelpful instead of outright lies.
      • Monks should start with only cursed fortune cookies, because repeatedly starting a Monk character to slowly unlock the encyclopedia would be dumb. (The BUC status of fortune cookies only matters for the message, not the nutrition.) You should have to work a little to uncurse or bless the fortune cookies if you want good messages.
    • If you are carrying a stethoscope that you can use, display the information for using it on yourself in the status bar at all times. This eliminates the tedium of having to apply it to yourself for free at every step.
      • Blessed stethoscopes should provide more information, including exercise scores. While carrying a blessed stethoscope, you will learn the actions that exercise and abuse attributes and add that information to the encyclopedia as you go.
    • Priest donations should persist and indicate progress toward the next divine protection.
    • The Oracle should be more helpful.
      • At all times, the oracle should direct you toward your next goal for free, such as telling you that you should do the quest next.
      • The Major Consultations should tell you something important and relevant, such as the weaknesses of your quest nemesis. Major Consultations should be added to your encyclopedia, and should never repeat.
    • Once you identify a unique-appearance item, such as an apron always being an alchemy smock, add that to the encyclopedia, and have that translation resolved for all future games.
    • After getting a "You hear" or "You feel" message and experiencing the consequences, asscociate the two in the encyclopedia, and add an explanation when future games get that message. For example:
      • "You hear the chime of a cash register", then "You hear someone counting money", then you find a shop. You learn that the former message meant there was a store, and the latter message is still a mystery.
      • "You feel full of hot air", then you resist a cold attack; you learn that the message means you got cold resistance. Display the fact that you have cold resistance at all times; if you lose cold resistance for any reason, explain it immediately, and update the display.
    • The retro "Rogue" level has got to go.
    • Provide a high-level map of the dungeon branches you've discovered so far, and a detailed map of each floor you've been to.
  • A game mode that allows save states, called "Practice Mode". The normal game should be called "Hardcore Mode".
    • You can still unlock encyclopedia entries in Practice Mode.
    • Rename Wizard Mode to Debug Mode, have it only accessible by running the game locally.
    • Get rid of the standard Explore Mode.
  • Hide some of the roles and races initially. Start by presenting the player with a few choices, and reveal more choices as they play more of the game. Experienced players should be able to bypass this limitation by typing in the name of the role or race they want to play. The purpose of this change is to eschew the paradox of choice by making official recommendations for new players. The unlocks should be pretty easy; we don't want to withhold gameplay, just make recommendations. Thus, more advanced roles should probably be harder to unlock.
    • Roles should be unlocked as you find items or perform actions associated with them. See this wiki page for the ideas.
    • Races should be unlocked when you eat their corpses.
    • Gender and Alignment should start fully unlocked.

Additional fun stuff maybe someday:

  • Challenge modes, inspired by The Binding of Isaac: Rebirth.
    • You are hallucinating the whole game.
    • You can never wear anything.
    • You only have one hand.
    • Etc.
  • Achievements
  • Seed input, and other TAS support features
  • (The web api for the client would already be appropriate for AI projects.)
  • See the wiki page for more ideas.

And to make this project more approachable for developers:

  • No support for all the crazy build configurations that no one wants, like BeOS and Win32.
  • No compile-time options. Tourists, Kops, Steeds, etc. are all enabled all the time now.
  • Git and GitHub.
  • Major code clean up.
    • Aesthetic changes: no Pascal-style argument declarations, no hard tabs, clearer identifier names.
    • Don't use the preprocessor for programming: no #undef, no #includeing yourself, no macro functions.
    • General obvious stuff, like renaming things and deleting unsed things.

Needless to say, we're abandoning all hope of cleanly merging changes for the standard game into this fork.