Friday, February 29, 2008

Ansi Redux

Thank you to the MUX crew...Their ansify tool allowed me to create ansi in my login screen. I have now been able to do this...and will be asking Brazil if he minds if I either a) make a Perl version of that script or b) just use the ansify tool outright.

Onwards...

Ansi

It seems that I have a current love-hate relationship going with ansi on PurlMUSH. The %x substitutions don't want to work quite right and when I tried to put ansi in the connect screen...(which would be incredibly cool)...it didn't work. I will have to work on this a bit more.

I seem to remember that this was relatively easy before. Of course, I also had 24/7 to work on it before. Ahh, the good old days. (good? Who the hell am I kidding?)

Thursday, February 28, 2008

Lest I forget - Thank you Steele

I want full complete and total kudos to go out to Antonio@ChicagoMUSH, Steele@Steelemountain.com, Nebic@CDI, and any of his other aliases. This guy was my rock when I started this project several years ago, originally. He was a source of Perl wisdom, an incredible RPer, an awesome MU* coder, a true friend.

Life took him in a very different direction, very suddenly. I regret losing contact with him, and regret that my life kept me from working harder to keep that friendship.

A lot of the ideas and solutions that populated the original incarnation of PurlMUSH can be attributed to his influence, and this project could not possibly go forward without me sending a shout out to him.

Thank you, my friend. Please don't hesitate to contact me if this post ever finds you. I miss you.

Updates!

Okay, please keep in mind that I am representing a week's worth of work here with these posts. Pretty soon we will be posting in real time, but for now, I am just updating on the things I have accomplished so far.

  1. Rebuild the flags table - DONE! Flags table is a hash with two dimensions. Full name of hash is first dimension, and then fields like 'value', 'name', and 'symbol'. Symbol is the abbreviation that will eventually be going in ()'s after the dbref.
  2. Update the % substitutions - IN PROGRESS. I have the parsing code rewritten, a bit more elegantly I believe. Support for %r, %b, and %t is in. Ansi, on the other hand, is being a PITA. I believe I know which way I have to go with it, but it's going to take about 20m to sit down and rebuild that code to make it work the way I want. So much for my initial idea. But, ansi will work, I know this.
  3. think command - DONE
  4. @chown needs to work better, for changing ownership - DONE, or at least an initial version of this.
  5. Encrypt passwords - DONE! Passwords are encrypted using md5_base64 and authentication is done versus the encrypted version.
  6. Ability to use 'create' on the login screen - DONE!
  7. Break out config options in a .cnf file for the MU* to load - DONE! But I need to add support in so that this file is reloaded when the @reload command is done.
  8. @doing should have a string length limit - DONE!
  9. Autosay sucks. I hate it. Right now if you type something in that doesn't match a command, it will just say it. Now, some people might like this, so I will retain the feature, but as a flag. Not as a default hardcoded behaviour. - DONE!
  10. Gender is currently part of @set, like a flag. I don't like that. We need a standardized @sex command - DONE!
  11. IP/Site stored as attributes on a player - IP now being resolved properly. I think the box I'm on doesn't allow for reverse DNS lookups, but the code is in there to do it. I'm counting this as...you guessed it...DONE!
  12. Standard error message of Huh? (Type "help" for help.) - DONE!
  13. WHO - Started on this. There are now both admin and mortal WHO but there is a lot of work left to do on this.
  14. Look shows d/c'ed or dark players - DONE!
  15. Help files need to be reformatted, rewritten, and constantly, constantly, constantly updated - Reformatted. It's a start.
  16. Ansi in the connect splash. Gotta be done. Just gotta be. :)
  17. Substitutions/evaluations need to be done on ALL messages, whether it's a page, an osucc, a whisper, whatever - DONE! (I think)
  18. xyzzy will be added, as an homage. :) - DONE!
  19. Aliases need to be enabled through @alias - DONE!
  20. Added the SO_KEEPALIVE option so that people with dropping connections "shouldn't" have a problem anymore. Still in testing.
  21. Changed up connect screen options so they're matching on regexps rather than bareword literals.
  22. Made sure all players logging in would have a location. This wasn't set explicitly, though it should have been. Bit of a hack for now, will work on something more permanent later.
