home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 2061.dms / in.adf / FRAC.doc.pp / FRAC.doc
Encoding:
Text File  |  1992-06-23  |  243.0 KB  |  6,236 lines

  1.                              INTRODUCTION
  2.                              ============
  3.  
  4. It is now many moons since work on FRAC began; spanning a period of
  5. about a year and a half in total - although understandably the work was
  6. often sporadic, with variable gaps which I used to formulate new ideas
  7. and also test what I had already written. Even so I have been
  8. contemplating the concept of an adventure game creator for some five
  9. years now - originally designing it to run on a ZX Spectrum in BASIC.
  10. At this point I had solved the problem of text manipulation: a text
  11. pool was reserved so that sets amount of memory were not allocated for
  12. specific tasks, rather it was allocated whenever and wherever it was
  13. needed (this allowed you to decide how you wished the memory to be
  14. managed).
  15.      The system lives on in the form of a datalist - but this is the
  16. only part that resembles my original concepts, since I progressed
  17. little further than the menu system and memory allocation techniques -
  18. I was overwhelmed by the prospect of writing a language and so moved on
  19. to other, more elementary projects. But ever after my mind strayed to
  20. this very task, and I often found myself scribbling down ideas for a
  21. program I had not even begun.
  22.      I have learnt much since those early flounderings - my study of
  23. Pascal had produced a new unheard of programming tool - `recursion`.
  24. With this I now saw that the fundamental problem of evaluating
  25. expressions and conditions could be overcome very efficiently indeed.
  26. The mandatory A-Level project provided the ultimate opportunity to see
  27. if my ideas for FRAC could be realised - even though there was of
  28. course the possibility that if my ability failed me the consequences
  29. could be disastrous.
  30.      But a year later I am glad to say that they didn`t, and so after a
  31. number of hours which I dread to contemplate, FRAC was brought into
  32. existence. For my part it exceeds all of my expectations and solves a
  33. problem which has tormented me for some time - even though during its
  34. creation I have found several more to occupy my thoughts.
  35.      As with any major work there are people who contributed to its
  36. creation and therefore need at the very least a mention. Firstly I
  37. would like to thank Robert Pike, Richard Uttley and Peter Nicholson who
  38. gave me many ideas, criticisms, and several adventures to play when I
  39. was so sick of the sight of FRAC that I found I could not bear to use
  40. it to write my own adventures on. Hopefully this will pass with time so
  41. that I can also have some fun, but until then its back to the program
  42. flowcharts.......
  43.      I must also thank Pat Quaid who wrote the compiler which `saved my
  44. life` - and for extremely helpful tips on how to get it working again
  45. when it died.
  46.      Although enjoyment is gained during the creation of a program,
  47. this is insignificant when compared to seeing the results of your work
  48. put to good use. Consequently I would like to see any adventures
  49. written using FRAC, as this would substantially repay any toil on my
  50. part.
  51.      All that`s left to say is `happy adventuring`, and I hope you
  52. enjoy using FRAC more than I did writing it!
  53.  
  54.  
  55.                         BACKGROUND ANALYSIS
  56.                         ===================
  57.  
  58. The aim of this project is quite complex and relies on the reader /
  59. user having some knowledge of the class of computer game often referred
  60. to as `adventure`. Since people reading it purely to assess its
  61. programming content are unlikely to have such knowledge, it is my task
  62. to provide information regarding `adventure` games even before the
  63. problem is explained or attempted.
  64.       The history and development of adventure games to their present
  65. and most efficient form, is a long and arduous journey, but one which I
  66. feel is worth making if games of this genre are to be completely
  67. understood.
  68.       Let us start this tale `ere the dawn of the computer age captured
  69. and changed this world, for eternity` that is, before about 1982.
  70. Fantasy games during this period were quite widespread but lacking any
  71. great commercial backing, small home-made companies ruled. Their games
  72. were made up mainly as a pastime which might perhaps earn them a small
  73. sum of money, if they were lucky. Such games were rarely well produced
  74. but the quality formed by the enthusiasm and dedication of the early
  75. designers made up for such shortcomings. But the horizon looked bright,
  76. and popularity was growing. Soon larger companies became interested in
  77. the commercial potential of such games and it was at this time that the
  78. birth of the home computer provided many households with a cheap and
  79. easily useable means of computation. But this story is already known to
  80. you, and is already well documented. Hence I will not dwell long at
  81. its wonders, suffice to say that this had a great impact on the
  82. fantasy game industry.
  83.       At this point I would like to digress and describe the types of
  84. games that were played in this era. There are basically three main
  85. categories of games which are inter-related. These are, in order of
  86. popularity: Fantasy Roleplaying, Fantasy Boardgaming and Table-Top
  87. Wargaming. Out of these three the most influential to the development
  88. of computerised adventure games is roleplaying games, so only
  89. these will be examined here. Basically, roleplaying games are
  90. interactive stories where the players take the role of the leading
  91. characters. The action takes place in the players imagination, aided by
  92. the narrative of the GM (meaning Games Master or story-teller) and a
  93. set of guidelines laid out in the form of a book. The story itself is
  94. defined by what is called in gaming terms `a scenario`, and these can
  95. be bought or written by the GM. The GM is the person who controls the
  96. game and knows the entire scenario i.e. how certain characters in the
  97. game will react if the players meet them and then `controls` them
  98. accordingly. The players themselves know much less about the adventure
  99. and guessing how they should react to a certain situation is part of
  100. the fun. To give each character a unique background and skills, they
  101. each posses statistics which define how good they are at certain things
  102. e.g. Ballistic skill tells you how well you can shoot weapons - thus
  103. their personalities are built up from these building blocks. Characters
  104. start with randomly rolled statistics which are generally quite low, so
  105. as to allow room for improvement.
  106.       The ultimate aim of the player is to improve their statistics as
  107. far as possible, producing a much more powerful adventurer. This is
  108. achieved through the use of experience points which can be `traded in`
  109. for better characteristics. Experience points are gained through the
  110. course of adventure games - at the end the GM will issue out experience
  111. points based on how well he thinks they have done.
  112.       The only real way to see how roleplaying games are played is to
  113. either play one or examine the dialogue which takes place during one. A
  114. sample of the latter will now be presented below, with the characters
  115. taking part described initially.
  116.  
  117.                         ***********************
  118.  
  119. Name:             BILL Hawksworth         Previous occupation: Hunter
  120. Religious Beliefs:none                    Age:                 24
  121. Homeland:         The city of Dirkholm    Experience:          212
  122.  
  123. Weapon Skill:     43                      Ballistic Skill:     64
  124. Strength:         38                      Agility:             42
  125. Stamina:          52                      Health:              84
  126.  
  127. Weapons:          Crossbow,Dagger         Armour:              Plate
  128. Possessions:      Pouch,20 gold pieces,food,water,backpack,golden ring
  129.  
  130.                         ***********************
  131.  
  132. Name:             BEN Virag               Previous occupation: Outrider
  133. Religious Beliefs:Thorak, the god of war  Age:                 22
  134. Homeland:         The plains of Utarg     Experience:          226
  135.  
  136. Weapon Skill:     62                      Ballistic Skill:     45
  137. Strength:         39                      Agility:             51
  138. Stamina:          48                      Health:              73
  139.  
  140. Weapons:          Broadsword              Armour:              Leather
  141. Possessions:      Pouch,12 gold pieces,food,water,backpack,rope
  142.  
  143.                         ***********************
  144.  
  145. Name:             JAKE Elderstar          Previous occupation: Ranger
  146. Religious Beliefs:Elra, goddess of nature Age:                 27
  147. Homeland:         The northern Forests    Experience:          413
  148.  
  149. Weapon Skill:     72                      Ballistic Skill:     61
  150. Strength:         63                      Agility:             67
  151. Stamina:          58                      Health:              96
  152.  
  153. Weapons:          Bow / arrow,Broadsword  Armour:              Mail
  154. Possessions:      Pouch,56 gold pieces,backpack,water,magical cloak
  155.  
  156.                         ***********************
  157.  
  158. GM:    After leaving the forest, a vast grassy plain stretches in front
  159. of you. The flatness is broken by a range of foothills which veer
  160. northward. Beyond, in the distance, a mountain range can be seen, but
  161. the view is partially obscured by a haze which seems to stem from the
  162. the foothills.
  163. BEN:   Okay, we`ll travel towards the foothills.
  164.  
  165. GM:    The distance is quite large and it takes you some time to reach
  166. the base of the foothills. Your path is blocked by a fast flowing river
  167. which runs from the hills. The banking is soft and muddy.
  168.  
  169. BILL:  Are there any foot-prints in the mud?
  170.  
  171. GM:    No, only yours.
  172.  
  173. BEN:   Could we swim across? Is it wide?
  174.  
  175. GM:    Yes, the other side is some distance, and you could not swim    
  176. well in your armour!
  177.  
  178. BILL:  Are there any trees near?
  179.  
  180. GM:    None in the immediate vicinity.
  181.  
  182. BEN:   AH, I could use my rope if we found one.
  183.  
  184. BILL:  How? Someone would have to tie it to the other side if you
  185. wanted to make a bridge.
  186.  
  187. BEN:   Oh Yeah. Okay we`ll walk downstream and look for a bridge then.
  188.  
  189. GM:    You walk for almost an hour without finding a bridge. You
  190. eventually come to a wide stony area where the river is slower and it
  191. is possible to wade. In the distance the haze seems to be growing, but
  192. the summer birds still sing happily. On the other side of the water, on
  193. a small rounded hill stands a building of some kind, it appears to be
  194. in a state of disrepair.
  195.  
  196. BILL:  OK. I`ll wade across and approach the building cautiously.
  197.  
  198. BEN:   Yeah, I`ll draw my sword and follow.
  199.  
  200. JAKE:  So will I.
  201.  
  202. GM:    As you get nearer you see that the building appears to be a
  203. house of some kind and you are actually approaching it`s front porch.
  204. It is a single storey structure with large timber support joints. To
  205. the right of the door is a window. All is silent.
  206.  
  207. BILL:  OK. I`ll jump through the window and Ben, you burst through the
  208. door.
  209.  
  210. BEN:   OK.
  211.  
  212. GM:    If you really want to(!). Ben you charge toward the door which
  213. looks quite solid. I`ll make a roll against your strength (his strength
  214. is 39% and the GM rolls 68% - which means he`s failed by 29%) you
  215. hurtle into the door but it proves too solid and you rebound crashing
  216. over the wooden porch railings. You drop your sword. Bill?
  217.  
  218. BILL:  No, I`ve changed my mind. I`ll draw my crossbow and shoot
  219. through the window.
  220.  
  221. GM:    OK. I`ll roll against your Ballistic skill (Bill`s Ballistic
  222. skill is 64% and the GM rolls 34%) - the bolt crashes through the
  223. window scattering glass everywhere.
  224.  
  225. BILL:  Were there any screams?
  226.  
  227. GM:    NO.
  228.  
  229. JAKE:  This is sad. I`ll open the door.
  230.  
  231. GM:    Inside it is almost empty. Floorboards constitute the floor
  232. (they are now scattered with glass) and the only item of furniture is a
  233. wooden table which is at the centre of the room. The walls are
  234. unadorned except for a crossbow bolt which is embedded in the one
  235. opposite to the window. This door is the only exit and the broken
  236. window is the only window.
  237.  
  238. JAKE:  Is there anything else of note - any objects?
  239.  
  240. GM:    No, as you enter the room dust flies up, so it seems no one has
  241. been here for some time. Outside the sun is setting.
  242.  
  243. BILL:  OK. I`ll enter the room. We should spend the night here and move
  244. on at dawn.
  245.  
  246. JAKE:  Yes, but no longer, else our quest prove to be in vain........
  247.  
  248.                         ***********************
  249.  
  250. GM:    You all settle down to sleep after a hasty meal. Are you going
  251. to set a watch? It is dark now, and below the river can be heard.
  252.  
  253. JAKE:  Yeah. I`ll go first watch, Bill second and Ben last.
  254.  
  255. GM:    Jake, during your watch you hear nothing and are relieved by
  256. Bill who is not so fortunate. Your companions are fast asleep when you
  257. think you hear a kind of splashing in the river - it may be nothing and
  258. it is soon gone.
  259.  
  260. BILL:  I`m not taking any chances. I`ll rearm my crossbow and creep to
  261. the window.
  262.  
  263. GM:    It is hard to be quiet and the glass underfoot makes a seemingly
  264. deafening crunch. Outside you can see the vague shadows of the hillside
  265. the countless stars illuminate the river, which glistens. You can see
  266. nothing unusual.
  267.  
  268. BILL:  ERR, I creep to the door, open it slowly, and peak out.
  269.  
  270. GM:    You have a better view now and the starlit river trails off into
  271. the distance. There is nothing unusual. Then you hear a loud metallic
  272. chink somewhere behind you as something scrapes the side of the
  273. building.
  274.  
  275. BILL:  I`ll wake up the others as quietly as possible, and tell them
  276. what`s happened.
  277.  
  278. JAKE:  At last! I`ll draw my sword.
  279.  
  280. BEN:   Me too.
  281.  
  282. GM:    Something seems to be on the roof. It creaks and there is a
  283. scraping sound. Again you hear a splashing at the river - louder this
  284. time, and again.
  285.  
  286. JAKE:  I`ll wedge the door closed with the table and Bill, you guard
  287. the window with your crossbow.
  288.  
  289. GM:    Suddenly a dark shape drops from the roof right in front of the
  290. window.
  291.  
  292. BILL:  I`ll fire!
  293.  
  294. GM:    (After Testing). You shoot your crossbow which appears to hit as
  295. the shape flitters from view.
  296.  
  297. BILL:  I`ll reload.
  298.  
  299. GM:    Something heavy crashes against the door which opens a fraction
  300. as the table is pushed back.
  301.  
  302. JAKE:  I`ll force myself against the door and try and keep it closed.
  303.  
  304. GM:    (After a strength test). You manage to keep it closed with some
  305. effort. But suddenly something jumps through the window and lands in
  306. front of Bill who is still reloading.
  307.  
  308. BEN:   I`ll hit it with my sword!
  309.  
  310. GM:    (After testing against weapon skill). You manage to wound the
  311. creature and it cries out. It has fiery red eyes and a roughly made
  312. sword.
  313.  
  314. BILL:  I`ll kick it away from me and shoot right at it.
  315.  
  316. GM:    Your bolt impales the creature which gasps and goes still.
  317. Outside all is silent.
  318.  
  319. BILL:  I`ll reload and look through the window.
  320.  
  321. GM:    All is still.
  322.  
  323. JAKE:  Right, I`ll open the door and run for it, across the river.
  324.  
  325. BEN:   Hey, wait for us!
  326.  
  327. So this is basically how roleplaying games are played. If after reading
  328. this you wish to start gaming, I would personally recommend Warhammer
  329. Fantasy Roleplay created by Games Workshop - but now back to computer
  330. adventure games.
  331.  
  332. Through the use of computers roleplayers (as they were called) could
  333. now produce programs to suit their needs after only a few hours of
  334. pondering over a BASIC manual - no more endless dice throwing to test
  335. if that cavalry unit could rally this turn, no more brain eating mental
  336. arithmetic half-way through a campaign, and for the roleplayer: no more
  337. tedious `rolling up` of characters (i.e. the random production of a
  338. game character by rolling dice to determine the percentage of certain
  339. characteristics). It could all be done with the press of a button and a
  340. few RND statements. But although this was a turning point for fantasy
  341. gamers, it is still a long way from what today`s adventure games came
  342. from.
  343.  
  344.                         A Change in Attitude
  345.                         --------------------
  346.  
  347. Previously gamers had seen the computer as an automated `character
  348. roller-upper`, nothing more than a calculator with a few extra buttons
  349. that could save them a few minutes work. But attitudes were changing -
  350. what if this `calculator` could be made to describe where you were (as
  351. happens in roleplaying games), and could allow a player to type in what
  352. he wished to do (rather than explain it to the GM) - thus the computer
  353. GM was born - perfect in every way: he could throw dice at close to the
  354. speed of light, he didn`t spill coffee over the character sheets (a
  355. common fault among GM`s), he didn`t forget where you were and then try
  356. and make up lame excuses, but finally, his kid brother Jimi didn`t seem
  357. to end up with all the gold, magic weapons, clues, keys to secret
  358. entrances and all the luck. But there was one slight problem......
  359.       Using a computer to describe the location and then allowing the
  360. player to try and explain to the computer what he wanted to do using a
  361. limited vocabulary (very limited with the early games) there was no
  362. need for a GM, so he became redundant. Also with this simple type of
  363. system other players could not interact so they also were made
  364. redundant. All that was left was you and the computer - a solo game.
  365. This of course went against most roleplayers principles and here they
  366. parted from `computer adventures` which were held in contempt, and any
  367. who played them were not true roleplayers and treated as traitors
  368. accordingly (although most secretly played them when no-one was
  369. looking!). But this was not the first appearance of solo adventure
  370. games. In fact they had been around for some time in the form of
  371. adventure gamebooks (made popular in Britain through the work of Steve
  372. Jackson and Ian Livingstone) and fans of such gamebooks were eager to
  373. transfer their adventuring to the computer since it was far more
  374. flexible than the usual `you`ve got 3 options` method which was
  375. employed by gamebooks (should I: Verbally assault the fifty foot man-
  376. eating tree which is lumbering towards me, sit down and hope it will go
  377. away, or run like the wind?).
  378.       Thus was born a new type of game into the rather speculative
  379. leisure industry. But the critics were soon disproved as early games
  380. such as The Hobbit were just as, if not more popular than their
  381. `action` type rivals. Software houses were eager to produce such games
  382. and soon everyone was writing them. But adventure games require a lot
  383. more thought and design than most other game types and many were simply
  384. cheaply produced `trash`. So the boom ended and most turned back to
  385. mainstream games which guaranteed them money. But not all was gloomy
  386. for the would-be adventurer. Out of this popularity boom grew a number
  387. of specialised `adventure writing` software houses which solely
  388. produced this type of game, and had a large following (Magnetic Scrolls
  389. and Level 9 are still producing top selling games today - almost ten
  390. years on). By the dedicated work of these specialised software
  391. producers, many quality games were now available and the adventure game
  392. became an established medium which seems set to stay.
  393.       This is all very well for the history of adventure games, but
  394. what about their development?
  395.       Well, the very first were nothing more than basic programs with
  396. simple subroutines which were executed if the player typed a certain
  397. command e.g. North would move the character to a new location and hence
  398. print up a new description. Variables were used to remember if a
  399. character had performed a specific feat (e.g. Door=1, if the character
  400. had opened the door) and tests on such variables were made to see if
  401. certain actions were possible (e.g. if Door=1 then they may walk
  402. through the open doorway). The next step was to develop these games in
  403. machine code so that operations could be performed far more quickly and
  404. on a greater range of data. The use of machine code allowed designers
  405. to include graphics which greatly improved the products presentation
  406. and also added to the atmosphere. Storing graphics in memory for many
  407. location proved to be a problem, especially for smaller capacity
  408. computers such as the Spectrum and BBC, so a new way of drawing
  409. graphics was developed solely for use with these type of games. Rather
  410. than store the colour value for every pixel, which would be needed in a
  411. complex picture, the graphic could be `generated` by telling the
  412. computer where to draw lines, circles and fills. This saves vast
  413. amounts of memory, although obviously the pictures are far less
  414. detailed - but adequate for adventure games where amazing graphics or
  415. lightning speed are not necessary.
  416.       The next development was extremely important. Since all adventure
  417. programs are basically very similar in structure (i.e. print up a set
  418. location description, input the players command and then act on it) a
  419. program could be written which allowed people to create adventure games
  420. without ever having to touch BASIC, or any other language for that
  421. matter. These `adventure creating utilities` were very popular among
  422. adventurers for the obvious reason that it allowed them to write their
  423. own adventures rather than having to play pre-prepared ones. Using such
  424. utilities they could write adventures for their friends, or if they
  425. were more talented, even have their works published - a few software
  426. houses specialised in this. The author simply defined each location by
  427. describing it, told the program where the exits were, placed a few
  428. objects and, hey presto, the program did the rest. As ever, there was a
  429. complication - almost everything could be automated except for the raw
  430. and logical processing which is necessary to define an adventure, and
  431. since this is formed from the human imagination, it is not subject to
  432. `computerization`. For example, say you pull a lever on a certain wall,
  433. how is the computer supposed to know what will happen? Obviously there
  434. must be some way of letting the computer know what it should do if such
  435. an event should occur. There have been many solutions to address this
  436. problem but by far the most elegant is the ability of allowing the user
  437. to enter the actions that should be performed, if a certain condition
  438. is met. This is achieved through the use of a very powerful, but
  439. simplified command set. Thus all the user need know is a few IF type
  440. statements and all other programming needs will be met. These `pseudo
  441. languages` vary in complexity from the very simple `Condition Action`
  442. type system (if condition x is met then perform action y - e.g. if
  443. gold=1000 then print `you have won`), to the more sophisticated which
  444. allow complex parser handling. Enter, FRAC.......
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.            EVALUATION AND DOCUMENTATION OF THE PROBLEM AREA
  488.            ================================================
  489.  
  490. Now that we have studied the origins and history of adventure games, we
  491. must now look at the computer implementations in greater detail, since
  492. this will elucidate the problems with existing software and hence
  493. provide a basis for my own work in this field.
  494. Initially this piece will describe the format of modern computer
  495. adventures, progressing onto how they are created, and finally
  496. summarise the problems encountered when existing methods are used.
  497.  
  498.                THE FORMAT OF MODERN COMPUTER ADVENTURES
  499.                ----------------------------------------
  500.  
  501. Unlike most other branches of game, computer adventures are all very
  502. similar in format and could be summarised quite easily. This is perhaps
  503. why some people find them `boring` since nothing new appears to be
  504. happening - of course they are wrong, and many new ideas are conveyed
  505. in this medium. (But since I have no wish to transform this essay into
  506. a justification of such ideals, I will not argue the point, but
  507. continue). Text adventure games (as you can probably deduce from the
  508. title) are primarily concerned with text manipulation and are the
  509. closest relation to the original roleplaying games. Here, the player
  510. reads a brief description of his location and its surroundings (thus
  511. the computer plays the part of the games master), while the person
  512. types in what he wishes to do at the keyboard. (Obviously there must be
  513. guidelines to govern what is typed since, as you are no doubt aware,
  514. computers have difficulty in functioning when there are infinite
  515. possibilities - perhaps a task for `knowledge based machines`!).
  516.  
  517. The computer will then interpret what was typed through a process
  518. called parser analysis (or `word recognition`). The ability of the
  519. program to cope with this is the main criteria by which it is judged,
  520. hence a good program will allow for a vast range of inputs, so that the
  521. computer could accept almost any combination of words that the player
  522. has entered. For example, in a poorly programmed adventure game you may
  523. have to type the word `get` to pick up an object you can see, while in
  524. a well programmed game `get`,`take`,`grab`,`remove` and `pick up` might
  525. be accepted.
  526.  
  527. To make the players life a lot easier, the most common commands are
  528. usually reproduced in the manual - since the aim of the game is not to
  529. try and guess which words the programmer has decided to use to perform
  530. certain actions, but to perform these actions in a specific order
  531. necessary to solve a logical problem.
  532.  
  533. As you can see, language recognition is the primary element of any
  534. adventure program, and consequently many different systems have been
  535. developed over the years (in fact almost every software house has its
  536. own method). Thankfully they are all very similar (from the players
  537. point of view), so that it is not difficult to move between games
  538. written by different companies. To describe such a system would only be
  539. to write what has been written many times before, and hence a waste of
  540. resources. Therefore I have chosen to reproduce the instructions for
  541. one of the more popular systems - `Inglish`, to give you some idea of
  542. the guidelines that players must follow - and also make you familiar
  543. with text adventure games themselves.
  544.  
  545. [Source: Lord of the Rings adventure game - by Melbourne House]
  546. (Note: Spelling errors and mistypes have been removed).
  547.  
  548.  
  549.                (4) COMMUNICATING WITH THE COMPUTER
  550.  
  551.  
  552. The LORD OF THE RINGS program includes a very sophisticated program,
  553. INGLISH, which can understand your instructions in everyday language.
  554.  
  555. More details are given later in this booklet about the power of
  556. INGLISH, but the important thing is that you can enter your commands
  557. freely and the computer will then react according to your requests.
  558.  
  559. The computer program LORD OF THE RINGS has a very large vocabulary, so
  560. you should not have difficulty in expressing your ideas and commands.
  561. Your commands will usually take the form of actions, and at the back of
  562. this booklet you will find an abbreviated list of the actions you can
  563. carry out. The power of INGLISH together with the very large vocabulary
  564. of over 800 words makes this one of the easiest and friendliest
  565. adventure games ever published on micro-computers.
  566.  
  567. Moreover, if the computer is not sure of something that you mean, or if
  568. you are ambiguous in any way it will ask you for clarification.
  569.  
  570. The computer is also your source of information on what is happening to
  571. you, where you are and the characters around you. Some things may not
  572. be readily apparent to you, and thus can prove dangerous to the unwary
  573. player.
  574.  
  575. PERFORMING ACTIONS
  576. ------------------
  577.  
  578. INGLISH is one of the most sophisticated language-recognition programs
  579. ever developed for micro-computers. It allows you to communicate with
  580. the program in a language and structure that is familiar to you.
  581.  
  582. The rules for INGLISH are simple. The main thing to keep in mind is
  583. that each instruction must be in the form of `verb-then-noun`, where
  584. the noun (or pronoun) can also be implied.
  585.  
  586. Each sentence must have a verb.
  587. The following examples in this instruction booklet are a guide to the
  588. way INGLISH sentences can be constructed. Note however that the
  589. specific examples shown may not be valid in this adventure.
  590.  
  591. When an action does not directly concern any object, only a verb is
  592. necessary, i.e.
  593.      WAIT
  594.      RUN
  595. This is also the case if you simply wish to travel in some direction,
  596. i.e.
  597.      SOUTH
  598.      EAST
  599.  
  600. If the action concerns an object or a person, this must be identified
  601. by a noun, English grammar applies, and the order of the different
  602. parts of the sentences is usually not critical. i.e.
  603.      WEAR THE RING
  604.      GO THROUGH THE DOOR
  605.      DROP THE ROPE ONTO THE TABLE
  606.  
  607. Adjectives that describe nouns must come before the noun. If it sounds
  608. right in English, it is probably valid in INGLISH, i.e.
  609.      THROW THE HEAVY AXE AT THE HORRIBLE ORC
  610.      LIGHT THE WOODEN PIPE WITH THE MATCH
  611.  
  612. Terms used when making an instruction to the computer must be free from
  613. ambiguity. If there were two doors in a room, one red and one green,
  614. and you were to say
  615.      GO THROUGH THE DOOR
  616.  
  617. then the computer is placed in a quandary as to which door to put you
  618. through. In such situations, the program will put you through the first
  619. door it finds, which may not be the direction you intended.
  620.  
  621. In case, it would be better to specify exactly what you mean
  622.      GO THOROUGH THE GREEN DOOR
  623.  
  624. PREPOSITIONS
  625. ------------
  626. The meanings of many verbs can be altered by the use of prepositions,
  627. such as ON, OFF, ONTO and so on. Examples of INGLISH sentences using
  628. prepositions are:
  629.      ATTACK WITH THE SWORD
  630.      PICK UP THE RING
  631.  
  632. Prepositions in INGLISH usually go before the noun, but in some cases
  633. it sounds more natural to have them after the noun, such as
  634.      TURN THE LIGHT ON
  635.      PICK THE GOLD UP
  636.  
  637. Prepositions can also be used to specify the position of an object, or
  638. where you wish an action to be performed, such as
  639.      PUT THE GOLD INTO THE BAG
  640.      TAKE THE PIPE FROM THE BOX
  641.  
  642. USE OF `AND`
  643. ------------
  644.  
  645. You can use the word AND in all its normal meaning in INGLISH. This
  646. means, among other things, that you can enter more than one sentence or
  647. perform more than one action at a time.
  648.      TAKE THE LAMP AND THE MATCH FROM THE CUPBOARD
  649.      DROP THE SHORT AND THE LONG SWORDS
  650.      TAKE THE GOLD AND RUN
  651.  
  652. PUNCTUATION
  653. -----------
  654. Sentences can be separated by the use of punctuation. You can use
  655. commas and full stops as you normally would.
  656.  
  657. The only limitation the program places on your commands is that your
  658. command should not be more than 128 characters long.
  659.  
  660. CONVERSING WITH OTHER CHARACTERS
  661. --------------------------------
  662. The LORD OF THE RINGS adventure also allows you to talk and converse
  663. with the characters you meet on your journey, you may wish to speak to
  664. them. The general form is
  665.           SAY TO (name) `(sentence)`
  666.      i.e.     SAY TO GANDALF `HELLO`
  667. This is usually sufficient to draw most characters into conversation.
  668.  
  669. You can ask the characters within earshot to do specific commands that
  670. are of use to you, such as:
  671.      SAY TO TOM `KILL THE ORC WITH THE SWORD`
  672.      SAY TO PIPPIN `TAKE THE GOLD FROM THE ORC`
  673.  
  674. Of course, because all the other characters have an independence of
  675. their own, there is no guarantee that they will do what you ask them.
  676. Their decision will be based on a number of factors, including their
  677. allegiance to you, what they are currently doing, and so on.
  678.  
  679. Some characters that you encounter will have messages for you that they
  680. will deliver only when you identify yourself, or ask them certain
  681. questions.
  682.  
  683. In order to solve the LORD OF THE RINGS adventure, it will be necessary
  684. for you to become familiar with the SAY TO command. This is because
  685. some of the problems you face can only be solved by cooperation with
  686. the other members of the party. Each character also has his own
  687. limitations, such as strength and so on.
  688.  
  689. Be warned that sometimes a certain character will be required in order
  690. to succeed with a certain action. Thus it will be necessary to become
  691. familiar with the varied talents of your party members.
  692.  
  693. ABBREVIATED OF COMMANDS
  694. -----------------------
  695. The abbreviation of your commands is quite permissible. For instance,
  696. if you wish to attack a green knight, you might say:
  697.      KILL GREEN WITH SWORD
  698.  
  699. The computer will see that `Green` corresponds with the green knight.
  700. Note also that the definite article `THE` can be omitted at will. In
  701. most circumstances, the computer will understand exactly what you mean.
  702.  
  703. Unfortunately, if the Knight stood before a green door, then `green` no
  704. longer serves to identify the Knight only, in which case you could
  705. write:
  706.      KILL KNIGHT WITH SWORD
  707.  
  708. Multiple entries are easily effected simply by placing a comma between
  709. your instructions:
  710. i.e.
  711.      OPEN BOX, TAKE AXE, GIVE AXE TO SAM.
  712.  
  713. Each of the commands in the sentence will be dealt with by the computer
  714. in order.
  715.  
  716.  
  717.                     (5) THE SCREEN DISPLAY
  718.  
  719.  
  720. On your screen will appear (in normal script), the adventure
  721. description - the text which describes your surroundings, and the
  722. happenings around you. Upon entering a new location, the computer will
  723. give you a full description of the area, and the objects that are in
  724. plain sight. You will be given a list of exits that you can currently
  725. see.
  726.  
  727. The second time that you enter a location, the computer will only give
  728. you a brief description of where you are. If you wish to obtain a more
  729. complete description, you can simply enter the command LOOK, and the
  730. computer will repeat the lengthier text.
  731.  
  732. Below the adventure script, an arrow indicates your `instruction
  733. window`; the space in which you will type in the actions that you wish
  734. your characters to perform. This will appear on the screen in capital
  735. letters.
  736.  
  737. Once you have typed in your commands and hit the `RETURN/ENTER` key,
  738. the computer will either acknowledge your action, or inform you that it
  739. does not understand you for some reason. Once the computer has
  740. acknowledged any entry, it will print any new text which results from
  741. your actions, and then indicate that it is ready to receive a new
  742. instruction.
  743.  
  744. [End of reproduction].
  745.  
  746. By now you should have a good idea of what adventure gaming entails,
  747. but there is no substitute for actually playing one, or perhaps I
  748. should say, watching someone else play one - since with the following
  749. example I hope to make your knowledge complete (or at least as complete
  750. as anyone else who plays them).
  751.  
  752. The following extract does not come from a real game - yet it might
  753. have, and much can be learnt as the `player` makes his way through this
  754. fantasy adventure world. It has assumed an intelligent player and a
  755. good system of recognition.
  756.  
  757. `ESCAPE FROM DESERT ISLAND`
  758.  
  759. COMPUTER:   You are standing on a warm tropical beach. To the south the
  760. placid sea hardly ripples under the beams of the hot sun. A few yards
  761. away a large grey rock basks in the summer rays. To the west there
  762. appears to be a cave, sheltered in the rockface, while the north holds
  763. lush green vegetation.
  764.  
  765. PLAYER:     Examine rock.
  766.  
  767. COMPUTER:   It is very large and heavy and appears to have been here
  768. since the earth itself was formed. The letters `EM` are scraped into
  769. one side.
  770.  
  771. PLAYER:     EM.
  772.  
  773. COMPUTER:   Sorry, that command is not understood.
  774.  
  775. PLAYER:     West.
  776.  
  777. COMPUTER:   You stand in the shadow of a large rockface. A small river
  778. runs from the forests (which lie north) into the sea, passing in front
  779. of quite a large cave which has somehow found its way into the
  780. rockface.
  781.  
  782. PLAYER:     Examine river.
  783.  
  784. COMPUTER:   The water flows slowly over a sandy bed, broken in many
  785. places by small rocks.
  786.  
  787. PLAYER:     Examine rocks.
  788.  
  789. COMPUTER:   There`s not much to tell.
  790.  
  791. PLAYER:     Look.
  792.  
  793. COMPUTER:   You stand in the shadow of a large rockface. A small river
  794. runs from the forests (which lie north) into the sea, passing in front
  795. of quite a large cave which has somehow found its way into the
  796. rockface.
  797.  
  798. PLAYER:     Enter cave.
  799.  
  800. COMPUTER:   You are in a very dark cave which seems to tunnel its way
  801. deep into the mountains, but you could not progress further without a
  802. light. The entrance lies to the east.
  803.  
  804. PLAYER:     East.
  805.  
  806. COMPUTER:   You stand in the shadow of a large rockface. A small river
  807. runs from the forests (which lie north) into the sea, passing in front
  808. of quite a large cave which has somehow found its way into the
  809. rockface.
  810.  
  811. PLAYER:     North.
  812.  
  813. COMPUTER:   You stand amidst large tropical trees. Exits lead east and
  814. south. You can also see a mirror.
  815.  
  816. PLAYER:     Take mirror.
  817.  
  818. COMPUTER:   You take the mirror.
  819.  
  820. PLAYER:     Inventory.
  821.  
  822. COMPUTER:   You are carrying a mirror, and a walking stick.
  823.  
  824. PLAYER:     South.
  825.  
  826. COMPUTER:   You stand in the shadow of a large rockface. A small river
  827. runs from the forests (which lie north) into the sea, passing in front
  828. of quite a large cave which has somehow found its way into the
  829. rockface.
  830.  
  831. PLAYER:     Light the stick using the mirror.
  832.  
  833. COMPUTER:   The rays of the sun reflect off the mirror scorching the
  834. stick which, as a result, burns slowly away.
  835.  
  836. PLAYER:     West.
  837.  
  838. COMPUTER:   You are in the cave. You can also see a hatchet.
  839.  
  840. PLAYER:     Take hatchet.
  841.  
  842. COMPUTER:   You take the hatchet.
  843.  
  844. PLAYER:     Inventory.
  845.  
  846. COMPUTER:   You are currently carrying a mirror, a burning stick, and a
  847. hatchet.
  848.  
  849. PLAYER:     East.
  850.  
  851. COMPUTER:   The stick withers and goes out.
  852. You stand in the shadow of a large rockface. A small river runs from
  853. the forests (which lie north) into the sea, passing in front of quite a
  854. large cave which has somehow found its way into the rockface.
  855.  
  856. PLAYER:     Drop stick.
  857.  
  858. COMPUTER:   You drop the stick.
  859.  
  860. PLAYER:     North.
  861.  
  862. COMPUTER:   You stand amidst large tropical trees. Exits lead east and
  863. south.
  864.  
  865. PLAYER:     Cut tree using hatchet.
  866.  
  867. COMPUTER:   You cut down a medium sized tree and shape it into a
  868. roughly made boat.
  869.  
  870. PLAYER:     Get boat.
  871.  
  872. COMPUTER:   You take the boat.
  873.  
  874. PLAYER:     South.
  875.  
  876. COMPUTER:   You stand in the shadow of a large rockface. A small river
  877. runs from the forests (which lie north) into the sea, passing in front
  878. of quite a large cave which has somehow found its way into the
  879. rockface. You also see a withered stick.
  880.  
  881. PLAYER:     East.
  882.  
  883. COMPUTER:   You are standing on a warm tropical beach. To the south the
  884. placid sea hardly ripples under the beams of the hot sun. A few yards
  885. away a large grey rock basks in the summer rays. To the west there
  886. appears to be a cave, sheltered in the rockface, while the north holds
  887. lush green vegetation.
  888.  
  889. PLAYER:     South.
  890.  
  891. COMPUTER:   You sail south in your tree boat. Well done! You have
  892. escaped from the desert island.
  893.  
  894.  
  895. Although this adventure appears to be quite long, it is actually very
  896. simplified - containing only the most basic of game elements. The
  897. problem is straight-forward: a cave must be explored with the aid of a
  898. light (created by finding a mirror and lighting an already possessed
  899. stick) to reveal a hatchet which can be used to chop down a tree to
  900. make a boat. With this the character can escape (notice that the rock
  901. is not even used - it is common to have `red herrings` in adventure
  902. games to give the player something else to think about).
  903. If this is the first adventure problem you have encountered it may
  904. sound slightly complicated, but once you have played an adventure or
  905. two you will soon realise how simple it really is.
  906.  
  907. This completes my description of the format of text adventure games,
  908. except it should be noted that most modern ones contain a selection of
  909. graphics which are displayed as you move form one location to another
  910. (these help provide better atmosphere, as well as give a better
  911. description of your surroundings). Please note that although they
  912. contain graphics they are still classed as text adventures, since
  913. graphical adventure games are in a completely different format, and
  914. hence are not examined in this project.
  915.  
  916.  
  917.  
  918.  
  919.                  HOW ADVENTURE GAMES ARE CREATED
  920.                  -------------------------------
  921.  
  922. For this project, `how computer adventures are created` directly
  923. translates into `an examination of existing methods`, since it is my
  924. wish to create a program which will allow the user to create their own
  925. adventure games. Hence, this project would not be complete without an
  926. analysis of existing methods, and an indication of their usefulness.
  927.  
  928. The first method which springs openly to mind involves the author
  929. writing the adventure game from scratch in a high level language of
  930. their choice. Before the advent of the adventure game creator, this
  931. approach was actually ubiquitous, and only the adventurous of the
  932. adventurous deviated from its course. Obviously things have changed
  933. now, but even so a fair proportion of modern adventures are of this
  934. nature and cannot, therefore, be ignored.
  935.      Since there is no standard way of writing adventures using this
  936. technique, it is difficult for me to furnish you with an exact
  937. definition or method. Consequently I have decided to reproduce only a
  938. small sample of a larger adventure game written in BASIC, before
  939. verbally describing what this method entails and reviewing its
  940. advantages and drawbacks.
  941.  
  942. As this is part of the project report and no knowledge of programming
  943. can be assumed, I shall describe the fundamentals of the BASIC language
  944. so that the example can be followed even by a non-programmer.
  945.      BASIC (Beginner`s All-purpose Symbolic Instruction Code) was
  946. developed in the 1960`s by J.G. Kemeny at Dartmouth College in the
  947. United States. It is a general purpose (as opposed to scientific or
  948. commercial) programming language and was initially designed as an easy
  949. to learn language for students who were new to programming. The BASIC
  950. language is usually interpreted rather than compiled, although compiled
  951. versions of BASIC (such as CBASIC) are available. This means that BASIC
  952. is rather slow in terms of execution speed, but is much more
  953. user-friendly, as programs can be instantly corrected and run without
  954. the need to go through the tedious recompilation stage. This user-
  955. friendliness and ease of use is primarily why it is used to write
  956. adventures - it means the game can be tested and modified very easily
  957. and in a short space of time when compared with other methods. There
  958. now follows a description of the commands used in the listing. If you
  959. are already familiar with BASIC I suggest you skip this part and move
  960. directly to the listing.
  961.  
  962. The format of a BASIC command is as follows:
  963.  
  964.  
  965.                                   -----:-----
  966.                                   |         |
  967.                     -<LINE NUMBER>-<COMMAND>--
  968.  
  969. Syntax:
  970. A line number followed by a command, and optionally a colon followed by
  971. another command - which can be repeated any number of times until the
  972. end of the line is reached.
  973.  
  974. The line number decides the order of execution. The computer starts
  975. with the line with the lowest number and executes each sequentially
  976. until a command which alters the order of execution, or the end of the
  977. program is reached (see more about this below). The colon allows more
  978. commands to be placed on the same line, and although there is no
  979. definite limit to the amount of commands that can be represented in
  980. this way, it is a good idea to keep the program readable by not placing
  981. more than say four or five to a line.
  982.  
  983. For the computer to process effectively, it must obviously have some
  984. way of storing the numbers it uses. In BASIC, `variables` can be
  985. assigned to either numeric values or text, depending on its type. It
  986. will help if you think of algebra when trying to understand this. Any
  987. group of letters can be strung together to form a numeric variable.
  988. E.g.
  989.           The command  LET X=5           ,will set `X` to the value 5.
  990.           The command  LET GHIKQ=10      ,will set `GHIKQ` to 10.
  991.           The command  LET PLAYERLOC=1   ,will set PLAYERLOC to 1.
  992.  
  993. There are also what are known as text variables or `strings` (i.e.
  994. strings of characters). These are represented by a group of characters
  995. followed by the $ symbol (in this context called the string symbol).
  996. Strings store groups of characters (just like numeric variables store
  997. numbers), and are particularly useful for storing characters entered at
  998. the keyboard.
  999.      In BASIC it is a simple matter to receive input from the keyboard
  1000. and store it in a string - the INPUT command must be used. For example,
  1001. say we wished to store what is typed at the keyboard in A$, the command
  1002.  
  1003.           INPUT A$
  1004.  
  1005. is used.
  1006.      It is essential to be able to test for a certain condition and
  1007. then execute a set of instructions if this condition is met. This is
  1008. done by using the IF command. As this is so close to English it really
  1009. needs no further explanation, except to note that the `<>` symbol means
  1010. `does not equal`, and can be used in reference to strings as well as
  1011. numeric variables. Some examples follow:
  1012.  
  1013.           IF X=9 THEN LET Y=5
  1014.           IF X=9 THEN LET X=X+1
  1015.           IF A$="Hello" THEN LET B$="Goodbye"
  1016.           IF A$="Hello" AND X=9 THEN LET B$="Nine goodbyes"
  1017.           IF A$="Goodbye" OR Y=12 THEN LET X=Y+4
  1018.  
  1019. There are two commands which can be used to alter the sequence of
  1020. execution. These are GOSUB and GOTO. GOTO simply sends the computer
  1021. directly to the specified line number where execution will continue as
  1022. normal. E.g.
  1023.  
  1024.           GOTO 20
  1025.  
  1026. will send the computer to a new line number as with GOTO, except, the
  1027. computer remembers where to come back, and so the routine that is
  1028. called must always have the command RETURN to send it back.
  1029. E.g.
  1030.  
  1031.           10 GOSUB 1000
  1032.           20 END
  1033.           1000 RETURN
  1034.  
  1035. (Note: the END command simply ends the program(!)). In the above
  1036. example, line 1000 will be `jumped` to and executed until RETURN is
  1037. encountered. As the RETURN is on line 1000 the computer RETURN`s
  1038. immediately to the next line after the GOSUB call - i.e. line 20, where
  1039. execution continues.
  1040.  
  1041.      The only other commands that are used in the listing are PRINT and
  1042. REM. PRINT simply PRINT`s the text surrounded by quotes to the screen.
  1043. REM stands for REMARK and allows you to document your programs - this
  1044. command has no effect when executed.
  1045.  
  1046.      If there is any part of the following program you do not
  1047. understand, or if you have never used BASIC before, I suggest you type
  1048. it out and play it! It should run on most implementations of BASIC, but
  1049. be careful not to make any typing mistakes (any errors that appear will
  1050. be of this nature), and if you get into difficulties consult your
  1051. specific user manual.
  1052. In any case you should follow the program through on paper, line by
  1053. line, and note what is happening at each stage, as this will give you
  1054. an insight into how adventures are written.
  1055.  
  1056.  
  1057. THE GAME MAP FOR THE BIG CAVE ADVENTURE
  1058.  
  1059.      N                        -----
  1060.      |                        | 2 |
  1061.    W-*-E                      -----
  1062.      |                          |
  1063.      S          -----  -----  -----
  1064.                 | 4 |**| 3 |--| 1 |
  1065.                 -----  -----  -----
  1066.  
  1067. NOTES:
  1068. A bronze key is located at location two.
  1069. The gold is located at location four.
  1070. To pass west from location three to location four the key must be used.
  1071. To win the game the gold must be picked up.
  1072.  
  1073. COMMANDS RECOGNISED:
  1074. North
  1075. South
  1076. East
  1077. West
  1078. Get <Object>
  1079. Drop <Object>
  1080. Use <Object>
  1081.  
  1082.  
  1083.      1 LET KEY=2
  1084.      2 LET GOLD=4
  1085.      3 LET PLAYERLOC=1
  1086.      10 REM "The big cave adventure by Derek Whiteman"
  1087.      11 REM "Note: All input should be in upper case"
  1088.      20 GOSUB 1000
  1089.      30 INPUT A$
  1090.      40 IF A$="NORTH" AND N<>0 THEN LET PLAYERLOC=N
  1091.      50 IF A$="EAST" AND E<>0 THEN LET PLAYERLOC=E
  1092.      60 IF A$="SOUTH" AND S<>0 THEN LET PLAYERLOC=S
  1093.      70 IF A$="WEST" AND W<>0 THEN LET PLAYERLOC=W
  1094.      80 IF A$="NORTH" AND N=0 THEN PRINT "Sorry you cannot go north."
  1095.      90 IF A$="EAST" AND N=0 THEN PRINT "Sorry you cannot go east."
  1096.      100 IF A$="SOUTH" AND N=0 THEN PRINT "Sorry you cannot go south."
  1097.      110 IF A$="WEST" AND N=0 THEN PRINT "Sorry you cannot go west."
  1098.      120 GOSUB 2000
  1099.      130 GOTO 20
  1100.  
  1101.      1000 REM "Print up the location description and define the exits"
  1102.      1010 IF PLAYERLOC=1 THEN PRINT "You are standing near the entrance
  1103. of a large cave. A path leads north and you may enter the cave by going
  1104. west." : LET N=2 : LET E=0 : LET S=0 : LET W=3
  1105.      1020 IF PLAYERLOC=2 THEN PRINT "Abruptly the path ends and drops
  1106. away into nothingness. You stand on the brink of a great chasm. A path
  1107. leads south." : LET N=0 : LET E=0 : LET S=1 : LET W=0
  1108.      1030 IF PLAYERLOC=3 THEN PRINT "You stand in the big cave. There
  1109. is a door to the west while the entrance is to the east." : LET N=0 :
  1110. LET E=1 : LET S=0 : LET W=0
  1111.      1040 IF PLAYERLOC=4 THEN PRINT "You stand in the secret room. You
  1112. may go east through the swing door." : LET N=0 : LET E=3 : LET S=0 :
  1113. LET W=0
  1114.      1050 GOSUB 1500
  1115.      1060 RETURN
  1116.  
  1117.      1500 REM "Print up any objects the player can see"
  1118.      1510 IF PLAYERLOC=KEY THEN PRINT "You see a bronze key."
  1119.      1520 IF PLAYERLOC=GOLD THEN PRINT "You see the gold."
  1120.      1530 RETURN
  1121.  
  1122.      2000 REM "Do special actions"
  1123.      2010 IF A$="GET KEY" AND PLAYERLOC=KEY THEN PRINT "You take the
  1124. key." : LET KEY=254
  1125.      2020 IF A$="DROP KEY" AND KEY=254 THEN PRINT "You drop the key." :
  1126. LET KEY=PLAYERLOC
  1127.      2030 IF A$="USE KEY" AND KEY=254 AND PLAYERLOC=3 THEN PRINT "You
  1128. open the door and go through." : LET PLAYERLOC=4
  1129.      2040 IF A$="GET GOLD" AND PLAYERLOC=4 THEN PRINT "You take the
  1130. gold. Well done, you have completed the big cave adventure." : LET
  1131. GOLD=254
  1132.      2050 RETURN
  1133.  
  1134.  
  1135. Although this may appear rather complicated if you are new to
  1136. programming, the `big cave adventure` is actually very simplified and a
  1137. commercial game would have many more locations, objects and puzzles.
  1138. But from this simple example we can see the basic structure of any
  1139. adventure program. That is:
  1140.  
  1141.      1. Initialise all game variables (set them to their start value).
  1142.      2. Print up the current location description.
  1143.      3. Input players wishes from the keyboard.
  1144.      4. If the player has entered a valid exit, move him to the new    
  1145.            location.
  1146.      5. Check input for a special event (such as opening a door) and   
  1147.         act upon it.
  1148.      6. Go to step 2.
  1149.  
  1150. There are several advantages if you write your adventure in a high
  1151. level language like BASIC. The most obvious is that you have complete
  1152. control over the input and output resources, and can therefore define
  1153. your game pretty much without restriction. Also most modern versions of
  1154. BASIC allow for good file handling, music and even graphics, so that
  1155. presentation will certainly not be an obstacle. But if you do decide to
  1156. write your adventures from scratch in a high level language, there are
  1157. numerous problems you would need to confront before your initial idea
  1158. can be rendered. The first and most obvious is that you need to be able
  1159. to program to at least a fair standard, even before work commences.
  1160. This means a complete novice would need to master a programming
  1161. language, and even then the quality of the game would be directly
  1162. dependant on his programming skill, and not upon his imaginative powers
  1163. - which it should be.
  1164.      Another problem is that although experience would be gained
  1165. through the course of writing the adventure, all the programming is
  1166. `adventure specific` and hence not transferable. This means you would
  1167. have to start completely from scratch for each adventure you decided to
  1168. write using this method. Of course this problem can be lessened by
  1169. making your programs more standardised, for example, by calling object
  1170. one, `object1` as opposed to `key` - but this highlights yet another
  1171. problem: readability. Programs written this way without sufficient
  1172. documentation tend to be difficult to read and modify, even for the
  1173. author. It should now be clear that writing an adventure using this
  1174. method is not exactly the ideal solution, and so others must be
  1175. examined.
  1176.  
  1177. The next method of creating your own adventure that shall be examined
  1178. involves using a pre-prepared utility program. This allows you to write
  1179. your game without ever having to learn any sort of language, and of
  1180. course most of the work would have already been done for you. I have
  1181. seen many different systems of `game creator`, but rather than
  1182. highlight each individual case I will present an example of what I
  1183. personally consider to be the `average` in this field.
  1184.      The first thing I should note is that this program was designed to
  1185. be completely self-contained, allowing you to create your game from its
  1186. own environment and then save your results as a separate executionable
  1187. program - which could load independently of the main utility. This
  1188. allowed people to create a free-standing product which could be
  1189. marketed for profit if they so wished, and none of this profit would go
  1190. to the original utility programmers. This of course fired peoples
  1191. imaginations with notions of fame and fortune, and many such games
  1192. appeared on the market - usually in the `budget` price range, but
  1193. standards varied widely from game to game, ranging from the excellent
  1194. and well conceived to the inferior.
  1195.      To use these utility programs no programming knowledge was
  1196. required; the user simply defined the verbs he wished to use in his
  1197. adventure (e.g. north, east, take, say) and then the nouns (e.g. wall,
  1198. curtain, floor, and door). Some of the more advanced ones even allowed
  1199. you to define pronouns or adverbs, while almost all allowed you to
  1200. define, place and manipulate objects (e.g. keys, sticks, rings, bags
  1201. and lamps). To represent each location the program draws a grid of
  1202. octagonal shapes so that each is connected in eight places (I believe
  1203. this was chosen to make it easy to implement the directions of North,
  1204. North-East, East, South-East, South, South-West, West, and North-West).
  1205.  
  1206.                                 E.g. You might define the exits as:
  1207.                   --    --
  1208.                  /  \  /  \                     North
  1209.                -- 01 -- 02 --         North-West -- North-East
  1210.               /  \  /  \  /  \                  /  \
  1211.              | 03 || 04 || 05 |           West | 04 | East
  1212.               \  /  \  /  \  /                  \  /
  1213.                -- 06 -- 07 --         South-West -- South-East
  1214.                  \  /  \  /                     South
  1215.                   --    --
  1216.  
  1217. The program then allowed you to move a cursor to point to one of the
  1218. exits (represented by a corner of the octagon), and then select which
  1219. verb would move you through to the location on the other side.
  1220.      To provide the `raw processing elements` of your adventure, you
  1221. simply selected an action from the menu, such as verb <noun> or verb
  1222. <object> and this action was then made specific for that location. For
  1223. example, if there was a verb called drop and an object called rope, you
  1224. could define the condition
  1225.  
  1226.              ACTION                               CONSEQUENCE
  1227.  
  1228.           verb <object>                    The rope is moved to the
  1229.           DROP   ROPE                      players current location.
  1230.  
  1231. for any specific location. So now if the player typed drop rope at this
  1232. location, the `consequence` of that action would be recognised and
  1233. invoked (in this case the rope would be dropped).
  1234.      As the computer could not possibly know what the consequences
  1235. should be if a certain action is inaugurated, the user had to define
  1236. these in another menu, where he selected from things like: move
  1237. object/player to a location, print some text to the screen, pick up an
  1238. object, put down an object, and display the player`s inventory.
  1239.      You may not yet have realised it, but there is a serious drawback
  1240. with this system. If you wished to be able to pick up an object at any
  1241. location in the game, you would have to set two conditions at every
  1242. single location, and do this for every single object you invented.
  1243. This, as you are no doubt aware, would be a monumental task, and a task
  1244. which could be accomplished far more easily by using other methods.
  1245. Another problem is that these programs tend to be rather restrictive,
  1246. with many things the user simply cannot achieve through the use of this
  1247. software alone. To take an extreme example, say you wished to make a
  1248. two player adventure game - or let the player control more than one
  1249. character during the game. No provision has been made for this and so
  1250. it would be impossible to accomplish using this utility.
  1251.      But despite all its problems, the adventure creating utilities do
  1252. allow you to begin your adventure almost immediately with no
  1253. programming knowledge what so ever, and then progress quickly and
  1254. easily using a simple menu system. I feel these advantages are
  1255. superlative for the beginner, but an experienced adventure writer would
  1256. find the system too restrictive and therefore unusable.
  1257.  
  1258. Besides using a self contained adventure creating utility, there exists
  1259. another method which could be considered the complete opposite. Whereas
  1260. with an adventure creator all the programming has been completed for
  1261. you, using the method I shall now describe requires you to define your
  1262. adventure through programming alone.
  1263.      Over the last few years I have witnessed the publication of
  1264. several `adventure definition` languages. These are similar in
  1265. structure to high level languages such as PASCAL or BASIC, but just as
  1266. any language has its specific uses (e.g. COBOL - business applications,
  1267. FORTRAN - mathematical), adventure definition languages are totally
  1268. geared towards the programming requirements of an adventure game. As a
  1269. consequence it should be easier for a programmer to write an adventure
  1270. - taking full advantage of the features, to produce a much more
  1271. powerful package than it would otherwise be. I say `should be` because
  1272. in my experience it is just as, if not more difficult, to create an
  1273. adventure this way primarily because the languages are nowhere near as
  1274. friendly as, say, BASIC can be.
  1275.      Although I would rule this method out to anyone who has not had at
  1276. least one years experience with another language, for the more
  1277. experienced programmer (or the very fast learner) these adventure
  1278. definition languages can be very useful, and allow the user to write
  1279. their game free of the restrictions imposed by the adventure creating
  1280. utilities discussed above. Merely out of interest, and to give you some
  1281. idea of the structure of these languages, I have provided a sample
  1282. below - although no attempt will be made to explain it since it is not
  1283. related in any great way to my own intensions.
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297. ; This is the object-oriented runtime package
  1298. ; by David Betz
  1299. ; July 19, 1986
  1300.  
  1301. ; ********************
  1302. ; PROPERTY DEFINITIONS
  1303. ; ********************
  1304.  
  1305. ; These properties will be used for connections between locations
  1306. (property
  1307.   north               ; the location to the north
  1308.   south               ; the location to the south
  1309.   east               ; the location to the east
  1310.   west               ; the location to the west
  1311.   up                    ; the location above
  1312.   down)               ; the location below
  1313.  
  1314. ; Basic object properties
  1315. (property
  1316.   initial-location     ; the initial location of a "thing"
  1317.   description          ; the "long" description of a location
  1318.   short-description)     ; the "short" description of a location
  1319.  
  1320. ; Connection properties
  1321. (property
  1322.   parent          ; the parent of an object
  1323.   sibling          ; the next sibling of an object
  1324.   child)          ; the first child of an object
  1325.  
  1326. ; Location properties
  1327. (property
  1328.   visited)          ; true if location has been visited by player
  1329.  
  1330. ; Portal properties
  1331. (property
  1332.   closed          ; true if the portal is closed
  1333.   locked          ; true if the portal is locked
  1334.   key               ; key to unlock the portal
  1335.   other-side)          ; the other portal in a pair
  1336.  
  1337. ; **********************
  1338. ; VOCABULARY DEFINITIONS
  1339. ; **********************
  1340.  
  1341. ; Some abbreviations for common commands
  1342. (synonym north n)
  1343. (synonym south s)
  1344. (synonym east e)
  1345. (synonym west w)
  1346. (synonym inventory i)
  1347.  
  1348. ; Define the basic vocabulary
  1349. (conjunction and)
  1350. (article the that)
  1351.  
  1352. ; ********************
  1353. ; VARIABLE DEFINITIONS
  1354. ; ********************
  1355.  
  1356. (variable
  1357.   curloc          ; the location of the player character
  1358.   %actor          ; the actor object
  1359.   %dobject          ; the direct object
  1360.   %iobject)          ; the indirect object
  1361.  
  1362. ; *********************
  1363. ; CONNECTION PRIMITIVES
  1364. ; *********************
  1365.  
  1366. ; Connect an object to a parent
  1367. (define (connect p c)
  1368.   (setp c parent p)
  1369.   (setp c sibling (getp p child))
  1370.   (setp p child c))
  1371.  
  1372. ; Connect all objects to their initial parents
  1373. (define (connect-all &aux obj maxp1 par)
  1374.   (setq obj 1)
  1375.   (setq maxp1 (+ $ocount 1))
  1376.   (while (< obj maxp1)
  1377.     (if (setq par (getp obj initial-location))
  1378.       (connect par obj))
  1379.     (setq obj (+ obj 1))))
  1380.  
  1381. ; Disconnect an object from its current parent
  1382. (define (disconnect obj &aux this prev)
  1383.   (setq this (getp (getp obj parent) child))
  1384.   (setq prev nil)
  1385.   (while this
  1386.     (if (= this obj)
  1387.       (progn
  1388.      (if prev
  1389.        (setp prev sibling (getp this sibling))
  1390.        (setp (getp this parent) child (getp this sibling)))
  1391.      (setp this parent nil)
  1392.      (return)))
  1393.     (setq prev this)
  1394.     (setq this (getp this sibling))))
  1395.  
  1396. ; Print the contents of an object (used by "look")
  1397. (define (print-contents obj prop &aux desc)
  1398.   (setq obj (getp obj child))
  1399.   (while obj
  1400.     (if (setq desc (getp obj prop))
  1401.       (progn
  1402.      (print " ")
  1403.      (print desc)))
  1404.     (setq obj (getp obj sibling))))
  1405.  
  1406. ; List the contents of an object (used for "inventory")
  1407. (define (list-contents obj prop &aux desc)
  1408.   (setq obj (getp obj child))
  1409.   (while obj
  1410.     (if (setq desc (getp obj prop))
  1411.       (progn
  1412.      (print "\t")
  1413.      (print desc)
  1414.      (terpri)))
  1415.     (setq obj (getp obj sibling))))
  1416.  
  1417. ; ************************
  1418. ; OBJECT CLASS DEFINITIONS
  1419. ; ************************
  1420.  
  1421. ; ***********************
  1422. ; The "basic-thing" class
  1423. ; ***********************
  1424.  
  1425. (object basic-thing
  1426.   (property
  1427.     parent nil          ; the parent of this object
  1428.     sibling nil))     ; the next sibling of this object
  1429.  
  1430. ; ***************************
  1431. ; The "location" object class
  1432. ; ***************************
  1433.  
  1434. (object location
  1435.   (property
  1436.     child nil          ; the first object in this location
  1437.     visited nil)     ; has the player been here yet?
  1438.   (method (knock? obj)
  1439.     T)
  1440.   (method (enter obj)
  1441.     (connect self obj)
  1442.     T)
  1443.   (method (leave obj dir &aux loc)
  1444.     (if (setq loc (getp self dir))
  1445.       (if (send loc knock? obj)
  1446.         (progn
  1447.           (disconnect obj)
  1448.           (send loc enter obj)))
  1449.       (progn
  1450.         (print "There is no exit in that direction.\n")
  1451.         nil)))
  1452.   (method (describe)
  1453.     (if (getp self visited)
  1454.       (print (getp self short-description))
  1455.       (progn
  1456.         (print (getp self description))
  1457.         (print-contents self description)
  1458.         (setp self visited t)))
  1459.     (terpri)))
  1460.  
  1461.  
  1462. ; ******************
  1463. ; The "portal" class
  1464. ; ******************
  1465.  
  1466. (basic-thing portal
  1467.   (method (knock? obj)
  1468.     (if (getp self closed)
  1469.       (progn
  1470.         (print "The ")
  1471.         (print (getp self short-description))
  1472.         (print " is closed!\n")
  1473.         nil)
  1474.       T))
  1475.   (method (enter obj)
  1476.     (connect (getp (getp self other-side) parent) obj))
  1477.   (method (open)
  1478.     (if (not (getp self closed))
  1479.       (progn
  1480.         (print "The ")
  1481.         (print (getp self short-description))
  1482.         (print " is already open!\n")
  1483.         nil)
  1484.       (if (getp self locked)
  1485.         (progn
  1486.           (print "The ")
  1487.           (print (getp self short-description))
  1488.           (print " is locked!\n")
  1489.           nil)
  1490.         (progn
  1491.           (setp self closed nil)
  1492.           T))))
  1493.   (method (close)
  1494.     (if (getp self closed)
  1495.       (progn
  1496.         (print "The ")
  1497.         (print (getp self short-description))
  1498.         (print " is already closed!\n")
  1499.         nil)
  1500.       (progn
  1501.         (setp self closed T)
  1502.         T)))
  1503.   (method (lock thekey)
  1504.     (if (not (getp self closed))
  1505.       (progn
  1506.         (print "The ")
  1507.         (print (getp self short-description))
  1508.         (print " is not closed!\n")
  1509.         nil)
  1510.       (if (getp self locked)
  1511.         (progn
  1512.           (print "The ")
  1513.           (print (getp self short-description))
  1514.           (print " is already locked!\n")
  1515.           nil)
  1516.         (if (not (= thekey (getp self key)))
  1517.           (progn
  1518.             (print "It doesn't fit the lock!\n")
  1519.             nil)
  1520.           (progn
  1521.             (setp self locked t)
  1522.             T)))))
  1523.   (method (unlock thekey)
  1524.     (if (not (getp self closed))
  1525.       (progn
  1526.         (print "The ")
  1527.         (print (getp self short-description))
  1528.         (print " is already open!\n")
  1529.         nil)
  1530.       (if (not (getp self locked))
  1531.         (progn
  1532.           (print "The ")
  1533.           (print (getp self short-description))
  1534.           (print " is not locked!\n")
  1535.            nil)
  1536.         (if (not (= thekey (getp self key)))
  1537.           (progn
  1538.             (print "It doesn't fit the lock!\n")
  1539.             nil)
  1540.           (progn
  1541.             (setp self locked nil)
  1542.             T))))))
  1543.  
  1544. ; *****************
  1545. ; The "actor" class
  1546. ; *****************
  1547.  
  1548. (basic-thing actor
  1549.   (property
  1550.     child nil)          ; the first "thing" carried by this actor
  1551.   (method (move dir)
  1552.     (send (getp self parent) leave self dir))
  1553.   (method (take obj)
  1554.     (disconnect obj)
  1555.     (connect self obj))
  1556.   (method (drop obj)
  1557.     (disconnect obj)
  1558.     (connect (getp self parent) obj))
  1559.   (method (carrying? obj)
  1560.     (= (getp obj parent) self))
  1561.   (method (inventory)
  1562.     (cond ((getp %actor child)
  1563.            (print "You are carrying:\n")
  1564.            (list-contents %actor short-description))
  1565.           (T (print "You are empty-handed.\n")))))
  1566.  
  1567. ; *****************
  1568. ; The "thing" class (things that can be taken)
  1569. ; *****************
  1570.  
  1571. (basic-thing thing
  1572.   (class-property
  1573.     takeable t))
  1574.  
  1575. ; ****************************
  1576. ; The "stationary-thing" class (things that can't be moved)
  1577. ; ****************************
  1578.  
  1579. (basic-thing stationary-thing)
  1580.  
  1581. ; ***********************
  1582. ; MISCELLANEOUS FUNCTIONS
  1583. ; ***********************
  1584.  
  1585. ; Complain about a noun phrase
  1586. (define (complain head n tail)
  1587.   (print head)
  1588.   (print-noun n)
  1589.   (print tail)
  1590.   (abort))
  1591.  
  1592. ; Find an object in a location
  1593. (define (findobject loc n &aux this found)
  1594.   (setq this (getp loc child))
  1595.   (setq found nil)
  1596.   (while this
  1597.     (if (match this n)
  1598.       (if found
  1599.         (complain "I don't know which " n " you mean!\n")
  1600.      (setq found this)))
  1601.     (setq this (getp this sibling)))
  1602.   found)
  1603.  
  1604. ; Find an object in the player's current location
  1605. ;  (or in the player's inventory)
  1606. (define (in-location n &aux obj)
  1607.   (if (or (setq obj (findobject curloc n))
  1608.           (setq obj (findobject %actor n)))
  1609.     obj
  1610.     (complain "I don't see a " n " here!\n")))
  1611.  
  1612. ; Find an object in the player's inventory
  1613. ;  (or in the player's current location)
  1614. (define (in-pocket n &aux obj)
  1615.   (if (or (setq obj (findobject %actor n))
  1616.           (setq obj (findobject curloc n)))
  1617.     obj
  1618.     (complain "You don't have a " n "!\n")))
  1619.  
  1620.  
  1621.                          DESIRED OUTCOME
  1622.                          ===============
  1623.  
  1624. Of all the methods discussed while evaluating the problem I feel none
  1625. are completely satisfactory, and so I must endeavour to find a new
  1626. method which proves more so. I believe the ideal solution would combine
  1627. the ease of use and user friendliness of the purpose built editor, with
  1628. the power and unrestrictiveness of a dedicated language. To do this I
  1629. feel a direct fusion of the two classes is necessary before all of the
  1630. requirements are met.
  1631.      I therefore propose a program which has a simple to use editor, so
  1632. that the user can begin to write an adventure almost immediately (since
  1633. most of the work would have already been done), but also have a simple
  1634. to learn but powerful language modelled on the popular BASIC system,
  1635. and with all of the commands specific to adventure writing. This
  1636. amalgamation of all of the methods should produce a unique adventure
  1637. game creation utility which surpasses all methods currently in
  1638. existence.
  1639.      Therefore the desired outcome of this project is to create a
  1640. program which allows the user to define things related to all
  1641. adventures (such as location descriptions, verbs, nouns, objects and
  1642. characters), by use of a simple menu-driven editor, and then define
  1643. special events through the use of a BASIC style adventure language. The
  1644. user should be able to test the game at any time without having to
  1645. leave the utility, but also have the option of a break function in case
  1646. the adventure program they have written gets stuck in an endless loop.
  1647. Once created the game should then be saved in one of two formats: a
  1648. data file which can be loaded back into the editor and modified at
  1649. anytime, and also a special game file which cannot be loaded back into
  1650. the editor for modification. Since only a small part of the main editor
  1651. program is needed to `run` the adventure, a separate run-time control
  1652. program will be created to allow people to run their adventures
  1653. external to the editor.
  1654.      Also since knowledge of DOS commands cannot be assumed, I will
  1655. create a program which formats disks ready for data files, and then a
  1656. program which will install an auto-booting adventure game disk, so that
  1657. users are able to create a free-standing product. Here is an input /
  1658. output diagram for the adventure utility (which I have decided to name
  1659. FRAC to represent the words Fantasy Roleplaying Adventure Creator),
  1660. given here as a summary.
  1661.  
  1662.  
  1663.  
  1664.  
  1665.  
  1666.  
  1667.  
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673.  
  1674.  
  1675. THE FRAC SYSTEM
  1676.                      INPUT  PROCESSING  OUTPUT
  1677.                -----        -----------        -----
  1678.                |   |--->----|         |--->----|   |
  1679.                |   |        |         |        |   |
  1680.                -----        |         |        -----
  1681.  Previously saved data file |         | Saving a new data file to disk
  1682.                -----        |         |        -----
  1683.                |   |--->----|  FRAC   |--->----|   |
  1684.                |   |        |         |        |   |
  1685.                -----        |         |        -----
  1686.    Input from the keyboard  |         | Saving a new game file to disk
  1687.                             |         |        -----
  1688.                             |         |--->----|   |
  1689.                             |         |        |   |
  1690.                             |         |        -----
  1691.                             -----------  Results displayed on screen
  1692.  
  1693.  
  1694.                      INPUT  PROCESSING  OUTPUT
  1695.                -----        -----------        -----
  1696.                |   |--->----|         |--->----|   |
  1697.                |   |        |         |        |   |
  1698.                -----        |  FRAC   |        -----
  1699.  Previously saved game file |run-time | Results displayed on screen
  1700.                -----        | control |
  1701.                |   |--->----| program |
  1702.                |   |        |         |
  1703.                -----        |         |
  1704.    Input from the keyboard  |         |
  1705.                             |         |
  1706.                             -----------
  1707.  
  1708.  
  1709. To create an adventure, three disks would be needed:
  1710.  
  1711.                --------       --------       --------
  1712.                |      |       | FRAC |       | FRAC |
  1713.                | FRAC |       | DATA |       | GAME |
  1714.                |      |       | DISK |       | DISK |
  1715.                --------       --------       --------
  1716.  
  1717. FRAC:
  1718.      The FRAC boot disk is used to load the utility.
  1719.  
  1720. FRAC DATA DISK:
  1721.      A FRAC data disk is used to save your data files on - (remember a
  1722. data file is basically an unfinished adventure).
  1723.  
  1724. FRAC GAME DISK:
  1725.      Once your adventure is complete, a game disk is needed to store
  1726. the finished product. This would auto boot into the game once finished.
  1727.  
  1728.  
  1729.                               USER MANUAL
  1730.                               ===========
  1731.  
  1732. To understand the material presented here, you should have knowledge of
  1733. adventure games, realise that this is an adventure game creator, and
  1734. know what this means. This information is given in the previous
  1735. section, and if you have any doubts I would urge you to read it before
  1736. continuing further.
  1737.  
  1738. FRAC
  1739. ----
  1740.      FRAC stands for Fantasy Roleplaying Adventure Creator and is a
  1741. utility for the Commodore Amiga home computer. It is a completely self
  1742. contained adventure creating system, which can be used by a person with
  1743. no programming experience to create their own text adventure games, and
  1744. if appropriate, market them for profit.
  1745.      Although it is stated that a person with no programming experience
  1746. could use it, they must come to terms with FRAC`s own programming
  1747. language called FRACTOL (Fantasy Roleplaying Adventure CreaTors
  1748. Operating Language). This language is very close to BASIC, but unlike
  1749. BASIC provides many special commands specifically for use with creating
  1750. text adventures. As this language is fully documented it should be
  1751. simple even for a complete beginner to progress unhindered by
  1752. technicalities.
  1753.  
  1754. LOADING FRAC
  1755. ------------
  1756.      The main and associated programs of FRAC come on one auto-booting
  1757. disk. To load FRAC simply switch on your computer and insert this disk
  1758. into drive df0: (i.e. the internal drive). The disk will then be
  1759. accessed for about thirty seconds, after which time you will be
  1760. presented with the following menu:
  1761.  
  1762.                          *** FRAC BOOT MENU ***
  1763.  
  1764. 1. LOAD THE FRAC DEVELOPMENT SYSTEM
  1765. 2. CREATE A FRAC DATA DISK
  1766. 3. INSTALL AN ADVENTURE DISK
  1767. 4. RESET
  1768.  
  1769.  
  1770. SELECT:
  1771.  
  1772. To make your selection you may press the respective function key of the
  1773. choice you wish to make (e.g. if you wanted to select number three -
  1774. INSTALL AN ADVENTURE DISK, you would press F3 or alternatively you
  1775. could type `3` and then press return). Each of the functions are
  1776. described below.
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783. 1. LOAD THE FRAC DEVELOPMENT SYSTEM
  1784.    --------------------------------
  1785.           This, when selected, will take you to FRAC`s main editing
  1786. system. From here you may create, save or load adventures. As the rest
  1787. of this manual is dedicated to explaining this program, I feel no need
  1788. to expand upon this description.
  1789.  
  1790. 2. CREATE A FRAC DATA DISK
  1791.    -----------------------
  1792.           For this function you will require a disk which has not yet
  1793. been formatted, or one on which you no longer require the data. Once
  1794. selected this function will ask you to insert a disk and then format it
  1795. ready for use. The newly formatted disk will then be empty and
  1796. consequently can be used to save FRAC data files. Simply follow the on-
  1797. screen prompts and requests to successfully complete this operation.
  1798.  
  1799. 3. INSTALL AN ADVENTURE DISK
  1800.    -------------------------
  1801.           This function is slightly more complicated. It requires you
  1802. to have previously saved an adventure file (as opposed to a data file)
  1803. using FRAC. Firstly the program copies all the files it will need into
  1804. memory. It will then ask you to insert the disk which contains one or
  1805. more adventure files, and then copy these to memory. Finally it will
  1806. ask you to insert a blank disk which it will proceed to format,
  1807. initialise and make into an auto-booting adventure game disk for you.
  1808. Once the operation is complete you will be told to reset. You may now
  1809. boot new disk which will now load directly into your adventure (note:
  1810. if there is more than one adventure file on disk a menu will appear to
  1811. allow the player to select which game they wish to load).
  1812.  
  1813. 4. RESET
  1814.    -----
  1815.           This function clears the reset vectors (thereby killing any
  1816. virii which might be lying dormant in memory) and then resets the
  1817. computer.
  1818.  
  1819.  
  1820.                            THE EDITOR
  1821.                            ----------
  1822.  
  1823. The FRAC EDITOR allows you to create the main gaming components of your
  1824. adventure quickly and easily. I have tried to make it as user-friendly
  1825. as possible and as far as I can tell it is completely `uncrashable`.
  1826. Before I go into any great detail about each menu option, I would like
  1827. you to follow a short tutorial which will create the example adventure
  1828. `Escape from desert island`, described in the evaluation. I have
  1829. started off with this (even though the user has no knowledge of FRAC or
  1830. its functions), because it is much easier to read a manual for a
  1831. utility which you have already seen, and can therefore identify with.
  1832. It also makes the potential user familiar with some of the more common
  1833. functions, and could also serve as an example once they have mastered
  1834. the basic techniques of adventure writing.
  1835.  
  1836.  
  1837. `ESCAPE FROM DESERT ISLAND` Tutorial
  1838. ------------------------------------
  1839.  
  1840. At the start of this tutorial you should be looking at the main menu,
  1841. and the memory counter at the top left of the screen should read 80000.
  1842. If it does not, select option 9 - `clear memory` by pressing F9 and
  1843. then at the prompt `Are you sure you want to clear all of the memory?`,
  1844. type `y` and press return. Whenever you are asked to type something,
  1845. always press return once you have finished. If you make a mistake which
  1846. you cannot see how to correct, it is best to start again by clearing
  1847. the memory using the method described above.
  1848.  
  1849. Select the Location Menu by pressing F1.
  1850. Select Create Description by pressing F1.
  1851. Type 1 at the prompt `Please Enter Location Number:`.
  1852. At the prompt `Please Enter Description For Location 1:` type the
  1853. following:
  1854.  
  1855. You are standing on a warm tropical beach. To the south the placid sea
  1856. hardly ripples under the beams of the hot sun. A few yards away a large
  1857. grey rock basks in the summer rays. To the west there appears to be a
  1858. cave, sheltered in the rockface, while
  1859.  
  1860. You will notice that the sentence in not complete. This is because FRAC
  1861. can only accept 254 characters for input at a time (approximately four
  1862. lines). We must therefore use a function I developed to get around this
  1863. problem.
  1864.  
  1865. Select F4 - Add To Description.
  1866. Type 1 at the prompt `Please Enter Location:`.
  1867.  
  1868. You will see the description you typed above being displayed, but you
  1869. can continue typing for another four lines. So now type:
  1870.  
  1871. the north holds lush green vegetation.
  1872.  
  1873. Select Create Description by pressing F1.
  1874. Type 2 at the prompt `Please Enter Location Number:`.
  1875. At the prompt `Please Enter Description For Location 2:` type the
  1876. following:
  1877.  
  1878. You stand in the shadow of a large rockface. A small river runs from
  1879. the forests (which lie north) into the sea, passing in front of quite a
  1880. large cave which has somehow found its way into the rockface.
  1881.  
  1882. Select Create Description by pressing F1.
  1883. Type 3 at the prompt `Please Enter Location Number:`.
  1884. At the prompt `Please Enter Description For Location 3:` type the
  1885. following:
  1886.  
  1887. You are in a very dark cave which seems to tunnel its way deep into the
  1888. mountains, but you could not progress further without a light. The
  1889. entrance lies to the east.
  1890.  
  1891. Select Create Description by pressing F1.
  1892. Type 4 at the prompt `Please Enter Location Number:`.
  1893. At the prompt `Please Enter Description For Location 4:` type the
  1894. following:
  1895.  
  1896. You stand amidst large tropical trees. Exits lead east and south.
  1897.  
  1898. Select Create Description by pressing F1.
  1899. Type 5 at the prompt `Please Enter Location Number:`.
  1900. At the prompt `Please Enter Description For Location 5:` type the
  1901. following:
  1902.  
  1903. You stand amidst large tropical trees. Exits lead west and south.
  1904.  
  1905. Type E to return to the Main Menu.
  1906. Press F8 to select Options.
  1907. Press F3 to switch Visible Exit Reporting off.
  1908. Type E to return to the Main Menu.
  1909. Press F2 to select the Verb Menu.
  1910.  
  1911. To create a verb use this procedure:
  1912.  
  1913. -----------------------------------------------------------------------
  1914. | Press F1 to Create Verb.                                            |
  1915. | Press return at the prompt `Please Enter Verb Number:` - FRAC will  |
  1916. | then automatically select the next free verb.                       |
  1917. | Type in the verb at the prompt.                                     |
  1918. -----------------------------------------------------------------------
  1919.  
  1920. Use this procedure to create the following verbs:
  1921.  
  1922. NORTH.N     (The full stop symbol allows you to have synonyms)
  1923. EAST.E
  1924. SOUTH.S
  1925. WEST.W
  1926. LOOK.L
  1927. ENTER
  1928. TAKE.GET
  1929. DROP
  1930. INVENTORY.I
  1931. EXAMINE.EXAM
  1932. LIGHT
  1933. CUT
  1934.  
  1935. Type E to return to the Main Menu.
  1936. Press F1 to select Location Menu.
  1937. Press F8 to select Exit Menu.
  1938. Press F4 to select Auto Exits.
  1939. Now type: 1
  1940.           north
  1941.           south
  1942.           2
  1943.           east
  1944.           west
  1945. Then type 0 to quit.
  1946.  
  1947. Press F1 to Create Exits.
  1948. Type 1 for Location Number.
  1949. Type 1 for Exit Number You Wish To Edit.
  1950. Type west at the Please Enter Verb prompt.
  1951. Type 2 for jump location.
  1952.  
  1953. Press F1 to Create Exits.
  1954. Type 2 for Location Number.
  1955. Type 2 for Exit Number You Wish To Edit.
  1956. Type west at the Please Enter Verb prompt.
  1957. Type 3 for jump location.
  1958.  
  1959. Press F1 to Create Exits.
  1960. Type 2 for Location Number.
  1961. Type 3 for Exit Number You Wish To Edit.
  1962. Type north at the Please Enter Verb prompt.
  1963. Type 4 for jump location.
  1964.  
  1965. Press F1 to Create Exits.
  1966. Type 1 for Location Number.
  1967. Type 4 for Exit Number You Wish To Edit.
  1968. Type enter at the Please Enter Verb prompt.
  1969. Type 3 for jump location.
  1970.  
  1971. Press F1 to Create Exits.
  1972. Type 4 for Location Number.
  1973. Type 2 for Exit Number You Wish To Edit.
  1974. Type east at the Please Enter Verb prompt.
  1975. Type 5 for jump location.
  1976.  
  1977. Press F1 to Create Exits.
  1978. Type 5 for Location Number.
  1979. Type 2 for Exit Number You Wish To Edit.
  1980. Type south at the Please Enter Verb prompt.
  1981. Type 1 for jump location.
  1982.  
  1983. Type E to return to the Location Menu.
  1984. Type E to return to the Main Menu.
  1985.  
  1986. Press F3 for the Word Menu.
  1987. Press F1 to create a word.
  1988. Type 1 for word number.
  1989. Type rock at the Please Enter Word prompt.
  1990.  
  1991. Press F1 to create a word.
  1992. Type 2 for word number.
  1993. Type river.water at the Please Enter Word prompt.
  1994.  
  1995. Press F1 to create a word.
  1996. Type 3 for word number.
  1997. Type tree.trees at the Please Enter Word prompt.
  1998.  
  1999. Press F4 for Object Menu.
  2000. Press F1 to create an object.
  2001. Type 1 for object number.
  2002. Type mirror for object name.
  2003. Type 4 for start location.
  2004. Press return eight times (once for each definition) to return to the
  2005. object menu.
  2006.  
  2007. Press F1 to create an object.
  2008. Type 2 for object number.
  2009. Type walking stick.walking for object name.
  2010. Type 254 for start location.
  2011. Press return eight times (once for each definition) to return to the
  2012. object menu.
  2013.  
  2014. Press F1 to create an object.
  2015. Type 3 for object number.
  2016. Type burning stick.burning for object name.
  2017. Type 0 for start location.
  2018. Press return eight times (once for each definition) to return to the
  2019. object menu.
  2020.  
  2021. Press F1 to create an object.
  2022. Type 4 for object number.
  2023. Type hatchet for object name.
  2024. Type 0 for start location.
  2025. Press return eight times (once for each definition) to return to the
  2026. object menu.
  2027.  
  2028. Press F1 to create an object.
  2029. Type 5 for object number.
  2030. Type charred stump.stump for object name.
  2031. Type 0 for start location.
  2032. Press return eight times (once for each definition) to return to the
  2033. object menu.
  2034.  
  2035. Press F1 to create an object.
  2036. Type 5 for object number.
  2037. Type boat for object name.
  2038. Type 0 for start location.
  2039. Press return eight times (once for each definition) to return to the
  2040. object menu.
  2041.  
  2042. Type E to return to the Main Menu.
  2043. Press F10 to Enter FRACTOL.
  2044. Press the TAB key to hold the display.
  2045. Type p1 to point to procedure 1.
  2046. Now type the following lines - pressing return after each.
  2047.  
  2048. 10 IF (IN(1)=VERB(10) AND IN(2)=WORD(1)) THEN PRINT "It is very large
  2049. and heavy and appears to have been here since the Earth itself was
  2050. formed. The letters `EM` are scraped into the side."
  2051.  
  2052.  
  2053. 20 IF (IN(1)=VERB(7) AND IN(2)=WORD(1)) THEN PRINT "You`re joking
  2054. right? If Newtons first law states that every object continues at rest
  2055. or with uniform velocity unless acted upon by a resultant force, my
  2056. first law is Physics students can`t lift rocks."
  2057.  
  2058. 30 IF (IN(1)=VERB(3) AND OBJLOC(6)=254) THEN PRINT "You sail south in
  2059. your tree boat. Well done! You have escaped from the desert island." :
  2060. READLINE : LET CHARLOC(0)=0
  2061.  
  2062. Type p2 to point to procedure 2.
  2063. Now type the following lines - pressing return after each.
  2064.  
  2065. 10 IF (IN(1)=VERB(10) AND IN(2)=WORD(0)) THEN PRINT "The water flows
  2066. slowly over a sandy bank, broken in many places by small rocks."
  2067.  
  2068. 20 IF (IN(1)=VERB(7) AND IN(2)=WORD(2)) THEN PRINT "Alright wise guy
  2069. cut the cracks, if you wanna spend your life collecting the rivers of
  2070. this world that`s up to you. But right now we`ve got an adventure to
  2071. solve."
  2072.  
  2073. 30 IF (IN(1)=VERB(3) AND OBJLOC(6)=254) THEN PRINT "You sail south in
  2074. your tree boat. Well done! You have escaped from the desert island." :
  2075. READLINE : LET CHARLOC(0)=0
  2076.  
  2077. Type p4 to point to procedure 4.
  2078. Now type the following lines - pressing return after each.
  2079.  
  2080. 10 IF (((IN(1)=VERB(12) AND IN(2)=WORD(3)) AND OBJLOC(4)=254) AND
  2081. OBJLOC(6)=0) THEN PRINT "You cut down a medium sized tree and shape it
  2082. into a roughly made boat." : LET OBJLOC(6)=CHARLOC(0)
  2083.  
  2084. 20 IF (IN(1)=VERB(10) AND IN(2)=WORD(3)) THEN PRINT "The trees here are
  2085. quite large, being what a helpful person would call `boat sized`."
  2086.  
  2087. Type p5 to point to procedure 5.
  2088. Now type the following line - then press return.
  2089.  
  2090. 10 PROCEDURE 4
  2091.  
  2092. Type p253 to point to procedure 253 (this is known as the recurrent
  2093. list because it is executed every turn).
  2094. Now type the following lines - pressing return after each.
  2095.  
  2096. 10 IF ((CHARLOC(0)=3 AND OBJLOC(4)=0) AND OBJLOC((3)=254) THEN LET
  2097. OBJLOC(4)=3
  2098.  
  2099. 20 IF ((CHARLOC(0)=3 AND OBJLOC(4)=3) AND OBJLOC(3)<>254) THEN LET
  2100. OBJLOC(4)=0
  2101.  
  2102. 30 IF VAR(0)<>CHARLOC(0) THEN WRITE DESCRIPTION(CHARLOC(0))
  2103.  
  2104. 40 LET VAR(0)=CHARLOC(0)
  2105.  
  2106. 50 IF VAR(2)<>0 THEN LET VAR(2)=(VAR(2)+1)
  2107.  
  2108. 60 IF VAR(2)=5 THEN PRINT "The stick withers and goes out." : LET
  2109. OBJLOC(5)=OBJLOC(3) : LET OBJLOC(3)=0
  2110.  
  2111. Type p254 to point to procedure 254 (this is known as the general list
  2112. because all commands which are `general` to the adventure - i.e. can be
  2113. typed at any location - are placed here).
  2114. Now type the following lines - pressing return after each.
  2115.  
  2116. 10 IF IN(1)=VERB(5) THEN LET VAR(0)=0 : PROCEDURE 253
  2117.  
  2118. 20 IF IN(1)=VERB(10) THEN PRINT "There`s not much to tell."
  2119.  
  2120. 30 IF IN(1)<>VERB(9) THEN GOTO 80
  2121.  
  2122. 40 PRINT "You are currently carrying:"
  2123.  
  2124. 50 FOR VAR(1)=1 to 254
  2125.  
  2126. 60 IF OBJLOC(VAR(1))=254 THEN PRINT "The ",OBJNAME(VAR(1)),"."
  2127.  
  2128. 70 NEXT
  2129.  
  2130. 80 IF ((IN(1)=VERB(7) AND IN(2)=OBJECT(X)) AND OBJLOC(X)=CHARLOC(0))
  2131. THEN PRINT "You take the ",OBJNAME(X),"." : LET OBJLOC(X)=254
  2132.  
  2133. 90 IF ((IN(1)=VERB(8) AND IN(2)=OBJECT(X)) AND OBJLOC(X)=254) THEN
  2134. PRINT "You drop the ",OBJNAME(X),"." : LET OBJLOC(X)=CHARLOC(0)
  2135.  
  2136. 100 IF (((IN(1)=VERB(11) AND IN(2)=OBJECT(2)) AND OBJLOC(2)=254) AND
  2137. OBJLOC(1)=254) THEN PRINT "The rays of the sun reflect off the mirror
  2138. scorching the stick which, as a result, burns slowly away." : LET
  2139. OBJLOC(2)=0 : LET OBJLOC(3)=254 : LET VAR(2)=1
  2140.  
  2141. 110 IF IN(1)=UNKNOWN THEN PRINT "Sorry, that command is not
  2142. understood."
  2143.  
  2144. Now after all that hard work it`s time for the reward. Select Play
  2145. Adventure from the Main Menu by pressing F7 and you will now enter the
  2146. game world which you have just created. Use the verbs listed earlier;
  2147. and although you know how to solve this adventure (having just typed it
  2148. in!), it is still fun to experiment. Once you are bored (which should
  2149. not take too long) you might like to play some of the other example
  2150. adventures on this disk. To load them simply leave the game by pressing
  2151. return without typing anything, select File Menu by pressing F6, press
  2152. F1 to select Load File, then type the number of the game you wish to
  2153. load and press return. To play this game you have just loaded, simply
  2154. type E to return to the Main Menu and press F7 to begin.
  2155.  
  2156. [Note: If you are incredibly lazy you might like to learn that a
  2157. complete and working version of the above adventure is supplied on the
  2158. boot disk. To load this simply follow the instructions given to load
  2159. files, but select `ESCAPE FROM DESERT ISLAND` when the list of games
  2160. appear.]
  2161. THE MAIN MENU
  2162. -------------
  2163.      From the main menu you will have access to every function FRAC
  2164. possesses (although you may have to go through several sub menus to get
  2165. to it). When FRAC loads this is the first thing you will be presented
  2166. with, so it is important that I give you a full description of it now.
  2167. The main menu looks like this:
  2168.  
  2169. ***********************************************************************
  2170. *          FRAC - The Fantasy Roleplaying Adventure Creator           *
  2171. *        Copyright - 1992 Derek Whiteman. All rights reserved         *
  2172. ***********************************************************************
  2173. MEM = 80000
  2174.                               MAIN MENU
  2175.                               ^^^^ ^^^^
  2176.  
  2177.                          1. LOCATION MENU
  2178.                          2. VERB MENU
  2179.                          3. WORD MENU
  2180.                          4. OBJECT MENU
  2181.                          5. CHARACTER MENU
  2182.                          6. FILE MENU
  2183.                          7. PLAY ADVENTURE
  2184.                          8. OPTIONS
  2185.                          9. CLEAR MEMORY
  2186.                          0. ENTER FRACTOL
  2187.  
  2188.                          E. <EXIT>
  2189.  
  2190. The memory counter at the top left gives you an up to date account of
  2191. how many more ascii characters (i.e. letters - or for the more
  2192. informed, bytes) FRAC is able to store in memory. At the start, or when
  2193. the memory has just been cleared, it should display 80000 which is
  2194. large enough for most adventures. (In case you are wondering, the
  2195. memory taken up by the music and graphics you include in your
  2196. adventures is not subtracted from this total, since only text is stored
  2197. here). If this total ever gets below about 500, it is best to stop
  2198. typing since you are now reaching the minimum amount of memory FRAC
  2199. requires to operate. If you do ever write an adventure this big, it
  2200. would be a good idea to split it up into smaller parts so that the
  2201. whole adventure could be as large as you liked. To move onto the next
  2202. part, you might decide to give the player a password on completion of
  2203. all of the tasks. They could then use this to begin play, whereas a
  2204. person who has not yet completed the previous part would not know the
  2205. password, and consequently would be unable to jump ahead and cheat.
  2206.  
  2207. Pressing escape or typing E at the main menu produces the prompt `Are
  2208. You Sure You Want To Quit?`. Typing Y (or any word beginning with Y)
  2209. will exit FRAC and return you to AmigaDOS, while anything else will
  2210. return you to the main menu. Pressing escape or typing E at any other
  2211. menu will take you back a level to the previous menu.
  2212.  
  2213.  
  2214.  
  2215. THE KEYBOARD
  2216. ------------
  2217.  
  2218. While you are in FRAC there are certain features that are not usually
  2219. available. Firstly the function keys can be used instead of typing in a
  2220. number, and escape may be used instead of typing E. Pressing help will
  2221. automatically select help, and the tab key will flip between hold
  2222. display on, and hold display off (note: these only work when in
  2223. FRACTOL). Another feature is that because FRAC uses a shell
  2224. environment, it will have an internal command history buffer. This
  2225. means the last 2048 characters you have typed in will be remembered,
  2226. and can be recalled and edited by you, and then re-entered by pressing
  2227. return. There are also a few helpful line editing functions which can
  2228. be invoked by pressing the following keys:
  2229.  
  2230. LEFT CURSOR KEY     -  move cursor one character left within the text.
  2231. RIGHT CURSOR KEY    -  move cursor one character right within the text.
  2232. THE DELETE KEY      -  deletes the character at the current cursor
  2233.                        position.
  2234. THE BACKSPACE  KEY  -  deletes the character to the left of the
  2235.                        current cursor position.
  2236. <CONTROL> THEN K    -  deletes everything from the cursor forward to
  2237.                        the end of the line.
  2238. <CONTROL> THEN U    -  deletes everything from the cursor backward to
  2239.                        the start of the line.
  2240. <CONTROL> THEN X    -  deletes the entire line.
  2241. <SHIFT> THEN
  2242. LEFT CURSOR KEY     -  moves cursor to the start of the line.
  2243. <SHIFT> THEN
  2244. RIGHT CURSOR KEY    -  moves cursor to the end of the line.
  2245. <CONTROL> THEN W    -  moves cursor to the next tab stop.
  2246. UP CURSOR KEY       -  move to previously entered line. This may be
  2247.                        repeatedly pressed to move through everything
  2248.                        you have typed so far.
  2249. DOWN CURSOR KEY     -  move to next line. This can be used to move back
  2250.                        through the lines you have already looked at
  2251.                        using the key described above.
  2252. <SHIFT> THEN
  2253. UP CURSOR KEY       -  Scan through previous lines to try and locate a
  2254.                        match with the text currently being displayed.
  2255. <SHIFT> THEN
  2256. DOWN CURSOR KEY     -  Scan through subsequent lines to try and locate
  2257.                        a match with the text currently being displayed.
  2258.  
  2259. The last four key sequences give you control of the history buffer, and
  2260. are extremely useful. Say you wished to find the last line 10 you had
  2261. typed in FRACTOL, and then edit it. You would simply type 10 and then
  2262. press shift and the up cursor key. The last line 10 would be printed on
  2263. the screen, and could be edited and re-entered in any form you like. As
  2264. another example, say you wished to find the last sentence you had typed
  2265. which began with the word `you`. You would simply type `you`, press
  2266. shift and up, and if located, the sentence would be displayed ready for
  2267. editing.
  2268.  
  2269. There now follows an in depth study of each of the functions on the
  2270. main menu, starting with the Location Menu.
  2271.  
  2272. LOCATION MENU
  2273. -------------
  2274.      A location in an adventure game is not defined in terms of size or
  2275. content, but is left to the individual game creator to decide his own
  2276. interpretation, based upon the size and detail of his game. At first I
  2277. thought of describing a location as a place of interest to the player,
  2278. but this is not always true. For example if you wished to simulate the
  2279. vastness of a sprawling forest, many locations would be similar and not
  2280. really very interesting - although all would be necessary so that the
  2281. player could lose his way and forget where he was. I also thought of
  2282. describing locations in terms of distance, but very few adventures have
  2283. their locations mapped out in this way, since it is necessary to `cut
  2284. corners` to prevent the player becoming bored while wandering about
  2285. large pockets of wilderness. To take an extreme (yet valid) example, a
  2286. games creator might define an entire desert in one location, while a
  2287. small house inside the desert might have six locations. This is because
  2288. the author did not wish to have the player wandering around for ages
  2289. looking for the house since this has nothing to do with solving the
  2290. adventure, but the house is far more important, and so more locations
  2291. are needed to give the player something to explore. You will often see
  2292. such discrepancies in adventure games, but as long as it flows well and
  2293. the same guidelines are followed throughout, it doesn`t really matter
  2294. that much.
  2295.      So as you can see, locations are left pretty much to your own
  2296. judgement, although it will help greatly if you draw a map using boxes
  2297. to represent locations and lines to link them up. From this you will be
  2298. able to determine the type of location description you are looking for,
  2299. and also create any visible exits. If you are still unsure about how a
  2300. location description should read, take a look at some of the example
  2301. adventures which are provided on the boot disk for your entertainment.
  2302.  
  2303. The Location Menu provides you with all of the functions necessary to
  2304. define and manipulate locations and their exits. This will generally be
  2305. one of the most frequently used of the FRAC menus, so it pays to study
  2306. its layout.
  2307.  
  2308. ***********************************************************************
  2309. ***                          LOCATION MENU                          ***
  2310. ***********************************************************************
  2311.  
  2312.                          1. CREATE LOCATION
  2313.                          2. VIEW LOCATION
  2314.                          3. ERASE LOCATION
  2315.                          4. ADD TO DESCRIPTION
  2316.                          5. LIST DESCRIPTIONS
  2317.                          6. EXCHANGE DESCRIPTIONS
  2318.                          7. DISPLAY USED LIST
  2319.                          8. EXIT MENU
  2320.                          9. CLEAR ALL DESCRIPTIONS
  2321.  
  2322.                          E. EXIT TO MAIN MENU
  2323. 1. CREATE DESCRIPTION
  2324.    ------------------
  2325.      This allows you to create the text that will be displayed when the
  2326. player is at a certain location. On selection you will be asked to
  2327. enter the location number of the description you wish to create - enter
  2328. this (a number between 0 and 254 - anything else will prompt you again)
  2329. and press return. If there is already a description for this location
  2330. it will be displayed, and then you will be asked to enter the new
  2331. description for this location. When you have finished, press return.
  2332.  
  2333. 2. VIEW DESCRIPTION
  2334.    ----------------
  2335.      This allows you to view any location description currently in
  2336. memory. Simply type the location number you wish to see (the range is 0
  2337. to 254) and press return. If the location has no description, `Sorry,
  2338. location xxx has no description.` will be displayed, otherwise the
  2339. description will be displayed. You will then be asked to press return.
  2340.  
  2341. 3. ERASE DESCRIPTION
  2342.    -----------------
  2343.      This erases a single location description from memory. You will be
  2344. asked to enter a location number (must be between 0 and 254 or you will
  2345. be asked again) and if the description exists it will be displayed with
  2346. the prompt OK to erase location xxx? Simply type `Y` or any word
  2347. beginning with `Y` to erase the description; anything else will send
  2348. you back to the Location Menu. If the description number you entered
  2349. has not yet been defined, you will be sent directly back to the
  2350. location menu.
  2351.  
  2352. 4. ADD TO DESCRIPTION
  2353.    ------------------
  2354.      As you are only allowed to enter 254 characters at a time - a
  2355. total I find too limiting, I have developed this function to allow
  2356. users to enter more than this amount, by adding any new text typed to
  2357. the original. The process can be repeated so that any description
  2358. lengths are possible. Firstly, this function checks whether any
  2359. descriptions have been created yet. If not you will be told `Sorry not
  2360. enough free locations` at which you should just press return to get
  2361. back to the Location Menu. If there is at least one description in
  2362. memory, you will be asked to enter the description number which you
  2363. wish to add to (type a number between 0 and 254). If this location is
  2364. defined, the definition will be printed with a cursor directly after.
  2365. Type in what you wish to add, then press return - you will then be sent
  2366. back to the Location Menu. If the location has not yet been defined the
  2367. text `This Location Is Empty!` will be printed and you will be asked to
  2368. enter a different location number.
  2369.  
  2370. 5. LIST DESCRIPTIONS
  2371.    -----------------
  2372.      This simply starts at a description number and lists all the
  2373. descriptions following this, one after another - waiting for you to
  2374. press return before moving onto the next. Firstly you will be told to
  2375. enter a location at which to start (a number between 0 and 254) - the
  2376. description for this location will then be displayed.
  2377.      You may either press return to continue with the next location, or
  2378. type 1 and press return to get back to the location menu. If you are at
  2379. location number 254 and you press return, the program will
  2380. automatically return you to the Location Menu.
  2381.  
  2382. 6. EXCHANGE DESCRIPTIONS
  2383.    ---------------------
  2384.      This function simply swaps two location descriptions over. Firstly
  2385. you will be asked to enter the number of the first location that is to
  2386. be exchanged. Enter a number between 0 and 254 and press return -
  2387. anything else will force a reprompt. Then you will be asked to enter
  2388. the number of the second location that is to be exchanged. This must
  2389. also be between 0 and 254. The descriptions will then be exchanged and
  2390. you will be sent back to the Location Menu.
  2391.  
  2392. 7. DISPLAY USED LIST
  2393.    -----------------
  2394.      This originally displayed a map of all the used locations but I
  2395. replaced this with a simple counter telling you how many locations you
  2396. have used. Just press return to get back to the location menu.
  2397.  
  2398. 8. EXIT MENU
  2399.    ---------
  2400.      This will take you to the Exit sub-menu. From here you can create
  2401. the visible exits for a location. By visible exits I mean exits which
  2402. due to their nature cannot be altered or destroyed during the course of
  2403. the game. All `open-air` exits come into this category, so do all cave
  2404. entrances and doorways which, for the purposes of the game are never
  2405. modified. To give you a clearer understanding of what should be
  2406. classified as a visible exit, it is best to define exits which are NOT
  2407. classed as visible exits. Examples include cave entrances where a
  2408. boulder must be removed before entry is possible, secret doors which
  2409. have to be discovered before they can be used., and doors which need to
  2410. be unlocked or opened before the exit is revealed. In fact anything
  2411. which needs to be changed by the player doing something before it can
  2412. be used - anything else is a visible exit, and can be defined using
  2413. this menu.
  2414.  
  2415. ***********************************************************************
  2416. ***                            EXIT MENU                            ***
  2417. ***********************************************************************
  2418.  
  2419.                          1. CREATE EXITS
  2420.                          2. VIEW EXITS
  2421.                          3. ERASE EXITS
  2422.                          4. AUTO EXITS
  2423.                          5. LIST EXITS
  2424.                          6. EXCHANGE EXITS
  2425.                          7. CLEAR ALL EXITS
  2426.  
  2427.                          E. <EXIT>
  2428.  
  2429.  
  2430.  
  2431. 1. CREATE EXITS
  2432.    ------------
  2433.      This function allows you to create visible exits for a location:
  2434. each location has eight visible exits which can be defined by the user.
  2435. To do this simply enter the location number at the prompt (the range is
  2436. 1 to 254), and then type in which visible exit you wish to change
  2437. (between 1 and 8). On pressing return you will be told to `Please Enter
  2438. Verb:`. You may either type the verb or a synonym, or the number of the
  2439. verb (range 1 to 254). E.g. if verb 1 was north.n you could type 1, n
  2440. or north to select it. Once you have selected the verb you will be
  2441. asked to enter the jump location. This is simply the number of the
  2442. location the player will jump to if this verb is entered. E.g. if we
  2443. used north for the verb and set this to 4, every time the player types
  2444. north or n at this location, he will be moved directly to location 4.
  2445.  
  2446. 2. VIEW EXITS
  2447.    ----------
  2448.      This allows you to see the visible exits for a location. Simply
  2449. type the number of the location you wish to see the exits for (a number
  2450. between 1 and 254), and once you have finished press return to get back
  2451. to the Exit Menu.
  2452.  
  2453. 3. ERASE EXITS
  2454.    -----------
  2455.      This function allows you to erase one or all of the visible exits
  2456. belonging to a location. Just type in the location number that you wish
  2457. to erase exits at (a number between 1 and 254) then either type in the
  2458. exit you wish to remove (a number between 1 and 8), or 99 if you wish
  2459. to erase all of the exits at this location.
  2460.  
  2461. 4. AUTO EXITS
  2462.    ----------
  2463.      You may already have noticed that to define one exit which the
  2464. player can walk back and forth between, two exits are needed. That is,
  2465. one leading from the first location to the second, and then one leading
  2466. from the second to the first. To save all this extra typing I have
  2467. developed a system which recognises opposites and will automatically
  2468. create the second exit for you. To use this you must simply define up
  2469. to 16 opposite verbs which are used to define exits. Firstly type the
  2470. number of the AutoExit you wish to edit (a number between 1 and 16).
  2471. You will then be asked for the first verb, at which you should either
  2472. type in the verb, a synonym, or its number (between 1 and 254). Here
  2473. are some example opposites:
  2474.  
  2475. NORTH/SOUTH
  2476. NORTHEAST/SOUTHWEST
  2477. UP/DOWN
  2478. ENTER/LEAVE
  2479.  
  2480. After you have entered the two verbs the screen will update and the
  2481. prompts will start again. To exit simply type 0 at the `Enter Auto Exit
  2482. Number` prompt.
  2483.  
  2484.  
  2485. 5. LIST EXITS
  2486.    ----------
  2487.      This allows you to go through all the locations one by one and
  2488. examine their exits. Firstly you are asked to enter the start location
  2489. (a number between 1 and 254). Then you may press return to continue
  2490. onto the next location, or type 1 and press return to get back to the
  2491. exit menu. If you are at location 254 and you press return, the program
  2492. will automatically send you back to the exit menu.
  2493.  
  2494. 6. EXCHANGE EXITS
  2495.    --------------
  2496.      This function simply exchanges all the visible exits at one
  2497. location for all the visible exits at another. You will then be asked
  2498. to enter the first location number (between 1 and 254), and then the
  2499. second (1 to 254).
  2500.  
  2501. 7. CLEAR ALL EXITS
  2502.    ---------------
  2503.      You will be given the prompt `Are you sure you want to clear all
  2504. exits?`. If you type `Y` or any word beginning with `Y`, all the exits
  2505. will be cleared along with the Auto Exit definitions. You will then be
  2506. returned to the Exit Menu.
  2507.  
  2508. We have now completely examined the Exits sub-menu, so I now return to
  2509. finish off the functions in the Location Menu.
  2510.  
  2511. 9. CLEAR ALL DESCRIPTIONS
  2512.    ----------------------
  2513.      You will be given the prompt `Are you sure you want to clear all
  2514. descriptions?`. If you type `Y` or any word beginning with `Y` all the
  2515. location descriptions will be erased. You will then be returned to the
  2516. Location Menu.
  2517.  
  2518. This completes the examination of the Location Menu, I now return back
  2519. to the Main Menu.
  2520.  
  2521. VERB MENU
  2522. ---------
  2523.      There are several types of verb. These will be examined below:
  2524.  
  2525. Active:
  2526.      Expressing action, especially action affecting an object.
  2527.  
  2528. Neuter:
  2529.      Of neither gender; neither masculine nor feminine (in English     
  2530. grammar applied to all things without life).
  2531.  
  2532. Transitive:
  2533.      Taking an object after it; denoting action passing to an object   
  2534.   that is expressed (a transitive verb).
  2535.  
  2536. Intransitive:
  2537.      Expressing an action or state that is limited to the subject;     
  2538. not having an object (an intransitive verb).
  2539. All the actions the player will ever enter will begin with a verb, and
  2540. this menu allows you to create these. Some examples of valid verbs are:
  2541.  
  2542.      take         [transitive]
  2543.      cut          [transitive]
  2544.      eat          [transitive]
  2545.      throw        [transitive]
  2546.      walk         [intransitive]
  2547.      run          [intransitive]
  2548.      attack       [transitive]
  2549.  
  2550. You can see from even this short list that most of the verbs you will
  2551. use will be transitive and so require an object (used in the
  2552. grammatical sense) on which to act. There are several exceptions and
  2553. their numbers are broadened by a peculiarity which means that words
  2554. that would normally be considered as nouns, must be treated as verbs.
  2555. This arises from the strong connection of a noun used to signify a
  2556. direction and any normal verb. E.g. these would all be defined as verbs
  2557. in FRAC:
  2558.  
  2559.      fly          [intransitive verb]
  2560.      dance        [intransitive verb]
  2561.      north        [noun!]
  2562.      wear         [transitive verb]
  2563.      up           [adverb!]
  2564.  
  2565. The moral of this story is that any word which is used as an exit
  2566. descriptive, must be defined as a verb - along with all `standard`
  2567. verbs.
  2568.      Any word defined as a verb in FRAC may have as many synonyms as
  2569. you like. This is achieved by placing a full stop symbol (.) after the
  2570. previous definition, before entering the new one. Here is a list of
  2571. examples:
  2572.  
  2573.      north.n
  2574.      east.e
  2575.      south.s
  2576.      west.w
  2577.      northeast.ne
  2578.      southeast.se
  2579.      northwest.nw
  2580.      southwest.sw
  2581.      up.u
  2582.      down.d
  2583.      take.get
  2584.      drop
  2585.      attack.hit.kill.punch.kick.maim.headbutt
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593. ***********************************************************************
  2594. ***                            VERB MENU                            ***
  2595. ***********************************************************************
  2596.  
  2597.                             1. CREATE VERB
  2598.                             2. VIEW VERB
  2599.                             3. ERASE VERB
  2600.                             4. ADD TO VERB
  2601.                             5. LIST VERBS
  2602.                             6. EXCHANGE VERBS
  2603.                             7. PAGE VERBS
  2604.                             8. CLEAR ALL VERBS
  2605.  
  2606.                             E. EXIT TO MAIN MENU
  2607.  
  2608. 1. CREATE VERB
  2609.    -----------
  2610.      This allows you to add a verb to FRAC`s vocabulary or exchange an
  2611. existing one for a new one. At the prompt `Please Enter Verb Number:`,
  2612. you can do one of three things: type a number between 1 and 254
  2613. inclusive, type in an existing verb or synonym - in which case FRAC
  2614. will instead locate the next free verb and use this to store your
  2615. input. Next you will be asked to enter the verb (along with its
  2616. synonyms, if necessary). As with all inputs in FRAC the letter case is
  2617. irrelevant, but please note that if a verb or a synonym contains a
  2618. space it will be unrecognisable to FRAC and therefore useless - so make
  2619. sure you do not use spaces.
  2620.  
  2621. 2. VIEW VERB
  2622.    ---------
  2623.      This simply displays a single verb of your choosing. To select the
  2624. verb you may either type it in (or any valid synonym), or type a number
  2625. between 1 and 254. If the verb you typed does not exist, you will be
  2626. told `Sorry, verb xxx does not exist`.
  2627.  
  2628. 3. ERASE VERB
  2629.    ----------
  2630.      This erases a single verb from the memory. At the prompt `Please
  2631. Enter Verb:`, you may enter a valid verb or synonym, or type a number
  2632. between 1 and 254. If the verb does not exist you will return
  2633. immediately to the verb menu, otherwise you will be asked `OK to erase
  2634. verb xxx?`. Typing `Y` or any word beginning with `Y` will erase the
  2635. verb and take you back to he verb menu - anything else will just return
  2636. you to the verb menu.
  2637.  
  2638. 4. ADD TO VERB
  2639.    -----------
  2640.      This function allows you to add synonyms to a previously existing
  2641. verb. At the prompt `Please Enter Verb:`, you may type in a valid word
  2642. or synonym, or a number between 1 and 254. If you have not yet defined
  2643. any verbs you will be told `Sorry, not enough free verbs` - at which
  2644. you should press return to get back to the verb menu. If the verb you
  2645. entered was invalid, you will be told `this verb is empty!`, otherwise
  2646. the verb and its synonyms will be displayed with the cursor directly
  2647. following. Just enter any synonyms you wish to add and then press
  2648. return.
  2649.  
  2650. 5. LIST VERBS
  2651.    ----------
  2652.      This function asks for a start value and then lists all the verbs
  2653. starting with this one, one after another. At the prompt `Please Enter
  2654. Start Verb:` type a verb or its synonym, or any number between 1 and
  2655. 254. The verb you selected will now be displayed. At the prompt you may
  2656. either press return to move onto the next verb, or 1 and return to get
  2657. back to the verb menu.
  2658.  
  2659. 6. EXCHANGE VERBS
  2660.    --------------
  2661.      This simply exchanges two verb definitions. At the prompt `Please
  2662. Enter 1st Verb:`, you may either enter a verb or its synonym, type a
  2663. number between 1 and 254, or just press return to get back to the verb
  2664. menu (this will happen automatically if FRAC does not recognise the
  2665. verb you have entered).
  2666.  
  2667. 7. PAGE VERBS
  2668.    ----------
  2669.      This allows you to `flick` through all the verbs you have defined
  2670. like pages in a book. Twenty verbs will be displayed down the screen.
  2671. Type 1 to flick left, and 2 to flick right, press return to return to
  2672. the verb menu.
  2673.  
  2674. 8. CLEAR ALL VERBS
  2675.    ---------------
  2676.      You will be asked `Are you sure you want to clear all verbs?`.
  2677. Typing `Y` or any word beginning with `Y` will erase all the verb
  2678. definitions you have entered so far. You will then be returned to the
  2679. verb menu.
  2680.  
  2681. WORD MENU
  2682. ---------
  2683.      For the purposes of FRAC, `words` are anything which it can
  2684. recognise. Since verbs are defined elsewhere, words will consist mainly
  2685. of nouns which have no `directional` properties. Examples include:
  2686.  
  2687.      tree
  2688.      wall
  2689.      rock.boulder
  2690.      door
  2691.      writing
  2692.  
  2693. As you can see these `words` mainly constitute the object of the
  2694. sentence, as discussed earlier, and the simple addition of a verb will
  2695. complete a valid input. For example:
  2696.      climb tree
  2697.      examine wall
  2698.      push rock
  2699.      open door
  2700.      read writing
  2701. Please Note: For reasons which will be explained later, it is better
  2702. not to define the definitive article as either a verb or word - but
  2703. leave it undefined.
  2704.  
  2705. ***********************************************************************
  2706. ***                            WORD MENU                            ***
  2707. ***********************************************************************
  2708.  
  2709.                             1. CREATE WORD
  2710.                             2. VIEW WORD
  2711.                             3. ERASE WORD
  2712.                             4. ADD TO WORD
  2713.                             5. LIST WORDS
  2714.                             6. EXCHANGE WORDS
  2715.                             7. PAGE WORDS
  2716.                             8. CLEAR ALL WORDS
  2717.  
  2718.                             E. EXIT TO MAIN MENU
  2719.  
  2720. 1. CREATE WORD
  2721.    -----------
  2722.      This allows you to add a word to FRAC`s vocabulary or exchange an
  2723. existing one for a new one. At the prompt `Please Enter Word Number:`,
  2724. you can do one of three things: type a number between 1 and 254
  2725. inclusive, type in an existing word or synonym - in which case FRAC
  2726. will instead locate the next free word and use this to store your
  2727. input. Next you will be asked to enter the word (along with its
  2728. synonyms, if necessary). As with all inputs in FRAC the letter case is
  2729. irrelevant, but please note that if a word or a synonym contains a
  2730. space it will be unrecognisable to FRAC and therefore useless - so make
  2731. sure you do not use spaces.
  2732.  
  2733. 2. VIEW WORD
  2734.    ---------
  2735.      This simply displays a single word of your choosing. To select the
  2736. word you may either type it in (or any valid synonym), or type a number
  2737. between 1 and 254. If the word you typed does not exist, you will be
  2738. told `Sorry, word xxx does not exist`.
  2739.  
  2740. 3. ERASE WORD
  2741.    ----------
  2742.      This erases a single word from the memory. At the prompt `Please
  2743. Enter Word:`, you may enter a valid word or synonym, or type a number
  2744. between 1 and 254. If the word does not exist you will return
  2745. immediately to the word menu, otherwise you will be asked `OK to erase
  2746. word xxx?`. Typing `Y` or any word beginning with `Y` will erase the
  2747. word and take you back to he word menu - anything else will just return
  2748. you to the word menu.
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755. 4. ADD TO WORD
  2756.    -----------
  2757.      This function allows you to add synonyms to a previously existing
  2758. word. At the prompt `Please Enter Word:`, you may type in a valid word
  2759. or synonym, or a number between 1 and 254. If you have not yet defined
  2760. any words you will be told `Sorry, not enough free words` - at which
  2761. you should press return to get back to the word menu. If the word you
  2762. entered was invalid, you will be told `this word is empty!`, otherwise
  2763. the word and its synonyms will be displayed with the cursor directly
  2764. following. Just enter any synonyms you wish to add and then press
  2765. return.
  2766.  
  2767. 5. LIST WORDS
  2768.    ----------
  2769.      This function asks for a start value and then lists all the words
  2770. starting with this one, one after another. At the prompt `Please Enter
  2771. Start Word:` type a word or its synonym, or any number between 1 and
  2772. 254. The word you selected will now be displayed. At the prompt you may
  2773. either press return to move onto the next word, or 1 and return to get
  2774. back to the word menu.
  2775.  
  2776. 6. EXCHANGE WORDS
  2777.    --------------
  2778.      This simply exchanges two word definitions. At the prompt `Please
  2779. Enter 1st Word:`, you may either enter a word or its synonym, type a
  2780. number between 1 and 254, or just press return to get back to the word
  2781. menu (this will happen automatically if FRAC does not recognise the
  2782. word you have entered).
  2783.  
  2784. 7. PAGE WORDS
  2785.    ----------
  2786.      This allows you to `flick` through all the words you have defined
  2787. like pages in a book. Twenty words will be displayed down the screen.
  2788. Type 1 to flick left, and 2 to flick right, press return to return to
  2789. the word menu.
  2790.  
  2791. 8. CLEAR ALL WORDS
  2792.    ---------------
  2793.      You will be asked `Are you sure you want to clear all words?`.
  2794. Typing `Y` or any word beginning with `Y` will erase all the word
  2795. definitions you have entered so far. You will then be returned to the
  2796. word menu.
  2797.  
  2798. OBJECT MENU
  2799. -----------
  2800.      These are objects in the physical sense. Since an adventure would
  2801. be very boring without things the player could manipulate, FRAC
  2802. provides many functions dedicated to the inclusion of objects into
  2803. adventures. If option 4 (visible object report) is switched on, any
  2804. objects at the current location will automatically be displayed beneath
  2805. the location description, in the form `you can also see:`. Following
  2806. this will be the indefinite article which FRAC `guesses`, based upon
  2807. the character structuring of the noun. The rules are as follows:
  2808.  
  2809. If the noun ends with the letter `s`, `some` is used. E.g. some grapes.
  2810. If the noun starts with a consonant, `a` is used. E.g. a gun.
  2811. If the noun starts with a vowel, `an` is used. E.g. an apple.
  2812.  
  2813. [Note: The first rule has priority over the second and third rules].
  2814.  
  2815. This is true for most nouns but there will always be some exceptions
  2816. (e.g. FRAC would use `a hay` instead of `some hay`, `some cross`
  2817. instead of `a cross`). To prevent this happening you can force FRAC to
  2818. use your indefinite article, by placing the prefix - and a letter
  2819. directly before the name of the object. Here are the possible prefixes:
  2820.  
  2821.      -a     forces FRAC to use `a`.
  2822.      -n     forces FRAC to use `an`.
  2823.      -s     forces FRAC to use `some`.
  2824.  
  2825. So to correct the mistakes mentioned above, we could type -shay and
  2826. -across.
  2827.  
  2828. ***********************************************************************
  2829. ***                           OBJECT MENU                           ***
  2830. ***********************************************************************
  2831.  
  2832.                            1. CREATE OBJECT
  2833.                            2. VIEW OBJECT
  2834.                            3. ERASE OBJECT
  2835.                            4. EXCHANGE OBJECTS
  2836.                            5. PAGE OBJECTS
  2837.                            6. SET DEFINITIONS
  2838.                            7. CLEAR ALL OBJECTS
  2839.  
  2840.                            E. EXIT TO MAIN MENU
  2841.  
  2842. 1. CREATE OBJECT
  2843.    -------------
  2844.      At the prompt `Please Enter Object Number:`, you may either press
  2845. return - in which case FRAC will locate the next free object for you -
  2846. or type a number between 1 and 254. If the object you selected already
  2847. exists it will now be displayed. You will then be given the prompt
  2848. `Please Enter Name For Object xxx:`. Pressing return will take you back
  2849. to the object menu with no modification of the object being made.,
  2850. while typing anything else will be taken as the objects name. After any
  2851. prefix (if you decide to include one) you must type what is known as
  2852. the title of the object; for this is the name the player will see. It
  2853. may include spaces. If it does have any spaces, you must have a synonym
  2854. which does not have any spaces in it, so that FRAC can identify it.
  2855. E.g. long pole would not be valid since it does not have any synonyms
  2856. which do not have a space, and so in this form would be unrecognisable
  2857. (i.e. if the player typed take long pole, only take would be
  2858. recognised). To avoid this problem we could either shorten the name to
  2859. just pole, or add a synonym: long pole.pole. Now if the player typed
  2860. take long pole, pole would be recognised (long would be ignored), and
  2861. the long pole would be taken. As well as the title you may have as many
  2862. synonyms as you like separated by full stops.
  2863.      After entering the name, you will be asked to enter the start
  2864. location of the object. Type any number between 0 and 254. Location 0
  2865. means that the object does not yet exist in the game world (but it may
  2866. be brought into existence later - after the player has committed a
  2867. certain act. For example, in the tutorial adventure `Escape from desert
  2868. island`, the burning stick starts at location zero, but as soon as the
  2869. walking stick is lit, the burning stick swaps places with the walking
  2870. stick - thus producing the illusion that the stick has caught fire).
  2871. For the next part you will need to realise that an object possesses
  2872. eight user definable stats. These can be set to any integer value
  2873. between 0 and 999999. These `definitions` can be used for all kinds of
  2874. purposes to make one object different from another. You might make one
  2875. store the weight of an object, another the size and perhaps the cost -
  2876. it is up to you. If you wish to leave these undefined just keep
  2877. pressing return at each of the eight prompts - they will then be set to
  2878. zero. This completes creating an object. Although it sounds complicated
  2879. being described as it is above, it is really very simple, usually
  2880. taking only a matter of second to `knock one out`.
  2881.  
  2882. 2. VIEW OBJECT
  2883.    -----------
  2884.      This displays an objects name, along with its starting location
  2885. and eight definitions. At the prompt `Please Enter Object Number:`,
  2886. simply type a number between 1 and 254 - anything else will cause FRAC
  2887. to repeat the prompt. If the object you selected does not exist, you
  2888. will be informed.
  2889.  
  2890. 3. ERASE OBJECT
  2891.    ------------
  2892.      This erases an object from memory. Just type the number of the
  2893. object you wish to erase at the prompt `Please enter object number:`
  2894. (from 1 to 254). If the object does not exist you will be told,
  2895. otherwise it will be erased and you will be returned to the object
  2896. menu.
  2897.  
  2898. 4. EXCHANGE OBJECTS
  2899.    ----------------
  2900.      This simply swaps two objects around. At the prompt `Please enter
  2901. first object number:`, type a number between 1 and 254 for the first
  2902. object. If it does not exist you will be returned to the object menu,
  2903. otherwise you will be asked for the number of the second object, at
  2904. which you should type a number between 1 and 254. The objects will then
  2905. be exchanged.
  2906.  
  2907. 5. PAGE OBJECTS
  2908.    ------------
  2909.      This allows you to flick through all the objects you have created
  2910. like pages in a book. The objects will be displayed with their starting
  2911. location in brackets to the right. Type 1 to move left, 2 to move
  2912. right, or zero to return to the object menu.
  2913.  
  2914.  
  2915.  
  2916.  
  2917. 6. SET DEFINITIONS
  2918.    ---------------
  2919.      This allows you to give a name to the eight object definitions. As
  2920. you can see this will not effect the game in any way and is not at all
  2921. used by the program, but it makes objects more `readable` to others and
  2922. yourself while inside the editor. To give a definition a title, firstly
  2923. type the number you wish to edit (between 1 and 8) or 0 if you wish to
  2924. quit. You will then be asked to `Enter new word definition:`; by this
  2925. it means type in the number of the word which describes this
  2926. definition. In other words you must first create a word which describes
  2927. this definition, then point to it by using set definition. For example
  2928. if you wished definition 1 to read `Damage Rating` instead of
  2929. `DEFINITION #1`, you must first create the word `Damage Rating` (spaces
  2930. are allowed here since `Damage Rating` never needs to be recognised
  2931. when playing the game), then set definition word #1 to the word number
  2932. of `Damage Rating`. Since the program is expecting a word number as
  2933. input, type anything between 1 and 254, or 0 to leave it undefined.
  2934.  
  2935. 7. CLEAR ALL OBJECTS
  2936.    -----------------
  2937.      This clears all objects and all the `word` definitions. You will
  2938. be asked `Are you sure you want to clear all objects?`. If you type `Y`
  2939. or any word beginning with `Y` the objects will be cleared, otherwise
  2940. you will be returned to the object menu.
  2941.  
  2942. This concludes my examination of the Object sub menu, and so I return
  2943. to the Main Menu.
  2944.  
  2945. 5. CHARACTER MENU
  2946.    --------------
  2947.      If you know about roleplaying games, you would know the characters
  2948. which I am now describing as `NPC`s` or `Non Player Characters`. These
  2949. act independently of the player although they may be influenced by him.
  2950. Although these are meant to simulate life forms, the computer
  2951. adaptations are understandably weak, mainly because the form of
  2952. interaction is limited to a number of small keywords which the
  2953. character can recognise. Even so, including characters in your
  2954. adventure makes the game a lot more exciting, and if described
  2955. properly, the players usually fill in any short comings with their
  2956. imagination. From FRAC`s point of view the only difference between
  2957. objects and characters, is that characters can move automatically, and
  2958. so extra provision is made for this. Even though it is easier to define
  2959. an object as an object and a character as a character, with sufficient
  2960. programming one could quite easily emulate the other, and so the
  2961. definitions become a bit fuzzy. As long as option 5 - visible character
  2962. report - in the Option Menu is left on, the player will automatically
  2963. be informed of any character movement at his location, and also of any
  2964. characters currently present.
  2965.  
  2966.  
  2967.  
  2968.  
  2969.  
  2970.  
  2971. 1. CREATE CHARACTER
  2972.    ----------------
  2973.      This allows you to add a new character to the game. At the prompt
  2974. `Please Enter Character Number:`, you may press return - in which case
  2975. FRAC will locate the next free character for you - or type a number
  2976. between 1 and 254. You will then be asked to enter the name of the
  2977. character. Pressing return will send you straight back to the character
  2978. menu, while typing anything else will be taken as the characters name.
  2979. Remember that you may have as many synonyms as you like for the
  2980. character, but at least one must not contain any spaces so that it may
  2981. be recognised by FRAC. Again the first name is treated as the title,
  2982. and this is how the player will know the character. Some example
  2983. character names are as follows:
  2984.  
  2985.      the dark wraith.wraith
  2986.      an old man.old
  2987.      a young man.young
  2988.  
  2989. Therefore if you typed attack old man, man would be ignored and the
  2990. `old` recognised. After entering the name you will be asked to enter
  2991. the characters start location i.e. a number between 0 and 254. Location
  2992. zero is for unborn, dead or non-existent characters, while any other
  2993. number will place the character in the game world. Next you will be
  2994. asked to enter the characters status. This is simply a number between 0
  2995. and 999999. If the number is zero, FRAC will move the character around
  2996. based on the movement list, which you will enter next. Any non-zero
  2997. value will stop the character moving.
  2998.      Now you will be asked to enter the characters movement list. This
  2999. is simply a string of characters separated by full stops which move the
  3000. character about - one entry is executed each turn. The command
  3001. characters you can use are: `q` - which centres the character onto the
  3002. current player location, `x` - which move the character through a
  3003. randomly picked exit at the current location, or you may enter a number
  3004. between 0 and 254 - this will move the character to that location. If
  3005. this list is exhausted during the game, it is repeated. Here are some
  3006. example movement lists:
  3007.  
  3008.      x               (wandering character)
  3009.      q               (follows player)
  3010.      1.1.2.2          (moves between 1 and 2, waiting a turn at each)
  3011.      1.2.3.8.9.3.2     (follows a pattern)
  3012.  
  3013. After entering the movement list you will be asked to enter the eight
  3014. character definitions for this character. This can be any number
  3015. between 0 and 999999. If you do not wish to set these to a value,
  3016. simply press return at each of the prompts, and they will all be set to
  3017. zero.
  3018.  
  3019. 2. VIEW CHARACTER
  3020.    --------------
  3021.      This simply displays a character`s name along with his starting
  3022. location, status, movement list and eight character definitions. When
  3023. asked, enter the number of the character you wish to see (the range is
  3024. 1 to 254). When you have finished press return to get back to the menu.
  3025. 3. ERASE CHARACTER
  3026.    ---------------
  3027.      At the prompt `Please Enter Character Number:`, type any number
  3028. between 1 and 254. This character will then be erased.
  3029.  
  3030. 4. EXCHANGE CHARACTERS
  3031.    -------------------
  3032.      This function simply swaps two characters around. At the prompt
  3033. `Please enter first character number:`, type a number between 1 and
  3034. 254. If the character you have selected does not exist, you will be
  3035. returned immediately to the character menu. At the prompt `Please enter
  3036. second character number:`, type any number between 1 and 254. If the
  3037. character exists, it will be swapped with the character you first
  3038. entered.
  3039.  
  3040. 5. PAGE CHARACTERS
  3041.    ---------------
  3042.      This displays all the characters and allows you to flick through
  3043. them twenty at a time. To move left type 1, to move right type 2. To
  3044. return to the character menu just type 0. Displayed to the right of the
  3045. character in brackets is the start location of the character.
  3046.  
  3047. 6. SET DEFINITIONS
  3048.    ---------------
  3049.      These are set in exactly the same way as object definitions with
  3050. exactly the same effect (except these are for characters of course), so
  3051. please look there for any required explanation.
  3052.  
  3053. 7. CLEAR ALL CHARACTERS
  3054.    --------------------
  3055.      You will be asked `Are you sure you want to clear all
  3056. characters?`. Type `Y` or any word beginning with `Y` and all the
  3057. characters will be cleared. You will then be returned to the character
  3058. menu.
  3059.  
  3060. Returning back to the Main Menu.
  3061.  
  3062. FILE MENU
  3063. ---------
  3064.  
  3065. ***********************************************************************
  3066. ***                            FILE MENU                            ***
  3067. ***********************************************************************
  3068.  
  3069.                             1. LOAD FILE
  3070.                             2. SAVE FILE
  3071.                             3. DELETE FILE
  3072.                             4. GRAPHIC CONTROL
  3073.                             5. MODULE CONTROL
  3074.                             6. SAVE ADVENTURE
  3075.  
  3076.                             E. EXIT TO MAIN MENU
  3077.  
  3078.  
  3079. 1. FILE MENU
  3080.    ---------
  3081.      This function allows you to load a previously saved data file.
  3082. Simply push in the disk that contains the file and select this
  3083. function. The disk will then be directoried and all adventure files
  3084. displayed in a list, numbered from 1 to 6. At the prompt `Please enter
  3085. file number:`, simply type the number of the file you wish to load (1
  3086. to 6) and press return. Typing 0 will return you to the file menu.
  3087.  
  3088. 2. SAVE FILE
  3089.    ---------
  3090.      This function allows you to save the game currently in memory as a
  3091. data file. Simply push in the disk that you wish to save the file on
  3092. and select the function. The disk will then be directoried and all
  3093. adventure files displayed in a list, numbered from 1 to 6. At the
  3094. prompt `Please enter file number:`, simply type the number of the file
  3095. you wish to save (1 to 6) and press return. Typing 0 will return you to
  3096. the file menu.
  3097.  
  3098. 3. DELETE FILE
  3099.    -----------
  3100.      This function deletes a data or adventure file from the disk.
  3101. Simply push in the disk that you wish to delete a file from and select
  3102. this function.  The disk will then be directoried and all adventure
  3103. files displayed in a list, numbered from 1 to 6. At the prompt `Please
  3104. enter file number:`, simply type the number of the file you wish to
  3105. delete (1 to 6) and press return. Typing 0 will return you to the file
  3106. menu.
  3107.  
  3108. 4. GRAPHIC CONTROL
  3109.    ---------------
  3110.      This function allows you to examine a graphic that is saved on
  3111. disk. Simply push in the disk which contains the graphic and select
  3112. this function. At the prompt `Please enter graphic number to display:`
  3113. type any number between 0 and 15 - anything else returns you to the
  3114. file menu. The graphic (assuming it is found) will now be displayed.
  3115. Press any key to return to the file menu.
  3116.  
  3117. [NOTE: To include graphics in your adventures they must be saved in IFF
  3118. format (the type used by Deluxe Paint). They must also have the name
  3119. FRACPIC00 (where the number is changed to match the graphic number -
  3120. e.g. FRACPIC01, FRACPIC02 etc.). Also the disk that contains the
  3121. graphics and music must be in the internal drive when the adventure is
  3122. running.]
  3123.  
  3124. [NOTE: To include music in your adventures they must be saved using
  3125. ProTracker, and given the name FRAC1 (upto FRAC6). They will be saved
  3126. on disk as mod.FRAC1, mod.FRAC2 etc. and should be located on the
  3127. adventure`s boot disk.]
  3128.  
  3129.  
  3130.  
  3131.  
  3132.  
  3133. 5. MODULE CONTROL
  3134.    --------------
  3135.      Selecting this brings up the following menu:
  3136.  
  3137. ***********************************************************************
  3138. ***                            PLAY MODULE                          ***
  3139. ***********************************************************************
  3140.  
  3141.                             1. PLAY MODULE 1
  3142.                             2. PLAY MODULE 2
  3143.                             3. PLAY MODULE 3
  3144.                             4. PLAY MODULE 4
  3145.                             5. PLAY MODULE 5
  3146.                             6. PLAY MODULE 6
  3147.                             7. STOP PLAYING
  3148.  
  3149.                             E. <EXIT>
  3150.  
  3151. Simply select the module you wish to hear by typing the number, or 7 to
  3152. stop playing. Returning to the File Menu.
  3153.  
  3154. 6. SAVE ADVENTURE
  3155.    --------------
  3156.      This function allows you to save the game currently in memory as
  3157. an adventure file. Simply push in the disk that you wish to save the
  3158. file on and select the function. The disk will then be directoried and
  3159. all adventure files displayed in a list, numbered from 1 to 6. At the
  3160. prompt `Please enter file number:`, simply type the number of the file
  3161. you wish to save (1 to 6) and press return. Typing 0 will return you to
  3162. the file menu.
  3163.  
  3164. PLAY ADVENTURE
  3165. --------------
  3166.      This function allows you to test your game by placing you directly
  3167. into the game world. To return to the main menu either press return
  3168. without typing anything or press control and C (the latter is the
  3169. emergency override, which will escape under any circumstances).
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.  
  3185.  
  3186.  
  3187. OPTIONS MENU
  3188. ------------
  3189.      The Options Menu allows you to set your personal preferences while
  3190. FRAC is in operation. These options are saved with the file, so any
  3191. options you set will be game specific. It looks like this:
  3192.  
  3193. ***********************************************************************
  3194. ***                           OPTIONS MENU                          ***
  3195. ***********************************************************************
  3196.  
  3197.                          1. SET PLAYER LOCATION
  3198.                          2. UNKNOWN WORD TRAPPING IS:          OFF
  3199.                          3. VISIBLE EXIT REPORT IS:            ON
  3200.                          4. VISIBLE OBJECT REPORT IS:          ON
  3201.                          5. VISIBLE CHARACTER REPORT IS:       ON
  3202.                          6. DESCRIPTION FORMATTING IS:         ON
  3203.                          7. SET OBJECT REFERENCE TEXT
  3204.                          8. SET CHARACTER REFERENCE TEXT
  3205.                          9. SET MULTIPLE COMMAND ENTRY TEXT
  3206.                          0. BOOT MUSIC IS:                     ON
  3207.  
  3208.                          E. EXIT TO MAIN MENU
  3209.  
  3210. 1. SET PLAYER START LOCATION
  3211.    -------------------------
  3212.      This allows you to specify at which location the player will start
  3213. at, at the beginning of the adventure. Once you select this function
  3214. you will be told the previous start location (the default is one), and
  3215. asked to input a new one. If you wish to leave it unchanged just type
  3216. 0, otherwise type a number between 1 and 254.
  3217.  
  3218. 2. UNKNOWN WORD TRAPPING
  3219.    ---------------------
  3220.      This and the next few functions are known as `toggle` functions.
  3221. This means that if they are selected it changes the status from on to
  3222. off, or off to on. If a toggle function is selected twice in succession
  3223. it will be returned to its initial status. The default for unknown word
  3224. trapping is off. This means that any words the player enters that FRAC
  3225. does not understand will be ignored. For example if only the verb take
  3226. and the object gun have been defined, and the following was input:
  3227.  
  3228.      take the loaded gun
  3229.  
  3230. FRAC would remove all words it did not recognise, so it would become:
  3231.  
  3232.      take gun
  3233.  
  3234. You can see that this is a far easier input to test for. As long as
  3235. conjunctions remain undefined this is a very useful system, since it
  3236. allows FRAC to just guess roughly what the player is trying to say -
  3237. instead of following some strict syntax rules. Although I would advise
  3238. you to use this method, this can be deactivated by switching unknown
  3239. word trapping on. Now the players input will not be altered (any words
  3240. FRAC does not understand will show up as `unknowns`).
  3241. 3. VISIBLE EXIT REPORT
  3242.    -------------------
  3243.      This, when activated, will add all the visible exits for that
  3244. location to the location description, or `there are no visible exits`
  3245. if there are none.
  3246.  
  3247. 4. VISIBLE OBJECT REPORT
  3248.    ---------------------
  3249.      This, when activated, will add any objects at that location to the
  3250. location description, or add nothing if there are none.
  3251.  
  3252. 5. VISIBLE CHARACTER REPORT
  3253.    ------------------------
  3254.      This, when activated, will add any characters at that location to
  3255. the location description, or add nothing if there are none.
  3256.  
  3257. 6. DESCRIPTION FORMATTING
  3258.    ---------------------
  3259.      If this is activated all text FRAC outputs will be formatted i.e.
  3260. no word will `go off the right hand edge`. This makes the text far more
  3261. readable - important since reading is what the player will be doing
  3262. most of the time.
  3263.  
  3264. 7. SET OBJECT REFERENCE TEXT
  3265.    -------------------------
  3266.      This allows you to specify what words will cause FRAC to look for
  3267. the last object the player has typed on the same line, and then change
  3268. the word into that object. This may sound a really weird function,
  3269. until I tell you a prime example (and the only one I can think of)
  3270. would be the pronoun `it`. So if the object reference text was set to
  3271. `it` (this may also have synonyms e.g. it.synonym1.synonym2 etc.) and
  3272. the following text was entered by the player:
  3273.  
  3274.      take the pebble and throw it at gelfand
  3275.  
  3276. FRAC will see the `it` and change the sentence to:
  3277.  
  3278.      take the pebble and throw pebble at gelfand
  3279.  
  3280. Now the sentence is much easier to examine - especially if you have set
  3281. the multiple command entry text to and.then. This will mean the above
  3282. sentence will be broken into two separate inputs like this:
  3283.  
  3284.      take the pebble
  3285.      throw pebble at gelfand
  3286.  
  3287. This function is essential if you want to be able to handle more than
  3288. one command on the same line, and although this does not have a
  3289. default, you should set it to `it`.
  3290.  
  3291.  
  3292.  
  3293.  
  3294.  
  3295. 8. SET CHARACTER REFERENCE TEXT
  3296.    ----------------------------
  3297.      This allows you to specify what words will cause FRAC to look for
  3298. the last character the player has typed on the same line, and then
  3299. change the word into that character. Again this may sound like a really
  3300. weird function, until I tell you that a prime example would be the
  3301. pronoun `him` (it may also have a synonym e.g. him.her). So if the
  3302. character reference text was set to him.her, and the player entered the
  3303. following text:
  3304.  
  3305.      take the stick off gelfand and hit him with it
  3306.  
  3307. FRAC would amend it to read:
  3308.  
  3309.      take the stick off gelfand and hit gelfand with stick
  3310.  
  3311. Again if the multiple entry text was set, the following two inputs
  3312. would result:
  3313.  
  3314.      take the stick off gelfand
  3315.      hit gelfand with stick
  3316.  
  3317. This function is also essential if you want be able to handle more than
  3318. one command on the same line, and although this does not have a
  3319. default, you should set it to `him.her`.
  3320.  
  3321. 9. SET MULTIPLE COMMAND ENTRY TEXT
  3322.    -------------------------------
  3323.      This allows you to specify the words that will make FRAC treat
  3324. whatever follows next as a separate command. For example, if you set
  3325. this to and.then, the following sentence:
  3326.  
  3327.      take the diamond and move north then drop the diamond
  3328.  
  3329. would become:
  3330.  
  3331.      take the diamond
  3332.      move north
  3333.      drop the diamond
  3334.  
  3335. This function is essential if you want to be able to handle more than
  3336. one command on the same line, and although this does not have a
  3337. default, you should set it to `and.then`.
  3338.  
  3339. 0. BOOT MUSIC
  3340.    ----------
  3341.      This sets whether you wish to hear the music while FRAC is
  3342. loading. Simply select on or off for yes or no - a file called
  3343. frac.prefs will then be amended, so the disk should be write enabled
  3344. before calling this function.
  3345.  
  3346. This concludes my examination into the Options Menu, and so I return to
  3347. the Main Menu.
  3348.  
  3349. 9. CLEAR MEMORY
  3350.    ------------
  3351.      Upon selecting this you will be asked `Are you sure you want to
  3352. clear all the memory?`. If you type `Y` or any word beginning with `Y`,
  3353. everything will be cleared (objects, characters, exits, location,
  3354. descriptions - everything). You will then be returned to the main menu.
  3355.  
  3356. 0. ENTER FRACTOL
  3357.    -------------
  3358.      This will take you into the FRACTOL programming environment. To
  3359. return to the Main Menu press escape at any time. For a list of
  3360. commands press help, and to hold the display press tab. The remainder
  3361. of this manual is set aside to explain FRACTOL.
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.  
  3370.  
  3371.  
  3372.  
  3373.  
  3374.  
  3375.  
  3376.  
  3377.  
  3378.  
  3379.  
  3380.  
  3381.  
  3382.  
  3383.  
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.  
  3390.  
  3391.  
  3392.  
  3393.  
  3394.  
  3395.  
  3396.  
  3397.  
  3398.  
  3399.  
  3400.  
  3401.  
  3402.  
  3403. THE FRACTOL PROGRAMMING MANUAL
  3404. ==============================
  3405.  
  3406. FRACTOL stands for Fantasy Roleplaying Adventure Creators Operating
  3407. Language. It is an interpreted language, similar in many respects to
  3408. BASIC, but with an instruction set specifically designed to be used for
  3409. the writing of adventure games. Since I have already covered how BASIC
  3410. works in great detail at the beginning of this project, there is no
  3411. need to over elaborate here - except to remind the user that each
  3412. instruction is executed one after another until the end of the program
  3413. is reached, or an instruction is encountered which alters the sequence
  3414. of execution - such as goto. Before each instruction is examined,
  3415. procedures will be discussed and also the FRACTOL environment command,
  3416. which allows you to manipulate lines and procedures with ease.
  3417.  
  3418.  
  3419. AN INSTRUCTION IN FRACTOL
  3420. -------------------------
  3421.      Every instruction you enter into FRACTOL must begin with a line
  3422. number between 0 and 254. This decides the order is which the
  3423. instruction is executed: the computer simply start at the lowest and
  3424. works upwards until all the lines have been executed. After the line
  3425. number comes a statement. At present there are twenty three commands to
  3426. choose from which may be used in a statement, each having a unique
  3427. effect. Another way of stating the rules which define the way in which
  3428. an instruction is constructed, or its `syntax`, it to symbols such as
  3429. the following:
  3430.  
  3431.                                   =========     ===========
  3432.      Instruction syntax:     -----|Integer|-----|Statement|-----
  3433.                                   =========     ===========
  3434.  
  3435. This is my interpretation of what is known as a syntax diagram. You
  3436. simply follow the line from left to right, and every time you come
  3437. across a box you know that whatever it says in the box is now expected.
  3438. If the box has double lines it means whatever it says in the box is
  3439. defined elsewhere, and so you must look there for its definition -
  3440. which will also be described using syntax diagrams.
  3441.  
  3442.  
  3443.  
  3444.  
  3445.  
  3446.  
  3447.  
  3448.  
  3449.  
  3450.  
  3451.  
  3452.  
  3453.  
  3454.  
  3455.  
  3456.  
  3457. Here is the syntax diagram for an integer and a digit:
  3458.  
  3459.                  ------<------
  3460.                  |  =======  |                    ---
  3461.      Integer:  -----|Digit|-----     Digit:  -----|0|-----
  3462.                     =======                     | --- |
  3463.                                                 | --- |
  3464.                                                 |-|1|-|
  3465.                                                 | --- |
  3466.                                                 | --- |
  3467.                                                 |-|2|-|
  3468.                                                 | --- |
  3469.                                                 | --- |
  3470.                                                 |-|3|-|
  3471.                                                 | --- |
  3472.                                                 | --- |
  3473.                                                 |-|4|-|
  3474.                                                 | --- |
  3475.                                                 | --- |
  3476.                                                 |-|5|-|
  3477.                                                 | --- |
  3478.                                                 | --- |
  3479.                                                 |-|6|-|
  3480.                                                 | --- |
  3481.                                                 | --- |
  3482.                                                 |-|7|-|
  3483.                                                 | --- |
  3484.                                                 | --- |
  3485.                                                 |-|8|-|
  3486.                                                 | --- |
  3487.                                                 | --- |
  3488.                                                 |-|9|-|
  3489.                                                   ---
  3490.  
  3491. This means that an integer must have at least one digit but may be
  3492. followed by more (the line above the digit box means that you may loop
  3493. back if necessary - so that more digits are possible). A digit is
  3494. defined as a single character between 0 and 9. Although above it states
  3495. that an integer may be followed by any number of digits, this, in
  3496. practice, is not true. FRAC places a limit of 254 on any integer, and
  3497. anything above this value will `clock around` e.g. 255 will become 0,
  3498. 256 becomes 1, 257 becomes 2 etc.. In the above syntax of an integer,
  3499. negative numbers are not possible, although FRAC does handle them: they
  3500. must be formed inside expressions (see later). Therefore the lower
  3501. limit of a FRAC integer is zero. Using the syntax diagrams, and taking
  3502. into account the range restrictions mentioned above, here are some
  3503. valid integers:
  3504.  
  3505.           0000001
  3506.               254
  3507.               176
  3508.               071
  3509.                84
  3510.      000000000000
  3511.                             ---
  3512.                       ---<--|:|------
  3513.                       |     ---     |
  3514.                       |  =========  |
  3515.      Statement:     -----|Command|-----
  3516.                          =========
  3517.  
  3518. This means that a statement is made up of at least one command, but may
  3519. be followed by more if a colon is used to separate each from the other.
  3520. Before any commands are discussed I would like to fully explain
  3521. procedures and their uses, and also the FRACTOL environment commands.
  3522.  
  3523. PROCEDURES
  3524. ----------
  3525.      A procedure is basically a way of separating your program into
  3526. smaller parts to aid readability and debugging methods. It does this by
  3527. forcing you to put each part of your program in a separate area, and
  3528. not one massively long listing. In FRACTOL, procedures are numbered
  3529. rather than named, and 0 to 254 is possible. It is important to stress
  3530. that each number has a specific use, and so you must be careful about
  3531. which one you are going to use. To help explain this here is a
  3532. flowchart which shows which procedures FRAC calls, and at what time it
  3533. calls them. Remember that when a procedure is called, each line is
  3534. executed (starting with the one with the lowest number) in sequence,
  3535. one after another until the end of the procedure is reached or the
  3536. return command (see later) is encountered. (The goto command may also
  3537. have been used to alter the order of execution).
  3538.      Firstly when any FRAC adventure is started, procedure zero is
  3539. called. This is extremely useful if you wish to have a title page or
  3540. some kind of introduction which is separate from the main adventure. On
  3541. entering the `Main loop`, procedure 253 - the recurrent list is called.
  3542. The usual function of this is to display the current location
  3543. description using the print command, and then add 1 to the turn
  3544. counter, but of course you may put anything you like here. After
  3545. procedure 253 has finished executing, control returns to FRAC where it
  3546. will take input from the player and convert whatever is typed into
  3547. verbs, words, objects, characters and unknowns, and then process this
  3548. for object and character references (if defined) and also multiple
  3549. command entry (if this is found to be true, FRAC will automatically
  3550. repeat the line until all the individual commands have been entered).
  3551.      The next thing FRAC does might sound a little strange until you
  3552. understand the reasoning behind it. FRAC will jump to the procedure
  3553. number given by the player`s current location. E.g. if the player is
  3554. currently at location 26, procedure 26 will be executed. Procedures 1
  3555. to 252 are called local lists because they are directly linked to the
  3556. location they have the same number as, and so represent commands local
  3557. to that area. To give an example, say there was a statue at location 3,
  3558. and no others anywhere else in the adventure; you would wish commands
  3559. such as `examine statue` and `hit statue` to only work when the player
  3560. is at location 3. This can be done under the present system by simply
  3561. placing the instructions which handle such events within procedure 3,
  3562. they will then only be executed at the relevant time (i.e. when the
  3563. player is at location 3). [Continued after diagram].
  3564.  
  3565.                               -------
  3566.                               |Start|
  3567.                               -------
  3568.                                  |
  3569.    --------------------------------------------------------------------
  3570.    |Initialisation - all variables set to zero, all flags set to false|
  3571.    --------------------------------------------------------------------
  3572.                                  |
  3573.                ------------------------------------------
  3574.                |Procedure 0 - the introduction is called|
  3575.                ------------------------------------------
  3576. ---------------------------------|
  3577. |             ----------------------------------------------
  3578. |             |Procedure 253 - the recurrent list is called|
  3579. |             ----------------------------------------------
  3580. |                                 |
  3581. |                   --------------------------------
  3582. |                   |Move all Non Player Characters|
  3583. |                   --------------------------------
  3584. |                                 |
  3585. |                      --------------------------
  3586. |                      |Accept input from player|
  3587. |                      --------------------------
  3588. |                                 |
  3589. | ---------------------------------------------------------------------
  3590. | |Jump to the procedure number of the players location - a local list|
  3591. | | E.g. if the player was at location 4, procedure 4 would be called |
  3592. | ---------------------------------------------------------------------
  3593. |                                 |
  3594. |                                / \
  3595. |                    ----------------------------
  3596. |                    |Was an IF command found to| YES
  3597. |                    |be true in the procedure  |----------------------
  3598. |                    |just called?              |                     |
  3599. |                    ----------------------------                     |
  3600. |                                \ / NO                               |
  3601. |                                 |                                   |
  3602. |     --------------------------------------------------------------- |
  3603. |     |Procedure 254 - general list is called to handle general case| |
  3604. |     --------------------------------------------------------------- |
  3605. |                                 |                                   |
  3606. |                                 |------------------------------------
  3607. |                                / \
  3608. |                NO ------------------------------
  3609. --------------------|Is the player location zero?|
  3610.                     ------------------------------
  3611.                                 \ / YES
  3612.                                  |
  3613.                                ------
  3614.                                |Stop|
  3615.                                ------
  3616.  
  3617.  
  3618.  
  3619. Once execution of this procedure has been finished, FRAC will check to
  3620. see if any IF statements just executed were true by testing flag zero
  3621. (see flags). If flag zero is false (i.e. none were found to be true)
  3622. then procedure 254 - the general list is called to consider the general
  3623. case. This removes the need to have `get` and `drop` instructions at
  3624. every single location in the adventure, since they can now simply be
  3625. placed once in the general list. You should find writing adventures
  3626. using this system far simpler and more effective than using other
  3627. existing methods.
  3628.  
  3629. FRACTOL EDITOR COMMANDS
  3630. -----------------------
  3631.      While you are in FRACTOL there are a number of commands
  3632. specifically designed to manipulate lines and procedures. To get a full
  3633. list of these simply press the help key, although do not forget that if
  3634. you wish to edit a previously typed line you must use the `history
  3635. buffer` discussed earlier. The first command we shall examine is list
  3636. (or l). This lists all the lines in the procedure you are currently
  3637. pointing to. It may be followed by the parameter startline which will
  3638. start the listing at a line specified by you. E.g.
  3639.  
  3640.      LIST         (will list the whole procedure)
  3641.      LIST 10      (will list all the lines following and including 10)
  3642.      LIST 150     (will list all the lines following and including 150)
  3643.  
  3644. You may also enter a second parameter endline which will specify the
  3645. line at which the listing should stop. E.g.
  3646.  
  3647.      LIST 26 46   (will list lines between 26 and 46 inclusive)
  3648.  
  3649. The delete (or del or d) function erases a line in the current
  3650. procedure, from memory. E.g.
  3651.  
  3652.      DELETE 8     (will delete line 8)
  3653.  
  3654.      Again you may specify an endline, in which case the entire range
  3655. is deleted.
  3656.  
  3657.      DELETE 16 90 (will delete lines 16 to 90 inclusive)
  3658.  
  3659. The erase command erases all the lines in the specified procedure. E.g.
  3660.  
  3661.      ERASE 1      (will erase procedure 1)
  3662.  
  3663. A range may be specified by adding another parameter called endline.
  3664.  
  3665.      ERASE 0 4    (will erase procedures 0 and 4 inclusive)
  3666.  
  3667. The copy command requires two parameters: the source, and the
  3668. destination procedure. E.g.
  3669.  
  3670.      COPY 49 52   (will copy procedure 49 to procedure 52, erasing
  3671.                   anything that was previously stored at procedure 52).
  3672.  
  3673. The move command is similar to copy in that it requires two parameters,
  3674. but this time once the source procedure has been copied it is erased.
  3675. E.g.
  3676.  
  3677.      MOVE 10 254  (will move procedure 10 to procedure 254 - erasing
  3678.                   anything that was previously there, and then
  3679.                   procedure 10 will be erased).
  3680.  
  3681. Renumber (or r) is one of the most useful commands if you are a tidy
  3682. person. It renumbers all the lines in the current procedure using your
  3683. parameters, and then automatically corrects all GOTO`s so that they
  3684. still point to the same line. It requires two number: the startline and
  3685. the gap. The startline simply specifies what line the first renumbered
  3686. line will become. The gap parameter specifies how many numbers will be
  3687. in between each line. E.g. if the following program was renumbered
  3688. using R 10 3 it would look like the one below.
  3689.  
  3690. BEFORE
  3691.      30 CLS
  3692.      35 PRINT "HELLO"
  3693.      40 GOTO 35
  3694.  
  3695. AFTER
  3696.      10 CLS
  3697.      13 PRINT "HELLO"
  3698.      16 GOTO 13
  3699.  
  3700. Lock (or p) changes the current procedure. It has just one parameter:
  3701. the new procedure number. E.g.
  3702.  
  3703.      LOCK 12      (will make the current procedure number 12).
  3704.  
  3705. The HOLD command simply toggles display hold on/off. When display hold
  3706. is on, the current procedure will be relisted every time you press
  3707. return - allowing you to see the new listing as you enter a new line.
  3708. This in no way effects FRACTOL`s execution, and is merely there for
  3709. your preference.
  3710.  
  3711. HELP (or H) displays a complete list of the above commands, along with
  3712. a short description and the parameters you must use when entering them.
  3713.  
  3714. EXIT (or E) simply returns you to the main menu (escape also does
  3715. this).
  3716.  
  3717.  
  3718.  
  3719.  
  3720.  
  3721.  
  3722.  
  3723.  
  3724.  
  3725.  
  3726.  
  3727. While inside FRACTOL there are a number of variables you can influence.
  3728. A complete list is given below.
  3729.  
  3730.     OBJLOC (1 TO 254)    :    This affects an object`s location. For
  3731.                               example, if you set OBJLOC(5) to 10 then
  3732.                               object 5 would be moved to location 10.
  3733.  
  3734.     CHARSTATUS (1 TO 254):    This allows you to check or set a
  3735.                               characters status. E.g. if you set
  3736.                               CHARSTATUS(3) to 47, character 3 would
  3737.                               now have a status of 47.
  3738.  
  3739.     CHARLOC (0 TO 254)   :    CHARLOC allows you to alter a characters
  3740.                               location. Charloc zero represents the
  3741.                               player`s location, while charlocs 1 to
  3742.                               254 represent characters 1 to 154.
  3743.  
  3744.     VAR (0 TO 254)       :    VAR stands for variable. This area is not
  3745.                               used by FRAC and is completely left to
  3746.                               the users own uses. Each storage area can
  3747.                               hold a single integer.
  3748.  
  3749.     X,Y and Z            :    These three have a special use in FRACTOL
  3750.                               (see the IF command), but can be treated
  3751.                               as a storage location for a single
  3752.                               integer.
  3753.  
  3754.     OBJDEF (1 TO 254,1 TO 8): This allows you to test and modify any
  3755.                               object definition. For example,
  3756.                               OBJDEF(12,1) would access object 12`s
  3757.                               first definition.
  3758.  
  3759.     CHARDEF (1 TO 254,1 TO 8):This allows you to test and modify any
  3760.                               character definition. For example,
  3761.                               CHARDEF(16,2) would access character 16`s 
  3762.                               second definition.
  3763.  
  3764.     FLAG (0 TO 254)     :     Flags are different from the variables
  3765.                               discussed so far. Flags do not store
  3766.                               integer values, but must be set to one of
  3767.                               two states: true or false. When trying to
  3768.                               understand flags, it is best to imagine a
  3769.                               little man with a signalling flag in his
  3770.                               hand. All 255 of the little men start
  3771.                               with their flags pointing towards the
  3772.                               ground (false). But you can make them
  3773.                               hold up their flags by setting them to
  3774.                               true; they will remain in this state
  3775.                               until set to false again.
  3776.  
  3777. Now that we have discussed how the language works and also the commands
  3778. which manipulate it, we must now examine the commands themselves. This
  3779. will be done mainly through the use of syntax diagrams, although text
  3780. descriptions will also be presented.
  3781. There now follows the complete syntax diagram for a command.
  3782.  
  3783.                      ============
  3784.      Command:   -----|    IF    |-----
  3785.                   |  ============  |
  3786.                   |  ============  |
  3787.                   |--|    LET   |--|
  3788.                   |  ============  |
  3789.                   |  ------------  |
  3790.                   |--|    CLS   |--|
  3791.                   |  ------------  |
  3792.                   |  ============  |
  3793.                   |--|   WRITE  |--|
  3794.                   |  ============  |
  3795.                   |  ============  |
  3796.                   |--|   PRINT  |--|
  3797.                   |  ============  |
  3798.                   |  ============  |
  3799.                   |--|  GRAPHIC |--|
  3800.                   |  ============  |
  3801.                   |  ============  |
  3802.                   |--|   MUSIC  |--|
  3803.                   |  ============  |
  3804.                   |  ============  |
  3805.                   |--| PROCEDURE|--|
  3806.                   |  ============  |
  3807.                   |  ============  |
  3808.                   |--|  REMARK  |--|
  3809.                   |  ============  |
  3810.                   |  ------------  |
  3811.                   |--| READLINE |--|
  3812.                   |  ------------  |
  3813.                   |  ============  |
  3814.                   |--|   FOR    |--|
  3815.                   |  ============  |
  3816.                   |  ============  |
  3817.                   |--|   GOTO   |--|
  3818.                   |  ============  |
  3819.                   |  ------------  |
  3820.                   |--|  RETURN  |--|
  3821.                   |  ------------  |
  3822.                   |  ------------  |
  3823.                   |--|   NEXT   |--|
  3824.                   |  ------------  |
  3825.                   |  ============  |
  3826.                   |--|   LOAD   |--|
  3827.                   |  ============  |
  3828.                   |  ============  |
  3829.                   |--|   SAVE   |--|
  3830.                   |  ============  |
  3831.                   |  ============  |
  3832.                   |--|   TAB    |--|
  3833.                   |  ============  |
  3834.                   |                |
  3835.                   |  ------------  |
  3836.                   |--|  NORMAL  |--|
  3837.                   |  ------------  |
  3838.                   |  ------------  |
  3839.                   |--|   BOLD   |--|
  3840.                   |  ------------  |
  3841.                   |  ------------  |
  3842.                   |--|  ITALIC  |--|
  3843.                   |  ------------  |
  3844.                   |  ------------  |
  3845.                   |--|UNDERLINED|--|
  3846.                   |  ------------  |
  3847.                   |  ------------  |
  3848.                   |--|  INVERSE |--|
  3849.                   |  ------------  |
  3850.                   |  ------------  |
  3851.                   |--|  RESTART |--|
  3852.                      ------------
  3853.  
  3854. You can see that we have not yet defined very many commands fully,
  3855. since most require their own syntax diagrams (signified by double lines
  3856. - meaning that their definitions must be found elsewhere). Before the
  3857. syntax of any of the commands is discussed, I must first define things
  3858. which all commands use, such as expressions and conditions.
  3859.  
  3860. An expression is one of the most important structures in FRAC. Its
  3861. syntax is as follows:
  3862.  
  3863.                               ======================
  3864.      Expression:    ----------|      CONSTANT      |----------
  3865.                          |    ======================    |
  3866.                          |    ======================    |
  3867.                          |----|      VARIABLE      |----|
  3868.                          |    ======================    |
  3869.                          |    ======================    |
  3870.                          |----|BRACKETED EXPRESSION|----|
  3871.                               ======================
  3872.  
  3873.  
  3874.  
  3875.                           ------<------
  3876.                        ---| ==========|  ======================   ---
  3877. Bracketed Expression:--|(|--|OPERATOR|---|      CONSTANT      |---|)|--
  3878.                        --- |========== | ====================== ||---
  3879.                            |           | ====================== ||
  3880.                            |           |-|      VARIABLE      |-||
  3881.                            |           | ====================== ||
  3882.                            |           | ====================== ||
  3883.                            |           |-|BRACKETED EXPRESSION|-||
  3884.                            |             ======================  |
  3885.                            |                                     |
  3886.                            --------------------->-----------------
  3887.  
  3888.  
  3889.                       ------------   ======================
  3890.      Variable: -------|  OBJLOC  |---|BRACKETED EXPRESSION|------------
  3891.                  |  | ------------ | ======================           |
  3892.                  |  | ------------ |                                  |
  3893.                  |  |-|CHARSTATUS|-|                                  |
  3894.                  |  | ------------ |                                  |
  3895.                  |  | ------------ |                                  |
  3896.                  |  |-|  CHARLOC |-|                                  |
  3897.                  |  | ------------ |                                  |
  3898.                  |  | ------------ |                                  |
  3899.                  |  |-|    VAR   |-|                                  |
  3900.                  |  | ------------                                    |
  3901.                  |  | ------------                                    |
  3902.                  |  |-|     X    |------------------------------------|
  3903.                  |  | ------------                                    |
  3904.                  |  | ------------                                    |
  3905.                  |  |-|     Y    |------------------------------------|
  3906.                  |  | ------------                                    |
  3907.                  |  | ------------                                    |
  3908.                  |  |-|     Z    |------------------------------------|
  3909.                  |    ------------                                    |
  3910.                  |  ---------   --- ============ --- ============ --- |
  3911.                  |--|OBJDEF |---|(|-|EXPRESSION|-|,|-|EXPRESSION|-|)|--
  3912.                  |  --------- | --- ============ --- ============ ---  
  3913.                  |  --------- |
  3914.                  |--|CHARDEF|-|
  3915.                     ---------
  3916.  
  3917.      Relational:
  3918.  
  3919.  -------  ==================   ---      ------      ==================
  3920. -|INPUT|--|BRKT. EXPRESSION|---|=|------|VERB|------|BRKT. EXPRESSION|-
  3921. |-------| ==================|  --- ||   ------    | ==================|
  3922. | ----  |                   |      ||   ------    |                   |
  3923. |-|IN|--|                   | ---- ||---|WORD|----|                   |
  3924. | ----                      |-|<>|-||   ------    |                   |
  3925. |                             ----  |   --------  |                   |
  3926. |                                   |---|OBJECT|--|                   |
  3927. |                                   |   --------  |                   |
  3928. |                                   | ----------- |                   |
  3929. |                                   |-|CHARACTER|-|                   |
  3930. |                                     -----------                     |
  3931. |                                                                     |
  3932. |   ------   ======================   ---   ------                    |
  3933. |---|FLAG|---|BRACKETED EXPRESSION|---|=|---|TRUE|--------------------|
  3934. |   ------   ======================   --- | ------   |                |
  3935. |                                         | -------  |                |
  3936. |                                         |-|FALSE|--|                |
  3937. |                                           -------                   |
  3938. |                                                                     |
  3939. |   ==========   ==========   ============                            |
  3940. |---|VARIABLE|---|RELATION|---|EXPRESSION|----------------------------|
  3941.     ==========   ==========   ============
  3942.  
  3943.                       ---  ======  ---
  3944.      String:        --|"|--|TEXT|--|"|
  3945.                       ---  ======  ---
  3946.  
  3947.                        ---  ===========   -----   ===========  ---
  3948.      Condition:     ---|(|--|CONDITION|---|AND|---|CONDITION|--|)|----
  3949.                      | ---  =========== | ----- | ===========  ---  |
  3950.                      |                  | ----- |                   |
  3951.                      |                  |-|OR |-|                   |
  3952.                      |                    -----                     |
  3953.                      |                                              |
  3954.                      |                ============                  |
  3955.                      -----------------|RELATIONAL|-------->----------
  3956.                                       ============
  3957.                        ----
  3958.      Relational:    ---|= |---
  3959.                      | ---- |
  3960.                      | ---- |
  3961.                      |-|<>|-|
  3962.                      | ---- |
  3963.                      | ---- |
  3964.                      |-|<=|-|
  3965.                      | ---- |
  3966.                      | ---- |
  3967.                      |-|>=|-|
  3968.                        ----
  3969.  
  3970. There now follows a complete list of commands, along with the syntax
  3971. diagram and an informative description.
  3972.  
  3973.             ----  ===========  ------  ===========
  3974.      IF:  --|IF|--|CONDITION|--|THEN|--|STATEMENT|
  3975.             ----  ===========  ------  ===========
  3976.  
  3977. The IF command is one of the most (if not the most) important commands
  3978. in FRACTOL. It is the only command that allows statements to be
  3979. executed if certain specified conditions are met. If the condition is
  3980. found to be true, then the statement following the `then` is executed,
  3981. otherwise it is ignored. The only restriction is that the statement may
  3982. not contain another IF command i.e. you cannot `nest if`s`. Take a look
  3983. at the syntax table to see how they are formed. You will notice that a
  3984. condition may contain another condition. This means that theoretically
  3985. you may have an infinite amount of conditions - all inside each other,
  3986. but this of course is not possible in practice. Here are some example
  3987. conditions - study the syntax diagrams for each type as you progress,
  3988. as this will give you a much better understanding of them.
  3989.  
  3990.  
  3991.  
  3992.  
  3993.  
  3994.  
  3995.  
  3996.  
  3997. EXAMPLE 1
  3998.                          (X=2 OR X=3)
  3999.                               |
  4000.                           CONDITION
  4001.                             / | \
  4002.  
  4003.                     (CONDITION OR CONDITION)
  4004.                         |             |
  4005.                     RELATIONAL    RELATIONAL
  4006.                       / | \         / | \
  4007.  
  4008.       VARIABLE RELATION EXPRESSION  VARIABLE RELATION EXPRESSION
  4009.          |        |         |          |        |         |
  4010.          X        =         2          X        =         3
  4011.  
  4012.  
  4013. EXAMPLE 2
  4014.                         ((X=2 OR X=4) AND Y=1)
  4015.                                    |
  4016.                                CONDITION
  4017.                                  / | \
  4018.  
  4019.                       (CONDITION AND CONDITION)
  4020.                            |                |
  4021.                        CONDITION      RELATION
  4022.                          / | \         / | \
  4023.  
  4024.           (CONDITION OR CONDITION)   VARIABLE RELATION EXPRESSION
  4025.                |             |                |       |         |
  4026.            RELATIONAL   RELATIONAL            Y       =         1
  4027.              / | \        / | \
  4028.  
  4029. VARIABLE RELATION EXPRESSION  VARIABLE RELATION EXPRESSION
  4030.    |        |         |          |        |         |
  4031.    X        =         2          X        =         4
  4032.  
  4033.  
  4034. A condition must always have what is known as a boolean operator. This
  4035. decides under what circumstances the condition will be true. The `OR`
  4036. operator will produce the following results:
  4037.  
  4038.           (CONDITION1 OR CONDITION2)               RESULT
  4039.  
  4040.              FALSE          FALSE                  FALSE
  4041.              FALSE          TRUE                   TRUE
  4042.              TRUE           FALSE                  TRUE
  4043.              TRUE           TRUE                   TRUE
  4044.  
  4045. (i.e. if condition1 is false or condition2 is false, the result will be
  4046. false).
  4047.  
  4048.  
  4049.  
  4050.  
  4051.           (CONDITION1 AND CONDITION2)               RESULT
  4052.  
  4053.              FALSE          FALSE                   FALSE
  4054.              FALSE          TRUE                    FALSE
  4055.              TRUE           FALSE                   FALSE
  4056.              TRUE           TRUE                    TRUE
  4057.  
  4058. (i.e. if condition1 is false and condition2 is false, the result will
  4059. be false).
  4060.  
  4061. For example the following condition will only be true if X is one or
  4062. two, and Y is one - otherwise it is false. You should notice that any
  4063. single condition can be built up of any number of other conditions,
  4064. which are placed either side of the boolean operator.
  4065.  
  4066.           ((X=1 OR X=2) AND Y=1)
  4067.  
  4068.      So far the conditions we have looked at have only contained
  4069. variables. Conditions may also contain tests on flags. For example:
  4070.  
  4071.           (FLAG(1)=TRUE AND FLAG(20)=FALSE)
  4072.  
  4073. Another variation is the input variable, although this is not really a
  4074. variable in the sense that the others are, being `read` only. Input is
  4075. used to examine what the player has typed at the keyboard. The format
  4076. is:
  4077.  
  4078.           INPUT(1)  =  VERB(1)
  4079.                 |        |  |-------
  4080.                 |        |         |
  4081.                 |        CLASS  CLASS NUMBER
  4082.                 |
  4083.      WORD NUMBER (word used in the sense of a word and not the variable
  4084. word).
  4085.  
  4086. For example, if diamond was an object, frodo a character, take a verb
  4087. and from a word, the following input would be interpreted as below:
  4088.  
  4089.                take diamond from frodo
  4090.  
  4091.                verb(1) object(1) word(1) character(1)
  4092. Input number:    [1]     [2]      [3]       [4]
  4093.  
  4094. So the condition:
  4095.  
  4096. (((INPUT(1)=VERB(1) AND INPUT(2)=OBJECT(1)) AND INPUT(3)=WORD(3)) AND
  4097. INPUT(4)=CHARACTER(1))
  4098.  
  4099. would be true. While the condition: (INPUT(1)=VERB(4)) would be false,
  4100. since input(1) is not verb 4, but verb 1.
  4101.  
  4102.  
  4103.  
  4104.  
  4105.      But what if we wanted to have a general case which allowed you
  4106. `take` any object from any character (which is what the above condition
  4107. is testing for). Normally if we wanted to do this we would have to have
  4108. a line for every single object and character in the game - a monstrous
  4109. task. To get around this, FRAC allows you to have a general input. E.g.
  4110.  
  4111. (((INPUT(1)=VERB(1) AND INPUT(2)=OBJECT(X)) AND INPUT(3)=WORD(3)) AND
  4112. INPUT(4)=CHARACTER(Y))
  4113.  
  4114. The variables X and Y will take on the values of the object and
  4115. character that were actually input. You can then use this value to
  4116. reference the thing that was entered - so only one line would be
  4117. needed! This saves vast amounts of typing and is where the power of
  4118. FRACTOL lies. This flexibility allows you to create your own command
  4119. formats, although experimentation is recommended before complex
  4120. structures are attempted. Please examine the tutorial adventure `Escape
  4121. from desert island` for a host of example IF statements.
  4122.  
  4123.               -----  ------  ======================  ---   ------
  4124.      LET:   --|LET|--|FLAG|--|BRACKETED EXPRESSION|--|=|---|TRUE|---
  4125.               ----- |------  ======================  --- | ------  |
  4126.                     |                                    | ------- |
  4127.                     |                                    |-|FALSE|-|
  4128.                     |                                      ------- |
  4129.                     |  ==========  ---   -----   ============      |
  4130.                     |--|VARIABLE|--|=|---|RND|---|EXPRESSION|------|
  4131.                        ==========  --- | ----- | ============
  4132.                                        ---------
  4133.  
  4134. The LET command assigns a variable to a value, or a flag to true or
  4135. false. If the word is placed before the expression then a number is
  4136. picked randomly within the range 1 to the value of the expression. For
  4137. example, enter the following program at location zero:
  4138.  
  4139.      10 LET VAR(0)=RND(100)
  4140.      20 PRINT "VALUE=",VAR(0)
  4141.      30 GOTO 10
  4142.  
  4143. and play the adventure. Press Control-C to return to the main menu. One
  4144. peculiarity that is not inherent in any other languages, is the fact
  4145. that you must place brackets around an expression if it has more than
  4146. one term. E.g.
  4147.  
  4148.      LET VAR(0)=(VAR(0)+1)
  4149.  
  4150. Whereas in BASIC you would type:
  4151.  
  4152.      LET VAR(0)=VAR(0)+1
  4153.  
  4154.                -----
  4155.      CLS:   ---|CLS|---
  4156.                -----
  4157. This command stands for clear screen, and it does just that. The print
  4158. position is moved to the top left hand corner of the screen.
  4159.                                               ---
  4160.                         ----------------------|,|---------------------
  4161.                -------  |   ==========        ---                    |
  4162.      WRITE: ---|WRITE|------|VARIABLE|---------------------------------
  4163.              | ------- | |  ==========                              |
  4164.              | ------- | |   -------------      =================== |
  4165.              |-|PRINT|-| |---|DESCRIPTION|------|BRAKT. EXPRESSION|--  
  4166.                -------   | | -------------  |   =================== |
  4167.                          | | ---------      |                       |
  4168.                          | |-|OBJNAME|-------                       |
  4169.                          | | ---------      |                       |
  4170.                          | | ----------     |                       |
  4171.                          | |-|CHARNAME|------                       |
  4172.                          |   ----------                             |
  4173.                          | --------                                 |
  4174.                          |-|STRING|----------------------------------
  4175.                            --------
  4176.  
  4177. This displays text, variables, descriptions, object names or character
  4178. names to the screen. A comma is used to separate different types. For
  4179. example:
  4180.  
  4181.      WRITE "You scored:",VAR(0)," points."
  4182.      WRITE "You take the ",OBJNAME(X)
  4183.      WRITE DESCRIPTION(12)
  4184.      WRITE DESCRIPTION(CHARLOC(0))
  4185.      WRITE CHARNAME(VAR(1)),"greets you heartily."
  4186.  
  4187.      PRINT:    This is exactly the same as write except a carriage
  4188.                return is executed after printing the text.
  4189.  
  4190.                   ---------   ============
  4191.      GRAPHIC:  ---|GRAPHIC|---|EXPRESSION|---
  4192.                   ---------   ============
  4193.  
  4194. The expression should evaluate to a number between 0 and 15, otherwise
  4195. it will be ignored. This will simply display the graphic with the
  4196. specified number.
  4197.  
  4198.                   -------   ============
  4199.      MUSIC:    ---|MUSIC|---|EXPRESSION|---
  4200.                   -------   ============
  4201.  
  4202. The expression should evaluate to a number between 1 and 6, otherwise
  4203. it will be ignored. The relevant music will be loaded into memory and
  4204. played.
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.                   -----------   ============
  4214.      PROCEDURE:---|PROCEDURE|---|EXPRESSION|----
  4215.                 | ----------- | ============
  4216.                 |   ------    |
  4217.                 |---|PROC|----|
  4218.                     ------
  4219.  
  4220. This will execute the specified procedure (must be between 0 and 254 or
  4221. will be ignored). Control will then return to immediately after this
  4222. command (if there are more commands on the same line, these will be
  4223. executed before the next line is examined). Note: If any variables are
  4224. altered in the procedure you called, they will remain changed when you
  4225. return.
  4226.  
  4227.                   --------   ========
  4228.      REMARK:   ---|REMARK|---|STRING|----
  4229.                 | -------- | ========
  4230.                 |  -----   |
  4231.                 |--|REM|---|
  4232.                    -----
  4233.  
  4234. This command has no effect, it merely allows you to annotate your
  4235. listings.
  4236.  
  4237.                   ------   ============
  4238.      GOTO:     ---|GOTO|---|EXPRESSION|---
  4239.                   ------   ============
  4240.  
  4241. Goto changes the order of execution. The specified line number is
  4242. `jumped` to - execution will continue there.
  4243.  
  4244.  
  4245.      FOR:
  4246.  
  4247.   ----- ----- =================== --- ============  ----  ============
  4248. --|FOR|-|VAR|-|BRAKT. EXPRESSION|-|=|-|EXPRESSION|--|TO|--|EXPRESSION|-
  4249.   ----- ----- =================== --- ============ |----| ============
  4250.                                                    |    |
  4251.                                                   --------
  4252.                                                   |DOWNTO|
  4253.                                                   --------
  4254.  
  4255. The for command allows you to repeat sections of your program a
  4256. specified number of times. The variable you have chosen will start at
  4257. the first value you have specified, and then be incremented by one (or
  4258. decremented by one if you used downto) each time the section is
  4259. repeated, until the value is equal to the second expression. For
  4260. example the following program would have the effect:
  4261.  
  4262.      10 FOR VAR(1)=2 TO 6
  4263.      20 PRINT VAR(1)
  4264.      30 NEXT
  4265.  
  4266.  
  4267. EFFECT:
  4268.  
  4269. 2
  4270. 3
  4271. 4
  4272. 5
  4273. 6
  4274.  
  4275. Or using downto:
  4276.  
  4277.      10 FOR VAR(1)=8 DOWNTO 3
  4278.      20 PRINT VAR(1)
  4279.      30 NEXT
  4280.  
  4281. EFFECT:
  4282.  
  4283. 8
  4284. 7
  4285. 6
  4286. 5
  4287. 4
  4288. 3
  4289.  
  4290. The next command is used to mark off the end of the section you wish to
  4291. see repeated - all lines inside this area are then repeated.
  4292. You may also `nest` for loops - i.e. you may place one loop inside the
  4293. other. FRAC supports this for up to eight levels (eight loops inside
  4294. each other). Here is an example:
  4295.  
  4296.      10 FOR VAR(1)=1 TO 10
  4297.      20 FOR VAR(2)=1 TO 12
  4298.      30 LET VAR(3)=(VAR(1)*VAR(2))
  4299.      40 PRINT VAR(1)," * ",VAR(2),"=",VAR(3)
  4300.      50 NEXT
  4301.      60 PRINT ""
  4302.      70 NEXT
  4303.  
  4304. This will display all the multiplication tables between 1 and 10, with
  4305. a gap in between each (the PRINT "" does this). I would suggest typing
  4306. this out and trying it if you have never used loops before.
  4307.  
  4308.                     ----------
  4309.      READLINE:   ---|READLINE|---
  4310.                   | ---------- |
  4311.                   |   ------   |
  4312.                   |---|READ|---|
  4313.                       ------
  4314.  
  4315. This simply accepts input from the player. You may then examine what
  4316. was typed using IF statements, as discussed earlier.
  4317.  
  4318.  
  4319.  
  4320.  
  4321.                     --------
  4322.      RETURN:     ---|RETURN|---
  4323.                   | -------- |
  4324.                   |  -----   |
  4325.                   |--|RET|---|
  4326.                      ----- 
  4327.  
  4328. Return forces the computer to return to the procedure which called it.
  4329. (This happens automatically when there are no more lines to execute, or
  4330. no lines in the procedure). If the PROCEDURE command was used to call
  4331. this procedure, FRACTOL will return to directly after this command. If
  4332. PROCEDURE was not used it means that FRAC itself must have called it,
  4333. and so it will return there so that the next stage may begin.
  4334.  
  4335.                   ------
  4336.      NEXT:     ---|NEXT|---
  4337.                   ------
  4338.  
  4339. Next forces the computer to increment or decrement the variable
  4340. declared in the for statement, and then return to the line immediately
  4341. after the for instruction. If you use this without declaring a for, you
  4342. will get the runtime error "NEXT WITHOUT FOR".
  4343.  
  4344.                   ------   ============
  4345.      SAVE:     ---|SAVE|---|EXPRESSION|---
  4346.                   ------   ============
  4347.  
  4348. This saves the current game position to disk. All variables are
  4349. written, and also the positions of characters etc. You may store up to
  4350. six game positions on one disk, and hence the expression you give must
  4351. evaluate to a number between 1 and 6 inclusive.
  4352.  
  4353.                   ------   ============
  4354.      LOAD:     ---|LOAD|---|EXPRESSION|---
  4355.                   ------   ============
  4356.  
  4357. This restores a previously saved game position. The expression must
  4358. evaluate to between 1 and 6, or the command will be ignored.
  4359.  
  4360.                   -----   ============   ---   ============
  4361.      TAB:      ---|TAB|---|EXPRESSION|---|,|---|EXPRESSION|---
  4362.                   -----   ============   ---   ============
  4363.  
  4364. This simply moves the cursor to the specified co-ordinates. The first
  4365. expression represents magnitude in the X plane, and the second
  4366. magnitude in the Y.
  4367.  
  4368. The commands NORMAL, BOLD, ITALIC, UNDERLINED, and INVERSE just change
  4369. the way in which any text is printed, and are really self-explanatory.
  4370. Consequently they will not be examined. They require no parameters.
  4371.  
  4372.  
  4373.  
  4374.  
  4375.                   ---------
  4376.      RESTART:  ---|RESTART|---
  4377.                   ---------
  4378.  
  4379. RESTART sets all variables back to their initial start values. You may
  4380. use this command if the player wishes to begin the adventure from
  4381. scratch.
  4382.  
  4383. This concludes the USER MANUAL.
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399.  
  4400.  
  4401.  
  4402.  
  4403.  
  4404.  
  4405.  
  4406.  
  4407.  
  4408.  
  4409.  
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.  
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.  
  4426.  
  4427.  
  4428.  
  4429.                          THE EVALUATION
  4430.                          ==============
  4431.  
  4432. Here I will attempt to discuss FRAC (now that it is complete) assuming
  4433. the role of a neutral, as this will allow me to accentuate its
  4434. limitations in an open manner - something which is essential if this
  4435. document is to be worthwhile.
  4436.  
  4437.      Usability:  For my own part I feel the usability of FRAC is one of
  4438. its better features - a view which has been emphasized by those who I
  4439. have chosen to share the development stages with. The only proof I
  4440. personally needed was when Peter, a complete non-programmer and general
  4441. techno retard, was able to write several short adventures with only a
  4442. two minute verbal introduction and a few late at night,`What do you
  4443. want? I want to go to bed!` question and answer sessions. (I had not
  4444. written the user manual at this time). The only flaw I can see in its
  4445. usability is that FRACTOL may be a bit difficult if left only with the
  4446. manual, and no possibility of the benefit of a direct line to the
  4447. author (although I would be happy to answer any queries by post). This
  4448. is a problem which cannot easily be overcome - an entire book could be
  4449. written merely describing the fundamentals of programming in a BASIC
  4450. type language. If you do have difficulty I suggest you perhaps play
  4451. around with BASIC for a while - only the elementary principles need to
  4452. be grasped - before moving onto FRACTOL (which should prove easier than
  4453. any BASIC implementation).
  4454.  
  4455.      Reliability:  Despite one bug which took an absolute age to track
  4456. down (due to its nature) I have been blessed by having only encountered
  4457. several `thought provoking` mess ups. Thankfully all of these have been
  4458. removed and in its present state FRAC is as bug-proof as any program
  4459. can claim to be. Due to time restrictions my documented testing of FRAC
  4460. is rather pathetic, which is a pity because a lot of time went into
  4461. making sure it did what it was supposed to. The only real way to judge
  4462. reliability is to use the software for yourself over an extended
  4463. period, as this is not possible in the case of an independent marker
  4464. you will have to take my word for it.
  4465.  
  4466.      Effectiveness:  I do not really know what to say about this. FRAC
  4467. is effective in that it has achieved its original aim i.e. to produce a
  4468. comprehensive adventure creation utility. To judge for myself how
  4469. effective FRAC is, I feel it is capable of creating any form of text
  4470. adventure without noticeable restriction, and so should score highly on
  4471. any `effectiveness scale`. But of course there are limitations.....
  4472.  
  4473.      Limitations:  I personally think the main limitation of FRAC is in
  4474. its graphic handling capabilities which are pretty rudimentary. Another
  4475. drawback is its text output speed for formatted text - but after seeing
  4476. the speed of another adventure creators text output I concluded that
  4477. FRAC was at least the same speed as it, so perhaps this is not really
  4478. that much of a problem - although there is certainly room for
  4479. improvement. The obvious limitations are where the amount of things are
  4480. concerned (e.g. the amount of characters, the amount of objects etc).
  4481. This can be partially overcome by the alteration of specific constants
  4482. - but I would recommend you leaving these as they are since there may
  4483. be difficulty accessing elements greater than 254 from FRACTOL (it can
  4484. only handle single constants upto a value of 254 - another limitation I
  4485. would like to see banished). There is also an inefficiency when
  4486. entering lines in FRACTOL (sometimes you have to wait about ten
  4487. seconds). This is caused by the (feeble) bubble sort routine which I
  4488. would like to scrap and replace with a much improved version - it would
  4489. move a line directly to where it is supposed to go and then reshuffle
  4490. all of the lines after it. At the time I was only concerned with
  4491. getting it working, but upon reflection this is a change I would
  4492. definitely make if given the opportunity. (I attribute this slip-up to
  4493. the reading of too many text books on programming theory while I was
  4494. writing FRAC - places where things like bubble sorts get rammed down
  4495. your throat as `miracles of creation`).
  4496.  
  4497.      Provision for future development:  Because of the highly
  4498. structured form Pascal enforces upon you, it is extremely easy to bolt
  4499. on additional pieces of code. Also since I made up commands in FRACTOL
  4500. as I went along, the programming is easily modified to insert any new
  4501. commands you might choose. As for Menu functions, this would be
  4502. difficult since most of the menus are full already - but the creation
  4503. of sub menus should allow you to make as many extra options as you
  4504. like. I would consider the source code for FRAC highly portable (with
  4505. the exception of music/graphic routines, and several procedures which
  4506. handle files). Although it is quite easy to upgrade FRAC, text
  4507. adventures are not exactly on `the pinnacle of human advancement and
  4508. endeavour` and so this has a limited significance here. This concludes
  4509. what I hope you find to be a fair evaluation of FRAC.
  4510.  
  4511.                               THE END
  4512.  
  4513. You also see a grape, a spanner and three packets of liquorice all-
  4514. sorts.
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.  
  4523.  
  4524.  
  4525.  
  4526.  
  4527.  
  4528.  
  4529.  
  4530.  
  4531.  
  4532.  
  4533.  
  4534.  
  4535.  
  4536.  
  4537.                     TECHNICAL REFERENCE MANUAL
  4538.                     ==========================
  4539. OVERALL PLAN
  4540. ------------
  4541.      The source code for FRAC is divided amongst 11 files: one main,
  4542. and ten external. There are several reasons for this. Firstly the
  4543. compiler I was using could not handle files anywhere near this large,
  4544. and so the separation was inevitable. In this state it can be
  4545. considered more readable, since all associated procedures are grouped
  4546. together. Another advantage is that if only one part is being edited,
  4547. for test purposes only this needs to be compiled - rather than
  4548. recompiling the whole lot (a task which takes some twenty five
  4549. minutes). There now follows a complete list of procedures with
  4550. reference being made to which source file they belong to.
  4551.  
  4552. ---------------------
  4553. | Source File: FRAC |
  4554. ---------------------
  4555.  
  4556. Procedures for output handling
  4557.  
  4558.      Cls
  4559.      CursorOn
  4560.      CursorOff
  4561.      Normal
  4562.      Bold
  4563.      Italics
  4564.      Underlined
  4565.      Inverse
  4566.      WriteEntry
  4567.      PrintEntry
  4568.      WriteType
  4569.      Row
  4570.  
  4571. Procedures for input handling
  4572.  
  4573.      ClearInput
  4574.      GetStringLen
  4575.      StringInput
  4576.      CharacterInput
  4577.      IntegerInput
  4578.      UpperCase
  4579.  
  4580. Procedures for list processing
  4581.  
  4582.      ClearLines
  4583.      ClearInterpret
  4584.      ClearInterpretBuffer
  4585.      ClearLocs
  4586.      ClearVerbs
  4587.      ClearWords
  4588.      ClearExits
  4589.      ClearObjects
  4590.      ClearCharacters
  4591.      ClearList
  4592.      CalcFreeMem
  4593.      LocateEnd
  4594.      StoreEntry
  4595.      UpdateList
  4596.      EraseEntry
  4597.      CombineEntries
  4598.      Initialise
  4599.      ClearMem
  4600.  
  4601. Procedures for Run-Time handling
  4602.  
  4603.      Randomize
  4604.      InterpretWord
  4605.      InterpretInput
  4606.      MoveCharacters
  4607.      BuildDescription
  4608.      LetsPlay
  4609.      SetStartLoc
  4610.      SetObjectText
  4611.      SetCharText
  4612.      SetMultiText
  4613.  
  4614. Procedures for menu handling
  4615.  
  4616.      OptionsMenu
  4617.      TitlePage
  4618.  
  4619. The Main Program
  4620.  
  4621. ------------------------------------
  4622. | Source File: External - Descrips |
  4623. ------------------------------------
  4624.  
  4625. Procedures for description handling
  4626.  
  4627.      CreateDescrip
  4628.      ViewDescrip
  4629.      KillDescrip
  4630.      AddToDescrip
  4631.      ListDescrip
  4632.      ExchangeDescrip
  4633.      UsedList
  4634.      ClearDescrip
  4635.      LocationMenu
  4636.  
  4637. ---------------------------------
  4638. | Source File: External - Exits |
  4639. ---------------------------------
  4640.  
  4641. Procedures for exit handling
  4642.  
  4643.      ClearExits
  4644.      GetVerbNumber
  4645.      PrintExits
  4646.      CreateExits
  4647.      ViewExits
  4648.      KillExits
  4649.      ListExits
  4650.      ExchangeExits
  4651.      AutoExits
  4652.      ClearAllExits
  4653.  
  4654. ---------------------------------
  4655. | Source File: External - Verbs |
  4656. ---------------------------------
  4657.  
  4658. Procedures for verb handling
  4659.  
  4660.      GetVerbNumber
  4661.      CreateVerb
  4662.      ViewVerb
  4663.      KillVerb
  4664.      ListVerbs
  4665.      ExchangeVerbs
  4666.      PageVerbs
  4667.      AddToVerb
  4668.      ClearAllVerbs
  4669.      VerbMenu
  4670.  
  4671. ---------------------------------
  4672. | Source File: External - Words |
  4673. ---------------------------------
  4674.  
  4675. Procedures for word handling
  4676.  
  4677.      GetWordNumber
  4678.      CreateWord
  4679.      ViewWord
  4680.      KillWord
  4681.      ListWords
  4682.      ExchangeWords
  4683.      PageWords
  4684.      AddToWord
  4685.      ClearAllWords
  4686.      WordMenu
  4687.  
  4688. -----------------------------------
  4689. | Source File: External - Objects |
  4690. -----------------------------------
  4691.  
  4692. Procedures for object handling
  4693.  
  4694.      GetWordNumber
  4695.      CreateObject
  4696.      ViewObject
  4697.      KillObject
  4698.      ExchangeObjects
  4699.      PageObjects
  4700.      SetObjDefs
  4701.      ClearAllObjects
  4702.      ObjectMenu
  4703.  
  4704. --------------------------------------
  4705. | Source File: External - Characters |
  4706. --------------------------------------
  4707.  
  4708. Procedures for character handling
  4709.  
  4710.      CreateCharacter
  4711.      ViewCharacter
  4712.      KillCharacter
  4713.      ExchangeCharacters
  4714.      PageCharacters
  4715.      SetCharDefs
  4716.      ClearAllCharacters
  4717.      CharacterMenu
  4718.  
  4719. ---------------------------------
  4720. | Source File: External - Files |
  4721. ---------------------------------
  4722.  
  4723. Procedures for file handling
  4724.  
  4725.      SaveList
  4726.      LoadList
  4727.      SaveGame
  4728.      LoadGame
  4729.      GetFileInfo
  4730.      Directory
  4731.      LoadFile
  4732.      SaveFile
  4733.      DeleteFile
  4734.      GraphicControl
  4735.      ModControl
  4736.      FileMenu
  4737.  
  4738. -----------------------------------
  4739. | Source File: External - FRACTOL |
  4740. -----------------------------------
  4741.  
  4742. Procedures for FRACTOL handling
  4743.  
  4744.      UpperCaseII
  4745.      AddToLine
  4746.      InterpretLine
  4747.      ScanString
  4748.      ScanVariable
  4749.      ScanBracketedExpression
  4750.      ScanExpression
  4751.      ScanRelational
  4752.      ScanCondition
  4753.      ScanCommand
  4754.      FixConstants
  4755.      DisplayErrorReport
  4756.      PrintLine
  4757.      SortLines
  4758.      DeleteLine
  4759.      DeleteRange
  4760.      GoFRACTOL
  4761.  
  4762. --------------------------------------
  4763. | Source File: External - FRACTOLEXE |
  4764. --------------------------------------
  4765.  
  4766. Procedures for FRACTOL execution handling
  4767.  
  4768.      ExecuteProc
  4769.           [function] EvaluateVariable
  4770.           [function] EvaluateBracketedExpression
  4771.           [function] EvaluateExpression
  4772.           [function] EvaluateRelational
  4773.           [function] EvaluateCondition
  4774.           DoLet
  4775.           DoLoadSaveGame
  4776.           ExecuteCommand
  4777.           ExecuteLine
  4778.  
  4779. ----------------------------------------
  4780. | Source File: External - FRACRoutines |
  4781. ----------------------------------------
  4782.  
  4783. 68000 Assembler Routines used by FRAC
  4784.  
  4785.      OpenLibs
  4786.      KillBorder
  4787.      CloseLibs
  4788.      DeleteFile1
  4789.      DeleteFile2
  4790.      DeleteFile3
  4791.      DeleteFile4
  4792.      DeleteFile5
  4793.      DeleteFile6
  4794.      DelFile
  4795.      LoadModule1
  4796.      LoadModule2
  4797.      LoadModule3
  4798.      LoadModule4
  4799.      LoadModule5
  4800.      LoadModule6
  4801.      StartMusic
  4802.      StopModule
  4803.      DisplayGraphic0
  4804.      DisplayGraphic1
  4805.      DisplayGraphic2
  4806.      DisplayGraphic3
  4807.      DisplayGraphic4
  4808.      DisplayGraphic5
  4809.      DisplayGraphic6
  4810.      DisplayGraphic7
  4811.      DisplayGraphic8
  4812.      DisplayGraphic9
  4813.      DisplayGraphic10
  4814.      DisplayGraphic11
  4815.      DisplayGraphic12
  4816.      DisplayGraphic13
  4817.      DisplayGraphic14
  4818.      DisplayGraphic15
  4819.      Display
  4820.      CheckBreak
  4821.      ClearBreak
  4822.      Protracker V1.1b PlayRoutine
  4823.  
  4824. To describe how FRAC works the main systems will be discussed and
  4825. justified.
  4826.  
  4827. The Menus
  4828. ---------
  4829.      Menus require very little programming but are very effective and
  4830. promote a good standard of user-friendliness. In FRAC the menu text is
  4831. simply written to the screen using writeln statements, and then the
  4832. procedure CharacterInput is called to receive a single character from
  4833. the keyboard and pass the result in the variable CharInput. A CASE
  4834. statement is then used to check for all valid inputs - in this way ll
  4835. invalid entries are ignored. This is repeated until the exit function
  4836. within the menu is selected - this sets the boolean variable quit to
  4837. true, which lets the repeat until loop know that it is time to stop
  4838. repeating. Here is an example of how a menu is programmed:
  4839.  
  4840.      repeat
  4841.           cls;
  4842.           writeln (`E. EXIT`);
  4843.           CharacterInput;
  4844.           case CharInput of
  4845.                `E`,`e`     :     Quit := True;
  4846.           end;
  4847.      until (Quit);
  4848.  
  4849. Here is a diagram to show how the menus of FRAC are linked together:
  4850.                               --------
  4851.                               | MAIN |
  4852.                               --------
  4853.                                / | \
  4854.   ---------- ------ ------ -------- ----------- ------ ---------
  4855.   |LOCATION| |VERB| |WORD| |OBJECT| |CHARACTER| |FILE| |OPTIONS|
  4856.   ---------- ------ ------ -------- ----------- ------ ---------
  4857.        |                                         /  \
  4858.   -----------                     ---------------------------------
  4859.   |EXIT MENU|                     |GRAPHIC CONTROL||MODULE CONTROL|
  4860.   -----------                     ---------------------------------
  4861. TEXT STORAGE
  4862. ------------
  4863.      The storage of text for FRAC was perhaps one of the most important
  4864. problems which needed to be overcome, since text handling is
  4865. essentially the basis of the entire project. The first method which
  4866. sprang to mind was to declare static arrays of 255 characters for each
  4867. location description, verb, word, object and character name. But there
  4868. are two major disadvantages in doing this (although it would be
  4869. relatively easy to program). Firstly in the case of location
  4870. descriptions, 255 characters would not be enough in most instances, and
  4871. there is no way of expanding upon this original number once the program
  4872. is in execution. Secondly, to set aside 255 characters for a single
  4873. verb would be absurd, since most only run to several letters.
  4874.      The obvious solution would be to cut down on the number of
  4875. characters allocated - but then this would be too limiting in cases
  4876. where many characters are needed. To solve both of these problems I
  4877. have developed a system of dynamic allocation which I refer to as the
  4878. datalist storage system. Rather than allocate fixed length arrays for
  4879. each type, a memory pool is allocated which is shared by all of the
  4880. text handlers. The advantages of such a system are numerous: the memory
  4881. is allocated where needed, so while verbs etc. may only take up a small
  4882. proportion of store (with no waste), large text descriptions are still
  4883. possible for things like location descriptions. To manage this a
  4884. workspace of some 80000 bytes is allocated as an array of characters
  4885. (called the datalist). But other variables are also needed to store
  4886. where in this datalist the text is actually stored. To take the example
  4887. of a verb, it must have two integers: one to store its offset from
  4888. character zero (i.e. its address) - called VerbAdr, and one to store
  4889. its length since rogue or terminating characters are not used - called
  4890. VerbLen. Further, these variables must be allocated for all verbs,
  4891. producing two arrays like so:
  4892.  
  4893.      VerbAdr     :     Array [1..Verbs] of integer;
  4894.      VerbLen     :     Array [1..Verbs] of integer;
  4895.  
  4896. Here is an example datalist:
  4897.  
  4898.      0  0  0  0  0  0  0  0  0  0  1  1  1  1
  4899.      0  1  2  3  4  5  6  7  8  9  0  1  2  3
  4900.  
  4901.      T  A  K  E  D  R  O  P  T  H  R  O  W (0)
  4902.  
  4903.  
  4904. Therefore if verb one is TAKE, verb two is THROW and verb three is
  4905. DROP, the variables would be set as follows:
  4906.  
  4907.      VerbAdr[1] = 0
  4908.      VerbLen[1] = 4
  4909.      VerbAdr[2] = 8
  4910.      VerbLen[2] = 5
  4911.      VerbAdr[3] = 4
  4912.      VerbLen[3] = 4
  4913.  
  4914.  
  4915. Similarly if we also wished to store words in the datalist, we would
  4916. need two arrays:
  4917.  
  4918.      WordAdr     :     Array [1..Words] of Integer;
  4919.      WordLen     :     Array [1..Words] of Integer;
  4920.  
  4921. This structure needs to be repeated for all types of text which are
  4922. stored in the datalist. The datalist itself is defined as:
  4923.  
  4924.      DataList     :     Array [0..SystemMem-1] of Char;
  4925.  
  4926. During the initialisation period every element is set to character
  4927. zero. So whenever a zero is encountered it represents the end of the
  4928. datalist - so any text that is stored here must not have a zero in it.
  4929.  
  4930. One of the major advantages of using a datalist is that the same set of
  4931. routines can be used to manipulate the text (such as PrintEntry,
  4932. EraseEntry and StoreEntry). The address and length is simply passed
  4933. using the WriteAdr and StringLen integer variables respectively, and
  4934. the routine does the rest. Adding text to the datalist is a very simple
  4935. matter. Firstly the procedure LocateEnd is called to locate the end of
  4936. the datalist (it does this by searching for the character zero and
  4937. setting WriteAdr to point to it), and then GetStringLen is called to
  4938. calculate the length of the text the user has entered - this is passed
  4939. in the integer StringLen. Now the variables used to store the address
  4940. and length of the text are loaded with the variables WriteAdr and
  4941. StringLen. So if the text was a verb, the following lines would be
  4942. executed:
  4943.  
  4944.      VerbAdr[x] := WriteAdr;
  4945.      VerbLen[x] := StringLen;
  4946.      StoreEntry;
  4947.  
  4948. StoreEntry is then called to copy the text from the input buffer to the
  4949. datalist. The input buffer is defined as:
  4950.  
  4951.      TextInput     :     Array [0..255] of Char;
  4952.  
  4953. The procedure StringInput is called to accept input from the user and
  4954. store it in the TextInput array.
  4955.  
  4956. To remove text from the datalist the procedure EraseEntry is used. This
  4957. uses the variables WriteAdr and StringLen to erase an area of memory
  4958. within the datalist (by setting all characters within the range to the
  4959. character zero). The variables used to store the address and length of
  4960. the text should then be set to zero. So if you wished to erase a verb,
  4961. the following lines would need to be executed:
  4962.  
  4963.      WriteAdr := VerbAdr[x];
  4964.      StringLen := VerbLen[x];
  4965.      EraseEntry;
  4966.      VerbAdr[x] := 0;
  4967.      VerbLen[x] := 0;
  4968.  
  4969. The procedure EraseEntry is rather more complicated than you might at
  4970. first think. After clearing the text from the datalist a pocket of
  4971. zeros is left which needs to be removed if high efficiency is to be
  4972. maintained, and the system to continue operating correctly. For
  4973. example, if verb three (drop) from the earlier example is erased using
  4974. EraseEntry, the datalist would appear as:
  4975.  
  4976.      0  0  0  0  0  0  0  0  0  0  1  1  1  1
  4977.      0  1  2  3  4  5  6  7  8  9  0  1  2  3
  4978.  
  4979.      T  A  K  E (0)(0)(0)(0) T  H  R  O  W (0)
  4980.  
  4981.  
  4982. Obviously all characters after the erased text must be moved to cover
  4983. up the new zeros. This is done by a call to UpdateList which completes
  4984. this task. But this only solves half of the problem: since the text has
  4985. been moved, all the pointers which point to text after the newly erased
  4986. text must have the length of the erased text subtracted from their
  4987. address pointer so that they continue pointing to the correct data. So
  4988. after UpdateList the result is:
  4989.  
  4990.      0  0  0  0  0  0  0  0  0  0  1  1  1  1
  4991.      0  1  2  3  4  5  6  7  8  9  0  1  2  3
  4992.  
  4993.      T  A  K  E  T  H  R  O  W (0)(0)(0)(0)(0) etc.
  4994.  
  4995.      VerbAdr[1] = 0
  4996.      VerbLen[1] = 4
  4997.      VerbAdr[2] = 4
  4998.      VerbLen[2] = 4  [8 - 4]
  4999.      VerbAdr[3] = 0
  5000.      VerbLen[3] = 0
  5001.  
  5002. Since a VerbAdr of zero is valid, VerbLen is used to test if a verb
  5003. actually exists - as a verb length of zero is not possible. This
  5004. concludes my examination of the datalist.
  5005.  
  5006. File Handling
  5007. -------------
  5008.      There are three file structures which FRAC uses to store data on
  5009. disk. The first is a standard adventure data file - used to store
  5010. adventures which the user is currently working on, and hence can be re-
  5011. loaded back into the editor. One of the first things that should be
  5012. noted is that the save routine is what I like to refer to as
  5013. `intelligent`. That is, it checks the data before saving it to see
  5014. which range actually needs to be stored. For example, if only verbs 1
  5015. to 9 are allocated, it is hardly worth wasting disk space by saving all
  5016. 255 of them. This is not really a compression algorithm, but merely a
  5017. very simply piece of programming which in practice saves vast amounts
  5018. of memory. FRAC does this by setting the integer FirstVerb to the
  5019. lowest allocated verb, setting the integer LastVerb to the highest
  5020. allocated verb, then saving everything within this range. Note:
  5021. FirstVerb and LastVerb are also saved so that the load routine will
  5022. know what range it must load. This is done for all types of stored
  5023. array so variables like: FirstExit, LastExit, FirstLoc, LastLoc,
  5024. FirstWord, LastWord are necessary. Here is the file structure for a
  5025. data file which is actually split into two separate files - one to
  5026. store characters and one to store integers.
  5027.  
  5028. |FRAC|40 characters set aside for file name/description|Datalist|0|
  5029.  
  5030. This is hard to represent on paper since the datalist is of variable
  5031. length. Every FRAC data file begins with the four characters `FRAC`.
  5032. Then after the datalist a zero character is written. This is saved as
  5033. FRACx.file, where x may be any number between 1 and 6. The second file
  5034. which is used to store integers is called FRACx.data, where x is any
  5035. number between 1 and 6.
  5036.  
  5037. |FirstLoc|LastLoc|LocAdr/LocLen|
  5038. |FirstVerb|LastVerb|VerbAdr/VerbLen|
  5039. |FirstWord|LastWord|WordAdr/WordLen|
  5040. |FirstObject|LastObject|ObjAdr/ObjLen/ObjLoc/ObjStat|ObjWord|
  5041. |FirstCharacter|LastCharacter|CharAdr/CharLen/CharLoc/CharStatus
  5042. /CharListAdr/CharListLen/CharStat|CharWord|
  5043. |FirstLine|LastLine|LineAdr/LineLen/LineProc/LineNum|
  5044. |StartLoc|
  5045. |WordTrapping|
  5046. |VisibleExits|
  5047. |VisibleObjs|
  5048. |VisibleChars|
  5049. |DesForm|
  5050. |ObjTextAdr|
  5051. |ObjTextLen|
  5052. |CharTextAdr|
  5053. |CharTextLen|
  5054. |MultiTextAdr|
  5055. |MultiTextLen|
  5056. |FirstExit|LastExit|LocVerb/LocExit|AutoVerb/AutoExit|
  5057.  
  5058. The second file structure FRAC uses is an adventure file which cannot
  5059. be loaded back into the main editor - but can be used to make a
  5060. bootable game disk. It has exactly the same structure as a FRAC data
  5061. file, but instead of the letters `FRAC`, the letters `GAME` are written
  5062. at the start of the file.
  5063.  
  5064. The last file structure is saved as FRACx.game and stores a game
  5065. position (i.e. the position and status of all relevant variables so
  5066. that if the file is re-loaded, the player may continue from exactly
  5067. where he left off). x represents a number between 1 and 6. Here is the
  5068. file structure (designated as a file of integer):
  5069.  
  5070. |PlayerLoc|ObjLoc/ObjStat|CharLoc/CharStatus/CharListPtr/CharStat
  5071. |Variable|Flag|X|Y|Z|
  5072.  
  5073. Although flags are stored in memory as integers, they are saved to an
  5074. integer file by making true take on the value one, and false the value
  5075. zero.
  5076.  
  5077. Another thing that should be noted is that the datalist is encrypted as
  5078. it is saved. This prevents people simply using the DOS command type to
  5079. examine all text in the adventure, and thereby gaining knowledge
  5080. through improper means. The encryption method is very simple: every
  5081. character that is written first undergoes an `xor 206` operation i.e.
  5082. the character is exclusively or`ed with the integer 206 to produce a
  5083. completely different character. E.g.
  5084.  
  5085. The ascii code for character `A` is 65. After an xor 206 operation
  5086. (which inverts the bits specified by the supplied integer), 65 becomes
  5087. 143, thus the text is made unreadable. To return the text to its normal
  5088. state we simply xor it with 206 again as it is loaded in, and it
  5089. returns to its start value. So if 143 was loaded and then xor`ed with
  5090. 206, it would become 65 again. If you have a calculator which supports
  5091. binary, try it!
  5092.  
  5093. This completes my examination of FRAC file handling; it has examined
  5094. and described the functions of these procedures: SaveList (saves the
  5095. datalist), LoadList (loads the datalist), SaveGame (saves current game
  5096. position), and LoadGame (which loads a previous game position). But
  5097. before proceeding I would like to mention the method used by the
  5098. procedure called directory, which displays the name of all the FRAC
  5099. files on a disk, or `empty` if there is not a file there. This simply
  5100. goes through all 6 files and opens them one by one - if the file was
  5101. successfully opened it means that it exists, and the description is
  5102. displayed before the file is closed. If the file could not be opened it
  5103. means that no FRAC file exists for this position, and so the word
  5104. `empty` is displayed.
  5105.  
  5106. FRACTOL
  5107. -------
  5108.      At this point you should have at least a basic understanding of
  5109. the programming language FRACTOL, and possess some knowledge of its
  5110. commands. The first thing that will be discussed is the way in which
  5111. FRACTOL recognises things that are entered into it (- or the lexical
  5112. analysis stage). Rather than compare every single character with all
  5113. the possible characters producing massively inefficient code, I have
  5114. developed a system which allows just a single integer to represent an
  5115. entire word. It does this by adding all ascii codes it comes across to
  5116. a total (which start at zero) until a non letter character is
  5117. encountered. This total is then compared using a case statement and if
  5118. a match is found the word is interpreted and stored. There are slight
  5119. problems when interpreting words using this method. Firstly `clashes`
  5120. are possible i.e. two different words can generate the same number e.g.
  5121.  
  5122.                          C     A     T
  5123.                         (67)  (65)  (84)             TOTAL = 216
  5124.  
  5125.                          S     A     D
  5126.                         (83)  (65)  (68)             TOTAL = 216
  5127.  
  5128. To reduce the probability of this happening, each ascii code has twice
  5129. its value added to it before being added to the total. (But even if
  5130. clashes do occur due to a typing mistake it is easily rectified - as
  5131. long as two FRACTOL definitions do not have values which clash: the
  5132. computer would then not know which one is correct and consequently it
  5133. would be interpreted incorrectly. As I have made sure every code is
  5134. different, this is not a problem). Using this system everything that is
  5135. not recognised is ignored, and also all spaces are removed for further
  5136. optimisation.
  5137.  
  5138. Now I will examine how a FRACTOL command is stored. As a temporary
  5139. store the arrays LineType and LineNumber are used to hold the type and
  5140. number of the recognised word. They are as below:
  5141.  
  5142.      LineType       :     Array [0..255] of Char;
  5143.      LineNumber     :     Array [0..255] of Char;
  5144.  
  5145. An integer called line output points to the array element currently
  5146. being accessed, and is incremented by one every time a new word is
  5147. added to this list. As mentioned earlier, the ascii code generated by
  5148. the word is used to determine the type and number that is added to the
  5149. list. The AddToLine procedure adds a word to the list, and has two
  5150. parameters: the type and the number. Here is list of types and numbers
  5151. that are generated by the following recognised words and symbols:
  5152.  
  5153.      TYPE [1] - COMMAND
  5154.  
  5155.           NUMBER          SYMBOL               ASCII CODE
  5156.  
  5157.           [1]               IF                    356
  5158.           [2]               LET                   542
  5159.           [3]               CLS                   535
  5160.           [4]               WRITE                 859
  5161.           [5]               PRINT                 878
  5162.           [6]               GRAPHIC               1087
  5163.           [7]               MUSIC                 837
  5164.           [8]               PROCEDURE/PROC        1431/683
  5165.           [9]               REMARK/REM            975/533
  5166.           [10]              READLINE/READ         1229/636
  5167.           [11]              FOR                   544
  5168.           [12]              GOTO                  705
  5169.           [13]              RETURN/RET            1038/554
  5170.           [14]              NEXT                  722
  5171.           [15]              LOAD                  644
  5172.           [16]              SAVE                  675
  5173.           [17]              TAB                   496
  5174.           [18]              NORMAL                990
  5175.           [19]              BOLD                  646
  5176.           [20]              ITALIC                943
  5177.           [21]              UNDERLINED            1560
  5178.           [22]              INVERSE               1149
  5179.           [23]              RESTART               1186
  5180.  
  5181.  
  5182.  
  5183.  
  5184.  
  5185.      TYPE [2] - NUMERIC VARIABLES
  5186.  
  5187.           [1]               OBJDEF                922
  5188.           [2]               OBJLOC                949
  5189.           [3]               CHARDEF               1056
  5190.           [4]               CHARSTATUS            1623
  5191.           [5]               CHARLOC               1083
  5192.           [6]               VAR                   548
  5193.           [7]               X                     264
  5194.           [8]               Y                     267
  5195.           [9]               Z                     270
  5196.  
  5197.      TYPE [3] - KEYWORDS
  5198.  
  5199.           [1]               UNDEFINED             ----
  5200.           [2]               UNDEFINED             ----
  5201.           [3]               THEN                  684
  5202.           [4]               UNDEFINED             ----
  5203.           [5]               INPUT/IN              884/380
  5204.           [6]               TO                    405
  5205.           [7]               DOWNTO                1029
  5206.           [8]               RND                   524
  5207.  
  5208.      TYPE [4] - RELATIONAL SYMBOLS
  5209.  
  5210.           [1]               =
  5211.           [2]               <
  5212.           [3]               >
  5213.           [4]               <=
  5214.           [5]               >=
  5215.           [6]               <>
  5216.  
  5217.      TYPE [5] - OPERATIONAL SYMBOLS
  5218.  
  5219.           [1]               +
  5220.           [2]               -
  5221.           [3]               *
  5222.           [4]               /
  5223.  
  5224.      TYPE [6] - CONSTANT
  5225.  
  5226.           [Here the number represents the actual constant.]
  5227.  
  5228.      TYPE [7] - SYMBOLS
  5229.  
  5230.           [1]               (
  5231.           [2]               )
  5232.           [3]               ,
  5233.           [4]               "
  5234.  
  5235.  
  5236.  
  5237.  
  5238.  
  5239.      TYPE [8] - TEXT VARIABLES
  5240.  
  5241.           [1]               DESCRIPTION           1750
  5242.           [2]               OBJNAME               1085
  5243.           [3]               CHARNAME              1219
  5244.  
  5245.      TYPE [9] - INPUT TYPES
  5246.  
  5247.           [1]               VERB                  672
  5248.           [2]               WORD                  700
  5249.           [3]               OBJECT                962
  5250.           [4]               CHARACTER             1388
  5251.           [5]               UNKNOWN               1198
  5252.  
  5253.      TYPE [10] - FLAGS
  5254.  
  5255.           [1]               FLAG                  635
  5256.  
  5257.      TYPE [11] - FLAG ASSIGNMENT
  5258.  
  5259.           [1]               TRUE                  709
  5260.           [2]               FALSE                 795
  5261.  
  5262.      TYPE [12] - BOOLEAN OPERATORS
  5263.  
  5264.           [1]               AND                   490
  5265.           [2]               OR                    404
  5266.  
  5267.      TYPE [13] - EDITOR COMMANDS
  5268.  
  5269.           [1]               EXIT/E                712/207
  5270.           [2]               LIST/L                716/228
  5271.           [3]               DELETE/DEL/D          939/502/204
  5272.           [4]               ERASE                 805
  5273.           [5]               COPY                  719
  5274.           [6]               MOVE                  691
  5275.           [7]               RENUMBER/R            1298/246
  5276.           [8]               LOCK/P                669/240
  5277.           [9]               HOLD                  658
  5278.           [10]              HELP/H                674/216
  5279.  
  5280.      TYPE [14] - COMMAND SEPARATOR
  5281.  
  5282.           [1]               :
  5283.  
  5284.  
  5285. As the type and number are invariably integers, you may be wondering
  5286. why I go through the hassle of converting them into characters (I have
  5287. declared the storage areas LineType and LineNumber as characters). This
  5288. was done to make it easy to copy interpreted FRACTOL lines into the
  5289. datalist, because although you may not think so, a line in FRACTOL is
  5290. treated as text in its converted form - allowing it to be easily
  5291. manipulated using already existing procedures. The LineAdr and LineLen
  5292. store the address and length of the line respectively.
  5293. Once the lexical analysis stage has been completed (the commands are
  5294. now stored in compressed format in the arrays LineType and LineNumber),
  5295. the syntax analysis stage begins. The procedures used in this are:
  5296. ScanString, ScanVariable, ScanBracketedExpression, ScanExpression,
  5297. ScanRelational, ScanCondition and ScanCommand. These procedures make
  5298. extensive use of recursive techniques and can therefore handle any
  5299. length of input.
  5300.      If anything is not correct at this stage, DisplayErrorReport is
  5301. called to inform the user, and the line is ignored. If the line is
  5302. syntactically correct, it is now ready to be entered into the datalist,
  5303. but first it is necessary to correct the integers by adding one. This
  5304. is because a zero is not allowed in the datalist for the simple reason
  5305. that it signifies the end of the list, and a zero in the middle of a
  5306. line would cause everything after it to be treated as empty. To solve
  5307. this problem the procedure fix constants is called to make sure all
  5308. integers are in the range 1 to 255. StoreEntry is then used to copy the
  5309. line into the datalist. A line also possesses two more variables:
  5310. LineProc (to remember which procedure the line belongs) and LineNum (to
  5311. store the line number of the line). These are defined as below:
  5312.  
  5313.      LineProc    :     Array [0..Lines-1] of Integer;
  5314.      LineNum     :     Array [0..Lines-1] of Integer;
  5315.  
  5316. The procedure PrintEntry is used to display a line in FRACTOL - a large
  5317. case statement is executed for every symbol to display its expanded
  5318. form. The procedure SortLines does a form of bubble sort on all of the
  5319. lines currently in memory. This is necessary to make sure every new
  5320. line that is entered goes in the correct place within the list. Lines
  5321. which belong to a low procedure number are placed nearer to the
  5322. beginning of the list. During the sort, lines are exchanges by swapping
  5323. over LineAdr, LineLen, LineProc, and LineNum values - although no text
  5324. needs to be moved, making it quite a speedy operation.
  5325.      DeleteLine makes use of the EraseEntry procedure, and consequently
  5326. is very short and efficient. DeleteRange simply goes through all of the
  5327. lines in memory and if one matches the deletion condition i.e. same
  5328. procedure, and line number within range, it is deleted using the
  5329. DeleteLine procedure described above. This concludes my examination
  5330. into procedures which allow lines to be interpreted by FRACTOL, and
  5331. then how they are stored. Next I will examine how FRACTOL takes these
  5332. tokenised characters and executes them.
  5333.  
  5334. The first thing that should be noted is that all procedures dealing
  5335. with the execution of FRACTOL instructions are placed inside the
  5336. procedure ExecuteProc. This is so that one procedure in FRACTOL may
  5337. call another in FRACTOL, simply by recursively calling ExecuteProc, and
  5338. the internal variables such as LinePC (which stores the number of the
  5339. current line) will be preserved. Other control variables inside
  5340. ExecuteProc are Pointer which points to the symbol that is currently
  5341. being accessed in the datalist (the integer represents the character`s
  5342. offset from position zero); Ret - a boolean variable which becomes true
  5343. when a return instruction is encountered, forcing FRACTOL to leave the
  5344. procedure; VarNum (an array of 1 to 8 integer) which holds the variable
  5345. to be effected by a loop; Dest (defined as an array of 1 to 8 integer)
  5346. which stores the destination number which a loop must achieve before it
  5347. is terminated; and PCJump (an array of 1 to 8 integer) which stores the
  5348. line number that a loop must return to when its respective NEXT is
  5349. encountered. LoopPtr points to the next free loop that may be used. It
  5350. starts on 1 and if a loop is encountered when it is equal to 8, the
  5351. `too many fors` error is issued. The basis of execution of a FRACTOL
  5352. instruction is that any expression will ultimately evaluate into a
  5353. single integer value. Because of this it is easy to see that a
  5354. recursive routine could be used to solve any expression. To make it
  5355. easier and more efficient I have used functions as opposed to
  5356. procedures, and the following are used in evaluating expressions:
  5357. EvaluateVariable, EvaluateBracketedExpression, EvaluateExpression, and
  5358. EvaluateRelational.
  5359.  
  5360. The basis of the function EvaluateCondition is that any condition will
  5361. ultimately evaluate into a single state of true or false, based on the
  5362. result of a boolean operator applied on two other conditions. Again a
  5363. recursive function is used to evaluate any possibility:
  5364. EvauateCondition calls itself as many times as necessary, until the
  5365. condition is broken down into its base components. The main control
  5366. routine is ExecuteLine which calls ExecuteCommand for every command
  5367. within this instruction.
  5368.  
  5369. There is also a library of 68000 Assembler routines which can be called
  5370. through the main program, and are included to handle music and graphics
  5371. etc. - things that would be impossible or impractical using Pascal.
  5372.  
  5373.  
  5374.  
  5375.  
  5376.  
  5377.  
  5378.  
  5379.  
  5380.  
  5381.  
  5382.  
  5383.  
  5384.  
  5385.  
  5386.  
  5387.  
  5388.  
  5389.  
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.  
  5399.  
  5400.  
  5401. AN EXPLANATION OF THE CONSTANTS AND VARIABLES FRAC USES
  5402. =======================================================
  5403.  
  5404. CONSTANTS
  5405. ---------
  5406.  
  5407.      SystemMem:  This constant represents how many bytes should be
  5408. reserved for the text pool (i.e. the datalist). It is initially set to
  5409. 80000, but an expanded machine could easily manage 180000 bytes.
  5410.  
  5411.      Locations:  This constant tells FRAC how many locations to reserve
  5412. and access. This can be set as high as you like but remember that there
  5413. are only 254 procedures in FRACTOL (cannot be changed) and so there
  5414. seems little point in raising it above this figure. The default is 255
  5415. (location zero included).
  5416.  
  5417.      Verbs:  This constant decides how many verbs FRAC will allocate.
  5418. It starts at 254.
  5419.  
  5420.      Words:  This simply tells FRAC how many words to reserve. It also
  5421. starts at 254.
  5422.  
  5423.      Exits:  This constant dictates how many visible exits will be
  5424. allocated at each location. It starts at eight.
  5425.  
  5426.      Autos:  The constant tells FRAC how many AutoExit definitions to
  5427. remember. It starts at 16 which should be more than enough.
  5428.  
  5429.      Objects: This decides how many object to cater for. It starts at
  5430. 254.
  5431.  
  5432.      ObjectStats: This states how many personal definitions each object
  5433. will have. Its default is 8.
  5434.  
  5435.      Characters:  This decides how many characters FRAC should reserve.
  5436.  
  5437.      CharacterStats:  This states how many personal definitions each
  5438. character will have. It starts at 8.
  5439.  
  5440.      LineLength:  This tells FRAC how many characters can fit width
  5441. ways across the screen, and is primarily used by the text formatting
  5442. routines. It starts at 64 (the width of an AmigaDOS screen) but
  5443. alteration of this variable makes it possible for FRAC to run on any
  5444. number of different operating systems.
  5445.  
  5446.      MaxInput:  This decides how many words FRAC will take from the
  5447. player before the buffer is deemed full. It starts at 128 which is
  5448. plenty.
  5449.  
  5450.      Lines:  This constant tells FRAC how many FRACTOL line to allow
  5451. for. Its initial value is 1000 which is certainly enough for most
  5452. adventures.
  5453.  
  5454.  
  5455. Here only variables which have not already been described will be
  5456. examined - a complete list is shown at the start of the listing.
  5457.  
  5458.      LocVerb     :     Array [0..Locations-1,1..Exits] of integer;
  5459.      LocExit     :     Array [0..Locations-1,1..Exits] of integer;
  5460.  
  5461. These two arrays hold the data for every visible exit in the entire
  5462. game, and also where the player should be relocated on moving through
  5463. this exit. LocVerb holds the number of the verb which when typed will
  5464. take the player through the exit. It is a two dimensional array so
  5465. accessing LocVerb[12,2] will give you the verb number of the second
  5466. exit at location twelve. LocExit simply gives the number of the
  5467. location the player should be moved to if this exit it activated - it
  5468. is accessed in exactly the same way as LocVerb.
  5469.  
  5470.      Files     :     Array [1..6] of boolean;
  5471.  
  5472. This is used by the directory to store which files actually exist - if
  5473. the file exists its boolean variable is set to true. Before any file is
  5474. loaded this is checked to see if the file actually exists, and also
  5475. before any file is saved the user is prompted if this variable is found
  5476. to be true (i.e. `file already exists! Overwrite?`).
  5477.  
  5478.      CharListAdr     :     Array [1..Characters] of integer;
  5479.      CharListLen     :     Array [1..Characters] of integer;
  5480.      CharListPtr     :     Array [1..Characters] of integer;
  5481.  
  5482. The variables CharListAdr and CharListLen are used to store the
  5483. position and length of all the characters` movement lists in the game -
  5484. as this is also stored as text in the datalist to aid manipulation.
  5485. CharListPtr is a pointer which points to the current character in a
  5486. characters movement list which is being considered. One is needed for
  5487. every single character because they may all have different length
  5488. movement lists.
  5489.  
  5490. The other variables are self-explanatory or have already been
  5491. considered.
  5492.  
  5493.  
  5494.  
  5495.  
  5496.  
  5497.  
  5498.  
  5499.  
  5500.  
  5501.  
  5502.  
  5503.  
  5504.  
  5505.  
  5506.  
  5507.  
  5508.  
  5509.                          TESTING FRACTOL
  5510.                          ===============
  5511.  
  5512. To test FRACTOL it is necessary to examine each of the commands in
  5513. terms of its effect. This is made easier by the highly structured form
  5514. that parameters are used i.e. to test all forms of condition, only one
  5515. would need to be examined since all conditions, however complex, are
  5516. made up of other conditions only.
  5517.      Firstly commands which affect objects will be examined. For this
  5518. example object #1 is defined as below:
  5519.  
  5520.      NAME:          BOX
  5521.      LOCATION:          1
  5522.      DEFINITION #1:     10
  5523.      DEFINITION #2:     20
  5524.      DEFINITION #3:     30
  5525.      DEFINITION #4:     40
  5526.      DEFINITION #5:     50
  5527.      DEFINITION #6:     60
  5528.      DEFINITION #7:     70
  5529.      DEFINITION #8:     80
  5530.  
  5531. At procedure zero the following program is entered:
  5532.  
  5533.      10 LET VAR(0)=1
  5534.      20 PRINT "Test Name=",OBJNAME(VAR(0))
  5535.      30 PRINT "Location=",OBJLOC(VAR(0))
  5536.      40 PRINT ""
  5537.      50 FOR VAR(1)=1 TO 8
  5538.      60 PRINT "Definition ",VAR(1),"=",OBJDEF(VAR(0),VAR(1))
  5539.      70 NEXT
  5540.  
  5541. When the program was run the result was as follows:
  5542.  
  5543. Test Name=box
  5544. Location=1
  5545. Definition 1=10
  5546. Definition 2=20
  5547. Definition 3=30
  5548. Definition 4=40
  5549. Definition 5=50
  5550. Definition 6=60
  5551. Definition 7=70
  5552. Definition 8=80
  5553.  
  5554.  
  5555.  
  5556.  
  5557.  
  5558.  
  5559.  
  5560.  
  5561.  
  5562.  
  5563.      Next commands which affect characters will be examined. For this
  5564. example character #1 is defined as below:
  5565.  
  5566.      NAME:          OLD MAN.MAN
  5567.      LOCATION:          1
  5568.      STATUS:            2
  5569.      MOVEMENT LIST:
  5570.      DEFINITION #1:     1
  5571.      DEFINITION #2:     2
  5572.      DEFINITION #3:     3
  5573.      DEFINITION #4:     4
  5574.      DEFINITION #5:     5
  5575.      DEFINITION #6:     6
  5576.      DEFINITION #7:     7
  5577.      DEFINITION #8:     8
  5578.  
  5579. At procedure zero the following program is entered:
  5580.  
  5581.      10 LET VAR(0)=1
  5582.      20 PRINT "Test Name=",CHARNAME(VAR(0))
  5583.      30 PRINT "Location=",CHARLOC(VAR(0))
  5584.      40 PRINT "Status=",CHARSTATUS(VAR(0))
  5585.      50 PRINT ""
  5586.      60 FOR VAR(1)=1 TO 8
  5587.      70 PRINT "Definition ",VAR(1),"=",CHARDEF(VAR(0),VAR(1))
  5588.      80 NEXT
  5589.  
  5590. When the program was run the result was as follows:
  5591.  
  5592. Test Name=old man
  5593. Location=1
  5594. Status=2
  5595. Definition 1=1
  5596. Definition 2=2
  5597. Definition 3=3
  5598. Definition 4=4
  5599. Definition 5=5
  5600. Definition 6=6
  5601. Definition 7=7
  5602. Definition 8=8
  5603.  
  5604.  
  5605.  
  5606.  
  5607.  
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.  
  5614.  
  5615.  
  5616.  
  5617. The following program was designed to test numeric conditions:
  5618.  
  5619.      10 FOR VAR(0)=1 TO 5
  5620.      20 IF (VAR(0)>0 AND VAR(0)<2) THEN PRINT "ONE OKAY!"
  5621.      30 IF VAR(0)=2 THEN PRINT "TWO OKAY!"
  5622.      40 IF ((VAR(0)<4 AND VAR(0)>2) AND VAR(0)=3) THEN PRINT "THREE
  5623. OKAY!"
  5624.      50 IF VAR(0)>=4 THEN PRINT "FOUR OR FIVE OKAY!"
  5625.      60 IF VAR(0)>4 THEN PRINT "DEFINITELY FIVE!"
  5626.      70 NEXT
  5627.  
  5628. The correct result was obtained, shown below:
  5629.  
  5630. ONE OKAY!
  5631. TWO OKAY!
  5632. THREE OKAY!
  5633. FOUR OR FIVE OKAY!
  5634. FOUR OR FIVE OKAY!
  5635. DEFINITELY FIVE!
  5636.  
  5637. The following program was designed to test boolean conditions:
  5638.  
  5639.      10 LET FLAG(1)=TRUE
  5640.      20 LET FLAG(2)=FALSE
  5641.      30 IF (FLAG(1)=TRUE AND FLAG(2)=FALSE) THEN LET FLAG(2)=TRUE
  5642.      40 IF (FLAG(1)=TRUE AND FLAG(2)=TRUE) THEN LET FLAG(1)=FALSE
  5643.      50 IF FLAG(1)=FALSE THEN LET FLAG(2)=FALSE
  5644.      60 IF (FLAG(1)=FALSE AND FLAG(2)=FALSE) THEN PRINT "TEST
  5645. SUCCESSFUL"
  5646.  
  5647. Upon entering at procedure zero and executing, the following result was
  5648. obtained:
  5649.  
  5650. TEST SUCCESSFUL
  5651.  
  5652.  
  5653.  
  5654.  
  5655.  
  5656.  
  5657.  
  5658.  
  5659.  
  5660.  
  5661.  
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671. To test `input` it was necessary to create the following:
  5672.  
  5673.      VERB #1 = BREAK.HIT
  5674.      OBJECT #1 = VASE
  5675.      CHARACTER #1 = DWARF
  5676.  
  5677. The following program was entered at procedure 254:
  5678.  
  5679.      10 IF (INPUT(1)=VERB(1) AND INPUT(2)=OBJECT(1)) THEN PRINT "The
  5680. vase is too solid for you to break."
  5681.  
  5682.      20 IF (INPUT(1)=VERB(1) AND INPUT(2)=CHARACTER(1)) THEN PRINT "The
  5683. dwarf grunts and says `get lost!`."
  5684.  
  5685.      30 IF (INPUT(1)=VERB(1) AND INPUT(2)=UNKNOWN) THEN PRINT "I do not
  5686. understand what I should hit."
  5687.  
  5688. The program was then tested using option seven on the main menu - PLAY
  5689. ADVENTURE, and here is a run time listing of the result:
  5690.  
  5691. You can also see a vase.
  5692. dwarf is here.
  5693.  
  5694. >hit dwarf
  5695. The dwarf grunts and says `get lost!`.
  5696. >break vase
  5697. The vase is too solid for you to break.
  5698. >hit vase
  5699. The vase is too solid for you to break.
  5700. >hit the moon
  5701. I do not understand what I should hit.
  5702.  
  5703. As you can see, input works correctly in all forms of interaction. This
  5704. concludes the documented testing of the language FRACTOL.
  5705.  
  5706.  
  5707.  
  5708.  
  5709.  
  5710.  
  5711.  
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.  
  5724.  
  5725. Presented below is a hex dump of the example adventure `Escape from
  5726. desert island`. As you can see the text that should be readable has
  5727. been completely hidden by the encryption algorithm.
  5728.  
  5729.  
  5730. 0000: 46524143 7C455343 41504520 46524F4D    FRAC|ESCAPE FROM
  5731. 0010: 20444553 45525420 49534C41 4E443C20     DESERT ISLAND< 
  5732. 0020: 20202020 20202020 20202020 97A1BBEE                ....
  5733. 0030: AFBCABEE BDBAAFA0 AAA7A0A9 EEA1A0EE    ................
  5734. 0040: AFEEB9AF BCA3EEBA BCA1BEA7 ADAFA2EE    ................
  5735. 0050: ACABAFAD A6E0EE9A A1EEBAA6 ABEEBDA1    ................
  5736. 0060: BBBAA6EE BAA6ABEE BEA2AFAD A7AAEEBD    ................
  5737. 0070: ABAFEEA6 AFBCAAA2 B7EEBCA7 BEBEA2AB    ................
  5738. 0080: BDEEBBA0 AAABBCEE BAA6ABEE ACABAFA3    ................
  5739. 0090: BDEEA1A8 EEBAA6AB EEA6A1BA EEBDBBA0    ................
  5740. 00A0: E0EE8FEE A8ABB9EE B7AFBCAA BDEEAFB9    ................
  5741. 00B0: AFB7EEAF EEA2AFBC A9ABEEA9 BCABB7EE    ................
  5742. 00C0: BCA1ADA5 EEACAFBD A5BDEEA7 A0EEBAA6    ................
  5743. 00D0: ABEEBDBB A3A3ABBC EEBCAFB7 BDE0EE9A    ................
  5744. 00E0: A1EEBAA6 ABEEB9AB BDBAEEBA A6ABBCAB    ................
  5745. 00F0: EEAFBEBE ABAFBCBD EEBAA1EE ACABEEAF    ................
  5746. 0100: EEADAFB8 ABE2EEBD A6ABA2BA ABBCABAA    ................
  5747. 0110: EEA7A0EE BAA6ABEE BCA1ADA5 A8AFADAB    ................
  5748. 0120: E2EEB9A6 A7A2ABEE BAA6ABEE A0A1BCBA    ................
  5749. 0130: A6EEA6A1 A2AABDEE A2BBBDA6 EEA9BCAB    ................
  5750. 0140: ABA0EEB8 ABA9ABBA AFBAA7A1 A0E097A1    ................
  5751. 0150: BBEEBDBA AFA0AAEE A7A0EEBA A6ABEEBD    ................
  5752. 0160: A6AFAAA1 B9EEA1A8 EEAFEEA2 AFBCA9AB    ................
  5753. 0170: EEBCA1AD A5A8AFAD ABE0EE8F EEBDA3AF    ................
  5754. 0180: A2A2EEBC A7B8ABBC EEBCBBA0 BDEEA8BC    ................
  5755. 0190: A1A3EEBA A6ABEEA8 A1BCABBD BABDEEE6    ................
  5756. 01A0: B9A6A7AD A6EEA2A7 ABEEA0A1 BCBAA6E7    ................
  5757. 01B0: EEA7A0BA A1EEBAA6 ABEEBDAB AFE2EEBE    ................
  5758. 01C0: AFBDBDA7 A0A9EEA7 A0EEA8BC A1A0BAEE    ................
  5759. 01D0: A1A8EEBF BBA7BAAB EEAFEEA2 AFBCA9AB    ................
  5760. 01E0: EEADAFB8 ABEEB9A6 A7ADA6EE A6AFBDEE    ................
  5761. 01F0: BDA1A3AB A6A1B9EE A8A1BBA0 AAEEA7BA    ................
  5762. 0200: BDEEB9AF B7EEA7A0 BAA1EEBA A6ABEEBC    ................
  5763. 0210: A1ADA5A8 AFADABE0 97A1BBEE AFBCABEE    ................
  5764. 0220: A7A0EEAF EEB8ABBC B7EEAAAF BCA5EEAD    ................
  5765. 0230: AFB8ABEE B9A6A7AD A6EEBDAB ABA3BDEE    ................
  5766. 0240: BAA1EEBA BBA0A0AB A2EEA7BA BDEEB9AF    ................
  5767. 0250: B7EEAAAB ABBEEEA7 A0BAA1EE BAA6ABEE    ................
  5768. 0260: A3A1BBA0 BAAFA7A0 BDE2EEAC BBBAEEB7    ................
  5769. 0270: A1BBEEAD A1BBA2AA EEA0A1BA EEBEBCA1    ................
  5770. 0280: A9BCABBD BDEEA8BB BCBAA6AB BCEEB9A7    ................
  5771. 0290: BAA6A1BB BAEEAFEE A2A7A9A6 BAE0EE9A    ................
  5772. 02A0: A6ABEEAB A0BABCAF A0ADABEE A2A7ABBD    ................
  5773. 02B0: EEBAA1EE BAA6ABEE ABAFBDBA E097A1BB    ................
  5774. 02C0: EEBDBAAF A0AAEEAF A3A7AABD BAEEA2AF    ................
  5775. 02D0: BCA9ABEE BABCA1BE A7ADAFA2 EEBABCAB    ................
  5776. 02E0: ABBDE0EE 8BB6A7BA BDEEA2AB AFAAEEAB    ................
  5777. 02F0: AFBDBAEE AFA0AAEE BDA1BBBA A6E08081    ................
  5778. 0300: 9C9A86E0 808B8F9D 9AE08B9D 819B9A86    ................
  5779. 0310: E09D998B 9D9AE099 82818185 E0828B80    ................
  5780. 0320: 9A8B9C9A 8F858BE0 898B9A8A 9C819E8B    ................
  5781. 0330: 968F8387 808BE08B 968F8382 8789869A    ................
  5782. 0340: 8780988B 809A819C 97E0878D 9B9A9C81    ................
  5783. 0350: 8D859C87 988B9CE0 998F9A8B 9C83879C    ................
  5784. 0360: 9C819C99 8F828587 8089EE9D 9A878D85    ................
  5785. 0370: E0998F82 85878089 8C9B9C80 878089EE    ................
  5786. 0380: 9D9A878D 85E08C9B 9C808780 89868F9A    ................
  5787. 0390: 8D868B9A CFCFC9CF CDCBC9CF C8CCC9CC    ................
  5788. 03A0: CACFC7CF C9CFC8C5 C9CCC2CF CDCBC9CF    ................
  5789. 03B0: C8CDC9CC CACFC7CC C9CFC8CC C9CCC9CC    ................
  5790. 03C0: CDCDCFCB C9CA87BA EEA7BDEE B8ABBCB7    ................
  5791. 03D0: EEA2AFBC A9ABEEAF A0AAEEA6 ABAFB8B7    ................
  5792. 03E0: EEAFA0AA EEAFBEBE ABAFBCBD EEBAA1EE    ................
  5793. 03F0: A6AFB8AB EEACABAB A0EEA6AB BCABEEBD    ................
  5794. 0400: A7A0ADAB EEBAA6AB EE8BAFBC BAA6EEA7    ................
  5795. 0410: BABDABA2 A8EEB9AF BDEEA8A1 BCA3ABAA    ................
  5796. 0420: E0EE9AA6 ABEEA2AB BABAABBC BDEEAE8B    ................
  5797. 0430: 83AEEEAF BCABEEBD ADBCAFBE ABAAEEA7    ................
  5798. 0440: A0BAA1EE BAA6ABEE BDA7AAAB E0CFC9CA    ................
  5799. 0450: CFCFC9CF CDCBC9CF C8CCC9CC CACFC7CF    ................
  5800. 0460: C9CFC8C6 C9CCC2CF CDCBC9CF C8CDC9CC    ................
  5801. 0470: CACFC7CC C9CFC8CC C9CCC9CC CDCDCFCB    ................
  5802. 0480: C9CA97A1 BBAEBCAB EEA4A1A5 A7A0A9EE    ................
  5803. 0490: BCA7A9A6 BAF1EE87 A8EE80AB B9BAA1A0    ................
  5804. 04A0: BDEEA8A7 BCBDBAEE A2AFB9EE BDBAAFBA    ................
  5805. 04B0: ABBDEEBA A6AFBAEE ABB8ABBC B7EEA1AC    ................
  5806. 04C0: A4ABADBA EEADA1A0 BAA7A0BB ABBDEEAF    ................
  5807. 04D0: BAEEBCAB BDBAEEA1 BCEEB9A7 BAA6EEBB    ................
  5808. 04E0: A0A7A8A1 BCA3EEB8 ABA2A1AD A7BAB7EE    ................
  5809. 04F0: BBA0A2AB BDBDEEAF ADBAABAA EEBBBEA1    ................
  5810. 0500: A0EEACB7 EEAFEEBC ABBDBBA2 BAAFA0BA    ................
  5811. 0510: EEA8A1BC ADABE2EE A3B7EEA8 A7BCBDBA    ................
  5812. 0520: EEA2AFB9 EEA7BDEE 9EA6B7BD A7ADBDEE    ................
  5813. 0530: BDBABBAA ABA0BABD EEADAFA0 AEBAEEA2    ................
  5814. 0540: A7A8BAEE BCA1ADA5 BDE0C9CA CFCFC9CF    ................
  5815. 0550: CDCBC9CF C8CCC9CC CACFC7CF C9CFC8C5    ................
  5816. 0560: C9CCC2CF CDCBC9CF C8CDC9CC CACFC7CC    ................
  5817. 0570: C9CFC8CD C9CCC9CC CDCDCFCB C9CA9AA6    ................
  5818. 0580: ABEEB9AF BAABBCEE A8A2A1B9 BDEEBDA2    ................
  5819. 0590: A1B9A2B7 EEA1B8AB BCEEAFEE BDAFA0AA    ................
  5820. 05A0: B7EEACAB AAE2EEAC BCA1A5AB A0EEA7A0    ................
  5821. 05B0: EEA3AFA0 B7EEBEA2 AFADABBD EEACB7EE    ................
  5822. 05C0: BDA3AFA2 A2EEBCA1 ADA5BDE0 C9CACFCF    ................
  5823. 05D0: C9CFCDCB C9CFC8CC C9CCCACF C7CFC9CF    ................
  5824. 05E0: C8C6C9CC C2CFCDCB C9CFC8CD C9CCCACF    ................
  5825. 05F0: C7CCC9CF C8CAC9CC C9CCCDCD CFCBC9CA    ................
  5826. 0600: 8FA2BCA7 A9A6BAEE B9A7BDAB EEA9BBB7    ................
  5827. 0610: EEADBBBA EEBAA6AB EEADBCAF ADA5BDE2    ................
  5828. 0620: EEA7A8EE B7A1BBEE B9AFA0A0 AFEEBDBE    ................
  5829. 0630: ABA0AAEE B7A1BBBC EEA2A7A8 ABEEADA1    ................
  5830. 0640: A2A2ABAD BAA7A0A9 EEBAA6AB EEBCA7B8    ................
  5831. 0650: ABBCBDEE A1A8EEBA A6A7BDEE B9A1BCA2    ................
  5832. 0660: AAEEBAA6 AFBAAEBD EEBBBEBA A1EEB7A1    ................
  5833. 0670: BBE2EEAC BBBAEEBC A7A9A6BA EEA0A1B9    ................
  5834. 0680: EEB9ABAE B8ABEEA9 A1BAEEAF A0EEAFAA    ................
  5835. 0690: B8ABA0BA BBBCABEE BAA1EEBD A1A2B8AB    ................
  5836. 06A0: E0CFC9CA CFCFCCC8 C9CFC8CF C9CCCAC8    ................
  5837. 06B0: CCCBC9CF C8CFC9CC CDCDCFCA C6CFC9CF    ................
  5838. 06C0: CCCBC9CF C8CFC9CC C9CCCFCC CCC8C9CF    ................
  5839. 06D0: C8CFC9CC CACFCCCB C9CFC8CF C9CCCFCF    ................
  5840. 06E0: CDCBC9CF C8CCC9CC CACFC7CF C9CFC8C8    ................
  5841. 06F0: C9CCCDCD CFCCCCC8 C9CFC8CF C9CCCACF    ................
  5842. 0700: C8CFC0CF CFC6C830 CFCFCDCB C9CFC8CC    .......0........
  5843. 0710: C9CCCACF C7CFC9CF C8C5C9CC CDCDCFCB    ................
  5844. 0720: C9CA9AA6 ABBCABAE BDEEA0A1 BAEEA3BB    ................
  5845. 0730: ADA6EEBA A1EEBAAB A2A2E0CF C9CACFCF    ................
  5846. 0740: CDCBC9CF C8CCC9CC CACFC7CB CDCDCFCB    ................
  5847. 0750: C9CA9DA1 BCBCB7E2 EEBAA6AF BAEEADA1    ................
  5848. 0760: A3A3AFA0 AAEEA7BD EEA0A1BA EEBBA0AA    ................
  5849. 0770: ABBCBDBA A1A1AAE0 C9CA97A1 BBEEBDBA    ................
  5850. 0780: AFA0AAEE AFA3A7AA BDBAEEA2 AFBCA9AB    ................
  5851. 0790: EEBABCA1 BEA7ADAF A2EEBABC ABABBDE0    ................
  5852. 07A0: EE8BB6A7 BABDEEA2 ABAFAAEE B9ABBDBA    ................
  5853. 07B0: EEAFA0AA EEBDA1BB BAA6E0CF CFCDCBC9    ................
  5854. 07C0: CFC8CCC9 CCCAC8C7 CFC9CFC8 C4C9CCCD    ................
  5855. 07D0: CDCFC2C8 9FCFC5CC C8C9CFC8 CCC9CCCA    ................
  5856. 07E0: CFC8CCCD C8C831CF C0CFCFCC CCC9CFCC    ......1.........
  5857. 07F0: C8C9CFC8 CCC9CCC9 CCCACFC8 31CDCDCF    ............1...
  5858. 0800: CBC9CA9A A6ABEEC9 CAC9CDC6 CCC9CFCC    ................
  5859. 0810: C8C9CFC8 CCC9CCC9 CCC9CDC9 CAE0CFC9    ................
  5860. 0820: CACFCBC9 CA97A1BB EEAFBCAB EEADBBBC    ................
  5861. 0830: BCABA0BA A2B7EEAD AFBCBCB7 A7A0A9F4    ................
  5862. 0840: CFC9CACF CFC9CFC9 CFCDCBC9 CFC8CCC9    ................
  5863. 0850: CCCACFC7 CFC9CFC8 C6C9CCC2 CFCDCBC9    ................
  5864. 0860: CFC8CDC9 CCCACFC7 CDC9CFCC C9C9CCC9    ................
  5865. 0870: CCC2CFCC CCC9CFCC C9C9CCCA CFCCCBC9    ................
  5866. 0880: CFC8CFC9 CCC9CCCD CDCFCBC9 CA97A1BB    ................
  5867. 0890: EEBAAFA5 ABEEBAA6 ABEECFC9 CAC9CDC6    ................
  5868. 08A0: CCC9CFCC C9C9CCC9 CDC9CAE0 CFC9CAC0    ................
  5869. 08B0: CFCFCCCC CCC9CFCC C9C9CCCA CFC831CF    ..............1.
  5870. 08C0: CFC9CFC9 CFCDCBC9 CFC8CCC9 CCCACFC7    ................
  5871. 08D0: CFC9CFC8 C7C9CCC2 CFCDCBC9 CFC8CDC9    ................
  5872. 08E0: CCCACFC7 CDC9CFCC C9C9CCC9 CCC2CFCC    ................
  5873. 08F0: CCC9CFCC C9C9CCCA CFC831C9 CCCDCDCF    ..........1.....
  5874. 0900: CBC9CA97 A1BBEEAA BCA1BEEE BAA6ABEE    ................
  5875. 0910: CFC9CAC9 CDC6CCC9 CFCCC9C9 CCC9CDC9    ................
  5876. 0920: CAE0CFC9 CAC0CFCF CCCCCCC9 CFCCC9C9    ................
  5877. 0930: CCCACFCC CBC9CFC8 CFC9CC8D 868F9C9C    ................
  5878. 0940: 8B8AEE9D 9A9B839E E09D9A9B 839ECFCF    ................
  5879. 0950: CCC8C9CF C8CDC9CC CAC8C8CF CDCDCFCC    ................
  5880. 0960: CCC8C9CF C8CDC9CC CACFC9CF CCC8C9CF    ................
  5881. 0970: C8CDC9CC CBCFC8CC C9CCCFCF C9CFC9CF    ................
  5882. 0980: C9CFCDCB C9CFC8CC C9CCCACF C7CFC9CF    ................
  5883. 0990: C8C2C9CC C2CFCDCB C9CFC8CD C9CCCACF    ................
  5884. 09A0: C7CDC9CF C8CDC9CC C9CCC2CF CCCCC9CF    ................
  5885. 09B0: C8CDC9CC CACFC831 C9CCC2CF CCCCC9CF    .......1........
  5886. 09C0: C8CCC9CC CACFC831 C9CCCDCD CFCBC9CA    .......1........
  5887. 09D0: 9AA6ABEE BCAFB7BD EEA1A8EE BAA6ABEE    ................
  5888. 09E0: BDBBA0EE BCABA8A2 ABADBAEE A1A8A8EE    ................
  5889. 09F0: BAA6ABEE A3A7BCBC A1BCEEBD ADA1BCAD    ................
  5890. 0A00: A6A7A0A9 EEBAA6AB EEBDBAA7 ADA5E2EE    ................
  5891. 0A10: B9A6A7AD A6EEAFBD EEAFEEBC ABBDBBA2    ................
  5892. 0A20: BAE2EEAC BBBCA0BD EEBDA2A1 B9A2B7EE    ................
  5893. 0A30: AFB9AFB7 E0CFC9CA C0CFCFCC CCCCC9CF    ................
  5894. 0A40: C8CDC9CC CACFC8CF C0CFCFCC CCCCC9CF    ................
  5895. 0A50: C8CAC9CC CACFC831 C0CFCFCC CCC8C9CF    .......1........
  5896. 0A60: C8CDC9CC CACFC8CC CFCFC9CF C9CFCCCB    ................
  5897. 0A70: C9CFC8CF C9CCCACF C8CAC2CF CCCCC9CF    ................
  5898. 0A80: C8CBC9CC CACFC8CF C9CCC2CF CCCCC9CF    ................
  5899. 0A90: C8CAC9CC CACFC831 C9CCCDCD CFCCCCCC    .......1........
  5900. 0AA0: C9CFC8CB C9CCCACF C8CACFCF C9CFC9CF    ................
  5901. 0AB0: CCCBC9CF C8CFC9CC CACFC8CA C2CFCCCC    ................
  5902. 0AC0: C9CFC8CB C9CCCACF C8CAC9CC C2CFCCCC    ................
  5903. 0AD0: C9CFC8CA C9CCCAC8 C831C9CC CDCDCFCC    .........1......
  5904. 0AE0: CCCCC9CF C8CBC9CC CACFC8CF CFCFCCC8    ................
  5905. 0AF0: C9CFC8CD C9CCCACF C8C8CDCD CFCBC9CA    ................
  5906. 0B00: 9AA6ABEE BDBAA7AD A5EEB9A7 BAA6ABBC    ................
  5907. 0B10: BDEEAFA0 AAEEA9A1 ABBDEEA1 BBBAE0CF    ................
  5908. 0B20: C9CAC0CF CFCCCCCC C9CFC8C8 C9CCCACF    ................
  5909. 0B30: CCCCC9CF C8CAC9CC C0CFCFCC CCCCC9CF    ................
  5910. 0B40: C8CAC9CC CACFC8CF 8C818F9A 9A9C8B8B    ................
  5911. 0B50: E09A9C8B 8B9DCFC6 C8CBCFCF C9CFCDCB    ................
  5912. 0B60: C9CFC8CC C9CCCACF C7CFC9CF C8C5C9CC    ................
  5913. 0B70: C2CFCDCB C9CFC8CD C9CCCACF C7CCC9CF    ................
  5914. 0B80: C8CAC9CC C9CCCDCD CFCBC9CA 9AA6ABEE    ................
  5915. 0B90: BABCABAB BDEEA6AB BCABEEAF BCABEEBF    ................
  5916. 0BA0: BBA7BAAB EEA2AFBC A9ABE2EE ACABA7A0    ................
  5917. 0BB0: A9EEB9A6 AFBAEEAF EEA6ABA2 BEA8BBA2    ................
  5918. 0BC0: EEBEABBC BDA1A0EE B9A1BBA2 AAEEADAF    ................
  5919. 0BD0: A2A2EEAE ACA1AFBA EEBDA7B4 ABAAAEE0    ................
  5920. 0BE0: C9CACFCF C9CFC9CF C9CFCDCB C9CFC8CC    ................
  5921. 0BF0: C9CCCACF C7CFC9CF C8C3C9CC C2CFCDCB    ................
  5922. 0C00: C9CFC8CD C9CCCACF C7CCC9CF C8CAC9CC    ................
  5923. 0C10: C9CCC2CF CCCCC9CF C8CBC9CC CACFC831    ...............1
  5924. 0C20: C9CCC2CF CCCCC9CF C8C9C9CC CACFC8CF    ................
  5925. 0C30: C9CCCDCD CFCBC9CA 97A1BBEE ADBBBAEE    ................
  5926. 0C40: AAA1B9A0 EEAFEEA3 ABAAA7BB A3EEBDA7    ................
  5927. 0C50: B4ABAAEE BABCABAB EEAFA0AA EEBDA6AF    ................
  5928. 0C60: BEABEEA7 BAEEA7A0 BAA1EEAF EEBCA1BB    ................
  5929. 0C70: A9A6A2B7 EEA3AFAA ABEEACA1 AFBAE0CF    ................
  5930. 0C80: C9CAC0CF CFCCCCCC C9CFC8C9 C9CCCACF    ................
  5931. 0C90: CCCBC9CF C8CFC9CC CFCFC9CF CDCBC9CF    ................
  5932. 0CA0: C8CCC9CC CACFC7CF C9CFC8CA C9CCC2CF    ................
  5933. 0CB0: CCCCC9CF C8C9C9CC CACFC831 C9CCCDCD    ...........1....
  5934. 0CC0: CFCBC9CA 97A1BBEE BDAFA7A2 EEBDA1BB    ................
  5935. 0CD0: BAA6EEA7 A0EEB7A1 BBBCEEBA BCABABEE    ................
  5936. 0CE0: ACA1AFBA E0EE99AB A2A2EEAA A1A0ABEF    ................
  5937. 0CF0: EE97A1BB EEA6AFB8 ABEEABBD ADAFBEAB    ................
  5938. 0D00: AAEEA8BC A1A3EEBA A6ABEEAA ABBDABBC    ................
  5939. 0D10: BAEEA7BD A2AFA0AA E0CFC9CA C0CFCFC4    ................
  5940. 0D20: C0CFCFCC CCCBC9CF C8CFC9CC CACFC8CF    ................
  5941. 0D30: CFCFC9CF CDCBC9CF C8CCC9CC CACFC7CF    ................
  5942. 0D40: C9CFC8CA C9CCC2CF CCCCC9CF C8C9C9CC    ................
  5943. 0D50: CACFC831 C9CCCDCD CFCBC9CA 97A1BBEE    ...1............
  5944. 0D60: BDAFA7A2 EEBDA1BB BAA6EEA7 A0EEB7A1    ................
  5945. 0D70: BBBCEEBA BCABABEE ACA1AFBA E0EE99AB    ................
  5946. 0D80: A2A2EEAA A1A0ABEF EE97A1BB EEA6AFB8    ................
  5947. 0D90: ABEEABBD ADAFBEAB AAEEA8BC A1A3EEBA    ................
  5948. 0DA0: A6ABEEAA ABBDABBC BAEEA7BD A2AFA0AA    ................
  5949. 0DB0: E0CFC9CA C0CFCFC4 C0CFCFCC CCCBC9CF    ................
  5950. 0DC0: C8CFC9CC CACFC8CF 00                   .........
  5951.  
  5952.  
  5953.  
  5954.  
  5955.  
  5956.  
  5957.  
  5958.  
  5959.  
  5960.  
  5961.  
  5962.  
  5963.  
  5964.  
  5965.  
  5966.  
  5967.  
  5968.  
  5969.  
  5970.  
  5971.  
  5972.  
  5973.  
  5974.  
  5975.  
  5976.  
  5977.  
  5978.  
  5979.  
  5980.  
  5981.  
  5982.  
  5983.  
  5984.  
  5985.  
  5986.  
  5987.  
  5988.  
  5989.  
  5990.  
  5991.  
  5992.  
  5993.  
  5994.  
  5995. Below is a hex dump of the data file for the example adventure `Escape
  5996. from desert island`. As you can see the `intelligent` save has removed
  5997. the massive groupings of just zero bytes that would usually occur.
  5998.  
  5999.  
  6000. 0000: 00000001 00000005 00000000 00000122    ..............."
  6001. 0010: 00000122 000000CA 000001EC 000000A5    ..."............
  6002. 0020: 00000291 00000041 0000074E 00000041    .......A...N...A
  6003. 0030: 00000001 0000000C 000002D2 00000007    ................
  6004. 0040: 000002D9 00000006 000002DF 00000007    ................
  6005. 0050: 000002E6 00000006 000002EC 00000006    ................
  6006. 0060: 000002F2 00000005 000002F7 00000008    ................
  6007. 0070: 000002FF 00000004 00000314 0000000B    ................
  6008. 0080: 00000303 0000000C 0000030F 00000005    ................
  6009. 0090: 0000031F 00000003 00000001 00000003    ................
  6010. 00A0: 00000322 00000004 00000326 0000000B    ...".......&....
  6011. 00B0: 00000B20 0000000A 00000001 00000006    ... ............
  6012. 00C0: 00000331 00000006 00000004 00000000    ...1............
  6013. 00D0: 00000000 00000000 00000000 00000000    ................
  6014. 00E0: 00000000 00000000 00000000 00000337    ...............7
  6015. 00F0: 00000015 000000FE 00000000 00000000    ................
  6016. 0100: 00000000 00000000 00000000 00000000    ................
  6017. 0110: 00000000 00000000 0000034C 00000015    ...........L....
  6018. 0120: 00000000 00000000 00000000 00000000    ................
  6019. 0130: 00000000 00000000 00000000 00000000    ................
  6020. 0140: 00000000 00000361 00000007 00000000    .......a........
  6021. 0150: 00000000 00000000 00000000 00000000    ................
  6022. 0160: 00000000 00000000 00000000 00000000    ................
  6023. 0170: 0000090F 00000013 00000000 00000000    ................
  6024. 0180: 00000000 00000000 00000000 00000000    ................
  6025. 0190: 00000000 00000000 00000000 00000B1C    ................
  6026. 01A0: 00000004 00000000 00000000 00000000    ................
  6027. 01B0: 00000000 00000000 00000000 00000000    ................
  6028. 01C0: 00000000 00000000 00000000 00000000    ................
  6029. 01D0: 00000000 00000000 00000000 00000000    ................
  6030. 01E0: 00000000 00000000 00000001 00000001    ................
  6031. 01F0: 00000000 00000000 00000000 00000000    ................
  6032. 0200: 00000000 00000000 00000000 00000000    ................
  6033. 0210: 00000000 00000000 00000000 00000000    ................
  6034. 0220: 00000000 00000000 00000000 00000000    ................
  6035. 0230: 00000000 00000000 00000000 00000000    ................
  6036. 0240: 00000000 00000000 00000000 00000019    ................
  6037. 0250: 00000368 000000BC 00000001 0000000A    ...h............
  6038. 0260: 00000424 000000FC 00000001 00000014    ...$............
  6039. 0270: 00000C6C 00000098 00000001 0000001E    ...l............
  6040. 0280: 00000520 00000082 00000002 0000000A    ... ............
  6041. 0290: 000005A2 000000D6 00000002 00000014    ................
  6042. 02A0: 00000D04 00000098 00000002 0000001E    ................
  6043. 02B0: 00000BB6 000000B6 00000004 0000000A    ................
  6044. 02C0: 00000B2E 00000088 00000004 00000014    ................
  6045. 02D0: 00000B2A 00000004 00000005 0000000A    ...*............
  6046. 02E0: 00000A3C 00000042 000000FD 0000000A    ...<...B........
  6047. 02F0: 00000A7E 00000042 000000FD 00000014    ...~...B........
  6048. 0300: 00000678 00000026 000000FD 0000001E    ...x...&........
  6049. 0310: 0000069E 00000014 000000FD 00000028    ...............(
  6050. 0320: 00000922 0000002C 000000FD 00000032    ..."...,.......2
  6051. 0330: 00000AC0 0000005C 000000FD 0000003C    .......\.......<
  6052. 0340: 000006B2 0000002A 000000FE 0000000A    .......*........
  6053. 0350: 000006DC 00000036 000000FE 00000014    .......6........
  6054. 0360: 0000078F 0000001A 000000FE 0000001E    ................
  6055. 0370: 000007F5 00000022 000000FE 00000028    .......".......(
  6056. 0380: 000007A9 00000012 000000FE 00000032    ...............2
  6057. 0390: 000007BD 00000038 000000FE 0000003C    .......8.......<
  6058. 03A0: 000007BB 00000002 000000FE 00000046    ...............F
  6059. 03B0: 00000817 0000007C 000000FE 00000050    .......|.......P
  6060. 03C0: 00000893 0000007C 000000FE 0000005A    .......|.......Z
  6061. 03D0: 0000094E 000000EE 000000FE 00000064    ...N...........d
  6062. 03E0: 00000712 0000003C 000000FE 0000006E    .......<.......n
  6063. 03F0: 00000001 00000000 00000000 00000001    ................
  6064. 0400: 00000001 00000001 00000000 00000000    ................
  6065. 0410: 00000000 00000000 00000000 00000000    ................
  6066. 0420: 00000001 00000006 00000004 00000002    ................
  6067. 0430: 00000001 00000005 00000000 00000000    ................
  6068. 0440: 00000000 00000000 00000000 00000000    ................
  6069. 0450: 00000000 00000000 00000000 00000000    ................
  6070. 0460: 00000000 00000000 00000002 00000001    ................
  6071. 0470: 00000004 00000003 00000001 00000004    ................
  6072. 0480: 00000006 00000003 00000000 00000000    ................
  6073. 0490: 00000000 00000000 00000000 00000000    ................
  6074. 04A0: 00000000 00000000 00000002 00000002    ................
  6075. 04B0: 00000000 00000000 00000000 00000000    ................
  6076. 04C0: 00000000 00000000 00000000 00000000    ................
  6077. 04D0: 00000000 00000000 00000000 00000000    ................
  6078. 04E0: 00000000 00000000 00000003 00000002    ................
  6079. 04F0: 00000002 00000005 00000000 00000000    ................
  6080. 0500: 00000000 00000000 00000000 00000000    ................
  6081. 0510: 00000000 00000000 00000000 00000000    ................
  6082. 0520: 00000000 00000000 00000004 00000004    ................
  6083. 0530: 00000003 00000001 00000000 00000000    ................
  6084. 0540: 00000000 00000000 00000000 00000000    ................
  6085. 0550: 00000000 00000000 00000000 00000000    ................
  6086. 0560: 00000000 00000000 00000000 00000000    ................
  6087. 0570: 00000000 00000000 00000000 00000000    ................
  6088. 0580: 00000000 00000000 00000000 00000000    ................
  6089. 0590: 00000000 00000000 00000000 00000000    ................
  6090. 05A0: 00000000 00000000 00000001 00000003    ................
  6091. 05B0: 00000002 00000004 00000000 00000000    ................
  6092. 05C0: 00000000 00000000 00000000 00000000    ................
  6093. 05D0: 00000000 00000000 00000000 00000000    ................
  6094. 05E0: 00000000 00000000 00000000 00000000    ................
  6095. 05F0: 00000000 00000000 00000000 00000000    ................
  6096. 0600: 00000000 00000000 00000000 00000000    ................
  6097. 0610: 00000000 00000000 00000000 00000000    ................
  6098. 0620: 00000000 00000000                      ........
  6099.  
  6100.  
  6101.  
  6102.  
  6103. Here is sample output from the run-time control program, showing that
  6104. the codes given earlier are actually interpreted correctly, and that
  6105. the adventure is `playable`. The solution presented below sould prove
  6106. beyond doubt that FRAC does in fact work, and I consider this to be the
  6107. ultimate test.
  6108.  
  6109.  
  6110. You are standing on a warm tropical beach. To the south the placid sea
  6111. hardly ripples under the beams of the hot sun. A few yards away a large
  6112. grey rock basks in the summer rays. To the west there appears to be a
  6113. cave, sheltered in the rockface, while the north holds lush green
  6114. vegetation.
  6115.  
  6116. examine rock
  6117.  
  6118. It is very large and heavy and appears to have been here since the
  6119. earth itself was formed. The letters `EM` are scraped into one side.
  6120.  
  6121. em
  6122.  
  6123. Sorry, that command is not understood.
  6124.  
  6125. west
  6126.  
  6127. You stand in the shadow of a large rockface. A small river runs from
  6128. the forests (which lie north) into the sea, passing in front of quite a
  6129. large cave which has somehow found its way into the rockface.
  6130.  
  6131. examine river
  6132.  
  6133. The water flows slowly over a sandy bed, broken in many places by small
  6134. rocks.
  6135.  
  6136. examine rocks
  6137.  
  6138. There`s not much to tell.
  6139.  
  6140. look
  6141.  
  6142. You stand in the shadow of a large rockface. A small river runs from
  6143. the forests (which lie north) into the sea, passing in front of quite a
  6144. large cave which has somehow found its way into the rockface.
  6145.  
  6146. enter cave
  6147.  
  6148. You are in a very dark cave which seems to tunnel its way deep into the
  6149. mountains, but you could not progress further without a light. The
  6150. entrance lies to the east.
  6151.  
  6152. east
  6153.  
  6154. You stand in the shadow of a large rockface. A small river runs from
  6155. the forests (which lie north) into the sea, passing in front of quite a
  6156. large cave which has somehow found its way into the rockface.
  6157.  
  6158. north
  6159.  
  6160. You stand amidst large tropical trees. Exits lead east and south. You
  6161. can also see a mirror.
  6162.  
  6163. take mirror
  6164.  
  6165. You take the mirror.
  6166.  
  6167. inventory
  6168.  
  6169. You are carrying a mirror, and a walking stick.
  6170.  
  6171. south
  6172.  
  6173. You stand in the shadow of a large rockface. A small river runs from
  6174. the forests (which lie north) into the sea, passing in front of quite a
  6175. large cave which has somehow found its way into the rockface.
  6176.  
  6177. light the stick using the mirror
  6178.  
  6179. The rays of the sun reflect off the mirror scorching the stick which,
  6180. as a result, burns slowly away.
  6181.  
  6182. west
  6183.  
  6184. You are in the cave. You can also see a hatchet.
  6185.  
  6186. take hatchet
  6187.  
  6188. You take the hatchet.
  6189.  
  6190. inventory
  6191.  
  6192. You are currently carrying a mirror, a burning stick, and a hatchet.
  6193.  
  6194. east
  6195.  
  6196. The stick withers and goes out.
  6197. You stand in the shadow of a large rockface. A small river runs from
  6198. the forests (which lie north) into the sea, passing in front of quite a
  6199. large cave which has somehow found its way into the rockface.
  6200.  
  6201. drop stick
  6202.  
  6203. You drop the stick.
  6204.  
  6205. north
  6206.  
  6207. You stand amidst large tropical trees. Exits lead east and south.
  6208.  
  6209. cut tree using hatchet
  6210.  
  6211. You cut down a medium sized tree and shape it into a roughly made boat.
  6212.  
  6213. get boat
  6214.  
  6215. You take the boat.
  6216.  
  6217. south
  6218.  
  6219. You stand in the shadow of a large rockface. A small river runs from
  6220. the forests (which lie north) into the sea, passing in front of quite a
  6221. large cave which has somehow found its way into the rockface. You also
  6222. see a withered stick.
  6223.  
  6224. east
  6225.  
  6226. You are standing on a warm tropical beach. To the south the placid sea
  6227. hardly ripples under the beams of the hot sun. A few yards away a large
  6228. grey rock basks in the summer rays. To the west there appears to be a
  6229. cave, sheltered in the rockface, while the north holds lush green
  6230. vegetation.
  6231.  
  6232. south
  6233.  
  6234. You sail south in your tree boat. Well done! You have escaped from the
  6235. desert island.
  6236.