home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part12 < prev    next >
Internet Message Format  |  1992-08-02  |  44KB

  1. Path: uunet!mcsun!news.funet.fi!hydra!klaava!hurtta
  2. From: Kari.Hurtta@Helsinki.FI (Kari E. Hurtta)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Monster Helsinki V 1.04 - part 12/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.014835.4289@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 01:48:35 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1286
  12.  
  13. Archieve-name: monster_helsinki_104/part12
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 12/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 12 -+-+-+-+-+-+-+-+
  20. X        BAD_PUNCH = 10;         `123 punch for experience people `125
  21. X`009`009`009`009`123 hurtta@finuh `125
  22. X`009maxlevels = 50;`009`009`123 how many levels there are `125
  23. X`009DEFAULT_LINE = 32000;`009`123 A virtual one liner record number that
  24. X`009`009`009`009  really means "use the default one liner
  25. X`009`009`009`009  description instead of reading one from
  26. X`009`009`009`009  the file" `125
  27. X
  28. X
  29. X`009START_LOCATION = 1;`009`123 new player start from Great Hall `125
  30. X
  31. X`123 Mnemonics for directions `125
  32. X
  33. X`009north = 1;
  34. X`009south = 2;
  35. X`009east = 3;
  36. X`009west = 4;
  37. X`009up = 5;
  38. X`009down = 6;
  39. X
  40. X
  41. X`123 Index record mnemonics `125
  42. X
  43. X`009I_BLOCK = 1;`009`123 True if description block is not used`009`009`125
  44. X`009I_LINE = 2;`009`123 True if line slot is not used`009`009`009`125
  45. X`009I_ROOM = 3;`009`123 True if room slot is not in use`009`009`125
  46. X`009I_PLAYER = 4;`009`123 True if slot is not occupied by a player`009`125
  47. X`009I_ASLEEP = 5;`009`123 True if player is not playing`009`009`009`125
  48. X`009I_OBJECT = 6;`009`123 True if object record is not being used`009`125
  49. X`009I_INT = 7;`009`123 True if int record is not being used`009`009`125
  50. X `009I_HEADER = 8;`009`123 True if interpreter header record not being`009`1
  51. V25
  52. X`009`009`009`123 used (hurtta@finuh)`009`009`009`009`125
  53. X`009`123I_GLOBAL = 9;`125`009`123 Values of global flags - default: true`009
  54. V`125
  55. X`009I_SPELL  = 10;`009`123 True if spell not defined`009`009`009`125
  56. X
  57. X
  58. X`123 Integer record mnemonics `125
  59. X
  60. X`009N_LOCATION = 1;`009`009`123 Player's location `125
  61. X`009N_NUMROOMS = 2;`009`009`123 How many rooms they've made `125
  62. X`009N_ALLOW = 3;`009`009`123 How many rooms they're allowed to make `125
  63. X`009N_ACCEPT = 4;`009`009`123 Number of open accept exits they have `125
  64. X`009N_EXPERIENCE = 5;`009`123 How "good" they are `125
  65. X`009N_SELF = 6;`009`009`123 player's self descriptions `125
  66. X`009N_PRIVILEGES = 7;`009`123 Players' privileges `125 `123leino@finuha`125
  67. X        N_HEALTH = 8;`009`009`123 Players' health `125 `123 hurtta@finuh `12
  68. V5
  69. X`009N_SPELL`009 = 9;`009`009`123 Spell's header number `125
  70. X        N_GLOBAL = 10;`009`009`123 Global flags and values (default: false)
  71. V `125
  72. X
  73. X`123 Name record mnemonics `125
  74. X
  75. X`009T_NAM`009= 1;`009    `123 rooms' name `125
  76. X`009T_OWN`009= 2;`009    `123 rooms' owner `125
  77. X`009T_PERS`009= 3;`009    `123 players' personal name `125
  78. X`009T_USER`009= 4;`009    `123 players' userid `125
  79. X`009T_OBJNAM = 5;`009    `123 objects' name `125
  80. X`009T_OBJOWN = 6;`009    `123 objects' owner `125
  81. X`009T_DATE`009= 7;`009    `123 players' date of last play `125
  82. X`009T_TIME`009= 8;`009    `123 players' time of last play `125
  83. X`009T_PASSWD = 9;`009    `123 players' password `125
  84. X`009T_REAL_USER = 10;   `123 players' userid `125
  85. X`009T_SPELL_NAME = 11;  `123 spells' name `125
  86. X
  87. X`009T_MAX = 11;
  88. X
  89. X`123 object kind mnemonics `125
  90. X
  91. X`009O_BLAND = 0;`009`009`123 bland object, good for keys `125
  92. X`009O_WEAPON = 1;
  93. X`009O_ARMOR = 2;
  94. X`009O_THRUSTER = 3;`009`009`123 use puts player through an exit `125
  95. X`009O_DISGUISE = 4;`009`009`123 Don't show player name `125
  96. X`009O_BOOK = 5;`009`009`123 learns new spell `125
  97. X
  98. X
  99. X`009O_TRAP = 10;`009`009`123 use causes attack to player who tries to `125
  100. X`009`009`009`009`123 get it (hurtta@finuh) `125
  101. X
  102. X`009O_BAG = 100;
  103. X`009O_CRYSTAL = 101;
  104. X`009O_WAND = 102;
  105. X`009O_HAND = 103;
  106. X`009O_TELEPORT_RING = 104;`009`123 causes random teleporting`009`125
  107. X        O_HEALTH_RING = 105;
  108. X       `032
  109. X`009O_MAGIC_RING = 200;
  110. X
  111. X`123 object parms fiels `125
  112. X`009`123 O_BOOK: `125
  113. X`009OP_SPELL = 1;`009`009`123 spell number `125
  114. X
  115. X
  116. X
  117. X`123 player kind mnemonics  `125
  118. X
  119. X`009P_PLAYER = 1;
  120. X`009P_MONSTER = 2;
  121. X
  122. X`123 Command Mnemonics `125
  123. X`009error = 0;
  124. X`009setnam = 1;
  125. X`009help = 2;
  126. X`009quest = 3;
  127. X`009quit = 4;
  128. X`009look = 5;
  129. X`009go = 6;
  130. X`009form = 7;
  131. X`009link = 8;
  132. X`009unlink = 9;
  133. X`009c_whisper = 10;
  134. X`009poof = 11;
  135. X`009desc = 12;                               `032
  136. X        c_dcl = 13;
  137. X`009dbg = 14;
  138. X`009say = 15;
  139. X        c_scan = 16;
  140. X`009c_rooms = 17;
  141. X`009c_system = 18;
  142. X`009c_disown = 19;
  143. X`009c_claim = 20;
  144. X`009c_create = 21;
  145. X`009c_public = 22;
  146. X`009c_accept = 23;
  147. X`009c_refuse = 24;
  148. X`009c_zap = 25;
  149. X`009c_hide = 26;
  150. X`009c_l = 27;
  151. X`009c_north = 28;
  152. X`009c_south = 29;
  153. X`009c_east = 30;
  154. X`009c_west = 31;
  155. X`009c_up = 32;
  156. X`009c_down = 33;
  157. X`009c_n = 34;
  158. X`009c_s = 35;
  159. X`009c_e = 36;
  160. X`009c_w = 37;
  161. X`009c_u = 38;
  162. X`009c_d = 39;
  163. X`009c_custom = 40;
  164. X`009c_who = 41;
  165. X`009c_players = 42;
  166. X`009c_search = 43;
  167. X`009c_unhide = 44;
  168. X`009c_punch = 45;
  169. X`009c_ping = 46;
  170. X`009c_health = 47;
  171. X`009c_get = 48;
  172. X`009c_drop = 49;
  173. X`009c_inv = 50;
  174. X`009c_i = 51;
  175. X`009c_self = 52;
  176. X`009c_whois = 53;
  177. X`009c_duplicate = 54;
  178. X`009c_score = 55;
  179. X`009c_version = 56;
  180. X`009c_objects = 57;
  181. X`009c_use = 58;
  182. X`009c_wield = 59;
  183. X`009c_brief = 60;
  184. X`009c_wear = 61;
  185. X`009c_relink = 62;
  186. X`009c_unmake = 63;
  187. X`009c_destroy = 64;
  188. X`009c_show = 65;
  189. X`009c_set = 66;
  190. X`009c_monster = 67;
  191. X`009c_erase = 68;
  192. X`009c_atmosphere = 69;
  193. X`009c_reset = 70;
  194. X`009c_summon = 71;
  195. X`009c_spells = 72;
  196. X`009c_monsters = 73;
  197. X`009`123 for alias `125
  198. X`009A_list   = 74;
  199. X`009A_create = 75;
  200. X`009A_delete = 76;
  201. X`009`123 ---- `125
  202. X
  203. X`009e_detail = 100;`009`009`123 pseudo command for log_action of desc exit `
  204. V125
  205. X`009e_custroom = 101;`009`123 customizing this room `125
  206. X`009e_program = 102;`009`123 customizing (programming) an object `125
  207. X`009e_usecrystal = 103;`009`123 using a crystal ball `125
  208. X`009e_custommonster = 104;  `123 customizing monster `125
  209. X`009e_customspell = 105;    `123 customizing spell `125`032
  210. X
  211. X
  212. X`123 Show Mnemonics `125
  213. X       `032
  214. X`009s_exits = 1;
  215. X`009s_object = 2;
  216. X`009s_quest = 3;
  217. X`009s_details = 4;
  218. X`009s_monster = 5;
  219. X`009s_priv = 6;
  220. X`009s_time = 7;
  221. X`009s_room = 8;
  222. X`009s_paper = 9;
  223. X`009s_levels = 10;
  224. X`009s_quota  = 11;
  225. X`009s_spell  = 12;
  226. X
  227. X`123 Set Mnemonics `125
  228. X
  229. X`009y_quest = 1;
  230. X
  231. X`123`009y_altmsg = 2;
  232. X`009y_group1 = 3;
  233. X`009y_group2 = 4;`009`125
  234. X
  235. X`009y_passwd = 2;
  236. X`009y_peace`009=  3;
  237. X`009y_war`009=  4;
  238. X`009y_priv  =  5;
  239. X`009y_spell =  6;
  240. X`009y_newplayer = 7;
  241. X`009y_welcome =8;
  242. X
  243. X
  244. X`123 Event Mnemonics `125
  245. X
  246. X`009E_EXIT = 1;`009`009`123 player left room`009`009`009`125
  247. X`009E_ENTER = 2;`009`009`123 player entered room`009`009`009`125
  248. X`009E_BEGIN = 3;`009`009`123 player joined game here`009`009`125
  249. X`009E_QUIT = 4;`009`009`123 player here quit game`009`009`009`125
  250. X`009
  251. X`009E_SAY = 5;`009`009`123 someone said something`009`009`125
  252. X`009E_SETNAM = 6;`009`009`123 player set his personal name`009`009`125
  253. X`009E_POOFIN = 8;`009`009`123 someone poofed into this room`009`009`125
  254. X`009E_POOFOUT = 9;`009`009`123 someone poofed out of this room`009`125
  255. X`009E_DETACH = 10;`009`009`123 a link has been destroyed`009`009`125
  256. X`009E_EDITDONE = 11;`009`123 someone is finished editing a desc`009`125
  257. X`009E_NEWEXIT = 12;`009`009`123 someone made an exit here`009`009`125
  258. X`009E_BOUNCEDIN = 13;`009`123 an object "bounced" into the room`009`125
  259. X`009E_EXAMINE = 14;`009`009`123 someone is examining something`009`125
  260. X`009E_CUSTDONE = 15;`009`123 someone is done customizing an exit`009`125
  261. X`009E_FOUND = 16;`009`009`123 player found something`009`009`125
  262. X`009E_SEARCH = 17;`009`009`123 player is searching room`009`009`125
  263. X`009E_DONEDET = 18;`009`009`123 done adding details to a room`009`009`125
  264. X`009E_HIDOBJ = 19;`009`009`123 someone hid an object here`009`009`125
  265. X`009E_UNHIDE = 20;`009`009`123 voluntarily revealed themself`009`009`125
  266. X`009E_FOUNDYOU = 21;`009`123 someone found someone else hiding`009`125
  267. X`009E_PUNCH = 22;`009`009`123 someone has punched someone else`009`125
  268. X`009E_MADEOBJ = 23;`009`009`123 someone made an object here`009`009`125
  269. X`009E_GET = 24;`009`009`123 someone picked up an object`009`009`125
  270. X`009E_DROP = 25;`009`009`123 someone dropped an object`009`009`125
  271. X`009E_DROPALL = 26;`009`009`123 quit & dropped stuff on way out`009`125
  272. X`009E_IHID = 27;`009`009`123 tell others that I have hidden (!)`009`125
  273. X`009E_NOISES = 28;`009`009`123 strange noises from hidden people`009`125
  274. X`009E_PING = 29;`009`009`123 send a ping to a potential zombie`009`125
  275. X`009E_PONG = 30;`009`009`123 ping answered`009`009`009`009`125
  276. X`009E_HIDEPUNCH = 31;`009`123 someone hidden is attacking`009`009`125
  277. X`009E_SLIPPED = 32;`009`009`123 attack caused obj to drop unwillingly `125
  278. X`009E_ROOMDONE = 33;`009`123 done customizing this room`009`009`125
  279. X`009E_OBJDONE = 34;`009`009`123 done programming an object`009`009`125
  280. X`009E_HPOOFOUT = 35;`009`123 someone hiding poofed`009out`009`009`125
  281. X`009E_FAILGO = 36;`009`009`123 a player failed to go through an exit `125
  282. X`009E_HPOOFIN = 37;`009`009`123 someone poofed into a room hidden`009`125
  283. X`009E_TRYPUNCH = 38;`009`123 someone failed to punch someone else`009`125
  284. X`009E_PINGONE = 39;`009`009`123 someone was pinged away . . .`009`009`125
  285. X`009E_CLAIM = 40;`009`009`123 someone claimed this room`009`009`125
  286. X`009E_DISOWN = 41;`009`009`123 owner of this room has disowned it`009`125
  287. X`009E_WEAKER = 42;`009`009`123 person is weaker from battle`009`009`125
  288. X`009E_OBJCLAIM = 43;`009`123 someone claimed an object`009`009`125
  289. X`009E_OBJDISOWN = 44;`009`123 someone disowned an object`009`009`125
  290. X`009E_SELFDONE = 45;`009`123 done editing self description`009`009`125
  291. X`009E_WHISPER = 46;`009`009`123 someone whispers to someone else`009`125
  292. X`009E_WIELD = 47;`009`009`123 player wields a weapon`009`009`125
  293. X`009E_UNWIELD = 48;`009`009`123 player puts a weapon away`009`009`125
  294. X`009E_DONECRYSTALUSE = 49;`009`123 done using the crystal ball`009`009`125
  295. X`009E_WEAR = 50;`009`009`123 someone has put on something`009`009`125
  296. X`009E_UNWEAR = 51;`009`009`123 someone has taken off something`009`125
  297. X`009E_DESTROY = 52;`009`009`123 someone has destroyed an object`009`125
  298. X`009E_HIDESAY = 53;`009`009`123 anonymous say`009`009`009`009`125
  299. X`009E_OBJPUBLIC = 54;`009`123 someone made an object public`009`009`125
  300. X`009E_SYSDONE = 55;`009`009`123 done with system maint. mode`009`009`125
  301. X`009E_UNMAKE = 56;`009`009`123 remove typedef for object`009`009`125
  302. X`009E_LOOKDETAIL = 57;`009`123 looking at a detail of this room`009`125
  303. X`009E_ACCEPT = 58;`009`009`123 made an "accept" exit here`009`009`125
  304. X`009E_REFUSE = 59;`009`009`123 got rid of an "accept" exit here`009`125
  305. X`009E_DIED = 60;`009`009`123 someone died and evaporated`009`009`125
  306. X`009E_LOOKYOU = 61;`009`009`123 someone is looking at you`009`009`125
  307. X`009E_FAILGET = 62;`009`009`123 someone can't get something`009`009`125
  308. X`009E_FAILUSE = 63;`009`009`123 someone can't use something`009`009`125
  309. X`009E_CHILL = 64;`009`009`123 someone scrys you`009`009`009`125
  310. X`009E_NOISE2 = 65;`009`009`123 say while in crystal ball`009`009`125
  311. X`009E_LOOKSELF = 66;`009`123 someone looks at themself`009`009`125
  312. X`009E_INVENT = 67;`009`009`123 someone takes inventory`009`009`125
  313. X`009E_POOFYOU = 68;`009`009`123 MM poofs someone away . . . .`009`009`125
  314. X`009E_WHO = 69;`009`009`123 someone does a who`009`009`009`125
  315. X`009E_PLAYERS = 70;`009`009`123 someone does a players`009`009`125
  316. X`009E_VIEWSELF = 71;`009`123 someone views a self description`009`125
  317. X`009E_REALNOISE = 72;`009`123 make the real noises message print`009`125
  318. X`009E_ALTNOISE = 73;`009`123 alternate mystery message`009`009`125
  319. X`009E_MIDNIGHT = 74;`009`123 it's midnight now, tell everyone`009`125
  320. X        E_DCLDONE  = 75;        `123 return from dcl-level`009`009`009`125
  321. X        E_ATTACK = 76;          `123 some attack someone with weapon`009`125
  322. X        E_HATTACK = 77;         `123 hiding attack ...`009`009`009`125
  323. X        E_ADDEXPERIENCE = 78;   `123 someone get more experience`009`009`125
  324. X                                `123 Killed person send this message`009`125
  325. X`009E_TRAP = 79;`009`009`123 some failure to get trap`009`009`125
  326. X`009E_ERASE = 80;
  327. X        E_MONSTERDONE = 81;
  328. X        E_BROADCAST = 82;       `123 NPC interpreter say something`009`009`1
  329. V25
  330. X`009E_SCAN = 83;
  331. X`009E_LOOKAROUND = 84;
  332. X`009E_NEWLEVEL = 85;
  333. X`009E_SUBMIT = 86;`009`009`123 NPC interpreter switch control`009`125
  334. X`009E_KICK_OUT = 87;`009`123 Kick out player from Monster`009`009`125
  335. X`009E_ATMOSPHERE = 88;`009`123 for atmosphere command`009`009`125
  336. X
  337. X`009`123 --------- stolen from monster version 3.0 ------------------- `125
  338. X
  339. X`009E_ANNOUNCE = 89;`009`123 message over monster universe`009`009`125
  340. X`009E_SHUTDOWN = 90;`009`123 shutdown message`009`009`009`125
  341. X
  342. X`009`123 ------------------------------------------------------------- `125
  343. X
  344. X`009E_RESET = 91;`009`009`123 move object to home `125
  345. X`009E_GLOBAL_CHANGE = 92;   `123 global flags is changed `125
  346. X`009E_SUMMON = 93;`009`009`123 summon spell `125
  347. X`009E_SPELLDONE = 94;`009`123 finish customizing spell `125
  348. X
  349. X`009E_ACTION = 100;`009`009`123 base command action event`009`009`125
  350. X       `032
  351. X
  352. X`123 Misc. `125                                         `032
  353. X
  354. X`009GOODHEALTH = 7;
  355. X
  356. X      statmax = 8;        `123 maksimi tilastointi tietueet `125`032
  357. X      sorthmax = 15;
  358. X     `032
  359. X      MAXATOM = 500;`009`123 Ohjelman maksimi koko `125
  360. X
  361. X
  362. X`123 Code flags `125
  363. X
  364. X    CF_NO_CONTROL = 1;`009    `123 no control access `125
  365. X    CF_SPELL_MODE = 2;`009    `123 spell mode `125
  366. X
  367. XType global_T = ( G_Flag, G_Int, G_Text, G_Code );
  368. X
  369. XConst
  370. X
  371. X`123 Global flags `125
  372. X    GF_ACTIVE     = 1;`009    `123 Monster database open `125
  373. X    GF_VALID`009  = 2;`009    `123 Monster database is available `125
  374. X    GF_WARTIME    = 3;      `123 Violance is allowed `125
  375. X    GF_NEWPLAYER  = 4;      `123 New Player starting text `125
  376. X    GF_STARTGAME  = 5;      `123 Star palying text `125
  377. X    GF_CODE`009  = 6;`009    `123 Global code `125
  378. X
  379. X    GF_MAX`009  = 6;
  380. X
  381. XVar GF_Types : array `091 1 .. GF_MAX `093 of global_T :=`032
  382. X    ( G_Flag,
  383. X      G_Flag,
  384. X      G_Flag,
  385. X      G_Text,
  386. X      G_Text,
  387. X      G_Code
  388. X    );
  389. X
  390. XType
  391. X
  392. X`009string = varying`091string_len`093 of char;
  393. X`009veryshortstring = varying`091veryshortlen`093 of char;
  394. X`009shortstring = varying`091shortlen`093 of char;
  395. X`009mega_string = varying `091 MEGA_LENGTH `093 of char;                `032
  396. X
  397. X`009`123 for system services `125
  398. X`009$UWORD = `091WORD`093 0..65535;  `032
  399. X`009`009`009`123 must declare, because`009`009    `125
  400. X`009`009`009`123 $UWORD in STARLET is with `091HIDDEN`093    `125
  401. X`009string_body = packed array (.1..string_len.) of char;
  402. X`009itmlst_type = record
  403. X`009    buffer_length : $uword;
  404. X`009    item_code : $uword;
  405. X`009    buffer_address : `094string_body;
  406. X`009    return_length_address : `094integer;
  407. X`009    itmlst_end : unsigned
  408. X`009end;
  409. X
  410. X
  411. X`009`123 This is a list of description block numbers;
  412. X`009  If a number is zero, there is no text for that block `125
  413. X`009
  414. X
  415. X`009`123 exit kinds:
  416. X`009`0090: no way - blocked exit
  417. X`009`0091: open passageway
  418. X`009`0092: object required
  419. X
  420. X`009`0096: exit only exists if player is holding the key
  421. X`009`125
  422. X
  423. X`009exit = record
  424. X`009`009toloc: integer;`009`009`123 location exit goes to `125
  425. X`009`009kind: integer;`009`009`123 type of the exit `125
  426. X`009`009slot: integer;`009`009`123 exit slot of toloc target `125
  427. X
  428. X`009`009exitdesc,  `123 one liner description of exit  `125
  429. X`009`009closed,    `123 desc of a closed door `125
  430. X`009`009fail,`009   `123 description if can't go thru   `125
  431. X`009`009success,   `123 desc while going thru exit     `125
  432. X`009`009goin,      `123 what others see when you go into the exit `125
  433. X`123`009`009ofail,`009`125
  434. X`009`009comeout:   `123 what others see when you come out of the exit `125
  435. X`009`009`009  integer; `123 all refer to the liner file `125
  436. X`009`009`009`009   `123 if zero defaults will be printed `125
  437. X
  438. X`009`009hidden: integer;`009`123 **** about to change this **** `125
  439. X`009`009objreq: integer;`009`123 object required to pass this exit `125
  440. X
  441. X`009`009alias: veryshortstring; `123 alias for the exit dir, a keyword `125
  442. X
  443. X`009`009reqverb: boolean;`009`123 require alias as a verb to work `125
  444. X`009`009reqalias: boolean;`009`123 require alias only (no direction) to
  445. X`009`009`009`009`009  pass through the exit `125
  446. X`009`009autolook: boolean;`009`123 do a look when user comes out of exit `12
  447. V5
  448. X`009end;
  449. X
  450. X
  451. X`009`123 index record # 1 is block index `125
  452. X`009`123 index record # 2 is line index `125
  453. X`009`123 index record # 3 is room index `125
  454. X`009`123 index record # 4 is player alloc index `125
  455. X`009`123 index record # 5 is player awake (in game) index `125
  456. X
  457. X`009indexrec = record`009`009`123 must be same as PARSER -module `125
  458. X`009`009indexnum: integer;`009`123 validation number `125
  459. X`009`009free: packed array`0911..maxindex`093 of boolean;
  460. X`009`009top: integer;   `123 max records available `125
  461. X`009`009inuse: integer; `123 record #s in use `125
  462. X`009end;
  463. X
  464. X
  465. X`009`123 names are record #1   `125
  466. X`009`123 owners are record # 2 `125
  467. X`009`123 player pers_names are record # 3 `125
  468. X`009`123 userids are record # 4 `125
  469. X`009`123 object names are record # 5 `125
  470. X`009`123 object creators are record # 6 `125
  471. X`009`123 date of last play is # 7 `125
  472. X`009`123 time of last play is # 8 `125
  473. X`009`123 passwords are # 9 `125
  474. X`009`123 real usernames are # 10 `125
  475. X`009`123 spell names are #11 `125
  476. X
  477. X`009namrec = record`009`009`009`123 must be same as PARSER -module `125
  478. X`009`009validate: integer;
  479. X`009`009loctop: integer;
  480. X`009`009idents: array`0911..maxroom`093 of shortstring;
  481. X`009end;
  482. X
  483. X`009objectrec = record
  484. X`009`009objnum: integer;`009`123 allocation number for the object `125
  485. X`009`009onum: integer;`009`009`123 number index to objnam/objown `125
  486. X`009`009oname: shortstring;`009`123 duplicate of name of object `125
  487. X`009`009kind: integer;`009`009`123 what kind of object this is `125
  488. X`009`009linedesc: integer;`009`123 liner desc of object Here `125
  489. X
  490. X`009`009home: integer;`009`009`123 if object at home, then print the `125
  491. X`009`009homedesc: integer;`009`123 home description `125
  492. X
  493. X`009`009actindx: integer;`009`123 action index -- for hook (hurtta@finuh) `1
  494. V25
  495. X`009`009examine: integer;`009`123 desc block for close inspection `125
  496. X`009`009worth: integer;`009`009`123 how much it cost to make (in gold) `125
  497. X`009`009numexist: integer;`009`123 number in existence `125
  498. X
  499. X`009`009sticky: boolean;`009`123 can they ever get it? `125
  500. X`009`009getobjreq: integer;`009`123 object required to get this object `125
  501. X`009`009getfail: integer;`009`123 fail-to-get description `125
  502. X`009`009getsuccess: integer;`009`123 successful picked up description `125
  503. X
  504. X`009`009useobjreq: integer;`009`123 object require to use this object `125
  505. X`009`009uselocreq: integer;`009`123 place have to be to use this object `125
  506. X`009`009usefail: integer;`009`123 fail-to-use description `125
  507. X`009`009usesuccess: integer;`009`123 successful use of object description `1
  508. V25
  509. X
  510. X`009`009usealias: veryshortstring;
  511. X`009`009reqalias: boolean;
  512. X`009`009reqverb: boolean;
  513. X
  514. X`009`009particle: integer;`009`123 a,an,some, etc... "particle" is not
  515. X`009`009`009`009`009  be right, but hey, it's in the code `125
  516. X
  517. X`009`009parms: array`0911..maxparm`093 of integer;
  518. X
  519. X`009`009d1: integer;`009`009`123 extra description # 1 `125
  520. X`009`009d2: integer;`009`009`123 extra description # 2 `125
  521. X
  522. X`009`009ap: Integer;`009`009`123 attack power `125
  523. X                exreq: Integer;`009`009`123 required experiece `125
  524. X`009`009exp5,exp6: integer;
  525. X`009end;
  526. X
  527. X`009anevent = record
  528. X`009`009sender,`009`009`009`123 slot of sender `125
  529. X`009`009action,`009`009`009`123 what event this is, E_something `125
  530. X`009`009target,`009`009`009`123 opt target of action `125
  531. X`009`009parm: integer;`009`009`123 expansion parm `125
  532. X`009`009msg: string;`009`009`123 string for SAY and other cmds `125
  533. X`009`009loc: integer;`009`009`123 room that event is targeted for `125
  534. X`009end;
  535. X
  536. X`009eventrec = record
  537. X`009`009validat: integer;`009`123 validation number for record locking `125
  538. X`009`009evnt: array`0911..maxevent`093 of anevent;
  539. X`009`009point: integer;`009`009`123 circular buffer pointer `125
  540. X`009end;
  541. X
  542. X`009peoplerec = record
  543. X`009`009kind: integer;`009`009   `123 0=none,1=player,2=npc `125
  544. X`009`009parm: integer;`009`009   `123 index to npc controller (object?) `125
  545. X
  546. X`009`009username: veryshortstring; `123 actual userid of person `125
  547. X`009`009name: shortstring;`009   `123 chosen name of person `125
  548. X`009`009hiding: integer;`009   `123 degree to which they're hiding `125
  549. X`009`009act,targ: integer;`009   `123 last thing that this person did `125
  550. X
  551. X`009`009holding: array`0911..maxhold`093 of integer;`009`123 objects being h
  552. Veld `125
  553. X`009`009experience: integer;
  554. X
  555. X`009`009wearing: integer;`009`123 object that they're wearing `125
  556. X`009`009wielding: integer;`009`123 weapon they're wielding `125
  557. X`009`009health: integer;`009`123 how healthy they are `125
  558. X
  559. X`009`009self: integer;`009`009`123 self description `125
  560. X
  561. X`009`009ex1,ex2,ex3,ex4,ex5: integer;
  562. X`009end;
  563. X
  564. X`009spellrec = record
  565. X`009`009recnum: integer;
  566. X`009`009level: array`0911..maxspells`093 of integer;
  567. X`009end;
  568. X
  569. X`009descrec = record
  570. X`009`009descrinum: integer;
  571. X`009`009lines: array`0911..descmax`093 of string;
  572. X`009`009desclen: integer;  `123 number used in this block `125
  573. X`009end;
  574. X
  575. X`009linerec = record
  576. X`009`009linenum: integer;
  577. X`009`009theline: string;
  578. X`009end;
  579. X
  580. X`009room = record`009`009
  581. X`009`009valid: integer;`009`009`123 validation number for record locking `12
  582. V5
  583. X`009`009locnum: integer;
  584. X`009`009owner: veryshortstring; `123 who owns the room: userid if private
  585. X`009`009`009`009`009`123 other values is in module PARSER `125
  586. X`009`009nicename: string;`009`123 pretty name for location `125
  587. X`009`009nameprint: integer;`009`123 code for printing name:
  588. X`009`009`009`009`009`0090: don't print it
  589. X`009`009`009`009`009`0091: You're in
  590. X`009`009`009`009`009`0092: You're at
  591. X`009`009`009`009`009`125
  592. X
  593. X`009`009primary: integer;`009`123 room descriptions `125
  594. X`009`009secondary: integer;
  595. X`009`009which: integer;`009`009`123 0 = only print primary room desc.
  596. X`009`009`009`009`009  1 = only print secondary room desc.
  597. X`009`009`009`009`009  2 = print both
  598. X`009`009`009`009`009  3 = print primary then secondary
  599. X`009`009`009`009`009`009if has magic object `125
  600. X
  601. X`009`009magicobj: integer;`009`123 special object for this room `125
  602. X`009`009effects: integer;
  603. X`009`009parm: integer;
  604. X
  605. X`009`009exits: array`0911..maxexit`093 of exit;
  606. X
  607. X`009`009pile: integer;`009`009`123 if more than maxobjs objects here `125
  608. X`009`009objs: array`0911..maxobjs`093 of integer;`009`123 refs to object fil
  609. Ve `125
  610. X`009`009objhide: array`0911..maxobjs`093 of integer;`009`123 how much each o
  611. Vbject
  612. X`009`009`009`009`009`009`009  is hidden `125
  613. X`009`009`009`009`009`009`009`123 see hidden on exitrec
  614. X`009`009`009`009`009`009`009  above `125
  615. X
  616. X`009`009objdrop: integer;`009`123 where objects go when they're dropped `125
  617. X`009`009objdesc: integer;`009`123 what it says when they're dropped `125
  618. X`009`009objdest: integer;`009`123 what it says in target room when
  619. X`009`009`009`009`009  "bounced" object comes in `125
  620. X
  621. X`009`009people: array`0911..maxpeople`093 of peoplerec;
  622. X
  623. X`009`009grploc1,grploc2: integer;
  624. X`009`009grpnam1,grpnam2: shortstring;
  625. X
  626. X`009`009detail: array`0911..maxdetail`093 of veryshortstring;
  627. X`009`009detaildesc: array`0911..maxdetail`093 of integer;
  628. X
  629. X`009`009trapto: integer;`009`123 where the "trapdoor" goes `125
  630. X`009`009trapchance: integer;`009`123 how often the trapdoor works `125
  631. X
  632. X`009`009rndmsg: integer;`009`123 message that randomly prints `125
  633. X
  634. X`009`009xmsg2: integer;`009`009`123 another random block `125
  635. X
  636. X`009`009Hook: integer;`009`009`123 Link to hook code `125
  637. X`009`009exp3,exp4: integer;
  638. X`009`009exitfail: integer;`009`123 default fail description for exits `125
  639. X`009`009ofail: integer;`009`009`123 what other's see when you fail, default
  640. V `125
  641. X`009end;
  642. X
  643. X
  644. X`009intrec = record
  645. X`009`009intnum: integer;
  646. X`009`009int: array`0911..maxplayers`093 of integer;
  647. X`009end;
  648. X
  649. X`009levelrec = record
  650. X`009`009name: shortstring;`009`123 Level name `125
  651. X`009`009exp:  integer;`009`009`123 required experience `125
  652. X`009`009priv: integer;`009`009`123 new privilege `125
  653. X`009`009health: integer;`009`123 maximun health `125
  654. X`009`009factor:`009integer;`009`123 hit factor 0 - 100 `125
  655. X`009`009maxpower: integer;`009`123 max power for weapons `125
  656. X`009`009hidden: boolean;`009`123 list in show levels? `125
  657. X`009end;
  658. X
  659. X        statrec = record`009`009`009    `123 tilastointitietue`009    `125
  660. X                lab: shortstring;`009`009`009    `123 label, josta k`228ynis
  661. Vtetty`125
  662. X                runcount: integer;`009`009    `123 ajokertojen lukum`228`228
  663. Vr`228 `125
  664. X                errorcount: integer;`009`009    `123 virheinen lukum`228`228
  665. Vr`228   `125
  666. X                lastrun: shortstring`009`009    `123 viimeisen ajokerran aik
  667. Va`125
  668. X        end;
  669. X
  670. X                                                             `032
  671. X        headerrec = record`032
  672. X                validate: integer; `123 validation number `125
  673. X`009`009runnable: boolean;`009`009    `123 lippu: saako koodin aja `125
  674. X`009`009priv: boolean;`009`009`009    `123 lippu: onko koodi`009    `125
  675. X`009`009`009`009`009`009    `123 privileged -moodissa  `125
  676. X                interlocker: shortstring; `123 who write or read code file `
  677. V125
  678. X                                       `123 '' if none`125
  679. X                owner: shortstring;       `123 monster owner `125
  680. X                ctime: shortstring;       `123 creation time `125
  681. X                stats: array `0911..statmax`093 of statrec; `123 running sta
  682. Vtics `125
  683. X                author: shortstring;      `123 code writer `125
  684. X                wtime: shortstring;       `123 code loading time `125
  685. X                running_id: shortstring;  `123 who running it now `125
  686. X                                     `123 '' if none `125
  687. X                state: mega_string;     `123 monster 'state' `125
  688. X`009`009version: integer;    `123 code version number `125
  689. X                ex1,ex2,ex3: shortstring; `123 unused (reserved) string  `12
  690. V5
  691. X                flags: integer;`009`009  `123 flags `125
  692. X`009`009ex5: integer;    `123 unused (reserved) integer `125
  693. X                ex6: real;           `123 unused (reserved) real    `125
  694. X        end;                              `032
  695. X
  696. X`009classrec = record
  697. X`009`009name:`009shortstring;
  698. X`009`009id:`009shortstring;
  699. X`009end;
  700. X
  701. Xvar
  702. X
  703. X`009`123 variables from PRIVUSERS.PAS `125
  704. X`009MM_userid : `091global`093 veryshortstring;
  705. X`009
  706. X`009`009`123 The Monster Manager has the most power; this should be
  707. X`009`009  the game administrator. `125
  708. X
  709. X`123`009protected_MM : `091global`093 boolean;`009`125
  710. X
  711. X`009gen_debug    : `091global`093 boolean;
  712. X`009`009`123 this tells whether everyone may use the debug command.
  713. X                  it must be able to be disabled because it tells players
  714. X                  too much about monsters. On the other hand, it must also`0
  715. V32
  716. X                  be able to be enabled, if we want to do test runs under
  717. X                  an unprivileged userid`009`009`125
  718. X
  719. X
  720. X`009REBUILD_OK : `091global`093 boolean;
  721. X
  722. X`009`009`123 if this is TRUE, the MM can blow away and reformat the
  723. X`009`009  entire universe. It's a good idea to set this to FALSE `125
  724. X
  725. X`009root : `091global`093 string;
  726. X`009coderoot : `091global`093 string;
  727. X       `032
  728. X`009`009`123 This is where the Monster database goes.
  729. X`009`009  The root directory must be  world:e  and
  730. X`009`009  the  datafiles  Monster  creates  in  it
  731. X`009`009  world:rw for people to be able to  play.
  732. X`009`009  The  coderoot  directory  is  where  the
  733. X`009`009  codefiles for monsters go. The directory
  734. X`009`009  must additionally have  an  ACL  default
  735. X`009`009  world:rw  for  files  and ACL rw for the
  736. X`009`009  managers. This sucks, but we don't  have
  737. X`009`009  setgid to games on VMS. `125
  738. X
  739. X
  740. X
  741. X`009leveltable : `091global`093 array `091 1 .. maxlevels `093 of levelrec;
  742. X
  743. X`009levels`009`009: `091global`093 integer;`009`123 Levels really used `125
  744. X`009
  745. X
  746. X        maxexperience`009: `091global`093 integer;     `123 maximum experien
  747. Vce `125
  748. X`009`009`009`123 Monster Manager's experience is MaxInt `125
  749. X
  750. X`009protect_exp  : `091global`093 integer;
  751. X`009`009`009`009`123 gives protection agaist violence `125
  752. X
  753. X`009debug: `091global`093 boolean;        `123 minor change by hurtta@finuh
  754. V `125
  755. X
  756. XEnd.`009`123 end of module `125
  757. $ CALL UNPACK GLOBAL.PAS;48 1560473208
  758. $ create/nolog 'f'
  759. X- LABEL start ()
  760. X
  761. X- LABEL enter()
  762. X
  763. X- LABEL leave()
  764. X
  765. X- LABEL say()
  766. X
  767. X- LABEL look around()
  768. X
  769. X- LABEL command(
  770. X`009`009null(
  771. X`009`009`009pprint(+("Unknow command: ",command)),
  772. X`009`009`009pprint("Please type ? or HELP for help.")
  773. X`009`009)
  774. X`009)
  775. $ CALL UNPACK GREAT_HALL.MDL;5 1097426403
  776. $ create/nolog 'f'
  777. X`091environment,inherit ('sys$library:starlet','global')`093
  778. X
  779. X
  780. XMODULE guts(input,output);
  781. X`123+
  782. XCOMPONENT: Low level interfase to VMS
  783. X`032
  784. XPROGRAM DESCRIPTION:
  785. X`032
  786. X   `032
  787. X`032
  788. XAUTHORS:
  789. X`032
  790. X    Rich Skrenta
  791. X    Antti Leino
  792. X    Kari Hurtta
  793. X`032
  794. XCREATION DATE: Unknow
  795. X`032
  796. XDESIGN ISSUES:
  797. X`032
  798. X
  799. X`032
  800. XMODIFICATION HISTORY:
  801. X`032
  802. X     Date     `124   Name  `124 Description
  803. X--------------+---------+---------------------------------------------------
  804. V----
  805. X    28.5.1992 `124 Hurtta`009`124 Partially rewritten, new do_dcl and grab_l
  806. Vine
  807. X    31.5.1992 `124`009`009`124 This header, database poll time in check time
  808. Vr`032
  809. X              `124         `124 changed from 0 ::2 to 0 ::1 (ie. one second)
  810. V.
  811. X    10.6.1992 `124         `124 in grab_line 'terminator not seen' action ch
  812. Vanged
  813. X-`125
  814. X
  815. X`032
  816. Xconst
  817. X        SHORT_WAIT = 0.1;
  818. X        LONG_WAIT = 0.2;
  819. X        maxcycle = 10;          `123 attempting to fine tune nextkey `125
  820. X
  821. X`009smg$_eof = 1213442;`009`123 ei m`228`228ritelly starlet.pas:issa vaan`03
  822. V2
  823. X`009`009`009`009    smsg$routines.pas `125
  824. X
  825. X        base_efn = 32;`009`009`123 ensimm`228isen EF:n numero t`228ss`228 EF
  826. V clusterissa `125
  827. X`009tmr_efn = 33;`009`009`123 timer eventflag `125
  828. X`032
  829. Xtype
  830. X
  831. X`009$UBYTE = `091BYTE`093 0..255;
  832. X        `123 $uword is declared in glopal.pas `125
  833. X`009$UQUAD = `091QUAD,UNSAFE`093 RECORD
  834. X`009`009L0,L1:UNSIGNED; END;
  835. X
  836. X
  837. X        ident = packed array`0911..12`093 of char;
  838. X                             `032
  839. X        iosb_type = record
  840. X                cond: $uword;
  841. X                trans: $uword;
  842. X                junk: unsigned; `123longword`125
  843. X        end;
  844. X`032
  845. X        il3 = record
  846. X             buflen : $uword;
  847. X             itm    : $uword;
  848. X             baddr  : unsigned;
  849. X             laddr  : unsigned;
  850. X        end;
  851. X`032
  852. X`032
  853. Xvar
  854. X
  855. X        save_dcl_ctrl:  unsigned;
  856. X        out_chan,inp_chan: `091volatile`093 $uword;
  857. X
  858. X`123       vaxid:          `091global`093 packed array`0911..12`093 of char;
  859. X        line:           `091global`093 string; `125
  860. X        old_prompt: `091global`093 string;`032
  861. X`032
  862. X
  863. X`009need_reprint : boolean := false;
  864. X
  865. X        seed: integer;
  866. X`032
  867. X        user_rec,uname:varying`09131`093 of char;
  868. X        sts:integer;
  869. X        il:array`0911..2`093 of il3;
  870. X        key:$uword;
  871. X`032
  872. X        userident: `091global`093 ident;
  873. X
  874. X`009Terminal: `091 global `093 Boolean := false;`032
  875. X`009DecCRT:`009  `091 global `093 Boolean := False; `123 least vt100 `125
  876. X`009Terminal_line_len: `091global`093 integer := 80; `123 default = 80 `125
  877. X`009Terminal_page_len: `091global`093 integer := 24; `123 default = 24 `125
  878. X
  879. X`009grab_next: `091global `093 integer := 0;
  880. X
  881. X`009cur_position : Integer := 0;`009`123 0 is leftmost column`009`125
  882. X
  883. X`009leave_monster : boolean := false;
  884. X`009eof_counter   : integer := 0;
  885. X
  886. X`091asynchronous, external (lib$signal)`093    `032
  887. Xfunction lib$signal (
  888. X   %ref status : `091unsafe`093 unsigned) : unsigned; external;
  889. X`032
  890. X`091asynchronous, external (str$trim)`093
  891. Xfunction str$trim (
  892. X   destination_string : `091class_s`093 packed array `091$l1..$u1:integer`09
  893. V3 of char;
  894. X   source_string : `091class_s`093 packed array `091$l2..$u2:integer`093 of
  895. V char;
  896. X   %ref resultant_length : $uword) : unsigned; external;
  897. X
  898. X`032
  899. X`091asynchronous, external (lib$disable_ctrl)`093
  900. Xfunction lib$disable_ctrl (
  901. X    %ref disable_mask : unsigned;
  902. X    %ref old_mask : unsigned := %immed 0) : unsigned; external;
  903. X`032
  904. X`091asynchronous, external (lib$enable_ctrl)`093
  905. Xfunction lib$enable_ctrl (
  906. X    %ref enable_mask : unsigned;
  907. X    %ref old_mask : unsigned := %immed 0) : unsigned; external;
  908. X`032
  909. X
  910. X`091asynchronous`093`032
  911. Xprocedure syscall( s: `091unsafe`093 unsigned );
  912. X`032
  913. Xbegin
  914. X   if not odd( s ) then begin
  915. X      lib$signal( s );
  916. X   end;
  917. Xend;
  918. X`032
  919. X`032
  920. X`091external,asynchronous`093
  921. Xfunction mth$random(var seed: integer): real;
  922. Xexternal;
  923. X
  924. X
  925. X`091global`093
  926. Xprocedure quit_monster;
  927. Xbegin
  928. X    leave_monster := true;
  929. X    eof_counter := 0;
  930. Xend; `123 quit_monster `125
  931. X`032
  932. X`091global`093
  933. Xfunction random: real;
  934. X`032
  935. Xbegin
  936. X        random := mth$random(seed);
  937. Xend;
  938. X`032
  939. X`091global`093
  940. Xfunction rnd100: integer;       `123 random int between 0 & 100, maybe `125
  941. X`032
  942. Xbegin
  943. X        rnd100 := round(mth$random(seed)*100);
  944. Xend;
  945. X`032
  946. X`032
  947. X`091external`093 function lib$wait(seconds:`091reference`093 real):integer;
  948. Xexternal;
  949. X`032
  950. X`091global`093
  951. Xprocedure wait(seconds: real);
  952. X`032
  953. Xbegin
  954. X        syscall( lib$wait(seconds) );
  955. Xend;
  956. X`032
  957. X`091external`093 procedure checkevents(silent: boolean := false);
  958. Xextern;
  959. X`032
  960. X
  961. Xfunction check_timer(force: boolean := false): boolean;
  962. Xvar code: unsigned;
  963. X    time: $uquad;
  964. Xbegin
  965. X    syscall ($readef (base_efn,code));
  966. X    if (uand(code,2 ** (tmr_efn-base_efn)) > 0) or force then begin
  967. X`009syscall($clref (tmr_efn));
  968. X`009syscall($bintim ('0 ::1',time)); `123 kaksi sekunttia laukeamiseen `125
  969. X`009syscall($setimr (tmr_efn,time,,,));
  970. X`009check_timer := true;
  971. X    end else check_timer := false;
  972. Xend; `123 check_timer `125
  973. X                    `032
  974. X`091global`093
  975. Xprocedure doawait(time: real);
  976. X`032
  977. Xbegin
  978. X        syscall( lib$wait(time) );
  979. Xend;
  980. X`032
  981. X`032
  982. X`091global`093
  983. Xfunction trim(s: string): string;
  984. Xvar
  985. X        tmp: `091static`093 string := '';
  986. X`032
  987. Xbegin
  988. X        syscall( str$trim(tmp.body,s,tmp.length) );
  989. X        trim := tmp;
  990. Xend;
  991. X`032
  992. X`032
  993. X`091global`093
  994. Xfunction get_userid: string;
  995. X`032
  996. Xbegin
  997. X  il:=zero;
  998. X  il`0911`093.itm    := jpi$_username;
  999. X  il`0911`093.buflen := size(user_rec.body);
  1000. X  il`0911`093.baddr  := iaddress(user_rec.body);
  1001. X  il`0911`093.laddr  := iaddress(user_rec.length);
  1002. X  syscall($getjpiw(,,,il));
  1003. X  syscall( str$trim(uname.body,user_rec,uname.length) );
  1004. X  userident := user_rec;
  1005. X  get_userid := uname;
  1006. Xend;
  1007. X`032
  1008. X`032
  1009. X`091global,asynchronous`093
  1010. Xprocedure putchars(s: mega_string; tokeyboard: boolean := false);
  1011. Xvar
  1012. X        msg: packed array`0911..MEGA_LENGTH`093 of char;
  1013. X        len: integer;
  1014. X`032
  1015. Xbegin
  1016. X        msg := s;
  1017. X        len := length(s);
  1018. X`009if tokeyboard then`032
  1019. X`009    syscall($qiow(,inp_chan,
  1020. X`009`009io$_writevblk+io$m_refresh,,,,msg,len,,,,))
  1021. X        else`032
  1022. X`009    syscall($qiow(,out_chan,io$_writevblk,,,,msg,len,,,,));
  1023. Xend;
  1024. X
  1025. X`091external(LIB$GETDVI)`093`009`123 Uses SYS$GETDVI, but it is too`009`125
  1026. XFunction GetDvi`009(`009`009`123 complicated,so I use library routine`009`12
  1027. V5
  1028. X`009%REF`009ItemCode:`009`009$uword;         `032
  1029. X`009%REF`009Channel:`009`009$uword`009`009:= %IMMED 0;
  1030. X`009%DESCR`009DeviceName:`009`009String`009`009:= %IMMED 0;
  1031. X`009%REF`009OutValue:`009`009Unsigned`009:= %IMMED 0;
  1032. X`009%DESCR`009OutString:`009`009String`009`009:= %IMMED 0
  1033. X`009):`009Integer;`009Extern;
  1034. X
  1035. X
  1036. X
  1037. X`091global`093
  1038. Xprocedure reprint_grab;
  1039. Xbegin
  1040. X    if need_reprint then putchars(''(13),tokeyboard := true);
  1041. Xend;
  1042. X
  1043. X
  1044. X`091global`093
  1045. Xprocedure grab_line(prompt:string; var s:string;echo:boolean := true;
  1046. X                    erase: boolean := false; edit_mode: boolean := false;
  1047. X`009`009    procedure eof_handler);
  1048. Xlabel again,out;
  1049. XConst`009max_line = size(s.body);
  1050. X`009Lines = 100;
  1051. X`009grab_efn = 34;
  1052. X`009max_esc = 10;
  1053. X
  1054. X`009ESC_NONE = 0;
  1055. X`009ESC_RETURN = 1;
  1056. X`009ESC_EOF = 2;
  1057. X`009ESC_F10 = 3;
  1058. X`009ESC_B   = 4;
  1059. X`009ESC_UP1 = 5;
  1060. X`009ESC_UP2 = 6;
  1061. X`009ESC_UP3`009= 7;
  1062. X`009ESC_UP4 = 8;
  1063. X`009ESC_DOWN1 = 9;
  1064. X`009ESC_DOWN2 = 10;
  1065. X`009ESC_DOWN3 = 11;
  1066. X`009ESC_DOWN4 = 12;
  1067. X
  1068. X`009ESC_LAST = 12;
  1069. X
  1070. Xtype`009Line_buffer = Array `091 1 .. Lines `093 of string;
  1071. X
  1072. X        item = record
  1073. X`009    len:   $uword;
  1074. X`009    code:  $uword;
  1075. X`009    addr:  `091long`093 unsigned;
  1076. X`009    rtradr: `091long`093 unsigned;
  1077. X`009end;
  1078. Xvar
  1079. X        esc_table : array `091 0 .. ESC_LAST`093 of shortstring :=
  1080. X`009    ( '',`009    `123 ESC_NONE `125
  1081. X`009      ''(13),`009    `123 ESC_RETURN `125
  1082. X`009      ''(26),`009    `123 ESC_EOF `125
  1083. X`009      ''(27)'`09121`126', `123 ESC_F10 `125
  1084. X`009      ''(2),`009    `123 ESC_B `125
  1085. X`009      ''(27)'`091A',   `123 ESC_UP1 `125
  1086. X`009      ''(155)'A',   `123 ESC_UP2 `125
  1087. X`009      ''(27)'OA',   `123 ESC_UP3 `125
  1088. X`009      ''(143)'A',   `123 ESC_UP4 `125
  1089. X`009      ''(27)'`091B',   `123 ESC_DOWN1 `125
  1090. X`009      ''(155)'B',   `123 ESC_DOWN2 `125
  1091. X`009      ''(27)'OB',   `123 ESC_DOWN3 `125
  1092. X`009      ''(143)'B');   `123 ESC_DOWN4 `125
  1093. X`009     `032
  1094. X
  1095. X
  1096. X        mask:`009    unsigned := 2 ** (grab_efn-base_efn) +`032
  1097. X`009`009`0092 ** (tmr_efn-base_efn);
  1098. X`009end_grab:   boolean := false;
  1099. X`009code:`009    unsigned;
  1100. X`009start: `091volatile`093 string;
  1101. X`009line:`009    string;
  1102. X`009area:`009    `091volatile`093 packed array `091 1 .. max_line + max_esc
  1103. V `093 of char;
  1104. X`009modifiers:  unsigned := 0;
  1105. X`009iosb:`009    `091volatile`093 record
  1106. X`009    status: `091volatile`093 $uword;
  1107. X`009    offtrm: `091volatile`093 $uword;
  1108. X`009    trmchr: `091volatile`093 $ubyte;
  1109. X`009    reserved: `091volatile`093 $ubyte;
  1110. X`009    trmlen: `091volatile`093 $ubyte;
  1111. X`009    crspos: `091volatile`093 $ubyte;
  1112. X`009end;
  1113. X
  1114. X`009buffer`009: `091static`093 Line_buffer;`009`123 saved values`009`009`125
  1115. X`009used`009: `091static`093 0 .. Lines := 0;`009`123 between calls `009`125
  1116. X        current : 1 .. Lines;
  1117. X`009maxlen,i  : integer;
  1118. X`009itemlist : array `091 1 .. 4 `093 of item;
  1119. X
  1120. X        result  : unsigned;
  1121. X`009terminator : shortstring;
  1122. X`009esccode : integer;
  1123. X`009eof_detected : boolean := false;
  1124. X
  1125. X      procedure erase_line;
  1126. X      begin
  1127. X`009if echo then begin`009`009
  1128. X`009    if DecCRT Then putchars(chr(13)+chr(27)+'`091K',true)
  1129. X`009    else begin`032
  1130. X`009`009putchars(chr(13),true);`009`009`009
  1131. X`009`009for i := 1 to length (prompt) + length(line) do
  1132. X`009`009putchars(' ',true);`009`009`009
  1133. X`009`009putchars(chr(13),true);`009`009`009
  1134. X`009    end;
  1135. X`009end;`032
  1136. X    end; `123 erase_line `125
  1137. X
  1138. X
  1139. Xbegin
  1140. X
  1141. X   syscall(GetDvi(DVI$_TRM,inp_chan,,result));
  1142. X   if not odd(result) then begin
  1143. X`009writeln('SYS$INPUT must point to terminal !!!');
  1144. X`009HALT;
  1145. X   end;
  1146. X   putchars(''(13)''(10),tokeyboard := true);
  1147. X
  1148. X   line := ''; start := '';
  1149. X
  1150. X   if not edit_mode then begin                 `032
  1151. X      if used < lines then begin`032
  1152. X         used := used +1;
  1153. X         current := used;                         `032
  1154. X         buffer `091current`093 := ''
  1155. X      end else begin`009`009`009`009
  1156. X         current := lines;
  1157. X         for i := 1 to lines - 1 do buffer `091i`093 := buffer `091i+1`093;
  1158. X         buffer `091current`093 := '';
  1159. X      end;             `032
  1160. X   end else start := s;
  1161. X
  1162. X  again:
  1163. X
  1164. X  modifiers := uor(uor(TRM$M_TM_ESCAPE,TRM$M_TM_TRMNOECHO),TRM$M_TM_NORECALL
  1165. V);`032
  1166. X  if not echo then modifiers := uor(modifiers,TRM$M_TM_NOECHO);
  1167. X
  1168. X  itemlist`0911`093.len := 0;
  1169. X  itemlist`0911`093.code := TRM$_ESCTRMOVR;
  1170. X  itemlist`0911`093.addr := MAX_ESC;
  1171. X  itemlist`0911`093.rtradr := 0;    `123 escape koodin koko `125
  1172. X  itemlist`0912`093.len := prompt.length;
  1173. X  itemlist`0912`093.code := TRM$_PROMPT;
  1174. X  itemlist`0912`093.addr := IADDRESS(prompt.body);
  1175. X  itemlist`0912`093.rtradr := 0;
  1176. X  itemlist`0913`093.len := start.length;
  1177. X  itemlist`0913`093.code := TRM$_INISTRNG;
  1178. X  itemlist`0913`093.addr := IADDRESS(start.body);
  1179. X  itemlist`0913`093.rtradr := 0;
  1180. X  itemlist`0914`093.len := 0;
  1181. X  itemlist`0914`093.code := TRM$_MODIFIERS;
  1182. X  itemlist`0914`093.addr := modifiers;
  1183. X  itemlist`0914`093.rtradr :=  0;
  1184. X
  1185. X  iosb := zero;
  1186. X
  1187. X  need_reprint := true;
  1188. X  area := ' ';
  1189. X
  1190. X  syscall($clref(grab_efn));
  1191. X  syscall($qio( efn  := grab_efn,
  1192. X`009`009chan := inp_chan,
  1193. X`009        func := IO$_READVBLK+IO$M_EXTEND,
  1194. X`009`009iosb := iosb,
  1195. X`009`009p1   := area,
  1196. X`009`009p2   := size(area),
  1197. X`009`009p5   := iaddress(itemlist),
  1198. X`009`009p6   := size(itemlist)));
  1199. X
  1200. X  end_grab := false;
  1201. X  while not end_grab do  `123 odotetaan loppumista `125
  1202. X    begin
  1203. X     `032
  1204. X      syscall($wflor(base_efn,mask));   `123 odotetaan ett`228 timerin tai I
  1205. VO:n
  1206. X`009`009`009`009      EF laukeaa `125
  1207. X
  1208. X      if (check_timer) then checkevents;`032
  1209. X`009`009`009`123 check_timer my`246skin laittaa timeri uudestaan `125
  1210. X`009`009`009`123 k`228yntiin. alunperin se on k`228ynistetty `125
  1211. X`009`009`009`123 setup_guts:issa `125
  1212. X
  1213. X    if leave_monster then begin
  1214. X`009syscall($cancel(inp_chan));
  1215. X`009if eof_counter > 10 then begin
  1216. X`009    putchars(chr(10)+chr(13)+
  1217. X`009`009'%quit monster failed. Notify Monster Manager.'+chr(13),
  1218. X`009`009tokeyboard := true);
  1219. X`009    leave_monster := false;
  1220. X`009    goto again;
  1221. X`009end else begin
  1222. X`009    eof_counter  := eof_counter +1;
  1223. X`009    eof_detected := true;
  1224. X`009    goto out;
  1225. X`009end;
  1226. X    end;
  1227. X
  1228. X      syscall ($readef (base_efn,code));
  1229. X      end_grab := uand(code,2 ** (grab_efn-base_efn)) > 0; `123 Onko IO p`22
  1230. V8`228ttynyt `125
  1231. X    end;
  1232. X
  1233. X  syscall(iosb.status); `123 if failed .. > out `125
  1234. X  terminator := '';
  1235. X  for i := 1 to iosb.trmlen do terminator := terminator + area`091iosb.offtr
  1236. Vm+i`093;
  1237. X  line := '';
  1238. X  for i := 1 to iosb.offtrm do line := line + area`091i`093;
  1239. X
  1240. X  esccode := -1;
  1241. X  for i := 0 to ESC_LAST do if esc_table`091i`093 = terminator then esccode
  1242. V := i;
  1243. X
  1244. X  case esccode of
  1245. X     -1: begin`009   `032
  1246. X`009    putchars(''(10)''(13),tokeyboard := true);
  1247. X`009    writeln('Unknown function key.');
  1248. X`009    start := line;
  1249. X`009    goto again;
  1250. X`009end;
  1251. X     ESC_NONE: begin
  1252. X`009    putchars(''(10)''(13),tokeyboard := true);
  1253. X`009    writeln('Terminator not seen.');
  1254. X`009    if length(line) >= max_line then
  1255. X`009`009line := substr(line,1,max_line-1);
  1256. X`009    start := line;
  1257. X`009    goto again;
  1258. X`009end;
  1259. X     ESC_RETURN: begin
  1260. X`009    grab_next := 0;
  1261. X`009    ;
  1262. X`009end;
  1263. X     ESC_EOF, ESC_F10: begin
  1264. X`009    eof_detected := true;
  1265. X`009    grab_next := 0;
  1266. X`009end;
  1267. X     ESC_B, ESC_UP1, ESC_UP2, ESC_UP3, ESC_UP4: begin
  1268. X`009    if edit_mode then grab_next := -1
  1269. X`009    else begin`032
  1270. X`009`009if current > 1 then current := current -1;   `032
  1271. X`009`009putchars(''(13)''(0),tokeyboard := true);
  1272. X`009`009erase_line;
  1273. X`009`009start := buffer`091current`093;
  1274. X`009`009goto again;
  1275. X`009    end;
  1276. X`009end;
  1277. X     ESC_DOWN1, ESC_DOWN2, ESC_DOWN3, ESC_DOWN4: begin
  1278. X`009    if edit_mode then grab_next := 1
  1279. X`009    else begin`032
  1280. X`009`009if current < used then current := current +1;   `032
  1281. X`009`009putchars(''(13)''(0),tokeyboard := true);
  1282. X`009`009erase_line;
  1283. X`009`009start := buffer`091current`093;
  1284. X`009`009goto again;
  1285. X`009    end;
  1286. X`009end;
  1287. X    otherwise halt;
  1288. X  end; `123 case `125
  1289. X
  1290. X  need_reprint := false;
  1291. X
  1292. X  out:
  1293. X
  1294. X if erase then erase_line
  1295. X else putchars(''(13)''(0),true);`009`009`009
  1296. X if not edit_mode then begin`009`009`009
  1297. X    if echo then buffer `091used`093 := line`009
  1298. +-+-+-+-+-+-+-+-  END  OF PART 12 +-+-+-+-+-+-+-+-
  1299.