Coder Social home page Coder Social logo

scionaltera / emergentmud Goto Github PK

View Code? Open in Web Editor NEW
5.0 3.0 1.0 919 KB

EmergentMUD is a free, text based "Multi-User Domain" that you play in your browser.

Home Page: https://emergentmud.com

License: GNU Affero General Public License v3.0

Java 93.45% CSS 0.93% JavaScript 0.70% FreeMarker 4.92%
mud rpg procedural-generation rpg-game text-based-game retrogaming

emergentmud's Introduction

Website Codeship Status for scionaltera/emergentmud
GitHub Issues GitHub PRs
Docker Pulls Docker Stars

Vision

EmergentMUD is a free, open source, text based "Multi-User Domain" that you play in your browser. It's a modern MUD with an old school retro feel. Just like most other MUDs back in the 90s you play a character in a medieval fantasy setting. The modern aspect is that the entire game world is procedurally generated on the fly and is fully interactive. All parts of the world from the species of plants and animals, societies of sentient creatures, geography, weather, and even quests are created on demand as players explore. All the different game systems interact with one another to create fun and unexpected emergent behavior. This world is alive.

Help an NPC gather resources to build his house and he'll build his house - not just continue asking everyone he sees for resources. Steal the gold from the King's vault and he won't be able to fund the war he's waging - having a direct effect on international politics. Burn down a village and maybe it will be rebuilt - but maybe it won't. Help someone in need and make an ally you can rely on later. Start a business and hire NPCs to work for you. Head out in a direction that isn't on the map yet and it will be created as you begin to walk through it - complete with new plants, animals, NPCs, religions, cultures and discoveries that the world has never seen before. Everything you do in this world has a real effect. You won't see any quest vendors and you won't experience the same "content" that everyone else has already devoured before you. You can forge your own path, create your own destiny, and leave your own mark upon the world in the process.

Current State

The code has been in active development for about two years now and still going strong, although there is still a very long way to go. Please drop in and take a look around. New things are being added on a regular basis.

I'm not looking for MUD staff at this time since the game isn't in what I'd call a "playable" state. There are often issues on GitHub labeled "good first issue" or "help wanted". Pull requests against those issues are always welcome as are new issues from visitors to suggest features, ask questions or provide feedback. I am hoping to start building a community around this project as it progresses, and ultimately to build the game I described in the paragraphs above. It's a game I think a lot of people would like to play; myself included.

Contact

The best way to contact me about this project is to open a GitHub issue. You could also just hop onto the MUD and see if I'm hanging around there.

License

EmergentMUD is licensed under the GNU AFFERO GENERAL PUBLIC LICENSE. This license ensures that EmergentMUD and all derivative works will always be free open source for everyone to enjoy, distribute and modify. Most importantly, the Affero license stipulates that you must be able to provide a copy of your source code to anyone who plays your game.

emergentmud's People

Contributors

scionaltera avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

lionelauroux

emergentmud's Issues

Biome flavor text

Need to remove the debugging info from room descriptions and replace the default sentence with a different flavor text for each type of Biome.

Ideally there should be support for many flavor sentences per biome, and any given room will show the same sentence every time you read its description. Something like:

biome.getSentenceByIndex((x + y + z) % numberOfSentences);

Otherwise the landscape will be pretty boring. It'll still be boring this way, but it's one increment less boring than it is now.

Entity location should be a Room

The fact that Entity has coordinates for a location is a holdover from earlier data models that didn't have first class Room objects. In the current model it would make more sense for Entity to be located in a Room and Room to be the only one to have coordinates.

Add gender to entities

  • Character creation screen should ask for character's first name and gender.
  • Emotes and other in-game messages should say him/her as appropriate.
  • At least male/female/neutral but the framework should support adding additional genders later.
  • INFO should list the Entity's gender.

Address differences in Docker builds

The Docker Hub build image uses frolvlad/alpine-oraclejdk8:slim while the dev image uses develar/java:8u45. The first image uses a much more recent JDK than the latter one, and for the first time today that caused different behavior in the images. At a minimum we should ensure that both Docker images are using the same version of Java. It looks like frolvlad has both a JDK and a JRE image available. Perhaps a multi-stage build would be appropriate.

It would be nice as well to make sure we use a JDK to build, but a JRE in the final image.

Separate contribution guidelines from README.

GitHub's "insights" says the project doesn't have any contribution guidelines because they're not in a separate file called CONTRIBUTING.md. Just cut the section from the bottom of the README and stick it in a separate file to make GitHub happier.

Run multiple instances

For better availability it would be a good idea to run multiple instances of the MUD at the same time. The way it uses the backing database should allow it, but the in-memory message broker won't. Right now you wouldn't be able to pass any messages to characters logged into the other instance, although you would be able to see them in the game when you type LOOK.

To support this there will need to be a separate message broker such as ActiveMQ or RabbitMQ that could pass messages between the different instances. Ideally, adding this feature should be configuration. It should still be possible to run one instance with an in-memory message broker.

Build on Codeship instead of Docker Hub

Docker Hub builds have always kind of sucked, but lately they've been extremely unreliable. Let's move the build over to Codeship and just push images to Docker Hub from now on.

Incorrect message dispatching

Not sure precisely what's going on with this one or how to fix it yet.

Steps to reproduce:

  1. Start up the MUD.
  2. Connect two characters with two browser windows. Have both characters in the same room.
  3. Shut the MUD down. I think this is required because you need one of the characters to be disconnected but not removed from the room they're standing in. If you quit or close the browser window they'll be pulled out of the room.
  4. Reconnect one character.

