home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part16 < 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 16/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.034843.9521@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 03:48:43 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1405
  12.  
  13. Archieve-name: monster_helsinki_104/part16
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 16/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 16 -+-+-+-+-+-+-+-+
  20. X`009`009otherwise error_counter := error_counter +1;
  21. X`009    end;
  22. X         end;                    `032
  23. X         var_count := var_pointer; `123 remove all inner variables `125
  24. X         write_debug('%eval_atom LEAVE');
  25. X      end; `123 eval_atom `125
  26. X  `032
  27. X   var result: string_t;
  28. X       found: boolean;
  29. X   begin `123 exec_program `125
  30. X     write_debug('%exec_program');
  31. X     eval_count := 0;
  32. X     var_count := 0;
  33. X `032
  34. X     `123 ennaltam`228`228ritelt`228v`228t muuttujat: `125
  35. X     define_variable ('monster name');
  36. X     set_variable ('monster name',monster);
  37. X     define_variable ('player name');
  38. X     set_variable ('player name',myname);
  39. X
  40. X     if variable > '' then begin
  41. X        define_variable(variable);
  42. X        set_variable(variable,value)
  43. X     end;
  44. X
  45. X     if spell_name > '' then begin
  46. X`009define_variable('spell name');
  47. X`009set_variable('spell name',spell_name);
  48. X`009define_variable('summoner name');
  49. X`009set_variable('summoner name',summoner_name);
  50. X     end;
  51. X
  52. X     result := goto_label (label_name,found);
  53. X     1:`032
  54. X     exec_program := found
  55. Xend; `123 exec program `125
  56. X
  57. X`123 file_name moved to module DATABASE `125
  58. X
  59. X`091global`093
  60. Xfunction current_run: integer;
  61. Xbegin
  62. X  if not code_running then current_run := 0
  63. X  else current_run := pool`091current_buffer`093.current_program;
  64. Xend; `123 current_run `125
  65. X
  66. X`091global`093
  67. Xfunction monster_runnable(code: integer): boolean;
  68. Xbegin
  69. X   getheader(code);
  70. X   freeheader;
  71. X   monster_runnable := header.runnable;
  72. Xend;
  73. X
  74. X
  75. X`091global`093`032
  76. Xfunction monster_owner  (code: integer; class : integer := 0): atom_t;
  77. Xbegin `032
  78. X  write_debug ('%monster_owner');
  79. X  getheader(code);
  80. X  freeheader;
  81. X  case class of
  82. X    0: monster_owner := header.owner;
  83. X    1: monster_owner := header.author;
  84. X  end; `123 case `125
  85. Xend; `123 monster_owner `125
  86. X
  87. Xfunction x_monster_owner `123 (code: integer; class : integer := 0): atom_t
  88. V `125;
  89. Xbegin
  90. X  x_monster_owner := monster_owner(code,class);
  91. Xend; `123 x_monster_owner `125
  92. X
  93. X
  94. X`091global`093`032
  95. Xprocedure set_owner (code: integer; class : integer := 0; owner: atom_t);
  96. Xbegin `032
  97. X  write_debug ('%set_owner');
  98. X  getheader(code);
  99. X  case class of
  100. X    0: header.owner := owner;
  101. X    1: header.author := owner;
  102. X  end; `123 case `125
  103. X  putheader
  104. Xend; `123 set_owner `125
  105. X
  106. X`091global`093
  107. Xprocedure set_runnable(code: integer; value: boolean);
  108. Xbegin
  109. X  getheader(code);
  110. X  header.runnable := value;
  111. X  putheader
  112. Xend;
  113. X
  114. X`091global`093
  115. Xprocedure monsterpriv(code: integer);
  116. Xvar priv: boolean;
  117. Xbegin
  118. X  getheader(code);
  119. X  priv := not header.priv;
  120. X  header.priv := priv;
  121. X  putheader;
  122. X  if priv then writeln ('Monster/Hook is now privileged.')
  123. X  else writeln ('Monster/Hook is no longer privileged.');
  124. Xend;
  125. X
  126. X`091global`093
  127. Xprocedure set_flag(code: integer; flag: integer; turn_on: boolean);
  128. Xvar bit,old: unsigned;
  129. Xbegin
  130. X  write_debug('%set_flag');
  131. X  bit := flagtable`091flag`093.value;
  132. X  getheader(code);
  133. X  old := uint(header.flags);
  134. X  if turn_on then header.flags := int(uor(old,bit))
  135. X  else  header.flags := int(uand(old,unot(bit)));
  136. X  putheader;
  137. X  if turn_on and (old <> uint(header.flags)) then
  138. X    writeln(flagtable`091flag`093.on);
  139. X  if (not turn_on) and (old <> uint(header.flags)) then
  140. X    writeln(flagtable`091flag`093.off);
  141. Xend;
  142. X
  143. X`091global`093
  144. Xfunction get_flag(code: integer; flag: integer): boolean;
  145. Xvar bit: unsigned;
  146. Xbegin
  147. X  write_debug('%get_flag');
  148. X  bit := flagtable`091flag`093.value;
  149. X  getheader(code);
  150. X  freeheader;
  151. X  get_flag := uand(bit,uint(header.flags)) > 0;
  152. X
  153. Xend;
  154. X
  155. Xfunction x_get_flag `123 (code: integer; flag: integer): boolean `125;
  156. Xbegin
  157. X    x_get_flag := get_flag(code,flag);
  158. Xend;
  159. X
  160. X
  161. X`091global`093
  162. Xprocedure view_monster(code: integer);
  163. Xvar i: integer;
  164. X    pub,dis: atom_t;
  165. X    flag_typed: boolean;
  166. X    value: string_l;
  167. X
  168. Xbegin
  169. X
  170. X    flag_typed := false;
  171. X    if not lookup_class(pub,'public') then
  172. X`009writeln('%error #1 in view monster');
  173. X    if not lookup_class(dis,'disowned') then
  174. X`009writeln('%error #2 in view monster');
  175. X
  176. X
  177. X  getheader(code);
  178. X  freeheader;
  179. X
  180. X  writeln ('Monster/Hook statistics:');
  181. X  writeln;
  182. X  if header.owner = pub  then
  183. X    writeln ('Monster/Hook is public')
  184. X  else if header.owner = dis then
  185. X    writeln ('Monster/Hook is disowned')
  186. X  else writeln ('Owner:          ',class_out(header.owner));
  187. X  writeln ('Creation time:  ',header.ctime);
  188. X  if header.author <> '' then    `032
  189. X     writeln ('Author:         ',class_out(header.author));`032
  190. X  if header.wtime <> '' then
  191. X     writeln ('Load time:      ',header.wtime); `032
  192. X
  193. X  if header.running_id > '' then
  194. X    writeln ('Running under:  ',header.running_id);
  195. X  if header.runnable then writeln ('Code is runnable')
  196. X  else writeln ('Code is blocked');
  197. X  if header.priv then`032
  198. X     writeln ('Monster/Hook is privileged');
  199. X    for i := 1 to max_flag do begin
  200. X`009if uand (uint(header.flags),flagtable`091i`093.value) > 0 then`032
  201. X`009    value := flagtable`091i`093.on
  202. X`009else value := flagtable`091i`093.off;
  203. X`009if value > '' then begin
  204. X`009    if not flag_typed then writeln('Flags: ',value)
  205. X`009    else                   writeln('       ',value);
  206. X`009    flag_typed := true;
  207. X`009end;
  208. X    end;
  209. X
  210. X  writeln;                                   `032
  211. X  writeln ('Label             Run num.    Error count   Last run');
  212. X  for i := 1 to statmax do if header.stats`091i`093.lab > '' then`032
  213. X     with header.stats`091i`093 do`032
  214. X        writeln (substr(lab+'                ',1,17),
  215. X                 runcount:4,'        ',
  216. X                 errorcount:4,'          ',
  217. X                 lastrun);
  218. X  writeln
  219. Xend;
  220. X
  221. X
  222. X`091global`093
  223. Xfunction run_monster (monster_name: atom_t;
  224. X                      code: integer;
  225. X                      label_name: atom_t;
  226. X                      variable: atom_t;
  227. X                      value: string_t;
  228. X                      time: atom_t;
  229. X`009`009      spell: atom_t := '';
  230. X`009`009      summoner: atom_t := '' ): boolean;
  231. Xlabel 1;
  232. Xvar o_file: text;
  233. X    i,count,lb,temp: integer;
  234. X    ok: boolean;
  235. X    health,errorcode: integer;
  236. X    sys: atom_t;
  237. Xbegin                           `032
  238. X    run_monster := false;   `123 default value for error situation `125
  239. X  `032
  240. X    write_debug ('%run_monster.');
  241. X    if not lookup_class(sys,'system') then`032
  242. X`009writeln('%error in run_monster');
  243. X    if not code_running then begin
  244. X`009code_running := true;
  245. X`009getheader(code);
  246. X`009freeheader;
  247. X`009health := int_get_health(monster_name); `123 -1 = not monster `125
  248. X`009if debug then writeln('%run_monster - health: ',health);`032
  249. X`009if header.runnable and (health <> 0) then begin
  250. X`009    current_buffer := alloc_buffer(code);
  251. X
  252. X`009    with pool`091current_buffer`093 do begin `032
  253. X
  254. X`009`009`123 ladataan monsterin koodi `125
  255. X`009`009if (current_program <> code) or`032
  256. X`009`009    (current_version <> header.version) then begin
  257. X`009`009    if current_program <> 0 then clear_program (current_buffer);
  258. X`009`009    current_program := 0;
  259. X
  260. X`009`009    count := 0;  `032
  261. X`009`009    repeat
  262. X`009`009`009getheader(code);
  263. X`009`009`009if header.interlocker > '' then begin
  264. X`009`009`009    freeheader;
  265. X`009`009`009    write_debug ('%locking in run_monster');
  266. X`009`009`009    count := count +1 ;
  267. X`009`009`009    wait (1); `123 wait a second `125
  268. X`009`009`009    if count > 10 then begin
  269. X`009`009`009`009if debug then begin
  270. X`009`009`009`009    writeln ('%deadlock in run_monster.');
  271. X`009`009`009`009    writeln ('%deadlock will be ignored.');
  272. X`009`009`009`009end;
  273. X`009`009`009`009getheader(code);
  274. X`009`009`009`009header.interlocker := '';
  275. X`009`009`009    end;
  276. X`009`009`009end;
  277. X`009`009    until header.interlocker = '';
  278. X`009`009    header.interlocker := userid;
  279. X`009`009    putheader;
  280. X   `032
  281. X`009`009    open(o_file,file_name(code),old,error:=continue,
  282. X`009`009`009RECORD_LENGTH := string_length + 20);
  283. X`009`009    errorcode := status(o_file);
  284. X`009`009    if errorcode > 0 then begin
  285. X`009`009`009writeln ('%code file read failure in run_monster - possible dead
  286. Vlock.');
  287. X`009`009`009writeln ('% Error code (status): ',errorcode:1);
  288. X`009`009`009writeln ('% Notify monster manager.');
  289. X`009`009`009
  290. X
  291. X`009`009`009getheader(code);
  292. X`009`009`009header.interlocker := '';
  293. X`009`009`009putheader;
  294. X
  295. X`009`009`009goto 1
  296. X`009`009    end;
  297. X`009`009    read_program (o_file,current_buffer);
  298. X `009`009    current_program := code;
  299. X             `032
  300. X`009`009    getheader(code);
  301. X`009`009    header.interlocker := '';
  302. X`009`009    putheader;             `032
  303. X`009`009    current_version := header.version;
  304. X`009`009end;
  305. X`009    end; `123 with pool `125
  306. X
  307. X        ok := false;
  308. X        i := 0;
  309. X        while not ok and (i < 10) do
  310. X          case int_login(monster_name,false) of
  311. X              0: begin
  312. X                 writeln ('%serious error in run_monster. Notify Monster Man
  313. Vager.');
  314. X                 writeln ('% bad monster name');
  315. X                 goto 1
  316. X              end;
  317. X              1: ok := true;
  318. X              2,3: begin            `123 odotetetaan edllisen valmistumista
  319. V `125
  320. X                i := i+1;
  321. X                 wait(1);
  322. X                 checkevents(true)
  323. X              end;
  324. X              otherwise begin
  325. X                 writeln ('%serious error in run_monster. Notify Monster Man
  326. Vager.');
  327. X                 writeln ('% bad return from int_login');
  328. X
  329. X                 goto 1
  330. X              end;
  331. X          end; `123 case `125
  332. X         if not ok then`032
  333. X            case int_login(monster_name,true) of  `123 k`228ynistet`228`228n
  334. V pakolla `125
  335. X               0: begin
  336. X                  writeln ('%serious error in run_monster. Notify Monster Ma
  337. Vnager.');
  338. X                  writeln ('% bad monster name');
  339. X
  340. X                  goto 1
  341. X               end;
  342. X               1: ok := true;
  343. X               3: ok := false;                `123 k`228`228k `125
  344. X               otherwise begin `032
  345. X                  writeln ('%serious error in run_monster. Notify Monster Ma
  346. Vnager.');
  347. X                  writeln ('% bad return from int_login');
  348. X
  349. X                  goto 1
  350. X               end;
  351. X            end; `123 case `125
  352. X
  353. X         if ok then begin
  354. X
  355. X            getheader(code);
  356. X            header.running_id := userid;
  357. X     `032
  358. X            lb := 0;
  359. X            for i := 1 to statmax do if header.stats`091i`093.lab = '' then
  360. V lb := i;
  361. X            for i := 1 to statmax do`032
  362. X               if header.stats`091i`093.lab = label_name then lb := i;
  363. X
  364. X            if lb = 0 then begin
  365. X                        lb := 1;
  366. X                        header.stats`091lb`093.lab := label_name;
  367. X                        header.stats`091lb`093.errorcount := 0;
  368. X                        header.stats`091lb`093.runcount := 1
  369. X            end else if header.stats`091lb`093.lab = '' then begin
  370. X                        header.stats`091lb`093.lab := label_name;
  371. X                        header.stats`091lb`093.errorcount := 0;
  372. X                        header.stats`091lb`093.runcount := 1
  373. X            end else if header.stats`091lb`093.runcount < MaxInt then
  374. X`009       header.stats`091lb`093.runcount := header.stats`091lb`093.runcoun
  375. Vt +1;
  376. X`009    system_code := header.owner = sys;
  377. X            privilegion := header.priv or system_code;
  378. X            putheader;
  379. X`009   `032
  380. X`009    spell_mode := get_flag(code,CF_SPELL_MODE);
  381. X
  382. X            error_counter := 0;
  383. X`009    used_attack   := 0;
  384. X
  385. X`009    temp := int_get_experience(monster_name);
  386. X`009    if temp = -1 then begin
  387. X`009`009monster_level := 0;
  388. X`009`009attack_limit  := maxint;
  389. X`009    end else begin`032
  390. X`009`009monster_level := level(temp);
  391. X`009`009attack_limit  := leveltable`091monster_level`093.maxpower;
  392. X`009    end;
  393. X`009    if system_code then attack_limit := MaxInt;
  394. X
  395. X`009    if debug then begin
  396. X`009`009writeln('%run_monster - monster_level ',monster_level:1);
  397. X`009`009writeln('%run_monster - attack_limit  ',attack_limit:1);
  398. X`009    end;
  399. X           `032
  400. X            run_monster := exec_program (label_name,monster_name,
  401. X`009`009variable,value,current_buffer,spell,summoner);
  402. X
  403. X            getheader(code);
  404. X            header.running_id := '';
  405. X            if header.stats`091lb`093.errorcount < MaxInt - error_counter th
  406. Ven
  407. X               header.stats`091lb`093.errorcount := header.stats`091lb`093.e
  408. Vrrorcount +
  409. X                  error_counter
  410. X            else header.stats`091lb`093.errorcount := MaxInt;
  411. X            header.stats`091lb`093.lastrun := time;
  412. X            putheader;
  413. X                                                         `032
  414. X           int_logout(monster_name)
  415. X        end else run_monster := false;
  416. X     end else run_monster := false;   `123 if not header.runnable `125
  417. X     code_running := false;
  418. X  end else run_monster := false; `123 re_entrance `125
  419. X  1:
  420. Xend; `123 run monster `125
  421. X
  422. X`091global`093                            `032
  423. Xprocedure list_program(code: integer;
  424. X                       procedure print(l: string_t); len: integer := 80);
  425. Xlabel 1;
  426. Xvar o_file: text;
  427. X    count,errorcode: integer;
  428. Xbegin`032
  429. X    write_debug('%list_program.');
  430. X    getheader(code);
  431. X    freeheader;
  432. X
  433. X    current_buffer := alloc_buffer(code);
  434. X    with pool `091current_buffer`093 do begin
  435. X`009`123 ladataan monsterin koodi `125
  436. X`009if (current_program <> code) or`032
  437. X`009    (header.version <> current_version) then begin
  438. X`009    if current_program <> 0 then clear_program (current_buffer);
  439. X`009    current_program := 0;
  440. X
  441. X`009    count := 0;  `032
  442. X`009    repeat
  443. X`009`009getheader(code);
  444. X`009`009if header.interlocker > '' then begin
  445. X`009`009    freeheader;
  446. X`009`009    write_debug ('%locking in list_program');
  447. X`009`009    count := count +1 ;
  448. X`009`009    wait (1); `123 wait a second `125
  449. X`009`009    if count > 10 then begin
  450. X`009`009`009if debug then begin
  451. X`009`009`009    writeln ('%deadlock in list_program.');
  452. X`009`009`009    writeln ('%deadlock will be ignored.');
  453. X`009`009`009end;
  454. X`009`009`009getheader(code);
  455. X`009`009`009header.interlocker := '';
  456. X`009`009    end;
  457. X`009`009end;
  458. X`009    until header.interlocker = '';
  459. X`009    header.interlocker := userid;
  460. X`009    putheader;
  461. X  `032
  462. X`009    open(o_file,file_name(code),history := READONLY,
  463. X`009`009sharing := READONLY,error:=continue,`032
  464. X`009`009record_length := string_length +20);
  465. X`009    errorcode := status(o_file);
  466. X`009    if errorcode > 0 then begin
  467. X`009`009writeln ('%code file read failure in list_program.');
  468. X`009`009writeln ('%Try later. Error code (status): ',errorcode:1);
  469. X
  470. X`009`009getheader(code);
  471. X`009`009header.interlocker := '';
  472. X`009`009putheader;
  473. X
  474. X`009`009goto 1
  475. X`009    end;
  476. X`009    read_program (o_file,current_buffer);
  477. X`009    current_program := code;
  478. X             `032
  479. X`009    getheader(code);
  480. X`009    header.interlocker := '';
  481. X`009    putheader;             `032
  482. X`009    current_version := header.version;
  483. X`009end;
  484. X
  485. X`009print_program (current_buffer,print,len);
  486. X    end; `123 with `125
  487. X    1:
  488. Xend; `123 list_program `125
  489. X
  490. Xtype medium_t = varying `091 80 `093 of char;
  491. X                     `032
  492. X`091global`093
  493. Xprocedure load (code: integer; source: string_l;
  494. X                time: atom_t;`032
  495. X                author: atom_t;
  496. X`009`009def : string_l := '.MDL');
  497. X
  498. Xlabel 1;
  499. Xvar o_file,s_file: text;
  500. X    count,i,errorcode,s_errorcode: integer;
  501. Xbegin
  502. X    write_debug('%load');
  503. X`009open(s_file,source,old,error := continue,
  504. X`009    record_length := string_length +20,
  505. X`009    default := def );
  506. X`009s_errorcode := status(s_file);
  507. X`009if s_errorcode <= 0 then begin `032
  508. X`009    count := 0;  `032
  509. X`009    repeat`032
  510. X`009`009getheader(code);
  511. X`009`009if header.interlocker > '' then begin
  512. X`009`009    freeheader;
  513. X`009`009    write_debug ('%locking in load');
  514. X`009`009    count := count +1 ;
  515. X`009`009    wait (1);
  516. X`009`009    if count > 10 then begin
  517. X`009`009`009if debug then begin
  518. X`009`009`009    writeln ('%Deadlock in load. Deadlock will be ignored.');
  519. X`009`009`009end;
  520. X`009`009`009getheader(code);
  521. X`009`009`009header.interlocker := '';
  522. X`009`009    end; `123 count > 10 `125
  523. X`009`009end;
  524. X`009    until header.interlocker = '';
  525. X`009    header.interlocker := author;
  526. X`009    header.author := author;
  527. X`009    header.wtime := time;
  528. X`009    putheader;     `032
  529. X`009    if header.priv then writeln('Monster/Hook is no longer privileged.')
  530. V;
  531. X
  532. X`009    open(o_file,file_name(code),old,SHARING := NONE,ERROR := CONTINUE,
  533. X`009`009record_length := string_length +20);
  534. X`009    errorcode := status(o_file);
  535. X`009    if errorcode > 0 then begin
  536. X`009`009writeln ('%Can''t open code file. Try later.');
  537. X`009`009writeln ('% It''s really deadlocked.');
  538. X`009`009writeln ('% Error code (status): ',errorcode:1);
  539. X
  540. X`009`009getheader(code);
  541. X`009`009header.interlocker := '';
  542. X`009`009putheader;
  543. X      `032
  544. X`009`009close(s_file);
  545. X`009`009goto 1
  546. X`009    end; `032
  547. X
  548. X`009    current_buffer := alloc_buffer(code);
  549. X`009    parse (s_file,o_file);
  550. X                                                      `032
  551. X`009    getheader(code);
  552. X`009    header.version := (header.version +1) mod 100000;
  553. X`009    header.interlocker := '';
  554. X`009    header.runnable := TRUE;
  555. X`009    header.priv := FALSE;
  556. X`009    for i := 1 to statmax do header.stats`091i`093.lab := '';
  557. X`009    for i := 1 to statmax do header.stats`091i`093.runcount := 0;
  558. X`009    for i := 1 to statmax do header.stats`091i`093.errorcount := 0;
  559. X`009    for i := 1 to statmax do header.stats`091i`093.lastrun := '';
  560. X`009    putheader;
  561. X
  562. X`0091:
  563. X`009end else case s_errorcode of
  564. X`009    3: `123 PAS$K_FILNOTFOU `125 writeln('Error: File not found.');
  565. X`009    4: `123 PAS$K_INVFILSYN `125 writeln('Error: Illegal file name.');
  566. X`009    otherwise writeln('Error: (status) ',s_errorcode:1);
  567. X`009end; `123 case `125
  568. Xend; `123 load `125
  569. X
  570. X`091global`093                                `032
  571. Xprocedure delete_program (code: integer);
  572. Xlabel 1; `032
  573. Xvar fl: text;
  574. X    count,apu,errorcode: integer;
  575. Xbegin
  576. X  write_debug ('%delete_program');
  577. X  apu := code;
  578. X  count := 0;
  579. X  repeat
  580. X    open (fl,file_name(code),old,sharing:=NONE,error := continue,
  581. X          record_length := string_length +20);
  582. X    errorcode := status(fl);
  583. X    if errorcode > 0 then begin
  584. X       count := count +1;
  585. X       write_debug ('%collision in delete_program');
  586. X       if count > 10 then  begin
  587. X          if debug then begin
  588. X`009     writeln ('%Deadlock in delete_program.');
  589. X`009     writeln ('% Error code (status): ',errorcode:1);
  590. X`009  end;
  591. X          goto 1
  592. X       end;
  593. X       wait (0.2);      `123 collision is very rare in here `125
  594. X    end
  595. X  until errorcode <= 0;
  596. X  reset (fl);
  597. X  truncate(fl);
  598. X  close(fl);
  599. X1:
  600. Xend; `123 delete_program `125
  601. X
  602. X`091global`093    `032
  603. Xprocedure init_interpreter;
  604. Xvar i: integer;
  605. Xbegin    `032
  606. X    write_debug ('%init_interpreter');
  607. X    `123 alustetaan ohjelma puskuri `125
  608. X    for i := 1 to max_buffer do with pool`091i`093 do begin
  609. X`009used := 0;
  610. X`009current_program := 0;
  611. X`009current_version := 0;
  612. X`009time := 0;
  613. X    end;
  614. X
  615. Xend; `123 init_interpreter `125
  616. X
  617. X`091global`093        `032
  618. Xprocedure finish_interpreter;`009`123 not need yet `125
  619. Xbegin
  620. X  write_debug('%finish_interpreter');
  621. X
  622. Xend; `123 finish_interpreter `125
  623. X
  624. X`091global`093               `032
  625. Xprocedure create_program (hdr: integer; owner: atom_t; time: atom_t);
  626. Xvar i: integer;
  627. Xbegin
  628. X  write_debug('%create_program');
  629. X  delete_program(hdr); `123 truncate code file `125
  630. X  getheader(hdr);
  631. X  header.interlocker := '';
  632. X  header.runnable := FALSE;
  633. X  header.owner := owner;
  634. X  header.ctime := time;
  635. X  header.priv  := false;
  636. X  for i := 1 to statmax do header.stats`091i`093.lab := '';
  637. X  for i := 1 to statmax do header.stats`091i`093.runcount := 0;
  638. X  for i := 1 to statmax do header.stats`091i`093.errorcount := 0;
  639. X  for i := 1 to statmax do header.stats`091i`093.lastrun := '';
  640. X  header.author := '';
  641. X  header.wtime  := '';
  642. X  header.running_id := '';
  643. X  header.version    := 0;
  644. X  header.state      := '';
  645. X  header.flags`009    := 0;
  646. X  putheader;
  647. Xend; `123 create_program `125
  648. X           `032
  649. X`123 addheaders moved to module DATABASE `125
  650. X
  651. Xend. `123 end of module interpreter `125
  652. X                                     `032
  653. $ CALL UNPACK INTERPRETER.PAS;256 1888820432
  654. $ create/nolog 'f'
  655. X`091inherit ('global') `093
  656. Xmodule keys(input,output);
  657. X
  658. X`123
  659. X    This file contains the keys used in encrypting the player
  660. X    passwords. The file should be kept well protected.
  661. X`125
  662. X
  663. Xconst maxkeys = 10;
  664. Xtype`032
  665. X     keyarray = array`0911..maxkeys`093 of shortstring;
  666. X
  667. Xvar     mylog : `091external`093 integer;
  668. X
  669. X`009keys: keyarray := (
  670. X
  671. X'Kaupungin keskustaan',
  672. X'meneva juna saapuu e',
  673. X'dell`228`228n aalto kostea',
  674. X'ilmaa ja ontto humin',
  675. X'a. Se on tuskin puol',
  676. X'illaan, koska kello ',
  677. X'on yli kuusi illalla',
  678. X'ka liikenne on vilkk',`032
  679. X'aampi l`228hi`246iden suun',
  680. X'taan. Moni vaunussa '
  681. X
  682. X);
  683. X
  684. X`091global`093
  685. Xprocedure encrypt (var s: shortstring; code: integer := -1);
  686. Xvar i, l : integer;
  687. Xbegin
  688. X`009if code = -1 then code := mylog;
  689. X
  690. X`009l := (code mod maxkeys) + 1;
  691. X`009for i := 1 to s.length do
  692. X`009`009s`091i`093 := chr ((ord (s`091i`093) + ord (keys`091l`093`091i`093))
  693. V mod 256);
  694. Xend;
  695. X
  696. Xend. `123 end of module keys `125
  697. $ CALL UNPACK KEYS.PAS;2 4242112905
  698. $ create/nolog 'f'
  699. X`091inherit ('Global','Guts','Database','Cli','Privusers','Parser',
  700. X          'Custom','Queue','Interpreter')`093
  701. Xprogram monster(input,output);
  702. X
  703. X`123+
  704. XCOMPONENT: Main program
  705. X`032
  706. XPROGRAM DESCRIPTION:
  707. X`032
  708. X`009This is Monster, a multiuser adventure game system
  709. X`009where the players create the universe.
  710. X`032
  711. XAUTHORS:
  712. X`032
  713. X    Rich Skrenta`032
  714. X    Juha Laiho
  715. X    Antti Leino
  716. X    Kari Hurtta
  717. X
  718. X`032
  719. XCREATION DATE: (unknown) ?.??.1988
  720. X`032
  721. XDESIGN ISSUES:
  722. X`032
  723. X   `032
  724. X`032
  725. XVERSION:
  726. X`032
  727. X    Monster Helsinki 1.04
  728. X   `032
  729. X`032
  730. XMODIFICATION HISTORY:
  731. X`032
  732. X     Date     `124   Name  `124 Description
  733. X--------------+---------+---------------------------------------------------
  734. V----
  735. X    ??.3.1989 `124  Hurtta `124  Starting of Helsinki version of Monster
  736. X    12.2.1991 `124         `124  This comment header                   `032
  737. X    12.2.1991 `124         `124  Some help text replace with call command_he
  738. Vlp
  739. X    25.5.1992 `124`009`009`124  fix_owner: owner check for /FIX -subsystem
  740. X    13.6.1992 `124  Hurtta `124  Distributed as version 1.04
  741. X-`125
  742. X
  743. X
  744. X`123
  745. X`009This is Monster, a multiuser adventure game system
  746. X`009where the players create the universe.
  747. X
  748. X`009Written by Rich Skrenta at Northwestern University, 1988.
  749. X
  750. X`009`009skrenta@nuacc.acns.nwu.edu
  751. X`009`009skrenta@nuacc.bitnet
  752. X
  753. X`125
  754. X`123
  755. X
  756. X`009This version modified by
  757. X`009`009jlaiho@finuha.bitnet  (jlaiho@cc.Helsinki.FI)
  758. X`009`009leino@finuha.bitnet   (leino@cc.Helsinki.FI)
  759. X`009`009hurtta@finuha.bitnet  (hurtta@cc.Helsinki.FI)
  760. X`009Thanks for ready-to-run modifications to
  761. X`009`009dahlp@finabo.bitnet
  762. X`009`009leino@finuha.bitnet   (leino@cc.Helsinki.FI)
  763. X`009`009hurtta@finuha.bitnet  (hurtta@cc.Helsinki.FI)
  764. X`009Thanks for useful ideas to those who play Monster at finuh.
  765. X
  766. X`125
  767. X
  768. X`123 all functions in FINUHTIME.PAS moved to PRIVUSERS.PAS `125
  769. X
  770. X`123 all consts is moved to global.pas `125
  771. X
  772. X`123 all types is moved to global.pas `125
  773. X
  774. Xvar
  775. X
  776. X        `123 variables in privusers module are available with PRIVUSERS.PEN
  777. V `125
  778. X
  779. X`009oldcmd:`009string := '';`009`009`123 string for '.' command to do last c
  780. Vommand `125
  781. X
  782. X`009in_main_prompt : boolean := false;
  783. X`009`009    `123 if in main promp player can throw out monster immediatly `1
  784. V25
  785. X
  786. X
  787. X`009`123 GUTS.PAS exports old_promp,line and grab_next `125
  788. X
  789. X        `123 system_id, disowned_id and public_id moved to module CUSTOM `12
  790. V5
  791. X
  792. X
  793. X`009`123 inmem moved to DATABASE.PAS `125
  794. X
  795. X  `123`009starting : boolean := FALSE;`009`125  `123 Not yet entered the uni
  796. Vverse --
  797. X `009`009`009`009`009  hopefully a temporary hack
  798. X                                          by leino@finuh `125
  799. X
  800. X`009brief: boolean := FALSE;`009`123 brief/verbose descriptions `125
  801. X
  802. X`009rndcycle: integer;`009`009`123 integer for rnd_event `125
  803. X
  804. X`009`123 debug moved to GLOBAL.PAS `125
  805. X
  806. X`009ping_answered: boolean;`009`009  `123 flag for ping answers `125
  807. X`009`123 hiding moved to module CUSTOM `125
  808. X`009midnight_notyet: boolean := TRUE; `123 hasn't been midnight yet `125
  809. X`009first_puttoken: boolean := TRUE;  `123 flag for first place into world `
  810. V125
  811. X`009`123 logged_act moved to module CUSTOM `125
  812. X   `032
  813. X
  814. X`009cmds: array`0911..maxcmds`093 of shortstring := (
  815. X
  816. X`009`009'name',`009`009`123 setnam = 1`009`125
  817. X`009`009'help',`009`009`123 help = 2`009`125
  818. X`009`009'?',`009`009`123 quest = 3`009`125
  819. X`009`009'quit',`009`009`123 quit = 4`009`125
  820. X`009`009'look',`009`009`123 look = 5`009`125
  821. X`009`009'go',`009`009`123 go = 6`009`125
  822. X`009`009'form',`009`009`123 form = 7`009`125
  823. X`009`009'link',`009`009`123 link = 8`009`125
  824. X`009`009'unlink',`009`123 unlink = 9`009`125
  825. X`009`009'whisper',`009`123 c_whisper = 10`125
  826. X`009`009'poof',`009`009`123 poof = 11`009`125
  827. X`009`009'describe',`009`123 desc = 12`009`125
  828. X`009`009'dcl',          `123 c_dcl = 13   `125
  829. X`009`009'debug',`009`123 dbg = 14`009`125
  830. X`009`009'say',`009`009`123 say = 15`009`125
  831. X`009`009'scan',`009`009`123 c_scan = 16`009`125
  832. X`009`009'rooms',`009`123 c_rooms = 17`009`125
  833. X`009`009'system',`009`123 c_system = 18`009`125
  834. X`009`009'disown',`009`123 c_disown = 19`009`125
  835. X`009`009'claim',`009`123 c_claim = 20`009`125
  836. X`009`009'make',`009`009`123 c_create = 21`009`125
  837. X`009`009'public',`009`123 c_public = 22`009`125
  838. X`009`009'accept',`009`123 c_accept = 23`009`125
  839. X`009`009'refuse',`009`123 c_refuse = 24`009`125
  840. X`009`009'zap',`009`009`123 c_zap = 25`009`125
  841. X`009`009'hide',`009`009`123 c_hide = 26`009`125
  842. X`009`009'l',`009`009`123 c_l = 27`009`125
  843. X`009`009'north',`009`123 c_north = 28`009`125
  844. X`009`009'south',`009`123 c_south = 29`009`125
  845. X`009`009'east',`009`009`123 c_east = 30`009`125
  846. X`009`009'west',`009`009`123 c_west = 31`009`125
  847. X`009`009'up',`009`009`123 c_up = 32`009`125
  848. X`009`009'down',`009`009`123 c_down = 33`009`125
  849. X`009`009'n',`009`009`123 c_n = 34`009`125
  850. X`009`009's',`009`009`123 c_s = 35`009`125
  851. X`009`009'e',`009`009`123 c_e = 36`009`125
  852. X`009`009'w',`009`009`123 c_w = 37`009`125
  853. X`009`009'u',`009`009`123 c_u = 38`009`125
  854. X`009`009'd',`009`009`123 c_d = 39`009`125
  855. X`009`009'customize',`009`123 c_custom = 40`009`125
  856. X`009`009'who',`009`009`123 c_who = 41`009`125
  857. X`009`009'players',`009`123 c_players = 42`125
  858. X`009`009'search',`009`123 c_search = 43`009`125
  859. X`009`009'reveal',`009`123 c_unhide = 44`009`125
  860. X`009`009'punch',`009`123 c_punch = 45`009`125
  861. X`009`009'ping',`009`009`123 c_ping = 46`009`125
  862. X`009`009'health',`009`123 c_health = 47`009`125
  863. X`009`009'get',`009`009`123 c_get = 48`009`125
  864. X`009`009'drop',`009`009`123 c_drop = 49`009`125
  865. X`009`009'inventory',`009`123 c_inv = 50`009`125
  866. X`009`009'i',`009`009`123 c_i = 51`009`125
  867. X`009`009'self',`009`009`123 c_self = 52`009`125
  868. X`009`009'whois',`009`123 c_whois = 53`009`125
  869. X`009`009'duplicate',`009`123 c_duplicate = 54 `125
  870. X`009`009'score',`009`123 c_score = 55`009`125
  871. X`009`009'version',`009`123 c_version = 56`125
  872. X`009`009'objects',`009`123 c_objects = 57`125
  873. X`009`009'use',`009`009`123 c_use = 58`009`125
  874. X`009`009'wield',`009`123 c_wield = 59`009`125
  875. X`009`009'brief',`009`123 c_brief = 60`009`125
  876. X`009`009'wear',`009`009`123 c_wear = 61`009`125
  877. X`009`009'relink',`009`123 c_relink = 62`009`125
  878. X`009`009'unmake',`009`123 c_unmake = 63`009`125
  879. X`009`009'destroy',`009`123 c_destroy = 64`125
  880. X`009`009'show',`009`009`123 c_show = 65`009`125
  881. X`009`009'set',`009`009`123 c_set = 66`009`125
  882. X`009`009'bear',`009`009`123 c_monster = 67    `125
  883. X`009`009'erase',        `123 c_erase = 68`009    `125
  884. X`009`009'atmosphere',`009`123 c_atmospehere = 69 `125
  885. X`009`009'reset',`009`123 c_reset = 70 `125
  886. X`009`009'summon',       `123 c_summon = 71 `125
  887. X`009`009'spells',`009`123 c_spells = 72 `125
  888. X`009`009'monsters',`009`123 c_monsters = 73 `125
  889. X`009`009'list',`009`009`123 A_list = 74 `125
  890. X`009`009'create',`009`123 A_create = 75 `125
  891. X`009`009'delete',`009`123 A_delete = 76 `125
  892. X`009`009'',`009`009`123 77 `125
  893. X`009`009'',`009`009`123 78 `125
  894. X`009`009'',`009`009`123 79 `125
  895. X`009`009'',`009`009`123 80 `125
  896. X`009`009'',`009`009`123 81 `125
  897. X`009`009'',`009`009`123 82 `125
  898. X`009`009'',`009`009`123 83 `125
  899. X`009`009'',`009`009`123 84 `125
  900. X`009`009'',`009`009`123 85 `125
  901. X`009`009'',`009`009`123 86 `125
  902. X`009`009'',`009`009`123 87 `125
  903. X`009`009'',`009`009`123 88 `125
  904. X`009`009'',`009`009`123 89 `125
  905. X`009`009'',`009`009`123 90 `125
  906. X`009`009'',`009`009`123 91 `125
  907. X`009`009'',`009`009`123 92 `125
  908. X`009`009'',`009`009`123 93 `125
  909. X`009`009'',`009`009`123 94 `125
  910. X`009`009'',`009`009`123 95 `125
  911. X`009`009'',`009`009`123 96 `125
  912. X`009`009'',`009`009`123 97 `125
  913. X`009`009'',`009`009`123 98 `125
  914. X`009`009''`009`009`123 99 `125
  915. X
  916. X`009);
  917. X
  918. X`009`123 show moved to parser.pas `125
  919. X
  920. X`009numcmds: integer;`009`123 number of got main level commands there are `1
  921. V25
  922. X
  923. X`009`123 numshow moved to parser.pas `125
  924. X
  925. X`009`123 setkey moved to parser.pas `125
  926. X
  927. X`009`123 numset moved to parser.pas `125
  928. X
  929. X`009`123 direct moved to parser.pas `125
  930. X
  931. X`009spells: array`0911..maxspells`093 of string;`009  `123 names of spells `
  932. V125
  933. X`009numspells: integer;`009`009`123 number of spells there actually are `125
  934. X
  935. X`009done: `091global`093 boolean;`009`009`123 flag for QUIT `125
  936. X`009`123 userid moved to module CUSTOM `125
  937. X`009real_userid: veryshortstring;`009`123 real VMS userid `125
  938. X
  939. X`009`123 location moved to DATABASE.PAS `125
  940. X
  941. X`009hold_kind: array`0911..maxhold`093 of integer; `123 kinds of the objects
  942. V i'm
  943. X`009`009`009`009`009`009   holding `125
  944. X
  945. X`009`123 myslot moved to module CUSTOM `125
  946. X`009myevent: integer;`009`123 which point in event buffer we are at `125
  947. X`009`123 myname moved to module CUSTOM `125
  948. X
  949. X`009found_exit: array`0911..maxexit`093 of boolean;
  950. X`009`009`009`009`123 has exit i been found by the player? `125
  951. X
  952. X`009`123 mylog moved to DATABASE.PAS `125
  953. X
  954. X`009mywear: integer;`009`123 what I'm wearing `125
  955. X`009`123 mydisguise moved to module CUSTOM `125
  956. X`009mywield: integer;`009`123 weapon I'm wielding `125
  957. X`009myhealth: integer;`009`123 how well I'm feeling `125
  958. X`009myself: integer;`009`123 self description block `125
  959. X`009`123 myexperience moved to module CUSTOM `125
  960. X`009healthcycle: integer;`009`123 used in rnd_event to control how quickly a
  961. X`009`009`009`009  player heals `125
  962. X
  963. X`009`123 privs moved to module PARSER `125
  964. X`009`123 module GLOBAL exports leveltable `125
  965. X
  966. X`123 procedures in module CLI is available now with CLI.PEN `125
  967. X
  968. X`123 in module KEYS `125
  969. X
  970. X`091external`093
  971. Xprocedure encrypt(key: shortstring; n : integer := 0);
  972. Xexternal;
  973. X
  974. X`123 Routines in module QUEUE are declared in environment file QUEUE.PEN `12
  975. V5
  976. X`009`009
  977. X`123 Routines in module GUTS are declared in environment file GUTS.PEN `125
  978. X
  979. X`123 Routines in module INTERPRETER are declared in environment file`032
  980. X  INTERPRETER.PEN `125
  981. X
  982. X
  983. X`123 ----- `125
  984. Xprocedure xpoof(loc: integer); forward;
  985. X
  986. Xprocedure newlevel(oldlev,newlev: integer); forward;
  987. X
  988. Xprocedure prevlevel(oldlev,newlev: integer); forward;
  989. X
  990. Xprocedure do_exit(exit_slot: integer); forward;
  991. X
  992. X`123 function put_token declared as external in module CUSTOM `125
  993. X
  994. Xprocedure take_token(aslot, roomno: integer); forward;
  995. X
  996. Xprocedure maybe_drop; forward;                  `032
  997. X
  998. X`123 procedure do_program moved to module CUSTOM `125
  999. X
  1000. Xfunction drop_everything(pslot: integer := 0): boolean;
  1001. Xforward;
  1002. X
  1003. X`123 procedures do_y_altmsg, do_group1, do_group2 moved to module CUSTOM `12
  1004. V5
  1005. X       `032
  1006. Xprocedure meta_run (label_name,variable: shortstring;
  1007. X                    value: mega_string); forward;
  1008. X
  1009. Xprocedure meta_run_2 (label_name,variable: shortstring;
  1010. X                    value: mega_string); forward;
  1011. X
  1012. X`123 procedure custom_hook moved to module CUSTOM `125
  1013. X
  1014. Xprocedure x_unwield; forward;
  1015. Xprocedure x_unwear; forward;
  1016. X
  1017. Xprocedure leave_universe; forward;
  1018. X
  1019. X`123 function trim_filename moved to module CUSTOM `125
  1020. X
  1021. Xfunction play_allow: boolean; `123 check when database is open `125
  1022. Xbegin
  1023. X    play_allow := manager_priv or (userid = MM_userid)
  1024. X`009`009    or not work_time;
  1025. Xend;
  1026. X
  1027. X`123 function sysdate moved to module CUSTOM `125
  1028. X         `032
  1029. X`123 procedure gethere moved to module CUSTOM `125
  1030. X
  1031. X`123 alloc_X and delete_X routines moved to module CUSTOM `125
  1032. X
  1033. X`123 lowcase moved to parser.pas `125
  1034. X
  1035. X`123 lookup_spell reimplemented in module PARSER `125
  1036. X
  1037. X`123 alloc_general and delete_general moved to DATABASE.PAS `125
  1038. X
  1039. X`123 returns true if object N is in this room. if nohidden is true, not foun
  1040. Vd
  1041. X  hidden objects (hurtta@finuh) `125
  1042. X
  1043. Xfunction obj_here(n: integer; nohidden: boolean := false): boolean;
  1044. Xvar
  1045. X`009i: integer;
  1046. X`009found: boolean;
  1047. X
  1048. Xbegin
  1049. X    i := 1;
  1050. X    found := false;
  1051. X    while (i <= maxobjs) and (not found) do begin
  1052. X`009if here.objs`091i`093 = n then begin
  1053. X`009    if not nohidden then found := true
  1054. X`009    else if here.objhide`091i`093 = 0 then found := true
  1055. X`009    else i := i + 1;
  1056. X`009end else i := i + 1;
  1057. X    end;
  1058. X    obj_here := found;
  1059. Xend;
  1060. X
  1061. X`091global`093    `123 for PARSER module `125
  1062. Xfunction player_here(id: integer; var slot: integer): boolean;
  1063. X    `123 suppose that gethere and getpers have made `125
  1064. Xvar i: integer;
  1065. X    name: shortstring;
  1066. Xbegin
  1067. X    slot := 0;
  1068. X    name := lowcase(pers.idents`091id`093);
  1069. X    for i := 1 to maxpeople do
  1070. X`009if here.people`091i`093.kind > 0 then
  1071. X`009`009if lowcase(here.people`091i`093.name) = name then slot := i;
  1072. X    player_here := slot > 0;
  1073. Xend; `123 player_here `125
  1074. X
  1075. X
  1076. X`123 returns true if object N is being held by the player (id slot)`125
  1077. X
  1078. Xfunction obj_hold(n: integer; slot: integer := 0): boolean;
  1079. Xvar
  1080. X`009i: integer;
  1081. X`009found: boolean;
  1082. X
  1083. Xbegin
  1084. X`009if slot = 0 then slot := myslot;
  1085. X`009
  1086. X`009if n = 0 then
  1087. X`009`009obj_hold := false
  1088. X`009else begin
  1089. X`009`009i := 1;
  1090. X`009`009found := false;
  1091. X`009`009while (i <= maxhold) and (not found) do begin
  1092. X`009`009`009if here.people`091slot`093.holding`091i`093 = n then
  1093. X`009`009`009`009found := true
  1094. X`009`009`009else
  1095. X`009`009`009`009i := i + 1;
  1096. X`009`009end;
  1097. X`009`009obj_hold := found;
  1098. X`009end;
  1099. Xend;
  1100. X
  1101. X
  1102. X
  1103. X`123 return the slot of an object that is HERE `125
  1104. Xfunction find_obj(objnum: integer): integer;
  1105. Xvar
  1106. X`009i: integer;
  1107. X
  1108. Xbegin
  1109. X`009i := 1;
  1110. X`009find_obj := 0;
  1111. X`009while i <= maxobjs do begin
  1112. X`009`009if here.objs`091i`093 = objnum then
  1113. X`009`009`009find_obj := i;
  1114. X`009`009i := i + 1;
  1115. X`009end;
  1116. Xend;
  1117. X
  1118. X
  1119. X
  1120. X
  1121. X`123 similar to lookup_obj, but only returns true if the object is in
  1122. X  this room or is being held by the player `125
  1123. X`123 and s may be in the middle of the objact name -- Leino@finuh `125
  1124. X
  1125. Xfunction parse_obj (var pnum: integer;
  1126. X`009`009`009s: string;
  1127. X`009`009`009override: boolean := false): boolean;
  1128. Xvar
  1129. X`009i,poss,maybe,num: integer;
  1130. X`009tmp: string;
  1131. X`009found: boolean;
  1132. X
  1133. Xbegin
  1134. X`009getobjnam;
  1135. X`009freeobjnam;
  1136. X`009getindex(I_OBJECT);
  1137. X`009freeindex;
  1138. X
  1139. X`009s := lowcase(s);
  1140. X`009i := 1;
  1141. X`009maybe := 0;
  1142. X`009num := 0;
  1143. X`009found := false;
  1144. X`009for i := 1 to indx.top do begin
  1145. X`009`009if not(indx.free`091i`093) then begin
  1146. X`009`009`009if s = objnam.idents`091i`093 then
  1147. X`009`009`009`009num := i
  1148. X`009`009`009else if ((index(objnam.idents`091i`093,s) = 1) or
  1149. X`009`009`009`009(index(objnam.idents`091i`093,' '+s) > 0)) and
  1150. X`009`009`009`009(obj_here(i) or obj_hold(i)) then begin
  1151. X`009`009`009`009maybe := maybe + 1;
  1152. X`009`009`009`009poss := i;
  1153. X`009`009`009end;
  1154. X`009`009end;
  1155. X`009end;
  1156. X`009if num <> 0 then begin
  1157. X`009`009found := obj_here(num) or obj_hold(num);
  1158. X`009`009if found then
  1159. X`009`009`009pnum := num;
  1160. X`009`009parse_obj := found;
  1161. X`009end else if maybe = 1 then begin
  1162. X`009`009found := obj_here(poss) or obj_hold(poss);
  1163. X`009`009if found then
  1164. X`009`009`009pnum := poss;
  1165. X`009`009parse_obj := found;
  1166. X`009end else if maybe > 1 then begin
  1167. X`009`009if lookup_obj (poss, s) then begin
  1168. X`009`009`009found := obj_here(poss) or obj_hold(poss);
  1169. X`009`009`009if found then
  1170. X`009`009`009`009pnum := poss;
  1171. X`009`009`009parse_obj := found;
  1172. X`009`009end else parse_obj := false;
  1173. X`009end else begin
  1174. X`009`009parse_obj := false;
  1175. X`009end;
  1176. Xend;
  1177. X
  1178. X`123 functions parse_pers, is_owner, room_owner, can_alter and can_make move
  1179. Vd to`032
  1180. X  module CUSTOM `125
  1181. X
  1182. X`123 procedures nice_print, print_short print_line, print_desc and make_line
  1183. X   moved to module CUSTOM `125
  1184. X
  1185. X`123
  1186. XReturn n as the direction number if s is a valid alias for an exit
  1187. X`125
  1188. Xfunction lookup_alias(var n: integer; s: string): boolean;
  1189. Xvar
  1190. X`009i,poss,maybe,num: integer;
  1191. X
  1192. Xbegin
  1193. X`009gethere;
  1194. X`009s := lowcase(s);
  1195. X`009i := 1;
  1196. X`009maybe := 0;
  1197. X`009num := 0;
  1198. X`009for i := 1 to maxexit do begin
  1199. X`009`009if s = here.exits`091i`093.alias then
  1200. X`009`009`009num := i
  1201. X`123`009`009else if index(here.exits`091i`093.alias,s) = 1 then begin
  1202. X`009`009`009maybe := maybe + 1;
  1203. X`009`009`009poss := i;
  1204. X`009`009end;`009`009`009`009`125
  1205. X`009end;
  1206. X`009if num <> 0 then begin
  1207. X`009`009n := num;
  1208. X`009`009lookup_alias := true;
  1209. X`123`009end else if maybe = 1 then begin
  1210. X`009`009n := poss;
  1211. X`009`009lookup_alias := true;
  1212. X`009end else if maybe > 1 then begin
  1213. X`009`009lookup_alias := false;`009`009`125
  1214. X`009end else begin
  1215. X`009`009lookup_alias := false;
  1216. X`009end;
  1217. Xend;
  1218. X
  1219. X`123 procedure exit_default moved to module CUSTOM `125
  1220. X
  1221. X`123
  1222. XPrints out the exits here for DO_LOOK()
  1223. X`125
  1224. Xprocedure show_exits;
  1225. Xvar
  1226. X`009i: integer;
  1227. X`009one: boolean;
  1228. X`009cansee: boolean;
  1229. X
  1230. Xbegin
  1231. X`009one := false;
  1232. X`009for i := 1 to maxexit do begin
  1233. X`009`009if (here.exits`091i`093.toloc <> 0) or `123 there is an exit `125
  1234. X`009`009   (here.exits`091i`093.kind = 5) then begin `123 there could be an
  1235. V exit `125
  1236. X`009`009`009if (here.exits`091i`093.hidden = 0) or
  1237. X`009`009`009   (found_exit`091i`093)`032
  1238. X                        then cansee := true
  1239. X`009`009`009else cansee := false;
  1240. X
  1241. X`009`009`009if here.exits`091i`093.kind = 6 then begin
  1242. X`009`009`009`009`123 door kind only visible with object `125
  1243. X`009`009`009`009if obj_hold( here.exits`091i`093.objreq ) then
  1244. X`009`009`009`009`009cansee := true
  1245. X`009`009`009`009else cansee := false;
  1246. X`009`009`009end;
  1247. X
  1248. X`009`009`009if cansee then begin
  1249. X`009`009`009`009if here.exits`091i`093.exitdesc = DEFAULT_LINE then begin
  1250. X`009`009`009`009`009exit_default(i,here.exits`091i`093.kind);
  1251. X`009`009`009`009`009`123 give it direction and type `125
  1252. X`009`009`009`009`009one := true;
  1253. X`009`009`009`009end else if here.exits`091i`093.exitdesc > 0 then begin
  1254. X`009`009`009`009`009print_line(here.exits`091i`093.exitdesc);
  1255. X`009`009`009`009`009one := true;
  1256. X`009`009`009`009end;
  1257. X`009`009`009end;
  1258. X`009`009end;
  1259. X`009end;
  1260. X`009if one then writeln;
  1261. Xend;
  1262. X
  1263. Xprocedure setevent;
  1264. Xbegin
  1265. X`009getevent;
  1266. X`009freeevent;
  1267. X`009myevent := event.point;
  1268. Xend;
  1269. X
  1270. X`123 functions isnum and number moved to module CUSTOM `125
  1271. X
  1272. X`123 log_event moved to DATABASE.PAS `125
  1273. X
  1274. X`123 function log_name moved to module CUSTOM `125
  1275. X
  1276. Xfunction desc_action(theaction,thetarget: integer): string;
  1277. Xvar s: string;
  1278. Xbegin
  1279. X`009case theaction of`009`123 use command mnemonics `125
  1280. X`009`009look:      s:= ' looking around the room.';
  1281. X`009`009form:      s:= ' creating a new room.';
  1282. X`009`009desc:      s:= ' editing the description to this room.';
  1283. X`009`009e_detail:  s := ' adding details to the room.';
  1284. X`009`009c_custom:  s := ' customizing an exit here.';
  1285. X`009`009e_custroom:s := ' customizing this room.';
  1286. X`009`009e_program: s := ' customizing an object.';
  1287. X`009`009c_self:`009   s := ' editing a self-description.';
  1288. X`009`009e_usecrystal: s := ' hunched over a crystal orb, immersed in its glo
  1289. Vw.';
  1290. X`009`009link:`009   s := ' creating an exit here.';
  1291. X`009`009c_system:  s := ' in system maintenance mode.';
  1292. X                c_dcl:     s := ' executing dcl.';
  1293. X`009`009e_custommonster: s := ' customizing a monster.';
  1294. X`009`009e_customspell: s := ' customizing a spell.';
  1295. X
  1296. X`009`009otherwise s := ' here.'
  1297. X`009end;
  1298. X`009desc_action := s;
  1299. Xend;
  1300. X
  1301. X`091global`093
  1302. Xfunction protected(n: integer := 0): boolean;
  1303. Xvar tmp: objectrec;`009`009`009`123 is this necessary ? `125
  1304. Xbegin
  1305. X`009protected := false;
  1306. X`009if n = 0 then n := myslot;
  1307. X`009tmp := obj;
  1308. X`009if here.people`091n`093.wielding > 0 then begin
  1309. X`009`009getobj(here.people`091n`093.wielding);
  1310. X`009`009freeobj;
  1311. X`009`009if obj.kind = O_MAGIC_RING then protected := true;
  1312. X`009end;
  1313. X`009if here.people`091n`093.act in `091e_detail,c_custom,
  1314. X`009`009`009`009  e_custroom,e_program,
  1315. X`009`009`009`009  c_self,c_system,c_dcl,
  1316. X`009`009`009`009  e_custommonster,
  1317. X`009`009`009`009  e_customspell`093 then
  1318. X`009`009protected := true;
  1319. X
  1320. X`009obj := tmp;
  1321. Xend;
  1322. X
  1323. X`123 ------- Stolen from MONSTER Version 3.0 -------------------------------
  1324. V--- `125
  1325. X
  1326. Xprocedure do_s_announce (s:string);
  1327. Xvar
  1328. X   lcv : integer;
  1329. Xbegin
  1330. X    if (s<>'') and (s <> '?') then
  1331. X`009for lcv :=1 to numevnts do
  1332. X          log_event(0,E_ANNOUNCE,0,0,s,lcv)
  1333. X    else writeln('Usage: w <message>');
  1334. Xend; `123do_announce`125
  1335. X
  1336. Xprocedure do_s_shutdown (s:string);
  1337. Xvar
  1338. X   lcv : integer;
  1339. Xbegin
  1340. X      if (s<>'') and (s <> '?') then
  1341. X`009for lcv :=1 to numevnts do
  1342. X          log_event(0,E_SHUTDOWN,0,0,s,lcv)
  1343. X      else writeln('Usage: d <message>')
  1344. Xend; `123do_shutdown`125
  1345. X
  1346. X
  1347. X`123 -----------------------------------------------------------------------
  1348. V---- `125
  1349. X
  1350. X
  1351. X`123
  1352. Xuser procedure to designate an exit for acceptance of links
  1353. X`125
  1354. Xprocedure do_accept(s: string);
  1355. Xlabel exit_label;
  1356. Xvar
  1357. X`009dir,owner: integer;
  1358. X
  1359. X    procedure leave;
  1360. X    begin
  1361. X`009writeln('EXIT - no changes.');
  1362. X`009goto exit_label;
  1363. X    end;
  1364. X
  1365. Xbegin
  1366. X`009if s = '' then grab_line('Direction? ',s,eof_handler := leave);
  1367. X
  1368. X`009if lookup_dir(dir,s,true) then begin
  1369. X`009`009if can_make(dir) then begin
  1370. X`009`009`009getroom;
  1371. X`009`009`009here.exits`091dir`093.kind := 5;
  1372. X`009`009`009putroom;
  1373. X
  1374. X`009`009`009if exact_user(owner,here.owner) then
  1375. X`009`009`009    add_counter(N_ACCEPT,owner);
  1376. X
  1377. X`009`009`009log_event(myslot,E_ACCEPT,0,0);
  1378. X`009`009`009writeln('Someone will be able to make an exit ',direct`091dir`09
  1379. V3,'.');
  1380. X`009`009end;
  1381. X`009end else
  1382. X`009`009writeln('To allow others to make an exit, type ACCEPT <direction of
  1383. V exit>.');
  1384. X    exit_label:
  1385. Xend;
  1386. X
  1387. X`123
  1388. XUser procedure to refuse an exit for links
  1389. XNote: may be unlink
  1390. X`125
  1391. Xprocedure do_refuse(s: string);
  1392. Xlabel exit_label;
  1393. Xvar
  1394. X`009dir,owner: integer;
  1395. X`009ok: boolean;
  1396. X
  1397. X    procedure leave;
  1398. X    begin
  1399. X`009writeln('EXIT - no changes.');
  1400. X`009goto exit_label;
  1401. X    end;
  1402. X
  1403. Xbegin
  1404. X`009if s = '' then grab_line('Direction? ',s,eof_handler := leave);
  1405. X
  1406. X`009if not(is_owner) then
  1407. X`009`009`123 is_owner prints error message itself `125
  1408. X`009else if lookup_dir(dir,s,true) then begin
  1409. X`009`009getroom;
  1410. X`009`009with here.exits`091dir`093 do begin
  1411. X`009`009`009if (toloc = 0) and (kind = 5) then begin
  1412. X`009`009`009`009kind := 0;
  1413. X`009`009`009`009ok := true;
  1414. X`009`009`009
  1415. X`009`009`009    if exact_user(owner,here.owner) then
  1416. X`009`009`009`009sub_counter(N_ACCEPT,owner);
  1417. +-+-+-+-+-+-+-+-  END  OF PART 16 +-+-+-+-+-+-+-+-
  1418.