GithubHelp home page GithubHelp logo

nullcgt / splicehack Goto Github PK

View Code? Open in Web Editor NEW
29.0 9.0 12.0 129.72 MB

An in-progress nethack variant based on version 3.7. An attempt to build a "kitchen sink" style variant that is easy to pick up and play.

License: Other

Perl 0.48% C 88.05% C++ 4.29% Assembly 0.24% OpenEdge ABL 0.03% GAP 0.01% R 0.10% Max 0.01% Batchfile 0.07% Awk 0.05% Shell 0.13% Roff 0.24% DIGITAL Command Language 0.23% Makefile 0.19% AppleScript 0.04% sed 0.01% CSS 0.02% Lua 5.82%
nethack variant active

splicehack's Introduction

SpliceHack 1.2.0 -- General information

SpliceHack is an in-progress fork of NetHack 3.7 (and in part, SLASH'EM), made with the goal of adding additional monsters, items, special levels, and game features without changing too much of the core gameplay. The end goal is a "kitchen sink" variant that is still intuitive and easy to pick up and play for anyone familiar with vanilla NetHack.

Screenshot

Features

  • Monsters riding other monsters.
  • The option to play as nonbinary and choose your orientation.
  • Hundreds of new foes to fight.
  • Dozens of new items to collect.
  • An extended, more challenging endgame.
  • So much more...

Suggestions and criticism of the game are welcome. This variant is very much a work in progress, and as such bugs and balance issues may exist. Bug reports, suggestions for new features, questions, and pull requests can be directed to this variant's github page.

How to Play

Configuration

The first question most new players have about NetHack is how to configure the game so that it looks nice, they can disable autopickup, and so on and so forth. For information about customizing NetHack, refer to https://nethackwiki.com/wiki/Options. The steps for customizing SpliceHack are the same as the steps for customizing NetHack, except the file to edit is named .splicehackrc.

If you don't want to spend time writing a configuration file from scratch, this repository contains a file named .splicehackrc.example for Unix systems. Simply copy the file to the relevant location, rename it, and modify it to your heart's content.

Configuration File Locations

  • Windows: %USERPROFILE%\NetHack.splicehackrc
  • OSX: ~/.splicehackrc
  • Linux: ~/.splicehackrc

Tiled Mode

SpliceHack contains a tileset, and can be played in graphical or ascii mode depending on the preference of the user. Some of the tiles in the tileset are based on those found in vanilla, others are based on tiles from SLASH'EM, and others still are entirely original.

A copy of this tileset is included for reference. Feel free to modify it or use it as a basis for your own tilesets.

Screenshot

Why the Rewrite?

When I started writing SpliceHack, I wasn't as opinionated or as skilled of a developer as I am now, and I had much less experience in balancing a game and making it fun to play. This rewrite is an effort to improve both the code and the gameplay of SpliceHack, so that it's more enjoyable and easier to maintain.

Collborators and Acknowledgements

SpliceHack's development is currently being driven by the following individuals.

  • AntiGulp (Admin)
  • Rojja Spicycat Flump-Cebolla

Special thanks go out to qt, K2, aosdict for being frequent contributors to and influences on the code, and K2 for hosting it publicly. Credit to the vanilla dev team and all unnamed contributors to vanilla NetHack as well, without whom none of this would exist.

SpliceHack is largely derived from NetHack 3.7 and SLASH'EM, but pulls features from numerous other NetHack variants. A more comprehensive list of sources can be found in the sources file.

Contributing

Please see contributing.md.

Disclaimer

SpliceHack follows the conditions put forth in the license provided by the NetHack Dev Team (see dat/license). If you are aware of any licensing or permissions issues with SpliceHack, please contact us through github.

SpliceHack - The Design Philosophy

SpliceHack's design philosophy has evolved over time. At present, these are the standards that should be considered when creating a pull request for SpliceHack.

  1. SpliceHack should remain as accessible to new players as possible. There are a number of ways to ensure this:

1.1. For every monster and item, a corresponding tile must exist.

1.2. Try to keep to the loose rules NetHack provides for how to color monsters.

1.3. When adding a new mechanic, consider adding a corresponding rumor.

  1. Tedium and grind are to be avoided, and any change that reduces tedium or grind should be prioritized.

  2. Changes that make the midgame and lategame more interesting should be prioritized.

  3. Instant death should, in general, be avoided. While methods of dying instantly exist, such as drinking an entire keg of booze or attempting to drink lava out of a furnace, these are the exception rather than the rule.

  4. Being silly is fine; NetHack is built in part upon silliness. Avoid being too silly, however. A pun-based item interaction is fine; a One-Eyed One-Horned Giant Purple Amoeba Eater monster is not.

  5. Any change to the "canon" of the game, such as the identity of the player, must be carefully considered, and existing lore must be taken into account.

  6. Hateful, edgy, and otherwise objectionable content should be avoided. SpliceHack is a game for everyone.

    7.1 Although the language of the external game may change, sometimes the source code will stay the same. This is for the purposes of remaining semi-compatible with Vanilla's codebase, as well as because of the sheer size of the codebase, and the danger of large scale replacements. As an example, "culture" is used over "race" ingame, but not in the codebase, since changing it in the code would involve replacing hundreds of lines, and break all compatibility with vanilla NetHack. Although this is obviously not an ideal solution, it is temporarily workable.

-- Good luck, and happy Hacking --

NetHack may be freely redistributed. See license for details.

splicehack's People

Contributors

actual-nh avatar alkom avatar apowers313 avatar barthouse avatar bhaak avatar bhouse-microsoft avatar chasonr avatar copperwater avatar davecohrs avatar dnicolaas avatar entrez avatar fredriq avatar gebulmer avatar k21971 avatar kougyokugentou avatar maddthesane avatar mogigoma avatar nh-karnov avatar nhkeni avatar nhmall avatar nhtangles avatar nullcgt avatar paxed avatar remirol avatar rikerw avatar rojjacebolla avatar splatpope avatar tung avatar uniqp avatar vivit-r avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

splicehack's Issues

Scroll of cloning can be exploited to create a wish engine

If you wield a wand of wishing, then confuse yourself and read a scroll of cloning, you can clone your wand of wishing. The item cloning feature allows for some other exploits as well, but this is easily the most broken. I'm considering dropping this feature in favor of creating a doppelganger or something.

Amalgamations and bad clones are not described correctly by farlook.

When one uses ":" to get more information about something that uses the EAMA struct, the wrong encyclopedia entries and stats are referenced. This is a side effect of putting a special case for EAMA in xname.

Potential solutions include altering the amalgamation naming system to include some sort of punctuation or unique chain at the beginning that can be easily looked up, rewriting the xname code, or changing pager.c. Pager.c is the cleanest method, but very difficult to implement.

Suggestion: Vampire race and firearms+grenades and Cthulhu from Slash'em

Hello, Splicehack gives a lot of fun, and it has "kitchen sink" conception, so I think adding some features from Slash'em would add even more fun, I recall it was a nice hardcore madness playing vampire and suck blood from enemies and even from peaceful citizens, as well as firing from rifles/pistols/etc and throwing grenades...

Some would say that firearms are anachronism for nethack "middle ages" -- but I would answer: lets look at dnethack (and notdnethack) where pirates use old-fashioned flintlocks / pistols while grenades were invented even earlier than firearms.

As for Cthulhu (and other Old Ones) - it's actually from unnethack and/or "lethe" patch adding some touch of lovecraftian horror atmosphere, also abovementioned dnethack also has a lot from Lovecraft's horrors.

With best regards...

Altar conversion messages don't match the new colors

Lawful altar is yellow now. I converted a chaotic altar (red) to lawful (yellow) but I get this message:
'You feel the power of Tyr increase. The altar glows white.'

May want to change the messages for this to reflect your altar color changes.

Infernal and hungerless regeneration.

Version: b634fe9
Tested on hardfought.org and for confirmation used wizard mode when compiled from source.

The infernal's regeneration increases hunger the same amount as a ring of regeneration. I tested this in wizard mode by clocking the turns from hungry to weak for a level 4 infernal and a human wearing a ring of regeneration.

Everything about amalgamations.

Apart from the code to generate them being awful spaghetti code, there's some other issues here. Due to a stupid mistake I made, each new amalgamation modifies all existing amalgamations, since the permonst struct is edited directly (that's how pointers work). There's also a few bugs with their level initialization. Overall they are perfectly safe to play with, but function VERY oddly. I'm still looking for a solution to this; I'm thinking that adding a new mextra struct that contains the amalgamations attacks, m2, and m3 flags is probably the way to go. Amalgamations of existing monsters are far too interesting of a concept to just drop.