Okay, so these are all of the updates so far. Everything from this point on is real time rambling about PurlMUSH. Stay tuned.

ToDo List

Well, I had to get started somewhere. I've talked earlier about having to take out the http server engine from the PerlMUD code and reformat a lot of the code for stylistic and syntactic consistency. This is my first fell swoop of 'making it mine'. Now, I shall list a rather sizable list of bullet points that represent things that I am going to be doing on Purl to develop it.

  1. Rebuild the flags table - Right now, flags are defined as individual variables. I want to be able to have a flag name, value, abbreviation in one hash table.
  2. Change all db objects to true Object-Oriented code objects - Right now it's an array of hashes. I want an array of objects, indexed by dbref. If that's greek to you, no worries. I'll likely write a more eloquent and explanatory post in the near future about the objects and what they do and why I want to use them.
  3. XML db format. I want to dump out the db when it's saved into XML format. This will allow for portability, and a few other things. Plus, XML's cool. Again, proof of concept.
  4. Update the % substitutions - Lots of work here. %r and %t (carriage return and tab) aren't supported, ansi's not supported, and the way it's currently programmed is...inefficient, imnsho.
  5. think command - Unbelievably useful for testing things. Not currently supported and easy to implement.
  6. @chown needs to work better, for changing ownership.
  7. Encrypt passwords - Dear gods! Passwords are stored in plain text in the db. Have to encrypt those.
  8. Logging - Various levels of logging need to be done, including connection logging, system event logging (db dumps, @reloads, etc), and eventual support for the SUSPECT flag for command logging of suspect players.
  9. Ability to use 'create' on the login screen - Players need to be able to create themselves at the login screen.
  10. Break out config options in a .cnf file for the MU* to load.
  11. @doing should have a string length limit
  12. Autosay sucks. I hate it. Right now if you type something in that doesn't match a command, it will just say it. Now, some people might like this, so I will retain the feature, but as a flag. Not as a default hardcoded behaviour.
  13. ; (semicolon) needs to be changed so that it does an emote with no space between the character's name and the text. Right now, it's for something else. I want the behaviour of this codebase to be very similar to established "standards" for MU*ing.
  14. All code projects have to have a README and a Changelog. I will have to write these. Bleh.
  15. PerlMUD comes with a built-in 'topics' feature. I will redesign this to implement channels. Should channels log? Hmmm.
  16. Gender is currently part of @set, like a flag. I don't like that. We need a standardized @sex command.
  17. We need to be able to do non-standard attributes, so that we can move towards custom locks and things like that. &blah #123=Blah.
  18. @mail is needed - Have to harvest some ideas on best way to do this.
  19. I am going to hardcode the BBS. Myrrdin's +bb system is so universal. Every game has a BBS. So, this one will too, but it will be a better system, hardcoded.
  20. @moniker from MUX. I love having ansified names. I will do this. Yes, I will.
  21. An idea from Ti'Anna - @paste. This is a command from MOO where you type @paste , hit enter. THen you paste in a whole whack of text that you want to show them, and type a . on a line to signify that you're done. Then, they get it spammed on their screen. I like this, I will do this.
  22. The commands table will need to be rebuilt at some point. I know how I did it before and I don't think I want to do that again. I will have to come up with something new for that.
  23. IP/Site stored as attributes on a player. Currently the game doesn't record what IP you connected from. I may build in a +alts-style command, at some point.
  24. Standard error message of Huh? (Type "help" for help.)
  25. Guests - Guests on a MU* are limited in what they can do. They're like a player...with FAS. If that sounds mean, too bad.
  26. WHO - Oh gods...WHO. I hate the current WHO. I have to get it to behave like a regular WHO. And that means building an admin WHO as well.
  27. Look shows d/c'ed or dark players. Cannot have this.
  28. examine - See WHO. Oy.
  29. Recycle Bin - This was something I had done before. When you @recycle an object, it goes into the recycle bin, and can be @restore'd. One time only. Once something else is @recycled, your object is lost.
  30. inventory - See examine, see WHO. Oy x 2.
  31. Help files need to be reformatted, rewritten, and constantly, constantly, constantly updated. Ow. Programmers hatelovehatelovehate documentation.
  32. news file functionality - It's gotta be there. Why? Cause it's a standard.
  33. Ansi in the connect splash. Gotta be done. Just gotta be. :)
  34. Rebuild setting the various standard attr's (fail, ofail, succ, osucc, etc). Each one has its own subroutine, which is just dumb.
  35. Book objects need to be revisited. Not sure on these.
  36. Substitutions/evaluations need to be done on ALL messages, whether it's a page, an osucc, a whisper, whatever.
  37. Names need to be able to have spaces.
  38. @teleport needs to have arrive, depart, oarrive, odepart messages.
  39. I seem to remember that @find/@search stunk. I may have to revisit this.
  40. xyzzy will be added, as an homage. :) If you don't know what that is, Wikipedia is your friend.
  41. Aliases need to be enabled through @alias.
  42. @aconnect - Things to do when you connect.
  43. @dolist - Make a list of things to do and do them.
  44. Time and Date format - Again, needs to be standardized. Currently does it as a single value (1d, 32s, 14h). Needs to be in 00:00 format.
