Release 4; Serial "000918"; ! ********************************************************* ! * * ! * WIZARD'S CASTLE GAME FROM JULY/AUGUST 1980 * ! * ISSUE OF RECREATIONAL COMPUTING MAGAZINE * ! * WRITTEN FOR EXIDY SORCEROR BY JOSEPH R. POWER * ! * MODIFIED FOR HEATH MICROSOFT BASIC BY J. F. STETSON * ! * REWRITTEN FOR GRAHAM NELSON'S INFORM BY ADAM * ! * BILTCLIFFE WITH HELP FROM THE FOLKS ON IFMUD * ! * * ! * You may distribute this in any way provided its * ! * origin remains accurately represented. * ! * * ! ********************************************************* Global mode; Constant classic 1; Constant normal 2; Constant stats 3; Constant map 4; Global deadflag; Global mapok; ! Ok for statusline to display the map Array caps_array -> 1300; ! For printing to while capitalising stuff ! May need enlarging if any blocks of really ! big text are added (at the moment, the largest ! is the mode select screen) Array input -> 4; Array level -> 512; Array map_symbols -> '?' '.' 'E' 'U' 'D' 'P' 'C' 'G' 'F' 'W' 'S' 'O' 'B' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'M' 'V' 'T' 'T' 'T' 'T' 'T' 'T' 'T' 'T'; Array map_names --> "ERROR" "empty room" "entrance" "stairs going up" "stairs going down" "pool" "chest" "gold pieces" "flares" "warp" "sinkhole" "crystal orb" "book" "kobold" "orc" "wolf" "goblin" "ogre" "troll" "bear" "minotaur" "gargoyle" "chimera" "balrog" "dragon" "vendor" "ruby red" "Norn stone" "pale pearl" "opal eye" "green gem" "blue flame" "Palantir" "Silmaril"; Array map_articles --> "AN " "an " "the " "" "" "a " "a " "" "" "a " "a " "a " "a " "a " "an " "a " "a " "an " "a " "a " "a " "a " "a " "a " "a " "a " "the " "the " "the " "the " "the " "the " "the " "the "; Array race_names --> "hobbit" "elf" "human" "dwarf"; Array race_articles --> "a " "an " "a " "a "; Array weapon_names --> "nothing" "dagger" "mace" "sword"; Array armor_names --> "nothing" "leather" "chainmail" "plate"; Array food_names --> " sandwich" " stew" " soup" " burger" " roast" " filet" " taco" " pie"; Array treasures_collected -> 8; ! Remember each treasure number is 1 less Class Artifact with x, y, z, found 0; Class Curse with x, y, z, active 0; Artifact orb; Artifact runestaff; Curse lethargy; Curse leech; Curse forgetting; Object found_room with x, y, z; ! Communication Object player with x, y, z, st, iq, dx, freepts, lamp, flares, gold, treasures, race, sex, turns, vendorenemy, stickybook, blind, armorclass, armorhealth, weaponclass, justteleported, lastmeal; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ! 'Utility' functions [ Wrap q; if (q==0) return 8; if (q==9) return 1; return q; ]; [ Limit q; if (q>18) return 18; return q; ]; [ Cellnum x y z; return ((z-1)*64) + ((y-1)*8) + (x-1); ]; [ Contents q; if (q>99) return q-100; return q; ]; [ RndRoom; found_room.x=random(8); found_room.y=random(8); found_room.z=random(8); ]; [ RndEmptyRoom rx ry rz; do { rx=random(8); ry=random(8); rz=random(8); } until (level->Cellnum(rx, ry, rz)==101); found_room.x=rx; found_room.y=ry; found_room.z=rz; ]; [ RndEmptyRoomLev rz rx ry; do { rx=random(8); ry=random(8); } until (level->Cellnum(rx, ry, rz)==101); found_room.x=rx; found_room.y=ry; found_room.z=rz; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ GetInput n; if (n~=2) n=1; input->0=n; if (mode==stats&&(0->33)>39) { read input 0 StatusLine; } else { if (mode==map&&(0->33)>29) { read input 0 MapLine; } else { read input 0; } } if (input->1) { for (n=2:n<=((input->1)+1):n++) { if (input->n>=97&&input->n<=122) input->n=(input->n)-32; } if (input->1==1) input->3=0; } else { input->2=0; input->3=0; } ]; [ AscToDgt i; if (i>=48&&i<=57) return i-48; return -1; ]; [ GetNumber; GetInput(2); if (AscToDgt(input->2)==-1) rfalse; if (AscToDgt(input->3)==-1) { ! One digit return AscToDgt(input->2); } else { return (AscToDgt(input->2)*10)+AscToDgt(input->3); } ]; [ GetCoord n; do { n=GetNumber(); if (n<=0||n>=9) print (sbold) "^** Try a number from 1 to 8. "; } until (n>0&&n<9); return n; ]; [ YesNo ans; ans=-1; do { GetInput(1); switch (input->2) { 'Y': ans=1; 'N': ans=0; default: print (sbold) "^** Please answer yes or no! "; } } until (ans~=-1); return ans; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ Main quitflag; GetMode(); quitflag=0; TitleScreen(); do { GenerateDungeon(); InitPlayer(); Play(); print (srom) "^Are you foolish enough to want to play again? "; if (YesNo()) { print (srom) "^Some ", (srom) race_names-->(player.race-1), (srom) "s never learn!^^Please be patient while the castle is restocked.^"; } else quitflag=1; } until (quitflag==1); print (srom) "^Maybe dumb ", (srom) race_names-->(player.race-1), (srom) " is not so dumb after all!^^"; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ GetMode; mode=0; do { @erase_window -1; print (sund) "^Wizard's Castle", (srom) " game from July/August 1980 issue of ", (sund) "Recreational Computing", (srom) " magazine^^Written for Exidy Sorceror by ", (sbold) "Joseph R. Power", (srom) "^^Modified for Heath Microsoft BASIC by ", (sbold) "J. F. Stetson", (srom) "^^Rewritten for ", (sbold) "Graham Nelson", (srom) "'s Inform by ", (sbold) "Adam Biltcliffe", (srom) " with help from the folks on ", (sund) "ifMUD", (srom) ".^^"; ! Some people may claim I went overboard with the use of bold and ! underline. Well, sue me =P print (srom) "Do you want to play in Classic mode, Normal mode, Statistician mode or Cartographer mode?^^Classic mode is as close as possible to the original text, including typos and miscellaneous ugliness. If you're not on a nostalgia trip, normal mode contains less typos and presents a few things (such as the final game summary) in a slightly neater way. Statistician mode is similar to normal mode but uses the status line to display your attributes and equipment instead of printing them out at the start of each turn. Cartographer mode ('m'ap mode) uses the status line to display a map of the current dungeon level.^^The other notable difference is in the coordinate systems. In the original game, the 'x' axis was the vertical axis, and the 'y' axis the horizontal. All the new versions use the normally-accepted axes. This change manifests itself only in the displaying of coordinates and in teleporting, so the only thing to bear in mind is that whichever mode you are playing in, you simply need to enter the coordinates when teleporting in the same order as they are printed.^^Enter C, N, S or M to select mode: "; GetInput(1); switch(input->2) { 'C': mode=classic; 'N': mode=normal; 'S': mode=stats; 'M': mode=map; } } until (mode); if (mode==classic) { race_articles-->1="a "; weapon_names-->0="no weapon"; armor_names-->0="no armor"; } ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ TitleScreen; @erase_window -1; if (mode==stats) print (srom) "^^^^^^"; ! Otherwise the statusline overwrites it if (mode==map) print (srom) "^^^^^^^^"; stars(); print (sbold) "^ * * * THE WIZARD'S CASTLE * * * ^"; stars(); print (srom) "^Many cycles ago, in the kingdom of N'Dic, the gnomic^wizard Zot forged his great ", (sund) "Orb of Power", (srom) ". He soon^vanished, leaving behind his vast subterranean castle^filled with esurient monsters, fabulous treasures and^the incredible ", (sund) "Orb of Zot", (srom) ". From that time hence, many^a bold youth has ventured into the Wizard's castle. As^of now, ", (sbold) "none", (srom) " has ever emerged victoriously! Beware!!^"; ]; [ GenerateDungeon; mapok=0; EmptyLevel(); PlaceStairs(); PlaceThings(); PlaceTreasures(); PlaceArtifacts(); PlaceCurses(); ]; [ EmptyLevel i; for (i=0:i<512:i++) { level->i=101; } level->3=102; ]; [ PlaceStairs lindex i; for (lindex=1:lindex<8:lindex++) { for (i=1:i<3:i++) { RndEmptyRoomLev(lindex); level->Cellnum(found_room.x, found_room.y, lindex)=104; ! Down level->Cellnum(found_room.x, found_room.y, lindex+1)=103; ! Up } } ]; [ PlaceThings lindex i j; for (lindex=1:lindex<=8:lindex++) { ! place monsters for (i=13:i<=24:i++) { RndEmptyRoomLev(lindex); level->Cellnum(found_room.x, found_room.y, lindex)=i+100; } ! place features for (i=105:i<=112:i++) { for (j=0:j<3:j++) { RndEmptyRoomLev(lindex); level->Cellnum(found_room.x, found_room.y, lindex)=i; } } ! place vendors for (j=0:j<3:j++) { RndEmptyRoomLev(lindex); level->Cellnum(found_room.x, found_room.y, lindex)=125; } } ]; [ PlaceTreasures i; for (i=126:i<=133:i++) { RndEmptyRoom(); level->Cellnum(found_room.x, found_room.y, found_room.z)=i; (treasures_collected->(i-126))=0; } ]; [ PlaceArtifacts i; objectloop(i ofclass Artifact) { RndEmptyRoom(); i.x=found_room.x; i.y=found_room.y; i.z=found_room.z; i.found=0; } level->Cellnum(runestaff.x, runestaff.y, runestaff.z)=random(12)+112; level->Cellnum(orb.x, orb.y, orb.z)=109; ]; [ PlaceCurses i; objectloop(i ofclass Curse) { RndEmptyRoom(); i.x=found_room.x; i.y=found_room.y; i.z=found_room.z; i.active=0; } ]; [ InitPlayer i ptoadd stat ok rmonster; player.freepts=8; player.race=0; player.gold=0; player.flares=0; player.st=0; player.dx=0; ! These need to be zeroed now if in stats mode player.iq=0; player.treasures=0; player.weaponclass=0; player.armorclass=0; player.lamp=0; print (srom) "^All right, bold one.^"; do { print (srom) "You may be an elf, dwarf, man or hobbit.^^Your choice? "; GetInput(1); switch(input->2) { 'E': player.race=2; player.st=6; player.dx=10; 'D': player.race=4; player.st=10; player.dx=6; 'M': player.race=3; player.st=8; player.dx=8; 'H': player.race=1; player.st=4; player.dx=12; player.freepts=4; default: print (sbold) "^** That was incorrect. Please type E, D, M or H.^"; } } until (player.race); player.iq=8; player.sex=-1; ! 0 is male, 1 is female; new_line; do { print (srom) "Which sex "; if (mode==classic) print (srom) "t"; else print (srom) "d"; print (srom) "o you prefer? "; GetInput(1); switch(input->2) { 'M': player.sex=0; 'F': player.sex=1; default: print (sbold) "** Cute, ", (sbold) race_names-->(player.race-1), (sbold) ", real cute. Try M or F.^"; } } until (player.sex~=-1); if (mode==stats) { print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you have ", (nrom) player.freepts, (srom) " points to allocate to your stats as you wish.^^"; } else { print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you have the following attributes:^Strength = ", (nrom) player.st, (srom) " Intelligence = ", (nrom) player.iq, (srom) " Dexterity = ", (nrom) player.dx, (srom) "^and ", (nrom) player.freepts, (srom) " other points to allocate as you wish.^^"; } for (i=0:i<3:i++) { if (player.freepts) { ok=0; do { switch (i) { 0: stat=st; 1: stat=iq; 2: stat=dx; } print (srom) "How many points do you wish to add to your ", (statname) stat, (srom) "? "; ptoadd=GetNumber(); ! At present entering -1 here is treated as 0; if (ptoadd<=player.freepts) { (player.stat)=(player.stat)+ptoadd; (player.freepts)=(player.freepts)-ptoadd; ok=1; } else { print (sbold) "^** "; } } until (ok==1); } } player.gold=60; print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you have 60 gold pieces (GP's).^"; player.armorclass=-1; do { print (srom) "These are the types of armor you can buy:^ Plate<30> Chainmail<20> Leather<10> Nothing<0>^^ Your choice? "; GetInput(1); switch(input->2) { 'P': player.armorclass=3; 'C': player.armorclass=2; 'L': player.armorclass=1; 'N': player.armorclass=0; default: rmonster=random(12)+12; print (sbold) "^** Are you ", (sbold) race_articles-->(player.race-1), (sbold) race_names-->(player.race-1), (sbold) " or ", (sbold) map_articles-->(rmonster), (sbold) map_names-->(rmonster), (sbold) "?^^"; } } until (player.armorclass>=0); player.gold=player.gold-(player.armorclass*10); player.armorhealth=(player.armorclass*7); print (srom) "^Ok, bold ", (srom) race_names-->(player.race-1), (srom) ", you have ", (nrom) player.gold, (srom) " GP's left.^"; player.weaponclass=-1; do { print (srom) "These are the types of weapons you can buy:^ Sword<30> Mace<20> Dagger<10> Nothing<0>^^ Your choice? "; GetInput(1); switch(input->2) { 'S': player.weaponclass=3; 'M': player.weaponclass=2; 'D': player.weaponclass=1; 'N': player.weaponclass=0; default: print (sbold) "^** Is your IQ really ", (nbold) player.iq, (sbold) "?^^"; } } until (player.weaponclass>=0); player.gold=player.gold-(player.weaponclass*10); player.lamp=0; player.flares=0; if (player.gold>=20) { print (srom) "^Do you want to buy a lamp for 20 GP's? "; if (YesNo()) { player.lamp=1; player.gold=player.gold-20; } } if (player.gold) { ok=0; print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you have ", (nrom) player.gold, (srom) " gold pieces left.^"; do { print (srom) "^Flares cost 1 GP each. How many do you want? "; player.flares=GetNumber(); if (player.flares<=player.gold) { ok=1; player.gold=player.gold-player.flares; } else { print (sbold) "^** You can only afford ", (nbold) player.gold, (sbold) ".^"; } } until (ok==1); } player.x=4; player.y=1; player.z=1; player.turns=1; player.vendorenemy=0; player.blind=0; player.stickybook=0; player.justteleported=0; player.lastmeal=0; print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you are now ", (sbold) "entering the castle!^"; mapok=1; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ Play i; deadflag=0; NewRoom(); while (deadflag==0) { player.turns=player.turns+1; UpdateCurses(); if (random(5)==1) FlavourText(); TreasureEffects(); print (srom) "^Enter your command : "; GetInput(2); switch(input->2) { 'N', 'S', 'E', 'W': Move(); 'U': Stairs(); 'D': if (input->3=='R') Drink(); else Stairs(); 'M': PrintMap(); 'F': Flare(); 'L': UseLamp(); 'O': Open(); 'G': Gaze(); 'T': Teleport(); 'Q': print (srom) "^Do you really want to quit now? "; if (YesNo()) deadflag=3; else { print (sbold) "^** Then don't say that you do!^"; } 'H': PrintHelp(); default: print (sbold) "^** Silly ", (sbold) race_names-->(player.race-1), (sbold) ", that wasn't a valid command!^"; } } switch (deadflag) { 1: stars(); print (srom) "^A noble effort, oh formerly living ", (srom) race_names-->(player.race-1), (srom) "!^^You died due to lack of "; if (player.st<1) print (srom) "strength"; if (player.iq<1) print (srom) "intelligence"; if (player.dx<1) print (srom) "dexterity"; print (srom) ".^^At the time you died, you had:^"; 2, 3: if (deadflag==2) { print (srom) "^You left the castle with"; if (~~orb.found) print (srom) "out"; print (srom) " the ", (sund) "Orb of Zot", (srom) ".^"; } if (orb.found&&deadflag==2) { print (sbold) "^An incredibly glorious victory!!^"; print (srom) "^In addition, you got out with the following:^"; } else { if (mode==classic||deadflag==2) { print (srom) "^When you left the castle, you had:^"; } else { print (srom) "^At the point you quit, you had:^"; } } print (srom) "Your miserable life!^"; } for (i=0:i<8:i++) { if (treasures_collected->i) { print (srom) map_articles-->(i+26), (srom) map_names-->(i+26), (srom) "^"; } } if (mode==classic) { print (srom) weapon_names-->(player.weaponclass), (srom) " and ", (srom) armor_names-->(player.armorclass); if (player.lamp==1) print (srom) " and a lamp^"; else new_line; } else { if (player.weaponclass) print (srom) "a ", (srom) weapon_names-->(player.weaponclass); if (player.armorclass) { if (player.weaponclass) { if (player.lamp) print (srom) ", "; else print (srom) " and "; } print (srom) armor_names-->(player.armorclass), (srom) " armor"; } if (player.lamp) { if (player.weaponclass+player.armorclass) print (srom) " and "; print (srom) "a lamp"; } if (player.weaponclass+player.armorclass+player.lamp) new_line; } if (mode~=classic&&deadflag==1&&(~~player.treasures)&&(~~ (player.weaponclass+player.armorclass+player.lamp))) print (srom) "no treasure or weapons^"; print (srom) "You also had ", (nrom) player.flares, (srom) " flares"; if (mode~=classic&&runestaff.found) print (srom) ", "; else print (srom) " and "; print (nrom) player.gold, (srom) " gold pieces"; if (runestaff.found) { print (srom) " and the ", (sund) "Runestaff"; } print (srom) "^^And it took you ", (nrom) player.turns, (srom) " turns!^"; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ UpdateCurses i ccur; if (runestaff.found+orb.found) return; if (lethargy.active>treasures_collected->0) player.turns++; if (leech.active>treasures_collected->2) player.gold=player.gold-random(5); if (player.gold<0) player.gold=0; if (forgetting.active>treasures_collected->4) { RndRoom(); (level->Cellnum(found_room.x, found_room.y, found_room.z))=(Contents (level->Cellnum(found_room.x, found_room.y, found_room.z))+100); } for (i=0:i<3:i++) { switch(i) { 0: ccur=lethargy; 1: ccur=leech; 2: ccur=forgetting; } if (player.x==ccur.x&&player.y==ccur.y&&player.z==ccur.z) { ccur.active=1; ! ha ha ha } } ]; [ FlavourText t; t=random(7); if (player.blind&&(t==1)) t=2; switch(t) { 1: print (srom) "^You see a bat fly by.^"; 2: print (srom) "^You stepped on a frog!^"; 3: print (srom) "^You sneezed!^"; 4: print (srom) "^You feel like you're being watched!^"; 5: print (srom) "^You hear faint rustling noises.^"; 6: print (srom) "^You hear "; t=random(4); switch(t) { 1: print (srom) "thunder.^"; 2: print (srom) "footsteps.^"; 3: print (srom) "a scream!^"; 4: print (srom) "a wumpus!^"; } 7: t=random(12)+12; print (srom) "^You smell ", (srom) map_articles-->t, (srom) map_names-->t, (srom) " frying!^"; } ]; [ TreasureEffects; if (player.blind&&treasures_collected->3) { player.blind=0; print (srom) "^The opal eye cures your blindness!^"; } if (player.stickybook&&treasures_collected->5) { player.stickybook=0; print (srom) "^The blue flame dissolves the book!^"; } ]; [ NewRoom; PrintStatus(); print (srom) "^Here you find ", (srom) map_articles-->Contents(level->Cellnum(player.x, player.y, player.z)), (srom) map_names-->Contents(level->Cellnum(player.x, player.y, player.z)), (srom) ".^"; ! Mark room visited level->Cellnum(player.x, player.y, player.z)= Contents(level->Cellnum(player.x, player.y, player.z)); switch(level->Cellnum(player.x,player.y, player.z)) { 1 to 6, 11, 12: return; ! empty,entrance,stairs,pool,chest,orb,book 7: player.gold=player.gold+random(10); EmptyPlayerLocation(); print (srom) "^You now have ", (nrom) player.gold, (srom) ".^"; return; 8: player.flares=player.flares+random(5); EmptyPlayerLocation(); print (srom) "^You now have ", (nrom) player.flares, (srom) ".^"; return; 9: if (player.x==orb.x&&player.y==orb.y&&player.z==orb.z) { if (player.justteleported) { print (sbold) "^Great Unmitigated Zot!^^You just found ***", (sund) "the Orb of Zot", (sbold) "***!^", (srom) "^The ", (sund) "Runestaff", (srom) " has disappeared.^"; orb.x=0; orb.found=1; runestaff.found=0; EmptyPlayerLocation(); } else { Move(); } } else { player.x=random(8); player.y=random(8); player.z=random(8); NewRoom(); } return; 10: player.z=Wrap(player.z+1); NewRoom(); return; 26 to 33: treasures_collected->((level->Cellnum(player.x,player.y, player.z)) -26) =1; EmptyPlayerLocation(); player.treasures=player.treasures+1; print (srom) "^It's now yours!^"; return; } Creature(); ]; [ PrintStatus; if (~~player.blind) { print (sbold) "^You are at ", (cbold) player, (sbold) ".^"; } if (mode==stats&&(0->33)>39) { StatusLine(); } else { print (srom) "^Strength = ", (nrom) player.st, (srom) " Intelligence = ", (nrom) player.iq, (srom) " Dexterity = ", (nrom) player.dx, (srom) "^Treasures = ", (nrom) player.treasures, (srom) " Flares = ", (nrom) player.flares, (srom) " Gold pieces = ", (nrom) player.gold, (srom) "^Weapon = ", (srom) weapon_names-->(player.weaponclass), (srom) " Armor = ", (srom) armor_names-->(player.armorclass); if (player.lamp) print (srom) " and a lamp"; new_line; } ]; [ StatusLine i; ! Remember: no printing rules in this section! @split_window 5; @set_window 1; style reverse; for (i=1:i<=5:i++) { @set_cursor i 1; spaces (0->33); } @set_cursor 1 1; print "Strength: ", player.st; @set_cursor 2 1; print "Intelligence: ", player.iq; @set_cursor 3 1; print "Dexterity: ", player.dx; if (player.treasures) { @set_cursor 4 1; print "Treasures: ", player.treasures; } @set_cursor 5 1; if (runestaff.found) print "Runestaff"; if (orb.found) print "***Orb of Zot***"; if (player.weaponclass>0) { @set_cursor 1 21; print "Weapon: ", (string) weapon_names--> (player.weaponclass); } if (player.armorclass>0) { @set_cursor 2 21; print "Armor: ", (string) armor_names--> (player.armorclass); } if (player.gold) { @set_cursor 3 21; print "Gold pieces: ", player.gold; } if (player.flares) { @set_cursor 4 21; print "Flares: ", player.flares; } if (player.lamp) { @set_cursor 5 21; print "Lamp"; } @set_cursor 1 1; style roman; @set_window 0; ]; [ MapLine xs ys i o t; @split_window 8; @set_window 1; style reverse; for (i=1:i<=8:i++) { @set_cursor i 1; spaces (0->33); } if (mapok) { for (ys=1:ys<=8:ys++) { for (xs=1:xs<=8:xs++) { t=level->Cellnum(xs, ys, player.z); if (t>99) t=0; o=(xs*3)+1; @set_cursor ys o; if (player.x==xs&&player.y==ys) { print "<", (char) map_symbols->t, ">"; } else { print " ", (char) map_symbols->t, " "; } } } if ((0->33)>37) { @set_cursor 3 30; print "Level ", player.z; } } @set_cursor 1 1; style roman; @set_window 0; ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ PBlind; if (player.blind) { print (sbold) "^** You can't see anything, you dumb ", (sbold) race_names-->(player.race-1), (sbold) "!^"; rtrue; } rfalse; ]; [ PrintHelp; @erase_window -1; if (mode==stats) print (srom) "^^^^^^"; if (mode==map) print (srom) "^^^^^^^^"; print (sbold) "*** Wizard's Castle Command and Information Summary ***^"; print (srom) "^The following commands are available :^^"; if (mode==classic) { print (srom) "h/elp n/orth s/outh e/ast w/est u/p^ d/own dr/ink m/ap f/lare l/amp o/pen^ g/aze t/eleport q/uit^"; } else { print (srom) "Help North South East West Up^ Down DRink Map Flare Lamp Open^ Gaze Teleport Quit^"; } print (srom) "^The contents of rooms are as follows :^^ . = Empty room B = Book C = Chest^ D = Stairs down E = Entrance/Exit F = Flares^ G = Gold pieces M = Monster O = Crystal orb^ P = Magic pool S = Sinkhole T = Treasure^ U = Stairs up V = Vendor W = Warp/Orb^^ The benefits of having treasures are :^^ Ruby red - avoid lethargy Pale pearl - avoid leech^ Green gem - avoid forgetting Opal eye - cures blindness^ Blue flame - dissolves books Norn stone - no benefit^ Palantir - no benefit Silmaril - no benefit^^ Press return when ready to resume, ", (srom) race_names-->(player.race-1), (srom) ". "; GetInput(1); ]; [ Teleport; if (runestaff.found) { print (srom) "^X-coordinate? "; if (mode==classic) player.y=GetCoord(); else player.x=GetCoord(); print (srom) "^Y-coordinate? "; if (mode==classic) player.x=GetCoord(); else player.y=GetCoord(); print (srom) "^Z-coordinate? "; player.z=GetCoord(); player.justteleported=1; NewRoom(); player.justteleported=0; } else { print (sbold) "^** You can't teleport without the ", (sund) "Runestaff", (sbold) "!^"; } ]; [ PrintMap xs ys t; if (PBlind()) return; if (mode==map) { print (sbold) "^** You can already see the map!^"; return; } font off; new_line; ! No printing rules here for (ys=1:ys<=8:ys++) { for (xs=1:xs<=8:xs++) { t=level->Cellnum(xs, ys, player.z); if (t>99) t=0; if (player.x==xs&&player.y==ys) { print "<", (char) map_symbols->t, "> "; } else { print " ", (char) map_symbols->t, " "; } } print "^^"; } font on; print (srom) "You are at ", (crom) player, (srom) ".^"; ]; [ Gaze r; if (PBlind()) return; if (level->Cellnum(player.x, player.y, player.z)~=11) { print (sbold) "^** It's hard to gaze without an orb!^"; return; } r=random(13)+12; print (srom) "^You see "; switch(random(6)) { 1: print (srom) "a soap opera rerun!^"; 2: print (srom) "yourself in a bloody heap!^"; player.st=player.st-random(2); if (player.st<1) deadflag=1; 3: print (srom) map_articles-->r, (srom) map_names-->r, (srom) " gazing back at you!^"; 4: print (srom) "yourself drinking from a pool and becoming ", (srom) map_articles-->r, (srom) map_names-->r, (srom) "!^"; 5: RndRoom(); r=Contents(level->Cellnum(found_room.x, found_room.y, found_room.z)); print (srom) map_articles-->r, (srom) map_names-->r, (srom) " at ", (crom) found_room, (srom) ".^"; 6: print (sbold) "***", (sund) "the Orb of Zot", (sbold) "***", (srom) " at "; if ((mode==classic&&random(8)<4)||(mode~=classic&&random(2)==1)) { print (crom) orb; } else { RndRoom(); print (crom) found_room; } print (srom) "!^"; } ]; [ Move; if (input->2=='N'&&player.x==4&&player.y==1&&player.z==1) { deadflag=2; return; } switch (input->2) { 'N': player.y=Wrap(player.y-1); 'S': player.y=Wrap(player.y+1); 'E': player.x=Wrap(player.x+1); 'W': player.x=Wrap(player.x-1); } NewRoom(); ]; [ Stairs t; t=level->Cellnum(player.x, player.y, player.z); if (input->2=='U'&&t==3) { player.z=player.z-1; NewRoom(); return; } if (input->2=='D'&&t==4) { player.z=player.z+1; NewRoom(); return; } print (sbold) "^** There are no stairs going "; if (input->2=='U') print (sbold) "up"; else print (sbold) "down"; print (sbold) " from here!^"; ]; [ Flare fx fy t; if (PBlind()) return; if (~~player.flares) { print (sbold) "^** Hey, bright one, you're out of flares!^"; return; } player.flares=player.flares-1; ! No printing rules if (mode~=map) { font off; new_line; } for (fy=-1:fy<=1:fy++) { for (fx=-1:fx<=1:fx++) { t=Contents(level->Cellnum(Wrap(player.x+fx),Wrap(player.y+fy), player.z)); level->Cellnum(Wrap(player.x+fx),Wrap(player.y+fy),player.z)=t; if (mode~=map) print " ", (char) map_symbols->t, " "; } if (mode~=map) print "^^"; } if (mode~=map) { font on; print (srom) "You are at ", (crom) player, ".^"; } if (mode~=classic) { print (srom) "^You have "; if (player.flares) print (nrom) player.flares; else print (srom) "no"; print (srom) " flares left.^"; } ]; [ UseLamp lx ly t; if (PBlind()) return; if (~~player.lamp) { print (sbold) "^** You don't have a lamp, ", (sbold) race_names-->(player.race-1), (sbold) "!^"; return; } print (srom) "^Where do you want to shine the lamp (N,S,E,W)? "; GetInput(1); lx=0; ly=0; switch (input->2) { 'N': ly=-1; 'S': ly=1; 'E': lx=1; 'W': lx=-1; default: print (sbold) "^** That's not a direction, ", (sbold) race_names-->(player.race-1), (sbold) "!^"; } if (~~(lx+ly)) return; lx=Wrap(lx+player.x); ly=Wrap(ly+player.y); found_room.x=lx; found_room.y=ly; found_room.z=player.z; print (srom) "^The lamp shines into ", (crom) found_room; t=Contents(level->Cellnum(lx,ly,player.z)); level->Cellnum(lx,ly,player.z)=t; print (srom) ".^^There you will find ", (srom) map_articles-->t, (srom) map_names-->t, (srom) ".^"; ]; [ Drink t; if (level->Cellnum(player.x, player.y, player.z)~=5) { print (sbold) "^** If you want a drink, find a pool!^"; return; } print (srom) "^You take a drink and "; switch (random(8)) { 1: print (srom) "feel stronger.^"; player.st=Limit(player.st+random(3)); 2: print (srom) "feel smarter.^"; player.iq=Limit(player.iq+random(3)); 3: print (srom) "feel nimbler.^"; player.dx=Limit(player.dx+random(3)); 4: print (srom) "feel weaker.^"; player.st=player.st-random(3); if (player.st<1) deadflag=1; 5: print (srom) "feel dumber.^"; player.iq=player.iq-random(3); if (player.iq<1) deadflag=1; 6: print (srom) "feel clumsier.^"; player.dx=player.dx-random(3); if (player.dx<1) deadflag=1; 7: do t=random(4); until (t~=player.race); player.race=t; print (srom) "become ", (srom) race_articles-->(player.race-1), (srom) race_names-->(player.race-1), (srom) ".^"; 8: player.sex=1-player.sex; print (srom) "turn into a "; if (player.sex) print (srom) "fe"; print (srom) "male ", (srom) race_names-->(player.race-1), (srom) ".^"; } ]; [ Open; switch(level->Cellnum(player.x, player.y, player.z)) { 6: OpenChest(); 12: OpenBook(); default: print (sbold) "^** The only thing opened was your big mouth!^"; } ]; [ OpenChest t; print (srom) "^You open the chest and "; if (mode==classic) new_line; switch(random(4)) { 1: print (sbold) "KABOOM!", (srom) " it explodes!!^"; DamagePlayer(random(6)); if (player.st<=0) deadflag=1; 2, 3: t=random(999)+1; ! Easy way out of plural problems print (srom) "find ", (nrom) t, (srom) " gold pieces!^"; player.gold=player.gold+t; if (player.gold>30000) player.gold=30000; 4: print (srom) "... gas! You stagger from the room!^"; player.turns=player.turns+20; input->2=random('N','S','E','W'); Move(); } EmptyPlayerLocation(); ]; [ OpenBook; print (srom) "^You open the book and "; if (mode==classic) new_line; switch(random(6)) { 1: print (sbold) "FLASH!", (srom) " Oh no! You are now a blind ", (srom) race_names-->(player.race-1), (srom) "!^"; player.blind=1; 2: print (srom) "it's another volume of Zot's poetry! - Yech!!^"; 3: print (srom) "it's an old copy of Play", (srom) race_names-->(random(4)-1), (srom) "!^"; 4: print (srom) "it's a manual of strength!^"; player.st=18; 5: print (srom) "it's a manual of dexterity!^"; player.dx=18; 6: print (srom) "the book sticks to your hands -^Now you are unable to draw your weapon!^"; player.stickybook=1; } EmptyPlayerLocation(); ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ EmptyPlayerLocation; level->Cellnum(player.x,player.y,player.z)=1; ]; [ DamagePlayer d; if (player.armorclass) { d=d-player.armorclass; player.armorhealth=player.armorhealth-player.armorclass; if (d<0) { player.armorhealth=player.armorhealth-d; d=0; } if (player.armorhealth<=0) { player.armorclass=0; player.armorhealth=0; print (srom) "^Your armor has been destroyed ... good luck!^"; } } player.st=player.st-d; ]; [ Creature c v; c=(level->Cellnum(player.x,player.y,player.z))-12; if (c==13 && ~~player.vendorenemy) { v=0; do { print (srom) "^You may trade with, attack or ignore the vendor.^^ Your choice? "; GetInput(1); switch(input->2) { 'T': Trade(); return; 'I': return; 'A': print (srom) "^You'll be sorry you did that!^"; player.vendorenemy=1; default: print (sbold) "^** Nice shot, ", (sbold) race_names-->(player.race-1), (sbold) "!^"; } } until (player.vendorenemy); } FightMonster(c); ]; [ Trade t c; for (t=0:t<8:t++) { c=random(1500*(t+1))+1; if (treasures_collected->t) { print (srom) "^Do you want to sell ", (srom) map_articles-->(t+26), (srom) map_names-->(t+26), (srom) " for ", (nrom) c, (srom) " gold pieces? "; if (YesNo()) { player.treasures=player.treasures-1; treasures_collected->t=0; while (c>0) { player.gold=player.gold+2000; c=c-2000; if (c<0) { player.gold=player.gold+c; c=0; } if (player.gold>30000) player.gold=30000; } } } } if (player.gold<1000) { print (srom) "^You're too poor to trade, ", (srom) race_names-->(player.race-1), (srom) "!^"; return; } if (player.gold>1250) { print (srom) "^Ok, ", (srom) race_names-->(player.race-1), (srom) ", you have ", (nrom) player.gold, (srom) " GP's and "; if (player.armorclass||mode==classic) print (srom) armor_names--> (player.armorclass); else print (srom) "no"; print (srom) " armor.^^These are the types of armor you can buy:^Nothing<0> Leather<1250>"; if (player.gold>1499) print (srom) " Chainmail<1500>"; if (player.gold>1999) print (srom) " Plate<2000>"; new_line; t=-1; do { print (srom) "^Your choice? "; GetInput(1); switch(input->2) { 'N': t=0; 'L': t=1; player.gold=player.gold-1250; 'C': if (player.gold>1499) { t=2; player.gold=player.gold-1500; } else { print (sbold) "^** You haven't got that much cash on hand!^"; t=0; } 'P': if (player.gold>1999) { t=3; player.gold=player.gold-2000; } else { print (sbold) "^** You can't afford plate armor!^"; t=0; } default: print (sbold) "^** Don't be silly. Choose a selection.^"; } } until (t>-1); if (t) { player.armorclass=t; player.armorhealth=t*7; } if (player.gold>1250) { print (srom) "^You have ", (nrom) player.gold, (srom) " GP's left with ", (srom) weapon_names-->(player.weaponclass), (srom) " in hand.^^These are the types of weapons you can buy:^Nothing<0> Dagger<1250>"; if (player.gold>1499) print (srom) " Mace<1500>"; if (player.gold>1999) print (srom) " Sword<2000>"; new_line; t=-1; do { print (srom) "^Your choice? "; GetInput(1); switch(input->2) { 'N': t=0; 'D': t=1; player.gold=player.gold-1250; 'M': if (player.gold>1499) { t=2; player.gold=player.gold-1500; } else { print (sbold) "^** Sorry sir, I'm afraid I don't give credit!^"; t=0; } 'S': if (player.gold>1999) { t=3; player.gold=player.gold-2000; } else { print (sbold) "^** Your Dungeon Express card - you left home without it!^"; t=0; } default: print (sbold) "^** Try choosing a selection!^"; } } until (t>-1); if (t) player.weaponclass=t; } } for (t=0:t<3:t++) { switch(t) { 0: OfferPotion(st); 1: OfferPotion(iq); 2: OfferPotion(dx); } } if (player.gold>999&&(~~player.lamp)) { print (srom) "^Do you want to buy a lamp for 1000 GP's? "; if (YesNo()) { player.lamp=1; player.gold=player.gold-1000; print (srom) "^It's guaranteed to outlive you!^"; } } ]; [ OfferPotion stat; if (player.gold<1000) return; print (srom) "^Do you want to buy a potion of ", (statname) stat, (srom) " for 1000 GP's? "; if (YesNo()) { player.gold=player.gold-1000; player.stat=Limit(player.stat+random(6)); if (mode~=stats) { print (srom) "^Your ", (statname) stat, (srom) " is now ", (nrom) player.stat, (srom) ".^"; } OfferPotion(stat); } ]; [ Fightmonster c hp first cmd t web; hp=c+2; first=1; while (1) { if ((~~first)||(lethargy.active<=treasures_collected->0&& (~~player.blind)&&player.dx>=random(9)+random(9))) { ! You attack cmd=0; do { print (sbold) "^You're facing ", (sbold) map_articles-->(c+12), (sbold) map_names-->(c+12), (sbold) "!^"; print (srom) "^You can attack or retreat.^"; if (first) print (srom) "You can also attempt a bribe.^"; if (first&&player.iq>14) print (srom) "You can also cast a spell.^"; if (mode==stats) { print (srom) "^Your choice? "; } else { print (srom) "^Your strength is ", (nrom) player.st, (srom) " and your dexterity is ", (nrom) player.dx, (srom) ".^^Your choice? "; } GetInput(1); switch (input->2) { 'A': cmd=1; 'R': cmd=2; 'C': if (first&&player.iq>14) { cmd=3; } else { print (sbold) "^** You can't cast a spell now!^"; } default: if (first&&input->2=='B') { cmd=4; } else { print (sbold) "^** Choose one of the options listed.^"; } } } until (cmd); switch (cmd) { 1: if (~~player.weaponclass) { print (sbold) "^** Pounding on ", (sbold) map_articles-->(c+12), (sbold) map_names-->(c+12), (sbold) " won't hurt it!^"; } else { if (player.stickybook) { print (sbold) "^** You can't beat it to death with a book!^"; } else { if (player.dx(c+12), (srom) "!^"; hp=hp-player.weaponclass; if ((c==9||c==12)&&random(8)==1) { print (srom) "^Oh no! Your ", (srom) weapon_names-->(player.weaponclass), (srom) " broke!^"; player.weaponclass=0; } } } } 3: t=0; do { print (srom) "^Which spell (Web, Fireball, Deathspell)? "; GetInput(1); switch (input->2) { 'W': t=1; 'F': t=2; 'D': t=3; default: print (sbold) "^** Try one of the options given.^"; } } until (t); switch (t) { 1: player.st=player.st-1; web=random(8)+1; 2: t=random(7)+random(7); print (srom) "^It does ", (nrom) t, (srom) " points worth of damage.^"; hp=hp-t; 3: print (sbold) "^Death", (srom) " . . . "; if (player.iq<15+random(4)) { print (srom) "yours!^"; player.iq=0; deadflag=1; return; } else { print (srom) "his!^"; hp=0; } } 4: if (player.treasures==0) { if (mode==classic) { print (srom) "^All I want is your life!^"; } else { print (srom) "^~All I want is your life!~^"; } } else { do { t=random(8)-1; } until (treasures_collected->t); new_line; if (mode~=classic) print (srom) "~"; print (srom) "I want ", (srom) map_articles-->(t+26), (srom) map_names-->(t+26), (srom) ". Will you give it to me?"; if (mode~=classic) print (srom) "~"; print (srom) " "; if (YesNo()) { treasures_collected->t=0; player.treasures=player.treasures-1; if (mode==classic) { print (srom) "^Ok, just don't tell anyone else.^"; } else { print (srom) "^~Ok, just don't tell anyone else.~^"; } return; } } } } first=0; if (player.st<1||player.dx<1) { deadflag=1; return; } if (hp<1) { if (mode==classic) { print (srom) map_articles-->(c+12); } else { print (srom) "^The "; } print (srom) map_names-->(c+12), (srom) " lies dead at your feet!^"; if (player.lastmeal(c+12), (srom) map_names-->(c+12), (srom) food_names-->(random(8)-1), (srom) ".^"; } if (player.x==runestaff.x&&player.y==runestaff.y&&player.z== runestaff.z) { print (sbold) "^Great Zot! You've found the ", (sund) "Runestaff", (sbold) "!^"; runestaff.found=1; runestaff.x=0; ! Shouldn't be necessary but it can't hurt } if (c==13) { print (srom) "^You get all his wares:^plate armor^a sword^a strength potion^an intelligence potion^a dexterity potion^"; if (~~player.lamp) { player.lamp=1; print (srom) "and a lamp^"; } player.armorhealth=21; player.armorclass=3;player.weaponclass=3; player.st=Limit(player.st+random(6)); player.iq=Limit(player.iq+random(6)); player.dx=Limit(player.dx+random(6)); } t=random(999)+1; print (srom) "^You now get his hoard of ", (nrom) t, (srom) " GP's!^"; player.gold=player.gold+t; if (player.gold>30000) player.gold=30000; EmptyPlayerLocation(); return; } if (web) { web=web-1; if (web==0) print (srom) "^The web just broke!^"; } print (srom) "^The ", (srom) map_names-->(c+12); if (web) { print (srom) " is stuck and can't attack now!^"; } else { print (srom) " attacks!^"; if (player.dx<(random(7)+random(7)+random(7)+(3*player.blind))) { print (srom) "^Ouch! He hit you!^"; DamagePlayer((c/2)+1); if (player.st<1) { deadflag=1; return; } } else { print (srom) "^What luck, he missed you!^"; } } if (cmd==2) { print (srom) "^You have escaped!^"; t=0; do { print (srom) "^Do you want to go north, south, east or west? "; GetInput(1); switch(input->2) { 'N', 'S', 'E', 'W': t=1; default: print (sbold) "^** Don't push your luck, ", (sbold) race_names-->(player.race-1), (sbold) "!^"; } } until (t); Move(); return; } } ]; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ statname stat; switch(stat) { st: print (srom) "strength"; iq: print (srom) "intelligence"; dx: print (srom) "dexterity"; } ]; [ stars; print (sbold) "^****************************************************************^"; ]; [ crom t; if (mode==classic) { print (srom) "( ", (nrom) t.y, (srom) " , ", (nrom) t.x, (srom) " ) level ", (nrom) t.z; } else { print (srom) "( ", (nrom) t.x, (srom) " , ", (nrom) t.y, (srom) " ) level ", (nrom) t.z; } ]; [ cbold t; if (mode==classic) { print (sbold) "( ", (nbold) t.y, (sbold) " , ", (nbold) t.x, (sbold) " ) level ", (nbold) t.z; } else { print (sbold) "( ", (nbold) t.x, (sbold) " , ", (nbold) t.y, (sbold) " ) level ", (nbold) t.z; } ]; ! Provided only for completeness, as yet there is nothing which prints ! coordinates in underline [ cund t; if (mode==classic) { print (sund) "( ", (nund) t.y, (sund) " , ", (nund) t.x, (sund) " ) level ", (nund) t.z; } else { print (sund) "( ", (nund) t.x, (sund) " , ", (nund) t.y, (sund) " ) level ", (nund) t.z; } ]; Message "Do not worry, cund is provided only for completeness."; ! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ! Everything is printed with a rule, so that classic mode can capitalise ! everything and not use colours [ srom msg i l t; if (mode~= classic) { print (string) msg; return; } ! Now begins the evil process of capitalising strings t=msg.print_to_array(caps_array); for (i=2:i<=t+1:i++) { l=caps_array->i; if (l>96&&l<123) print (char) l-32; else print (char) l; } ]; [ nrom num; print num; ]; [ sbold msg; if (mode==classic) { print (srom) msg; return; } style bold; print (srom) msg; style roman; ]; [ nbold num; if (mode==classic) { print (nrom) num; return; } style bold; print (nrom) num; style roman; ]; [ sund msg; if (mode==classic) { print (srom) msg; return; } style underline; print (srom) msg; style roman; ]; [ nund num; if (mode==classic) { print (nrom) num; return; } style underline; print (nrom) num; style roman; ];