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

  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 32/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.114916.15080@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 11:49:16 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 773
  12.  
  13. Archieve-name: monster_helsinki_104/part32
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 32/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 32 -+-+-+-+-+-+-+-+
  20. X`009`009`009bite := substr(s,1,i-1);
  21. X`009`009`009s := slead(substr(s,i+1,length(s)-i));
  22. X`009`009end;
  23. X`009end;
  24. Xend;
  25. X
  26. Xend. `123 module parser `125
  27. $ CALL UNPACK PARSER.PAS;67 608138093
  28. $ create/nolog 'f'
  29. X`091environment,inherit ('sys$library:starlet','global') `093
  30. Xmodule privusers(output);
  31. X
  32. Xvar timestring : string := '';
  33. X    default_allow: `091global`093 integer := 0;
  34. X    min_room: `091global`093 integer := 0;
  35. X    min_accept: `091global`093 integer := 0;
  36. X
  37. Xfunction image_name: string;
  38. Xvar
  39. X    value: string;
  40. X    ret: unsigned;
  41. X    itmlst: itmlst_type;
  42. X    i: integer;
  43. X   `032
  44. Xbegin
  45. X    with itmlst do begin
  46. X`009buffer_length := string_len;
  47. X`009item_code := jpi$_imagname;
  48. X`009new (buffer_address);
  49. X`009new (return_length_address);
  50. X`009itmlst_end := 0;
  51. X    end;
  52. X         `032
  53. X    ret := $getjpiw (,,,itmlst,,,);
  54. X   `032
  55. X    if odd(ret) then begin
  56. X`009value := '';
  57. X`009for i:= 1 to itmlst.return_length_address`094 do
  58. X`009    value := value + itmlst.buffer_address`094(.i.);
  59. X`009image_name := value;
  60. X    end else
  61. X`009image_name := '';
  62. X
  63. X    with itmlst do begin
  64. X`009dispose(buffer_address);
  65. X`009dispose(return_length_address);
  66. X    end;
  67. X
  68. Xend; `123 image_name `125
  69. X
  70. XFunction strip_line(line: string): string;
  71. Xvar ok: boolean;
  72. Xbegin
  73. X    while index(line,' ') = 1 do
  74. X`009line := substr(line,2,length(line)-1);
  75. X
  76. X    ok := true;
  77. X    while ok do begin
  78. X`009ok := line > '';
  79. X`009if ok then ok := line`091length(line)`093 = ' ';
  80. X`009if ok then line := substr(line,1,length(line)-1);
  81. X    end; `123 ok `125
  82. X    strip_line := line;
  83. Xend; `123 strip_line `125
  84. X
  85. X`091global`093
  86. XProcedure Get_Environment;
  87. Xvar path: string;
  88. X    pos,i: integer;
  89. X    init: text;
  90. X    counter: integer;
  91. X    current_line: string;
  92. X
  93. X    function get_line: string;
  94. X    var line: string;
  95. X`009pos: integer;
  96. X`009ok: boolean;
  97. X    begin
  98. X`009ok := false;
  99. X`009repeat
  100. X`009    if eof(init) then begin
  101. X`009`009get_line := '';
  102. X`009`009ok := true;
  103. X`009    end else begin
  104. X`009`009readln(init,line);
  105. X`009`009counter := counter +1;
  106. X`009`009current_line := line;
  107. X`009`009pos := index(line,'!');
  108. X`009`009if pos > 0 then line := substr(line,1,pos-1);
  109. X
  110. X`009`009line := strip_line(line);
  111. X
  112. X`009`009get_line := line;
  113. X`009`009ok := line > '';
  114. X`009    end;
  115. X`009until ok;
  116. X    end;    `123 get_line `125
  117. X
  118. X    procedure message(s: string);
  119. X    begin
  120. X`009writeln('%Error in ',path);
  121. X`009writeln('%at line ',counter:1);
  122. X`009writeln('%',current_line);
  123. X`009writeln('%',s);
  124. X`009writeln('%Notify Monster Manager.');
  125. X`009halt;
  126. X    end; `123 message `125
  127. X
  128. X    function item_value(item: string): string;
  129. X    var line: string;
  130. X`009pos: integer;
  131. X    begin
  132. X`009line := get_line;
  133. X`009if (line  = '') and  eof(init) then message('EOF detected.');
  134. X`009pos := index(line,':');
  135. X`009if pos = 0 then message (': must be in line');
  136. X`009if item <> substr(line,1,pos-1) then message(item+': expected');
  137. X`009if pos = length(line) then message('value must be in line');
  138. X`009line := substr(line,pos+1,length(line)-pos);
  139. X`009line := strip_line(line);
  140. X`009if line = '' then message('value can''t be only space');
  141. X`009item_value := line;
  142. X    end;    `123 item_value `125
  143. X
  144. X    function item_number(item: string): integer;
  145. X    var val: string;
  146. X`009num: integer;
  147. X    begin
  148. X`009val := item_value(item);
  149. X`009readv(val,num,error := continue);
  150. X`009if statusv > 0 then message('value '+val+' must be integer');
  151. X`009if num < 0 then message('value '+val+' must be positive or zero');
  152. X`009item_number := num;
  153. X    end; `123 item_number `125
  154. X
  155. X    procedure set_level(var level: levelrec; line: string);
  156. X
  157. X`009function cut_field(var line: string): string;
  158. X`009var pos: integer;
  159. X`009begin
  160. X`009    pos := index(line,',');
  161. X`009    if pos = 0 then begin
  162. X`009`009cut_field := strip_line(line);
  163. X`009`009line := ''
  164. X`009    end else begin
  165. X`009`009cut_field := strip_line(substr(line,1,pos-1));
  166. X`009`009line := substr(line,pos+1,length(line)-pos);
  167. X`009`009line := strip_line(line);
  168. X`009    end;
  169. X`009end; `123 cut_field `125
  170. X
  171. X`009function cut_number(var line: string): integer;
  172. X`009var val: string;
  173. X`009    num: integer;
  174. X`009begin
  175. X`009    val := cut_field(line);
  176. X`009    if val = '' then message('field can''t be empty');
  177. X`009    readv(val,num,error := continue);
  178. X`009    if statusv > 0 then message('value '+val+' must be integer');
  179. X`009    if num < 0 then message('value '+val+' must be positive or zero');
  180. X`009    cut_number := num;
  181. X`009end; `123 cut_number `125
  182. X`009   `032
  183. X    begin
  184. X`009with level do begin
  185. X`009    name :=     cut_field  (line);
  186. X`009    exp  :=     cut_number (line);
  187. X`009    priv :=     cut_number (line);
  188. X`009    health   := cut_number (line);
  189. X`009    factor   := cut_number (line);
  190. X`009    maxpower := cut_number (line);
  191. X`009    hidden   := cut_field  (line) = 'hidden';
  192. X`009end;`009
  193. X    end;    `123 set_level `125
  194. X`009
  195. X    procedure read_leveltable;
  196. X    var line: string;
  197. X`009i: integer;
  198. X    begin
  199. X`009levels := 0;
  200. X`009if get_line <> 'LEVELTABLE:' then message('LEVELTABLE: expected');
  201. X`009line := get_line;
  202. X`009while (line <> 'END OF LEVELTABLE') and (line <> '') do begin
  203. X`009    levels := levels+1;
  204. X`009    set_level(leveltable`091levels`093,line);
  205. X`009    line := get_line;
  206. X`009end;
  207. X`009if line <> 'END OF LEVELTABLE' then`032
  208. X`009    message('END OF LEVELTABLE expected');
  209. X`009levels := levels +1;
  210. X`009with leveltable`091levels`093 do begin
  211. X`009    name :=   'Archwizard';
  212. X`009    exp  :=   MaxInt;
  213. X`009    priv :=     item_number('Archpriv');
  214. X`009    health   := item_number('Archhealth');
  215. X`009    factor   := item_number('Archfactor');
  216. X`009    maxpower := item_number('Archpower');
  217. X`009    hidden   := false;
  218. X`009end; `123 with `125
  219. X`009for i := levels+1 to maxlevels do with leveltable`091i`093 do begin
  220. X`009    name :=   '';
  221. X`009    exp  :=   MaxInt;
  222. X`009    priv :=     0;
  223. X`009    health   := 0;
  224. X`009    factor   := 0;
  225. X`009    maxpower := 0;
  226. X`009    hidden   := true;
  227. X`009end;`009   `032
  228. X    end; `123 read_leveltable `125
  229. X`009
  230. X`009  `032
  231. Xbegin
  232. X    counter := 0;
  233. X    current_line := '';
  234. X
  235. X    path := image_name;
  236. X    if path = '' then begin
  237. X`009writeln('%Can''t get IMAGNAME. Notify Monster Manager.');
  238. X`009halt;
  239. X    end;
  240. X    pos := 0;
  241. X    for i := 1 to length(path) do begin
  242. X`009if path`091i`093 = '>' then pos := i;
  243. X`009if path`091i`093 = '`093' then pos := i;
  244. X    end;
  245. X    if pos = 0 then begin
  246. X`009writeln('%Odd IMAGNAME. Notify Monster manager.');
  247. X`009writeln('%IMAGNAME: ',path);
  248. X`009halt;
  249. X    end;
  250. X   `032
  251. X    path := substr(path,1,pos) + 'MONSTER.INIT';
  252. X
  253. X    open (init,path,history := READONLY, error := CONTINUE);
  254. X
  255. X    if status (init) > 0 then begin
  256. X`009writeln('%Can''t open ',path);
  257. X`009writeln('%Notify Monster Manager.');
  258. X`009halt;
  259. X    end else if status(init) < 0 then begin
  260. X`009writeln('%',path,' is empty');
  261. X`009writeln('%Notify Monster Manager.');
  262. X`009halt;
  263. X    end;
  264. X
  265. X    reset(init);
  266. X
  267. X    MM_userid  := item_value('MM_userid');
  268. X    gen_debug  := item_value('gen_debug') = 'true';
  269. X    rebuild_ok := item_value('REBUILD_OK') = 'true';
  270. X    root       := item_value('root');
  271. X    coderoot   := item_value('coderoot');
  272. X    read_leveltable;
  273. X    maxexperience := item_number('maxexperience');
  274. X    protect_exp   := item_number('protect_exp');
  275. X    timestring    := item_value('Playtime');
  276. X    default_allow := item_number('default_allow');
  277. X    min_room      := item_number('min_room');
  278. X    min_accept     := item_number('min_accept');
  279. X
  280. X    close (init);
  281. X
  282. Xend;`009`123 Get_Environment `125
  283. X
  284. X
  285. X`091 global `093
  286. Xprocedure write_message;
  287. Xvar ch: char;
  288. X    fyle : text;
  289. Xbegin
  290. X   open(fyle,
  291. X        root+'ILMOITUS.TXT',
  292. X        access_method:=sequential,
  293. X        history:= readonly,
  294. X        sharing:=readonly,
  295. X`009error:=continue);
  296. X   if status(fyle) <> 0 then
  297. X`009writeln('%Can''t type ILMOITUS.TXT. Notify Monster Manager.')
  298. X   else begin
  299. X       reset(fyle);
  300. X       while not eof(fyle) do begin
  301. X`009  while not eoln(fyle) do begin
  302. X`009     read(fyle,ch);
  303. X`009     write(ch)
  304. X`009  end;
  305. X`009  readln(fyle);
  306. X`009  writeln
  307. X       end;
  308. X       close(fyle);
  309. X   end;
  310. Xend;`009`123 write_message `125
  311. X
  312. X`091global`093
  313. Xfunction work_time: boolean;
  314. Xtype
  315. X    hournums= 0..23;
  316. X    timeset= set of hournums;
  317. Xvar
  318. X    hours: timeset;
  319. X    allright: boolean;     `123 This will be set to false on any error. `125
  320. X    root: `091external`093 varying `09180`093 of char;
  321. X
  322. X
  323. X    function wkdayp: boolean;
  324. X    type
  325. X`009string = varying`091string_len`093 of char;
  326. X
  327. X    var
  328. X`009value: string;
  329. X`009fake: boolean;
  330. X
  331. X
  332. X`009function sys_trnlnm (
  333. X`009    tabnam : `091class_s`093 packed array `091$l2..$u2:integer`093 of ch
  334. Var;
  335. X`009    lognam : `091class_s`093 packed array `091$l3..$u3:integer`093 of ch
  336. Var
  337. X`009    ): string;
  338. X
  339. X`009(*
  340. X   `032
  341. X`009    Takes as parameters a logical name table and a logical  name.
  342. X`009    Returns  the  equivalence string, or if the name is undefined
  343. X`009    the logical  name  itself.  The  parameters  must  be  string
  344. X`009    constants, not variables.
  345. X   `032
  346. X`009    leino@finuh 20 Mar 1989
  347. X   `032
  348. X`009    *)
  349. X`009       `032
  350. X   `032
  351. X`009var
  352. X`009    value: string;
  353. X`009    ret: unsigned;
  354. X`009    itmlst: itmlst_type;
  355. X`009    i: integer;
  356. X   `032
  357. X`009begin
  358. X`009    with itmlst do begin
  359. X`009`009buffer_length := string_len;
  360. X`009`009item_code := lnm$_string;
  361. X`009`009new (buffer_address);
  362. X`009`009new (return_length_address);
  363. X`009`009itmlst_end := 0;
  364. X`009    end;
  365. X         `032
  366. X`009    ret := $trnlnm (lnm$m_case_blind, tabnam,`032
  367. X`009`009`009    lognam, psl$c_user, itmlst);
  368. X   `032
  369. X`009    if odd(ret) then begin
  370. X`009`009value := '';
  371. X`009`009for i:= 1 to itmlst.return_length_address`094 do
  372. X`009`009    value := value + itmlst.buffer_address`094(.i.);
  373. X`009`009sys_trnlnm := value;
  374. X`009    end else
  375. X`009`009sys_trnlnm := lognam;
  376. X
  377. X`009    with itmlst do begin
  378. X`009`009dispose(buffer_address);
  379. X`009`009dispose(return_length_address);
  380. X`009    end;
  381. X
  382. X`009end; (* of sys_trnlnm *)
  383. X
  384. X    begin
  385. X`009fake := false;
  386. X`009value := sys_trnlnm ('lnm$process_directory', 'lnm$directories');
  387. X`009if value <> 'lnm$directories' then fake := true;
  388. X`009value := sys_trnlnm ('lnm$process_directory', 'lnm$system_table');
  389. X`009if value <> 'lnm$system_table' then fake := true;
  390. X`009value := sys_trnlnm ('lnm$system_table', '$daystatus');
  391. X`009if value = 'WEEKDAY' then
  392. X`009    wkdayp := true
  393. X`009else
  394. X`009    wkdayp := false;
  395. X`009if fake then begin
  396. X`009    writeln ('%MONSTER-F-CRACK, cracking attempt suspected');
  397. X`009    wkdayp := true;
  398. X`009    halt;
  399. X`009end;
  400. X    end;
  401. X
  402. X    procedure getlegal(var time: timeset);
  403. X    var i: integer;
  404. X    begin
  405. X`009time := `091`093;
  406. X`009if length(timestring) <> 24 then allright := false
  407. X`009else for i:=0 to 23 do begin
  408. X`009        if timestring`091i+1`093 = '+' then time:=time+`091i`093;
  409. X`009    end;
  410. X    end;
  411. X
  412. X    function gethour: integer;
  413. X    var systime: packed array`0911..11`093 of char;
  414. X    begin
  415. X`009time(systime);
  416. X`009if systime`0911`093=' '
  417. X`009then gethour:=ord(systime`0912`093)-ord('0')
  418. X`009else gethour:=10*(ord(systime`0911`093)-ord('0'))+ord(systime`0912`093)-
  419. Vord('0')
  420. X    end; `123 gethour `125
  421. X
  422. Xbegin
  423. X   allright:=true;     `123 Let's suppose ev'rything goes fine. `125
  424. X   work_time:=false;
  425. X   if wkdayp
  426. X   then begin
  427. X      hours:=`091`093;
  428. X      getlegal(hours);    `123 At this moment the 'allright' may change in `
  429. V125
  430. X      if allright then begin  `123 procedure getlegal() only `125
  431. X         if not (gethour in hours)
  432. X         then begin
  433. X            work_time:=true    `123 Someone tries to play at noon. `125
  434. X         end
  435. X      end else
  436. X         work_time:=true  `123 Something odd is going on. Let's prevent play
  437. Ving. `125
  438. X   end
  439. Xend;
  440. X
  441. Xend. `123 of module privusers `125
  442. $ CALL UNPACK PRIVUSERS.PAS;7 1076246245
  443. $ create/nolog 'f'
  444. X`091inherit ('Global'),environment`093
  445. XModule Queue;`009`009`009`123 Written by Kari Hurtta, 1989 `125
  446. X
  447. XConst
  448. X`009maxqueue = 100;
  449. X
  450. XType`032
  451. X`009item = record
  452. X               Monster: shortstring;
  453. X               code:    integer;
  454. X               label_name:   shortstring;
  455. X               deltatime: integer;
  456. X        end;
  457. X
  458. XVar used : 0 .. maxqueue := 0;
  459. X    myname: `091external`093 shortstring;
  460. X    debug:  `091external`093 boolean;
  461. X    queue : array `091 1 .. maxqueue `093 of item;
  462. X
  463. X
  464. X`091external`093
  465. Xfunction lowcase(s: string): string; external;
  466. X
  467. X`091external`093
  468. Xfunction run_monster (monster_name: shortstring; code: integer;
  469. X                      label_name: shortstring; variable: shortstring;
  470. X                      value: mega_string;
  471. X                      time: shortstring;
  472. X`009`009      spell: shortstring := '';
  473. X`009`009      summoner: shortstring := ''): boolean; external;`032
  474. X                                                    `123 hurtta@finuh `125
  475. X
  476. X`091external`093
  477. Xfunction sysdate: string; external;
  478. X
  479. X`091external`093
  480. Xfunction systime: string; external;
  481. X
  482. X`091external`093
  483. Xfunction current_run: integer; external;
  484. X
  485. X`091external`093
  486. Xprocedure log_event(`009send: integer := 0;`009`123 slot of sender `125
  487. X`009`009`009act:integer;`009`009`123 what event occurred `125
  488. X`009`009`009targ: integer := 0;`009`123 target of event `125
  489. X`009`009`009p: integer := 0;`009`123 expansion parameter `125
  490. X`009`009`009s: string := '';`009`123 string for messages `125
  491. X`009`009`009room: integer := 0`009`123 room to log event in `125
  492. X`009`009   );`009external;
  493. X
  494. X`091external`093
  495. Xfunction player_room(player: shortstring): integer; external;
  496. X
  497. X`091external`093
  498. Xfunction protected(n: integer := 0): boolean; external;
  499. X
  500. X`091global`093
  501. Xprocedure reset_queue;
  502. Xbegin
  503. X    used := 0;
  504. Xend;
  505. X
  506. X`091global`093
  507. Xprocedure add_queue (monster: shortstring; code: integer;
  508. X`009label_name: shortstring; deltatime: integer);
  509. Xvar place,i : integer;
  510. Xbegin
  511. X   if used < maxqueue then begin
  512. X      place := used+1;
  513. X      for i := used downto 1 do`032
  514. X         if queue`091i`093.deltatime > deltatime then place := i;
  515. X      for i := used downto place do queue`091i+1`093 := queue`091i`093;
  516. X      used := used +1;
  517. X      queue`091place`093.monster    := monster;
  518. X      queue`091place`093.code       := code;
  519. X      queue`091place`093.label_name := label_name;
  520. X      queue`091place`093.deltatime  := deltatime;
  521. X   end;
  522. Xend;
  523. X
  524. Xfunction run_task(nr : integer): boolean;
  525. Xvar i: integer;
  526. Xbegin
  527. X   with queue`091nr`093 do
  528. X      run_task := run_monster(monster,code,label_name,'','',sysdate+' '+syst
  529. Vime);
  530. X   used := used -1;
  531. X   for i := nr to used do queue`091i`093 := queue `091i+1`093;
  532. Xend;
  533. X
  534. X`091global`093
  535. Xfunction time_check: boolean;
  536. Xvar i: integer;
  537. Xbegin
  538. X  for i := 1 to used do with queue`091i`093 do
  539. X     if deltatime > 0 then deltatime := deltatime -1;
  540. X  time_check := false;
  541. X  if (used > 0) and not protected then`032
  542. X     if queue`0911`093.deltatime = 0 then
  543. X        if current_run = 0 then time_check := run_task(1);
  544. Xend;
  545. X
  546. X`091global`093
  547. Xfunction send_submit (monster: shortstring; code: integer;
  548. X`009label_name: shortstring; deltatime: integer; player: shortstring):
  549. X`009boolean;
  550. Xvar room: integer;
  551. Xbegin
  552. X   room := player_room(player);
  553. X   if room > 0 then`032
  554. X      log_event( act := E_SUBMIT, targ := code, p := deltatime,
  555. X`009`009s := monster + ',' + label_name + ',' + player,
  556. X`009`009room := room);
  557. X   send_submit := room > 0;
  558. Xend;
  559. X
  560. X`091global`093
  561. Xprocedure get_submit(targ: integer; s: string; p: integer);
  562. Xvar loc: integer;
  563. X    s1,s2,s3,s4: string;
  564. Xbegin
  565. X  loc := index(s,',');
  566. X  s1 := substr(s,1,loc-1);
  567. X  s2 := substr(s,loc+1,length(s)-loc);
  568. X  loc := index(s2,',');
  569. X  s3 := substr(s2,1,loc-1);
  570. X  s4 := substr(s2,loc+1,length(s2)-loc);
  571. X  if lowcase(myname) = lowcase(s4) then
  572. X     add_queue(s1, targ,s3 ,p);
  573. Xend;`032
  574. X
  575. Xend. `123 End of module Queue `125
  576. $ CALL UNPACK QUEUE.PAS;122 578611759
  577. $ create/nolog 'f'
  578. X                         Monster Helsinki V 1.04
  579. X                         -----------------------
  580. X
  581. X    Monster, a multiplayer adventure game where the players create the
  582. X    world and make the rules.
  583. X
  584. X    Derived from Rich Skrenta's Monster (from version 1).
  585. X
  586. X    Includes programmable non-player characters (NPC) with own programming
  587. X    language - MDL (Monster Defination Language). Also rooms and objects
  588. X    can program with it (via so called hooks). NPCs are called to 'monster',
  589. X    all other MDL-objects are called to 'hook'.
  590. X
  591. XEnvironment: VMS V4.x (MONSTER_INSTALL.COM requires V5.x)
  592. X             PASCAL`032
  593. X
  594. XNew to version 1.03 (posted 24.11.1990):
  595. X1)  Several bugfixes (of course)
  596. X2)  New commands MONSTER/DUMP and MONSTER/BUILD (via MONSTER_DUMP.EXE)
  597. X3)  Reading of keyboard and database polling starategy have rewrote -
  598. X    should cause smaller IO-load to system (new GUTS.PAS).
  599. X4)  MDL -parser now writes offending line and points error position when`032
  600. X    it detects error in MDL-program.
  601. X
  602. X    This distribution includes also small database for starters (Build`032
  603. X    with command MONSTER/BUILD CASTLE.DMP).
  604. X
  605. X    Compilation and installation - two possibility:
  606. X1)  Compile MONSTER_E.HLP
  607. X         $ LIBRARIAN/HELP/CREATE MONSTER_E MONSTER_E
  608. X    Read installation help
  609. X         $ HELP/LIBRARY=SYS$DISK:<>MONSTER_E Installation
  610. X    and follow help.
  611. X2)  Run installation-script
  612. X         $ @MONSTER_INSTALL
  613. X    and answer to questions.
  614. X
  615. X
  616. X    Send notice to me (Kari.Hurtta@Helsinki.Fi) if you get this
  617. X    working or if you have problems.
  618. X
  619. X- K E H
  620. X( Kari.Hurtta@Helsinki.FI,
  621. X  hurtta@cc.Helsinki.FI,
  622. X  hurtta@cs.Helsinki.FI,
  623. X  HURTTA@FINUH.BITNET
  624. X)
  625. $ CALL UNPACK READ.ME;4 777611371
  626. $ create/nolog 'f'
  627. X! For receptionist of medium hotel
  628. X- LABEL enter()
  629. X- LABEL leave()
  630. X- LABEL say(if(include(speech,"Give room"),GOSUB room()),
  631. X`009    if(include(speech,"Give key"),GOSUB key()),
  632. X`009    if(include(speech,"Fire"),GOSUB fire()),
  633. X`009    if(include(speech,"Withdraw"),GOSUB withdraw()),
  634. X`009    if(include(speech,"Hello"),GOSUB hello()))
  635. X- LABEL attack()
  636. X- LABEL look()
  637. X- LABEL look you()
  638. X- LABEL command(DEFINE lowcase(prog(SET lowcase(strip(command)),
  639. X`009if(=(lowcase,"ripe"), GOSUB ripe(command,lowcase),
  640. X`009if(=(lowcase,"love"), GOSUB ripe(command,lowcase),
  641. X`009if(=(lowcase,"fuck"), GOSUB ripe(command,lowcase),
  642. X`009if(=(lowcase,"kiss"), GOSUB kiss(command,lowcase),
  643. X`009if(=(lowcase,"smile"), GOSUB smile(command,lowcase),
  644. X`009if(=(lowcase,"status"), GOSUB status(command,lowcase),
  645. X`009if(=(lowcase,"restart"), GOSUB restart(command,lowcase),
  646. X`009if(=(lowcase,"clean"), GOSUB clean(command,lowcase),
  647. X`009pprint("You can't ",lowcase," receptionist.")
  648. X)))))))))))
  649. X
  650. X- LABEL Action(
  651. X`009pprint raw("You ",p1," ",p2),
  652. X`009oprint raw(print null(player name)," ",p1,"s ",p2)
  653. X`009)
  654. X
  655. X- LABEL No Action(
  656. X`009pprint raw("You can't ",p1," ",p2),
  657. X`009oprint(player name," can't ",p1," ",p2)
  658. X`009)
  659. X
  660. X- LABEL ripe(GOSUB Action("grap","receptionist to arms trying make love."),
  661. X`009print("Receptionist shout: RIPE !"),
  662. X`009pprint("Guard appears and shouts you."),
  663. X`009oprint("Guard appears and shouts",player name,"."),
  664. X`009attack("40")
  665. X`009)`009
  666. X
  667. X- LABEL Score(set experience(plus(experience(player name),p1)))
  668. X
  669. X- LABEL kiss(pprint("You kiss receptionist."),
  670. X`009oprint(player name,"kiss receptionst."),
  671. X`009GOSUB Score(random("0, 0, 0, 0, 0, 0, 1, 1, 2")),
  672. X`009print("Receptionist smiles.")
  673. X`009)
  674. X
  675. X- LABEL smile(GOSUB Action("smile","to receptionist."))
  676. X
  677. X- LABEL status(pprint("Receptionist's status: ",get state()))
  678. X
  679. X- LABEL Manager(and(player name,get remote state("R2D2")))
  680. X
  681. X- LABEL fire(if (GOSUB Manager(),GOSUB Fire(string tail(speech)),
  682. X`009print("Receptionist: You don't have my boss.")))
  683. X
  684. X- LABEL restart(if(GOSUB Manager(),GOSUB Restart(),
  685. X`009GOSUB No Action("restart","receptionist.")))
  686. X
  687. X- LABEL clean(if(GOSUB Manager(),GOSUB Clean(),
  688. X`009GOSUB No Action("clean","receptionist.")))
  689. X
  690. X- LABEL Restart(GOSUB Action("restart","receptionist."),
  691. X`009set state(""),
  692. X`009FOR i("-1-, -2-, -3-, -4-",GOSUB Get(i)),
  693. X`009move("reception"))
  694. X
  695. X- LABEL Clean(GOSUB Action("clean","receptionist."),
  696. X`009set state(FOR i(get state(),include(i,"/"))))
  697. X
  698. X- LABEL Get(move(+("Room ",p1)),
  699. X`009    if(get(+("Key ",p1)),pprint("Succeed: ",p1)))
  700. X
  701. X! This should solve problem of overruning fields maximun length
  702. X- LABEL Key & player(head(list(+("Key ",p1," / ",player name))))
  703. X
  704. X- LABEL Key & name(head(list(+("Key ",p1," / ",p2))))
  705. X
  706. X! This is kludge for overruning field problem
  707. X- LABEL is in list(FOR p(p1,include(p2,p)))
  708. X
  709. X- LABEL Fire(SET p1(parse player(strip(p1))),
  710. X`009if (p1, FOR i("-1-, -2-, -3-, -4-",
  711. X`009`009if (GOSUB is in list(get state(),GOSUB Key & name(i,p1)),
  712. X`009`009GOSUB Fire from(i,p1))),
  713. X`009print("Receptionist: Who ?")))
  714. X
  715. X- LABEL Fire from(set state(exclude(get state(),
  716. X`009GOSUB is in list(get state(),GOSUB Key & name(p1,p2)))),
  717. X`009print("Receptionist fires",p2,"from room",p1))
  718. X`009
  719. X- LABEL Free(not(include(get state(),+("Key ",p1," /"))))
  720. X
  721. X- LABEL In player(GOSUB is in list(get state(),GOSUB Key & player(p1)))
  722. X
  723. X- LABEL Locate(random(FOR i("-1-, -2-, -3-, -4-",GOSUB Free(i))))
  724. X
  725. X- LABEL Locate2(random(FOR i("-1-, -2-, -3-, -4-",GOSUB In player(i))))
  726. X
  727. X- LABEL room(DEFINE room(if(SET room(GOSUB Locate2()),
  728. X`009pprint("Receptionist: You have already room ",room,"."),
  729. X`009if(SET room(GOSUB Locate()),
  730. X`009   if(GOSUB rent(),GOSUB Give(room,"hire")),
  731. X`009   print("Receptionist: No rooms left.")))))
  732. X
  733. X- LABEL Give(if(pduplicate(destroy(+("Key ",p1))),
  734. X`009`009null(set state(or(get state(),
  735. X`009`009`009GOSUB Key & player(p1))),
  736. X`009`009`009if(p2,null(GOSUB Action("hire",+("room ",p1,".")),
  737. X`009`009`009           GOSUB Score("2"))),
  738. X`009`009`009pprint("Receptionist gives Key ",p1," to you."))))
  739. X
  740. X- LABEL key(DEFINE room(
  741. X`009if(SET room(GOSUB Locate2()),
  742. X`009   GOSUB Give(room,""),
  743. X`009   print("Receptionist: You haven't room."))))
  744. X
  745. X- LABEL withdraw(DEFINE room(
  746. X`009if(SET room(GOSUB Locate2()),
  747. X`009GOSUB Withdraw(room),
  748. X`009print("Receptionist: You haven't room."))))
  749. X           `032
  750. X- LABEL Withdraw(duplicate(pdestroy(+("Key ",p1))),
  751. X`009`009set state(exclude(get state(),
  752. X`009`009`009GOSUB is in list(get state(),
  753. X`009`009`009`009GOSUB Key & player(p1)))),
  754. X`009`009GOSUB Action("withdraw",+("room ",p1,".")),
  755. X`009`009GOSUB Score("10"),
  756. X`009`009move(+("Room ",p1)),
  757. X`009`009get(+("Key ",p1)),
  758. X`009`009move("Reception"))
  759. X
  760. X-LABEL hello(DEFINE i(if(GOSUB Locate(),
  761. X`009`009         if(SET i(GOSUB Locate2()),
  762. X`009`009            if(and(inv(),+("key ",i)),
  763. X`009                       print("Receptionist: Hello! Want you key?"),
  764. X`009`009`009       print("Receptionist: Hello!")),
  765. X`009`009            print("Receptionist: Hello! Want you room?")),
  766. X`009`009         print("Receptionist: Hello!"))))
  767. X
  768. X- LABEL money("gold coin, gold sack")
  769. X
  770. X- LABEL sel money(random(and(GOSUB money(),pinv ())))
  771. X
  772. X- LABEL rent(DEFINE money(if(SET money(GOSUB sel money()),
  773. X`009`009`009  prog(pprint("Receptionist take ",money," as rent."),
  774. X`009`009`009       pdestroy(money),
  775. X`009`009`009       move("hotel's wareroom"),
  776. X`009`009`009       duplicate(money),
  777. X`009`009`009       drop(money),
  778. X`009`009`009       move("reception"),
  779. X`009`009`009       money),
  780. X`009`009`009  prog(print("Receptionist: You mast have something as rent."),
  781. X`009`009`009       print("Receptionist: Maybe ",
  782. X`009`009`009             random(GOSUB money())),
  783. X`009`009`009       ""))))
  784. $ CALL UNPACK RECEPTIONIST.MDL;57 56126839
  785. $ EXIT
  786.