(copied from commit comment)

Crash when swallowed by monster while riding steed

Here's the coredump:

Core was generated by `/splicehack-0.5.1/splicehack -u k2'.
Program terminated with signal SIGABRT, Aborted.
#0 0x00007f0ac3be7428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007f0ac3be7428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007f0ac3be902a in __GI_abort () at abort.c:89
#2 0x00000000004940a2 in NH_abort () at end.c:212
#3 0x00000000004940c1 in panictrace_handler (sig_unused=) at end.c:139
#4
#5 0x00000000004ac46f in domove () at hack.c:1379
#6 0x000000000044c03b in rhack (cmd=0x88d360 <in_line> "2", cmd@entry=0x0) at cmd.c:4291
#7 0x0000000000421bbd in moveloop (resuming=) at allmain.c:476
#8 0x00000000005d31df in main (argc=3, argv=0x7ffca2b22588) at ../sys/unix/unixmain.c:342

I was playing a Dragonmaster, riding my dragon, and was swallowed by an air elemental. Crash did not happen immediately, was being pummeled by debris and was fighting back when crash occurred.

Sheild of resonance and shield of reflection can change into one another

https://eu.hardfought.org/userdata/s/stenno/splicehack/ttyrec/2018-06-10.19:13:15.ttyrec.gz

Apparently the shield of resonance and shield of reflection can morph into one another somehow. This is (to say the least) very concerning. Stenno pointed out that this might be due to them having the same appearance.

I think the ideal solution is to change the shield of resonance to having a different appearance, since giving them the same one was kind of a nasty move in the first place.

Fix MSC file compilation

I'm fairly sure there are a few functions that I added in extern.h but not in the corresponding MSC files. These should be fixed to prevent compilation errors on specific systems.

Cannot use furnaces in special levels

This is completely fixable, but involves changing the level parser. I'm holding off on that until I know enough about the language used there to be sure that I won't mess something up.

Tileset

I need to figure out how to add tiles so that this variant is playable with a vanilla tileset. I doubt its as simple as simply adding to the bmp file so that it lines up with the pm.h and onames.h file, but I can't seem to track down the part in the source that deals with this.

Bug: Rider's horse disappears

During wiz-testing, I noticed the following:

  1. you kill a Rider (death, famine, etc, doesn't matter which)
  2. the horse they were riding now materializes and engages you in battle.
  3. if the Rider comes back from the dead while its horse is on same space as the Riders corpse, the horse vanishes. At first I thought the Rider was re-mounting its steed, but this is not the case. The horse disappears for good.

Is the Rider supposed to re-mount its horse? Or is its steed vanishing by design?

Shopkeeper career change program in disorder

This occurred when moving to the City of Brass from the Plane of Water, eventually resulting in a segfault.

shopkeeper career change? (rmno=7, rtype=20, mnum=0, "anonymous") 
Program in disorder!  (Saving and reloading may fix this problem.)

This also may occur in the main dungeon.

patchlevel tweak

Just pulled down version 0.3, had a look in includes/patchlevel.h - I think you forgot to edit the patchlevel define, it's still as this:

#define PATCHLEVEL 1

Which would effectively make this build 0.3.1. Easy enough fix, I changed it to 0 before building. If you actually meant 0.3.1, please advise.

Demon boss rush can potentially overwhelm the player.

Due to the nature of RNG, it's entirely possible to have all the demon lords appear on the same level. This is naturally really bad and unfair. I probably should write a custom function to spread them out through the dungeon instead of just using a standard random function.

Cartomancer Compilation

Cartomancers currently are not included in the makefiles and hints files correctly, and so are not in a working state.

more issues with Elbereth conduct

Noticing some odd behavior with the Elbereth conduct - its inconsistent.

  1. issuing #conduct at the start, it will always show that you haven't engraved Elbereth if you haven't. so far so good
  2. but if you do engrave it and then do #conduct afterwards, either it will show you how many times you've engraved it (good) or it doesn't show anything at all (not good).
  3. also - I engraved Elbereth with all lowercase letters and it scared a monster but doing #conduct afterwards showed that I hadn't engraved Elbereth yet. It's looking for uppercase E at the beginning I think.

I'm not sure how to fix this one.

End-of-game reasons shifted, resulting in easy ascensions

Due to some error with the end-of-game reasons, e.g. done(ESCAPED), it is possible to easily get a game to count as an ascension even if it really wasn't, which resulted in Splicehack being temporarily banned from the public server until you get this fixed: these are the observations I made.

  • If you escape the dungeon via the upstair you start the game on, the xlogfile reports it as "ascended", so you can very easily get turn 1 ascensions that also appear in the scoreboard (this is why the variant got banned).
  • If you use the #quit command, the xlogfile reports it as "escaped".
  • If you genocide yourself, the xlogfile reports it as "panicked".
    Couldn't easily reproduce the others (poisoned, burned, choked, drowned and whatever other done() reasons there are) but I'd not be surprised at all if they were similarly bugged, i.e. shifted by one in the internal list. In fact, actually ascending the game would probably not count as an ascension, and since ASCENDED is the last entry in the array, it could even result in the game trying to call an element outside of the array and segfault when you would have ascended!

Please get on the #hardfought IRC ASAP, the server administrators would probably want to talk to you so we can figure out how to fix this bug, and then they'll probably re-enable Splicehack! :)

File Edit Dates

To comply with the license agreement, file edit dates and citations need to be added to everything that has been modified in the source.

Small bug/missing feature with Elbereth conduct

Noticed that when the player checks #conduct, it will show that they haven't engraved Elbereth if they haven't yet (good). On a successful engrave, issuing #conduct again shows nothing about engraving Elbereth, even though the commit for it clearly shows that it should. Also, there's no recording of this conduct in the xlogfile.

The below solution appears to fix both issues at once:

src/topten.c around line 424, add these lines:

if (!u.uconduct.elbereth)
e |= 1L << 12;

right beneath
if (!num_genocides())
e |= 1L << 11;

I've tested this briefly and so far it works - you can see how many times you've engraved Elbereth, and it leaves a distinct conduct code in the xlogfile.

Furnace, more info crash

When I look at a furnace and choose "More info", the game crashes wiping out save files. I have reproduced this twice in two different games.

Version: b634fe9
Server: Hardfought

Stun lock when wind-based monster blasts player into edge of map

Issue #15 addresses the problem of being hurtled into a wall by a wind-based monster, which used to deprive the player of all movement for the remainder of their hurtle time. However, these monsters can still stun-lock the player on levels that extend to the very edge of the map. (Most levels have undiggable stone preventing access to the map edge, but not all.) When the player hurtles into the edge of the map, they get the message "You feel the spirits holding you back" and remain unable to move.

The stun lock is seen in this ttyrec, lasting from turn 35998 to turn 36032 (34 turns) and causing a great deal of unpleasantry.

Though I'm no expert on NetHack's code, I see that the commit which fixed Issue #15 added unmul((char *) 0); before several of the return FALSE statements in hurtle_step (from dothrow.c). The return statement associated with "spirits holding you back" was not one of them. hurtle_step apparently returns false whenever hurtling is blocked, so it seems that unmul ought to be called before all return FALSE statements in hurtle_step to prevent all such stun locks.

Program in disorder (will-o'-wispfusion elemental)

Got this message after being engulfed by a will-o'-wispfusion elemental:

The sleep ray rips into the will-o'-the-wispfusion elemental.
You hack the will-o'-the-wispfusion elemental.
The magic-absorbing blade scares the will-o'-the-wispfusion elemental!
Swallower has no engulfing attack?
Program in disorder! (Saving and reloading may fix this problem.)
The immobile will-o'-the-wispfusion elemental seems to flinch.

Still able to continue playing after the fact.

Cartomancer compilation

The Cartomancer.lev and .des files still seem to have issues with make commands. This can be fixed by adding them manually to the makefile, but I would rather avoid that.

Balance wind-based monsters

With wind-based monsters, my intention was to add enemies that could push the player around, perhaps putting them into nasty situations. The issue is that I didn't know about stunning upon colliding with walls. If a wind-based monster has a wind attack in melee and high speed, they can permanently stun-lock the player against a wall. This is obviously not intentional, but I can't modify the hurtle code too much without affecting the balance of players throwing objects during levitation.

It's not a huge issue right now since there are only a few foes with wind attacks, but this will need to be solved sooner or later.

EDIT: The only two enemies are either explosive or very slow, so the chances of stunlock are fairly low.

The monster zaps a knife! The fAâ╛Ç hits you!

A few different people have reported this. Monsters apparently will sometimes zap knives which shoot poison gas. This is by far the strangest bug that I have ever encountered, and I have absolutely no idea what is causing it.

Creating a spoilerific wiki

Need to create a wiki with a lot of spoilers. This way I can remember what I have added and what changes I have made, and players will be able to look up information about the game. It always frustrated me when I would go to find information about an obscure feature for a variant I was playing and couldn't find anything.

Crash when creating a health food store

Health food stores contain the object type VEGETARIAN_CLASS, which is special cased by mkshobj_at - it should never call mkobj_at with that type, and if it does it will fall off the end of the array and crash. However, there was a missing else causing it to continue past the mkveggy_at() and call mkobj_at as well.
This can be fixed with the following patch:

517c517
< if (Is_blackmarket(&u.uz)) {

    else if (Is_blackmarket(&u.uz)) {

Can't go down holes while flying (Vampire)

Either player race vampire, polymorphed as a vampire or other flying race, or riding a flying steed one cannot descend through a hole or trap door. Pressing ">" to descend shows the message:

"There's a gaping hole under you! You don't fall in."

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.