Okay, that's a good start. More will come, and these things will be done.

The seed is planted

PurlMUSH will be reborn. This is something I have decided. This project existed a long time ago, and was relatively well-advanced before RL tragedy struck. All of the previous code was lost. This is a shame, because it was excellent code.

Regardless, it will be rebuilt. We will make it bigger, faster, stronger. We have the technology.

First off, what IS PurlMUSH? PurlMUSH is an endeavour to build a MUSH (a la TinyMUX, PennMUSH, TinyMUSH) purely in the Perl programming language. This is proof of concept more than anything else. It is never going to compete with the major flavours of MUSH, but it will be done for the sake of doing it. Perversity at its best.

Now, first off, I have to give credit where credit is due. Thomas Boutell of Boutell.com originally developed PerlMUD (http://www.boutell.com/perlmud/index.html) and it is FROM PerlMUD that a great deal of this is inspired. That being said, I have purchased a license for PerlMUD and from there I am developing my own version of this. I make NO CLAIM that this is entirely my code. However, all changes and differences from the original code of PerlMUD are entirely my own. My bugs are my own and will remain that way. I will fix them. Eventually. :)

Why am I doing this project? Because I love Perl. And I love MUSH. Therefore, it's the love child of my two online passions. I believe that I can make this a good piece of code. I know that I can write good Perl code, and I know that I have a very good understanding of how MUSHes operate. I've been on them for a long time.

So, all that being said, this project officially launched on February 15th. Thanks to the generosity of Lorinthal and Ti'Anna, PurlMUSH is up and running on the development server of supermassive.blackhole-ninjas.net, port 8301.

Before the code was functional, I had to strip out the http server that was bundled into PerlMUD. That took a while. I also optimized some of the code for readability according to my style specifications.

An example is, PerlMUD had code like this:
if (!&wizardTest($me)) {
&tellPlayer($me, "You must be a wizard to do that.");
}

Standard code, right? Yes, it is. However, I enjoy the following syntax MUCH much better.

&tellPlayer($me, "You must be a wizard to do that.") if (!&wizardTest($me));

It's more readable to me. If you're not a code junkie, you may not get the distinction, and that's okay. Read on, as I will document many more things to come.

One last note. Why PurlMUSH? Well, there's the obvious homonymic similarity between Perl, and Purl. The accusation was, at one point, that Purl was short for 'purloined', aka stolen. That I had stolen the idea from Boutell and was claiming it as my own. Not true. I wanted something distinct. And I also remember from my many years watching my mother knit and crochet that there is a stitch called a purl stitch. It can be done to put, for example, a golden or silver stitch around the edge of something. Which, in some senses, is what I am doing. I am taking the core server functionality of PerlMUD and gilding it, purling it if you will. There is also a definition out there of Purl being the murmuring sound of water. I may not be murmuring constantly through this, but...I like the idea. And last, a Purl is a Persistent Uniform Resource Locator. A permanent place on the web, if you will. I'm very persistent about making PurlMUSH a reality. Hence, the name. And so yes, the name of this blog is 'Culturing a Purl' and will continue to be so, because I have taken a seed, placed it in my oyster-ish brain, and I hope a true 'pearl' will emerge.

This will be the story of how this Purl is cultured.