A Modern MUD Client for iPhone and iPad.

Related tags

Games MUDRammer
Overview

MUDRammer — A Modern MUD Client

Download MUDRammer on the App Store

> invoke incantation of build status divination

You move a hand through a series of quick gestures, 
your digits twinkling with eldritch potential. 
Suddenly, some images form in your mind:

Circle CI codecov.io It's dangerous! Take this.


MUDRammer is a modern MUD client for iPhone and iPad focused on speed, accessibility, and flexibility. MUDRammer has been designed and developed by Jonathan Hersh since November 2012. MUDRammer's first App Store release in February 2013 was followed by 34 App Store updates as of May 2015 and an open-sourcing in June 2015.

MUDs (Multi-User Dungeons) are online multiplayer text-based games. Thousands of players today are on hundreds of MUDs in all manner of worlds: fantasy, absurdist, sci-fi, horror, and more. Many MUDs have been continuously online for decades! MUDRammer includes a DefaultWorlds.plist with a few interesting default worlds you can try, or you can add your own.

MUDRammer is available for sale on the App Store. Although this repository will allow you to build and run MUDRammer from source, please purchase MUDRammer on the App Store to support continued development.

MUDRammer for iPhone

For Your Eyes Only

MUDRammer has been my personal passion project for years. It is an experiment to release my work under such a permissive license. If you use MUDRammer, please purchase a copy from the App Store rather than running it from source. If you want to create your own software based on MUDRammer, please make it meaningfully different and not just a clone. Please do not submit your own version of MUDRammer to the App Store.

Getting Started

You'll need Xcode 6.3 or newer.

  1. Install Homebrew if needed, and then brew update && brew install objc-codegenutils
  2. Clone this repo: git clone https://github.com/splinesoft/MUDRammer.git && cd MUDRammer
  3. rake setup will install RubyGems and CocoaPods. You will be prompted (one time only) to enter values for application secrets, like Hockey API keys. These values are stored securely in the OS X keychain. You can enter a blank space or - for these. You should run rake setup after updating your local copy from upstream.
  4. open src/Mudrammer.xcworkspace to build and run. Make sure to select the MUDRammer Dev Xcode scheme.

Additional rake tasks include:

Task Description
rake gems Installs RubyGems.
rake pods Installs CocoaPods.
rake setup Runs rake gems and rake pods and wipes the build output folder.
rake test Builds MUDRammer and runs all tests (minimalistic RSpec-style output).
rake lint Lints MUDRammer with various static analyzers.
rake code Generates and prints a single code redeemable on the iTunes store for a free copy of MUDRammer.
rake ws Strips trailing whitespace from all project source files. Requires these Swift playgrounds.

Notes

  • MUDRammer builds with the iOS 8 SDK and has a minimum deployment target of iOS 7. MUDRammer will soon build with the iOS 9 SDK and require a minimum deployment target of iOS 8: #254
  • The project's CFBundleShortVersionString is trolololol and its CFBundleVersion is 1337. These values are intentionally obvious to indicate Debug builds. The correct marketing version and build numbers are filled in by Jenkins at release build time by my build script, SSBuild.
  • MUDRammer has a separate app icon to distinguish Debug builds, no code required!

Contributing

Pull requests are welcome! Fork the repo and make your changes on a branch. You can run rake test locally to ensure the tests pass before opening a pull request.

License

MUDRammer's source code is available under the MIT license. See the LICENSE file for more details.

Although technically permitted by the license terms, please do not submit your own version of MUDRammer to the App Store.

Fonts, images, and sounds bundled with MUDRammer are licensed free for commercial use.

About the Name

I've been very fortunate in my years of mudding to have met people from all over the world. One of my more colorful Dutch mudding acquaintances has played for years with a character named "Mudrammer". It is a ridiculous and silly name, but it still makes me 😆

Contact

Jonathan Hersh

