Strangely Consistent

Theory, practice, and languages, braided together

July 31 2012 — the finished game

All last days of a project should be like this.

No stress. No looming deadline, just a normal deadline. No tearing one's hair. No failing test, just 144 really good passing ones.

First, I fixed something that I realized earlier today: I don't need to special-case the wrapper methods for take and put_thing_on with special handling of the tiny disk and its interaction with the bounded Hanoi context. Now that all the disks and rods are objects in the game, I'll just add more hooks. Nice.

Then it was time to split the big script file into smaller modules and test files.

$ wc bin/crypt 
  3483   8026 103863 bin/crypt

100 KB! All of it written this month... that means I've netted around 3 KB of code per day. Hm, that actually sounds about right.

Anyway, some splitting later...

$ wc `find bin lib t -type f`
   334   1007  12198 bin/crypt
   938   1931  25364 lib/Adventure/Engine.pm
   276    612   9013 lib/Crypt/Game.pm
     9     31    274 lib/Event.pm
   327   1021   9950 lib/Hanoi/Game.pm
   309   1010   9726 t/hanoi.t
   714   1227  16398 t/crypt.t
   633   1359  17366 t/adventure-engine.t
  3540   8198 100289 total

The script file completely deflated; it now only contains the MAIN routine for the game. Even it could be largely factored out into an Adventure::Engine::REPL or something, but right now it's a little too coupled with crypt for me to attempt that.

Much of the general logic went into Adventure::Engine, not surprisingly. Crypt::Game now mostly contains the world-building logic and some wrapper methods.

The test files also distribute easily. 54 hanoi.t tests. The crypt.t and adventure-engine.t tests were all mixed together in one MAIN multi, but they were easy to tease apart. (A deeper issue there is that some tests in crypt.t would need to be duplicated, anonymized ("de-crypted", heh), and put into adventure-engine.t so that it gets better coverage. I might get to that.)

If you're wondering why things got smaller from this, I think it was because some amount of indentation actually disappeared from the test files. Those tests were all in separate MAIN routines previously — indented one level. Now they're not.

But, just splitting things apart wasn't enough. I had promised to move Adventure::Engine into its own repository as an independent module, so I did that. It can now be found at github/masak/Adventure-Engine.

Then I took the chance to publish crypt as well. I published it as Crypt::Game, which was probably a mistake from an module naming perspective. I'll investigate tomorrow what it takes to rename the module Game::Crypt.

Both modules can be found at modules.perl6.org, of course. You should be able to install it with Panda now, though I haven't tried.

The contest for finding bugs in the adventure game is now closed as well, and I do have a winner — to be announced. If anyone wants to sneak in at the end with lots of bug reports and suggestions for improvements, I won't be impossible. The later they are, though, the more awesome they have to be in order for me not to consider them to be too late.

...and that concludes this day's work, and this blogging month. Thanks for following along this far. I'll probably sum up the month and what I learned, when I've regained enough strength to do that.