At this point the connected character will be able to see the disconnected character standing there. You will start seeing messages in that window for both characters: both sides of a SAY, yourself walking into and out of the room, etc.

Revisiting area generation again.

Hopefully the last run at this.

The idea is that the world is composed of zones. Each zone is a randomly sized rectangle. When the first player enters the game a zone is built at (0, 0, 0) for them. When they walk off the edge of the zone, a new rectangle is generated with an edge in the room they are walking into.

The rooms in each new zone are created on the fly using a maze generation algorithm. The algorithms in my implementation are inspired by two blog posts from Jamis Buck:

http://weblog.jamisbuck.org/2011/1/27/maze-generation-growing-tree-algorithm#

http://weblog.jamisbuck.org/2015/10/31/mazes-blockwise-geometry.html

Rooms that are "missing" within a zone are impassable, but whenever you walk off the edge it'll create a new zone. Later on, those impassable rooms could be made passable by clearing trees and brush, leveling the ground, or things like that.

Need a favicon

Need something to replace the default Spring Boot leaf icon.

Review mutability of model objects

I haven't been very good about making model objects immutable and ensuring they all have implemented equals() and hashCode(). It would be good to review the models and see if there are any that need it.

A couple of potential candidates are Coordinate and Pronoun but there are probably others.

Character attribute model

The game needs a model for character attributes to follow. I'm pretty sure I don't want the standard D&D attributes (STR, INT, WIS, DEX, CON, CHA) but I don't know specifically which ones I will end up with. I plan to add them in as I go, as the game demands ways to check the player's successes and failures, or compare entities against one another. I am pretty sure I'm going to throw in some kind of "luck" stat that will be hidden from the player though.

What I need from this feature is a standardized model for how stats work in this game.

  • How are starting stats chosen? (Point buy, random, etc.)
  • What range is allowed? (3d6? 1d8? 1d100?)
  • How do you do a test of the player against the environment? (Pull yourself up a ledge, survive a poison, open a lock, etc.)
  • How do you do a test of the player against another player? (Arm wrestle, detect a sneak, convince someone of something, etc.)

I'm not worried about advancement yet. I just need a framework I can slot stats into later.

Incorrect color on exit list

If:

  • You are one room in from the border of a zone
  • It shares a border with another zone
  • The room between you and the next zone is empty

The direction shows up gray as if you could walk into that room and create a new zone.

When you try to go in that direction, you (correctly) get the "Alas, you cannot go that way." message. The exit should not be shown on the exits list because it is not in fact a valid direction that you can go.

Title bar notification of new messages when out of focus

When messages are received while the window is out of focus, update the title bar to show how many messages have been missed. Maybe also put some sort of indicator as to where the console was when unread messages started to be received.

CI build passes immediately

Branch builds on Codeship pass immediately.

All the gradle stuff happens in the Dockerfile and all the "steps" are turned off since they're just tagging, so it reports success after a few seconds even though the Dockerfile hasn't finished running yet.

The fix for this is to only set up the build environment in the Dockerfile and move the gradle stuff into a "step" so it will wait for it to complete.

MainResource.extractRemoteIp() could be more widely useful

The extractRemoteIp() method in MainResource looks at the request headers to figure out as best as possible where the request actually originated from. It works well in the INFO command, but it could be useful in other places. One example would be in the ErrorResource where we put the remote IP in the log but without teasing out the actual IP, so we just get the IP of the Docker container there.

It would be nice to pull this method out into some kind of utility class that could be used in both places, so that we can start to log more thoroughly when remote web browsers touch the game. Doing so would help a lot in identifying and debugging authentication problems.

Convert *Loader classes into Flyway migrations

Now that we're using Flyway to manage the database it's possible to move the initial data load for biomes, emotes, etc. into SQL scripts that run after the schema has been created. Managing it that way will make it a lot easier to load new things into the database in later releases.

Migrate from MongoDB to PostgreSQL

The data for EmergentMUD are highly relational and eventual consistency is going to be a larger and larger problem as the size of the database grows and with multiple players running around. The schemaless database has been convenient for development but it's about time to move over to SQL.

Moving to an RDS instance will also simplify the Docker configuration in production because we'll no longer need to run a MongoDB container with a volume on disk as part of the ECS service.

MAP command queries each room individually

The MAP command currently uses a pretty braindead algorithm and queries each room on the map individually as it builds the map output. It would be a lot more efficient to query all the rooms in the area within the map boundaries in a batch.

EXILE should have its own capability

Right now it shares the capability editor's capability, but it really should have its own. The ability to eject someone from the game is pretty powerful.

Convert Repositories into PagingAndSortingRepositories

In moving off of MongoDB there are a few places where the code used to rely on the database to sort the results. Now it sorts the results after fetching them because the CrudRepository has no methods on it that accept a Sort. However, there is a PagingAndSortingRepository subclass of CrudRepository that can accept a Sort.

Find the places where we do the sorting after the fetching and update those repositories to the PagingAndSortingRepository so that we can once again offload the sorting to the database where it belongs.

Google auth is very sensitive to cookies

I'm not sure exactly what can be done to fix it, but if you have existing cookies from the site (e.g. you have previously authenticated with Facebook) it is very likely that authenticating with Google will fail with "401 Unauthorized". Unfortunately there is very little information on the error page and most users would give up at that point assuming the site is broken.

At the very minimum the error page needs to explain that clearing your cookies will fix it. Better would be to proactively detect the situation and transparently fix up the cookies so that authentication can succeed.

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.