Comments
  • Fix NSInternalInconsistencyException in main, line 16

    Fix NSInternalInconsistencyException in main, line 16

    opened by splinesoft-ci 2
  • Extra newlines before/after user commands

    Extra newlines before/after user commands

    Well, I think things on the MUSH I play automatically end with a new line? I'm not too sure. Feels quite normal. Anyway, it occurs on both game.narutomush.com:7568 and yuriba.com:4201

    As a note, the latter is planning a shutdown due to server maintenance. So you should test it ASAP! Or just wait until tomorrow ^^

    The empty line that pops in before each command you input looks very disruptive to me and breaks the flow. Is there a way to get the text lining back to the way it was in the previous version?

    bug 
    opened by jhersh 2
  • Double movement keys with VoiceOver?

    Double movement keys with VoiceOver?

    Mit Voiceover funktionieren die Bluetoothtasten fuer die Richtungen nicht richtig.. Die Nord-Sued-Tasten gehen, bei Westen wird immer zweimal ausgeführt. Wäre es möglich, die tasten für se, e und ne umzustellen, so dass man wahlweise o, so und no hätte?

    VoiceOver Bluetooth keyboard for the directions do not work properly .. The North-South keys go in the West is always executed twice. Would it be possible for the keys se, e and ne switch, so you could either o, and so no?

    bug accessibility 
    opened by jhersh 2
  • Fix NSInternalInconsistencyException in main, line 16

    Fix NSInternalInconsistencyException in main, line 16

    Version: 1.8.7 (775) | com.splinesoft.theMUDRammer

    Stacktrace

    -;main;main.m;16

    Reason

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto layout internal error. Cannot find an outgoing row head for incoming head <unknown var (bug!) with engine as delegate:0x14653f60>{id: 31183}, which should never happen. Priority: 250, Coefficient: -1.0000000000. Engine:<NSISEngine: 0x15c19690>{ Rows: 0x15905610.posErrorMarker{id: 3214} == 0 + -1_0x1590b840.marker{id: 3174} + 1_0x1590b810.marker{id: 3176} + 1_0x15905ad0.posErrorMarker{id: 3210} + -1_0x15905ad0.negError{id: 3211} + 1_0x15905610.negError{id: 3215} 0x15905650.posErrorMarker{id: 3212} == 0 + 1_0x15905650.negError{id: 3213} + 1_0x15c224b0.marker{id: 23092} + -1_0x15c218d0.marker{id: 23098} + 1_0x15ae1b70.marker{id: 23104} + 1_0x15d705f0.marker{id: 23116} + 1_0x159942b0.marker{id: 31257} + -1_0x15d703b0.marker{id: 31261} 0x159071a0.posErrorMarker{id: 3208} == 0 + 1_0x1590b950.marker{id: 3166} + -1_0x1590b870.marker{id: 3172} + 1_0x159071a0.negError{id: 3209} + 1_0x15c224b0.marker{id: 23092} + -1_0x15c218d0.marker{id: 23098} + 1_0x15ae1b70.marker{id: 23104} + 1_0x15d705f0.marker{id: 23116} + 1_0x159942b0.marker{id: 31257} + -1_0x15d703b0.marker{id: 31261} 0x15b1c480.marker{id: 31270} == 0 + -1_0x145463f0.marker{id: 31258} 0x15d71670:UIInputWindowController-top.marker{id: 23110} == 0 + 1_0x15c01f30.marker{id: 23095} 0x15d716a0:UIInputWindowController-left.marker{id: 23111} == 0 + 1_0x15c218d0.marker{id: 23098} 0x15d716d0:UIInputWindowController-width.marker{id: 23112} == 0 + -1_0x15c218d0.marker{id: 23098} + 1_0x15ae1b70.marker{id: 23104} 0x15d71700:UIInputWindowController-height.marker{id: 23113} == 0 + -1_0x15c01f30.marker{id: 23095} + 1_0x15ae1b40.marker{id: 23101} 0x15d95710.posErrorMarker{id: 31286} == 0 + 1_0x15c224b0.marker{id: 23092} + -1_0x15c218d0.marker{id: 23098} + 1_0x15ae1b70.marker{id: 23104} + 1_0x15d705f0.marker{id: 23116} + 1_0x15dc6c90.marker{id: 31271} + -1_0x15d5bdc0.marker{id: 31277} + 1_0x15d95710.negError{id: 31287} 0x15d9ae00.posErrorMarker{id: 31288} == 0 + 0.00277778__UIRemoteKeyboardPlaceholderView:0x15d99740.Height{id: 31260} + 1_0x15d9ae00.negError{id: 31289} UIInputSetContainerView:0x15e5b3a0.Height{id: 23102} == 276480 + -360_0x15c01f30.marker{id: 23095} + 360_0x15ae1b40.marker{id: 23101} + 360_0x15d70620.marker{id: 23119} UIInputSetContainerView:0x15e5b3a0.Width{id: 23094} == 368640 + -360_0x15c218d0.marker{id: 23098} + 360_0x15ae1b70.marker{id: 23104} + 360_0x15d705f0.marker{id: 23116} UIInputSetContainerView:0x15e5b3a0.minX{id: 23099} == 0 + 360_0x15c218d0.marker{id: 23098} + 360_0x15d70550.marker{id: 23114} + -180_0x15d705f0.marker{id: 23116} UIInputSetContainerView:0x15e5b3a0.minY{id: 23096} == 0 + 360_0x15c01f30.marker{id: 23095} + 360_0x15d70590.marker{id: 23115} + -180_0x15d70620.marker{id: 23119} UIInputSetHostView:0x15c1a7f0.Height{id: 23122} == 127080 + -360_0x1590b840.marker{id: 3174} + 360_0x1590b810.marker{id: 3176} + 360_0x15905ad0.posErrorMarker{id: 3210} + -360_0x15905ad0.negError{id: 3211} + -360_0x15d9b220.marker{id: 31256} + 360_0x145463f0.marker{id: 31258} + 1__UIRemoteKeyboardPlaceholderView:0x15d99740.Height{id: 31260} + 360_0x15dc6cc0.marker{id: 31274} UIInputSetHostView:0x15c1a7f0.Width{id: 23093} == 368640 + 360_0x15c224b0.marker{id: 23092} + -360_0x15c218d0.marker{id: 23098} + 360_0x15ae1b70.marker{id: 23104} + 360_0x15d705f0.marker{id: 23116} UIInputSetHostView:0x15c1a7f0.minX{id: 23109} == 0 + 360_0x15c218d0.marker{id: 23098} + 360_0x15d70550.marker{id: 23114} + -180_0x15d705f0.marker{id: 23116} + 360_0x15dc4850.marker{id: 31349} UIInputSetHostView:0x15c1a7f0.minY{id: 23107} == 276480 + 360_0x15ae1b40.marker{id: 23101} + 360_0x15d70590.marker{id: 23115} + 180_0x15d70620.marker{id: 23119} + -1__UIRemoteKeyboardPlaceholderView:0x15d99740.Height{id: 31260} + -360_0x15dc6cc0.marker{id: 31274} + 360_0x14546900.marker{id: 31348} UIKBInputBackdropView:0x15d86170.Height{id: 30899} == 127080 + -360_0x1590b840.marker{id: 3174} + 360_0x1590b810.marker{id: 3176} + 360_0x15905ad0.posErrorMarker{id: 3210} + -360_0x15905ad0.negError{id: 3211} + 360_0x1459cb60.posErrorMarker{id: 31266} + -360_0x1459cb60.negError{id: 31267} UIKBInputBackdropView:0x15d86170.Width{id: 30903} == 368640 + 360_0x15c224b0.marker{id: 23092} + -360_0x15c218d0.marker{id: 23098} + 360_0x15ae1b70.marker{id: 23104} + 360_0x15d705f0.marker{id: 23116} + 360_0x159942b0.marker{id: 31257} + -360_0x15d703b0.marker{id: 31261} + 360_0x15b7a020.posErrorMarker{id: 31264} + -360_0x15b7a020.negError{id: 31265} + -360_0x15d9b2a0.posErrorMarker{id: 31268} + 360_0x15d9b2a0.negError{id: 31269} UIKBInputBackdropView:0x15d86170.minX{id: 30902} == 0 + 360_0x15c218d0.marker{id: 23098} + 360_0x15d70550.marker{id: 23114} + -180_0x15d705f0.marker{id: 23116} + 360_0x15d703b0.marker{id: 31261} + 360_0x15d9b2a0.posErrorMarker{id: 31268} + -360_0x15d9b2a0.negError{id: 31269} + 360_0x15dc4850.marker{id: 31349} UIKBInputBackdropView:0x15d86170.minY{id: 30898} == 276480 + 360*0x15ae1b40.marker{id:…

    Link to HockeyApp

    crash 
    opened by splinesoft-ci 1
  • Fix NSRangeException in - [SSArrayDataSource insertItems:atIndexes:], line 165

    Fix NSRangeException in - [SSArrayDataSource insertItems:atIndexes:], line 165

    Version: 1.8.6 (769) | com.splinesoft.theMUDRammer

    Stacktrace

    SSArrayDataSource;insertItems:atIndexes:;SSArrayDataSource.m;165
    SPLTerminalDataSource;flushLineQueue;SPLTerminalDataSource.m;361

    Reason

    * Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSMutableArray insertObjects:atIndexes:]: index 36 in index set beyond bounds [0 .. 23]'

    Link to HockeyApp

    crash 
    opened by splinesoft-ci 1
  • Fix crash in WebCore::MediaQueryMatcher::styleResolverChanged()

    Fix crash in WebCore::MediaQueryMatcher::styleResolverChanged()

    opened by splinesoft-ci 1
  • Clean up log file titles

    Clean up log file titles

    Okay, so logs are auto-stored on the phone. And right now, all I see the of the names are something like... 816922917283383e10 or some odd number like that. Would it be possible to name the logs something like 'world name - date'? A bit more intuitive and easier to sort through! At least visually >.>

    enhancement 
    opened by jhersh 1
  • Fix crash in WebCore::StyleResolver::loadPendingImages()

    Fix crash in WebCore::StyleResolver::loadPendingImages()

    opened by splinesoft-ci 1
  • VoiceOver speech

    VoiceOver speech

    ★★☆☆☆ I really wish I could say something good about the app but it's really disappointing. The accessibility of the apps mud output doesn't even give voiceover all its text. This makes playing miss on iOS a horrid experience. Please make this client useful again.

    https://github.com/splinesoft/ssaccessibility

    bug accessibility 
    opened by jhersh 1
  • Restore a version of Simple Telnet Mode

    Restore a version of Simple Telnet Mode

    Probably not feasible to completely disable telnet library handling now that MUDRammer uses libtelnet.

    However, there is at least one case (skotos.net MUDs) where a version of this preference that disables sending options upon connect would prevent issues in MUDs that have no support for telnet options.

    enhancement 
    opened by jhersh 1
  • IRE/Achaea telnet options

    IRE/Achaea telnet options

    Achaea sends these telnet options:

    ... 255 75 130 241 255 7 0 0 0 0 255 255 250 15 38 1 0 0 0 255 255

    Telnet option 75 is officially unassigned and IRE/Achaea is perhaps appropriating option 75 for some custom purpose.

    MUDRammer currently handles this very poorly, corrupting the stream and rendering the connection unusable.

    MUDRammer should instead(?)

    • advance until the next IAC command (255)
    • advance until the end of the option data
    bug 
    opened by jhersh 1
  • Feature Request: Configure the Move Control similar to the Radial Control?

    Feature Request: Configure the Move Control similar to the Radial Control?

    Awesome app! Thank you!

    Might it be possible to configure the Move control similar to how you can configure the Radial control? The reason I ask, is that my MUD does not have NW/NE/SW/SE directions, only the basic six like: n e w s u d. I would love to put u and d on the move control and reuse the other two slots.

    Thank you!

    opened by mdrcode 1
  • Fix NSInvalidArgumentException in - [NSObject(NSObject) doesNotRecognizeSelector:]

    Fix NSInvalidArgumentException in - [NSObject(NSObject) doesNotRecognizeSelector:]

    opened by splinesoft-ci 0
  • Fix NSInvalidArgumentException in - [MASViewConstraint install], line 328

    Fix NSInvalidArgumentException in - [MASViewConstraint install], line 328

    Version: 1.8.7 (775) | com.splinesoft.theMUDRammer

    Stacktrace

    MASViewConstraint;install;MASViewConstraint.m;328
    MASConstraintMaker;install;MASConstraintMaker.m;45
    UIView(MASAdditions);mas_updateConstraints:;View+MASAdditions.m;26
    SSMudView;setKeyboardPanningEnabled:;SSMudView.m;160
    UIView(DAKeyboardControl);inputKeyboardWillShow:;DAKeyboardControl.m;251

    Reason

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSLayoutConstraint for <SSMudView: 0x104da16e0; frame = (0 0; 375 559); layer = <CALayer: 0x281078be0>>: A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs.'

    Link to HockeyApp

    crash 
    opened by splinesoft-ci 0
  • Fix crash in main, line 16

    Fix crash in main, line 16

    opened by splinesoft-ci 0
  • Fix crash in main, line 16

    Fix crash in main, line 16

    opened by splinesoft-ci 0
  • Fix crash in main, line 16

    Fix crash in main, line 16

    opened by splinesoft-ci 0
Owner
Splinesoft
Mindful bits for your iPhone and iPad.
Splinesoft
iPhone and iPod Touch version of Skeleton Key: is an addictive and unique puzzle game in which you shift keys around the board unlocking treasure chests. Made with cocos2d-iphone.

Skeleton Key (iOS) Skeleton Key is an addictive and unique puzzle game in which you shift keys around the board unlocking treasure chests. It's availa

null 117 Jun 6, 2022
Exploding monkeys is a game for iPad. Chose vector and velocity to launch bananas

Exploding Monkeys Game Exploding monkeys is a game for iPad. Chose vector and velocity to launch bananas. Try to hit your opponent. Contains: SpriteKi

Nikolai Saganenko 0 Dec 12, 2021
Solitaire mahjong game with several themes and layouts. For android/iphone/ubuntu/firefoxos

green-mahjong Green Mahjong is a HTML5 based GPLv3 solitaire mahjong game. It features three nice themes, six different layouts and works accross all

Daniel Beck 82 Dec 25, 2022
PokaPlayer's native client for iOS and macOS

PokaNative PokaPlayer's native client for iOS and macOS Installation Get the ipa file from Releases. Use some software like AltStore to install the ip

PokaPlayer 5 Feb 12, 2022
GameStream client for iOS/tvOS

Moonlight iOS/tvOS Moonlight for iOS/tvOS is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield, but built for iOS and

Moonlight Game Streaming Project 737 Dec 27, 2022
The one and only open source 4X MMO mid-core strategy game for iOS. Similar to Game of War and Mobile Strike

4X MMO Strategy Game for iOS I have spent 4 years of my life and a significant amount of money into completing this game and I hope you enjoy it. For

shankqr 69 Nov 16, 2022
Recreating the Poketch from Pokemon Diamond and Pearl on the Apple Watch with SwiftUI and WatchOS 8

Apple Watch Poketch What is it? It's an Apple Watch remake of the "Poketch" from Pokemon Diamond and Pearl made with SwiftUI! Check out the YouTube vi

Idrees Hassan 297 Dec 31, 2022
XCode and Swift game based on the generation of random cards and some functions related to the comparison of the results.

war-card-game-V1 XCode and Swift game based on the generation of random cards and some functions related to the comparison of the results. Once a card

Eduard 1 Dec 10, 2021
Gamer-s-Collection - An app for searching and saving favorite games using rawg.io api and Core Data

Gamer-s-Collection - An app for searching and saving favorite games using rawg.io api and Core Data

Rıdvan İmren 1 Aug 19, 2022
Glide is a SpriteKit and GameplayKit based engine for building 2d games easily

Glide is a SpriteKit and GameplayKit based engine for building 2d games easily, with a focus on side scrollers. Glide is developed with Swift and works on iOS, macOS and tvOS.

null 433 Jan 6, 2023
A game engine built with SDL and Swift.

Lark A game engine made with Swift and SDL. This is a pre-alpha work-in-progress. Don't try to use this unless you really know what you're doing. I ba

June Bash 41 Mar 11, 2022
🦁 🃏 📱 An animal matching puzzle card game– built with turn-based game engine boardgame.io and React-Native + React-Native-Web

Matchimals.fun an animal matching puzzle card game ?? ?? ?? Download for iOS from the App Store ?? Download for Android from the Google Play Store ??

iGravity Studios 137 Nov 24, 2022
3D Shoot'em Up written with OpenGL ES 1.1/2.0 running on iOS, Android, Windows and MacOS X.

SHMUP This is the source code of "SHMUP" a 3D Shoot 'em up that I wrote in 2009. It is very inspired of Treasure Ikaruga, the engine runs on iOS, Andr

Fabien 242 Dec 16, 2022
Spare Parts is a 2D physics game that lets you build silly contraptions and machines.

Spare Parts Spare Parts is a 2D physics game that lets you build silly contraptions and machines. The goal for this project is: 100% of the code is op

Adam Wulf 14 Feb 9, 2022
Switshot is a game media manager helps you transfer your game media from Nintendo Switch to your phone, and manage your media just few taps.

Switshot is a game media manager helps you transfer your game media from Nintendo Switch to your phone, and manage your media just few taps.

Astrian Zheng 55 Jun 28, 2022
Mobile IOS Game App Developed by Haemi Lee, Dominika Popov, and Dylan Walsh

VroombaWars Mobile IOS Game App Developed by Haemi Lee, Dominika Popov, and Dylan Walsh Why clean your room in real life when you can have a virtual v

Haemi Lee 1 Oct 16, 2021
The ultimate spinning wheel view that supports dynamic content and rich customization.

The ultimate spinning wheel control that supports dynamic content and rich customization. Main Features ?? Dynamic content, supports texts, images, an

Sherzod Khashimov 250 Dec 27, 2022
The Classic game TicTacToe made using SwiftUI and MVVM architecture

The Classic game TicTacToe made using SwiftUI and MVVM architecture

Mehrdad 0 Oct 20, 2022
This project is a 2D game for iOS users built with Swift and SpriteKit.

PANDA CLICKER Description Panda Clicker is a 2D game and the aim is to touch the Panda image on the center of the screen. In each touch of the panda i

iremkaraoglu 6 Dec 21, 2022