Giter Club home page Giter Club logo

xania's Introduction

Xania MUD source C/C++ CI

Found on @mattgodbolt's hard disk, and resurrected. Shows the code behind a UK-based Multi-User Dungeon that my university housemates and I ran, built and administrated in late 1990s.

Discord

We chat about the mud here. Feel free to drop in.

Building and running

If you want to build and run Xania locally, you'll need a modern Linux. We test it on Ubuntu 22.0.4 and Arch Linux.

It works within Docker including when hosted by Windows Subsystem for Linux. To learn more about this see the Docker-specific tutorial!

It has been reported to work on Fedora 34 too.

g++ and Other Essentials

Here are the Ubuntu steps for installing some prerequisites:

# Install gcc-12 and g++-12. Versions 13 and 11 work too!
$ sudo apt install build-essential manpages-dev software-properties-common
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt update && sudo apt install gcc-12 g++-12

# Optional step: We recommend installing ninja-build as it speeds the builds up significantly.
$ sudo apt install ninja-build

# And you'll need the following...
$ sudo apt install git make curl

# Local builds autodetect g++-12 and use it for compilation, but fallback to g++-11.
# clang-15 works too (see later section).  If you want to build with a different compiler
# create a new cmake toolchain file e.g. "toolchain/mycompilers.cmake" and set the compiler
# variables in it. Then invoke make specifying the leading part of your toolchain name in 
# the TOOLCHAIN make variable e.g.
$ make TOOLCHAIN=mycompilers test

# Alternatively, if you know what you're doing you can invoke cmake directly and pass a custom 
# toolchain, (with -DCMAKE_TOOLCHAIN_FILE= or using the --toolchain switch (cmake >= 3.21)). 
# Take a look in the Makefile for how cmake gets invoked to generate the build currently.

CMake

You'll also need a recent version of cmake. At least version 3.19 is required, 3.21+ preferred. If you're running Ubuntu 18 or 20 you'll need to add the Kitware apt repository to your apt sources. On Ubuntu 22 or Arch Linux the cmake package is present in the main APT repository.

$ sudo apt install cmake

Build and Run

The build itself downloads and manages many other upstream dependencies such as conda and conan via the Makefile.

To build and run, type make:

$ make start
... lots of configuration nonsense here, downloads, cmake, and then compilation ...
All being well, telnet localhost 9000 to log in
$

The MUD is now running in the background, on port 9000. telnet localhost 9000 should get you the logon prompt. Create a character, and log in...and have fun!

If you want to build but not start it up, simply run make.

By default a debuggable unoptimized build is run. Use make BUILD_TYPE=release to build the optimized version.

Stopping and Restart the MUD

To stop Xania, run make stop. To restart, make restart.

Compiling with clang

You may be interested in compiling with clang, version 15 is known to work. You may also want to use clangd as an LSP for editors like neovim and the nvim-lspconfig plugin.

# First install the tools:
$ sudo apt install clang-15 clangd-15
$ update-alternatives --install /usr/bin/clangd clangd $(which clangd-15) 10
$ update-alternatives --install /usr/bin/clang clang $(which clang-15) 10
$ update-alternatives --install /usr/bin/clang++ clang++ $(which clang++-15)
$ update-alternatives --install /usr/bin/clang-tidy clang-tidy $(which clang-tidy-15)

Build by specifying the toolchain:

$ make TOOLCHAIN=clang-15

When building with clang, it's possible that you may run into compatibility problems with versions of libraries in your conan cache. The cache typically resides in ~/.conan. Removing the problematic libraries from the cache and re-running make is one solution. You can selectively nuke cached libraries, for example:

