Treasures, perils, and mysteries await the adventuresome...
1. History
Well, let's see. Where do I begin? As some character [the White Queen?] in Alice in Wonderland said, "Begin at the beginning, continue until you finish, then stop." Or something. I'm sure Lewis Carroll is spinning in his grave.
Okay, maybe here: TADA - short for Totally Awesome Dungeon Adventure - aims to be a Commodore 64 re-implementation and improvement of a game I played on a local Apple // bulletin board system (BBS) in Tacoma, Washington (state), USA. The BBS was nicely done in an ancient Roman theme. The system operator, Trajan, called it Dura Europos, which ran software called GBBS Pro.
The game which garnered my attention was called The Land of Spur. The in-game atmosphere was great, despite most room descriptions being only a few lines long. I remember logging lots of text from it, but I was never able to get far in it without dying. This frustrated me; I wanted to know more about the inner workings of the game.
From this a half-formed seed of an idea began... I would re-create it on my own. (A few years ago, Trajan found my web page detailing this project whilst Googling for "Dura Europos" and got in contact with me on my BBS! That was really cool. He's set up his system since then, working from backup disks. Maybe some day we'll actually get to visit!) And so TADA began its life as a pile of notes in 8th grade (in 1989) -- many of which I still have, written in faded pencil on the back of class notes, envelopes, you name it. Unhappily, no cocktail napkins. Hey, I was too young to drink at the time. My handle "Pinacolada" refers to the yogurt, which I still love dearly.
So I started programming little bits and pieces of it, working mainly from the logs I had accumulated. Along the way, I thought it would be interesting to add a few features, such as the capability for the player to add things to the game: rooms, items, and monsters. This would effectively turn it into a one-player Multi-User Dungeon. (SUD? Single-User Dungeon? Ah: "A One that isn't Cold, is scarcely a One at all." -- Strong Bad) A few years later I was able to purchase a copy of GBBS Pro at an ungodly price, along with the Holy Grail (er, programmer's reference guide) and a magical disk which contained the original version of The Land Of Spur.
Unfortunately, as it stands, the BBS does not fully function. (It's missing the ACOS.OBJ file -- sort of a key element since that is the interpreter for the script language the BBS and The Land of Spur are written in, called Advanced Communications Operating System.) Trajan kindly has supplied this file to me, it's just a matter of getting a real Apple in my local vicinity to transfer the files back on to the original disk, or better yet, a backup thereof. But my mind's eye can reconstruct what the game could have looked like in its native habitat from reading the source code. (You'll have to imagine the pick and shovel, little brushes, and pith helmet of an archaeologist; I've heard many tools of the trade are rather rough on vintage hardware. Mmm. Vintage. Just makes my heart -- and my ego -- swell with pride. It doesn't get older, it gets better. Would you care to sniff the power cord? No... stop... don't lick it! Ack! Well, that's okay; it wasn't plugged in anyway.) I've made a hard copy of all the source code and have it backed up on multiple CD-ROMs now. You shoulda seen the one that got away... I am slowly working on HTMLizing the BBS manual.
2. Features
The Land of Spur has a very team-oriented, cooperative world view, even though it was just a single-player game (ie, one player would log on, make their moves, log off, wait for the next player to log on, etc.) as "was the style at the time" <insert a mental image of hanging an onion on your belt a lá an episode of The Simpsons>...
You could also have up to three allies, which could improve your chances of winning a battle. I'm not sure whether the allies could also carry things (the version I have doesn't appear to have that capability) but I've already added it (well, at least the inventory part so far) in TADA. These could be found whilst adventuring, if your statistics were "good enough" (I'm still not 100% clear on what merited this) and you had the option of them joining your party. On the enhanced Dura-Europos version, you could also re-order the allies to gain tactical advantage.
You could also charm monsters and have them join your party! Rawr.
There was also a well-done (optional) guild system, in which people banded together to beat up opposing guilds. Or you could be a civilian, and have no affiliation with guilds. Or you could be a rogue, and against everyone! Muhahaha.
You could also have a horse, which would speed up "your journey over the land parts of the Land." (quoted from the user documentation) It could also improve your chances of winning a battle (you could CHARGE into battle on the first attack and gain a bonus, especially if you were carrying a lance or pole weapon). The horse can also carry things, if you find some saddlebags for it. And it has to be fed and watered, of course.
I'm not sure whether this was done purely by choice of Trajan, but there were Storm Weapons in the game - intelligent, able to cast spells. Pretty neat concept. I'm not quite sure how to implement them yet.
One of the neatest things about the game was that it involved what I saw as time travel. You could be on the bridge of the Enterprise with a two-handed sword, or wander around a dungeon level with a phaser. (Of course this was just the ability to carry items anywhere in the game, but I like my explanation better!)
And so, the original The Land of Spur menu (cleverly adapts to 40-80 columns):
[-------------------------------------] [-------------------------------------]
( The LAND of SPUR Game Menu ) ( Ye may employ these commands )
(=====================================) (=====================================)
( DROP - an item READY - a weapon ) ( UNREADY-weapon REST - a while.. )
( GET - an item ATTACK - a monster ) ( CAST - a spell LOOK - at a room )
( EAT - food DRINK - water/wine ) ( USE - item WEAR - armor )
( READ - a book DUEL - a player ) ( HELP - help QUIT - Quit game )
( EXAMINE OBECT (X-examines all) ) ( QUOTE - Write your chars quote )
( FLEE - random exit ) ( STATS - Your Current Status )
( DIE - Terminate this player ) ( INV - Display Inventory )
( V - Room description ON/OFF ) ( AD - Auto duel ON/OFF )
( ORDER - Tactical order of allys ) ( GIVE - Give item to ally to carry)
( TAKE - Take item from ally ) ( LURK - Lurk behind ally in combat)
( LOOT - unconcious adventurers! ) ( PRAY - When all else is gloom.. )
( DIG - Dig up or bury items ) ( )
======================================= =======================================
[ Ye may travel: ] [ Guild Special Commands: ]
[ [N]ORTH [S]OUTH ] [ FOLLOW ME-Ask guild member to follow]
[ [E]AST [W]EST ] [ FL-Allow your character to follow ]
[ [D]OWN [U]P ] [ STAY- Leave followers behind ]
======================================= =======================================
[]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]
Yes, stuff is incomplete and missing. I'mpondering if TRACK will make its way home again. Perhaps someday. Itran away because it was beaten...Mysteries abound:I'm still trying to figure out exactly in what way the programmerencoded room description information on the original disk images -- I'musing faddenSoft's CiderPress toolto look at the information. I do have the full maps (including roomdescription text) for levels one through six. Level seven has yet to bedecoded. But this makes my job easier, thanks to Trajan.I went ahead and moved my original level one map to level eight,assuming I'll fill in the blank level seven one day.I finally found an issue of Compute that had a program whicheffectively lets you split your BASIC programs into modules, as long asyou keep the main module of the program in memory at all times, whichare lines 1000-, and submodules which are lines 20-999 - rather likeImage BBS's +.files. If there's enough interest, the original intent ofthis game was to port it to Image BBS to give it"single-player/multi-user" capability, but it's obviously important toget the game working in BASIC first. Maybe I'll flesh out the "standalone"version to function as a editor and client, allowing the player tocreate things offline and upload them to the BBS later. That would becool, having user-created maps. []=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]2. FEATURESThe Land of Spur is pretty cool. It had a very team-oriented,cooperative world view, even though it was just a single-player game(ie, one playerwould log on, make their moves, log off, wait for the nextplayer to log on) as"was the style at the time" <insert a mental image of hanging anonion onyour belt a lá an episode of The Simpsons>... The goal of the game was configurable by the sysop, which usuallyinvolved getting out with:a) a certain amount of moneyb) a magical itemc) both a) and b), ord) dueling (killing?) the god Spur, who was apretty hard dude to kill, I would imagine, never having gotten that far.Some other interesting features of The Land of Spur were the factthat--going back to the guilds concept--every room in the game had a"guild alignment," and youcould gain bonuses by having other members of your guild in the roomwith youat the time you decided to duel another character. To gain an easybonus,you could even pick up sleeping guild members from other rooms (if thecharacterlet you). The FL command let you turn that on or off, if you found itannoying that youwoke up in a different room that you bedded down for the night.There was also a statistic called "Bad Hombre Rating" which summarizedwhat that character's fighting ability was, using the following formula:it's a good indication to stay away from that person (unless on apurelysocial level, say at the Adventurers' Cocktail Party next Friday night)unlessyou like visiting the cleric to get healed regularly - or resurrectedbyyour friendly local Wizard.If you belong to a guild, there are guild headquarters located atvarious spots on the map, which you can enterif you've paid your initial Guild dues at the beginning of each month(a wrinkle I will add at some future date). The payoffis there's usually a stockpile of gold, weapons, ammunition, and otherthings for people down on their luck. It's expected that you leavesomething inreturn, and I may enforce this rule via the software, or at least keepa log ofwho takes what, which is viewable by anyone in the guild, and leave it upto vigilante justice to rain down upon the leech from within the rankswhen s/he becomes greedy (while watching that player's Honor ratingplummet forattacking members of their own guild :). Both ideas are equally appealing. Thelatter is certainly more entertaining, though.Speaking of gold: as everyone knows, rivers are some of the richestplaces in the world, right? They've got banks on both sides. (dodges the tomatoes)While we're on the subject of banks, for when that hollow knot in theold oak tree just isn't big enough to store all your gains, ill-gottenor otherwise, and carrying them all around is just a big advertisement for "Hey, I'm rich, come mug me!" to either:
or our (in)famously greedy Dwarf who wandersaround in search of a wealthy victim
The Merchant's Annex on Level One ispleased to announce they now have a Guild-owned, FDIC-insured(Flathead, Dimwit,Idiot and Clodhopper) lending facility available to the general public.If you'rean evil thief, you may just want to moonight as a bank robber. [Insidetip:Let's just say the guards aren't paid very well. But if somehigh-powered magefinds you've been skimming gold off his account... *shrug* Don't say Ididn'twarn you. You may look cute with a horse's head.]If you're notpart of a Guild and can stand some higher-than-averageinterest rates, visit Vinney in the bar. He's just your typicalunderworld mob boss,good (enough) to people who respect him, not so good to those whodon't.Can't pay back a loan on time? No hard feelings. He'll just send anInvisibleStalker after you, one of the nastiest creatures in the dungeons, thelikes ofwhich most wizards even of the highest order have trouble with. Vinneyalsohas other connections, some of which he'll tell you about if you merit a certainlevel of trust. Such as his totally legitimate, above-board packagedeliverybusiness.(Hmm, I just made the package delivery business up to be funny, but nowthat people see it in print they'll expect it in the game... that wouldnever do. Just not sure how to implement it. I already thought ofVinney beingavailable for children's parties to be pretty funny. After all, the guy no doubtneeds somelevity in his life, ordering all these hits and stuff has gottabring a guy down eventually. I think he said he does balloon animalsand magictricks.)
[]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]
3. MENUS & SCREENSHOTS
A mock-up of my version, in 80 columns. After looking at this, yes,stuff is incomplete and missing. And other stuff is changing. Natch.
CONTROL-S or HOME pauses, any other key resumes. [/] or SPACE stops.
If you see a [More] prompt at the bottom of yoursscreen: SPACE continues, Q quits reading.
You may wish to capture this text for future reference.
"Totally AwesomeDungeon Adventure" - Command Summary (Dungeon Area)
WHO.....list of players
Tools IUse: During the forseeable future, the ANSI menu willlikely be the most up-to-date; TheDraw (an ANSI art editor) has this awesome block move feature that makes juggling menu commands a joy.
Rod Gasson's Browser 128 is handy for viewing the resulting work of art on my C128.
EditPad Profor Windows and Linux has similar features for plain textfiles. I can use it to update my ASCII screens too, or use Craig Bruce's ZED on it
.[]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]
5. RAMBLINGHaving gotten on to IRCa few years ago, I joined channel #c-64, and within the lastyear or so,#c64friends for Saturday night Commodore chat. It's been worth it.
Recently, between November 2006 and the beginning of 2007, I managed towrite an assembly language INSTRing routine which naturally operatesmuch more quickly than the BASIC version I wrote. There's a slight bugthough; it returns the position of the match in I% just fine, aftercalled thusly:10 SYS49152,"source string","match string"but it will return the lastposition of the match on a multiple-character match. Whoops! I guess I should be glad it works at all, numbskull that I am.I think rather than trying to code the %-style substitutions inassembly, I'll try for just a simple SEQ file reader to start, maybeadd word-wrap orpaging later on.What do I mean by %-style substitutions? Gleaned from bothDOS batch files and Internet MUCKs (an undeniably large part of my online time),they work something like this:
History | Features | Menus & Screenshots | Rambling | Design Notes | To-Do List | Mysteries | Download |
Substitution |
Expands to: |
%a (absolute) |
Name's, his, hers, its. |
%s (subjective) |
Name, he, she, it. |
%o (objective) |
Name, him, her, it. |
%p (possessive) |
Name's, his, her, its. |
%r (reflexive) |
Name, himself, herself, itself. |
%n (player's name) |
Name. |
There are some additional substitutions I thought of: |
|
%f (weapon's "sound effect") - |
THUNK, CLANG, etc. [based on weapon class] |
%h (horse's name) |
[Oh, I've been riding on a horse with no name...] |
%m (monster's name) |
|
%w (player's weapon) |
|
%1 (ally 1's name) |
And ad infinitum. Beats string-splicing and garbage-collection. Ergo, this:
%n swings %p %w at the %m! %F - %s hits!
The %m is vanquished!
could conceivably expand into something along these lines:
RATH swings his TWO-HANDED SWORD at the BASILISK! THUNK! - he hits! The
BASILISK is vanquished!
August 1, 2004
changed the terminology of "Builders" to "Architects." It sounds more "period."
TRACK will work on level 1-6, since maps are nice and square.
I've added MORE for controlling scrolling, hypothesizing this shouldbe separate from Expert Mode. Except it's not perfect, itdoesn't really countlines, it just gets called after a screen full of text(typically 25 lines)gets dumped onscreen. I don't have a counter that countswords and stuff.* I've thought long and hard about PUT <x> IN <y> and TAKE <x> FROM <y> commands... how else will you put things in saddlebags? GIVE<x> TO HORSEjust sounds kooky, unless you're feeding it.
· Also creating objects that can be "scenery"/"hidden",so you cancreate lookable objects, avoiding this pitfall (mostly itoffendsmy sense of style):
Walking down this wind-sweptcorridor (owing to the gaping hole in theroof), you noticeseveral piles of rubble which are neatly swept into conicalpiles off to the side of the main thoroughfare.
You see: RUBBLE, and PILES.
Um... sure gives away the EXAMINEable items, doesn't it?That's no fun.(Also, I hope someone can offer critique on my writing style. People onMUCKs say it's good.)I guess that'd be easy enough to do, thinking about it. This should usesome of the code and reasoning behind the HIDE command. Characters should beable to create scenery objects which may be hidden (EXAMINEable or LOOKable asdetails in the room), not showing up in the "Objects here are:" line. On theother hand, they may have a normal object (a dagger) they want tohide behind a bookcase. In a wide open area, there may not be anything to hide anobject under/behind/in. Should the room have a flag/scale for its "hidability"rating? Also maybe places where things can be hidden: under, behind, etc? Orshould that task fall to flags on the object - supporter (stand or set thingson), transparent (look in), container (put things in)... um, I'd have tolook up the rest of the flags from Graham Nelson's inform-fiction.org site, Ireally like that site.You know, I had to Google for "parts of speech" before I could think ofthe word "preposition"... sad.I'm thinking SEARCH would be a better "anti-action" than to enter HIDEagain to find hidden items. With DIG it makes sense to use a verb that worksboth ways, I guess.Thieves are good at searching for hidden stuff, of course. And theyhave a higher percentage of noticing things "out of the corner of their eye"if in "plain sight."And you should always be able to find your own stuff (so it's got to betagged with who hid it) unless your Intelligence is <5 let's say, justto throw some arbitrary restrictions in for laughs. Maybe enter HIDE BOOKCASE ifBOOKCASE is a scenery object. HIDE would list all HIDEable places in the room andlet you pick. I'm thinking DIG and HIDE should end up using the same index fileas to what's dug or hidden... it wouldn't make sense to have two files on theoff chance that someone had an item buried AND hidden in the same room...* Heck, I'd love the whole object tree notion, that of "modern" textadventures. How to implement it though is another story, atleast for me. Oh,and Z-machine 5-bit ZSCII. Yum. Encryption, andbetter-than-nothingcompression.* How about a LASTON command to see when your (most/least) favoritecharacterwas last awake?Whenever an object is RECYCLEd, it should go into a Lost and Found areaso as to have a "second chance" at getting it back if you mistakenly RECYCLE something you didn't want to. Maybe you get ten days or something,until it's irrevocably destroyed. That thought just popped into my head. And thereshould be a "free object slots" file, probably just a SEQ file, so the gamedoesn't have to search from object #1 each time someone CREATEs something. Orbetter yet, have record #1 of "e.t.objects" contain the next "free" record. Duh. Dang, the Aragain Falls area on Level 1 bugs me. I would like a"movealong" feature to "push" you through the rooms without giving you a chance toenter any commands... just be swept away by the water. Of course, the"entrance" square (forget which room at the moment) should check to see whetheryou're carrying the RUBBER DINGHY.. can't body-surf down it. I know, I spoil everyone's fun. Hey, did I ever make sure there's just one exit fromeach room as you fall downwards? Oh, maybe calling FLEE code would help? Maybehave a %- sub, %W, that waits a few seconds, like IMAGE BBS's £Wcommand? In that case, why not have one room with all the lines of the description of falling downwards? The world may never know.Can't forget Guild dues at the beginning of each month. Have an autopayplan? Almost mistyped that as "autopsy." :)Oratory skills! I finally have a use for the Auditorium. :) You get tobuild your skills (by going back there multiple times) in creating puppetcharacters, which could conceivably be used for entertainment, or providing cluesto parts of the game. One early concept was borrowed from Jeeves, a butler (I think he was a penguin?) on Brazilian Dreams, an online haven that is no more.Would be real simple:>SAYJEEVES, ANSWER PHONE
Jeeves reaches into his tuxedo-plumage and withdraws an old style hand-crankphone. "Hello?" he squawks into the receiver, cocking his head curiously at the caller on the other end of the line. "It's for you," he notes, winging thehandset in your direction.
[I'm not sure if you'd actually end up with the phone in your inventoryor not... it'd be kinda funny if you did. :)]Be pretty simple to implement. Could even be just a SEQ file. Maybeeven have a vocabulary command that lists all the stuff he responds to. Haveoperands in the file that mix replies, choosing random ones for variety. Make himrespond to particular characters. Three fictitious examples:(Character is RATH) >SAY JEEVES, HELLO JEEVES waves enthusiastically to his master! (Character is ROSE) >SAY JEEVES, HELLO JEEVES smiles brightly to his mistress, and kissesher hand. "Good %d, milady." [%d may translate into time of day, of which thereare six words used.] (Character is ARABELLA, a constant troublemaker inthe Brazillian Bistro) >SAY JEEVES, HELLO JEEVES looks nonplussed, his feathers ruffled."What do _you_ want?" he grouses, the last inkling of civility hiding somewhere between hisfeet, making the normally jovial Emperor penguin seem cold and distant. But perhapsthat's just a case of nature vs. nurture. >ORDER HAM AND EGGS (This brings to mind the idea of characters creating actionsother than those listed on any of the menus. In this case I'd assume there was a READMENU option available, and ORDERing something costs money - perhaps doublyso if you're a troublemaker...)-- oops, wait, ORDER conflicts with one of the main menu commands...PURCHASE, instead? BUY. Even better, shorter on the ol' fingerbones. JEEVES scowls, moving behind the oak-topped bar. "%N, mymaster has commanded me to be polite to his friends, but I do not feel you fall into thatcategory. Here's your slop. Now we have a really great shoo..." You get thefeeling he's not *exactly* quoting Ed Sulivan, before he starts whapping you withhis wings. "Beat it before I bite you!"It would be interesting to see whether puppet characters can give youreal items; perhaps they can use a separate index file, a smaller one... Anold man could give you a scroll with instructions for a quest, Jeeves abovecould wander off to another room when he gets tired of incessant actions,maybe even bring reinforcements ;) Probably be too hard to code though. It'd behilarious if Jeeves poisoned the ham and eggs :) []=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]Castle password, how's someone going to get that, and what's the goalof getting INTO the castle? So far it's just a boring place. Think, McFly,think...Well, geez, I'm bright, the solution to the "why Vinney vs the bank?Aren't they redundant?" question has been staring me in the face... becausethe bank ONLY caters to members of guilds! HOW long ago did I write that?Another case of "can't see the forest for the trees."Note to self: Self, considering the amount of work you have yet to do,let's not keep adding work, hmm? Okay, I guess I don't have to have every single feature for this release...
Haw haw. And I thought coding a file reader would beeasy... I've just about licked the %-sub problem. Chatted with FuzzyFox (he wrote AutoGraph) and he wondered why I doing DEYs all over the place...
I have this coded in BASIC already, mind you. It knows tolook up variables and such, whereas the ML routine... doesn't, and goes off into lala land whenit loses its place in the string. Solution? I'm sure it's to use a location other than $FB-$FF. LDA #$INDEX or some such. Fuzzy mentioned some routine that I was using clobbers one of those locations or the Y register or something. I need to look at the chat log. * is too hard-coded - it needs to know about BASIC variables. Thank goodness for an issue (not sure which one) of Loadstar's BITS columns, where Mike Maynard discusses how to retrieve values of strings in BASIC from ML. I bet you a plugged nickel this is the same routine the VARPTR routine I'm using is based on...So if I'd just sit down and try coding a bit... :) Ooh! Ooh! Here's an idea: %!p (the opposite gender for those flirtatious monster[ette]s)
or maybe just %P (capital) to make it easier to parse... dunno. I like
the !'s usefulness in signifying NOT. Of course this will make sense only with certain subs.
The %m flutters %p eyelashes at you."Gosh, er, hi, %N!"
The GNOME flutters her eyelashes at you."Gosh, er, hi, RATH!"
Waitasec, what am I thinking... too tired... %p should get set to thegender of the calling object... shouldn't it?How about making £ (the British pound sign) interchangeablewith %? Or instead adds More Neat Stuff(tm)? Dubious.End of transmission.
[]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=[]