home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part31 < 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 31/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.111915.14691@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 11:19:15 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1524
  12.  
  13. Archieve-name: monster_helsinki_104/part31
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 31/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 31 -+-+-+-+-+-+-+-+
  20. X$   IF .not. $SEVERITY`032
  21. X$     THEN
  22. X$       WRITE SYS$ERROR "Creating of ''full' failed"
  23. X$       GOTO again1
  24. X$   ENDIF
  25. X$ ENDIF
  26. X$ CALL DIRNAME 'full' dirname
  27. X$ SET FILE/PROTECTION=(W:E)/LOG 'dirname
  28. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/protection failed"
  29. X$ SET FILE/ACL=(IDENTIFIER='F$USER(),access=r+w+e+d+c)/LOG 'dirname
  30. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  31. X$ SET FILE/ACL=(IDENTIFIER='F$USER(),OPTIONS=DEFAULT,access=r+w+e+d+c)/LOG '
  32. Vdirname
  33. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  34. X$ SET FILE/ACL=(DEFAULT_PROTECTION,SYSTEM:RWED,OWNER:RWED,GROUP,WORLD:R)/LOG
  35. V 'dirname
  36. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  37. X$ 'p1 == full
  38. X$ EXIT
  39. X$ ENDSUBROUTINE
  40. X$!
  41. X$ CREATE_SUBDIR: SUBROUTINE
  42. X$ base = p1 - ">" - "`093"        ! This can fail
  43. X$ tail = p1 - base
  44. X$ dir = base + "." + p2 + tail
  45. X$ IF F$PARSE(dir,,,,"SYNTAX_ONLY") .eqs. "" THEN CALL FATAL "Internal error
  46. V - bad path: ''dir'"
  47. X$ if F$PARSE(dir) .eqs. "" THEN CREATE/DIRECTORY/LOG 'dir
  48. X$ CALL DIRNAME 'dir' dirname
  49. X$ SET FILE/PROTECTION=(W:E)/LOG 'dirname
  50. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/protection failed"
  51. X$ SET FILE/ACL=(IDENTIFIER='F$USER(),access=r+w+e+d+c)/LOG 'dirname
  52. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  53. X$ SET FILE/ACL=(IDENTIFIER='F$USER(),OPTIONS=DEFAULT,access=r+w+e+d+c)/LOG '
  54. Vdirname
  55. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  56. X$ SET FILE/ACL=(DEFAULT_PROTECTION,SYSTEM:RWED,OWNER:RWED,GROUP,WORLD:RW)/LO
  57. VG 'dirname
  58. X$ IF .not. $SEVERITY THEN CALL FATAL "Set file/acl failed"
  59. X$ 'p3 == dir
  60. X$ EXIT
  61. X$ ENDSUBROUTINE
  62. X$!
  63. X$ DIRNAME: SUBROUTINE
  64. X$ disk = F$PARSE(p1,,,"DEVICE","SYNTAX_ONLY")
  65. X$ path = F$PARSE(p1,,,"DIRECTORY","SYNTAX_ONLY")
  66. X$ IF disk .eqs. "" .or. path .eqs. "" THEN CALL FATAL "Internal error - bad
  67. V path ''p1'"
  68. X$ last = ""
  69. X$ build = ""
  70. X$ i = 0
  71. X$again2:
  72. X$ e = F$ELEMENT(i,".",path)
  73. X$ IF e .nes. "."`032
  74. X$   THEN
  75. X$   IF build .nes. "" THEN build = build + "."
  76. X$   build = build + last
  77. X$   last = e
  78. X$   i = i + 1
  79. X$   GOTO again2
  80. X$ ENDIF
  81. X$ name = last - ">" - "`093"
  82. X$ tail = last - name
  83. X$ dirname = disk + build + tail + name + ".DIR"
  84. X$ IF F$PARSE(dirname) .eqs. "" THEN CALL FATAL "Internal error - bad pathnam
  85. Ve ''dirname'"
  86. X$ IF F$SEARCH(dirname) .eqs. "" THEN CALL FATAL "Internal error - not found
  87. V ''dirname'"
  88. X$ 'p2 == dirname
  89. X$ EXIT
  90. X$ ENDSUBROUTINE
  91. X$!
  92. X$ MAKE_FILE: SUBROUTINE
  93. X$ OPEN/ERROR=error1 from 'p1
  94. X$ WRITE SYS$OUTPUT "Creating file: ''p2'"
  95. X$ OPEN/WRITE/ERROR=error2 to 'p2
  96. X$again4:
  97. X$ READ/END_OF_FILE=out from line
  98. X$ pos = F$LOCATE("%",line)
  99. X$ IF pos .eq. F$LENGTH(line) THEN GOTO done
  100. X$ start = F$EXTRACT(0,pos,line)
  101. X$ rest = F$EXTRACT(pos+1,F$LENGTH(line)-pos,line)
  102. X$ itm = F$LOCATE("%",rest)
  103. X$ IF itm .eq. F$LENGTH(line) THEN GOTO done
  104. X$ symbol = F$EXTRACT(0,itm,rest)
  105. X$ tail = F$EXTRACT(itm+1,F$LENGTH(rest)-itm,rest)
  106. X$ x = "SB_" + symbol
  107. X$ line = start + 'x' + tail
  108. X$done:
  109. X$ WRITE to line
  110. X$ GOTO again4
  111. X$out:
  112. X$ CLOSE to
  113. X$ CLOSE from
  114. X$ SET FILE/PROTECTION=(W:R)/LOG 'p2
  115. X$ EXIT
  116. X$error1:
  117. X$ CALL FATAL "Opening of ''p1' failed"
  118. X$ EXIT
  119. X$error2:
  120. X$ CLOSE from
  121. X$ CALL FATAL "Creating of ''p2' failed"
  122. X$ EXIT
  123. X$ ENDSUBROUTINE
  124. X$
  125. X$ QUERY_DIR: SUBROUTINE
  126. X$again5:
  127. X$ WRITE SYS$OUTPUT P2
  128. X$ WRITE SYS$OUTPUT "Default: ",P3
  129. X$ INQUIRE dir "Directory"
  130. X$ IF dir .eqs. "" THEN dir = P3
  131. X$ path = F$PARSE(dir) - ".;"
  132. X$ IF path .eqs. ""`032
  133. X$   THEN
  134. X$   WRITE SYS$ERROR "Directory ",dir," not exist."
  135. X$   GOTO again5
  136. X$ ENDIF
  137. X$ 'P1 == path
  138. X$ EXIT
  139. X$ ENDSUBROUTINE
  140. X$`032
  141. X$ PATHNAME: SUBROUTINE
  142. X$ node = F$PARSE(P2,,,"NODE","SYNTAX_ONLY")
  143. X$ device = F$PARSE(P2,,,"DEVICE","SYNTAX_ONLY")
  144. X$ directory = F$PARSE(P2,,,"DIRECTORY","SYNTAX_ONLY")
  145. X$ IF node + device + directory .eqs. "" THEN CALL FATAL "Bad filename: ''P2'
  146. V"
  147. X$ 'P1 == node  + device + directory
  148. X$ EXIT
  149. X$ ENDSUBROUTINE
  150. X$
  151. X$ COMPILE: SUBROUTINE
  152. X$ source = F$PARSE(".PAS",source_directory + P1)
  153. X$ result = F$PARSE(".OBJ",work_directory + P1)
  154. X$ IF source .eqs. "" THEN CALL FATAL "Internal_error: Bad filename: ''P1'"
  155. X$ IF result .eqs. "" THEN CALL FATAL "Internal error: Bad filename: ''P1'"
  156. X$ IF F$SEARCH(result) .nes. "" THEN EXIT
  157. X$ CALL CHECK_FILE 'source'
  158. X$ PASCAL/CHECK=ALL/OBJECT='result'/TERMINAL=FILE_NAME 'source'
  159. X$ IF .not. $SEVERITY THEN CALL FATAL "Compilation of ''source' failed"
  160. X$ IF F$SEARCH(result) .eqs. "" THEN CALL FATAL "Compile failed: ''result' no
  161. Vt found"
  162. X$ EXIT
  163. X$ ENDSUBROUTINE
  164. X$
  165. X$ MAKE_MON: SUBROUTINE
  166. X$ IF F$SEARCH("MON.EXE") .nes. "" THEN EXIT
  167. X$ CALL COMPILE GLOBAL
  168. X$ CALL COMPILE GUTS
  169. X$ CALL COMPILE KEYS
  170. X$ CALL COMPILE PRIVUSERS
  171. X$ CALL COMPILE DATABASE
  172. X$ CALL COMPILE PARSER
  173. X$ CALL COMPILE INTERPRETER
  174. X$ CALL COMPILE QUEUE
  175. X$ CALL COMPILE CLI
  176. X$ CALL COMPILE CUSTOM
  177. X$ CALL COMPILE MON
  178. X$ LINK MON,GLOBAL,GUTS,KEYS,PRIVUSERS,DATABASE,PARSER,INTERPRETER,QUEUE,CLI,
  179. VCUSTOM
  180. X$ IF .not. $SEVERITY THEN CALL FATAL "Linking of MON.EXE failed"
  181. X$ IF F$SEARCH("MON.EXE") .eqs. "" THEN CALL FATAL "Link failed: MON.EXE not
  182. V found"
  183. X$ EXIT
  184. X$ ENDSUBROUTINE
  185. X$
  186. X$ MAKE_WHO: SUBROUTINE
  187. X$ IF F$SEARCH("MONSTER_WHO.EXE") .nes. "" THEN EXIT
  188. X$ CALL COMPILE GLOBAL
  189. X$ CALL COMPILE GUTS`032
  190. X$ CALL COMPILE PRIVUSERS
  191. X$ CALL COMPILE DATABASE
  192. X$ CALL COMPILE PARSER
  193. X$ CALL COMPILE MONSTER_WHO
  194. X$ LINK MONSTER_WHO,GLOBAL,GUTS,PRIVUSERS,DATABASE,PARSER
  195. X$ IF .not. $SEVERITY THEN CALL FATAL "Linking of MONSTER_WHO.EXE failed"
  196. X$ IF F$SEARCH("MONSTER_WHO.EXE") .eqs. "" THEN CALL FATAL "Link failed: MONS
  197. VTER_WHO.EXE not found"
  198. X$ EXIT
  199. X$ ENDSUBROUTINE
  200. X$
  201. X$ MAKE_DUMP: SUBROUTINE
  202. X$ IF F$SEARCH("MONSTER_DUMP.EXE") .nes. "" THEN EXIT
  203. X$ CALL COMPILE GLOBAL
  204. X$ CALL COMPILE GUTS`032
  205. X$ CALL COMPILE PRIVUSERS
  206. X$ CALL COMPILE DATABASE
  207. X$ CALL COMPILE PARSER
  208. X$ CALL COMPILE MONSTER_DUMP
  209. X$ LINK MONSTER_DUMP,GLOBAL,GUTS,PRIVUSERS,DATABASE,PARSER
  210. X$ IF .not. $SEVERITY THEN CALL FATAL "Linking of MONSTER_DUMP.EXE failed"
  211. X$ IF F$SEARCH("MONSTER_DUMP.EXE") .eqs. "" THEN CALL FATAL "Link failed: MON
  212. VSTER_DUMP.EXE not found"
  213. X$ EXIT
  214. X$ ENDSUBROUTINE
  215. X$
  216. X$ MAKE_HELP: SUBROUTINE
  217. X$ IF F$SEARCH("MONSTER_E.HLB") .nes. "" THEN EXIT
  218. X$ CALL CHECK_FILE 'source_directory'MONSTER_E.HLP
  219. X$ LIBRARY/HELP/LOG/CREATE MONSTER_E.HLB 'source_directory'MONSTER_E.HLP
  220. X$ IF .not. $SEVERITY THEN CALL FATAL "Creating of MONSTER_E.HLB failed"
  221. X$ IF F$SEARCH("MONSTER_E.HLB") .eqs. "" THEN CALL FATAL "Creating failed: MO
  222. VNSTER_E.HLB not found"
  223. X$ EXIT
  224. X$ ENDSUBROUTINE
  225. X$
  226. X$ DEFINE_MONSTER: SUBROUTINE
  227. X$ IF F$TYPE(monster) .nes. ""
  228. X$    THEN
  229. X$    WRITE SYS$OUTPUT "Deleting symbol MONSTER"
  230. X$    DELETE/SYMBOL/GLOBAL monster
  231. X$ ENDIF
  232. X$ SET COMMAND 'image_directory'MONSTER.CLD
  233. X$ IF .not. $SEVERITY THEN CALL FATAL "Defining of command MONSTER failed"
  234. X$ WRITE SYS$OUTPUT "Command MONSTER defined"
  235. X$ WRITE SYS$OUTPUT ""
  236. X$ WRITE SYS$OUTPUT "Add to your LOGIN.COM command:"
  237. X$ WRITE SYS$OUTPUT "$ SET COMMAND ''image_directory'MONSTER.CLD"
  238. X$ WRITE SYS$OUTPUT ""
  239. X$ EXIT
  240. X$ ENDSUBROUTINE
  241. X$
  242. X$ BUILD_DATABASE: SUBROUTINE
  243. X$ WRITE SYS$OUTPUT "Building monster database"
  244. X$ MONSTER/REBUILD/NOSTART
  245. Xyes
  246. X$ EXIT
  247. X$ ENDSUBROUTINE
  248. X$
  249. X$ ASK_OPTION: SUBROUTINE
  250. X$again7:
  251. X$ WRITE SYS$OUTPUT "You can: "
  252. X$ WRITE SYS$OUTPUT "  1 =  Build new empty monster database"
  253. X$ WRITE SYS$OUTPUT "  2 =  Convert old (Skrenta's Monster V1) database"
  254. X$ WRITE SYS$OUTPUT "  3 =  Build new empire database with the starter's CAST
  255. VLE"
  256. X$ INQUIRE option "Select 1, 2 or 3"
  257. X$ IF option .ne. 1 .and. option .ne. 2 .and. option .ne. 3 THEN GOTO again7
  258. X$ option == option
  259. X$ EXIT
  260. X$ ENDSUBROUTINE
  261. X$
  262. X$ CONVERT_DATABASE: SUBROUTINE
  263. X$ COPY/LOG 'old_database'DESC.MON,EVENTS.MON,INDEX.MON,INTFILE.MON,LINE.MON,
  264. VNAMS.MON,OBJECTS.MON,ROOMS.MON 'dbdir'
  265. X$ MONSTER/NOSTART/BATCH='source_directory'CONVERT.BATCH
  266. X$ EXIT
  267. X$ ENDSUBROUTINE
  268. X$
  269. X$ BUILD_CASTLE: SUBROUTINE
  270. X$ MONSTER/BUILD 'source_directory'CASTLE.DMP
  271. Xyes
  272. X$ EXIT
  273. X$ ENDSUBROUTINE
  274. $ CALL UNPACK MONSTER_INSTALL.COM;35 1090939009
  275. $ create/nolog 'f'
  276. X`091 INHERIT('database', 'guts', 'global' , 'privusers', 'parser')`093
  277. XPROGRAM MONSTER_WHO ( INPUT, OUTPUT) ;
  278. X`032
  279. X`123
  280. XPROGRAM DESCRIPTION:`032
  281. X`032
  282. X    Image for MONSTER/WHO -command
  283. X`032
  284. XAUTHORS:`032
  285. X`032
  286. X    Kari Hurtta
  287. X`032
  288. XCREATION DATE:`00930.4.1990
  289. X`032
  290. X`032
  291. X`009    C H A N G E   L O G
  292. X`032
  293. X     Date     `124   Name  `124 Description
  294. X--------------+---------+---------------------------------------------------
  295. V----
  296. X 11.6.1990    `124   K E H `124  read_global_flag
  297. X--------------+---------+---------------------------------------------------
  298. V----
  299. X%`091change_entry`093%
  300. X`125
  301. X`032
  302. X`123 DUMMY for linker `125
  303. X`091global`093
  304. Xfunction player_here(id: integer; var slot: integer): boolean;
  305. Xbegin
  306. X    player_here := false;
  307. Xend;
  308. X
  309. X`123 DUMMY for linker `125
  310. X`091global`093
  311. Xprocedure gethere(n: integer := 0);
  312. Xbegin
  313. Xend;
  314. X
  315. X`123 DUMMY for linker `125
  316. X`091global`093
  317. Xprocedure checkevents(silent: boolean := false);
  318. Xbegin
  319. Xend;
  320. X
  321. Xvar play,exist: indexrec;
  322. X    userid: `091global`093 veryshortstring;`009`123 userid of this player `1
  323. V25
  324. X
  325. X    public_id, disowned_id, system_id: shortstring;
  326. X
  327. Xprocedure do_who ;
  328. Xvar
  329. X`009i,j: integer;
  330. X`009ok: boolean;
  331. X`009metaok: boolean;
  332. X`009roomown: veryshortstring;
  333. X        code: integer;
  334. X`009c: char;
  335. X`009s: shortstring;
  336. X`009write_this: boolean;
  337. X`009count: integer;
  338. X`009s1: string;
  339. X
  340. Xvar short_line : boolean;
  341. Xbegin
  342. X
  343. X    short_line := terminal_line_len < 50;
  344. X
  345. X
  346. X`009`123 we need just about everything to print this list:
  347. X`009`009player alloc index, userids, personal names,
  348. X`009`009room names, room owners, and the log record`009`125
  349. X
  350. X`009getpers;
  351. X`009freepers;
  352. X`009getnam;
  353. X`009freenam;
  354. X`009getown;
  355. X`009freeown;
  356. X`009getint(N_LOCATION);`009`123 get where they are `125
  357. X`009freeint;
  358. X`009if not short_line then write('              ');
  359. X`009writeln('     Monster Status');
  360. X`009writeln;
  361. X`009if not short_line then write('Username        ');
  362. X`009writeln('Game Name                 Where');
  363. X
  364. X`009if userid = MM_userid then metaok := true
  365. X`009else metaok := false;
  366. X
  367. X`009for i := 1 to exist.top do begin
  368. X`009`009if not(exist.free`091i`093) then begin
  369. X
  370. X`009`009`009write_this := not play.free`091i`093;
  371. X                        if user.idents`091i`093 = '' then begin
  372. X                           if write_this and not short_line then`032
  373. X`009`009`009    write('<unknown>       ')
  374. X                        end else if user.idents`091i`093`0911`093 <> ':' the
  375. Vn begin
  376. X`009`009`009   if write_this and not short_line then begin
  377. X`009`009`009`009write(user.idents`091i`093);
  378. X`009`009`009`009for j := length(user.idents`091i`093) to 15 do
  379. X`009`009`009`009    write(' ');
  380. X`009`009`009   end;
  381. X                        end else write_this := false;
  382. X                       `032
  383. X                        if write_this then begin
  384. X`009`009`009   write(pers.idents`091i`093);
  385. X`009`009`009   j := length(pers.idents`091i`093);
  386. X`009`009`009   while j <= 25 do begin
  387. X`009`009`009      write(' ');
  388. X`009`009`009      j := j + 1;
  389. X`009`009`009   end;
  390. X                                                   `032
  391. X`009`009`009   if not(metaok) then begin
  392. X`009`009`009      roomown := own.idents`091anint.int`091i`093`093;
  393. X
  394. X`123 if a person is in a public or disowned room, or
  395. X  if they are in the domain of the WHOer, then the player should know
  396. X  where they are  `125
  397. X
  398. X`009`009`009      if (roomown = public_id) or
  399. X`009`009`009`009    (roomown = disowned_id) or
  400. X`009`009`009`009    (roomown = userid) then
  401. X`009`009`009`009`009ok := true
  402. X`009`009`009      else
  403. X`009`009`009`009`009ok := false;
  404. X
  405. X`009`009`009   end;
  406. X
  407. X`009`009`009   if ok or metaok then begin
  408. X`009`009`009`009writeln(nam.idents`091anint.int`091i`093`093);
  409. X`009`009`009   end else
  410. X`009`009`009`009writeln('n/a');
  411. X                       end; `123 write_this `125
  412. X`009`009end;
  413. X`009end;
  414. Xend; `123 do who `125
  415. X
  416. Xvar count,I: integer;
  417. X`032
  418. XBEGIN
  419. X    Get_Environment;
  420. X
  421. X    if not lookup_class(system_id,'system') then
  422. X`009writeln('%error in main program: system');
  423. X    if not lookup_class(public_id,'public') then
  424. X`009writeln('%error in main program: public');
  425. X    if not lookup_class(disowned_id,'disowned') then
  426. X`009writeln('%error in main program: disowned');
  427. X
  428. X    Setup_Guts;
  429. X    if open_database then begin
  430. X`009if read_global_flag(GF_VALID) then begin
  431. X
  432. X`009    getindex(I_PLAYER);
  433. X`009    freeindex;
  434. X`009    exist := indx;
  435. X
  436. X`009    getindex(I_ASLEEP);`009`123 Get index of people who are playing now
  437. V `125
  438. X`009    freeindex;
  439. X`009    play := indx;
  440. X
  441. X`009    getuser;
  442. X`009    freeuser;
  443. X
  444. X`009    count := 0;
  445. X`009    for i := 1 to exist.top do`032
  446. X`009`009if not(exist.free`091i`093) then`032
  447. X`009`009    if not (play.free`091i`093) then`032
  448. X`009`009`009if (user.idents`091i`093 <> '') then
  449. X`009`009`009    if user.idents`091i`093`0911`093 <> ':' then
  450. X`009`009`009`009count := count +1;
  451. X
  452. X`009    if count > 0 then begin
  453. X`009`009    do_who;
  454. X
  455. X`009`009    writeln;
  456. X`009`009    writeln('Number of players: ',count:1);
  457. X`009    end;
  458. X`009end;
  459. X    end;
  460. X    Finish_Guts;
  461. XEND.
  462. $ CALL UNPACK MONSTER_WHO.PAS;5 1349400437
  463. $ create/nolog 'f'
  464. X`091environment,inherit ('Global','Database') `093
  465. XModule Parser(Output);`032
  466. X
  467. X`091hidden`093 Const`032
  468. X`009maxclass  = 3;
  469. X`009maxpriv   = 9;
  470. X`009maxflag   = 3;
  471. X
  472. X`009maxtype`009  = 5;
  473. X
  474. Xconst
  475. X`009PR_manager = 1;
  476. X`009PR_poof    = 2;
  477. X`009PR_global  = 4;
  478. X`009PR_owner   = 8;
  479. X`009PR_special = 16;
  480. X`009PR_monster = 32;
  481. X`009PR_exp     = 64;
  482. X`009PR_quota   = 128;
  483. X`009PR_spell   = 256;
  484. X
  485. X`009all_privileges =`032
  486. X`009    PR_manager +
  487. X`009    PR_poof    +
  488. X`009    PR_global  +
  489. X`009    PR_owner   +
  490. X`009    PR_special +
  491. X`009    PR_monster +
  492. X`009    PR_exp     +
  493. X`009    PR_quota   +
  494. X`009    PR_spell;
  495. X
  496. Xtype
  497. X      class = ( bracket , letter , space, string_c,
  498. X`009`009comment );`009`009`009    `123 merkkien luokitus`009    `125
  499. X
  500. X`009o_type = (t_none, t_room, t_object, t_spell, t_monster,
  501. X`009`009  t_player );
  502. X
  503. X    privrec =
  504. X`009record
  505. X`009    name: shortstring;
  506. X`009    value: unsigned;
  507. X`009end;
  508. X
  509. X   `032
  510. X    typerec =
  511. X`009record
  512. X`009    name: shortstring;
  513. X`009    plname: shortstring;
  514. X`009    value: o_type;
  515. X`009end;
  516. X`032
  517. X   flagrec =
  518. X`009record
  519. X`009    name: shortstring;
  520. X`009    value: integer;
  521. X`009end;
  522. X
  523. X
  524. Xvar
  525. X`009typetable: `091hidden`093 array `0911..maxtype`093 of typerec :=
  526. X`009    `123   name, plname, value `125
  527. X`009    ( (`009'monster', 'monsters', t_monster ),
  528. X`009      ( 'object',  'objects',  t_object ),
  529. X`009      ( 'room',`009   'rooms',    t_room`009),
  530. X`009      ( 'spell',   'spells',   t_spell`009),
  531. X`009      ( 'player',  'players',  t_player) );
  532. X
  533. X
  534. X`009classtable: `091hidden`093 array `0911..maxclass`093 of classrec :=
  535. X`009    `123   name`009    , id `125
  536. X`009    ( ( 'Public'    , ''    ),
  537. X`009      ( 'Disowned'  , '*'   ),
  538. X`009      ( 'System'    , '#'   ));
  539. X
  540. X`009privtable: `091hidden`093 array `0911..maxpriv`093 of privrec :=`032
  541. X
  542. X`009    `123   name`009    , value `125
  543. X`009    ( ( 'Manager'   , PR_manager ),
  544. X`009      ( 'Poof'`009    , PR_poof ),
  545. X`009      ( 'Global'    , PR_global ),
  546. X`009      ( 'Owner'     , PR_owner ),
  547. X`009      ( 'Special'   , PR_special ),
  548. X`009      ( 'Monster'   , PR_monster ),
  549. X`009      ( 'Experience', PR_exp ),
  550. X`009      ( 'Quota'     , PR_quota ),
  551. X`009      ( 'Spell'     , PR_spell ) );
  552. X
  553. X    `009flagtable : `091hidden`093 array `0911..maxflag`093 of flagrec :=`03
  554. V2
  555. X`009    `123   name`009    , value `125
  556. X`009    ( ( 'Active'    , GF_ACTIVE),
  557. X`009      ( 'Valid'`009    , GF_VALID),
  558. X`009      ( 'Wartime'   , GF_WARTIME ) );
  559. X
  560. X
  561. X
  562. X`009auth_priv: `091hidden`093 unsigned := 0;
  563. X`009cur_priv: `091hidden`093 unsigned := 0;
  564. X`009
  565. X`009direct: `091global`093 array`0911..maxexit`093 of shortstring :=
  566. X`009`009('north','south','east','west','up','down');
  567. X
  568. X`009show: `091global`093 array`0911..maxshow`093 of shortstring;
  569. X
  570. X`009numshow: `091global`093 integer;
  571. X
  572. X`009setkey: `091global`093 array`0911..maxshow`093 of shortstring;
  573. X
  574. X`009numset: `091global`093 integer;
  575. X
  576. X
  577. X`091external`093 function player_here(id: integer; var slot: integer): boole
  578. Van;
  579. X`009`009    external;
  580. X`091external`093 procedure gethere(n: integer := 0); external;
  581. X
  582. X`123 PRIVS `125
  583. X
  584. X`091global`093
  585. Xfunction spell_priv: boolean;`009`009
  586. Xbegin
  587. X    spell_priv := uand(cur_priv,PR_spell) > 0;
  588. Xend;`032
  589. X
  590. X
  591. X`091global`093
  592. Xfunction manager_priv: boolean;`009`009
  593. X    `123 Tells if user may use 'system' `125
  594. Xbegin
  595. X    manager_priv := uand(cur_priv,PR_manager) > 0;
  596. Xend;`032
  597. X
  598. X`091global`093
  599. Xfunction`009quota_priv: boolean;`009`009
  600. X    `123 Tells if user may extend quota `125
  601. Xbegin
  602. X   quota_priv := uand(cur_priv,PR_quota) > 0;
  603. Xend;`032
  604. X
  605. X`091global`093
  606. Xfunction poof_priv: boolean;`123 Tells if the user may poof `125
  607. Xbegin
  608. X    poof_priv := uand(cur_priv,PR_poof) > 0;
  609. X
  610. Xend;`032
  611. X
  612. X`091global`093
  613. Xfunction owner_priv: boolean; `123 Tells if the user may custom others' stuf
  614. Vf `125
  615. Xbegin
  616. X    owner_priv := uand(cur_priv,PR_owner) > 0;
  617. Xend;`032
  618. X
  619. X`091global`093
  620. Xfunction global_priv: boolean;`032
  621. Xbegin
  622. X    global_priv := uand(cur_priv,PR_global) > 0;
  623. Xend;`032
  624. X
  625. X`091global`093
  626. Xfunction special_priv: boolean; `123 Tells if the user may create 'special'
  627. V objects or exits `125
  628. Xbegin
  629. X    special_priv := uand(cur_priv, PR_special) > 0;
  630. Xend;`032
  631. X
  632. X`091global`093
  633. Xfunction monster_priv: boolean; `123 tells if the user may create evil monst
  634. Vers `125
  635. Xbegin
  636. X    monster_priv := uand(cur_priv,PR_monster) > 0;
  637. Xend;`032
  638. X
  639. X`091global`093
  640. Xfunction exp_priv: boolean;`009`123 Tells if the user may alter experience `
  641. V125
  642. Xbegin
  643. X    exp_priv := uand(cur_priv,PR_exp) > 0;
  644. Xend;`032
  645. X
  646. Xvar  wizard: `091global`093 boolean;
  647. X`009`009`009`009`123 Tells if user has rights to rebuild `125
  648. X
  649. X
  650. X`091global`093
  651. Xprocedure set_auth_priv(priv: unsigned);
  652. Xbegin
  653. X    auth_priv := priv;
  654. X    cur_priv  := uand(cur_priv,priv);
  655. Xend;
  656. X
  657. X`091global`093
  658. Xprocedure set_cur_priv(priv: unsigned);
  659. Xbegin
  660. X    cur_priv := uand(priv, auth_priv);
  661. Xend;
  662. X
  663. X`091global`093
  664. Xfunction read_cur_priv: unsigned;
  665. Xbegin
  666. X    read_cur_priv := cur_priv;
  667. Xend;
  668. X
  669. X`091global`093
  670. Xfunction read_auth_priv: unsigned;
  671. Xbegin
  672. X    read_auth_priv := auth_priv;
  673. Xend;
  674. X
  675. Xprocedure list_privileges (privs: unsigned);
  676. Xvar i: integer;
  677. Xbegin
  678. X    if privs = 0 then write('None')
  679. X    else for i := 1 to maxpriv do
  680. X`009if uand(privtable`091i`093.value,privs) > 0 then`032
  681. X`009    write(privtable`091i`093.name,' ');
  682. X    writeln;
  683. Xend;
  684. X
  685. X`123 ---- `125
  686. X
  687. X
  688. X
  689. X`091global`093
  690. Xfunction lowcase(s: string):string;
  691. Xvar
  692. X`009sprime: string;
  693. X`009i: integer;
  694. X
  695. Xbegin
  696. X`009if length(s) = 0 then
  697. X`009`009lowcase := ''
  698. X`009else begin
  699. X`009`009sprime := s;
  700. X`009`009for i := 1 to length(s) do
  701. X`009`009`009if sprime`091i`093 in `091'A'..'Z'`093 then
  702. X`009`009`009   sprime`091i`093 := chr(ord('a')+(ord(sprime`091i`093)-ord('A'
  703. V)));
  704. X`009`009lowcase := sprime;
  705. X`009end;
  706. Xend;
  707. X
  708. X`091global`093
  709. Xfunction classify (a: char): class;
  710. Xbegin
  711. X   case a of
  712. X`009' ',''(9):`009classify := space;
  713. X`009'"':`009`009classify := string_c;
  714. X`009'(',')',',','-':classify := bracket;            `032
  715. X`009'!':`009`009classify := comment;
  716. X`009otherwise`009classify := letter;
  717. X   end;
  718. Xend;
  719. X
  720. X`091global`093
  721. Xfunction clean_spaces(inbuf: mega_string):mega_string;
  722. Xvar bf: mega_string;
  723. X    space_f: boolean;
  724. Xbegin
  725. X    bf := '';`032
  726. X    space_f := true;
  727. X    while inbuf > '' do begin
  728. X`009if classify(inbuf `0911`093) <> space then bf := bf + inbuf `0911`093
  729. X`009else if not space_f then bf := bf + ' ';
  730. X`009space_f := classify(inbuf `0911`093) = space;
  731. X`009inbuf := substr(inbuf,2,length(inbuf)-1)
  732. X    end;     `032
  733. X    if bf > '' then if classify(bf`091length(bf)`093) = space then
  734. X`009bf := substr(bf,1,length(bf)-1);
  735. X    clean_spaces := bf
  736. Xend; `123 clean spaces `125
  737. X
  738. X`091global`093
  739. Xprocedure write_debug(a: string; b: mega_string := '');
  740. Xbegin
  741. X   if debug then begin
  742. X      write(a,'   ');
  743. X      if length(b) > 200 then`009`123 system limit printable string `125
  744. X                                `123 about 200 characters          `125
  745. X         writeln('(PARAMETER TOO LONG FOR PRINTING)')
  746. X      else writeln(b);
  747. X   end;
  748. Xend;
  749. X
  750. X`091global`093
  751. Xfunction cut_atom (var main: mega_string; var x: integer;
  752. X`009`009    delimeter: char): shortstring;
  753. Xvar start,i,last: integer;
  754. Xbegin   `032
  755. X    write_debug('%cut_atom');
  756. X    start := x;              `032
  757. X    if x > length (main) then cut_atom := ''
  758. X    else begin                 `032
  759. X`009if start + shortlen <=  length(main) then`032
  760. X`009    last := start + shortlen-1
  761. X`009else last := length(main);  `032
  762. X`009x := last+1;
  763. X`009for i := last downto start do
  764. X`009    if main`091i`093 = delimeter then x := i;
  765. X`009cut_atom := substr(main,start,x-start);
  766. X`009x := x +1
  767. X    end
  768. Xend; `123 cut_atom `125
  769. X
  770. Xfunction lookup_general(rec: namrec; ind: integer;`032
  771. X`009`009`009var id: integer; s: string;
  772. X`009`009`009help: boolean): boolean;
  773. Xvar i,poss,maybe,num: integer;
  774. X    temp: string;
  775. Xbegin
  776. X    if debug then writeln('lookup_general: ',s);   `032
  777. X    getindex(ind);
  778. X    freeindex;
  779. X    s := lowcase(s);
  780. X    i := 1;
  781. X    maybe := 0;
  782. X    num := 0;
  783. X    for i := 1 to indx.top do begin
  784. X`009if not(indx.free`091i`093) then begin
  785. X`009    temp := lowcase(rec.idents`091i`093);
  786. X`009    if s = temp then num := i
  787. X`009    else if index(temp,s) = 1 then begin
  788. X`009`009maybe := maybe + 1;
  789. X`009`009poss := i;
  790. X`009    end;
  791. X`009end;
  792. X    end;
  793. X    if debug then writeln ('lookup_general: (',num:1,',',maybe:1,')');
  794. X    if num <> 0 then begin
  795. X`009id := num;
  796. X`009lookup_general := true;
  797. X    end else if maybe = 1 then begin
  798. X`009id := poss;
  799. X`009lookup_general := true;
  800. X    end else if maybe > 1 then begin
  801. X`009if help then begin
  802. X`009    writeln('Ambiguous - Refer you one of following?');
  803. X`009    for i := 1 to indx.top do`032
  804. X`009`009if not(indx.free`091i`093) then`032
  805. X`009`009    if index(lowcase(rec.idents`091i`093),s) = 1 then`032
  806. X`009`009`009writeln('          ',rec.idents`091i`093);
  807. X`009end;
  808. X`009lookup_general := false;
  809. X    end else begin
  810. X`009lookup_general := false;
  811. X    end;
  812. Xend; `123 lookup_general `125
  813. X
  814. X`091global`093
  815. Xfunction lookup_user(var pnum: integer;s: string;
  816. X    help: boolean := false): boolean;
  817. Xbegin
  818. X    getuser;
  819. X    freeuser;
  820. X    lookup_user := lookup_general(user,i_PLAYER,pnum,s,help);
  821. Xend;
  822. X
  823. X`091global`093
  824. Xfunction lookup_room(var n: integer; s: string;
  825. X    help: boolean := false): boolean;
  826. Xbegin
  827. X   if s <> '' then begin
  828. X`009getnam;
  829. X`009freenam;
  830. X`009lookup_room := lookup_general(nam,I_ROOM,n,s,help);
  831. X   end else lookup_room := false;
  832. Xend; `123 lookup_room `125
  833. X
  834. X`091global`093
  835. Xfunction lookup_pers(var pnum: integer;s: string;
  836. X    help: boolean := false): boolean;
  837. Xbegin
  838. X    getpers;
  839. X    freepers;
  840. X    lookup_pers := lookup_general(pers,I_PLAYER,pnum,s,help);
  841. Xend; `123 lookup_pers `125
  842. X
  843. X`091global`093
  844. Xfunction lookup_obj(var pnum: integer;s: string;
  845. X    help: boolean := false): boolean;
  846. Xbegin
  847. X    getobjnam;
  848. X    freeobjnam;
  849. X    lookup_obj := lookup_general(objnam,I_OBJECT,pnum,s,help);
  850. Xend;
  851. X
  852. X`091global`093
  853. Xfunction lookup_spell(var sp: integer;s: string;
  854. X    help: boolean := false): boolean;
  855. Xbegin
  856. X    getspell_name;
  857. X    freespell_name;
  858. X    lookup_spell := lookup_general(spell_name,I_SPELL,sp,s,help);
  859. Xend;
  860. X
  861. Xfunction meta_scan( indx:  indexrec;
  862. X`009`009    name:    namrec;
  863. X`009`009    function action(`009nameid:`009shortstring;
  864. X`009`009`009`009`009id:`009integer
  865. X`009`009`009):  boolean;
  866. X`009`009    line:   mega_string;
  867. X`009`009    silent: boolean;
  868. X`009`009    function restriction (id: integer): boolean
  869. X`009`009    ):`009    boolean;
  870. Xtype tabletype = array `091 1.. maxroom`093 of boolean;
  871. X
  872. Xvar table,temp:  tabletype;
  873. X    i,cur,count,exact: integer;
  874. X    result: boolean;
  875. X    atom: shortstring;
  876. X    unambiqous,error: boolean;
  877. X
  878. X
  879. X    function sub_scan(`009indx: indexrec;`032
  880. X`009`009`009name: namrec;
  881. X`009`009`009atom: shortstring;
  882. X`009`009    var`009result: tabletype;
  883. X`009`009    var`009exact:`009integer): integer;
  884. X    var i,count: integer;
  885. X    begin
  886. X`009write_debug('%sub_scan: ',atom);
  887. X`009for i := 1 to maxroom do result`091i`093 := false;
  888. X`009count := 0;
  889. X`009exact := 0;
  890. X`009for i := 1 to indx.top do if not indx.free`091i`093 then begin
  891. X`009    if ((index(clean_spaces(lowcase(name.idents`091i`093)),atom) = 1) or
  892. V`032
  893. X`009`009((index(clean_spaces(lowcase(name.idents`091i`093)),' '+atom) > 0)`0
  894. V32
  895. X`009`009 and unambiqous) ) and restriction(i) then begin
  896. X`009`009result`091i`093 := true;
  897. X`009`009count := count +1;
  898. X`009    end;
  899. X`009    if (lowcase(name.idents`091i`093) = atom) and restriction(i)
  900. X`009`009then exact := i;
  901. X`009end;
  902. X`009sub_scan := count;
  903. X    end;    `123 sub_scan `125
  904. X
  905. X
  906. X
  907. Xbegin
  908. X    write_debug('%meta_scan: ',line);
  909. X    if length(line) = 3 then`009`123 we can't do direct check because line c
  910. Van `125
  911. X`009if lowcase(line) = 'all' then line := '*';   `123 be over 80 characters
  912. V `125
  913. X    result := false;
  914. X    error  := false;
  915. X    for i := 1 to maxroom do table`091i`093 := false;
  916. X    cur := 1;
  917. X    while cur <= length(line) do begin
  918. X`009atom := lowcase(cut_atom(line,cur,','));
  919. X`009unambiqous := true;
  920. X`009if atom > '' then if atom`091length(atom)`093 = '*' then begin
  921. X`009    atom := substr(atom,1,length(atom)-1);
  922. X`009    unambiqous := false;
  923. X`009end;
  924. X`009atom := clean_spaces(atom);
  925. X`009count := sub_scan(indx,name,atom,temp,exact);
  926. X`009if unambiqous and (exact = 0) and (count > 1) then begin
  927. X`009    error := true;
  928. X`009    if not silent then writeln('"',atom,'" is ambiguous.');
  929. X`009end;
  930. X`009if (count = 0) and unambiqous then begin
  931. X`009    error := true;
  932. X`009    if not silent then writeln('"',atom,'" not exist.');
  933. X`009end;
  934. X`009if unambiqous and (exact > 0) then
  935. X`009    table`091exact`093 := true
  936. X`009else for i := 1 to maxroom do
  937. X`009    table`091i`093 := table`091i`093 or temp`091i`093;
  938. X    end;
  939. X    `123 action part `125
  940. X    if not error then
  941. X`009for i := 1 to maxroom do
  942. X`009    if table`091i`093 then
  943. X`009`009result := result or action(name.idents`091i`093,i);
  944. X    meta_scan := result;
  945. Xend; `123 meta_scan `125
  946. X
  947. X`091global`093
  948. Xfunction scan_room(`009function action(    nameid:`009shortstring;
  949. X`009`009`009`009`009    id:`009integer
  950. X`009`009`009):  boolean;
  951. X`009`009    line:   mega_string;
  952. X`009`009    silent: boolean := false;
  953. X`009`009    function restriction (id: integer): boolean
  954. X`009`009    ):`009    boolean;
  955. Xbegin
  956. X    getnam;
  957. X    freenam;
  958. X    getindex(I_ROOM);
  959. X    freeindex;
  960. X    scan_room := meta_scan(indx,nam,action,line,silent,restriction);
  961. Xend;
  962. X
  963. X`091global`093
  964. Xfunction scan_pers(`009function action(    nameid:`009shortstring;
  965. X`009`009`009`009`009    id:`009integer
  966. X`009`009`009):  boolean;
  967. X`009`009    line:   mega_string;
  968. X`009`009    silent: boolean := false;
  969. X`009`009    function restriction (id: integer): boolean
  970. X`009`009    ):`009    boolean;
  971. Xbegin
  972. X    getpers;
  973. X    freepers;
  974. X    getindex(I_PLAYER);
  975. X    freeindex;
  976. X    scan_pers := meta_scan(indx,pers,action,line,silent,restriction);
  977. Xend;
  978. X
  979. X`091global`093
  980. Xfunction scan_obj(`009function action(    nameid:`009shortstring;
  981. X`009`009`009`009`009    id:`009integer
  982. X`009`009`009):  boolean;
  983. X`009`009    line:   mega_string;
  984. X`009`009    silent: boolean := false;
  985. X`009`009    function restriction (id: integer): boolean
  986. X`009`009    ):`009    boolean;
  987. Xbegin
  988. X    getobjnam;
  989. X    freeobjnam;
  990. X    getindex(I_OBJECT);
  991. X    freeindex;
  992. X    scan_obj := meta_scan(indx,objnam,action,line,silent,restriction);
  993. Xend;
  994. X
  995. X`091global`093
  996. Xfunction scan_pers_slot(function action(`009nameid:`009    shortstring;
  997. X`009`009`009`009`009`009slot:`009    integer
  998. X`009`009`009    ):`009boolean;
  999. X`009`009`009line:`009mega_string;
  1000. X`009`009`009silent: boolean := false;
  1001. X`009`009`009function restriction (slot: integer): boolean
  1002. X`009`009`009):`009boolean;
  1003. X
  1004. X    function real_res(id: integer): boolean;
  1005. X    var slot: integer;
  1006. X    begin
  1007. X`009if player_here(id,slot) then
  1008. X`009    real_res := restriction(slot)
  1009. X`009else real_res := false;
  1010. X    end; `123 real_res `125
  1011. X
  1012. X    function real_action(   nameid: shortstring;
  1013. X`009`009`009    id:`009    integer
  1014. X`009`009`009    ):`009    boolean;
  1015. X    var slot: integer;
  1016. X    begin
  1017. X`009gethere;`009`123 we need this here because action can change 'here' `125
  1018. X`009if player_here(id,slot) then
  1019. X`009    real_action := action(nameid,slot)
  1020. X`009else real_action := false;
  1021. X    end; `123 real_acttion `125
  1022. X
  1023. X
  1024. Xbegin
  1025. X
  1026. X    gethere;
  1027. X    scan_pers_slot := scan_pers (real_action,line,silent,real_res);
  1028. X
  1029. Xend; `123 scan_pers_obj `125
  1030. X
  1031. X
  1032. X`123 translate a direction s `091north, south, etc...`093 into the integer c
  1033. Vode `125
  1034. X
  1035. X`091global`093
  1036. Xfunction lookup_dir(var dir: integer;s:string;
  1037. X    help: boolean := false): boolean;
  1038. Xvar
  1039. X`009i,poss,maybe,num: integer;
  1040. X
  1041. Xbegin
  1042. X    if debug then writeln('lookup_dir: ',s);
  1043. X`009s := lowcase(s);
  1044. X`009i := 1;
  1045. X`009maybe := 0;
  1046. X`009num := 0;
  1047. X`009for i := 1 to maxexit do begin
  1048. X`009`009if s = direct`091i`093 then
  1049. X`009`009`009num := i
  1050. X`009`009else if index(direct`091i`093,s) = 1 then begin
  1051. X`009`009`009maybe := maybe + 1;
  1052. X`009`009`009poss := i;
  1053. X`009`009end;
  1054. X`009end;
  1055. X`009if debug then writeln ('lookup_dir: (',num:1,',',maybe:1,')');
  1056. X
  1057. X`009if num <> 0 then begin
  1058. X`009`009dir := num;
  1059. X`009`009lookup_dir := true;
  1060. X`009end else if maybe = 1 then begin
  1061. X`009`009dir := poss;
  1062. X`009`009lookup_dir := true;
  1063. X`009end else if maybe > 1 then begin
  1064. X`009    if help then begin
  1065. X`009`009writeln('Ambiguous - Refer you one of following?');
  1066. X`009`009for i := 1 to maxexit do `032
  1067. X`009`009`009if index(lowcase(direct`091i`093),s) = 1 then`032
  1068. X`009`009`009    writeln('          ',direct`091i`093);
  1069. X`009    end;
  1070. X`009    lookup_dir := false;
  1071. X`009end else begin
  1072. X`009    lookup_dir := false;
  1073. X`009end;
  1074. Xend; `123 lookup_dir `125
  1075. X
  1076. X`091global`093
  1077. Xfunction lookup_show(var n: integer;s:string;
  1078. X    help: boolean := false): boolean;
  1079. Xvar
  1080. X`009i,poss,maybe,num: integer;
  1081. X
  1082. Xbegin
  1083. X    if debug then writeln('lookup_show: ',s);
  1084. X`009s := lowcase(s);
  1085. X`009i := 1;
  1086. X`009maybe := 0;
  1087. X`009num := 0;
  1088. X`009for i := 1 to numshow do begin
  1089. X`009`009if s = show`091i`093 then
  1090. X`009`009`009num := i
  1091. X`009`009else if index(show`091i`093,s) = 1 then begin
  1092. X`009`009`009maybe := maybe + 1;
  1093. X`009`009`009poss := i;
  1094. X`009`009end;
  1095. X`009end;
  1096. X`009if debug then writeln ('lookup_show: (',num:1,',',maybe:1,')');
  1097. X
  1098. X`009if num <> 0 then begin
  1099. X`009`009n := num;
  1100. X`009`009lookup_show := true;
  1101. X`009end else if maybe = 1 then begin
  1102. X`009`009n := poss;
  1103. X`009`009lookup_show := true;
  1104. X`009end else if maybe > 1 then begin
  1105. X`009    if help then begin
  1106. X`009`009writeln('Ambiguous - Refer you one of following?');
  1107. X`009`009for i := 1 to numshow do`032
  1108. X`009`009    if index(lowcase(show`091i`093),s) = 1 then`032
  1109. X`009`009`009writeln('          ',show`091i`093);
  1110. X`009    end;
  1111. X`009    lookup_show := false;
  1112. X`009end else begin
  1113. X`009`009lookup_show := false;
  1114. X`009end;
  1115. Xend;`009`123 lookup_show `125
  1116. X
  1117. X`091global`093
  1118. Xfunction lookup_set(var n: integer;s:string;
  1119. X    help: boolean := false): boolean;
  1120. Xvar
  1121. X`009i,poss,maybe,num: integer;
  1122. X
  1123. Xbegin
  1124. X    if debug then writeln('lookup_set: ',s);
  1125. X`009s := lowcase(s);
  1126. X`009i := 1;
  1127. X`009maybe := 0;
  1128. X`009num := 0;
  1129. X`009for i := 1 to numset do begin
  1130. X`009`009if s = setkey`091i`093 then
  1131. X`009`009`009num := i
  1132. X`009`009else if index(setkey`091i`093,s) = 1 then begin
  1133. X`009`009`009maybe := maybe + 1;
  1134. X`009`009`009poss := i;
  1135. X`009`009end;
  1136. X`009end;
  1137. X`009if debug then writeln ('lookup_set: (',num:1,',',maybe:1,')');
  1138. X`009if num <> 0 then begin
  1139. X`009`009n := num;
  1140. X`009`009lookup_set := true;
  1141. X`009end else if maybe = 1 then begin
  1142. X`009`009n := poss;
  1143. X`009`009lookup_set := true;
  1144. X`009end else if maybe > 1 then begin
  1145. X`009    if help then begin
  1146. X`009`009writeln('Ambiguous - Refer you one of following?');
  1147. X`009`009for i := 1 to numset do`032
  1148. X`009`009if index(lowcase(setkey`091i`093),s) = 1 then`032
  1149. X`009`009`009writeln('          ',setkey`091i`093);
  1150. X`009    end;
  1151. X`009    lookup_set := false;
  1152. X`009end else begin
  1153. X`009`009lookup_set := false;
  1154. X`009end;
  1155. Xend;
  1156. X
  1157. X`091global`093
  1158. Xfunction exact_room(var n: integer;s: string): boolean;
  1159. Xvar
  1160. X`009match: boolean;
  1161. X
  1162. Xbegin
  1163. X`009if debug then
  1164. X`009`009writeln('%exact room: s = ',s);
  1165. X`009if lookup_room(n,s) then begin
  1166. X`009`009if nam.idents`091n`093 = lowcase(s) then
  1167. X`009`009`009exact_room := true
  1168. X`009`009else
  1169. X`009`009`009exact_room := false;
  1170. X`009end else
  1171. X`009`009exact_room := false;
  1172. Xend;`009`123 exact_room `125
  1173. X
  1174. X`091global`093
  1175. Xfunction exact_pers(var n: integer;s: string): boolean;
  1176. Xvar
  1177. X`009match: boolean;
  1178. X
  1179. Xbegin
  1180. X`009if lookup_pers(n,s) then begin
  1181. X`009`009if lowcase(pers.idents`091n`093) = lowcase(s) then
  1182. X`009`009`009exact_pers := true
  1183. X`009`009else
  1184. X`009`009`009exact_pers := false;
  1185. X`009end else
  1186. X`009`009exact_pers := false;
  1187. Xend;`009`123 exact_user `125
  1188. X
  1189. X`091global`093
  1190. Xfunction exact_user(var n: integer;s: string): boolean;
  1191. Xvar
  1192. X`009match: boolean;
  1193. X
  1194. Xbegin
  1195. X`009if lookup_user(n,s) then begin
  1196. X`009`009if lowcase(user.idents`091n`093) = lowcase(s) then
  1197. X`009`009`009exact_user := true
  1198. X`009`009else
  1199. X`009`009`009exact_user := false;
  1200. X`009end else
  1201. X`009`009exact_user := false;
  1202. Xend;`009`123 exact_user `125
  1203. X
  1204. X`091global`093
  1205. Xfunction exact_obj(var n: integer;s: string): boolean;
  1206. Xvar
  1207. X`009match: boolean;
  1208. X
  1209. Xbegin
  1210. X`009if lookup_obj(n,s) then begin
  1211. X`009`009if objnam.idents`091n`093 = lowcase(s) then
  1212. X`009`009`009exact_obj := true
  1213. X`009`009else
  1214. X`009`009`009exact_obj := false;
  1215. X`009end else
  1216. X`009`009exact_obj := false;
  1217. Xend;`009`123 exact_obj `125
  1218. X
  1219. X`091global`093
  1220. Xfunction lookup_class(var id: shortstring; s:string;
  1221. X    help: boolean := false): boolean;
  1222. Xvar
  1223. X`009i,poss,maybe,num: integer;
  1224. X
  1225. Xbegin
  1226. X    if debug then writeln('lookup_class: ',s);
  1227. X`009s := lowcase(s);
  1228. X`009i := 1;
  1229. X`009maybe := 0;
  1230. X`009num := 0;
  1231. X`009for i := 1 to maxclass do begin
  1232. X`009`009if s = lowcase(classtable`091i`093.name) then
  1233. X`009`009`009num := i
  1234. X`009`009else if index(lowcase(classtable`091i`093.name),s) = 1 then begin
  1235. X`009`009`009maybe := maybe + 1;
  1236. X`009`009`009poss := i;
  1237. X`009`009end;
  1238. X`009end;
  1239. X`009if debug then writeln ('lookup_class: (',num:1,',',maybe:1,')');
  1240. X
  1241. X`009if num <> 0 then begin
  1242. X`009`009id := classtable`091num`093.id;
  1243. X`009`009lookup_class := true;
  1244. X`009end else if maybe = 1 then begin
  1245. X`009`009id := classtable`091poss`093.id;
  1246. X`009`009lookup_class := true;
  1247. X`009end else if maybe > 1 then begin
  1248. X`009    if help then begin
  1249. X`009`009writeln('Ambiguous - Refer you one of following?');
  1250. X`009`009for i := 1 to maxclass do`032
  1251. X`009`009    if index(lowcase(classtable`091i`093.name),s) = 1 then`032
  1252. X`009`009`009writeln('          ',classtable`091i`093.name);
  1253. X`009    end;
  1254. X`009    id := '<error>';
  1255. X`009    lookup_class := false;
  1256. X`009end else begin
  1257. X`009`009id := '<error>';
  1258. X`009`009lookup_class := false;
  1259. X`009end;
  1260. Xend;
  1261. X
  1262. X`091global`093
  1263. Xfunction lookup_priv(var id: unsigned; s:string;
  1264. X    help: boolean := false): boolean;
  1265. Xvar
  1266. X`009i,poss,maybe,num: integer;
  1267. X
  1268. Xbegin
  1269. X    if debug then writeln('lookup_priv: ',s);
  1270. X`009s := lowcase(s);
  1271. X`009i := 1;
  1272. X`009maybe := 0;
  1273. X`009num := 0;
  1274. X`009for i := 1 to maxpriv do begin
  1275. X`009`009if s = lowcase(privtable`091i`093.name) then
  1276. X`009`009`009num := i
  1277. X`009`009else if index(lowcase(privtable`091i`093.name),s) = 1 then begin
  1278. X`009`009`009maybe := maybe + 1;
  1279. X`009`009`009poss := i;
  1280. X`009`009end;
  1281. X`009end;
  1282. X`009if debug then writeln ('lookup_priv: (',num:1,',',maybe:1,')');
  1283. X
  1284. X`009if num <> 0 then begin
  1285. X`009`009id := privtable`091num`093.value;
  1286. X`009`009lookup_priv := true;
  1287. X`009end else if maybe = 1 then begin
  1288. X`009`009id := privtable`091poss`093.value;
  1289. X`009`009lookup_priv := true;
  1290. X`009end else if maybe > 1 then begin
  1291. X`009    if help then begin
  1292. X`009`009writeln('Ambiguous - Refer you one of following?');
  1293. X`009`009for i := 1 to maxpriv do`032
  1294. X`009`009    if index(lowcase(privtable`091i`093.name),s) = 1 then`032
  1295. X`009`009`009writeln('          ',privtable`091i`093.name);
  1296. X`009    end;
  1297. X`009    id := 0;
  1298. X`009    lookup_priv := false;
  1299. X`009end else begin
  1300. X`009`009id := 0;
  1301. X`009`009lookup_priv := false;
  1302. X`009end;
  1303. Xend;
  1304. X
  1305. X`091global`093
  1306. Xfunction lookup_type(var id: o_type; s:string; pl: boolean;
  1307. X    help: boolean := false): boolean;
  1308. Xvar
  1309. X`009i,poss,maybe,num: integer;
  1310. X`009name: shortstring;
  1311. X
  1312. Xbegin
  1313. X    if debug then writeln('lookup_type: ',s);
  1314. X`009s := lowcase(s);
  1315. X`009i := 1;
  1316. X`009maybe := 0;
  1317. X`009num := 0;
  1318. X`009for i := 1 to maxtype do begin
  1319. X`009`009if pl then name :=  typetable`091i`093.plname`032
  1320. X`009`009else name := typetable`091i`093.name;
  1321. X
  1322. X`009`009if s = name then num := i
  1323. X`009`009else if index(lowcase(name),s) = 1 then begin
  1324. X`009`009`009maybe := maybe + 1;
  1325. X`009`009`009poss := i;
  1326. X`009`009end;
  1327. X`009end;
  1328. X`009if debug then writeln ('lookup_type: (',num:1,',',maybe:1,')');
  1329. X
  1330. X`009if num <> 0 then begin
  1331. X`009`009id := typetable`091num`093.value;
  1332. X`009`009lookup_type := true;
  1333. X`009end else if maybe = 1 then begin
  1334. X`009`009id := typetable`091poss`093.value;
  1335. X`009`009lookup_type := true;
  1336. X`009end else if maybe > 1 then begin
  1337. X`009    if help then begin
  1338. X`009`009writeln('Ambiguous - Refer you one of following?');
  1339. X`009`009if pl then begin
  1340. X`009`009    for i := 1 to maxtype do`032
  1341. X`009`009`009if index(lowcase(typetable`091i`093.plname),s) = 1 then`032
  1342. X`009`009`009    writeln('          ',typetable`091i`093.plname);
  1343. X`009`009end else begin
  1344. X`009`009    for i := 1 to maxtype do`032
  1345. X`009`009`009if index(lowcase(typetable`091i`093.name),s) = 1 then`032
  1346. X`009`009`009    writeln('          ',typetable`091i`093.name);
  1347. X`009`009end;
  1348. X`009    end;
  1349. X
  1350. X`009`009id := t_none;
  1351. X`009`009lookup_type := false;
  1352. X`009end else begin
  1353. X`009`009id := t_none;
  1354. X`009`009lookup_type := false;
  1355. X`009end;
  1356. Xend;
  1357. X
  1358. X`091global`093
  1359. Xfunction lookup_flag(var id: integer; s:string;
  1360. X    help: boolean := false)   : boolean;
  1361. Xvar
  1362. X`009i,poss,maybe,num: integer;
  1363. X
  1364. Xbegin
  1365. X    if debug then writeln('lookup_flag: ',s);
  1366. X`009s := lowcase(s);
  1367. X`009i := 1;
  1368. X`009maybe := 0;
  1369. X`009num := 0;
  1370. X`009for i := 1 to maxflag do begin
  1371. X`009`009if s = lowcase(flagtable`091i`093.name) then
  1372. X`009`009`009num := i
  1373. X`009`009else if index(lowcase(flagtable`091i`093.name),s) = 1 then begin
  1374. X`009`009`009maybe := maybe + 1;
  1375. X`009`009`009poss := i;
  1376. X`009`009end;
  1377. X`009end;
  1378. X`009if debug then writeln ('lookup_flag: (',num:1,',',maybe:1,')');
  1379. X
  1380. X`009if num <> 0 then begin
  1381. X`009`009id := flagtable`091num`093.value;
  1382. X`009`009lookup_flag := true;
  1383. X`009end else if maybe = 1 then begin
  1384. X`009`009id := flagtable`091poss`093.value;
  1385. X`009`009lookup_flag := true;
  1386. X`009end else if maybe > 1 then begin
  1387. X`009    if help then begin
  1388. X`009`009writeln('Ambiguous - Refer you one of following?');
  1389. X`009`009for i := 1 to maxflag do`032
  1390. X`009`009    if index(lowcase(flagtable`091i`093.name),s) = 1 then`032
  1391. X`009`009`009writeln('          ',flagtable`091i`093.name);
  1392. X`009    end;
  1393. X`009    id := 0;
  1394. X`009    lookup_flag := false;
  1395. X`009end else begin
  1396. X`009`009id := 0;
  1397. X`009`009lookup_flag := false;
  1398. X`009end;
  1399. Xend; `123 lookup_flag `125
  1400. X
  1401. X
  1402. X`091global`093
  1403. Xfunction class_out(id: shortstring): shortstring;
  1404. Xvar i: integer;
  1405. Xbegin
  1406. X    class_out := id;
  1407. X    for i := 1 to maxclass do
  1408. X`009if id = classtable`091i`093.id then class_out := classtable`091i`093.nam
  1409. Ve;
  1410. Xend; `123 class_out `125
  1411. X
  1412. X`123 global procedures for module interpreter `125
  1413. X
  1414. X`091global`093
  1415. Xfunction int_spell_level(pname: shortstring; sname: shortstring): integer;
  1416. X   `123 -1 = error `125
  1417. Xvar pid: integer;
  1418. X    sid: integer;
  1419. Xbegin
  1420. X    if debug then begin
  1421. X`009writeln('%int_spell_level: ',pname);
  1422. X`009writeln('%               : ',sname);
  1423. X    end;
  1424. X    if not lookup_pers(pid,pname) then int_spell_level := -1
  1425. X    else if not lookup_spell(sid,sname) then int_spell_level := -2
  1426. X    else begin
  1427. X`009getspell(pid);
  1428. X`009freespell;
  1429. X`009int_spell_level := spell.level`091sid`093;
  1430. X    end;
  1431. Xend; `123 int_spell_level `125
  1432. X
  1433. X`091global`093
  1434. Xfunction int_set_spell_level(pname: shortstring; sname: shortstring;
  1435. X    lev: integer): boolean;
  1436. Xvar pid: integer;
  1437. X    sid: integer;
  1438. Xbegin
  1439. X    if debug then begin
  1440. X`009writeln('%int_set_spell_level: ',pname);
  1441. X`009writeln('%                   : ',sname);
  1442. X`009writeln('%                   : ',lev:1);
  1443. X    end;
  1444. X    if not lookup_pers(pid,pname) then int_set_spell_level := false
  1445. X    else if not lookup_spell(sid,sname) then int_set_spell_level := false
  1446. X    else begin
  1447. X`009getspell(pid);
  1448. X`009spell.level`091sid`093 := lev;
  1449. X`009putspell;
  1450. X`009int_set_spell_level := true;
  1451. X    end;
  1452. Xend; `123 int_set_spell_level `125
  1453. X
  1454. X`091global`093
  1455. Xfunction int_lookup_player(name: shortstring): shortstring;
  1456. Xvar i: integer;
  1457. Xbegin
  1458. X   if debug then writeln('%int_lookup_player: ',name);
  1459. X   if lookup_pers(i,name) then int_lookup_player := pers.idents`091i`093
  1460. X   else int_lookup_player := '';
  1461. Xend; `123 int_lookup_player `125
  1462. X
  1463. X`091global`093
  1464. Xfunction int_lookup_object(name: shortstring): shortstring;
  1465. Xvar i: integer;
  1466. Xbegin
  1467. X   if debug then writeln('%int_lookup_object: ',name);
  1468. X   if lookup_obj(i,name) then int_lookup_object := objnam.idents`091i`093
  1469. X   else int_lookup_object := '';
  1470. Xend; `123 int_lookup_object `125
  1471. X
  1472. X`091global`093
  1473. Xfunction int_lookup_room(name: shortstring): shortstring;
  1474. Xvar i: integer;
  1475. Xbegin
  1476. X   if debug then writeln('%int_lookup_room: ',name);
  1477. X   if lookup_room(i,name) then int_lookup_room := nam.idents`091i`093
  1478. X   else int_lookup_room := '';
  1479. Xend; `123 int_lookup_room `125
  1480. X
  1481. X`091global`093
  1482. Xfunction int_lookup_direction(name: shortstring): shortstring;
  1483. Xvar i: integer;
  1484. Xbegin
  1485. X   if debug then writeln('%int_lookup_direction: ',name);
  1486. X   if lookup_dir(i,name) then int_lookup_direction := direct`091i`093
  1487. X   else int_lookup_direction := '';
  1488. Xend; `123 int_lookup_direction `125
  1489. X
  1490. X`091global`093
  1491. Xfunction slead(s: string):string;
  1492. Xvar
  1493. X`009i: integer;
  1494. X`009going: boolean;
  1495. X
  1496. Xbegin
  1497. X`009if length(s) = 0 then begin
  1498. X`009`009slead := '';
  1499. X`009`009if debug then writeln('slead: ');
  1500. X`009end else begin
  1501. X`009`009i := 1;
  1502. X`009`009going := true;
  1503. X`009`009while going do begin
  1504. X`009`009`009if i > length(s) then
  1505. X`009`009`009`009going := false
  1506. X`009`009`009else if (s`091i`093=' ') or (s`091i`093=chr(9)) then
  1507. X`009`009`009`009i := i + 1
  1508. X`009`009`009else
  1509. X`009`009`009`009going := false;
  1510. X`009`009end;
  1511. X
  1512. X`009`009if i > length(s) then begin
  1513. X`009`009    slead := '';
  1514. X`009`009    if debug then writeln('slead: ');
  1515. X`009`009end else begin
  1516. X`009`009    slead := substr(s,i,length(s)+1-i);
  1517. X`009`009    if debug then writeln('slead: ',substr(s,i,length(s)+1-i));
  1518. X`009`009end;
  1519. X`009end;
  1520. Xend;
  1521. X
  1522. X`091global`093
  1523. Xfunction bite(var s: string): string;
  1524. Xvar
  1525. X`009i: integer;
  1526. X
  1527. Xbegin
  1528. X`009if length(s) = 0 then
  1529. X`009`009bite := ''
  1530. X`009else begin
  1531. X`009`009i := index(s,' ');
  1532. X`009`009if i = 0 then begin
  1533. X`009`009`009bite := s;
  1534. X`009`009`009s := '';
  1535. X`009`009end else begin
  1536. +-+-+-+-+-+-+-+-  END  OF PART 31 +-+-+-+-+-+-+-+-
  1537.