# Remove all versions of fmt from the cache
$ ./cmake-build-debug/.tools/conda-4.12.0/conan remove fmt/* -s -b -f
# Remove all cached libraries from the cache
$ ./cmake-build-debug/.tools/conda-4.12.0/conan remove "*" -s -b -f

Creating an immortal account

To administrate Xania from inside, you'll need a level 100 character. Create a character as above, then quit. Edit the player/Yourplayername file and edit the line with Levl 1 to be Levl 100. Then log back in and voila! You are an immortal!

Developing

The top-level Makefile is more of a convenience layer to set up a consistent environment. It delegates the actual building to a cmake-built system in one of the cmake-build-{type} directories (e.g. cmake-build-debug). A tiny amount of back-and-forth between the two systems ensures the cmake build system uses the various tools installed locally in .tools/ to do work (e.g. conan for C++ packages, clang-format for code formatting, etc). The top-level Makefile will configure cmake to use ninja if you have that installed, else it'll use make.

For day-to-day developing you can use your favourite IDE or editor (CLion, vs.code, vi, emacs). If your IDE supports CMake projects, then it might Just Work out of the box. CLion, for example, will open up and run the code from the IDE.

The mud happily runs without being installed, however it does rely on a few environment variables for configuration (see below).

There are two components, doorman and xania. The former is the TCP side of things, and unless you're changing how the MUD and the connection process communicate you can probably build and run doorman and then leave it running. xania is the MUD part, and so if you're debugging and building, that's probably the target to run.

We use clang-format to format all the code consistenly, and a .clang-format file is in the root. Again, most IDEs will pick up on this and just use it. Command-line users can run make reformat-code to reformat everything, or make check-format to just see if everything's formatted as it should be. At some point we'll make this part of the CI process.

Environment Variables

The mud processes use some environment variables for configuration. Out of the box, make start will set reasonable defaults for these. The default settings are stored in mud-settings-dev.sh, and make start will read this file.

If you are doing development and launching the processes from an IDE then you prefer to configure these settings separately. The project includes an example Visual Studio Code launch.json that sets these.

  • MUD_AREA_DIR: Static game database files.
  • MUD_DATA_DIR: The base directory of all runtime data. The mud uses these subdirectories:
    • player/ (player character files)
    • gods/ (configuration for deities)
    • system/ (other player generated data e.g. ban lists and bug lists)
    • log/ (the mud processes are unaware of this as log output is redirected from to stdout & stderr)
  • MUD_HTML_DIR: Static and dynamically generated HTML.
  • MUD_PORT: The TCP port doorman listens on for telnet connections. Default: 9000.

If you are running either process directly from a shell rather than using make start or a launch target in your IDE, there is also a helper script mud-settings-dev.sh. Source this file from one of your shells then run the process e.g. after running the build:

$ . mud-settings-dev.sh
$ ./install/bin/doorman

Tests

There are some very early tests. To run the tests, use make test, or run them from your IDE.

Debugging Xania in GDB

There's more than one way to do this, and one way is: after building Xania you can run it like so (use of gdb is optional):

$ gdb install/bin/xania
(gdb) r   # to run

You can also attach to the running process using gdb -p.

If you're relying on the default make targets to build & start things, the reboot command from within the MUD will not restart the processes.

A solution is to not run make start at all, but instead, execute ./install/bin/doorman and the xania executable directly in another terminal as described above.

For neovim users, the nvim-gdb plugin works well.

Going "live"

When the MUD is actually deployed, we make install to get a built setup with areas and binaries etc. That's tar'd up and copied to a host to run. player files and whatnot are managed separately. If you're curious how we're sketching out ideas for the deployment, check out the infra/ directory. It's a bit wild in there right now though.

License

See the LICENSE file for more details, but this code is built on and extends code from Rom2.4 code.

Xania's log on banner contains a lot of the required info. As you may not wish to log in, it is:

.   .... NO! ...                  ... MNO! ...
.... MNO!! ...................... MNNOO! ..    /    \    /    \
.... MMNO! ......................... MNNOO!!   \     \  /     /
.. MNOONNOO!   MMMMMMMMMMPPPOII!   MNNO!!!!     \     \/     /
.. !O! NNO! MMMMMMMMMMMMMPPPOOOII!! NO! ...      \          /  A N I A
  ...... ! MMMMMMMMMMMMMPPPPOOOOIII! ! ...       /    /\    \
 ........ MMMMMMMMMMMMPPPPPOOOOOOII!! .....     /    /  \    \
 ........ MMMMMOOOOOOPPPPPPPPOOOOMII! ...      /    /    \    \
  ....... MMMMM..    OPPMMP    .,OMI! ....     \   /      \   /
   ...... MMMM::   o.,OPMP,.o   ::I!! ... 
       .... NNM:::.,,OOPM!P,.::::!! ....    ...where it is recognised that 
       .. MMNNNNNOOOOPMO!!IIPPO!!O! .....   shaking hands with Death brings
       ... MMMMMNNNNOO:!!:!!IPPPPOO! ....  longevity and considerable kudos.
         .. MMMMMNNOOMMNNIIIPPPOO!! ......
        ...... MMMONNMMNNNIIIOO!..........
     ....... MN MOMMMNNNIIIIIO! OO .......... DikuMUD by Hans Staerfeldt
  ......... MNO! IiiiiiiiiiiiI OOOO ......... Katja Nyboe, Tom Madsen, Michael
 ..... NNN.MNO! . O!!!!!!!!!O . OONO NO! .... Seifert, and Sebastian Hammer.
 .... MNNNNNO! ...OOOOOOOOOOO .  MMNNON!..... Based on MERC 2.2 code
 ...... MNNNNO! .. PPPPPPPPP .. MMNON!....... by Hatchet, Furey, and Kahn,
    ...... OO! ................. ON! .......  ROM 2.4 (C) 1993-96 Russ Taylor
       ................................       MUDdled by the Xanian Immortals

I (@mattgodbolt) believe the code is free to open source, but of course if you have any issues don't hesitate to contact me.

Thanks to

The Xania implementors were avid players of MadROM, and were inspired to get the ROM code and start hacking on their own MUD. In particular thanks to Etaine, Ozymandius, Neuromancer, Amiga and Crash. Sorry if we forgot someone!

In the MUD itself, the thanks read:

Xania was created by The Moog, Death, Faramir, Rohan  and Wandera,
five bold Gods who saw fit to create a new world where
peace and happiness would reign. Sadly, (due to  sheer incompetence)
they made a nasty mistake somewhere along the line, and an infestation
of evil spread chaotically throughout  the realm. Thus, this place is
no longer safe and it is up to you, bold adventurer, to face up to the
prospect of meeting an untimely demise!

A special thank you to the original immortals and heroes who contributed
to Xania's success, you can see their names using the 'wizlist' command.

And it goes without saying, Xania would have been nothing without the base
code and areas that shipped with Rivers of Mud (ROM), its sister mud, MadROM,
and before that, DikuMUD and MERC. We owe a debt of gratitude to the original
developers and zonesmiths.

xania's People

Contributors

ddugovic avatar frederic-tingaud-sonarsource avatar jordansamuels avatar mattgodbolt avatar oznog avatar philjessies avatar snellers 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  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

xania's Issues

Feature: Better corpse recovery experience

A revised version of "hailcorpse", or a feature that replaces it, such as a graveyard system.

Currently, this allows you to summon your player corpse if you are standing in the room next to it. This is useful if an aggressive mob is standing in that room.

You can still collect corpses in that situation if you use invis (or an invis potion!) but some mobs see through invis! Or you may died really deep in a dangerous zone. So apart from having a high level friend come recover your stuff, a better recovery mechanism would be helpful.

Build on more versions of GCC

We get more warnings (which are errors) on some newer compilers (see #6 for example). We should get our CI to build on a variety of compilers.

Newline parsing is broken in doorman

If CRLF pairs (or LFCR) are broken across buffer boundaries, two newlines are interpreted.

e.g.
"Hello\n\r" in one buffer=> one line "Hello"
"Hello\n" | "\r" in two buffers => one line "Hello", one blank line.

Update pfile format

Maybe something like YAML?

We should tests we can losslessly roundtrip the new format and compare it back with the original old format.

Feature: unique items (per player)

Currently Xania doesn't have a way to limit a player to owning only one of "special" items. So a player can hoard several clones of a rare sword for instance. Due to how some of the item respawning logic works, this has the potential to prevent the item from respawning on the NPC that usually carries it, except at reboot time.

MUD should time out inactive connections pre-Play

Seems some kind of regularish "scan" of the port causes leaks:

[  6    55452  0] REDACTED actual player
[  0    58966  0] REDACTED actual player
[  4    46142  0] REDACTED actual player
[  1    42260  1] (unknown)@87.112*** [#-4757302504619967340]
[  2    41888  1] (unknown)@87.112*** [#-4757302504619967340]
[  5    39694  1] (unknown)@87.112*** [#-4757302504619967340]
[  3    39720  1] (unknown)@87.112*** [#-4757302504619967340]
7 users

Text doesn't align in `skills` with `n/a`

Level  1: axe                  1%      dagger               1%      
          flail                1%      mace                 1%      
          polearm              1%      shield block         1%      
          spear                1%      sword               40%      
          whip                 1%      parry                1%      
          scrolls              1%      staves               1%      
          wands                1%      recall              50%      
Level  3: rescue             n/a      
Level  5: bash               n/a      ride               n/a      
Level  6: disarm             n/a      
Level  7: second attack      n/a      
Level 15: throw              n/a      

Imbalanced items

Debug code in db.c reveals the following items that are not at the right level for their owners (and the stats are probably wrong too).

a bardiche (1113) -- 5, mob the battle master (1121) -- 25
a bardiche (1113) -- 5, mob the Thain (1112) -- 14
a bashball bat (8006) -- 5, mob a tap (8005) -- 14
a bashball bat (8006) -- 5, mob Ernie Ramirez (8009) -- 19
a broken sword (12039) -- 25, mob the elven blacksmith (12021) -- 12
a clear stone (5243) -- 9, mob the baby beholder (5300) -- 5
a dark green cloak (5223) -- 25, mob the priest of Thalos (5307) -- 20
a gaffi stick (5812) -- 60, mob the Sand Person (5803) -- 43
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a gardener's spade (1801) -- 60, mob a peasant gardener (1801) -- 55
a hammer (6504) -- 9, mob the dwarven guard (6500) -- 20
a hammer (6504) -- 9, mob the dwarven guard (6500) -- 20
a hand axe (3025) -- 0, mob the hobgoblin (4052) -- 6
a hand blaster (5813) -- 40, mob Greedo (5819) -- 85
a hand blaster (5813) -- 40, mob the Jawa (5802) -- 35
a hand blaster (5813) -- 40, mob the Jawa (5802) -- 35
a hand blaster (5813) -- 40, mob the Jawa (5802) -- 35
a hand blaster (5813) -- 40, mob the Jawa (5802) -- 35
a hand blaster (5813) -- 40, mob the Jawa (5802) -- 35
a hand blaster (5813) -- 40, mob the smuggler (5815) -- 65
a hand blaster (5813) -- 40, mob the spaceman (5810) -- 55
a hand blaster (5813) -- 40, mob the spaceman (5810) -- 55
a hand blaster (5813) -- 40, mob the spaceman (5810) -- 55
a hand blaster (5813) -- 40, mob the spaceman (5810) -- 55
a hand blaster (5813) -- 40, mob the town person (5809) -- 50
a huge, steel axe (1107) -- 5, mob the dwarven prince (1117) -- 17
a huge tower shield (2313) -- 30, mob Caris (16025) -- 22
a Judge's club (8011) -- 20, mob Judge Eckersely (8010) -- 30
a knife (8009) -- 5, mob a tap (8005) -- 14
a knife (8009) -- 5, mob Pinkerton Throt (8008) -- 25
a knife (8009) -- 5, mob Wallaby Gleep (8007) -- 22
a leather vest (616) -- 30, mob a shiriff (1110) -- 8
a leather vest (616) -- 30, mob a shiriff (1110) -- 8
a leather vest (616) -- 30, mob a shiriff (1111) -- 8
a leather vest (616) -- 30, mob a shiriff (1111) -- 8
a leather vest (616) -- 30, mob the Thain (1112) -- 14
a long spear (3501) -- 3, mob the goblin leader (3507) -- 9
a long sword (3022) -- 7, mob the barbarian (3027) -- 30
a long sword (3022) -- 7, mob the knight (3026) -- 30
a long sword (3124) -- 10, mob the mayor (3143) -- 23
an ancient long sword (1704) -- 20, mob Itreres (16036) -- 42
an engraved ebony seal (5224) -- 25, mob the mayor of Thalos (5309) -- 20
a quarterstaff (7807) -- 15, mob Talemon (7811) -- 25
a silver dagger (2201) -- 6, mob the Draconian Queen (2243) -- 20
a silvery dagger (1357) -- 9, mob the battle mistress (1327) -- 17
a standard issue dagger (3351) -- 3, mob the Mage (4100) -- 13
a standard issue dagger (3351) -- 3, mob the Mage (4157) -- 11
a standard issue sword (3350) -- 3, mob the captain (3140) -- 17
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3060) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3067) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3068) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3069) -- 20
a standard issue sword (3350) -- 3, mob the cityguard (3071) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3072) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (3141) -- 15
a standard issue sword (3350) -- 3, mob the cityguard (5331) -- 15
a steel broad sword (1604) -- 10, mob the captain (1613) -- 17
a stone club (9220) -- 3, mob a large elemental (9207) -- 15
a thin dagger (3020) -- 0, mob the thief (3005) -- 8
a thin dagger (3020) -- 0, mob the thief (3005) -- 8
a thin two-handed sword (1909) -- 26, mob a githyanki protector (1909) -- 46
a war axe (4054) -- 6, mob the warrior (4050) -- 12
a wooden staff (8910) -- 13, mob the Hierophant (8900) -- 20
a wooden staff (8910) -- 13, mob the Hierophant (8901) -- 20
black stiletto (1814) -- 78, mob the black ninja (1815) -- 68
black stiletto (1814) -- 78, mob the black ninja (1815) -- 68
black stiletto (1814) -- 78, mob the black ninja (1815) -- 68
black stiletto (1814) -- 78, mob the black ninja (1815) -- 68
black stiletto (1814) -- 78, mob the black ninja (1815) -- 68
|Cflowing blue robes of the Lore|w (30152) -- 55, mob a Lore protector (30156) -- 50
Donatello's bokken (1804) -- 80, mob a statue of Donatello (1804) -- 65
dwarven club (6508) -- 8, mob the dwarven mine leader (6508) -- 21
Leonardo's Katana blade (1802) -- 80, mob a statue of Leonardo (1802) -- 65
lord's key (10084) -- 95, mob the town lord (10082) -- 75
Michaelangelo's numchucks (1803) -- 80, mob a statue of Michaelangelo (1803) -- 65
pet shop key (10085) -- 95, mob the sheriff (10081) -- 75
Raphael's sai (1805) -- 80, mob a statue of Raphael (1805) -- 65
silver leggings (633) -- 27, mob Antryg (16026) -- 22
the Golden Claw (662) -- 21, mob a Dragonlord (630) -- 29
the Golden Claw (662) -- 21, mob the Ancient Gold Dragon (631) -- 37
THE long sword (9000) -- 32, mob Primus (9011) -- 40
the Manual of the Undead (18107) -- 90, mob Doctor Frankenstein (18108) -- 80
the Reaper's Scythe (18121) -- 90, mob the Grim Reaper's minion (18124) -- 85
the sheriff's key (10086) -- 95, mob the sheriff (10081) -- 75
Wolf claw gauntlets (10110) -- 45, mob a wandering wolf (10093) -- 40
Wolf coat (10111) -- 45, mob a wandering Wolf (10090) -- 40
Wolf eye (10112) -- 60, mob a Mother Wolf (10091) -- 42
Wolf feet (10108) -- 45, mob a wandering Wolf (10090) -- 40
Wolf skin belt (10109) -- 45, mob a wandering wolf (10093) -- 40
|Wthe amulet of the Lore Binder|w (30157) -- 90, mob a Lore protector (30155) -- 75

sacname with no params is missing a newline

Moog> sacname
WIZNET: Log TheMoog: sacname
You must tell me who they're gonna sacrifice to!Currently sacrificing to: FaramirMoog> 

Though this could be an artifact of using rlwrap telnet XXX

Running make install fails.

When running make or make install getting the following output:
make: *** No rule to make target 'doorman.o', needed by 'doorman'. Stop.

Feature: Quest engine

Really this 'Issue' would encompass multiple enhancements over time

Xania has no formal, built-in quest system at the moment.

Basic of quest types:

  • the classic "delivery" quest: take some item from a quest giver and find a specific NPC and give it to them.
  • to simply "chat" with a particular NPC.
  • to visit a specific room
  • "kill" quests: to slay an NPC (or bring to low health) a specific NPC at the behest of someone who doesn't like them.

Initially, very simple 1 stage quests, but eventually leading to multi-step chains, and more complex chains.

And then, what should the rewards be? Experience, items, both? Changes to your alignment (good/evil) ? Or faction changes (see below). And other unusual rewards like special titles, the ability to purchase unique mounts and that kind of thing :)

Feature: make Midgaard's cityguards and main guardian more helpful.

Xania has a pretty decent NPC chat system where you can send 'tells' to NPCs and they will respond. We can us this to make the cityguards and main guardian respond to common questions, especially those of new players. This feature is about taking a first cut at adding some useful interactions.

telnet options parsing broken in doorman

If a telnet option straddles a read-buffer boundary, doorman's parser barfs, and doesn't handle it.

e.g. if you feed IAC, DONT, TELOPT_BINARY a byte at a time, xania will see a line of "\xfe" instead of nothing at all.

Discovered while adding tests for #54

Player hp/mana regen rate is slow.

Even with Meditation & Lethargy effects, it takes a while to fully regenerate. Less downtime would be more fun. Furthermore, if the haste spell is on you, it slows down even more. This, being the opposite of Lethargy, is "realistic", doesn't really make the game more fun.

Feature: Factions

Xania has the basic good/neutral/evil concepts. Good mobs will attack an evil player. And items can be flagged as 'anti-good', 'anti-evil', and cannot be used until their alignment has been stripped using the 'Remove Alignment' spell. But Xania doesn't have the notion of political/power factions. Gain favour with a city to unlock new quests, buy items more cheaply etc.

It could be another pretty major feature, but it'd require a fair bit of thinking & effort.

Racial material penalties are too harsh.

A few of the races dislike specific materials, e.g. Elves don't like Iron. Right now the penalty is that they can't equip such an item. This is a pretty harsh penalty. It could be rebalanced to do things like 'zap' the character on equip (with a small chance to kill or knock them unconscious if they're low on health). Or apply a damage-over-time debuff, like a short disease. They'd still be able to use the item but suffer initial discomfort.

We could also take the feature out, but it does add an interesting roleplaying dimension to the races. We could add material penalties to some of the other races to balance things out a bit, although we must be a bit careful with things like steel, which is a common material.

Feature: Banking

Each major city would have a bank you can deposit up to 20-30 items in, and as much gold (I need to check if gold has weight!) Use it to stash valuables, spare equipment.

Feature: Make it easier to buy stuff

Currently it can be a pain if a shopkeeper has many items for sale that have the same word in their name, as players have to resort to using the index-based lookup to get the right item, e.g. "buy 3.standard" to buy the 3rd item called standard in the list.

This could be better. Either by supporting proper matching on a leading portion of the item name e.g. "buy 'a standard sword'" (this doesn't work right now).

And/or, a numbered item mechanism where, when using 'list' to show the items for sale, it would present a new number column on the left. And a player would be able to do buy 1, buy 2, etc. Less typing and less hassle.

#ifdef notdef

#ifdef notdef is in some parts of the code. We should either expose the hidden code or delete it.

fread_obj no match no helpful bug...

WIZNET: [*****] BUG: Fread_obj: no match.
WIZNET: [*****] BUG: Fread_obj: no match.
WIZNET: [*****] BUG: Fread_obj: no match.
WIZNET: [*****] BUG: Fread_obj: no match.

Seen when an IMM logged in, would be useful to see what it was that didn't match.

"reboot" failed

with the scripts as-is, I tried rebooting.

  • I was disconnected (I though doorman should stay up)
  • Upon reconnect doorman was hung (nothing happened, but it accepted)
  • I had to manually stop and restart

Security "audit"

A number of areas of code are the worst kind of C, and likely suffer from buffer overruns (I have an email containing some issues, obviously not putting here).

Thoughts:

  • TESTS!
  • Fuzzing doorman and the Xania-side client input handling
  • Running with the address sanitizer on (why not? machine's fast enough!)

Remove the OLC code

It's partially implemented and disabled, and probably not the best way to support content creation anyway.

Pet recall logic

Minor thing here. I ordered a pet to recall, then recalled, and when I arrived, the pet recalled again.

petrecall

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.