--- /dev/null
+This is the source code of Lord Avalot d'Argent version 1.3,
+copyright (c) 1994-1995 by Mike, Mark and Thomas Thurman.
+It is released under the GNU GPL version 2.
+
+Special thanks to Mark Thurman for finding this source dump.
+
+Contact address: thomas@thurman.org.uk
+
+I hope to produce a version with more explanation later.
--- /dev/null
+First there was Avaricius... Then, over a thousand years later, there came...\r
+Lord ÄÄÄ-ÄÄ-Ä-Ä--Ä---ù--ù-ù ù ù ù ÜÜÛßßßÛÜÜ\r
+°±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°ÞÛÛݰ±±±°ÞÛÛ °±±±±±±±±±±±±±±±±±±±±±±°\r
+ ÜÜ ÜÜÜÜÜÜ ÜÜ ÛÛÛ ÞÛÝ\r
+ ßÛÛÛÜÜÛÛÜ ÛÛßßÛÛßÜÛÛÜÛÛÜ ßÛÛÛÜÜÛÛÜ ÜÜÜÛÛÜÜÜÜÜÜ ÜÜÛÛßÛÛÜÜ ÜÛÛßßÛÛßßÛÛÜ\r
+ ÜÛß ßÛÛÝ ÜÛÛ ß ÛÛ ß ÜÛß ßÛÛÝ ÜÜÜÛÛÜÜÜÜÜÜ ÛÛß ßÛÛ ÛÛ ÛÛ ÛÛ\r
+ ÛÛÝ ÞÛÛ ÞÛÛÝ ÛÛÜ ÛÛ ÞÛÛ ÛÛÝ ÛÛÛÛ ÛÛÛÛ ÛÛÛ ÛÛ ÛÛÛ\r
+ ÞÛÛßßßÜÜÛÛÝ ÞÛÛÝ ÛÛÛ ÞÛÛßßßÜÜÛÛÝ ÞÛÛ ÛÛÛÛ ÛÛÛÛ ß ÛÛ ß\r
+ ßÛÜ Ü ÛÛ ßÛÛ ÛÛ ßÛÜ Ü ÛÛ ÜÜÜÛÛÝ ÛÛÜ ÜÛÛ ÛÛ\r
+ßÛÜÛß ßÛÜßÛÜß ßÛÜÜÜÛÛßÛÜßÛÜÛß ßÛÜßÛÜßÛÛ ÜßÛÛÜÜÜ ßßÛÛÜÛÛßß ßÛÜßÛÜÜß\r
+°±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±° ßßß °±±° ßßßßßßßßß °±±±±±±±±±±±±±±±±±±°\r
+Version 1ú2 ÄÄ (c) April 1995 ù ù ù ù-ù--ù---Ä--Ä-Ä-ÄÄ-ÄÄÄ-ÄÄÄÄ d'Argent\r
+Mike, Mark and Thomas Thurman (A Medival Graphical Adventure Game)\r
+\r
+ Welcome to the game. If INSTALL.EXE didn't come with this archive, here's\r
+how to unpack the program so that you can begin playing:\r
+\r
+ i) Create a new directory to put Avalot into. (e.g. `MD \AVALOT')\r
+ ii) Move into that directory. (e.g. `CD \AVALOT')\r
+ iii) Run this program again from there, and press `Y'.\r
+\r
+ ONLY if you are at stage three now, press `Y' to start unpacking.\r
+Otherwise, press `N' now, and go through the steps above.\r
+\r
+ Good luck in the game! Unpack?ÿ\r
--- /dev/null
+program first_off;\r
+uses Crt,Dos;\r
+\r
+var\r
+ cols:array[1..7,1..3] of byte;\r
+ fv:byte;\r
+\r
+procedure adjust;\r
+var\r
+ r:registers;\r
+begin;\r
+ with r do\r
+ begin;\r
+ ax:=$1012;\r
+ bx:=1;\r
+ cx:=2;\r
+ es:=seg(cols);\r
+ dx:=ofs(cols);\r
+\r
+ end;\r
+\r
+ intr($10,r);\r
+end;\r
+\r
+begin;\r
+ textattr:=0;\r
+ clrscr;\r
+\r
+ fillchar(cols,sizeof(cols),#0);\r
+ adjust;\r
+\r
+ gotoxy(29,10); textattr:=1; write('Thorsoft of Letchworth');\r
+ gotoxy(36,12); textattr:=2; write('presents');\r
+\r
+ for fv:=1 to 77 do\r
+ begin;\r
+ delay(77);\r
+ if fv<64 then fillchar(cols[1],3,chr(fv));\r
+ if fv>14 then fillchar(cols[2],3,chr(fv-14));\r
+ adjust;\r
+ end;\r
+\r
+ delay(100);\r
+\r
+ for fv:=63 downto 1 do\r
+ begin;\r
+ fillchar(cols,sizeof(cols),chr(fv));\r
+ delay(37);\r
+ adjust;\r
+ end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+SOUND\r
+\10 Avalot supports Pro AudioSpectrums, SoundBlasters and\r
+ other sound cards, but in the setup program, you'll need\r
+ to say that you have one and give technical information \r
+ about it before Avalot can use it. If you don't, then \r
+ Avalot will only use the plain PC speaker.\r
+\r
+\10 There are several pieces of music in the game, all\r
+ composed or transcribed by Thomas Thurman:\r
+\r
+Title Composer When it is played\r
+""""" """""""" """""""""""""""""\r
+"Go to Joan Glover" Traditional When you read "The story\r
+ so far" off the main \r
+ menu\r
+\r
+"Home Sweet home" Traditional When you return to your\r
+ castle\r
+\r
+"The Avalot theme" T.Thurman When the credits come up\r
+ after the game is\r
+ loaded, and the main \r
+ menu.\r
+\r
+"King of the Boetians" When you die in the \r
+ game.\r
+\r
+\10 There are also several sound effects in the game.\r
+!\r
+Story\r
--- /dev/null
+{\r
+ ÛßÜ ÛßÜ ÜßßÜ ßÛß Ûßß Üß ßÛß ÜßÛßÜ ßÛß ÛÜ Û ÜÛßß ßÛß ÛßÜ Ûßß Û\r
+ Ûß ÛÛ Û Û Ü Û Ûßß ßÜ Û Û Û Û Û Û ÛÜÛ ßßßÜ Û ÛÛ Ûßß Û\r
+ ß ß ß ßß ßß ßßß ß ß ß ß ß ßßß ß ßß ßßß ß ß ß ßßß ßßß\r
+\r
+ ACCESS The temporary Sez handler. }\r
+\r
+unit Access;\r
+\r
+interface\r
+\r
+procedure dixi(p:char; n:byte);\r
+\r
+procedure talkto(whom:byte);\r
+\r
+implementation\r
+\r
+uses Gyro,Scrolls,Acci,Trip5,Lucerna;\r
+\r
+var int_say_went_OK:boolean;\r
+\r
+procedure int_say(filename:string; bubble:boolean);\r
+ { Internal use ONLY! }\r
+var f:file;\r
+begin;\r
+ {$I-}\r
+ assign(f,filename);\r
+ reset(f,1);\r
+ if ioresult<>0 then\r
+ begin;\r
+ int_say_went_OK:=false;\r
+ exit;\r
+ end;\r
+ bufsize:=filesize(f);\r
+ blockread(f,buffer,bufsize);\r
+ if bubble then\r
+ begin;\r
+ inc(bufsize);\r
+ buffer[bufsize]:=^B;\r
+ end;\r
+ close(f);\r
+ {$I+}\r
+\r
+ calldrivers;\r
+\r
+ int_say_went_OK:=true;\r
+end;\r
+\r
+procedure dixi(p:char; n:byte);\r
+begin; HALT(153);\r
+ int_say('s'+p+strf(n)+'.raw',false);\r
+end;\r
+\r
+procedure talkto(whom:byte);\r
+var\r
+ fv:byte;\r
+ no_matches:boolean;\r
+begin; HALT(153);\r
+ if person=pardon then\r
+ begin;\r
+ person:=chr(subjnumber);\r
+ subjnumber:=0;\r
+ end;\r
+\r
+ case chr(whom) of\r
+ pSpludwick:\r
+\r
+ if (dna.Lustie_is_asleep) and (not dna.obj[potion]) then\r
+ begin;\r
+ dixi('q',68);\r
+ dna.obj[potion]:=true;\r
+ objectlist; points(3); exit;\r
+ end else\r
+ begin;\r
+ if dna.Talked_To_Crapulus then\r
+ case dna.given2spludwick of { Spludwick - what does he need? }\r
+ { 0 - let it through to use normal routine. }\r
+ 1..2: begin;\r
+ display('Can you get me '+\r
+ get_better(spludwick_order[dna.given2spludwick])+', please?'+\r
+ ^s'2'^b);\r
+ exit;\r
+ end;\r
+ 3: begin;\r
+ dixi('q',30); { need any help with the game? }\r
+ exit;\r
+ end;\r
+ end\r
+ else dixi('q',42); { Haven't talked to Crapulus. Go and talk to him. }\r
+ end;\r
+\r
+ pIbythneth: if dna.GivenBadgeToIby then\r
+ begin;\r
+ dixi('q',33); { Thanks a lot! }\r
+ exit; { And leave the proc. }\r
+ end; { Or... just continue, 'cos he hasn't got it. }\r
+ pDogfood: if dna.WonNim then\r
+ begin; { We've won the game. }\r
+ dixi('q',6); { "I'm Not Playing!" }\r
+ exit; { Zap back. }\r
+ end;\r
+ pAyles: if not dna.Ayles_is_awake then\r
+ begin;\r
+ dixi('q',43); { He's fast asleep! }\r
+ exit;\r
+ end;\r
+ pGeida: if dna.Geida_given_potion then\r
+ dna.Geida_Follows:=true else\r
+ begin;\r
+ dixi('u',17);\r
+ exit;\r
+ end;\r
+ end;\r
+\r
+ if whom>149 then dec(whom,149);\r
+\r
+ no_matches:=true;\r
+ for fv:=1 to numtr do\r
+ if tr[fv].a.accinum=whom then\r
+ begin;\r
+ display(^S+chr(fv+48)+^D);\r
+ no_matches:=false;\r
+ break;\r
+ end;\r
+\r
+ if no_matches then display(^S^S^D);\r
+\r
+ if subjnumber=0 then { For the moment... later we'll parse "say". }\r
+ int_say('ss'+strf(whom)+'.raw',true)\r
+ else\r
+ begin;\r
+ int_say('ss'+strf(whom)+'-'+strf(subjnumber)+'.raw',true);\r
+ if not int_say_went_OK then { File not found! }\r
+ dixi('n',whom);\r
+ end;\r
+\r
+ case chr(whom+149) of\r
+ pCrapulus:\r
+ begin; { Crapulus: get the badge - first time only }\r
+ dna.obj[badge]:=true;\r
+ objectlist;\r
+ dixi('q',1); { Circular from Cardiff. }\r
+ dna.talked_to_Crapulus:=true;\r
+\r
+ whereis[pCrapulus]:=177; { Crapulus walks off. }\r
+\r
+ tr[2].VanishIfStill:=true;\r
+ tr[2].walkto(4); { Walks away. }\r
+\r
+ points(2);\r
+ end;\r
+\r
+ pAyles: dixi('q',44); { Can you get me a pen? }\r
+\r
+ end;\r
+end;\r
+\r
+end.\r
--- /dev/null
+{ $D-}\r
+{\r
+ ÛßÜ ÛßÜ ÜßßÜ ßÛß Ûßß Üß ßÛß ÜßÛßÜ ßÛß ÛÜ Û ÜÛßß ßÛß ÛßÜ Ûßß Û\r
+ Ûß ÛÛ Û Û Ü Û Ûßß ßÜ Û Û Û Û Û Û ÛÜÛ ßßßÜ Û ÛÛ Ûßß Û\r
+ ß ß ß ßß ßß ßßß ß ß ß ß ß ßßß ß ßß ßßß ß ß ß ßßß ßßß\r
+\r
+ ACCIDENCE II The parser. }\r
+unit acci;\r
+\r
+{$V-}\r
+\r
+interface\r
+\r
+const\r
+ { verb codes }\r
+ vb_exam = #1; vb_open = #2; vb_pause = #3; vb_get = #4; vb_drop = #5;\r
+ vb_inv = #6; vb_talk = #7; vb_give = #8; vb_drink = #9; vb_load = #10;\r
+ vb_save = #11; vb_pay = #12; vb_look = #13; vb_break = #14; vb_quit = #15;\r
+ vb_sit = #16; vb_stand = #17; vb_go = #18; vb_info = #19; vb_undress = #20;\r
+ vb_wear = #21; vb_play = #22; vb_ring = #23; vb_help = #24;\r
+ vb_larrypass = #25; vb_phaon = #26; vb_boss = #27; vb_pee = #28;\r
+ vb_cheat = #29; vb_magic = #30; vb_restart = #31; vb_eat = #32;\r
+ vb_listen = #33; vb_buy = #34; vb_attack = #35; vb_password = #36;\r
+ vb_dir = #37; vb_die = #38; vb_score = #39; vb_put = #40;\r
+ vb_kiss = #41; vb_climb = #42; vb_jump = #43; vb_highscores = #44;\r
+ vb_wake = #45; vb_hello = #46; vb_thanks = #47;\r
+\r
+ vb_smartalec = #249; vb_expletive = #253;\r
+\r
+ pardon = #254; { =didn't understand / wasn't given. }\r
+\r
+type\r
+ vocab = record\r
+ n:byte; w:string[11];\r
+ end;\r
+\r
+ ranktype = record\r
+ score:word; title:string[12];\r
+ end;\r
+\r
+\r
+const\r
+ nowords = 277; { how many words does the parser know? }\r
+ nowt = #250;\r
+ moved = #0; { This word was moved. (Usually because it was the subject of\r
+ conversation.) }\r
+\r
+ first_password = 89; { Words[first_password] should equal "TIROS". }\r
+\r
+ words : array[1..nowords] of vocab =\r
+\r
+{ Verbs, 1-49 }\r
+ ((n: 1; w:'EXAMINE'), (n: 1; w:'READ'), (n: 1; w:'XAM'), { short }\r
+ (n: 2; w:'OPEN'), (n: 2; w:'LEAVE'), (n: 2; w:'UNLOCK'),\r
+ (n: 3; w:'PAUSE'), (n: 47; w:'TA'), { Early to avoid Take and Talk. }\r
+ (n: 4; w:'TAKE'), (n: 4; w:'GET'), (n: 4; w:'PICK'),\r
+ (n: 5; w:'DROP'), (n: 6; w:'INVENTORY'), (n: 7; w:'TALK'),\r
+ (n: 7; w:'SAY'), (n: 7; w:'ASK'),\r
+ (n: 8; w:'GIVE'), (n: 9; w:'DRINK'), (n: 9; w:'IMBIBE'),\r
+ (n: 9; w:'DRAIN'), (n: 10; w:'LOAD'), (n: 10; w:'RESTORE'),\r
+ (n: 11; w:'SAVE'), (n: 12; w:'BRIBE'), (n: 12; w:'PAY'),\r
+ (n: 13; w:'LOOK'), (n: 14; w:'BREAK'), (n: 15; w:'QUIT'),\r
+ (n: 15; w:'EXIT'), (n: 16; w:'SIT'), (n: 16; w:'SLEEP'),\r
+ (n: 17; w:'STAND'),\r
+\r
+ (n: 18; w:'GO'), (n: 19; w:'INFO'), (n: 20; w:'UNDRESS'),\r
+ (n: 20; w:'DOFF'),\r
+ (n: 21; w:'DRESS'), (n: 21; w:'WEAR'), (n: 21; w:'DON'),\r
+ (n: 22; w:'PLAY'),\r
+ (n: 22; w:'STRUM'), (n: 23; w:'RING'), (n: 24; w:'HELP'),\r
+ (n: 25; w:'KENDAL'), (n: 26; w:'CAPYBARA'), (n: 27; w:'BOSS'),\r
+ (n:255;w:'NINET'), { block for NINETY }\r
+ (n: 28; w:'URINATE'), (n: 28; w:'MINGITE'), (n: 29; w:'NINETY'),\r
+ (n: 30;w:'ABRACADABRA'),(n: 30; w:'PLUGH'), (n: 30; w:'XYZZY'),\r
+ (n: 30; w:'HOCUS'), (n: 30; w:'POCUS'), (n: 30; w:'IZZY'),\r
+ (n: 30; w:'WIZZY'), (n: 30; w:'PLOVER'),\r
+ (n: 30;w:'MELENKURION'),(n: 30; w:'ZORTON'), (n: 30; w:'BLERBI'),\r
+ (n: 30; w:'THURB'), (n: 30; w:'SNOEZE'), (n: 30; w:'SAMOHT'),\r
+ (n: 30; w:'NOSIDE'), (n: 30; w:'PHUGGG'), (n: 30; w:'KNERL'),\r
+ (n: 30; w:'MAGIC'), (n: 30; w:'KLAETU'), (n: 30; w:'VODEL'),\r
+ (n: 30; w:'BONESCROLLS'),(n: 30; w:'RADOF'),\r
+\r
+ (n: 31; w:'RESTART'),\r
+ (n: 32; w:'SWALLOW'), (n: 32; w:'EAT'), (n: 33; w:'LISTEN'),\r
+ (n: 33; w:'HEAR'), (n: 34; w:'BUY'), (n: 34; w:'PURCHASE'),\r
+ (n: 34; w:'ORDER'), (n: 34; w:'DEMAND'),\r
+ (n: 35; w:'ATTACK'), (n: 35; w:'HIT'), (n: 35; w:'KILL'),\r
+ (n: 35; w:'PUNCH'), (n: 35; w:'KICK'), (n: 35; w:'SHOOT'),\r
+ (n: 35; w:'FIRE'),\r
+\r
+ { Passwords, 36: }\r
+\r
+ (n: 36; w:'TIROS'), (n: 36; w:'WORDY'), (n: 36; w:'STACK'),\r
+ (n: 36; w:'SHADOW'), (n: 36; w:'OWL'), (n: 36; w:'ACORN'),\r
+ (n: 36; w:'DOMESDAY'), (n: 36; w:'FLOPPY'), (n: 36; w:'DIODE'),\r
+ (n: 36; w:'FIELD'), (n: 36; w:'COWSLIP'), (n: 36; w:'OSBYTE'),\r
+ (n: 36; w:'OSCLI'), (n: 36; w:'TIMBER'), (n: 36; w:'ADVAL'),\r
+ (n: 36; w:'NEUTRON'), (n: 36; w:'POSITRON'), (n: 36; w:'ELECTRON'),\r
+ (n: 36; w:'CIRCUIT'), (n: 36; w:'AURUM'), (n: 36; w:'PETRIFY'),\r
+ (n: 36; w:'EBBY'), (n: 36; w:'CATAPULT'), (n: 36; w:'GAMERS'),\r
+ (n: 36; w:'FUDGE'), (n: 36; w:'CANDLE'), (n: 36; w:'BEEB'),\r
+ (n: 36; w:'MICRO'), (n: 36; w:'SESAME'), (n: 36; w:'LORDSHIP'),\r
+\r
+ (n: 37; w:'DIR'), (n: 37; w:'LS'), (n: 38; w:'DIE'),\r
+ (n: 39; w:'SCORE'),\r
+ (n: 40; w:'PUT'), (n: 40; w:'INSERT'), (n: 41; w:'KISS'),\r
+ (n: 41; w:'SNOG'), (n: 41; w:'CUDDLE'), (n: 42; w:'CLIMB'),\r
+ (n: 42; w:'CLAMBER'), (n: 43; w:'JUMP'), (n: 44; w:'HIGHSCORES'),\r
+ (n: 44; w:'HISCORES'), (n: 45; w:'WAKEN'), (n: 45; w:'AWAKEN'),\r
+ (n: 46; w:'HELLO'), (n: 46; w:'HI'), (n: 46; w:'YO'),\r
+ (n: 47; w:'THANKS'), { = 47, "ta", which was defined earlier. }\r
+\r
+\r
+{ Nouns - Objects: 50-100. }\r
+\r
+ (n: 50; w:'WINE'), (n: 50; w:'BOOZE'), (n: 50;w:'NASTY'),\r
+ (n: 50; w:'VINEGAR'), (n: 51; w:'MONEYBAG'),\r
+ (n: 51; w:'BAG'), (n: 51; w:'CASH'), (n: 51;w:'DOSH'),\r
+ (n: 51; w:'WALLET'),\r
+ (n: 52; w:'BODKIN'), (n: 52; w:'DAGGER'), (n: 53;w:'POTION'),\r
+ (n: 54; w:'CHASTITY'), (n: 54; w:'BELT'), (n: 55;w:'BOLT'),\r
+ (n: 55; w:'ARROW'), (n: 55; w:'DART'),\r
+ (n: 56; w:'CROSSBOW'), (n: 56; w:'BOW'), (n: 57;w:'LUTE'),\r
+ (n: 58; w:'PILGRIM'), (n: 58; w:'BADGE'), (n: 59;w:'MUSHROOMS'),\r
+ (n: 59; w:'TOADSTOOLS'),(n: 60; w:'KEY'), (n: 61;w:'BELL'),\r
+ (n: 62; w:'PRESCRIPT'), (n: 62; w:'SCROLL'), (n: 62;w:'MESSAGE'),\r
+ (n: 63; w:'PEN'), (n: 63; w:'QUILL'), (n: 64;w:'INK'),\r
+ (n: 64; w:'INKPOT'), (n: 65; w:'CLOTHES'), (n: 66;w:'HABIT'),\r
+ (n: 66; w:'DISGUISE'), (n: 67; w:'ONION'),\r
+\r
+ (n: 99;w:'PASSWORD'),\r
+\r
+{ Objects from Also are placed between 101 and 131. }\r
+\r
+{ Nouns - People - Male, 150-174 }\r
+ (n:150; w:'AVVY'), (n:150;w:'AVALOT'), (n:150;w:'YOURSELF'),\r
+ (n:150; w:'ME'), (n:150;w:'MYSELF'), (n:151;w:'SPLUDWICK'),\r
+ (n:151; w:'THOMAS'), (n:151;w:'ALCHEMIST'), (n:151;w:'CHEMIST'),\r
+ (n:152; w:'CRAPULUS'), (n:152;w:'SERF'), (n:152;w:'SLAVE'),\r
+ (n:158; w:'DU'), { <<< Put in early for Baron DU Lustie to save confusion with Duck & Duke.}\r
+ (n:152; w:'CRAPPY'), (n:153;w:'DUCK'), (n:153;w:'DOCTOR'),\r
+ (n:154; w:'MALAGAUCHE'),\r
+ (n:155; w:'FRIAR'), (n:155;w:'TUCK'), (n:156;w:'ROBIN'),\r
+ (n:156; w:'HOOD'), (n:157;w:'CWYTALOT'), (n:157;w:'GUARD'),\r
+ (n:157; w:'BRIDGEKEEP'),(n:158;w:'BARON'), (n:158;w:'LUSTIE'),\r
+ (n:159; w:'DUKE'), (n:159;w:'GRACE'), (n:160;w:'DOGFOOD'),\r
+ (n:160; w:'MINSTREL'), (n:161;w:'TRADER'), (n:161;w:'SHOPKEEPER'),\r
+ (n:161;w:'STALLHOLDER'),\r
+ (n:162; w:'PILGRIM'), (n:162;w:'IBYTHNETH'), (n:163;w:'ABBOT'),\r
+ (n:163; w:'AYLES'), (n:164;w:'PORT'), (n:165;w:'SPURGE'),\r
+ (n:166; w:'JACQUES'), (n:166;w:'SLEEPER'), (n:166;w:'RINGER'),\r
+\r
+{ Nouns- People - Female: 175-199 }\r
+ (n:175; w:'WIFE'), (n:175;w:'ARKATA'), (n:176;w:'GEDALODAVA'),\r
+ (n:176; w:'GEIDA'), (n:176;w:'PRINCESS'), (n:178;w:'WISE'),\r
+ (n:178; w:'WITCH'),\r
+\r
+{ Pronouns, 200-224 }\r
+ (n:200; w:'HIM'), (n:200;w:'MAN'), (n:200;w:'GUY'),\r
+ (n:200; w:'DUDE'), (n:200;w:'CHAP'), (n:200;w:'FELLOW'),\r
+ (n:201; w:'HER'), (n:201;w:'GIRL'), (n:201;w:'WOMAN'),\r
+ (n:202; w:'IT'), (n:202;w:'THING'),\r
+\r
+ (n:203;w:'MONK'), (n:204;w:'BARMAN'), (n:204;w:'BARTENDER'),\r
+\r
+{ Prepositions, 225-249 }\r
+ (n:225; w:'TO'), (n:226;w:'AT'), (n:227;w:'UP'),\r
+ (n:228; w:'INTO'), (n:228;w:'INSIDE'), (n:229;w:'OFF'),\r
+ (n:230; w:'UP'), (n:231;w:'DOWN'), (n:232;w:'ON'),\r
+\r
+\r
+{ Please, 251 }\r
+ (n:251; w:'PLEASE'),\r
+\r
+{ About, 252 }\r
+ (n:252; w:'ABOUT'), (n:252; w:'CONCERNING'),\r
+\r
+{ Swear words, 253 }\r
+ { I M P O R T A N T M E S S A G E\r
+\r
+ DO *NOT* READ THE LINES BELOW IF YOU ARE OF A SENSITIVE\r
+ DISPOSITION. THOMAS IS *NOT* RESPONSIBLE FOR THEM.\r
+ GOODNESS KNOWS WHO WROTE THEM.\r
+ READ THEM AT YOUR OWN RISK. BETTER STILL, DON'T READ THEM.\r
+ WHY ARE YOU SNOOPING AROUND IN MY PROGRAM, ANYWAY? }\r
+\r
+ (n:253; w:'SHIT'), (n:28 ;w:'PISS'), (n:28 ;w:'PEE'),\r
+ (n:253; w:'FART'), (n:253;w:'FUCK'), (n:253;w:'BALLS'),\r
+ (n:253; w:'BLAST'), (n:253;w:'BUGGER'), (n:253;w:'KNICKERS'),\r
+ (n:253; w:'BLOODY'), (n:253;w:'HELL'), (n:253;w:'DAMN'),\r
+ (n:253; w:'SMEG'),\r
+ { and other even ruder words. You didn't read them, did you? Good. }\r
+\r
+{ Answer-back smart-alec words, 249 }\r
+ (n:249; w:'YES'), (n:249;w:'NO'), (n:249;w:'BECAUSE'),\r
+\r
+{ Noise words, 255 }\r
+ (n:255; w:'THE'), (n:255;w:'A'), (n:255;w:'NOW'),\r
+ (n:255; w:'SOME'), (n:255;w:'AND'), (n:255;w:'THAT'),\r
+ (n:255; w:'POCUS'), (n:255;w:'HIS'), \r
+ (n:255; w:'THIS'), (n:255;w:'SENTINEL')); { for "Ken SENT Me" }\r
+\r
+ what = 'That''s not possible!';\r
+\r
+ const ranks: array[1..9] of ranktype =\r
+ ((score: 0; title: 'Beginner'), (score: 10; title: 'Novice'),\r
+ (score: 20; title: 'Improving'), (score: 35; title: 'Not bad'),\r
+ (score: 50; title: 'Passable'), (score: 65; title: 'Good'),\r
+ (score: 80; title: 'Experienced'), (score: 108; title: 'The BEST!'),\r
+ (score:maxint; title:'copyright''93'));\r
+\r
+var\r
+ thats:string[11];\r
+ unknown:string[20];\r
+ realwords:array[1..11] of string[20];\r
+ verb,person,thing,thing2:char;\r
+ polite:boolean;\r
+\r
+procedure clearwords;\r
+procedure parse;\r
+procedure lookaround;\r
+procedure opendoor;\r
+procedure do_that;\r
+procedure verbopt(n:char; var answer:string; var anskey:char);\r
+procedure have_a_drink;\r
+\r
+implementation\r
+uses Gyro,Lucerna,Scrolls,Pingo,Trip5,Visa,Enid,NimUnit,Timeout,Celer,\r
+ Highs,Helper,Sequence;\r
+\r
+var\r
+ fv:byte;\r
+\r
+function wordnum(x:string):string;\r
+var whatsit:char; fv:word; gotcha:boolean;\r
+\r
+ procedure checkword; { Checks word "fv". }\r
+ begin\r
+ with words[fv] do\r
+ begin\r
+ if (w=x) or ((copy(w,1,length(x))=x) and not gotcha)\r
+ then whatsit:=chr(n);\r
+ if w=x then gotcha:=true;\r
+ end;\r
+ end;\r
+\r
+begin\r
+ if x='' then begin wordnum:=''; exit; end;\r
+ whatsit:=pardon; gotcha:=false;\r
+ for fv:=nowords downto 1 do checkword;\r
+ wordnum:=whatsit;\r
+end;\r
+\r
+procedure replace(old1,new1:string);\r
+var q:byte;\r
+begin\r
+ q:=pos(old1,thats);\r
+ while q<>0 do\r
+ begin\r
+ thats:=copy(thats,1,q-1)+new1+copy(thats,q+length(old1),255);\r
+ q:=pos(old1,thats);\r
+ end;\r
+end;\r
+\r
+(*procedure ninetydump;\r
+var f:file; y:integer; bit:byte; a:byte absolute $A000:800;\r
+begin\r
+ off;\r
+ assign(f,'avvydump.avd');\r
+ rewrite(f,1);\r
+ blockwrite(f,dna,177); { just anything }\r
+ for bit:=0 to 3 do\r
+ begin\r
+ port[$3c4]:=2; port[$3ce]:=4; port[$3C5]:=1 shl bit; port[$3CF]:=bit;\r
+ blockwrite(f,a,12080);\r
+ end;\r
+ close(f); on;\r
+ display('Dumped.');\r
+end;*)\r
+\r
+function rank:string;\r
+var fv:byte;\r
+begin\r
+ for fv:=1 to 8 do\r
+ if (dna.score>=ranks[fv].score)\r
+ and (dna.score<ranks[fv+1].score) then\r
+ begin\r
+ rank:=ranks[fv].title;\r
+ exit;\r
+ end;\r
+end;\r
+\r
+function totaltime:string;\r
+const ticks_in_1_sec = 65535/3600;\r
+var\r
+ h,m,s:word; a:string[70];\r
+begin\r
+ { There are 65535 clock ticks in a second,\r
+ 1092.25 in a minute, and\r
+ 65535 in an hour. }\r
+ h:=trunc(dna.total_time/ticks_in_1_sec); { No. of seconds. }\r
+ m:=h mod 3600; h:=h div 3600;\r
+ s:=m mod 60; m:=m div 60;\r
+\r
+ a:='You''ve been playing for ';\r
+\r
+ if h>0 then a:=a+strf(h)+' hours, ';\r
+ if (m>0) or (h<>0) then a:=a+strf(m)+' minutes and ';\r
+ a:=a+strf(s)+' seconds.';\r
+\r
+ totaltime:=a;\r
+end;\r
+\r
+procedure cheatparse(codes:string);\r
+var cmd:char; num:word; se,sx,sy:integer; e:integer;\r
+ procedure number;\r
+ begin\r
+ val(codes,num,e);\r
+ end;\r
+begin\r
+ if not cheat then\r
+ begin { put them off the scent! }\r
+ display('Have you gone dotty??!');\r
+ exit;\r
+ end;\r
+ cmd:=upcase(codes[2]); delete(codes,1,2); { strip header }\r
+ display(^f'Ninety: '^r^d);\r
+ case cmd of\r
+ 'R': begin\r
+ number; if e<>0 then exit;\r
+ display('room swap to '+codes+'.');\r
+ fliproom(num,1);\r
+ end;\r
+ 'Z': begin zonk; display('Zonk OK!'); end;\r
+ 'W': begin wobble; display('Ow my head!'); end;\r
+ 'A': begin\r
+ tr[1].done;\r
+ tr[1].init(1,true);\r
+ dna.user_moves_avvy:=true;\r
+ alive:=true;\r
+ display('Reincat.');\r
+ end;\r
+ 'B': begin\r
+ sx:=tr[1].x;\r
+ sy:=tr[1].y;\r
+ se:=tr[1].face;\r
+ delavvy;\r
+ number;\r
+ with tr[1] do\r
+ begin\r
+ Done;\r
+ Init(num,true);\r
+ display('Become '+codes+':'+^m^m+a.name+^m+a.comment);\r
+ appear(sx,sy,se);\r
+ end;\r
+ end;\r
+(* 'D': ninetydump;*)\r
+ 'G': play_Nim;\r
+ '±': display(^s'2'^u);\r
+ else display('unknown code!');\r
+ end;\r
+end;\r
+\r
+procedure punctustrip(var x:string); { Strips punctuation from x. }\r
+const punct : string[32] = '~`!@#$%^&*()_+-={}[]:"|;''\,./<>?';\r
+var fv,p:byte;\r
+begin\r
+ for fv:=1 to 32 do\r
+ repeat\r
+ p:=pos(punct[fv],x);\r
+ if p=0 then break; { <<< The first time I've ever used it! }\r
+ delete(x,p,1);\r
+ until false;\r
+end;\r
+\r
+function do_pronouns:boolean;\r
+var fv:byte; ambiguous:boolean;\r
+ procedure displaywhat(ch:char; animate:boolean); { << it's an adjective! }\r
+ var ff:byte; z:string;\r
+ begin\r
+ if ch=pardon then\r
+ begin\r
+ ambiguous:=true;\r
+ if animate then display('Whom?') else display('What?');\r
+ end else\r
+ begin\r
+ if animate then display('{ '+getname(ch)+' }')\r
+ else\r
+ begin\r
+ z:=get_better(ch);\r
+ if z<>'' then display('{ '+z+' }');\r
+ end;\r
+ end;\r
+ end;\r
+begin\r
+ ambiguous:=false;\r
+ for fv:=1 to length(thats) do\r
+ case thats[fv] of\r
+ #200: begin\r
+ displaywhat(him,true);\r
+ thats[fv]:=him;\r
+ end;\r
+ #201: begin\r
+ displaywhat(her,true);\r
+ thats[fv]:=her;\r
+ end;\r
+ #202: begin\r
+ displaywhat(it,false);\r
+ thats[fv]:=it;\r
+ end;\r
+ end;\r
+ do_pronouns:=ambiguous;\r
+end;\r
+\r
+procedure store_interrogation(interrogation:byte);\r
+var fv:byte;\r
+\r
+ procedure lowercase;\r
+ var fv:byte;\r
+ begin\r
+ for fv:=1 to length(current) do\r
+ if current[fv] in ['A'..'Z'] then\r
+ inc(current[fv],32);\r
+ end;\r
+\r
+ procedure propernouns;\r
+ var fv:byte;\r
+ begin\r
+ lowercase;\r
+ for fv:=2 to length(current)-1 do\r
+ if current[fv]=' ' then\r
+ current[fv+1]:=upcase(current[fv+1]);\r
+ current[1]:=upcase(current[1]);\r
+ end;\r
+\r
+ procedure sayit; { This makes Avalot say the response. }\r
+ var x:string;\r
+ begin\r
+ x:=current; x[1]:=upcase(x[1]);\r
+ display(^s'1'+x+'.'+^b+^s+'2');\r
+ end;\r
+\r
+begin\r
+ if current='' then exit;\r
+\r
+ { Strip current: }\r
+ while (current[1]=' ') and (current<>'') do delete(current,1,1);\r
+ while (current[length(current)]=' ') and (current<>'') do dec(current[0]);\r
+\r
+ lose_timer(reason_CardiffSurvey); { if you want to use any other timer,\r
+ put this into the case statement. }\r
+ with dna do\r
+ case interrogation of\r
+ 1: begin\r
+ lowercase; sayit;\r
+ like2drink:=current;\r
+ dna.cardiff_things:=2;\r
+ end;\r
+ 2: begin\r
+ propernouns; sayit;\r
+ favourite_song:=current;\r
+ dna.cardiff_things:=3;\r
+ end;\r
+ 3: begin\r
+ propernouns; sayit;\r
+ worst_place_on_earth:=current;\r
+ dna.cardiff_things:=4;\r
+ end;\r
+ 4: begin\r
+ lowercase; sayit;\r
+ fillchar(spare_evening,sizeof(spare_evening),#177);\r
+ spare_evening:=current;\r
+ dixi('z',5); { His closing statement... }\r
+ tr[2].walkto(4); { The end of the drawbridge }\r
+ tr[2].VanishIfStill:=true; { Then go away! }\r
+ magics[2].op:=nix;\r
+ dna.cardiff_things:=5;\r
+ end;\r
+\r
+ 99: store_high(current);\r
+ end;\r
+ if interrogation<4 then Cardiff_survey;\r
+end;\r
+\r
+procedure clearwords;\r
+begin\r
+ fillchar(realwords,sizeof(realwords),#0);\r
+end;\r
+\r
+procedure parse;\r
+var n,fv,ff:byte; c,cc,thisword:string; answer:string[1]; notfound:boolean;\r
+begin\r
+ { first parsing - word identification }\r
+\r
+ thats:=''; c:=current+#32; n:=1; polite:=false;\r
+ verb:=pardon; thing:=pardon; thing2:=pardon; person:=pardon;\r
+ clearwords;\r
+ if current[1]='.' then\r
+ begin { a cheat mode attempt }\r
+ cheatparse(current); thats:=nowt; exit;\r
+ end; { not our department! Otherwise... }\r
+\r
+ { Are we being interrogated right now? }\r
+\r
+ if interrogation>0 then\r
+ begin\r
+ store_interrogation(interrogation);\r
+ weirdword:=true;\r
+ exit;\r
+ end;\r
+\r
+ cc:=c; for fv:=1 to length(c) do c[fv]:=upcase(c[fv]);\r
+ while c<>'' do\r
+ begin\r
+ while (c[1]=#32) and (c<>'') do\r
+ begin delete(c,1,1); delete(cc,1,1); end;\r
+ thisword:=copy(c,1,pos(#32,c)-1);\r
+ realwords[n]:=copy(cc,1,pos(#32,cc)-1);\r
+ punctustrip(c);\r
+\r
+ notfound:=true;\r
+\r
+ if thisword<>'' then\r
+ begin\r
+ for ff:=1 to 30 do\r
+ begin { Check Also, FIRST! }\r
+ if pos(','+thisword,also[ff,0]^)>0 then\r
+ begin\r
+ thats:=thats+chr(99+ff);\r
+ notfound:=false;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ if notfound then\r
+ begin\r
+ answer:=wordnum(thisword);\r
+ if answer=pardon then\r
+ begin\r
+ notfound:=true;\r
+ thats:=thats+pardon;\r
+ end else\r
+ thats:=thats+wordnum(thisword);\r
+ inc(n);\r
+ end;\r
+ delete(c,1,pos(#32,c)); delete(cc,1,pos(#32,cc));\r
+ end;\r
+\r
+ if pos(#254,thats)>0 then unknown:=realwords[pos(#254,thats)] else unknown:=''; replace(#255,''); { zap noise words }\r
+ replace(#13+#226,#1); { "look at" = "examine" }\r
+ replace(#13+#228,#1); { "look in" = "examine" }\r
+ replace(#4+#227,#17); { "get up" = "stand" }\r
+ replace(#4+#231,#17); { "get down" = "stand"... well, why not? }\r
+ replace(#18+#228,#2); { "go in" = "open [door]" }\r
+ replace(#28+#229,#253); { "P' off" is a swear word }\r
+ replace(#4+#6,#6); { "Take inventory" (remember Colossal Adventure?) }\r
+ replace(#40+#232,#21); { "put on" = "don" }\r
+ replace(#4+#229,#20); { "take off" = "doff" }\r
+\r
+ with dna do { Words that could mean more than one person }\r
+ begin\r
+ if room=r__NottsPub then replace(#204,#164) { Barman = Port }\r
+ else replace(#204,#154); { Barman = Malagauche }\r
+ case room of\r
+ r__AylesOffice: replace(#203,#163); { Monk = Ayles }\r
+ r__MusicRoom: replace(#203,#166); { Monk = Jacques }\r
+ else replace(#203,#162); { Monk = Ibythneth }\r
+ end;\r
+ end;\r
+\r
+ if do_pronouns then\r
+ begin\r
+ weirdword:=true;\r
+ thats:=nowt;\r
+ exit;\r
+ end;\r
+\r
+ { second parsing - accidence }\r
+\r
+ subject:=''; subjnumber:=0; { Find subject of conversation. }\r
+ for fv:=1 to 11 do\r
+ if realwords[fv,1] in ['`',''''] then\r
+ begin\r
+ subjnumber:=ord(thats[fv]);\r
+ thats[fv]:=moved;\r
+ break; { Only the second time I've used that! }\r
+ end;\r
+ if subjnumber=0 then { Still not found. }\r
+ for fv:=1 to 10 do\r
+ if thats[fv]=#252 then { the word is "about", or something similar }\r
+ begin\r
+ subjnumber:=ord(thats[fv+1]);\r
+ thats[fv+1]:=#0;\r
+ break; { ...Third! }\r
+ end;\r
+ if subjnumber=0 then { STILL not found! Must be the word after "say". }\r
+ for fv:=1 to 10 do\r
+ if (thats[fv]=#7) and not (thats[fv+1] in [#0,#225..#229]) then\r
+ begin { SAY not followed by a preposition }\r
+ subjnumber:=ord(thats[fv+1]);\r
+ thats[fv+1]:=#0;\r
+ break; { ...Fourth! }\r
+ end;\r
+\r
+ for fv:=length(thats) downto 1 do { Reverse order- so first'll be used }\r
+ case thats[fv] of\r
+ #1..#49,#253,#249: verb:=thats[fv];\r
+ #50..#149: begin thing2:=thing; thing:=thats[fv]; end;\r
+ #150..#199: person:=thats[fv];\r
+ #251: polite:=true;\r
+ end;\r
+\r
+ if (unknown<>'') and not\r
+ (verb in [vb_exam,vb_talk,vb_save,vb_load,vb_dir]) then\r
+ begin\r
+ display('Sorry, but I have no idea what `'+unknown+\r
+ '" means. Can you rephrase it?');\r
+ weirdword:=true;\r
+ end else weirdword:=false;\r
+ if thats='' then thats:=nowt;\r
+\r
+ if thing<>pardon then it:=thing;\r
+ if person<>pardon then\r
+ begin\r
+ if person<#175 then him:=person else her:=person;\r
+ end;\r
+end;\r
+\r
+procedure examobj; { Examine a standard object-thing }\r
+begin\r
+ if thing<>thinks then thinkabout(thing,a_thing);\r
+ with dna do\r
+ case thing of\r
+ wine : case winestate of\r
+ { 4 is perfect wine. 0 is not holding the wine. }\r
+ 1: dixi('t',1); { Normal examine wine scroll }\r
+ 2: dixi('d',6); { Bad wine }\r
+ 3: dixi('d',7); { Vinegar }\r
+ end;\r
+ onion: if rotten_onion then\r
+ dixi('q',21) { Yucky onion. }\r
+ else\r
+ dixi('t',18); { Normal onion scroll }\r
+ else\r
+ dixi('t',ord(thing)); { <<< Ordinarily }\r
+ end;\r
+end;\r
+\r
+function personshere:boolean; { Person equivalent of "holding" }\r
+begin\r
+ if (person=pardon) or (person=#0)\r
+ or (whereis[person]=dna.room) then personshere:=true\r
+ else begin\r
+ if person<#175 then display('H'^d) else display('Sh'^d);\r
+ display('e isn''t around at the moment.');\r
+ personshere:=false;\r
+ end;\r
+end;\r
+\r
+procedure exampers;\r
+begin\r
+ if personshere then\r
+ begin\r
+ if thing<>thinks then thinkabout(person,a_person);\r
+ dec(person,149);\r
+ with dna do\r
+ case person of { Special cases }\r
+ #11: if wonNim then\r
+ begin\r
+ dixi('Q',8); { "I'm Not Playing!" }\r
+ exit;\r
+ end;\r
+ #9: if Lustie_is_asleep then\r
+ begin dixi('Q',65); { He's asleep. (65! Wow!) } exit; end;\r
+ end;\r
+ { Otherwise... } dixi('p',ord(person));\r
+ end; { And afterwards... }\r
+ case person of\r
+ #14: if not dna.Ayles_is_awake then dixi('Q',13); { u.f.s.? }\r
+ end;\r
+end;\r
+\r
+function holding:boolean;\r
+begin\r
+ if thing in [#51..#99] then begin holding:=true; exit; end; { Also }\r
+ holding:=false;\r
+ if thing>#100 then display('Be reasonable!') else\r
+ if not dna.obj[thing] then { verbs that need "thing" to be in the inventory }\r
+ display('You''re not holding it, Avvy.') else\r
+ holding:=true;\r
+end;\r
+\r
+procedure examine;\r
+ procedure special(before:boolean);\r
+ begin\r
+ case dna.room of\r
+ r__Yours: case thing of\r
+ #54: if before then show_one(5) else show_one(6);\r
+ end;\r
+ end;\r
+ end;\r
+begin\r
+ { Examine. EITHER it's an object OR it's an Also OR it's a person OR\r
+ it's something else. }\r
+ if (person=pardon) and (thing<>pardon) then\r
+ begin\r
+ if holding then\r
+ case thing of { remember it's been Slipped- ie subtract 49 }\r
+ #1..#49 : examobj; { Standard object }\r
+ #50..#100 : begin\r
+ special(true);\r
+ display(also[ord(thing)-50,1]^); { Also thing }\r
+ special(false);\r
+ end;\r
+ end\r
+ end else\r
+ if (person<>pardon) then exampers\r
+ else display('It''s just as it looks on the picture.'); { don't know- guess }\r
+end;\r
+\r
+procedure inv; { the time-honoured command... }\r
+var fv:char; q:byte;\r
+begin\r
+ q:=0; display('You''re carrying '+^d);\r
+ with dna do\r
+ begin\r
+ for fv:=#1 to numobjs do\r
+ if obj[fv] then\r
+ begin\r
+ inc(q); if q=carrying then display('and '+^d);\r
+ display(get_better(fv)+^d);\r
+ if fv=wearing then display(', which you''re wearing'+^d);\r
+ if q<carrying then display(', '+^d);\r
+ end;\r
+ if wearing=nowt then display('...'^m^m'...and you''re stark naked!') else\r
+ display('.');\r
+ end;\r
+end;\r
+\r
+procedure swallow; { Eat something. }\r
+begin\r
+ case thing of\r
+ wine: case dna.winestate of\r
+ { 4 is perfect }\r
+ 1: begin\r
+ if dna.teetotal then begin dixi('D',6); exit; end;\r
+ dixi('U',1); wobble; dixi('U',2);\r
+ dna.obj[wine]:=false; objectlist;\r
+ have_a_drink;\r
+ end;\r
+ 2,3: dixi('d',8); { You can't drink it! }\r
+ end;\r
+ potion: begin background(4); dixi('U',3); gameover; background(0); end;\r
+ ink: dixi('U',4);\r
+ chastity: dixi('U',5);\r
+ mushroom: begin\r
+ dixi('U',6);\r
+ gameover;\r
+ end;\r
+ onion: if dna.rotten_onion then dixi('U',11)\r
+ else begin\r
+ dixi('U',8);\r
+ dna.obj[onion]:=false;\r
+ objectlist;\r
+ end;\r
+ else\r
+ if dna.room in [r__ArgentPub,r__NottsPub] then\r
+ display('Try BUYing things before you drink them!')\r
+ else\r
+ display('The taste of it makes you retch!');\r
+ { Constant- leave this one }\r
+ end;\r
+end;\r
+\r
+procedure others;\r
+ { This lists the other people in the room. }\r
+var\r
+ fv:char;\r
+ num_people,this_person,here:byte;\r
+begin\r
+\r
+ num_people:=0;\r
+ this_person:=0;\r
+ here:=dna.room;\r
+\r
+ for fv:=#151 to #178 do { Start at 151 so we don't list Avvy himself! }\r
+ if whereis[fv]=here then\r
+ inc(num_people);\r
+\r
+ { If nobody's here, we can cut out straight away. }\r
+\r
+ if num_people=0 then exit; { Leave the procedure. }\r
+\r
+ for fv:=#151 to #178 do\r
+ if whereis[fv]=here then\r
+ begin\r
+ inc(this_person);\r
+ if this_person=1 then { First on the list. }\r
+ display(getname(fv)+^d) else\r
+ if this_person<num_people then { The middle... }\r
+ display(', '+getname(fv)+^d) else\r
+ display(' and '+getname(fv)+^d); { The end. }\r
+ end;\r
+\r
+ if num_people=1 then display(' is'^d) else display(' are'^d);\r
+\r
+ display(' here.'); { End and display it. }\r
+end;\r
+\r
+procedure lookaround;\r
+{ This is called when you say "look." }\r
+begin\r
+ display(also[0,1]^);\r
+ case dna.room of\r
+ r__Spludwicks: if dna.Avaricius_talk>0 then dixi('q',23) else others;\r
+ r__Robins: begin\r
+ if dna.tied_up then dixi('q',38);\r
+ if dna.Mushroom_Growing then dixi('q',55);\r
+ end;\r
+ r__InsideCardiffCastle: if not dna.taken_pen then dixi('q',49);\r
+ r__LustiesRoom: if dna.Lustie_is_asleep then dixi('q',65);\r
+ r__Catacombs: case (dna.cat_y*256+dna.cat_x) of\r
+ 258 : dixi('q',80); { Inside art gallery }\r
+ 514 : dixi('q',81); { Outside ditto }\r
+ 260 : dixi('q',82); { Outside Geida's room. }\r
+ end;\r
+ else others;\r
+ end;\r
+end;\r
+\r
+procedure opendoor; { so whaddya THINK this does?! }\r
+var fv:byte;\r
+begin\r
+ case dna.room of { Special cases. }\r
+ r__Yours: if infield(2) then\r
+ begin { Opening the box. }\r
+ thing:=#54; { The box. } person:=pardon;\r
+ examine;\r
+ exit;\r
+ end;\r
+ r__Spludwicks: if thing=#61 then begin\r
+ dixi('q',85);\r
+ exit;\r
+ end;\r
+ end;\r
+\r
+\r
+ if (not dna.user_moves_Avvy) and (dna.room<>r__Lusties)\r
+ then exit; { No doors can open if you can't move Avvy. }\r
+ for fv:=9 to 15 do\r
+ if infield(fv) then\r
+ begin\r
+ with portals[fv] do\r
+ case op of\r
+ exclaim: begin tr[1].bounce; dixi('x',data); end;\r
+ transport: fliproom(hi(data),lo(data));\r
+ unfinished: begin\r
+ tr[1].bounce;\r
+ display(#7'Sorry.'^c^m'This place is not available yet!');\r
+ end;\r
+ special: call_special(data);\r
+ Mopendoor: open_the_door(hi(data),lo(data),fv);\r
+ end;\r
+ exit;\r
+ end;\r
+ if dna.room=r__Map then\r
+ display('Avvy, you can complete the whole game without ever going '+\r
+ 'to anywhere other than Argent, Birmingham, Cardiff, '+\r
+ 'Nottingham and Norwich.')\r
+ else display('Door? What door?');\r
+end;\r
+\r
+procedure putproc; { Called when you call vb_put. }\r
+var temp:char;\r
+\r
+ procedure silly;\r
+ begin\r
+ display('Don''t be silly!');\r
+ end;\r
+\r
+begin\r
+ if not holding then exit;\r
+ dec(thing2,49); { Slip the second object }\r
+ temp:=thing; thing:=thing2; if not holding then exit;\r
+ thing:=temp;\r
+\r
+ { Thing is the thing which you're putting in. Thing2 is where you're\r
+ putting it. }\r
+ with dna do { Convenience thing. }\r
+ case thing2 of\r
+ wine: if thing=onion then\r
+ begin\r
+ if dna.rotten_onion then\r
+ display('That''s a bit like shutting the stable door after the '+\r
+ 'horse has bolted!')\r
+ else begin { Put onion into wine? }\r
+ if dna.winestate<>3 then\r
+ display(^f'Oignon au vin'^r' is a bit too strong for your tastes!')\r
+ else begin { Put onion into vinegar! Yes! }\r
+ onion_in_vinegar:=true;\r
+ points(7);\r
+ dixi('u',9);\r
+ end;\r
+ end;\r
+ end else silly;\r
+\r
+ #54: if (room=1) then { Put something into the box. }\r
+ begin\r
+ if box_contents<>nowt then\r
+ display('There''s something in the box already, Avvy. Try taking'+\r
+ ' that out first.')\r
+ else\r
+ case thing of\r
+ money: display('You''d better keep some ready cash on you!');\r
+ bell: display('That''s a silly place to keep a bell.');\r
+ bodkin: display('But you might need it!');\r
+ onion: display('Just give it to Spludwick, Avvy!');\r
+ else\r
+ begin { Put the object into the box... }\r
+ if wearing=thing then\r
+ display('You''d better take '+get_better(thing)+' off first!')\r
+ else\r
+ begin\r
+ show_one(5); { Open box. }\r
+ box_contents:=thing;\r
+ dna.obj[thing]:=false;\r
+ objectlist;\r
+ display('OK, it''s in the box.');\r
+ show_one(6); { Shut box. }\r
+ end;\r
+ end;\r
+ end;\r
+ end else silly;\r
+\r
+ else silly;\r
+ end;\r
+end;\r
+\r
+function give2spludwick:boolean;\r
+ { The result of this fn is whether or not he says "Hey, thanks!" }\r
+ procedure not_in_order;\r
+ begin\r
+ display('Sorry, I need the ingredients in the right order for this potion.'+\r
+ ' What I need next is '+\r
+ get_better(spludwick_order[dna.given2spludwick])+'.'^s'2'^b);\r
+ end;\r
+\r
+ procedure go_to_cauldron;\r
+ begin\r
+ tr[2].call_Eachstep:=false; { Stops Geida_Procs. }\r
+ set_up_timer(1,PROCSpludwick_goes_to_cauldron,reason_Spludwalk);\r
+ tr[2].walkto(2);\r
+ end;\r
+\r
+begin\r
+ with dna do\r
+ begin\r
+\r
+ give2spludwick:=false;\r
+\r
+ if spludwick_order[given2spludwick]<>thing then\r
+ begin\r
+ not_in_order;\r
+ exit;\r
+ end;\r
+\r
+ case thing of\r
+ onion:\r
+ begin\r
+ obj[onion]:=false;\r
+ if rotten_onion then\r
+ dixi('q',22)\r
+ else begin\r
+ inc(given2spludwick);\r
+ dixi('q',20);\r
+ go_to_cauldron;\r
+ points(3);\r
+ end;\r
+ objectlist;\r
+ end;\r
+ ink: begin\r
+ obj[ink]:=false;\r
+ objectlist;\r
+ inc(given2spludwick);\r
+ dixi('q',24);\r
+ go_to_cauldron;\r
+ points(3);\r
+ end;\r
+ mushroom: begin\r
+ obj[mushroom]:=false;\r
+ dixi('q',25);\r
+ points(5);\r
+ inc(given2spludwick);\r
+ go_to_cauldron;\r
+ obj[potion]:=true;\r
+ objectlist;\r
+ end;\r
+ else give2spludwick:=true;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure have_a_drink;\r
+begin\r
+ with dna do\r
+ begin\r
+ inc(alcohol);\r
+ if alcohol=5 then\r
+ begin\r
+ obj[key]:=true; { Get the key. }\r
+ teetotal:=true;\r
+ Avvy_is_awake:=false;\r
+ Avvy_in_bed:=true;\r
+ objectlist;\r
+ dusk;\r
+ hang_around_for_a_while;\r
+ fliproom(1,1);\r
+ background(14);\r
+ new_game_for_trippancy; { Not really }\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure Cardiff_climbing;\r
+begin\r
+ if dna.Standing_On_Dais then\r
+ begin { Clamber up. }\r
+ display('You climb down, back onto the floor.');\r
+ dna.Standing_On_Dais:=false;\r
+ apped(1,3);\r
+ end else\r
+ begin { Clamber down. }\r
+ if infield(1) then\r
+ begin\r
+ display('You clamber up onto the dais.');\r
+ dna.Standing_On_Dais:=true;\r
+ apped(1,2);\r
+ end else\r
+ display('Get a bit closer, Avvy.');\r
+ end;\r
+end;\r
+\r
+procedure stand_up;\r
+ { Called when you ask Avvy to stand. }\r
+ procedure already;\r
+ begin\r
+ display('You''re already standing!');\r
+ end;\r
+begin\r
+ with dna do\r
+ case dna.room of\r
+ r__Yours: { Avvy isn't asleep. }\r
+ if Avvy_in_bed then { But he's in bed. }\r
+ begin\r
+ if teetotal then\r
+ begin\r
+ dixi('d',12);\r
+ background(0);\r
+ dixi('d',14);\r
+ end;\r
+ tr[1].visible:=true;\r
+ user_moves_Avvy:=true;\r
+ apped(1,2);\r
+ dna.rw:=left;\r
+ show_one(4); { Picture of empty pillow. }\r
+ points(1);\r
+ Avvy_in_bed:=false;\r
+ lose_timer(reason_Arkata_shouts);\r
+ end else already;\r
+\r
+ r__InsideCardiffCastle: Cardiff_climbing;\r
+\r
+ r__NottsPub: if sitting_in_pub then begin\r
+ show_one(4); { Not sitting down. }\r
+ tr[1].visible:=true; { But standing up. }\r
+ apped(1,4); { And walking away. }\r
+ sitting_in_pub:=false; { Really not sitting down. }\r
+ user_moves_Avvy:=true; { And ambulant. }\r
+ end else already;\r
+ else already;\r
+ end;\r
+end;\r
+\r
+procedure getproc(thing:char);\r
+begin\r
+ with dna do\r
+ case room of\r
+ r__Yours:\r
+ if infield(2) then\r
+ begin\r
+ if box_contents=thing then\r
+ begin\r
+ show_one(5);\r
+ display('OK, I''ve got it.');\r
+ obj[thing]:=true; objectlist;\r
+ box_contents:=nowt;\r
+ show_one(6);\r
+ end else\r
+ display('I can''t see '+get_better(thing)+' in the box.');\r
+ end else dixi('q',57);\r
+ r__InsideCardiffCastle:\r
+ case thing of\r
+ pen:\r
+ begin\r
+ if infield(2) then\r
+ begin { Standing on the dais. }\r
+\r
+ if dna.taken_pen then\r
+ display('It''s not there, Avvy.')\r
+ else\r
+ begin { OK: we're taking the pen, and it's there. }\r
+ show_one(4); { No pen there now. }\r
+ call_special(3); { Zap! }\r
+ dna.taken_pen:=true;\r
+ dna.obj[pen]:=true;\r
+ objectlist;\r
+ display('Taken.');\r
+ end;\r
+ end else if dna.Standing_on_dais then dixi('q',53) else dixi('q',51);\r
+ end;\r
+ bolt: dixi('q',52);\r
+ else dixi('q',57)\r
+ end;\r
+ r__Robins: if (thing=Mushroom) and (infield(1)) and (dna.Mushroom_Growing)\r
+ then begin\r
+ show_one(3);\r
+ display('Got it!');\r
+ dna.Mushroom_Growing:=false;\r
+ dna.Taken_Mushroom:=true;\r
+ dna.obj[mushroom]:=true;\r
+ objectlist;\r
+ points(3);\r
+ end else dixi('q',57)\r
+ else dixi('q',57)\r
+ end;\r
+end;\r
+\r
+procedure give_Geida_the_lute;\r
+begin\r
+ with dna do\r
+ begin\r
+ if room<>r__LustiesRoom then\r
+ begin\r
+ display('Not yet. Try later!'^s'2'^b);\r
+ exit;\r
+ end;\r
+ dna.obj[lute]:=false;\r
+ objectlist;\r
+ dixi('q',64); { She plays it. }\r
+\r
+ { And the rest has been moved to Timeout... under give_lute_to_Geida. }\r
+\r
+ set_up_timer(1,PROCgive_lute_to_Geida,reason_Geida_sings);\r
+ back_to_bootstrap(4);\r
+ end;\r
+end;\r
+\r
+procedure play_harp;\r
+begin\r
+ if infield(7) then\r
+ musical_scroll\r
+ else display('Get a bit closer to it, Avvy!');\r
+end;\r
+\r
+procedure winsequence;\r
+begin\r
+ dixi('q',78);\r
+ first_show(7); then_show(8); then_show(9);\r
+ start_to_close;\r
+ set_up_timer(30,PROCwinning,reason_winning);\r
+end;\r
+\r
+procedure person_speaks;\r
+var found:boolean; fv:byte; cfv:char;\r
+begin\r
+\r
+ if (person=pardon) or (person=#0) then\r
+ begin\r
+ if (him=pardon) or (whereis[him]<>dna.room) then person:=her\r
+ else person:=him;\r
+ end;\r
+\r
+ if (whereis[person]<>dna.room) then\r
+ begin\r
+ display(^s'1'^d); { Avvy himself! }\r
+ exit;\r
+ end;\r
+\r
+ found:=false; { The person we're looking for's code is in Person. }\r
+\r
+ for fv:=1 to numtr do\r
+ if tr[fv].quick and (chr(tr[fv].a.accinum+149)=person) then\r
+ begin\r
+ display(^s+chr(fv+48)+^d);\r
+ found:=true;\r
+ end;\r
+\r
+ if not found then\r
+ for fv:=10 to 25 do\r
+ with quasipeds[fv] do\r
+ if (who=person) and (room=dna.room) then\r
+ begin\r
+ display(^s+chr(fv+55)+^d);\r
+ end;\r
+end;\r
+\r
+procedure do_that;\r
+const booze: array[#51..#58] of string[6] = ('Bitter','GIED','Whisky','Cider','','','','Mead');\r
+var fv,ff:byte; sx,sy:integer; ok:boolean;\r
+ procedure heythanks;\r
+ begin\r
+ person_speaks;\r
+ display('Hey, thanks!'^b'(But now, you''ve lost it!)');\r
+ dna.obj[thing]:=false;\r
+ end;\r
+\r
+begin\r
+ if thats=nowt then begin thats:=''; exit; end;\r
+ if weirdword then exit;\r
+ if thing<#200 then dec(thing,49); { "Slip" }\r
+\r
+ if (not alive) and\r
+ not (verb in [vb_load,vb_save,vb_quit,vb_info,vb_help,vb_larrypass,\r
+ vb_phaon,vb_boss,vb_cheat,vb_restart,vb_dir,vb_score,\r
+ vb_highscores,vb_smartalec])\r
+ then begin\r
+ display('You''re dead, so don''t talk. What are you, a ghost '+\r
+ 'or something? Try restarting, or restoring a saved game!'); exit;\r
+ end;\r
+\r
+ if (not dna.Avvy_is_awake) and\r
+ not (verb in [vb_load,vb_save,vb_quit,vb_info,vb_help,vb_larrypass,\r
+ vb_phaon,vb_boss,vb_cheat,vb_restart,vb_dir,vb_die,vb_score,\r
+ vb_highscores,vb_smartalec,vb_expletive,vb_wake])\r
+ then begin\r
+ display('Talking in your sleep? Try waking up!'); exit;\r
+ end;\r
+\r
+\r
+ case verb of\r
+ vb_exam: examine;\r
+ vb_open: opendoor;\r
+ vb_pause: display('Game paused.'+^c+^m+^m+'Press Enter, Esc, or click '+\r
+ 'the mouse on the `O.K." box to continue.');\r
+ vb_get: begin\r
+ if thing<>pardon then\r
+ begin { Legitimate try to pick something up. }\r
+ if dna.carrying>=maxobjs then display('You can''t carry any more!')\r
+ else getproc(thing);\r
+ \r
+ end else\r
+ begin { Not... ditto. }\r
+ if person<>pardon then\r
+ display('You can''t sweep folk off their feet!') else\r
+ display('I assure you, you don''t need it.');\r
+ end;\r
+ end;\r
+ vb_drop: display('Two years ago you dropped a florin in the street. Three days '+\r
+ 'later it was gone! So now you never leave ANYTHING lying around. OK?');\r
+(* begin dna.obj[thing]:=false; objectlist; end;*)\r
+ vb_inv: inv;\r
+ vb_talk: if person=pardon then\r
+ begin\r
+ if subjnumber=99 then { They typed "say password". }\r
+ display('Yes, but what '^f'is'^r' the password?')\r
+ else if (subjnumber in [1..49,253,249]) then\r
+ begin\r
+ delete(thats,1,1);\r
+ move(realwords[2],realwords[1],sizeof(realwords)-sizeof(realwords[1]));\r
+ verb:=chr(subjnumber);\r
+ do_that; exit;\r
+ end else\r
+ begin\r
+ person:=chr(subjnumber); subjnumber:=0;\r
+ if person in [pardon,#0] then display('Talk to whom?')\r
+ else if (personshere) then talkto(ord(person));\r
+ end;\r
+ end else if person=pardon then display('Talk to whom?')\r
+ else if (personshere) then talkto(ord(person));\r
+\r
+ vb_give: if holding then\r
+ begin\r
+ if person=pardon then display('Give to whom?') else\r
+ if personshere then\r
+ begin\r
+ case thing of\r
+ money : display('You can''t bring yourself to give away your moneybag.');\r
+ bodkin,bell,clothes,habit :\r
+ display('Don''t give it away, it might be useful!');\r
+ else case person of\r
+ pCrapulus: case thing of\r
+ wine: begin\r
+ display('Crapulus grabs the wine and gulps it down.');\r
+ dna.obj[wine]:=false;\r
+ end;\r
+ else heythanks;\r
+ end;\r
+ pCwytalot: if thing in [crossbow,bolt] then\r
+ display('You might be able to influence '+\r
+ 'Cwytalot more if you used it!')\r
+ else heythanks;\r
+ pSpludwick: if give2spludwick then heythanks;\r
+ pIbythneth: if thing=badge then\r
+ begin\r
+ dixi('q',32); { Thanks! Wow! }\r
+ points(3);\r
+ dna.obj[badge]:=false;\r
+ dna.obj[habit]:=true;\r
+ dna.GivenBadgeToIby:=true;\r
+ show_one(8); show_one(9);\r
+ end else heythanks;\r
+ pAyles: if dna.Ayles_is_awake then\r
+ begin\r
+ if thing=pen then\r
+ begin\r
+ dna.obj[pen]:=false;\r
+ dixi('q',54);\r
+ dna.obj[ink]:=true;\r
+ dna.given_pen_to_ayles:=true;\r
+ objectlist;\r
+ points(2);\r
+ end else heythanks;\r
+ end else\r
+ display('But he''s asleep!');\r
+ pGeida: case thing of\r
+ potion : begin\r
+ dna.obj[potion]:=false;\r
+ dixi('u',16); { She drinks it. }\r
+ points(2);\r
+ dna.Geida_given_potion:=true;\r
+ objectlist;\r
+ end;\r
+ lute: give_Geida_the_lute;\r
+ else heythanks;\r
+ end;\r
+ pArkata: case thing of\r
+ potion: if dna.Geida_given_potion then\r
+ winsequence\r
+ else dixi('q',77); { That Geida woman! }\r
+ else heythanks;\r
+ end;\r
+ else heythanks;\r
+ end;\r
+ end;\r
+ end;\r
+ objectlist; { Just in case... }\r
+ end;\r
+\r
+ vb_eat,vb_drink: if holding then swallow;\r
+ vb_load: edna_load(realwords[2]);\r
+ vb_save: if alive then edna_save(realwords[2])\r
+ else display('It''s a bit late now to save your game!');\r
+ vb_pay: display('No money need change hands.');\r
+ vb_look: lookaround;\r
+ vb_break: display('Vandalism is prohibited within this game!');\r
+ vb_quit: begin { quit }\r
+ if demo then\r
+ begin\r
+ dixi('q',31);\r
+ close(demofile);\r
+ halt; { Change this later!!! }\r
+ end;\r
+ if not polite then display('How about a `please", Avvy?') else\r
+ if ask(^s'C'^v'Do you really want to quit?') then lmo:=true;\r
+ end;\r
+ vb_go: display('Just use the arrow keys to walk there.');\r
+ vb_info: begin\r
+ aboutscroll:=true;\r
+(* display('Thorsoft of Letchworth presents:'+^c+^m+^m+\r
+ 'The medival descendant of'+^m+\r
+ 'Denarius Avaricius Sextus'+^m+'in:'+\r
+ ^m+^m+'LORD AVALOT D''ARGENT'+\r
+ ^m+'version '+vernum+^m+^m+'Copyright ï '\r
+ +copyright+', Mark, Mike and Thomas Thurman.');*)\r
+ display(^m^m^m^m^m^m^m+'LORD AVALOT D''ARGENT'+^c^m+\r
+ 'The medival descendant of'+^m+\r
+ 'Denarius Avaricius Sextus'+\r
+ ^m+^m+'version '+vernum+^m+^m+'Copyright ï '\r
+ +copyright+', Mark, Mike and Thomas Thurman.'+^s+'Y'+^v);\r
+ aboutscroll:=false;\r
+ end;\r
+ vb_undress: if dna.wearing=nowt then display('You''re already stark naked!')\r
+ else\r
+ if dna.Avvys_in_the_cupboard then\r
+ begin\r
+ display('You take off '+get_better(dna.wearing)+'.');\r
+ dna.wearing:=nowt; objectlist;\r
+ end else\r
+ display('Hadn''t you better find somewhere more private, Avvy?');\r
+ vb_wear: if holding then\r
+ begin { wear something }\r
+ case thing of\r
+ chastity: display('Hey, what kind of a weirdo are you??!');\r
+ clothes,habit: begin { Change this! }\r
+ if dna.wearing<>nowt then\r
+ begin\r
+ if dna.wearing=thing then\r
+ display('You''re already wearing that.')\r
+ else\r
+ display('You''ll be rather warm wearing two '+\r
+ 'sets of clothes!');\r
+ exit;\r
+ end else\r
+ dna.wearing:=thing; objectlist;\r
+ if thing=habit then fv:=3 else fv:=0;\r
+ with tr[1] do\r
+ if whichsprite<>fv then\r
+ begin\r
+ sx:=tr[1].x; sy:=tr[1].y;\r
+ Done;\r
+ Init(fv,true);\r
+ appear(sx,sy,left);\r
+ tr[1].visible:=false;\r
+ end;\r
+ end;\r
+ else display(what);\r
+ end;\r
+ end;\r
+ vb_play: if (thing=pardon) then\r
+ case dna.room of { They just typed "play"... }\r
+ r__ArgentPub: play_nim; { ...in the pub, => play Nim. }\r
+ r__MusicRoom: play_harp;\r
+ end\r
+ else if holding then\r
+ begin\r
+ case thing of\r
+ lute : begin\r
+ dixi('U',7);\r
+ if whereis[pCwytalot]=dna.room then dixi('U',10);\r
+ if whereis[pduLustie]=dna.room then dixi('U',15);\r
+ end;\r
+ #52 : if (dna.room=r__MusicRoom) then play_harp\r
+ else display(what);\r
+ #55 : if (dna.room=r__ArgentPub) then play_Nim\r
+ else display(what);\r
+ else display(what);\r
+ end;\r
+ end;\r
+ vb_ring: if holding then\r
+ begin\r
+ if thing=bell then\r
+ begin\r
+ display('Ding, dong, ding, dong, ding, dong, ding, dong...');\r
+ if (dna.ringing_bells) and (flagset('B')) then\r
+ display('(Are you trying to join in, Avvy??!)');\r
+ end else display(what);\r
+ end;\r
+ vb_help: boot_help;\r
+ vb_larrypass: display('Wrong game!');\r
+ vb_phaon: display('Hello, Phaon!');\r
+ vb_boss: bosskey;\r
+ vb_pee: if flagset('P') then\r
+ begin\r
+ display('Hmm, I don''t think anyone will notice...');\r
+ set_up_timer(4,PROCurinate,reason_GoToToilet);\r
+ end else display('It would be '^f'VERY'^r' unwise to do that here, Avvy!');\r
+ vb_cheat: begin\r
+ display(^F+'Cheat mode now enabled.');\r
+ cheat:=true;\r
+ end;\r
+ vb_magic: if dna.Avaricius_talk>0 then\r
+ dixi('q',19)\r
+ else begin\r
+ if (dna.room=12) and (infield(2)) then\r
+ begin { Avaricius appears! }\r
+ dixi('q',17);\r
+ if whereis[#151]=12 then\r
+ dixi('q',18)\r
+ else\r
+ begin\r
+ tr[2].init(1,false); { Avaricius }\r
+ apped(2,4);\r
+ tr[2].walkto(5);\r
+ tr[2].call_Eachstep:=true;\r
+ tr[2].Eachstep:=PROCback_and_forth;\r
+ dna.Avaricius_talk:=14;\r
+ set_up_timer(177,PROCAvaricius_talks,reason_AvariciusTalks);\r
+ end;\r
+ end else display('Nothing appears to happen...');\r
+ end;\r
+ vb_smartalec: display('Listen, smart alec, that was just rhetoric.');\r
+ vb_expletive: with dna do begin\r
+ case swore of\r
+ 0: display('Avvy! Do you mind? There might be kids playing!'^M^M+\r
+ '(I shouldn''t say it again, if I were you!)');\r
+ 1: display('You hear a distant rumble of thunder. Must you always '+\r
+ 'do things I tell you not to?'^m^m'Don''t do it again!');\r
+ else\r
+ begin\r
+ zonk;\r
+ display('A crack of lightning shoots from the sky, '+\r
+ 'and fries you.'^m^m'(`Such is the anger of the gods, Avvy!")');\r
+ gameover;\r
+ end;\r
+ end;\r
+ inc(swore);\r
+ end;\r
+ vb_listen: if (dna.ringing_bells) and (flagset('B')) then\r
+ display('All other noise is drowned out by the ringing of '+\r
+ 'the bells.')\r
+ else\r
+ if listen='' then\r
+ display('You can''t hear anything much at the moment, Avvy.')\r
+ else display(listen);\r
+ vb_buy: begin\r
+ { What are they trying to buy? }\r
+ case dna.room of\r
+ r__argentpub: if infield(6) then\r
+ begin { We're in a pub, and near the bar. }\r
+ case thing of\r
+ #51,#53,#54,#58: begin { Beer, whisky, cider or mead }\r
+ if dna.malagauche=177 then { Already getting us one. }\r
+ begin dixi('D',15); exit; end;\r
+ if dna.teetotal then begin dixi('D',6); exit; end;\r
+ if dna.alcohol=0 then points(3);\r
+ show_one(12);\r
+ display(booze[thing]+', please.'^s'1'^b);\r
+ dna.drinking:=thing;\r
+\r
+ show_one(10);\r
+ dna.malagauche:=177;\r
+ set_up_timer(27,PROCbuydrinks,reason_Drinks);\r
+ end;\r
+ #52: examine; { We have a right one here- buy Pepsi??! }\r
+ wine: if dna.obj[wine] then { We've already got the wine! }\r
+ dixi('D',2) { 1 bottle's shufishent! }\r
+ else begin\r
+ if dna.malagauche=177 then { Already getting us one. }\r
+ begin dixi('D',15); exit; end;\r
+ if dna.carrying>=maxobjs then\r
+ begin display('Your hands are full.'); exit end;\r
+ show_one(12); display('Wine, please.'^s'1'^b);\r
+ if dna.alcohol=0 then points(3);\r
+ show_one(10);\r
+ dna.malagauche:=177;\r
+\r
+ set_up_timer(27,PROCbuywine,reason_Drinks);\r
+ end;\r
+ end;\r
+ end else dixi('D',5); { Go to the bar! }\r
+\r
+ r__OutsideDucks: if infield(6) then\r
+ begin\r
+ if thing=onion then\r
+ begin\r
+ if dna.obj[onion] then\r
+ dixi('D',10) { not planning to juggle with the things! }\r
+ else\r
+ if dna.carrying>=maxobjs then\r
+ display('Before you ask, you remember that your hands are full.')\r
+ else\r
+ begin\r
+ if dna.bought_onion then\r
+ dixi('D',11) else\r
+ begin dixi('D',9); points(3); end;\r
+ pennycheck(3); { It costs thruppence. }\r
+ dna.obj[onion]:=true;\r
+ objectlist;\r
+ dna.bought_onion:=true;\r
+ dna.rotten_onion:=false; { It's OK when it leaves the stall! }\r
+ dna.onion_in_vinegar:=false;\r
+ end;\r
+ end else dixi('D',0);\r
+ end else dixi('D',0);\r
+\r
+ r__NottsPub: dixi('n',15); { Can't sell to southerners. }\r
+ else dixi('D',0); { Can't buy that. }\r
+ end;\r
+ end;\r
+ vb_attack: begin\r
+ if (dna.room=r__BrummieRoad) and\r
+ ((person=#157) or (thing=crossbow) or (thing=bolt))\r
+ and (whereis[#157]=dna.room) then\r
+ begin\r
+ case ord(dna.obj[bolt])+ord(dna.obj[crossbow])*2 of\r
+ { 0 = neither, 1 = only bolt, 2 = only crossbow,\r
+ 3 = both. }\r
+ 0: begin\r
+ dixi('Q',10);\r
+ display('(At the very least, don''t use your bare hands!)');\r
+ end;\r
+ 1: display('Attack him with only a crossbow bolt? Are you '+\r
+ 'planning on playing darts?!');\r
+ 2: display('Come on, Avvy! You''re not going to get very far '+\r
+ 'with only a crossbow!');\r
+ 3: begin\r
+ dixi('Q',11);\r
+ dna.cwytalot_gone:=true;\r
+ dna.obj[bolt]:=false; dna.obj[crossbow]:=false;\r
+ objectlist;\r
+ magics[12].op:=nix;\r
+ points(7);\r
+ tr[2].walkto(2);\r
+ tr[2].vanishifstill:=true;\r
+ tr[2].call_Eachstep:=false;\r
+ whereis[#157]:=177;\r
+ end;\r
+ else dixi('Q',10); { Please try not to be so violent! }\r
+ end;\r
+ end else dixi('Q',10);\r
+ end;\r
+ vb_password: if dna.room<>r__Bridge then\r
+ dixi('Q',12) else\r
+ begin\r
+ ok:=true;\r
+ for ff:=1 to length(thats) do\r
+ for fv:=1 to length(words[dna.pass_num+first_password].w) do\r
+ if words[dna.pass_num+first_password].w[fv] <>\r
+ upcase(realwords[ff,fv])\r
+ then ok:=false;\r
+ if ok then\r
+ begin\r
+ if dna.drawbridge_open<>0 then\r
+ display('Contrary to your expectations, the drawbridge fails to close again.')\r
+ else\r
+ begin\r
+ points(4);\r
+ display('The drawbridge opens!');\r
+ set_up_timer(7,PROCopen_drawbridge,Reason_DrawbridgeFalls);\r
+ dna.drawbridge_open:=1;\r
+ end;\r
+ end else dixi('Q',12);\r
+ end;\r
+ vb_dir: dir(realwords[2]);\r
+ vb_die: gameover;\r
+ vb_score: display('Your score is '+strf(dna.score)+','^c^m'out of a '+\r
+ 'possible 128.'^m^m'This gives you a rank of '+rank+\r
+ '.'^m^m+totaltime);\r
+ vb_put: putproc;\r
+ vb_stand: stand_up;\r
+\r
+ vb_kiss: if (person=pardon)\r
+ then display('Kiss whom?')\r
+ else if personshere then\r
+ case person of\r
+ #150..#174: display('Hey, what kind of a weirdo are you??');\r
+ pArkata: dixi('U',12);\r
+ pGeida: dixi('U',13);\r
+ pWiseWoman: dixi('U',14);\r
+ else dixi('U',5); { You WHAT? }\r
+ end;\r
+\r
+ vb_climb: if (dna.room=r__InsideCardiffCastle) then Cardiff_climbing\r
+ else { In the wrong room! }\r
+ display('Not with your head for heights, Avvy!');\r
+\r
+ vb_jump: begin\r
+ set_up_timer(1,PROCjump,reason_Jumping);\r
+ dna.user_moves_Avvy:=false;\r
+ end;\r
+\r
+ vb_highscores: show_highs;\r
+\r
+ vb_wake: with dna do\r
+ if personshere then\r
+ case person of\r
+ pardon,pAvalot,#0: if not Avvy_is_awake then\r
+ begin\r
+ Avvy_is_awake:=true;\r
+ points(1);\r
+ Avvy_in_bed:=true;\r
+ show_one(3); { Picture of Avvy, awake in bed. }\r
+ if teetotal then dixi('d',13);\r
+ end else display('You''re already awake, Avvy!');\r
+ pAyles: if not Ayles_is_awake then display('You can''t seem to wake him by yourself.');\r
+ pJacques: display('Brother Jacques, Brother Jacques, are you asleep?'^s'1'^b+\r
+ 'Hmmm... that doesn''t seem to do any good...');\r
+ else display('It''s difficult to awaken people who aren''t asleep...!');\r
+ end;\r
+\r
+ vb_sit: if dna.room=r__NottsPub then\r
+ begin\r
+ if dna.sitting_in_pub then\r
+ display('You''re already sitting!')\r
+ else\r
+ begin\r
+ tr[1].walkto(4); { Move Avvy to the place, and sit him down. }\r
+ set_up_timer(1,PROCAvvy_sit_down,reason_sitting_down);\r
+ end;\r
+ end else\r
+ begin { Default doodah. }\r
+ dusk;\r
+ hang_around_for_a_while;\r
+ dawn;\r
+ display('A few hours later...'^p'nothing much has happened...');\r
+ end;\r
+\r
+ vb_restart: if ask('Restart game and lose changes?') then begin\r
+ dusk;\r
+ newgame;\r
+ dawn;\r
+ end;\r
+\r
+ pardon: display('Hey, a verb would be helpful!');\r
+\r
+ vb_hello: begin person_speaks; display('Hello.'^b); end;\r
+ vb_thanks: begin person_speaks; display('That''s OK.'^b); end;\r
+ else display(^G+'Parser bug!');\r
+ end;\r
+end;\r
+\r
+procedure verbopt(n:char; var answer:string; var anskey:char);\r
+begin\r
+ case n of\r
+ vb_exam: begin answer:='Examine'; anskey:='x'; end; { the ubiqutous one }\r
+ { vb_give isn't dealt with by this procedure, but by ddm__with }\r
+ vb_drink: begin answer:='Drink'; anskey:='D'; end;\r
+ vb_wear: begin answer:='Wear'; anskey:='W'; end;\r
+ vb_ring: begin answer:='Ring'; anskey:='R'; end; { only the bell! }\r
+ vb_play: begin answer:='Play'; anskey:='P'; end;\r
+ vb_eat: begin answer:='Eat'; anskey:='E'; end;\r
+ else begin answer:='? Unknown!'; anskey:='?'; end; { Bug! }\r
+ end;\r
+end;\r
+\r
+begin\r
+ weirdword:=false;\r
+end.\r
--- /dev/null
+program Also;\r
+uses Graph,Rodent,Crt;\r
+{$R+,V-}\r
+\r
+type\r
+ fonttype = array[0..255,0..15] of byte;\r
+\r
+ fieldtype = object\r
+ x1,y1,x2,y2:integer;\r
+ end;\r
+\r
+ linetype = object(fieldtype)\r
+ col:byte;\r
+ end;\r
+\r
+ pedtype = record\r
+ x,y:integer; dir:byte;\r
+ end;\r
+\r
+ magictype = record\r
+ op:byte; { one of the operations }\r
+ data:word; { data for them }\r
+ end;\r
+\r
+const\r
+ numlines=50; up = 0; right = 1; down = 2; left = 3; ur=4; dr=5; dl=6; ul=7;\r
+ still = 8;\r
+\r
+ nay = maxint;\r
+\r
+ { Magic commands are }\r
+\r
+ {N} nix = 0; { ignore it if this line is touched }\r
+ {B} bounce = 1; { bounce off this line }\r
+ {E} exclaim = 2; { put up a chain of scrolls }\r
+ {T} transport = 3; { enter new room }\r
+ {U} unfinished = 4; { unfinished connection }\r
+ {S} special= 5; { special call }\r
+ {O} opendoor = 6; { slowly opening door. }\r
+\r
+var\r
+ gd,gm:integer;\r
+ lines:array[1..numlines] of linetype;\r
+ fields:array[1..numlines] of fieldtype;\r
+ do1:boolean;\r
+ current:byte;\r
+ n:string;\r
+ names:array[0..29,1..2] of string;\r
+ f:file of fonttype;\r
+ skinny:fonttype;\r
+ tx,ty:byte;\r
+ chars:array[0..79,0..22] of char;\r
+ cursorflash:byte;\r
+ peds:array[1..15] of pedtype;\r
+ magics:array[1..15] of magictype;\r
+ portals:array[9..15] of magictype;\r
+ flags:string[26];\r
+ listen:string;\r
+\r
+const\r
+ crosshairs : graphcursmasktype =\r
+ ( Mask:\r
+ ((63551,63807,63807,63807,61727,257,897,32765,897,257,61727,63807,63807,63807,63551,65535),\r
+ (4368,21140,8840,53910,640,640,31868,33026,31868,640,640,53910,8840,21140,4368,0));\r
+ Horzhotspot: 7;\r
+ Verthotspot: 7);\r
+\r
+ hook : graphcursmasktype =\r
+ ( Mask:\r
+ ((32831,32831,49279,49279,57599,61695,61471,61447,63491,57089,36801,32771,49159,57375,63743,65535),\r
+ (0,16256,7936,7936,3584,1536,1792,2016,248,28,8220,12344,8160,1792,0,0));\r
+ Horzhotspot: 2;\r
+ Verthotspot: 9);\r
+\r
+ tthand : graphcursmasktype =\r
+ ( Mask:\r
+ ((62463,57855,57855,57855,57471,49167,32769,0,0,0,0,32768,49152,57344,61441,61443),\r
+ (3072,4608,4608,4608,4992,12912,21070,36937,36873,36865,32769,16385,8193,4097,2050,4092));\r
+ Horzhotspot: 4;\r
+ Verthotspot: 0);\r
+\r
+function strf(x:longint):string;\r
+var q:string;\r
+begin;\r
+ str(x,q); strf:=q;\r
+end;\r
+\r
+procedure glimpse(ret:byte); { glimpse of screen 3 }\r
+var sink:char;\r
+begin;\r
+ hidemousecursor; setvisualpage(3); setcrtpagenumber(3); showmousecursor;\r
+ repeat until not anymousekeypressed;\r
+ repeat until anymousekeypressed;\r
+ hidemousecursor; setvisualpage(ret); setcrtpagenumber(ret); showmousecursor;\r
+ while keypressed do sink:=readkey;\r
+end;\r
+\r
+procedure newline(t:byte; p,q,r,s:integer; c:byte);\r
+begin;\r
+ with lines[t] do\r
+ begin;\r
+ x1:=p; y1:=q; x2:=r; y2:=s; col:=c;\r
+ end;\r
+end;\r
+\r
+procedure newfield(t:byte; p,q,r,s:integer);\r
+begin; with fields[t] do begin; x1:=p; y1:=q; x2:=r; y2:=s; end; end;\r
+\r
+procedure drawped(p:byte);\r
+begin;\r
+ with peds[p] do\r
+ if dir<177 then\r
+ begin;\r
+ setcolor(p); circle(x,y,5); moveto(x,y);\r
+ case dir of\r
+ up: linerel(0,-5); down: linerel(0,5);\r
+ left: linerel(-7,0); right: linerel(7,0);\r
+ ul: linerel(-7,-5); dl: linerel(-7, 5);\r
+ ur: linerel( 7,-5); dr: linerel( 7, 5);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure drawup;\r
+var fv:byte;\r
+begin;\r
+ cleardevice;\r
+ for fv:=1 to numlines do\r
+ with lines[fv] do\r
+ if x1<>nay then\r
+ begin;\r
+ setcolor(col);\r
+ line(x1,y1,x2,y2);\r
+ end;\r
+ for fv:=1 to numlines do\r
+ with fields[fv] do\r
+ if x1<>nay then\r
+ begin;\r
+ setcolor(fv);\r
+ rectangle(x1,y1,x2,y2);\r
+ end;\r
+ for fv:=1 to 15 do drawped(fv);\r
+end;\r
+\r
+procedure addped;\r
+var n,fv:byte;\r
+begin;\r
+ n:=0; repeat inc(n) until (n=16) or (peds[n].dir=177);\r
+ setcrtpagenumber(0); setactivepage(0); setvisualpage(0);\r
+ drawup; setgraphicscursor(tthand); showmousecursor;\r
+ repeat\r
+ if rightmousekeypressed then exit;\r
+ if keypressed then glimpse(0);\r
+ until leftmousekeypressed;\r
+ hidemousecursor;\r
+ with peds[n] do\r
+ begin;\r
+ x:=mousex; y:=mousey;\r
+ end;\r
+ cleardevice; setfillstyle(6,9); for fv:=1 to 3 do bar(200*fv,0,200*fv,200);\r
+ for fv:=1 to 2 do bar(0,60*fv,640,60*fv);\r
+ showmousecursor;\r
+ repeat if rightmousekeypressed then exit; until leftmousekeypressed;\r
+ hidemousecursor;\r
+ with peds[n] do\r
+ case ((mousex div 200)*10)+(mousey div 60) of\r
+ 00: dir:=ul; 10: dir:=up; 20: dir:=ur;\r
+ 01: dir:=left; 11: dir:=still; 21: dir:=right;\r
+ 02: dir:=dl; 12: dir:=down; 22: dir:=dr;\r
+ end;\r
+end;\r
+\r
+procedure addline(ccc:byte);\r
+var fv:byte;\r
+begin;\r
+ repeat\r
+ for fv:=1 to numlines do\r
+ with lines[fv] do\r
+ if x1=nay then\r
+ begin;\r
+ x1:=fv*17; x2:=x1; y1:=200; y2:=190; col:=ccc;\r
+ exit; { bad style! }\r
+ end;\r
+ until false;\r
+end;\r
+\r
+function colour:byte;\r
+var fv:byte;\r
+begin;\r
+ setactivepage(0); setvisualpage(0); setcrtpagenumber(0);\r
+ outtextxy(0,0,'Select a colour, please...');\r
+ for fv:=1 to 15 do\r
+ begin;\r
+ setfillstyle(1,fv);\r
+ bar(fv*40,27,39+fv*40,200);\r
+ end;\r
+ showmousecursor;\r
+ repeat\r
+ if rightmousekeypressed then begin; hidemousecursor; exit; end;\r
+ if keypressed then glimpse(2);\r
+ until leftmousekeypressed;\r
+ hidemousecursor;\r
+ colour:=getpixel(mousex,mousey); cleardevice;\r
+end;\r
+\r
+procedure addfield;\r
+var fv:byte; ok:boolean;\r
+begin;\r
+ repeat\r
+ fv:=colour;\r
+ ok:=fields[fv].x1=nay;\r
+ if not ok then write(#7);\r
+ until ok;\r
+ with fields[fv] do\r
+ begin;\r
+ x1:=300+fv*17; x2:=x1+1; y1:=200; y2:=177;\r
+ end;\r
+end;\r
+\r
+function checkline:byte;\r
+var fv,ans:byte;\r
+begin;\r
+ setgraphicscursor(crosshairs);\r
+ setcrtpagenumber(0); setactivepage(0); setvisualpage(0); drawup;\r
+ repeat\r
+ showmousecursor;\r
+ repeat\r
+ if rightmousekeypressed then begin; checkline:=255; exit; end;\r
+ if keypressed then glimpse(0);\r
+ until leftmousekeypressed;\r
+ hidemousecursor;\r
+ setactivepage(1); ans:=177;\r
+ for fv:=1 to numlines do { }\r
+ begin;\r
+ with lines[fv] do\r
+ if x1<>nay then\r
+ begin;\r
+ setcolor( 9); line(x1,y1,x2,y2);\r
+ if getpixel(mousex,mousey)=9 then ans:=fv;\r
+ setcolor( 0); line(x1,y1,x2,y2);\r
+ end;\r
+ with fields[fv] do\r
+ if x1<>nay then\r
+ begin;\r
+ setcolor( 9); rectangle(x1,y1,x2,y2);\r
+ if getpixel(mousex,mousey)=9 then ans:=fv+100;\r
+ setcolor( 0); rectangle(x1,y1,x2,y2);\r
+ end;\r
+ end;\r
+ setactivepage(0);\r
+ until ans<>177;\r
+ checkline:=ans;\r
+end;\r
+\r
+procedure chooseside;\r
+var clicol,savelcol:byte; itsaline:boolean; current:fieldtype; temp:integer;\r
+ procedure plotline;\r
+ begin;\r
+ if itsaline then\r
+ with lines[gd] do\r
+ if do1 then line(mousex,mousey,x2,y2) else\r
+ line(x1,y1,mousex,mousey)\r
+ else\r
+ with fields[gd] do\r
+ if do1 then rectangle(mousex,mousey,x2,y2) else\r
+ rectangle(x1,y1,mousex,mousey);\r
+end;\r
+begin;\r
+ repeat\r
+ gd:=checkline; itsaline:=gd<100;\r
+ if gd=255 then begin; hidemousecursor; exit; end;\r
+ if not itsaline then dec(gd,100);\r
+ setactivepage(2); setvisualpage(2); cleardevice;\r
+ setgraphicscursor(tthand); setcrtpagenumber(2);\r
+ if itsaline then\r
+ begin;\r
+ current:=lines[gd];\r
+ savelcol:=lines[gd].col;\r
+ end else current:=fields[gd];\r
+ with current do\r
+ begin;\r
+ setcolor(9);\r
+ if itsaline then line(x1,y1,x2,y2) else rectangle(x1,y1,x2,y2);\r
+ setcolor(9);\r
+ setfillstyle(1,red); bar(x1-3,y1-3,x1+3,y1+3);\r
+ setfillstyle(1,green); bar(x2-3,y2-3,x2+3,y2+3);\r
+ repeat until not anymousekeypressed;\r
+ clicol:=177; showmousecursor;\r
+ repeat\r
+ if anymousekeypressed then\r
+ begin;\r
+ hidemousecursor;\r
+ clicol:=getpixel(mousex,mousey);\r
+ showmousecursor;\r
+ end;\r
+ if rightmousekeypressed then\r
+ begin; hidemousecursor; exit; end;\r
+ if keypressed then glimpse(2);\r
+ until clicol in [red,green];\r
+ do1:=clicol=red; hidemousecursor;\r
+ setgraphicscursor(hook); setcrtpagenumber(0);\r
+ setactivepage(0); setvisualpage(0); setcolor(0);\r
+ if itsaline then\r
+ with lines[gd] do begin; line(x1,y1,x2,y2); setcolor(col); end else\r
+ with fields[gd] do begin; rectangle(x1,y1,x2,y2); setcolor(gd); end;\r
+ setwritemode(xorput);\r
+ while not anymousekeypressed do\r
+ begin;\r
+ plotline;\r
+ showmousecursor; delay(1); hidemousecursor;\r
+ plotline;\r
+ if rightmousekeypressed then begin; hidemousecursor; exit; end;\r
+ if keypressed then glimpse(0);\r
+ end;\r
+ { update "current" rec }\r
+ if do1 then begin; x1:=mousex; y1:=mousey; end\r
+ else begin; x2:=mousex; y2:=mousey; end;\r
+ if not itsaline then\r
+ begin;\r
+ if x1>x2 then begin; temp:=x2; x2:=x1; x1:=temp; end;\r
+ if y1>y2 then begin; temp:=y2; y2:=y1; y1:=temp; end;\r
+ end;\r
+ { copy "current" to line/field }\r
+ if itsaline then\r
+ with lines[gd] do\r
+ begin;\r
+ x1:=current.x1; x2:=current.x2; y1:=current.y1; y2:=current.y2;\r
+ col:=savelcol;\r
+ end else fields[gd]:=current;\r
+ end;\r
+ setwritemode(0);\r
+ until false;\r
+end;\r
+\r
+procedure delped;\r
+begin;\r
+ setcrtpagenumber(0); setactivepage(0); setvisualpage(0);\r
+ drawup; setgraphicscursor(tthand); showmousecursor;\r
+ repeat until leftmousekeypressed; peds[colour].dir:=177;\r
+end;\r
+\r
+function menu:byte;\r
+var clicol:byte;\r
+ procedure say(y:byte; x:string);\r
+ begin;\r
+ setfillstyle(1,y);\r
+ bar(0,y*17,100,y*17+15); outtextxy(123,y*17,x);\r
+ end;\r
+begin;\r
+ setcolor(15); settextstyle(0,0,2); clicol:=0; setgraphicscursor(tthand);\r
+ setvisualpage(2); setactivepage(2); setcrtpagenumber(2); cleardevice;\r
+ say(3,'Move lines around');\r
+ say(4,'Add a new line');\r
+ say(5,'Delete a line');\r
+ say(6,'Add a ped');\r
+ say(7,'Delete a ped');\r
+ say(8,'Add a field');\r
+ say(10,'Return to Also.');\r
+ showmousecursor;\r
+ repeat\r
+ if leftmousekeypressed then\r
+ begin;\r
+ hidemousecursor;\r
+ clicol:=getpixel(mousex,mousey);\r
+ showmousecursor;\r
+ end;\r
+ if rightmousekeypressed then begin; hidemousecursor; exit; end;\r
+ if keypressed then glimpse(2);\r
+ until clicol>0;\r
+ repeat until not anymousekeypressed;\r
+ hidemousecursor;\r
+ menu:=clicol;\r
+end;\r
+\r
+procedure removeline;\r
+begin;\r
+ gd:=checkline; if gd=255 then begin; hidemousecursor; exit; end;\r
+ if gd>100 then\r
+ fields[gd-100].x1:=nay\r
+ else lines[gd].x1:=nay; { cancels it out }\r
+ cleardevice; drawup;\r
+end;\r
+\r
+procedure lino;\r
+begin;\r
+ resetmouse;\r
+ repeat\r
+ case menu of\r
+ 3: chooseside;\r
+ 4: addline(colour);\r
+ 5: removeline;\r
+ 6: addped;\r
+ 7: delped;\r
+ 8: addfield;\r
+ 10: exit;\r
+ end;\r
+ until false;\r
+end;\r
+\r
+procedure loadscreen; { load2 }\r
+var\r
+ a:byte absolute $A000:246560;\r
+ bit:byte;\r
+ f:file;\r
+begin;\r
+ setactivepage(3); setvisualpage(3);\r
+ assign(f,'c:\avalot\place'+n+'.avd'); reset(f,1); seek(f,177);\r
+ for bit:=0 to 3 do\r
+ begin;\r
+ port[$3c4]:=2; port[$3ce]:=4; port[$3C5]:=1 shl bit; port[$3CF]:=bit;\r
+ blockread(f,a,12080);\r
+ end;\r
+ close(f);\r
+ setvisualpage(0);\r
+ outtextxy(0,190,'Look carefully, and then press any key...');\r
+ setactivepage(0);\r
+end;\r
+\r
+procedure ctrlsout(var x:string); { Replace real ctrls with caret codes }\r
+var fv:byte; xx:string;\r
+begin;\r
+ xx:='';\r
+ for fv:=1 to length(x) do\r
+ if x[fv]>#31 then xx:=xx+x[fv] else xx:=xx+'^'+chr(ord(x[fv])+64);\r
+ x:=xx;\r
+end;\r
+\r
+procedure ctrlsin(var x:string); { Opposite of ctrlsout }\r
+var fv:byte; xx:string; ctrlwas:boolean;\r
+begin;\r
+ xx:=''; ctrlwas:=false;\r
+ for fv:=1 to length(x) do\r
+ if ctrlwas then { last char was a caret }\r
+ begin;\r
+ xx:=xx+chr(ord(upcase(x[fv]))-64);\r
+ ctrlwas:=false;\r
+ end\r
+ else\r
+ begin; { last char wasn't a caret... }\r
+ if x[fv]='^' then ctrlwas:=true else { ...but this one is }\r
+ xx:=xx+x[fv]; { ...but this one isn't }\r
+ end;\r
+ x:=xx;\r
+end;\r
+\r
+procedure flipover; { temp view other screen }\r
+var r:char;\r
+begin;\r
+ setvisualpage(3); r:=readkey; setvisualpage(0);\r
+end;\r
+\r
+procedure plotchar(x,y:byte; n:char);\r
+var fv:byte;\r
+begin;\r
+ if chars[x,y]=n then exit;\r
+ for fv:=0 to 15 do\r
+ mem[$A000:y*1200+(fv+3)*80+x]:=skinny[ord(n),fv];\r
+ chars[x,y]:=n;\r
+end;\r
+\r
+procedure cursor;\r
+var fv:byte;\r
+begin;\r
+ inc(cursorflash);\r
+ case cursorflash of\r
+ 1,127: for fv:=12 to 14 do\r
+ mem[$A000:ty*1200+(3+fv)*80+tx]:=not(mem[$A000:ty*1200+(3+fv)*80+tx]);\r
+ 255: cursorflash:=0;\r
+ end;\r
+end;\r
+\r
+procedure losecursor;\r
+begin;\r
+ if cursorflash<127 then begin; cursorflash:=126; cursor; end;\r
+ cursorflash:=0;\r
+end;\r
+\r
+procedure gwrite(x:string);\r
+var fv:byte;\r
+begin;\r
+ for fv:=1 to length(x) do\r
+ begin;\r
+ plotchar(tx,ty,x[fv]);\r
+ inc(tx);\r
+ if tx=80 then begin; inc(ty); tx:=0; end;\r
+ end;\r
+end;\r
+\r
+function typein(x:string):string;\r
+const marker = #2;\r
+var p:byte; r:char;\r
+begin;\r
+ setvisualpage(0); setactivepage(0); cleardevice;\r
+ settextstyle(0,0,1); setcolor(15);\r
+ outtextxy( 0, 0,'Press TAB to see the room...');\r
+ outtextxy( 0, 20,'You may use any of these Control Codes:');\r
+ outtextxy(30, 30,'Anywhere: ^M = new line, ^P = new scroll, |1 fix to speaker 1.');\r
+ outtextxy(90, 40,'^B = new bubble');\r
+ outtextxy(30, 50,'At end of line: ^C = centre line, ^L = left justify.');\r
+ outtextxy(30, 60,'At end of scroll: ^D = Don''t add automatic ^P here.');\r
+ outtextxy( 0, 80,'(Use by typing in (eg for ^P) ^ then P, not Ctrl-P.)');\r
+ p:=0; ctrlsout(x); fillchar(chars,sizeof(chars),#32);\r
+ repeat\r
+ tx:=0; ty:=6; gwrite(x+#4+#32);\r
+ tx:=(p mod 80); ty:=(p div 80)+6;\r
+ while not keypressed do begin; delay(1); cursor; end; losecursor;\r
+ r:=readkey;\r
+ case r of\r
+ #8: if p>0 then begin; x:=copy(x,1,p-1)+copy(x,p+1,255); dec(p); end; { backspace }\r
+ #9: flipover;\r
+ #32..#255: begin; x:=copy(x,1,p)+r+copy(x,p+1,255); inc(p); end;\r
+ #0: case readkey of { extd. keystroke }\r
+ 'G': p:=0; { Home }\r
+ 'K': if p>0 then dec(p); { left }\r
+ 'M': if p<length(x) then inc(p); { right }\r
+ 'H': if p>80 then dec(p,80); { up }\r
+ 'P': if p<length(x)-80 then inc(p,80); { down }\r
+ 'O': p:=length(x); { End }\r
+ 'S': x:=copy(x,1,p)+copy(x,p+2,255); { Del }\r
+ end;\r
+ end;\r
+ until r=#13;\r
+ ctrlsin(x); typein:=x;\r
+end;\r
+\r
+function typeno(title:string):byte;\r
+var\r
+ x:string[2]; r:char; e:integer; p:word;\r
+begin;\r
+ cleardevice; x:='000';\r
+ settextstyle(0,0,3); setcolor(9); outtextxy(0,0,title);\r
+ setfillstyle(1,0); setcolor(10); fillchar(chars,sizeof(chars),#32);\r
+ repeat\r
+ bar(100,100,150,125);\r
+ outtextxy(100,100,x);\r
+ repeat r:=readkey until r in ['0'..'9',#27,#13];\r
+ if r=#27 then begin; typeno:=255; exit; end;\r
+ if r<>#13 then x:=x[2]+r;\r
+ until r=#13;\r
+ val(x,p,e); typeno:=p;\r
+end;\r
+\r
+procedure showallnames;\r
+var fv:byte; s:string[2]; r:char;\r
+begin;\r
+ settextstyle(0,0,2); cleardevice; setcolor(13); outtextxy(0,0,'Descriptions start...');\r
+ settextstyle(0,0,1); setcolor(7);\r
+ for fv:=1 to 29 do\r
+ begin;\r
+ str(fv:2,s);\r
+ outtextxy((fv div 15)*320,((fv mod 15)*10)+30,s+'='+copy(names[fv,1],0,33));\r
+ end;\r
+ setcolor(15); outtextxy(500,190,'Press any key...');\r
+ r:=readkey;\r
+end;\r
+\r
+procedure showallassoc;\r
+var fv:byte; s:string[2]; r:char;\r
+\r
+ procedure saascreen;\r
+ begin;\r
+ settextstyle(0,0,2); cleardevice; setcolor(10); outtextxy(0,0,'Everything...');\r
+ settextstyle(0,0,1); setcolor(2);\r
+ outtextxy(17,20,'(Format: <number> : <start of names> : <start of desc.>)');\r
+ end;\r
+\r
+begin;\r
+ saascreen;\r
+ for fv:=1 to 30 do\r
+ begin;\r
+ str(fv-1:2,s);\r
+ outtextxy(0,(((fv-1) mod 10)*10)+30,\r
+ s+':'+copy(names[fv-1,1],1,7)+':'+copy(names[fv-1,2],1,70));\r
+ if (fv mod 10)=0 then begin; r:=readkey; saascreen; end;\r
+ end;\r
+ setcolor(15); outtextxy(500,190,'Press any key...');\r
+ r:=readkey;\r
+end;\r
+\r
+procedure clear;\r
+var fv:byte;\r
+begin;\r
+ fillchar(names ,sizeof(names ), #0);\r
+ for fv:=1 to numlines do begin; lines[fv].x1:=nay; fields[fv].x1:=nay; end;\r
+ fillchar(peds ,sizeof(peds ),#177);\r
+end;\r
+\r
+procedure scramble; { Works both ways. }\r
+var fv,ff:byte;\r
+ procedure scram1(var x:string);\r
+ var fz:byte;\r
+ begin;\r
+ for fz:=1 to length(x) do\r
+ x[fz]:=chr(ord(x[fz]) xor 177);\r
+ end;\r
+begin;\r
+ for fv:=0 to 29 do\r
+ for ff:=1 to 2 do\r
+ scram1(names[fv,ff]);\r
+ scram1(listen);\r
+ scram1(flags);\r
+end;\r
+\r
+procedure save;\r
+var x:string; f:file; minnames,minlines,minpeds,minfields,fv,ff:byte;\r
+begin;\r
+ minnames :=0; for fv:=0 to 29 do if names[fv,1]<>'' then minnames :=fv;\r
+ minlines :=0; for fv:=1 to numlines do\r
+ if lines[fv].x1<>nay then minlines :=fv;\r
+ minpeds :=0; for fv:=1 to 15 do if peds[fv].dir<177 then minpeds :=fv;\r
+ minfields:=0; for fv:=1 to 30 do if fields[fv].x1<>nay then minfields:=fv;\r
+ assign(f,'c:\avalot\also'+n+'.avd');\r
+ rewrite(f,1);\r
+ x:='This is an Also .AVD file, which belongs to AVALOT.EXE. Its contents'+\r
+ #13+#10+'are subject to copyright, so there. Have fun!'+#26+' *Minstrel* ';\r
+ blockwrite(f,x[1],128);\r
+ scramble;\r
+ blockwrite(f,minnames,1);\r
+ for fv:=0 to minnames do\r
+ for ff:=1 to 2 do\r
+ blockwrite(f,names[fv,ff],length(names[fv,ff])+1);\r
+ blockwrite(f,minlines,1);\r
+ blockwrite(f,lines,sizeof(lines[1])*minlines);\r
+ blockwrite(f,minpeds,1);\r
+ blockwrite(f,peds,sizeof(peds[1])*minpeds);\r
+ blockwrite(f,minfields,1);\r
+ blockwrite(f,fields,sizeof(fields[1])*minfields);\r
+ blockwrite(f,magics,sizeof(magics));\r
+ blockwrite(f,portals,sizeof(portals));\r
+ blockwrite(f,flags,sizeof(flags));\r
+ blockwrite(f,listen[0],1);\r
+ blockwrite(f,listen[1],length(listen));\r
+ close(f);\r
+ scramble;\r
+end;\r
+\r
+procedure load;\r
+var f:file; minnames,minlines,minpeds,minfields:byte; ff,fv:byte;\r
+\r
+ function nextstring:string;\r
+ var l:byte; x:string;\r
+ begin;\r
+ x:=''; blockread(f,l,1); blockread(f,x[1],l); x[0]:=chr(l); nextstring:=x;\r
+ end;\r
+\r
+begin;\r
+ clear;\r
+ assign(f,'c:\avalot\also'+n+'.avd');\r
+{$I-} reset(f,1); {$I+} if ioresult<>0 then exit; { no Also file }\r
+ seek(f,128); blockread(f,minnames,1);\r
+ for fv:=0 to minnames do\r
+ for ff:=1 to 2 do\r
+ names[fv,ff]:=nextstring;\r
+ blockread(f,minlines,1);\r
+ blockread(f,lines,sizeof(lines[1])*minlines);\r
+ blockread(f,minpeds,1);\r
+ blockread(f,peds,sizeof(peds[1])*minpeds);\r
+ blockread(f,minfields,1);\r
+ blockread(f,fields,sizeof(fields[1])*minfields);\r
+ blockread(f,magics,sizeof(magics));\r
+ blockread(f,portals,sizeof(portals));\r
+ blockread(f,flags,sizeof(flags));\r
+ blockread(f,listen[0],1);\r
+ blockread(f,listen[1],length(listen));\r
+ close(f);\r
+ scramble;\r
+end;\r
+\r
+procedure editmagics;\r
+const codes : array[1..15] of char = '123456789ABCDEF';\r
+var\r
+ y:integer;\r
+ r,rr:char; p:byte;\r
+\r
+ procedure display;\r
+ var fv:byte;\r
+ begin;\r
+ cleardevice;\r
+ settextstyle(0,0,2); setcolor(15); outtextxy(0,0,'Magics.');\r
+ settextstyle(0,0,1);\r
+ for fv:=1 to 15 do\r
+ begin;\r
+ y:=23+fv*10;\r
+ setcolor(fv); outtextxy(100,y,'$'+codes[fv]);\r
+ with magics[fv] do\r
+ begin;\r
+ case op of\r
+ nix: begin; setcolor(8); outtextxy(140,y,'Nix'); end;\r
+ bounce: begin; setcolor(10); outtextxy(143,y,'Bounce!'); end;\r
+ exclaim: begin;\r
+ setcolor(14); outtextxy(143,y,'Exclaim: '+strf(data));\r
+ end;\r
+ transport: begin;\r
+ setcolor(12);\r
+ outtextxy(143,y,'Transport to '+strf(hi(data))+\r
+ ', ped '+strf(lo(data)));\r
+ end;\r
+ unfinished: begin;\r
+ setcolor(15); outtextxy(143,y,'*** UNFINISHED! ***');\r
+ end;\r
+ special: begin;\r
+ setcolor(6); outtextxy(143,y,'Special call no. '+strf(data));\r
+ end;\r
+ opendoor: begin;\r
+ setcolor(11);\r
+ outtextxy(143,y,'Opening door to '+strf(hi(data))+\r
+ ', ped '+strf(lo(data)));\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ outtextxy(177,190,'Which do you want to change? (Esc=Exit) $');\r
+ end;\r
+\r
+ function ask(x:string):word;\r
+ var q:string; thomaswashere:word; e:integer;\r
+ begin;\r
+ cleardevice;\r
+ setcolor(10); settextstyle(0,0,3); outtextxy(0,100,x);\r
+ repeat\r
+ readln(q); val(q,thomaswashere,e);\r
+ until e=0; ask:=thomaswashere;\r
+ end;\r
+\r
+begin;\r
+ repeat\r
+ display;\r
+ repeat\r
+ r:=upcase(readkey);\r
+ if r=#27 then exit;\r
+ p:=pos(r,codes); { which are we editing? }\r
+ until p>0; { it must BE there... }\r
+ setcolor(p); cleardevice;\r
+ outtextxy(177,17,'Editing magic $'+r+'.');\r
+ outtextxy(0,30,'New operation ( (N)ix, (B)ounce, (E)xclaim, (T)ransport, (U)nfinished),');\r
+ outtextxy(30,40,'(S)pecial, (O)pening Door?');\r
+ repeat rr:=upcase(readkey) until rr in ['N','B','E','T','U','S','O',#27];\r
+ with magics[p] do\r
+ case rr of\r
+ #27: exit; { cancelling code }\r
+ 'N': op:=nix;\r
+ 'B': op:=bounce;\r
+ 'E': begin; op:=exclaim; data:=ask('Which scroll?'); end;\r
+ 'T': begin; op:=transport; data:=ask('Ped no.?')+ask('Whither?')*256; end;\r
+ 'U': op:=unfinished;\r
+ 'S': begin; op:=special; data:=ask('Which call?'); end;\r
+ 'O': begin; op:=opendoor; data:=ask('Ped no.?')+ask('Whither?')*256; end;\r
+ end;\r
+ until false;\r
+end;\r
+\r
+procedure editportals; { much t'same as editmagics }\r
+const codes : array[9..15] of char = '9ABCDEF';\r
+var\r
+ y:integer;\r
+ r,rr:char; p:byte;\r
+\r
+ procedure display;\r
+ var fv:byte;\r
+ begin;\r
+ cleardevice;\r
+ settextstyle(0,0,2); setcolor(15); outtextxy(0,0,'Portals.');\r
+ settextstyle(0,0,1);\r
+ for fv:=9 to 15 do\r
+ begin;\r
+ y:=fv*10-53;\r
+ setcolor(fv); outtextxy(100,y,'$'+codes[fv]);\r
+ with portals[fv] do\r
+ begin;\r
+ case op of\r
+ nix: begin; setcolor(8); outtextxy(140,y,'Nix'); end;\r
+ exclaim: begin;\r
+ setcolor(14); outtextxy(143,y,'Exclaim: '+strf(data));\r
+ end;\r
+ transport: begin;\r
+ setcolor(12);\r
+ outtextxy(143,y,'Transport to '+strf(hi(data))+\r
+ ', ped '+strf(lo(data)));\r
+ end;\r
+ unfinished: begin;\r
+ setcolor(15); outtextxy(143,y,'*** UNFINISHED! ***');\r
+ end;\r
+ special: begin;\r
+ setcolor(6); outtextxy(143,y,'Special call no. '+strf(data));\r
+ end;\r
+ opendoor: begin;\r
+ setcolor(11);\r
+ outtextxy(143,y,'Opening door to '+strf(hi(data))+\r
+ ', ped '+strf(lo(data)));\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ outtextxy(177,190,'Which do you want to change? (Esc=Exit) $');\r
+ end;\r
+\r
+ function ask(x:string):word;\r
+ var q:string; thomaswashere:word; e:integer;\r
+ begin;\r
+ cleardevice;\r
+ setcolor(10); settextstyle(0,0,3); outtextxy(0,100,x);\r
+ repeat\r
+ readln(q); val(q,thomaswashere,e);\r
+ until e=0; ask:=thomaswashere;\r
+ end;\r
+\r
+begin;\r
+ repeat\r
+ display;\r
+ repeat\r
+ r:=upcase(readkey);\r
+ if r=#27 then exit;\r
+ p:=pos(r,codes); { which are we editing? }\r
+ until p>0; { it must BE there... }\r
+ inc(p,8); setcolor(p); cleardevice;\r
+ outtextxy(177,17,'Editing portal $'+r+'.');\r
+ outtextxy(0,30,'New operation ( (N)ix, (E)xclaim, (T)ransport, (U)nfinished),');\r
+ outtextxy(30,40,'(S)pecial, (O)pening Door?');\r
+ repeat rr:=upcase(readkey) until rr in ['N','E','T','U','S','O',#27];\r
+ with portals[p] do\r
+ case rr of\r
+ #27: exit; { cancelling code }\r
+ 'N': op:=nix;\r
+ 'E': begin; op:=exclaim; data:=ask('Which scroll?'); end;\r
+ 'T': begin; op:=transport; data:=ask('Ped no.?')+ask('Whither?')*256; end;\r
+ 'U': op:=unfinished;\r
+ 'S': begin; op:=special; data:=ask('Which call?'); end;\r
+ 'O': begin; op:=opendoor; data:=ask('Ped no.?')+ask('Whither?')*256; end;\r
+ end;\r
+ until false;\r
+end;\r
+\r
+procedure editflags;\r
+var r:char;\r
+begin;\r
+ cleardevice;\r
+ settextstyle(0,0,2); setcolor(15); outtextxy(0,0,'Flags.');\r
+ settextstyle(0,0,1); setcolor(10);\r
+ outtextxy(100,30,'Press the letter of the flag you want to toggle.');\r
+ outtextxy(100,40,'Tab = flip screens, Esc/Enter = return to menu.');\r
+ setcolor(14); setfillstyle(1,0);\r
+ for r:='A' to 'Z' do\r
+ if pos(r,flags)>0 then outtextxy(ord(r)*20-1223,77,r);\r
+ repeat\r
+ repeat r:=upcase(readkey) until r in ['A'..'Z',#27,#13,#9];\r
+ case r of\r
+ 'A'..'Z': begin;\r
+ if pos(r,flags)>0 then\r
+ begin; { flag is on- switch it off }\r
+ delete(flags,pos(r,flags),1);\r
+ bar(ord(r)*20-1223,77,ord(r)*20-1213,87);\r
+ sound(1777); delay(7); nosound;\r
+ end else\r
+ begin; { flag is off- switch it on }\r
+ flags:=flags+r;\r
+ outtextxy(ord(r)*20-1223,77,r);\r
+ sound(177); delay(7); nosound;\r
+ end;\r
+ end;\r
+ #27,#13: exit;\r
+ #9: flipover;\r
+ end;\r
+ until false;\r
+end;\r
+\r
+procedure alsomenu;\r
+var r:char; t:byte;\r
+begin;\r
+ repeat\r
+ setactivepage(0); setvisualpage(0);\r
+ cleardevice; setcolor(15); settextstyle(0,0,2);\r
+ outtextxy(0,0,'Also... Main Menu');\r
+ settextstyle(0,0,1); setcolor(10);\r
+ outtextxy(100, 40,'1) Edit the names of an object');\r
+ outtextxy(100, 50,'2) View all names');\r
+ outtextxy(100, 60,'3) Edit the description of this object');\r
+ outtextxy(100, 70,'4) View all associations.');\r
+ outtextxy(100, 80,'5) Enter Lino mode.');\r
+ outtextxy(100, 90,'6) Edit magics.');\r
+ outtextxy(100,100,'7) Edit portals.');\r
+ outtextxy(100,110,'8) Edit flags.');\r
+ outtextxy(100,120,'9) Edit listen field.');\r
+ outtextxy(100,160,'S) Save');\r
+ outtextxy(100,170,'L) Load');\r
+ outtextxy( 80,180,'Tab) View other screen');\r
+ if current=0 then outtextxy(0,140,'< Main description of room >') else\r
+ outtextxy(0,140,'<'+names[current,1]+'>');\r
+ repeat\r
+ r:=upcase(readkey); if r=#9 then flipover;\r
+ until r in ['1'..'9','S','L',#0];\r
+ case r of\r
+ '1': begin;\r
+ repeat\r
+ t:=typeno('Which object? (0-30)');\r
+ until (t<30) or (t=255);\r
+ if (t<>255) and (t<>0) then names[t,1]:=typein(names[t,1]);\r
+ current:=t;\r
+ end;\r
+ '2': showallnames;\r
+ '3': names[current,2]:=typein(names[current,2]);\r
+ '4': showallassoc;\r
+ '5': lino;\r
+ '6': editmagics;\r
+ '7': editportals;\r
+ '8': editflags;\r
+ '9': listen:=typein(listen);\r
+ 'S': save;\r
+ 'L': load;\r
+ #0: if readkey=#45 then exit;\r
+ end;\r
+ until false;\r
+end;\r
+\r
+begin;\r
+ writeln('*** ALSO ***');\r
+ writeln;\r
+ write('No. of screen to edit?'); readln(n); load;\r
+ assign(f,'v:avalot.fnt'); reset(f); read(f,skinny); close(f);\r
+ gd:=3; gm:=0; initgraph(gd,gm,'c:\bp\bgi'); current:=0;\r
+ loadscreen;\r
+ alsomenu;\r
+end.\r
--- /dev/null
+program andexor; { Trippancy IV - original file }\r
+uses Graph;\r
+const\r
+ taboo=cyan;\r
+\r
+type\r
+ adxtype = record\r
+ name:string[12]; { name of character }\r
+ num:byte; { number of pictures }\r
+ xl,yl:byte; { x & y lengths of pictures }\r
+ seq:byte; { how many in one stride }\r
+ size:word; { the size of all the pictures }\r
+ end;\r
+\r
+\r
+var\r
+ gd,gm:integer;\r
+ adx:adxtype;\r
+ adxpic:array[1..24,0..1] of pointer; { the pictures themselves }\r
+ f:file; x:string; n:byte;\r
+\r
+procedure load(nam:string);\r
+var z:byte;\r
+ a:array[1..4] of pointer;\r
+ f:file; s:word;\r
+ xxx:string[40];\r
+ check:string;\r
+\r
+begin;\r
+ assign(f,nam);\r
+ reset(f,1);\r
+ blockread(f,xxx,41);\r
+ blockread(f,check,13);\r
+ blockread(f,check,31);\r
+ s:=imagesize(0,0,Getmaxx,75);\r
+ for z:=1 to 2 do\r
+ begin;\r
+ getmem(a[z],s);\r
+ blockread(f,a[z]^,s);\r
+ putimage(0,15+(z-1)*75,a[z]^,0);\r
+ freemem(a[z],s);\r
+ end;\r
+ close(f);\r
+end;\r
+\r
+procedure silhouette;\r
+var x,y,c:byte;\r
+begin;\r
+ setvisualpage(1); setactivepage(1); setfillstyle(1,15);\r
+ for gm:=0 to 3 do\r
+ for gd:=1 to 6 do\r
+ begin; { 26,15 }\r
+(* bar((gm div 2)*320+gd*40,20+(gm mod 2)*40,(gm div 2)*320+gd*40+35,(gm mod 2)*40+60); *)\r
+ for y:=1 to adx.yl do\r
+ for x:=1 to adx.xl do\r
+ begin;\r
+ setactivepage(0);\r
+ c:=getpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y);\r
+ setactivepage(1);\r
+(* if c<>taboo then putpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y,0); *)\r
+ if c=taboo then putpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y,15);\r
+ end;\r
+ getmem(adxpic[gm*6+gd,0],adx.size);\r
+ getimage((gm div 2)*320+gd*40+1,20+(gm mod 2)*40+1,\r
+ (gm div 2)*320+gd*40+adx.xl,20+(gm mod 2)*40+adx.yl,\r
+ adxpic[gm*6+gd,0]^);\r
+ end;\r
+end;\r
+\r
+procedure standard;\r
+var x,y,c:byte;\r
+begin;\r
+ setvisualpage(2); setactivepage(2);\r
+ for gm:=0 to 3 do\r
+ for gd:=1 to 6 do\r
+ begin; { 26,15 }\r
+ for y:=1 to adx.yl do\r
+ for x:=1 to adx.xl do\r
+ begin;\r
+ setactivepage(0);\r
+ c:=getpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y);\r
+ setactivepage(2);\r
+ if c<>taboo then putpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y,c);\r
+ end;\r
+ getmem(adxpic[gm*6+gd,1],adx.size);\r
+ getimage((gm div 2)*320+gd*40+1,20+(gm mod 2)*40+1,\r
+ (gm div 2)*320+gd*40+adx.xl,20+(gm mod 2)*40+adx.yl,\r
+ adxpic[gm*6+gd,1]^);\r
+ end;\r
+end;\r
+\r
+begin;\r
+ gd:=3; gm:=0; initgraph(gd,gm,''); fillchar(adxpic,sizeof(adxpic),#177);\r
+ load('v:avalots.avd');\r
+(* getmem(adxpic[1,1,1],adx.size); getimage(40,20,75,60,adxpic[1,1,1]^);\r
+ putimage(100,100,adxpic[1,1,1]^,0); *)\r
+ with adx do\r
+ begin;\r
+ name:='Avalot';\r
+ num:=24; seq:=6;\r
+ xl:=32; yl:=35; { 35,40 }\r
+\r
+ size:=imagesize(40,20,40+xl,60+yl);\r
+ end;\r
+ silhouette;\r
+ standard;\r
+ x:='Sprite file for Avvy - Trippancy IV. Subject to copyright.'+#26;\r
+ assign(f,'v:sprite1.avd');\r
+ rewrite(f,1);\r
+ blockwrite(f,x[1],59);\r
+ blockwrite(f,adx,sizeof(adx));\r
+ for gd:=1 to adx.num do\r
+ for gm:=0 to 1 do\r
+ blockwrite(f,adxpic[gd,gm]^,adx.size); { next image }\r
+ close(f);\r
+ closegraph;\r
+end.\1a
\ No newline at end of file
--- /dev/null
+program andexor2; { Trippancy IV - original file }\r
+uses Graph;\r
+const\r
+ taboo=cyan;\r
+\r
+type\r
+ adxtype = record\r
+ name:string[12]; { name of character }\r
+ num:byte; { number of pictures }\r
+ xl,yl:byte; { x & y lengths of pictures }\r
+ seq:byte; { how many in one stride }\r
+ size:word; { the size of all the pictures }\r
+ fgc,bgc:byte; { foreground & background bubble colours }\r
+ end;\r
+\r
+\r
+var\r
+ gd,gm:integer;\r
+ adx:adxtype;\r
+ adxpic:array[0..1] of pointer; { the pictures themselves }\r
+ f:file; x:string; n:byte; side2:integer; bigsize:word;\r
+\r
+procedure load(n:string);\r
+var z:byte;\r
+ a:array[1..4] of pointer;\r
+ f:file; s:word;\r
+ xxx:string[40];\r
+ check:string;\r
+\r
+begin;\r
+ assign(f,n);\r
+ reset(f,1);\r
+ blockread(f,xxx,41);\r
+ blockread(f,check,13);\r
+ blockread(f,check,31);\r
+ s:=imagesize(0,0,Getmaxx,75);\r
+ for z:=1 to 2 do\r
+ begin;\r
+ getmem(a[z],s);\r
+ blockread(f,a[z]^,s);\r
+ putimage(0,15+(z-1)*75,a[z]^,0);\r
+ freemem(a[z],s);\r
+ end;\r
+ close(f);\r
+end;\r
+\r
+procedure silhouette;\r
+var x,y,c:byte;\r
+begin;\r
+ setvisualpage(1); setactivepage(1); setfillstyle(1,15);\r
+ with adx do\r
+ begin;\r
+ for gm:=0 to 3 do\r
+ for gd:=1 to 6 do\r
+ begin; { 26,15 }\r
+ side2:=xl*6;\r
+ for y:=1 to yl do\r
+ for x:=1 to xl do\r
+ begin;\r
+ setactivepage(0);\r
+ c:=getpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y);\r
+ setactivepage(1);\r
+ if c=taboo then\r
+ putpixel((gm div 2)*side2+gd*xl+x,20+(gm mod 2)*yl+y,15);\r
+ end;\r
+ end;\r
+ bigsize:=imagesize(xl+1,21,xl*13,20+yl*2);\r
+ getmem(adxpic[0],bigsize);\r
+ getimage(xl+1,21,xl*13,20+yl*2,adxpic[0]^);\r
+ putimage(xl+1,21,adxpic[0]^,notput);\r
+ end;\r
+end;\r
+\r
+procedure standard;\r
+var x,y,c:byte;\r
+begin;\r
+ setvisualpage(2); setactivepage(2);\r
+ with adx do\r
+ begin;\r
+ for gm:=0 to 3 do\r
+ for gd:=1 to 6 do\r
+ begin; { 26,15 }\r
+ for y:=1 to yl do\r
+ for x:=1 to xl do\r
+ begin;\r
+ setactivepage(0);\r
+ c:=getpixel((gm div 2)*320+gd*40+x,20+(gm mod 2)*40+y);\r
+ setactivepage(2);\r
+ if c<>taboo then\r
+ putpixel((gm div 2)*side2+gd*xl+x,20+(gm mod 2)*yl+y,c);\r
+ end;\r
+(* getmem(adxpic[gm*6+gd,1],adx.size);\r
+ getimage((gm div 2)*side2+gd*xl+x,20+(gm mod 2)*yl+y,\r
+ (gm div 2)*side2+gd*xl*2+x,20+(gm mod 2)*yl*2+y,\r
+ adxpic[gm*6+gd,1]^); *)\r
+ end;\r
+ getmem(adxpic[1],bigsize);\r
+ getimage(xl+1,21,xl*13,20+yl*2,adxpic[1]^);\r
+ putimage(xl+1,21,adxpic[1]^,notput);\r
+ end;\r
+end;\r
+\r
+begin;\r
+ gd:=3; gm:=0; initgraph(gd,gm,''); fillchar(adxpic,sizeof(adxpic),#177);\r
+ load('v:avalots.avd');\r
+ with adx do\r
+ begin;\r
+ name:='Avalot';\r
+ num:=24; seq:=6;\r
+ xl:=33; yl:=35; { 35,40 }\r
+ fgc:=yellow; bgc:=red;\r
+\r
+ size:=imagesize(40,20,40+xl,60+yl);\r
+ end;\r
+ silhouette;\r
+ standard;\r
+ x:='Sprite file for Avvy - Trippancy IV. Subject to copyright.'+#26;\r
+ assign(f,'v:sprite1.avd');\r
+ rewrite(f,1);\r
+ blockwrite(f,x[1],59);\r
+ blockwrite(f,adx,sizeof(adx));\r
+ blockwrite(f,bigsize,2);\r
+ for gm:=0 to 1 do\r
+ begin;\r
+ putimage(0,0,adxpic[gm]^,0);\r
+ blockwrite(f,adxpic[gm]^,bigsize); { next image }\r
+ end;\r
+ close(f);\r
+ closegraph;\r
+end.\1a
\ No newline at end of file
--- /dev/null
+program andextest;\r
+uses Graph;\r
+\r
+type\r
+ adxtype = array[1..24,0..1] of pointer;\r
+\r
+var\r
+ gd,gm:integer;\r
+ s:word; f:file; n,anim,cp,t:byte;\r
+ adx:array[0..0] of adxtype;\r
+ back:array[0..1] of pointer;\r
+ x:integer;\r
+ ox:array[0..1] of integer;\r
+\r
+procedure andex(x,y:integer; n,num:byte);\r
+begin;\r
+ putimage(x,y,adx[num,n,0]^,andput);\r
+ putimage(x,y,adx[num,n,1]^,xorput);\r
+end;\r
+\r
+procedure loadadx(num:byte; x:string);\r
+var n:byte;\r
+begin;\r
+ assign(f,x);\r
+ reset(f,1); seek(f,59);\r
+ blockread(f,n,1); { No. of images... }\r
+ for gd:=1 to n do\r
+ for gm:=0 to 1 do\r
+ begin;\r
+ blockread(f,s,2); { size of next image... }\r
+ getmem(adx[num,gd,gm],s);\r
+ blockread(f,adx[num,gd,gm]^,s); { next image }\r
+ end;\r
+ close(f);\r
+end;\r
+\r
+begin;\r
+ loadadx(0,'d:sprite0.avd');\r
+ loadadx(1,'d:sprite0.avd');\r
+ gd:=3; gm:=0; initgraph(gd,gm,'');\r
+ for gd:=0 to 1 do\r
+ begin;\r
+ setactivepage(gd); setfillstyle(6,1); bar(0,0,640,200);\r
+ getmem(back[gd],s);\r
+ end;\r
+ x:=0; anim:=1; cp:=0; t:=2; setactivepage(0);\r
+ repeat\r
+ setactivepage(cp); setvisualpage(1-cp);\r
+ for gm:=0 to 1 do\r
+ begin;\r
+ if t>0 then dec(t) else\r
+ putimage(ox[cp],77,back[cp]^,copyput);\r
+ getimage(x,77,x+31,77+35,back[cp]^);\r
+ andex(x,177,anim+6,gm);\r
+ ox[gm,cp]:=x; inc(x,5);\r
+ end;\r
+ inc(anim); if anim=7 then anim:=1;cp:=1-cp;\r
+ until false;\r
+end.\1a
\ No newline at end of file
--- /dev/null
+{\r
+ ÛßÜ ÛßÜ ÜßßÜ ßÛß Ûßß Üß ßÛß ÜßÛßÜ ßÛß ÛÜ Û ÜÛßß ßÛß ÛßÜ Ûßß Û\r
+ Ûß ÛÛ Û Û Ü Û Ûßß ßÜ Û Û Û Û Û Û ÛÜÛ ßßßÜ Û ÛÛ Ûßß Û\r
+ ß ß ß ßß ßß ßßß ß ß ß ß ß ßßß ß ßß ßßß ß ß ß ßßß ßßß\r
+\r
+ ENID Edna's manager. }\r
+\r
+unit Arch; { Loads/ saves files. }\r
+\r
+interface\r
+\r
+uses Gyro;\r
+\r
+procedure save(name:string);\r
+\r
+implementation\r
+\r
+uses Dos,Scrolls;\r
+\r
+type\r
+ ednahead = record { Edna header }\r
+ { This header starts at byte offset 177 in the .ASG file. }\r
+ ID:array[1..9] of char; { signature }\r
+ revision:word; { EDNA revision, here 2 (1=dna256) }\r
+ game:string[50]; { Long name, eg Lord Avalot D'Argent }\r
+ shortname:string[15]; { Short name, eg Avalot }\r
+ number:word; { Game's code number, here 2 }\r
+ ver:word; { Version number as integer (eg 1.00 = 100) }\r
+ verstr:string[5]; { Vernum as string (eg 1.00 = "1.00" }\r
+ filename:string[12]; { Filename, eg AVALOT.EXE }\r
+ os:byte; { Saving OS (here 1=DOS. See below for others.} }\r
+\r
+ { Info on this particular game }\r
+\r
+ fn:string[8]; { Filename (not extension ('cos that's .ASG)) }\r
+ d,m:byte; { D, M, Y are the Day, Month & Year this game was... }\r
+ y:word; { ...saved on. }\r
+ desc:string[40]; { Description of game (same as in Avaricius!) }\r
+ len:word; { Length of DNA (it's not going to be above 65535!) }\r
+\r
+ { Quick reference & miscellaneous }\r
+\r
+ saves:word; { no. of times this game has been saved }\r
+ cash:integer; { contents of your wallet in numerical form }\r
+ money:string[20]; { ditto in string form (eg 5/-, or 1 denarius)}\r
+ points:word; { your score }\r
+\r
+ { DNA values follow, then footer (which is ignored) }\r
+ end;\r
+ { Possible values of edhead.os:\r
+ 1 = DOS 4 = Mac\r
+ 2 = Windows 5 = Amiga\r
+ 3 = OS/2 6 = ST }\r
+const\r
+ crlf = #13+#10;\r
+\r
+ ednafirst : array[1..177] of char =\r
+ 'This is an EDNA-based file, saved by a Thorsoft game. Good luck!'+crlf+\r
+ ^Z+ { 67 bytes... }\r
+ crlf+crlf+ { 71 bytes... }\r
+ '12345678901234567890123456789012345678901234567890'+\r
+ '12345678901234567890123456789012345678901234567890'+\r
+ '123456';\r
+\r
+ months = 'JanFebMarAprMayJunJulAugSepOctNovDec';\r
+ ednaID = 'TT'+#177+#48+#01+#117+#177+#153+#177;\r
+\r
+ ttage = 18;\r
+ ttwashere = 'Thomas was here ';\r
+\r
+procedure save(name:string);\r
+var\r
+ f:file;\r
+ eh:edhead;\r
+ groi:word;\r
+ groi2:string;\r
+begin;\r
+ fillchar(eh,sizeof(eh),#177); { Fill up the edhead }\r
+\r
+ inc(dna.saves); { It's been saved one more time... }\r
+\r
+ with eh do\r
+ begin;\r
+\r
+ { Info about this program }\r
+\r
+ id:=ednaid; { Edna's signature }\r
+ revision:=2; { Second revision of .ASG format }\r
+ game:='Lord Avalot d''Argent'; { Title of game }\r
+ shortname:='Avalot';\r
+ number:=2; { Second Avvy game }\r
+ ver:=100; { Version 1.00 }\r
+ verstr:='1.00'; { ditto }\r
+ filename:='AVALOT.EXE'; { program's filename }\r
+ os:=1; { Saved under DOS }\r
+\r
+ { Info on this particular game }\r
+\r
+ fsplit(name,groi2,fn,groi2); { fn = filename of this game }\r
+ getdate(d,m,y,groi); { Day, month & year when the game was saved }\r
+ desc:=RoomName; { Description of game (same as in Avaricius!) }\r
+ len:=sizeof(dna); { Length of DNA (it's not going to be above 65535!) }\r
+\r
+ { Quick reference & miscellaneous }\r
+\r
+ saves:=dna.saves; { no. of times this game has been saved }\r
+ cash:=dna.pence; { contents of your wallet in numerical form }\r
+ money:=lsd; { ditto in string form (eg 5/-, or 1 denarius)}\r
+ points:=dna.score; { your score }\r
+ end;\r
+\r
+ assign(f,name);\r
+ rewrite(f,1);\r
+\r
+ blockwrite(f,ednafirst,177);\r
+ blockwrite(f,eh,sizeof(eh));\r
+ blockwrite(f,dna,sizeof(dna));\r
+\r
+ for groi:=1 to ttage do\r
+ blockwrite(f,ttwashere,sizeof(ttwashere));\r
+\r
+ close(f);\r
+end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+(Spludwick's talk-file)\r
+PHUBARIUM,BLETCHIDE,POTION\r
+\r
+\r
--- /dev/null
+(Geida's talk-file)\r
+ROBIN,HOOD
\ No newline at end of file
--- /dev/null
+ ÜÛÛÛßßßßßÛÛÛÛÜ\r
+ ÛÛß ÛÛÛÜ\r
+ ÜÛ ßÛÛÛÜ\r
+ ÜÛß ßÛÛÛÜ\r
+ Ü ÛÛ\r
+ ÛÛ ÛÛ\r
+ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÜßßÛ ÛÛÛÜßÛÛÛÛÛÛÛÛÛÛÛÛßßßßßÜÜÜÜÜÛ\r
+ßßßßßßßßßßßßßßßßßßÛßßßßßßßßßÛßßßßßßßßß ßÛÛÛÜÜ ßÛÛÛ ßßßßßßÜÜÜÜÜÜÛÛÛÛßßßßß\r
+ ÜÛÜ ÜÛÛÛÛÛÛÜÛÛ ÛÛ ßßßßÛÛÛÛÛÛÛÛÛÛÛÛÛßßßßß ÜÛÛÜ ÜÜÜÛÜÜÛÜÜ\r
+ ÛÛÛ ÛÛßÛÛÛÛÛÛÛÛ ÛÛÜ ÛÛÛ ÛÛÛÛÛÜ ÛÛÛÛÛÛÛÛÛÛÛ\r
+ ßÛÛÛÜÜÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÜÜÛÛÛÜ ÛÛ ÛÛß ÛÛ ÛÛÛßßÛÛßÛÛÛ\r
+ ßÛÛÛÛÛßÛÛÛ ÛÛÛÛ ÛÛÛÛÛß ÛÛÛÛßÛÛÛ ÛÛÛ ÛÛÛ ÛÛÜ ÛÛÛ ÛÛ ÛÛ\r
+ ÛÛÛÛ ÛÛÛ ßÛÛ ÛÛ ÛÛÛÛ ÛÛ ÜÜ ÛÛÜ ÛÛÛ ÛÛÛ ÛÛß ÛÛ ÛÛ\r
+ ÛÛßÛÛ ÛÛÛ ÜÛÛ ÛÛ ÜÛÛÛÛ ÛÛß ÛÛ ßÛÛ ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ\r
+ ÛßÜÛ ÛÛÛÛ ÛÛÜ ÛÛ ÛÛÛÛÛ ÛÛÛ ÛÛÜ ÛÛÜ ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ\r
+ ÛÛÜÛ ÛÛÛÛ ÛÛß ÛÛ ÛÛÛ ÛÛÛ ßÛÛÛÛÛÜÜÜÜÜÛÛÛÜÜÛÛÛÛÛÛÛÛß ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ\r
+ ÛÛÛÛ ÜÛÛÛß ÛÛ ÛÛ ÛÛÛÜÜÜÜÛÛß ßßßßßßßßßÛÛßßßßß ÛÛÛÛÜ ÛÛÛ ÜÛÛ ÛÛ ÛÛÜÜ\r
+ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛ ÛÛ ÛÛÛÛÛÛÛÛÛÛ ÛÛ ÛÛÛÛÛ ÛÛÛ ÛÛÛÛ ÛÛ ÛÛÛÛÛ\r
+ ÛÛÛ ÛÛÛÛ ÛÛ ÛÛ ÛÛÛÜ ßÛÛÛ ÛÛÛ ÛÛÛÛÛ ÛÛÛ ÛÛÛß ÛÛ ÛÛÛÛ\r
+ ÛÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛß ÛÛÛÜ ÛÛ ÛÛÛÛ ÛÛÛ ßÛÛ ÛÛ ßÛÛ\r
+ ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛÛ ßÛÛÛ ÛÛ ÛÛÛ ÛÛÛ ÛÛ\r
+ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛÛ ÛÛÛ ÛÛ\r
+ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛÛ ÛÛ ÛÛ ÜÜÜÜÛÛÜÜ ÛÛÛ ÛÛÛ Ü ÛÛ Ü\r
+Ü ÛÛÛ Ü ÛÛÛ ÛÛÛÜ ÜÛÛÛÛÛÛ ÛÛÜÜ ÛÛ ÜÜÛÛÛßßßÛßÛÛÛÛÛÜÜ ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ\r
+ÛÜ ÛÛÛÛÛ ÛÛÛ ßÛÛÛÜÛÛÛÛÛÛÛ ÜÛÛÛÛ ÛÛÜ ÜÛßßß ÛÛ ßßßÛÛÛÜ ÛÛÛ ÛÛÛ ÛÛÜÛÛÜÛÛ\r
+ÛÛ ÛÛÛÛÛ ÛÛÛÛÛÜ ÛÛÛÛÛÛÛÛÛÛÛÜÛÛßÛÛÛÛÛÛÛ ÜÛß ÜÛ ßÛÛÛÜ ÛÛÛÛÛß ÛÛÛÛÛÛÛÛ\r
+ÛÛÛÛß ß ÛÛÛÛÛß ÛÛÛß ÛÛß ÛÛÛß ßÛÛßßÛÛ Ûß ÜÛ ßÛÛÛÜ ßÛÛß ßÛÛÛÛß\r
+ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜ ÛÛ ÜÜÜÜÜ ÛÛ ÜÜÜÜÜÜÜÜÜÜÜÜßÛÛÛ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ\r
+ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛ ÛÛÛßÜÛÛßÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\r
+ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜßÛÜßÜÛÛßÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\r
+ ßßßß
\ No newline at end of file
--- /dev/null
+\e[0m\e[2J\e[7C\e[31mÜÜ Ü ÜÜ ÜÜÜ\e[37m\e[14CBack in good old A.D. \e[1m1176\e[0m...\r
+ \e[31mÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ\r
+ÜÛÛÛÛÛÛÛ\e[35;41;1mÜ\e[0;35;41mÜ\e[1mÜ \e[0;35;41mÜÜÜÜÜÜÜ\e[34mÜÜ\e[35mÜÜ\e[6C\e[34;40;1m ÜÛßÛÜ Lord\e[12CßÛÛ\e[14CÜÛ\r
+ \e[0;30;41mÜ \e[35;1mß\e[45mÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛ\e[40mÜ \e[34m ÛÛ ÛÛÜÜÜ ÜÜÜ ÜÜÜÜ\e[5CÛÛ\e[5CÜÜÜÜÜ ÜÜÛÛÜÜ\r
+ \e[0;30;41mÜÜÜÜ\e[35;1mÜÛÛÛÛÛÛÛÛÛÛÛÜÜ\e[0;31mß\e[6C\e[34;1m ÛÛÜÜÜÛÛ ÛÛ ÛÛ ÜÜÜÛÛ ÛÛ ÛÛ ÛÛ ÛÛ\r
+ \e[0;31mÜÜÜ\e[37;41;1mßßÛÛ\e[47mÜßÜ \e[0;45mÜ\e[30;1mÜ\e[0;45mÜ\e[30;1mÜ\e[40mÜÜ\e[9C\e[34m ÛÛ ÛÛ ßÛÜÛß ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÜÜ\r
+ \e[0;30;41mÜÜ \e[37;1mßß\e[0;31;47mÜ\e[37;41;1mß\e[0;31;47mÜ\e[30;41;1mß\e[0;31;47mÜ\e[30;41;1mßßß\e[8C\e[34;40m ßß ßß ß\e[5Cßßßßßß ßßßß ßßßßß\e[5Cßßß\r
+ \e[31mÜ\e[41mÜÜÛÛÛÜ ÜÜÜ \e[0;30;41mÜ\e[31;1mÜÜ \e[44C\e[34;40md'Argent\r
+ \e[31;41mÛÛÛÛÛ\e[40mÜÜßßÛÛÛÜ ßÛÛÛ\r
+ ÛÛÛß\e[33;43mß\e[40mß\e[31;43mß\e[40mÜ ßßÛÛÛÜÜ \e[35mÛÛ\e[45mßß\r
+\e[5C\e[0;33mÛ\e[43;1mÜ\e[0;30;43mÜßßßÛ\e[33;1mß\e[0;33mÛ\e[1mÜ\e[0;33mÜ\e[31;1mßßÛÛ \e[35mßßßß\e[11C\e[33mHe's back...\r
+ \e[31mÛÛÛ\e[43mÜ\e[0;33mÜß\e[31;1mÜÛÛÛÛÛÛÜ ß\r
+ ßß\e[44mßßßß\e[0;34mÛÛÛÛ\e[44;1mÜ Ü Ü \e[40mÜ\e[0;34mÜÜ\e[24C\e[33;1mAnd this time,\r
+\e[5C\e[34mÛ\e[44mÜÛ ÜÛ ß\e[0;30;44mÜÜ\e[34;1mÛÛÛÛÜßÜ\e[0;34mÜ\e[28C\e[33;1mhe's wearing tights...\r
+\e[6C\e[34mÛÛ\e[44mß\e[0;34mÛ\e[44;1mÜß\e[0;34mÛÛ \e[1mÛÛÛÛ\e[44mÜß\e[0;34mÛ\e[30;44mÜ\r
+\e[5C\e[34;1mÛÛÛÛßÜ \e[0;31mÜ\e[34;41;1mß\e[31;44mÜ \e[34mÜß\e[0;34mÛ\e[12C\e[31mA Thorsoft of Letchworth game. * Requires EGA\r
+\e[5CÛÛ\e[41;1mß\e[44mÜÜ\e[34mÜ \e[0;30;41mÜÜ\e[31;1mÜßÛ\e[44mÜÜÜ\e[40mÜ\e[14C\e[0;31mand HD. * By Mike, Mark and Thomas Thurman.\r
+\e[5CÛÛ\e[41;1mßÜßßÛÛÛ\e[40mÜÜÜÜÜÜßßßßßßßß\e[10C\e[0;31mSfx archive- \e[34;1mDownload \e[33mAVLT10.EXE\e[34m now!\r
+\e[0m
\ No newline at end of file
--- /dev/null
+ First there was Avaricius...\r
+\r
+ Then, over a thousand years later, there came\r
+\r
+ Lord\r
+\r
+ oO"Oo "OO "OO oO"Oo "OO" oO"Oo O"OO"O\r
+ OO OO OO OO OO OO OO OO OO OO\r
+ OOoooOO OO OO OOoooOO OO OO OO OO\r
+ OO OO OO OO OO OO OO o "Oo oO" OO\r
+ "" "" """ "" "" """""""" """ """"\r
+ d'Argent\r
+\r
+ (A Mediaeval Graphical Adventure Game)\r
+\r
+ Copyright (c) 1995, Mike, Mark and Thomas Thurman.\r
+\r
+\r
+ Version 1.3 - December 1995\r
+\r
+\r
+ \r
+ ****************************************************************************\r
+ * NB: Read the legal stuff at the end soon. Quick synopsis: Not to be *\r
+ * hacked up or sold without our written consent. To be freely distributed. *\r
+ * Don't blame us for anything this program does. *NO WARRANTY!* *\r
+ ****************************************************************************\r
+\r
+\r
+\r
+ Background\r
+ """"""""""\r
+\r
+Jupiter had had a hard day. Being head of the Mount Olympus Associate Group\r
+PLC was no picnic. In the morning, he had overheard the Naiads talking of\r
+going on strike again. Jupiter sighed- another drought. Then Pluto had come\r
+up to his office again to ask him if he would consider selling out, and when\r
+Jupiter refused, had gone off shouting that he would get Phoebus Apollo to\r
+print the story. Finally, Pan had told him that he had invented a sort of\r
+flying machine, and asked whether he could start an airline company on Mount\r
+Olympus. "You could call it the Jupiter-Pan-Olympian company." he had said.\r
+Jupiter said that he didn't see anything wrong with materialising in a puff\r
+of smoke, whereupon Pan went off in a huff. He had left a note: "Will not set\r
+up company on Olympus; have gone to America instead. Your name will not be\r
+included on the headed notepaper."\r
+\r
+Jupiter sighed again. At least he was off-duty now. The job wasn't that bad\r
+and it did have its perks. Omnipotence had had to go years ago, but you still\r
+got the executive flat in Docklands and the sports car. He'd taken to driving\r
+it around London recently. Being immortal certainly had its benefits.\r
+\r
+Another benefit of the job, he reflected, is the technology. That was the\r
+best thing for years. It was only in a few days' time that he had gone down\r
+to the end of the twentieth century and bought himself a laptop (his\r
+time-travelling wasn't what it used to be.) He had been rather annoyed that\r
+the installation program wasn't in Greek, but you couldn't have everything.\r
+\r
+The dryads, who were, of course, greatly in favour of the paperless office,\r
+had typed in all the records from the old ledger filing system for him only a\r
+day or two before. He decided to play around with it.\r
+\r
+ > Enter number of record:\r
+\r
+said the screen helpfully. Jupiter frowned at the screen; it was all English\r
+to him. At least he could remember how the numerals worked. He chose a number\r
+at random:\r
+\r
+ > CLXXVII\r
+\r
+he typed. Nothing happened, so he waited for a few minutes and then\r
+remembered he hadn't pressed Enter.\r
+\r
+ > Non-numeric characters in response, please try again\r
+\r
+announced the screen. Jupiter had never been much good at English and this\r
+was beyond him, but after a few minutes he realised that he was supposed to\r
+use the Arabic number system. He picked another random number and typed it\r
+in.\r
+\r
+ > 17417\r
+\r
+This time, he remembered to press Enter. The screen said:\r
+\r
+ > Report no. 17417: D. Avaricius Sextus\r
+\r
+ > Killed: while fighting as gladiator.\r
+ > (Had, in fact, killed 17 lions previously,\r
+ > in self-defence.)\r
+\r
+Jupiter stared at the screen as the text slowly scrolled up it. Of course! It\r
+was all coming back to him now. He called on the intercom for Neptune. There\r
+was a splashing sound, water flew everywhere, and Neptune appeared. The\r
+computer, having been hit by several stray drops, fizzed and exploded,\r
+obviously without hurting anyone.\r
+\r
+"Do you remember this chap?" asked Jupiter. "Quite tall? Red hair? Lived in\r
+Pompeii? Name of Avaricius?"\r
+\r
+"Hmm... it was a long time ago..." said Neptune. "Hang on a sec, yes, I do\r
+remember him. I set him up with that pretty little mermaid... what was her\r
+name, now..."\r
+\r
+"Never mind that," said Jupiter, "I've just remembered something. Do you know\r
+who warned him about the disaster?"\r
+\r
+"I heard on the grapevine it was a soothsayer named Quicphingus." said\r
+Neptune.\r
+\r
+"On the grapevine?"\r
+\r
+"Yeah, Bacchus told me."\r
+\r
+"Oh, right. Look, Quicphingus never existed! It was me! In disguise!"\r
+\r
+A slow smile began to spread itself across the sea-god's features. "You? You\r
+crafty old god!" he chuckled. "You dressed up as a soothsayer just to save\r
+him from the volcano?"\r
+\r
+"Oh, you know, I just felt like helping someone..." said Jupiter. "Well,\r
+actually, no, I'd promised to find that mermaid a husband. Vowed to on the\r
+Styx. Silly of me."\r
+\r
+"It's amazing." said Neptune. "I never realised it was you."\r
+\r
+"Did this Avvy chap have any children by this mermaid, then?" asked Jupiter.\r
+"I forgot to find out."\r
+\r
+"Oh, yes, lots. They spread all over the earth. D'you know something?"\r
+\r
+"Yes, everything. What in particular?" asked Jupiter.\r
+\r
+"Genetics. A lot of his descendants turned out exactly like him. I mean,\r
+totally. Even talked like him. Amazing."\r
+\r
+"That sounds interesting." mused the king of the gods. "Could I see one of\r
+them?"\r
+\r
+"Welllll...." said Neptune, "there's one... no, he wouldn't do, the game'd be\r
+banned, there's another... yes! There's one in 1189. Look."\r
+\r
+A huge puddle had spread across Jupiter's desk from the dripping hair of the\r
+ocean god. Neptune pointed at this and a shaky image formed, which grew\r
+steadily clearer. It seemed to be a picture of a bedroom in a mediaeval\r
+castle.\r
+\r
+Both the gods craned forwards and peered closer into the screen...\r
+\r
+\r
+ Getting started\r
+ """""""""""""""\r
+\r
+Assuming you've already installed Avvy (if you haven't, use the INSTALL\r
+program or just run AVLT100.EXE), you can start to play. To do this,\r
+you must type:\r
+\r
+ AVALOT\r
+\r
+at the Dos prompt (something like C:\AVALOT> or C>.) The game will then load\r
+and you're ready to have fun. A sort of blue whirly thing will appear; if\r
+you don't want to sit and read all the credits, press any key. The whirly\r
+thing will then vanish, to be replaced by a menu. Soon, you'll see what you\r
+can do from this menu; for now, just press Enter. The game proper will then\r
+load and you'll see Avalot fast asleep in bed.\r
+\r
+\r
+The first thing you must do is to wake him up! Just type WAKE UP on the\r
+keyboard and press "Return" or "Enter" (usually marked with an arrow with a\r
+quarter turn in it.) Avvy will then wake. Typing GET UP will get him dressed\r
+and on his feet, and you'll be ready to progress to the next section of the\r
+manual!\r
+\r
+(NB: Since you need to do this whenever you start the game, there's a\r
+short-cut: press f5 twice to get him on his feet.)\r
+\r
+\r
+ Moving Avvy around\r
+ """"""""""""""""""\r
+\r
+OK, so you've woken Avvy up and he's ready to explore the world. But... how\r
+do you move him around? Well, there are four ways:\r
+\r
+ 1) For real traditionalists. This method involves using the\r
+ arrow keys on the right-hand side of your keyboard. Press\r
+ any arrow to make him walk in that direction (eg, left\r
+ arrow makes him walk left.)\r
+\r
+ There can be up to two sets of arrow keys on your keyboard.\r
+ There's a set with numbers on (like 7 Home, 4 <--, 1 End,\r
+ etc.). This is called the Numeric Keypad. If you have\r
+ a snazzy new-style keyboard, there will also be a cluster of\r
+ (probably grey) keys which only have arrows on. Some people\r
+ prefer using these, but I've never lost the habit of using\r
+ the numeric keypad for control (hey, I started out on an\r
+ XT- and Avaricius was written on it.) But use whichever\r
+ arrows you prefer, I don't mind. Right. If you choose\r
+ to use the numeric keypad, bear in mind that Num Lock must\r
+ be *off*, otherwise you'll just get a string of numbers\r
+ on the command line.\r
+\r
+ Another point in favour of the numeric keypad: The keys\r
+ in between the arrow keys (Home, PgUp, PgDn, and End) make\r
+ Avvy walk diagonally (so Home = up + left, etc.) It's\r
+ faster to walk using these (sometimes). One other point:\r
+ DON'T hold arrow keys down. It's POINTLESS! Press once to\r
+ start him walking, and he's off.\r
+\r
+ OK, you're asking, so I've made him walk, how do I stop him?\r
+ Well, apart from running into a wall or similar, the usual\r
+ way of stopping Avvy walking from the keyboard is to press\r
+ the arrow pointing the way you're going. So to stop him\r
+ walking up, for example, hit Up. I know it sounds weird,\r
+ but it's simple in practice. Trust me. The other way of\r
+ stopping Avvy only works on an enhanced keyboard (the Bios\r
+ isn't really up to it on the older ones.) Just hit the 5\r
+ in the middle of the keypad and he'll stop straight away.\r
+\r
+ That was the ONLY practical method of control in Avaricius.\r
+ However, time and computer hardware wait for no man, let\r
+ alone Avvy, so we now support three other methods...\r
+\r
+ 2) Using the joystick. All you hardened games players out there,\r
+ stop drinking cement and listen. You'll have to configure\r
+ the joystick before you use it, using the Setup program\r
+ (see below.) This is firstly because it's annoying to have\r
+ to set it up every time you play (like in some other games-\r
+ mentioning no names) and secondly because the Bios is\r
+ frequently untrustworthy on the question of joysticks.\r
+ So it's much more reliable for you, the user, to set it up\r
+ than for me, the programmer, to check using the Bios. If\r
+ you *don't* set it up, Avvy will ignore your joystick,\r
+ so don't forget to. Whenever you run Avvy, just press ctrl-J\r
+ to enable the joystick, and the cursor keys will be ignored.\r
+ Press ctrl-K to switch them back. One button will then stand\r
+ for "open door", and the other for "look". You'll still have\r
+ to use the keyboard for most things, though. Happy waggling!\r
+\r
+ 3) Using the mouse and the toolbar. (I know Avaricius DID support\r
+ the mouse, but did *you* use it? The mouse control was\r
+ unworkable- it was sort of bolted on after I'd finished the\r
+ keyboard routines. Not So With Avalot.) There's a colourful\r
+ thingy second from the left on the toolbar (to the right of\r
+ the space saying "Avalot".) This is called a compass. Click\r
+ on the arrows to make Avvy walk around, and the octagonal\r
+ "STOP" sign in the middle to make him... um... STOP.\r
+\r
+ 4) Less fiddly and more FUN! Click on the picture area of the\r
+ screen. If you click to the left of Avvy, he'll walk left.\r
+ If you click to the right, he'll walk right. If you... well,\r
+ do I have to tell you about all eight points of the compass?\r
+ You get the idea. If you click on our hero himself,\r
+ he'll stop walking.\r
+\r
+\r
+\r
+ A Shorter Avvy Vocabulary\r
+ """""""""""""""""""""""""\r
+\r
+OK, I'm not going to tell you ALL the words that Avvy recognises. It would\r
+give the game away. (Yes, I know you're supposed to give shareware games\r
+away. Never mind.) But here are a few verbs to start you off:\r
+\r
+ LOOK gives you a description of the room you're in. VERY useful.\r
+ In fact, so useful that it has its own key. Just press f8\r
+ instead.\r
+\r
+ EXAMINE tells you about an object you're carrying, a person who's in\r
+ the same room as you, or part of the scenery. For example,\r
+ EXAMINE GRAFFITI. Commonly abbreviated to EXAM or just X.\r
+\r
+ INVENTORY gives you a list of everything you're carrying. Commonly\r
+ abbreviated to INV, Ctrl-I or just Tab.\r
+\r
+ OPEN opens things. Useful for doors. You can press f7 instead.\r
+\r
+ PAUSE pauses the game. f6 works too.\r
+\r
+ GET takes something lying about. For example, GET LASER (just to\r
+ let you know I'm not using a real example.)\r
+ (Also called TAKE.)\r
+\r
+ EAT ...drink and be merry.\r
+\r
+ DRINK ...to me only with thine eyes.\r
+\r
+ LISTEN tells you what Avvy can hear.\r
+\r
+ LOAD loads a game in from disk. If you already know the filename,\r
+ add it after the command, eg LOAD HELEN1. (You don't need\r
+ to add ".ASG".) If you don't know the filename, just type LOAD\r
+ and you'll get into the filer. See below.\r
+ (Also known as RESTORE.)\r
+\r
+ SAVE does the opposite of Load- saves the current state of the game.\r
+ You may add a filename after the command.\r
+\r
+ RESTART begins the game all over again.\r
+\r
+ WEAR puts something on. It must be a real item of clothing.\r
+\r
+ BOSS Just in case S.W.M.B.O. turns up, this puts up the boss screen.\r
+\r
+Of course, you can use words other than verbs, plus several verbs that\r
+aren't listed here. But I'm not telling you what they are! You'll have\r
+to find out for YOURSELVES! <laugh of anticipation>\r
+\r
+\r
+\r
+ The start of the game...\r
+ """"""""""""""""""""""""\r
+\r
+OK, just to get you started. You're asleep in your bed; type WAKE UP and\r
+you'll be awake. Type GET UP to get out of bed (good start.) Now practise\r
+walking around your bedroom with the cursor (arrow) keys.\r
+\r
+At the bottom of the screen is a sort of black trapezium with a white top.\r
+This is a standard adventure game symbol for "door in near wall" (you\r
+wouldn't be able to see it otherwise.) If you walk into this trapezium\r
+you'll find yourself on the other side of the door.\r
+\r
+A rather revolting serf named Crapulus will walk up and greet you. If you\r
+want, you can talk to him, or you can return to the door and type OPEN DOOR\r
+to go back into your room. When you've finished talking to Crapulus, he'll\r
+go off to the pub, leaving you alone in the room. Try walking to the left,\r
+then in the next room to the door in the near wall. This leads into\r
+Spludwick's room.\r
+\r
+Talk to Spludwick. Ask him about things. He can tell you a lot about the\r
+game. While you're in his room, try looking at all the things there.\r
+For example, on the floor you'll see a message. Typing\r
+\r
+ LOOK AT MESSAGE\r
+or READ MESSAGE\r
+or EXAMINE MESSAGE\r
+or just X MESSAGE\r
+\r
+(X short for eXamine) will tell you about it in more detail. If you want,\r
+you can type\r
+\r
+ ASK SPLUDWICK ABOUT MESSAGE\r
+\r
+and Spludwick will tell you about it. This is where I'm going to leave you\r
+for now. See if you can work out the rest of the game for yourself!\r
+\r
+(Who said it doesn't pay to read the documentation?)\r
+\r
+\r
+ Some important hints to help you get more information:\r
+ """"""""""""""""""""""""""""""""""""""""""""""""""""""\r
+\r
+ 1) Whenever you go into a room, type LOOK (or press f8.) This will give\r
+ you a description of the room. Look around. Anything you can see,\r
+ you can ask about. Mostly, you should get an answer. For example,\r
+ in your bedroom at the start of the game, you'll see the bed, the\r
+ fireplace, and your wife, Arkata. Typing EXAMINE or X and then the\r
+ name of any of these things will give you information about it.\r
+ For example,\r
+\r
+ EXAMINE FIREPLACE\r
+ X ARKATA\r
+ LOOK AT BED\r
+\r
+ (Look At is the same as Examine, by the way.)\r
+\r
+ Examining a object you're carrying or a person will cause a\r
+ picture of it/them to appear in the toolbar.\r
+\r
+ 2) Ask characters for information. Ask Dogfood about Ibythneth, for\r
+ example, and vice versa. Some characters may not be very good at\r
+ answering questions, though. Oh, yes... if you just want to chat\r
+ to somebody without any particular subject, try using the Talk\r
+ command. For example,\r
+\r
+ TALK TO DOGFOOD\r
+ ASK SPLUDWICK ABOUT DOGFOOD\r
+ SAY "SPLUDWICK" TO CRAPULUS\r
+ TALK TO AYLES ABOUT IBYTHNETH\r
+ TALK TO YOURSELF\r
+\r
+ 3) There's a limit on how much you can hold. If you reach this limit,\r
+ consider how else you can get rid of things you're carrying that\r
+ have become useless, given that you're not allowed to drop them.\r
+\r
+ Keys\r
+ """"\r
+(The kind you find on keyboards.)\r
+\r
+Here's a list of all the keys that are valid in Avalot:\r
+\r
+ Key What it does\r
+ === ============\r
+ f1 Gets you context-sensitive online help! See "Help", below.\r
+ f2 Switches the sound on and off.\r
+ ctrl-f2 Saves the game. If there's no filename, you'll be asked.\r
+ f3 Restores the last line you typed.\r
+ ctrl-f3 Invokes the filer.\r
+ f4 Restarts the game.\r
+ alt-f4 Quits the game.\r
+ f5 Gets up, lies down, sits down, etc.\r
+ ctrl-f5 Invokes the DOS shell.\r
+ f6 Pauses the game. (=PAUSE command.)\r
+ f7 Opens a nearby door. (=OPEN command.)\r
+ ctrl-f7 Redraws the screen.\r
+ f8 Puts up a description of this room. (=LOOK command.)\r
+ f9 Tells you your score and your rank. (=SCORE command.)\r
+ f10 Quits the game (again.)\r
+ shift-f10 Puts up the About box.\r
+ f11 Synonym for ctrl-f2 (save).\r
+ f12 Synonym for ctrl-f3 (load).\r
+ alt-B Puts up the Boss screen.\r
+ alt-X Quits the game (yet again.)\r
+ ctrl-R Switches on Running.\r
+ ctrl-W Switches on Walking.\r
+ alt-R Repeat last clock chimes.\r
+ Tab Puts up an inventory list.\r
+ ctrl-I The same.\r
+ Enter Performs current command, or banishes a scroll.\r
+ Arrows Move Avvy about.\r
+ Numeric 5 Stops Avvy walking (but ONLY on an enhanced keyboard.)\r
+ PgUp, PgDn,\r
+ Home & End Make Avvy walk diagonally.\r
+ ctrl-Home Moves the cursor to the START of the line.\r
+ ctrl-End Moves it to the END of the line.\r
+ ctrl-Left Moves it one space backwards.\r
+ ctrl-Right ...forwards.\r
+ Backspace Its usual function.\r
+ Del Ditto.\r
+ ctrl-J Switches on joystick support, and disables the cursor keys.\r
+ ctrl-K The reverse: disables joystick, enables the cursor keys.\r
+ Escape Gets you in or out of the drop-down menus, or does the\r
+ same banishing trick as Enter.\r
+ Plus (+) Usually just adds a + sign, but also banishes scrolls.\r
+ Pause Pauses the entire computer until you press a key (as usual.)\r
+Just about\r
+ anything else gets added onto the end of the command line.\r
+\r
+\r
+ The drop-down menus\r
+ """""""""""""""""""\r
+\r
+ Here's a short guide to playing Avalot single-handedly: in other\r
+words, how to use the drop-down menus to speed things up.\r
+\r
+ There are six menus:\r
+\r
+ File Game Action Objects People With\r
+ New game Help Do...\r
+ Load... Boss key Pause\r
+ Save Untrash \ Open door (these three vary)\r
+ Save as... \ screen Look\r
+ DOS shell Score+rank Inventory\r
+ Quit About Avvy Walk or run\r
+\r
+ And here's what they do:\r
+\r
+ File | New game (short cut: f4)\r
+\r
+ This restarts the game from the beginning. If you haven't saved your\r
+ game so far, you'll lose it. You're given a yes/no box to make your\r
+ mind up.\r
+\r
+ File | Load... (short cut: ctrl-f3, or f12)\r
+\r
+ This brings up the filer.\r
+\r
+ File | Save (short cut: ctrl-f2, or f11)\r
+\r
+ This saves your game, provided that it has been saved before (because\r
+ otherwise it doesn't have a filename, and then this is synonymous with\r
+ File | Save As).\r
+\r
+ File | Save As... (no short cut.)\r
+\r
+ This asks you for a name for the game and then saves it with that name.\r
+\r
+ File | DOS shell (short cut: ctrl-f5)\r
+\r
+ You can suspend your game and run other programs using this. Please\r
+ try not to run any TSR (terminate and stay resident) programs while\r
+ using this (like SideKick, KEYB, GRAPHICS...) because you'll cause\r
+ no end of problems with the memory arangements.\r
+\r
+ File | Quit (short cut: alt-X, alt-f4, f10, etc...)\r
+\r
+ This lets you out of the game. (I think you could have guessed that.)\r
+\r
+ Game | Help (short cut: f1)\r
+\r
+ Brings up the help system.\r
+\r
+ Game | Boss key (short cut: alt-B)\r
+\r
+ Brings up the SWMBO protection screen (it looks like a spreadsheet).\r
+\r
+ Game | Untrash screen (short cut: ctrl-f7)\r
+\r
+ Makes the program redraw the whole screen. I wish more games had\r
+ this option- it's very useful when crazy TSRs draw weird patterns of\r
+ red dots on the screen, or when Windows doesn't *quite* get the full\r
+ screen back again.\r
+\r
+ Game | Score and rank (short cut: f9)\r
+\r
+ This gives you your score, a "ranking" based on this, and the (rough)\r
+ time you've spent playing the game so far (which is saved in the file\r
+ and continues when it's re-loaded).\r
+ \r
+ Game | About Avvy (short cut: shift-f10)\r
+\r
+ This brings up the About box, which includes version information.\r
+\r
+ Action | Do... (short cut: f5)\r
+\r
+ Actually, this isn't called Do, unless it doesn't work. At certain\r
+ points in the game, some action is important. When you reach them,\r
+ this option will take on a different form. A good example is right\r
+ at the start where you're asleep in bed: the f5 key and this menu\r
+ option both mean "wake up". Because of this, you can control more\r
+ of the game with the mouse.\r
+\r
+ Action | Pause (short cut: f6)\r
+\r
+ Very, very self-explanatory.\r
+\r
+ Action | Open the door (short cut: f7)\r
+\r
+ There are two actions which people spend most of their time typing\r
+ in games such as this, and so they have been given their own menu\r
+ options, and an unshifted function key each. One of them is this one,\r
+ opening doors (which is also used to mean "enter town" on the map),\r
+ and the other is...\r
+\r
+ Action | Look around (short cut: f8)\r
+\r
+ ...this one. It's equivalent to typing LOOK.\r
+\r
+ Action | Inventory (short cut: Tab or ctrl-I)\r
+\r
+ The time-honoured command to check your rucksack. Actually, Avalot\r
+ doesn't have a rucksack. Nor does he carry a flickering lamp, a\r
+ bottle of water or any of the other Colossal paraphernalia; however,\r
+ to prove the intellectual geanology of this game, GET INVENTORY works\r
+ just as well.\r
+\r
+ Action | Walk slowly (short cut: ctrl-W)\r
+ or \r
+ Action | Run fast (short cut: ctrl-R)\r
+\r
+ These adjust Avvy's walking for precision or speed, respectively.\r
+ Only the relevant one is displayed (the one *not* currently in force).\r
+\r
+ Objects | ... and People | ...\r
+\r
+ These vary depending on your inventory (for Objects) and the people\r
+ in the room at the time (for People). (Of course, there will always\r
+ be at least one of each.) Selecting one of these makes Avvy think\r
+ about whatever it was, and his thoughts are reflected in the "Thinks"\r
+ space on the toolbar. Why is this? Well, read on...\r
+\r
+ With | ...\r
+\r
+ This varies depending on what Avvy's thinking about. Whatever you can\r
+ do with it, him or her will be listed here, and you can then select it\r
+ and it will be done.\r
+\r
+ An example: Examine the bell.\r
+ Select "Objects | Bell" and then "With | Examine".\r
+\r
+ Another example: Talk to Spludwick.\r
+ Select "People | Spludwick" and then "With | Talk to him".\r
+\r
+ Notes on this:\r
+\r
+ 1) To give something to somebody, select the person, then the object,\r
+ then With | Give to <person>. If you get it the wrong way round,\r
+ you can still select the object and carry on. If it's going to\r
+ work, the "Give to" option will be enabled, and won't end in\r
+ an ellipsis ("...").\r
+\r
+ 2) The pictures of the people have their signatures underneath.\r
+\r
+ 3) The fastest way to examine somebody (or something) is this: when\r
+ their (or its) picture is on the toolbar, just click on it and\r
+ it will be examined. Ta-raaa!\r
+\r
+\r
+\r
+ The filer\r
+ """""""""\r
+\r
+ If you type LOAD with no parameters, or press ctrl-f3 when you're\r
+playing the game, you will enter the filer. It should be fairly\r
+straightforward. There are four "panes": (N)ame, (D)rives, (F)iles and\r
+(S)ubdirectories. Use Tab and Shift-Tab to cycle through these, or press\r
+Alt + the first letter of the name of the pane. On the Files and\r
+Subdirectories panes, you may use Home, End and the up and down cursor keys\r
+to move through the names. You may also press, say, J to cycle through all\r
+filenames or subdirectories beginning with J.\r
+\r
+ To change the drive, move to the Drives pane and press the letter.\r
+If the drive is not ready (e.g., if you've left the door open) then it will\r
+say "no files found", because it couldn't read any.\r
+\r
+ The Name pane allows you simply to type the name of the file. \r
+The file will be loaded when you press Return. The Files pane scrolls \r
+according to the initial letter as you type. By the way, you cannot search\r
+for or load any file whose extension is not .ASG.\r
+\r
+ A minor problem with the filer at the moment is this: if you're\r
+listening to a CD and you invoke the filer, the music will stop. The reason\r
+for this is that the program checks each drive between C and Z to see if\r
+it exists (A and B are found by using Bios calls) and since CDs on PCs double\r
+as data drives, reading it as such makes it think: "Oh! I'm a data drive and\r
+not a CD player. Well, in that case, I'd better stop playing music!" If this\r
+is a problem for anybody, let me know and I'll try and fix it.\r
+\r
+\r
+ The main menu\r
+ """""""""""""\r
+\r
+There are six options on the main menu:\r
+\r
+ 1) play the game. You can also press Return or Space to do this.\r
+\r
+ 2) read the background to the story (who *are* Geida and du Lustie\r
+ anyway?)\r
+\r
+ 3) see the preview. This is a picture from the next game (well,\r
+ actually, it's *like* one: the next game will be 256-colour).\r
+\r
+ 4) read the documentation (as you're doing now). Avalot has a\r
+ built-in doc lister.\r
+\r
+ 5) Same as 4), but jumps straight to the part about registration.\r
+\r
+ 6) Exit back to DOS, if you changed your mind. ("Oh no! I really\r
+ wanted to play spacewar, but I've loaded Avvy instead! How\r
+ can I quit in a hurry?")\r
+\r
+\r
+ Command-line options\r
+ """"""""""""""""""""\r
+\r
+Normally, you just have to type AVALOT to run the game. However, there are\r
+also some switches and so on that you can use to make the program behave\r
+as you want it to. Add the switch after the word AVALOT. Don't forget to\r
+put a space in between them! For example,\r
+\r
+ avalot /q\r
+\r
+would start the game with no sound effects. You can specify several switches\r
+at once; for example,\r
+\r
+ avalot canary /o /p\r
+\r
+would start the game, ignoring the graphics adapter in use (/o), load in a\r
+file called CANARY.ASG, and give you a p)rinted log of your progress through\r
+the game.\r
+\r
+Notes on the switches:\r
+\r
+ i) Instead of a slash, you can use a hyphen (if you're a Unix\r
+ freak.)\r
+\r
+ ii) Each switch must have a space before it. Thus you must type\r
+ avalot /o /p instead of avalot/o/p.\r
+\r
+ iii) You may also use AVALOT.INI commands instead of switches, if\r
+ you prefix each one with a star. Thus:\r
+\r
+ avalot *soundfx=false *loadfirst=fred\r
+\r
+ does the same as\r
+\r
+ avalot /q fred\r
+\r
+ . These options override the AVALOT.INI ones, and have equal\r
+ priority to switches.\r
+\r
+Here's a list of all the valid options:\r
+\r
+ /? This displays a list of the most important valid options,\r
+ so you don't have to read this part of the docs again\r
+ if you're in a hurry...\r
+\r
+ <filename> This will load the game you specify. You must give a path if\r
+ it's not in the current directory, but you may leave out\r
+ the .ASG extension if you want.\r
+\r
+ /o (Override.) This ignores your graphics adapter. Use this as a\r
+ temporary solution if Avvy tells you you don't have an EGA and\r
+ you do. (But... don't bother using this if you REALLY don't,\r
+ because it still won't work!)\r
+\r
+/l<filename> This will l)og your progress around the game to a file, so that\r
+ you can read it back later. A similar feature is found on\r
+ many text adventures, but this has a few refinements to work\r
+ with the graphical environment. If you don't specify a filename\r
+ (i.e., you just say "/l") the game assumes the default filename\r
+ of "AVVY.LOG".\r
+\r
+ /p<device> This switch p)rints your progress to a printer on LPT1:.\r
+ You can select some different kinds in Setup so that Avalot\r
+ can do italics or bold here. A kludge for simple TTY is /lPRN.\r
+ If you don't specify a device, the default is PRN. You can \r
+ also use a filename here, if you want to "print to disk."\r
+\r
+ NOTE!: You cannot have *both* /l *and* /p switched on at once!\r
+\r
+ /n Num Lock hold. If you use /n, the computer will check every so\r
+ often whether or not you have Num Lock switched on, and if you\r
+ do it'll switch it off again. Num Lock is *not* useful AT ALL\r
+ in this game. It's good for calculators and things, though.\r
+\r
+ /q Quiet! This switch turns off sound effects, so that you can play\r
+ Avvy all night long and not wake up your parents/girlfriend/\r
+ boyfriend/wife/husband/children/dog.\r
+\r
+ /k Keyboard clicky noise. If you choose this, every time you press\r
+ a key, the program will bleep at you.\r
+\r
+ /z Zoomy start. This throws you straight into the game without\r
+ the startup sequence.\r
+\r
+\r
+ Pounds, shillings and pence!\r
+ """"""""""""""""""""""""""""\r
+For reasons of historical accuracy, Avalot uses the pre-1971 system of Lsd\r
+(pounds, shillings and pence.) The pound sterling was divided up into twenty\r
+SHILLINGS. Each SHILLING subdivided into twelve PENCE. The more than 1000-year\r
+-old system was dropped in the early seventies as being inefficient. (It's\r
+interesting to think that this could have been to let the calculating\r
+machines of the day perform arithmetic faster. If they had only waited\r
+twenty years, the machines would have had no problem at all... bear in mind\r
+that to a digital machine, 1 pound to 100 pence is a daft system (it would\r
+be much more logical to have 256 pence in the pound), so it wouldn't really\r
+matter either way. Moral: look before you leap!)\r
+\r
+One pound is written 1 (that probably won't print properly on your printer.)\r
+One penny is written 1d. Two pence is 2d. One shilling is written 1/-.\r
+One-and-six (1 shilling + 6 pence) is 1/6. Three-and-a-penny is 3/1, etc.\r
+\r
+ Other interesting points to note:\r
+\r
+ TUPPENCE is 2d. (Still often used nowadays to mean two new pence.)\r
+ THRUPPENCE (or THREPPENCE or THRIPPENCE, depending\r
+ where you come from) is 3d. (Occasionally still used.)\r
+ a GROAT is 4d. This is a mediaeval coin which later dropped out of use.\r
+ It comes from dividing the shilling into three parts.\r
+ a SIXPENCE is (surprise!) 6d. This and the thruppence were the more usual\r
+ later divisions of the shilling. (As in "I love sixpence, jolly jolly\r
+ sixpence...")\r
+ a GUINEA is 21 shillings. The guinea was another mediaeval coin, which,\r
+ although it passed out of use long ago, remained in use until\r
+ decimalization for calculating prices (just to confuse people).\r
+ a FLORIN is two shillings. It's one tenth of a pound, and so was\r
+ sometimes thought of as a sort of halfway decimalization idea.\r
+ a CROWN is five shillings.\r
+ HALF-A-CROWN is 2/6 (as in the rhyme "Cobbler, cobbler, mend my shoe...")\r
+\r
+\r
+\r
+ AVALOT.INI\r
+ """"""""""\r
+INI is short for INItialisation. As you saw above, there are several things\r
+you can tell the program to do, or not to do. For example, Num Lock can\r
+be forced off by putting /n on the command line. However, if you always\r
+want that to happen, it can get a bit boring typing it every time.\r
+\r
+The FIRST way to make it permanent is using Setup. This is explained\r
+elsewhere. But there's another way...\r
+\r
+When you tell Setup what to do, it saves the new configuration in a file\r
+called AVALOT.INI. Avaricius Setup saved its config in a file called AVVY.CFG.\r
+What's the difference? (apart from its being a different game.) Well,\r
+AVALOT.INI is a text file. You can load it into a text editor and make\r
+changes.\r
+\r
+It's the same sort of format as WIN.INI, SYSTEM.INI, SSTOOLS.INI and so on\r
+(but note that there are no [header]s.) Each line consists of the following:\r
+\r
+ foo=bar ; comment\r
+\r
+"Foo" is the name of the field you want to change. "Bar" is what you want\r
+to change it to. This can be:\r
+\r
+ * "Yes" or "No", e.g. for Num Lock being forced on or not.\r
+ * A string, e.g. "MYGAME.ASG" for the default filename.\r
+ * Nothing at all, meaning "not applicable."\r
+\r
+Any spaces before or after the "foo=bar" part will be ignored. Also, any\r
+semicolons (";") in the line will be ignored, together with anything after\r
+them. (Just the same as in assembler programs.) This is for adding comments,\r
+so you can write\r
+\r
+ LoadFirst=AARDVARK.ASG ; load in aardvark.asg first of all.\r
+\r
+instead of\r
+\r
+ LoadFirst=AARDVARK.ASG\r
+\r
+because they both mean the same. Note that you can have a semicolon at the\r
+start of a line if you want the whole line to be ignored.\r
+\r
+There are comments in the file to explain what all the fields do. Good luck!\r
+\r
+(By the way, if you make a mistake in AVALOT.INI, the game won't run because\r
+of it, and you can't find the error in order to fix it, just delete the .INI\r
+file. You can always restore it from your backup later. (You kept a backup,\r
+DIDN'T YOU??? :-) ))\r
+\r
+\r
+ ASCII silly question, get a silly ANSI!\r
+ """""""""""""""""""""""""""""""""""""""\r
+\r
+I saw that on a BBS the other week. Anyway, the point of this section is\r
+this: In the archive, there's a file called AVALOT.ANS. This is an advert\r
+for Avalot, drawn up with ANSI. Some sysops put up an advert for files on\r
+the board whenever anybody logs on. This is for them! If you want to see\r
+it yourself, just type TYPE AVALOT.ANS at the Dos prompt. You'll have to\r
+have ANSI.SYS installed, though.\r
+\r
+(Note for sysops: this file is optimised as best I can. For example, it\r
+uses Cursor Forwards rather than printing spaces whenever that's smaller.\r
+What this boils down to is that it doesn't take very long to display: just\r
+over six seconds on a 2400 baud modem, and about one and a half seconds on\r
+a 9600. Less waiting around!)\r
+\r
+ Who's Edna?\r
+ """""""""""\r
+\r
+DNA is a substance found in molecules of all living objects. It defines\r
+who or what the object is (the size of its nose, the shape of its leaves,\r
+etc.) When I wrote Avaricius, I called the save files DNA in the code,\r
+because they defined the state of the game exactly.\r
+\r
+With Avalot, I made several changes, including rewriting the entire\r
+prehistoric DNA system. The new system I called Extended DNA. I then\r
+suddenly realised that E-DNA spells EDNA. So that's what I called it.\r
+\r
+How does this affect you? Well, Edna is designed so that whichever Avvy\r
+game you're playing (Avaricius, Avalot, or any other one we write) it will\r
+say in the file which game it came from. If you play more than one Avvy\r
+game often, you'll probably build up a library of .ASG files. Every good\r
+library needs a librarian, so here she is: Edna Bucket!\r
+\r
+Edna Bucket is a program called EDNA.EXE. If you run Edna with the filename\r
+of an .ASG file, she'll find the game it came from, load that game, and\r
+load the file in for you. Easy as anything. If you use Windows, 4-DOS, or\r
+any other system that allows file association, associate your .ASG files\r
+with EDNA.EXE, and then they'll always be loaded into the right game.\r
+\r
+To associate .ASG files with EDNA: Load File Manager (from Program Manager,\r
+select Window | Main and then double-click on the icon of a filing cabinet).\r
+When File Mangler (oops, Manager) has loaded, click ONCE on an .ASG file\r
+somewhere, then choose File | Associate... and put the path to Edna (such\r
+as C:\AVALOT\EDNA.EXE) in the filename box.\r
+\r
+The filenames of the games are stored in a file called EDNA.DAT. It looks\r
+like this:\r
+\r
+Name of game\r
+Path to that game\r
+Name of another game\r
+Path to THAT game\r
+and so on\r
+\r
+For example:\r
+\r
+Avaricius\r
+c:\games\avvy\avvy.exe\r
+Avalot\r
+N:\PUBLIC\GAMES\AVALOT\AVALOT.EXE\r
+\r
+If an .ASG file belongs to a game that isn't listed in this file, Edna will\r
+ask you about it and then add the information. If you want to change it\r
+later, use a text editor (such as EDIT or EDLIN) to make the changes.\r
+\r
+Edna has two switches:\r
+\r
+ /i prints some (I)nteresting (I)nformation about the game\r
+ on the screen, but does *not* load anything.\r
+\r
+ /q stops the "Loading" message appearing.\r
+\r
+So, for example:\r
+\r
+ EDNA /i TREE\r
+\r
+ gives information about the file TREE.ASG, and\r
+\r
+ EDNA /q elephant\r
+\r
+ loads the file ELEPHANT.ASG into the relevant game.\r
+\r
+\r
+ Warning for EGA users.\r
+ """"""""""""""""""""""\r
+\r
+Avalot will run fine with an EGA, just as with a VGA or whatever. BUT.......\r
+we have decided that the next game (IF there is a next game... no promises\r
+yet) will run *only* on VGAs, MCGAs and above. So get an upgrade before we\r
+release it! (IF we release it, of course.)\r
+\r
+\r
+ Support Your Local Manticore!\r
+ """""""""""""""""""""""""""""\r
+Just testing.\r
+\r
+\r
+ Getting help with the game\r
+ """"""""""""""""""""""""""\r
+OK, I admit it: Avalot is much harder than Avaricius to win. If you get\r
+stuck and you need some help, you can try:\r
+\r
+ *** A GOOD IDEA ***\r
+ * Posting a message on CompuServe's GAMERS forum, library 2,\r
+ "Adventure Games". Almost certainly, many people will have\r
+ been stuck on the same problem. Maybe they even solved it!\r
+\r
+ You should make the subject header give as much information\r
+ about the problem as possible. Don't just put "Avalot... \r
+ I'm Stuck!" (or even "help"!) A better solution is something like:\r
+\r
+ Avalot: Solution to Nim?\r
+ or\r
+ Avalot: Purpose of bell\r
+ etc.\r
+\r
+ * Emailing me and asking. Don't expect the entire solution!\r
+ I'll just give you HINTS.\r
+\r
+ my CompuServe address is 100021,3440\r
+ my Internet address is t.j.a.thurman@herts.ac.uk\r
+\r
+ (The Internet address should work until, oh, about 1997 at least.\r
+ If netmail bounces, use the CIS address. Be prepared for a long \r
+ wait if you send me netmail during the vacations! This is the \r
+ fastest way during termtime, though.)\r
+\r
+\r
+ Where to get the latest version\r
+ """""""""""""""""""""""""""""""\r
+\r
+I will try to upload the latest versions of Avvy to the following places\r
+at least. Copies will certainly make their ways to hundreds of other\r
+download sites.\r
+\r
+ 1) Support BBS. Paradise City, Thorsoft support area. (0734) 786408.\r
+ Call +44 734 786408 from outside Britain. (*)\r
+ 2) CompuServe. CIS:GAMERS. Library 2, "Adventure Games".\r
+\r
+(*) WARNING: Oftel have decided to put a 1 at the start of almost all\r
+ UK numbers, after the 0. BE CAREFUL. The old style numbers won't work\r
+ after June 1995, so be ready to change over then.\r
+\r
+ For example, Paradise City will become (01734) 786408 from Britain, and\r
+ +44 1734 786408 from outside.\r
+\r
+ This applies to all UK numbers you may know. YOU HAVE BEEN WARNED!\r
+\r
+\r
+ Reviews\r
+ """""""\r
+Here are some reviews of the first game, Avaricius:\r
+\r
+ "The catacombs hasn't been mapped; it hardly needs it."\r
+ - AVVY.SOL (a solution to Avvy discovered\r
+ on a BBS)\r
+\r
+ (OK, just try the maze in Avalot and see whether you can do it without\r
+ a map!)\r
+\r
+ "Uniquely funny and droll British humour here."\r
+ (Four stars plus a tick! Highest rating!)\r
+ - Shareware Marketing, Devon\r
+\r
+ Three stars (out of five)\r
+ - Shareware Solutions\r
+\r
+\r
+ To sysops, vendors, et al\r
+ """""""""""""""""""""""""\r
+Everyone: please distribute in the original archive, with the filename\r
+AVLT120.EXE for this sfx archive. If you cannot distribute self-extracting\r
+archives, re-archive it as AVLT120.LZH, .ZIP, .ARJ, etc. The filenames AVLT12\r
+and AVALOT are acceptable shortenings if the system does not allow more than\r
+six characters (as on CIS).\r
+\r
+Vendors: there is an installation routine. It might be available from\r
+wherever you got this; if it isn't, contact me (addresses in the Getting\r
+Help section above) and I'll tell you how to get hold of it.\r
+\r
+Both sysops and vendors: do us a favour and TELL us you're distributing\r
+Avalot! (Vendors, please send us the copy of your catalogue that has us in...\r
+and updates, for that matter.) If you do this, we'll send you a copy of the\r
+sequel if/ when it's finished.\r
+\r
+Also, please don't forget to add your name, etc., to the pedigree file. (BBSs\r
+and libraries are welcome to include a short plug for themselves in this file,\r
+as long as it's not more than about five or six lines long!)\r
+\r
+If anyone can get this game reviewed in a magazine, go ahead. Even better,\r
+go ahead and then tell us about it, we'd love to know. Even better still,\r
+go ahead, and then send us a copy of the magazine!\r
+\r
+ Disclaimer\r
+ """"""""""\r
+The part that's always written in CAPITALS. You *have* to read this!\r
+\r
+"LORD AVALOT D'ARGENT" IS LICENSED "AS-IS." THORSOFT OF LETCHWORTH\r
+("THORSOFT") MAKES NO WARRANTIES, EITHER EXPRESSED OR IMPLIED, WITH RESPECT\r
+TO THIS PROGRAM, ITS QUALITY, PERFORMANCE, MERCHANTABILITY, OR FITNESS FOR\r
+ANY PARTICULAR PURPOSE. IN PARTICULAR, IT IS NOT GUARANTEED TO PREVENT OR\r
+DETECT DAMAGE TO YOUR DATA OR PROGRAMS. IN NO EVENT SHALL THORSOFT BE LIABLE\r
+FOR ANY CLAIMS FOR LOST PROFITS OR ANY DAMAGE, INCLUDING, BUT NOT LIMITED TO,\r
+SPECIAL, INCIDENTAL, CONSEQUENTIAL OR ANY OTHER DAMAGE. SOME STATES DO NOT\r
+ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES,\r
+SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. IN NO CASE SHALL\r
+THORSOFT'S LIABILITY EXCEED THE LICENCE FEES PAID FOR THE RIGHTS TO USE THE\r
+LICENSED SOFTWARE. THE LICENSE AGREEMENT SHALL BE CONSTRUED, INTERPRETED AND\r
+GOVERNED BY THE LAWS OF ENGLAND AND WALES.\r
+\r
+(RIGHT, NOW I THINK I'LL SWITCH CAPS LOCK OFF ANd get on with the\r
+documentation...)\r
+\r
+ Wish Lists, Bug Reports\r
+ """""""""""""""""""""""\r
+\r
+A wish list is a list of features that you wish a program had. A bug report\r
+is a list of "features" you wish it DIDN'T have (and so does the programmer).\r
+If you can't stand the fact that, say, Avalot doesn't run in a MULTICS Dos\r
+box if you are over 12,000 feet above sea level, or you would really like a\r
+version that has a macro facility or imports .DBF files, or something, then\r
+let me know and I'll see what I can do, or try and find an excuse. You\r
+*might* even get an acknowledgement... :)\r
+\r
+\r
+ Coming soon...\r
+ """"""""""""""\r
+\r
+Here's my own list of possible/probable enhancements to Avalot:\r
+\r
+ * a version which is economical with disk space. This version is\r
+ very wasteful of it. Some things are stored twice and there\r
+ is no compression. Later versions will be optimised and there\r
+ will be a transparent compression routine. (I have a trial\r
+ version of this working, and some files are down to 1/4 their\r
+ original size! (Mostly they are about 1/2 to 3/4.))\r
+\r
+ * a "talkie" version-- see below...\r
+\r
+\r
+ Avalot - The Talkie\r
+ """""""""""""""""""\r
+\r
+This is part of my own wish list. I'm working (vaguely) on a new part of the\r
+system which can play back sound files when scrolls and bubbles come up on\r
+the screen. For example, when Cwytalot says: "I'm not here for a quiet chat",\r
+you'll hear him saying it through the PC speaker or over your 'Blaster.\r
+Obviously, this would take up a vast amount of disk space, and so would\r
+probably come in a separate archive. But it would be rather fun for when\r
+the game was supplied on CD-ROM. Watch this space, but not all the time,\r
+'cos you'll get bored because nothing's likely to happen for a while yet...\r
+\r
+ The first winner of this game\r
+ """""""""""""""""""""""""""""\r
+\r
+Apart from the testers, nobody has ever won this game yet. I'll put the name\r
+of the first registrant who can tell me how to win here.\r
+\r
+\r
+ Revision history\r
+ """"""""""""""""\r
+\r
+ver.no. date notes\r
+------- ---- -----\r
+ 1.3 Dec 1995 Changes in documentation, scrolls, etc. to record\r
+ the reduction of registration fee to GBP 10 (USD 15)\r
+ plus GBP 2 (USD 4) p&p (s&h). Registration fee still\r
+ to include one free one-size Avalot t-shirt.\r
+ \r
+ 1.2 Apr 1995 Mended the shoot-em-up, which worked (I think) in 1.0\r
+ but went wrong again in 1.1. The toolbar now says\r
+ "Avalot" instead of "the Avvy toolbar". Talking to\r
+ some characters about certain things (notably Port) \r
+ no longer crashes the game. And finally, the infamous\r
+ Mouse Bug which caused the mouse pointer to leave \r
+ flashing shadows all over the screen occasionally has\r
+ been fixed at last. (Also a few other minor changes).\r
+ 1.1 Mar 1995 Fixed the music files.\r
+ Made all the chunk files consistent. (This could\r
+ have caused a system crash in older versions.)\r
+ Also you can now give hex numbers in AVALOT.INI\r
+ by starting them with a dollar sign.\r
+ 1.0 Oct 1994 This was the first release.\r
+\r
+\r
+ *** Registration! ***\r
+ """""""""""""\r
+If you like it, please consider registering this game. More information\r
+is given in the file REGISTER.DOC, which you can print by typing\r
+PRINT REGISTER.DOC at the DOS prompt. Here's a quick synopsis:\r
+\r
+You can order Avalot for 10 pounds sterling or 15 U.S. dollars.\r
+\r
+P&P (S&H) is two pounds, or four U.S. dollars.\r
+\r
+You also get some free goodies to thank you for registering (at the\r
+moment, this is an Avvy T-shirt and ruler).\r
+\r
+OR you can probably pay in your local currency. See REGISTER.DOC to see\r
+which currencies we can accept, and for other details.\r
+\r
+ PRICES ARE VALID UNTIL 31st DECEMBER 1996.\r
+---------------------------------------------------------------------------\r
+\r
+There are four ways you can register this game:\r
+\r
+1) The traditional one... by sending a cheque through the post.\r
+\r
+ Here's our address:\r
+\r
+ Thorsoft of Letchworth,\r
+ 71, Baldock Road,\r
+ Letchworth,\r
+ Herts. SG6 3JP.\r
+ England.\r
+\r
+ Please make cheques payable to THORSOFT.\r
+\r
+2) Using PsL's shareware registration service. PsL-- Public (software)\r
+Library-- run a registration service that accepts major credit cards.\r
+You can register over the phone on an (American) 800 number, a normal number,\r
+by fax, or by CIS email. Here's their advert:\r
+\r
+---------------------------------------------------------------------------\r
+\r
+ CREDIT CARD ORDERS ONLY -\r
+\r
+ You can order with MC, Visa, Amex, or Discover from Public (software)\r
+ Library by calling 800-2424-PsL or 713-524-6394 or by FAX to 713-524-6398\r
+ or by CIS Email to 71355,470. You can also mail credit card orders to PsL\r
+ at P.O.Box 35705, Houston, TX 77235-5705.\r
+\r
+ THE ABOVE NUMBERS ARE FOR ORDERS ONLY.\r
+\r
+ Any questions about the status of the shipment of the order, refunds,\r
+ registration options, product details, technical support, volume discounts,\r
+ dealer pricing, site licenses, etc., must be directed to Thorsoft at the\r
+ addresses or numbers above.\r
+\r
+ To ensure that you get the latest version, PsL will notify us on the day of\r
+ your order and we will ship the product directly to you.\r
+\r
+ When you order, please quote Avalot's item number: ---> 11608 <---\r
+\r
+---------------------------------------------------------------------------\r
+\r
+3) Via CompuServe. Type GO SWREG at any ! prompt, or in CompuServe Information\r
+Manager press Ctrl-G and type SWREG. Then follow the menus.\r
+\r
+\r
+ Enjoy the game!\r
+\r
+[end of documentation]\r
--- /dev/null
+; AVALOT.INI\r
+; Initialisation file for Avalot\r
+; by Thomas Thurman, 1995.\r
+;\r
+; Anything beginning with a semi-colon is a comment!\r
+; Read AVALOT.DOC for more details.\r
+\r
+; A small warning: Setup will only change values already in this file--\r
+; it will never add new lines. You should therefore keep a backup of the\r
+; original.\r
+\r
+; Numbers can be given in decimal, or in hex if you prepend a $ (for\r
+; example, $B1).\r
+\r
+; General\r
+; \=---=/\r
+\r
+OverrideEGAcheck=No ; Force loading despite failure to detect an EGA?\r
+ZoomyStart=No ; Jump straight in?\r
+Loadfirst= ; Fill this in to load a particular .ASG by default.\r
+NumLockHold=No ; If Yes, Numlock will always be forced off.\r
+Controller=Keyboard ; Keyboard or Joystick\r
+\r
+; Joystick\r
+; \=----=/\r
+\r
+; These values are usually altered automatically by Setup.\r
+\r
+JoystickInstalled=Yes ; Yes for joystick, No for no joy\r
+JoyTop=0\r
+JoyBottom=0\r
+JoyLeft=0\r
+JoyRight=0\r
+JoyMidX=0\r
+JoyMidY=0\r
+JoyCentringFactor=3 ; Between 3 and 9. Defines cut-off point for\r
+ ; the centre.\r
+WhichJoy=1 ; which joystick to use? 1 or 2?\r
+\r
+; Sound\r
+; \=-=/\r
+\r
+Quiet=No ; Yes for NO sound effects\r
+SoundCard=None ; one of None, SB, SPPro, SB16, PAS, PASPlus, PAS16,\r
+ ; Aria, WinSound, Gravis, DacLPT, StereoDACs,\r
+ ; StereoOn1, Speaker.\r
+BaseAddress=$220 ; See below and the documentation for\r
+IRQ=5 ; working values of\r
+DMA=1 ; these.\r
+SampleRate=22050\r
+\r
+; ** Note : If you have an SB, you may be able just to change\r
+; "SoundCard=None" above to "SB". Otherwise, see the next paragraph.\r
+\r
+; WARNING: Incorrect values can damage your computer!\r
+;\r
+; As a guide, try:\r
+; SC=SB BA=$220 IRQ=5 DMA=1 SR=22050\r
+; SC=SPEAKER BA=$2A IRQ=0 DMA=0 SR=11025 (DMA & IRQ are ignored here)\r
+; Warning: We do *not* officially support PC speaker-- use it at your\r
+; own risk. It sometimes crashes.\r
+; SC=PAS16 BA=$388 IRQ=7 DMA=6 SR=22050 (44100 for the adventurous with\r
+; very fast computers.)\r
+\r
+KeyboardClick=No ; it can go "click" whenever\r
+ ; you press a key.\r
+\r
+; Logfile\r
+; \=---=/\r
+\r
+Logging=No ; can be No, Printer or Disk\r
+Logfile= ; leave undefined for AVALOT.LOG,\r
+ ; or give a filename\r
+\r
+; Here follows the... Printer Setup\r
+; \=---------=/\r
+\r
+; Explanation of the fields:\r
+; StartWith - what is sent to the printer at the start of a game\r
+; EndWith - ...at the end of a game\r
+; ItalicOn, ItalicOff - self-explanatory\r
+; EmphOn, EmphOff - switches bold type on or off\r
+; DivideOn, DivideOff - This is printed before/after the divider is\r
+; sent. (The divider is the --- oOo --- thing.)\r
+; DivideIndent - Number (IN DECIMAL!) of spaces to print before\r
+; the divider in order to centre it.\r
+; Quote, Unquote - These are the ASCII codes to send to produce\r
+; the opening quote (66) and the closing quote (99)\r
+; respectively.\r
+;\r
+; The strings to be sent to the printer are specified in hex. Trademarks are\r
+; hereby acknowledged. The [printer...] and [end] signs are to encase the\r
+; blocks of printer definitions for Setup's benefit. You may add definitions\r
+; for other printers simply by adding them onto the end of this file.\r
+; The "printer=" line defines which one the game reads.\r
+\r
+printer=Epson\r
+\r
+; (by the way, the "printer" line must come *before* the relevant definition)\r
+\r
+[printer LaserJet (or any other printer supporting PCL)]\r
+\r
+;\r
+; --- LaserJet ---\r
+;\r
+\r
+StartWith=1B451B2831324A ; Resets the printer, and switches to "MC Text" font.\r
+EndWith=1B45FF ; Resets the printer, and does a form feed.\r
+ItalicOn=1B28733053 ; Switches italics on...\r
+ItalicOff=1B28733153 ; ...and off.\r
+EmphOn=1B28733342 ; Switches emphasised mode (bold) on...\r
+EmphOff=1B28733042 ; ...and off.\r
+DivideOn=1B28733342 ; Same as EmphOn here.\r
+DivideOff=1B28733042 ; Same as EmphOff.\r
+DivideIndent = 30 ; Something to do with centring the divider...\r
+Quote = D2 ; Ascii code to produce the "66" opening quote.\r
+Unquote = D3 ; Ascii code to produce the "99" closing quote.\r
+Copyright = A9 ; Ascii code to produce the (c) sign.\r
+\r
+[end] ; Laserjet\r
+\r
+[printer Epson]\r
+;Epson\r
+\r
+;\r
+; --- Epson ---\r
+;\r
+\r
+StartWith=1B40 ; Reset the printer.\r
+endwith= ; No ending code.\r
+ItalicOn = 1B34 ; switches italics on...\r
+italic_off = 1B35 ; ...and off.\r
+emph_on = 1B45 ; Bold on...\r
+emph_off = 1B46 ; ...and off.\r
+DivideOn = E ; shift out (SO)\r
+DivideOff = 14 ; device control 4 (DC4)\r
+DivideIndent = 15 ; we're in double width here!\r
+Quote = 22 ; normal " sign.\r
+Unquote = 22 ; the same.\r
+Copyright = 286329 ; just (c).\r
+\r
+[end] ; Epson\r
+\r
+; end of file.\r
--- /dev/null
+ ÜÛßÛÜ Lord ßÛÛ ÜÛ\r
+ ÛÛ ÛÛÜÜÜ ÜÜÜ ÜÜÜÜ ÛÛ ÜÜÜÜÜ ÜÜÛÛÜÜ\r
+ ÛÛÜÜÜÛÛ ÛÛ ÛÛ ÜÜÜÛÛ ÛÛ ÛÛ ÛÛ ÛÛ\r
+ ÛÛ ÛÛ ßÛÜÛß ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÜÜ\r
+ ßß ßß ß ßßßßßß ßßßß ßßßßß ßßß\r
--- /dev/null
+\r
+ Start Stop Length Name Class\r
+\r
+ 00000H 002D9H 002DAH Avalot CODE\r
+ 002E0H 012C9H 00FEAH Gyro CODE\r
+ 012D0H 01912H 00643H Pingo CODE\r
+ 01920H 043E0H 02AC1H Lucerna CODE\r
+ 043F0H 08716H 04327H acci CODE\r
+ 08720H 09074H 00955H helper CODE\r
+ 09080H 094E8H 00469H Highs CODE\r
+ 094F0H 0A568H 01079H Nimunit CODE\r
+ 0A570H 0C7BBH 0224CH scrolls CODE\r
+ 0C7C0H 0F851H 03092H trip5 CODE\r
+ 0F860H 1175DH 01EFEH dropdown CODE\r
+ 11760H 12A51H 012F2H Enid CODE\r
+ 12A60H 133AAH 0094BH Basher CODE\r
+ 133B0H 134BEH 0010FH enhanced CODE\r
+ 134C0H 16625H 03166H fileunit CODE\r
+ 16630H 16630H 00000H tommys CODE\r
+ 16630H 174FEH 00ECFH Timeout CODE\r
+ 17500H 1763CH 0013DH Sequence CODE\r
+ 17640H 17D7CH 0073DH Visa CODE\r
+ 17D80H 18AC5H 00D46H Celer CODE\r
+ 18AD0H 191ABH 006DCH incline CODE\r
+ 191B0H 199F1H 00842H Logger CODE\r
+ 19A00H 19D81H 00382H Closing CODE\r
+ 19D90H 19F06H 00177H Sticks CODE\r
+ 19F10H 1A161H 00252H Joystick CODE\r
+ 1A170H 1A426H 002B7H Dos CODE\r
+ 1A430H 1AA4EH 0061FH Crt CODE\r
+ 1AA50H 1E193H 03744H Graph CODE\r
+ 1E1A0H 2004DH 01EAEH System CODE\r
+ 20050H 2E599H 0E54AH DATA DATA\r
+ 2E5A0H 3259FH 04000H STACK STACK\r
+ 325A0H 325A0H 00000H HEAP HEAP\r
+\r
+ Address Publics by Value\r
+\r
+ 0000:0032 setup\r
+ 0000:01EF @\r
+ 002E:0000 newpointer\r
+ 002E:0084 wait\r
+ 002E:0097 on\r
+ 002E:00EA on_Virtual\r
+ 002E:010E off\r
+ 002E:0145 off_Virtual\r
+ 002E:01A2 xycheck\r
+ 002E:01D3 hopto\r
+ 002E:0200 check\r
+ 002E:0264 &