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

  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 15/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.031842.9387@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 03:18:42 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1142
  12.  
  13. Archieve-name: monster_helsinki_104/part15
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 15/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 15 -+-+-+-+-+-+-+-+
  20. X        a := eval_atom (p1);
  21. X        write_debug('%e_attack - p1: ',a); `032
  22. X        readv(a,value,error:=continue);
  23. X`009if left <= 0 then result := ''
  24. X        else if statusv <> 0 then result := ''
  25. X        else if value < 0 then result := ''
  26. X        else if not privilegion and`032
  27. X`009`009(attack_limit = maxint) then result := ''  `032
  28. X        else begin
  29. X`009    if debug then writeln('%e_attack - power left: ',left:1);
  30. X`009    if value > left then value := left;
  31. X`009    if int_attack(myname,value) then begin`032
  32. X`009`009writev(result,value:1);
  33. X`009`009used_attack := used_attack + value;
  34. X`009    end else result := '';
  35. X`009    if debug then writeln('%e_attack - used power: ',used_attack:1);
  36. X`009end;
  37. X        write_debug('%e_attack - result: ',result);
  38. X        e_attack := result;
  39. X      end; `123 e_attack `125
  40. X
  41. X      function e_not(p1: integer): string_t;
  42. X      var a: string_t;
  43. X          value : integer;
  44. X      begin
  45. X        write_debug('%e_not');
  46. X        a := eval_atom (p1);
  47. X        write_debug('%e_not - p1: ',a); `032
  48. X        if a > '' then e_not := ''
  49. X        else e_not := 'TRUE';
  50. X        write_debug('%e_not leaving');
  51. X      end; `123 e_not `125
  52. X
  53. X      function e_random(p1: integer): string_t;
  54. X      const max_item = 100;
  55. X      var a,result: string_t;
  56. X          table: array `0911 .. max_item`093 of atom_t;
  57. X          count: integer;
  58. X          value: integer;
  59. X
  60. X`009function action(atom: atom_t): atom_t;`009`123 meta_do ei kutsu t`228t`2
  61. V28`009`125
  62. X`009begin`009`009`009`009`009`123 kun atom = ''`009`009`125
  63. X`009    table`091count`093 := atom;
  64. X`009    count := count +1;
  65. X`009    action := '';
  66. X`009end;
  67. X
  68. X      begin
  69. X         write_debug('%e_random');
  70. X         result := '';
  71. X         count := 1;
  72. X`009 meta_do(p1,action);
  73. X         count := count -1;
  74. X         if count > 0 then`032
  75. X            begin
  76. X               value := trunc (random * count) + 1;
  77. X               if debug then writeln ('%e_random - value: ',value);
  78. X               result := table `091value`093;
  79. X            end;
  80. X         write_debug('%e_random result: ',result);
  81. X         e_random := result;
  82. X      end; `123 e_random `125
  83. X
  84. X      function e_strip(p1: integer): string_t;
  85. X      var a,result: string_t;
  86. X          index: integer;
  87. X          value: integer;
  88. X      begin
  89. X         write_debug('%e_strip');
  90. X         a := eval_atom (p1);
  91. X         write_debug('%e_strip - p1: ',a);
  92. X         result := '';
  93. X         for index := 1 to length(a) do begin
  94. X             if (a`091index`093 >= 'A') and (a`091index`093 <= 'Z') then`032
  95. X                result := result + chr(ord(a`091index`093) - ord('A') + ord(
  96. V'a'))
  97. X             else if (a`091index`093 >= 'a') and (a`091index`093 <= 'z') the
  98. Vn
  99. X                result := result + a`091index`093
  100. X             else if a`091index`093 in `091'0'..'9'`093 then
  101. X                result := result + a`091index`093
  102. X             else result := result + ' ';
  103. X         end;
  104. X         `123 result := clean_spaces(result); `125
  105. X         write_debug('%e_strip result: ',result);
  106. X         e_strip := result;
  107. X      end; `123 e_strip `125
  108. X
  109. X      function e_control(p1,p2: integer): string_t;
  110. X      var name,result: string_t;
  111. X          code: integer;
  112. X          old_monster: atom_t;
  113. X      begin
  114. X         old_monster := monster;
  115. X         write_debug('%e_control');
  116. X         name := eval_atom(p1);
  117. X         write_debug('%e_control - p1: ',name);
  118. X         if length(name) > atom_length then
  119. X            name := substr(name,1,atom_length);
  120. X         if name = '' then result := ''`032
  121. X         else begin
  122. X            code := int_get_code(name);
  123. X            if code = 0 then result := ''
  124. X            else if (x_monster_owner(pool`091buffer`093.current_program) <>`
  125. V032
  126. X`009`009`009x_monster_owner(code) )`032
  127. X`009`009    and not int_ask_privilege(monster,'manager')`032
  128. X`009`009    and not system_code then`032
  129. X`009`009result := ''
  130. X            else if x_get_flag(code,CF_NO_CONTROL) then begin
  131. X`009`009result := '';
  132. X`009`009write_debug('%e_control - control disabled.');
  133. X`009    end else if int_login(name,false) <> 1 then `123 mark running `125
  134. X`009`009result := ''`009     `123 monster is already active `125
  135. X`009    else begin
  136. X               monster := name;
  137. X               set_variable('monster name',monster);
  138. X               result := eval_atom(p2);
  139. X               int_logout(name);
  140. X            end;
  141. X         end;
  142. X         monster := old_monster;
  143. X         set_variable('monster name',monster);
  144. X         write_debug('%e_control - result: ',result);
  145. X         e_control := result;
  146. X      end; `123 e_control `125
  147. X
  148. X      function e_experience(p1: integer): string_t;
  149. X      var name,result: string_t;
  150. X          exp: integer;
  151. X      begin
  152. X         write_debug('%e_experience');
  153. X         name := eval_atom(p1);
  154. X         write_debug('%e_experience - p1: ',name);
  155. X         if length(name) > atom_length then
  156. X            name := substr(name,1,atom_length);
  157. X         if name = '' then result := ''`032
  158. X         else begin
  159. X            exp := int_get_experience(name);
  160. X            if exp = -1 then result := ''
  161. X            else writev(result,exp:1);
  162. X         end;
  163. X         write_debug('%e_experience - result: ',result);
  164. X         e_experience := result;
  165. X      end; `123 e_experience `125
  166. X
  167. X      function e_health(p1: integer): string_t;
  168. X      var name,result: string_t;
  169. X          hel: integer;
  170. X      begin
  171. X         write_debug('%e_health');
  172. X         name := eval_atom(p1);
  173. X         write_debug('%e_health - p1: ',name);
  174. X         if length(name) > atom_length then
  175. X            name := substr(name,1,atom_length);
  176. X         if name = '' then result := ''`032
  177. X         else begin
  178. X            hel := int_get_health(name);
  179. X            if hel = -1 then result := ''
  180. X            else writev(result,hel:1);
  181. X         end;
  182. X         write_debug('%e_health - result: ',result);
  183. X         e_health := result;
  184. X      end; `123 e_health `125
  185. X
  186. X      function eval_number(param: integer; var result: integer): boolean;
  187. X      var str: string_t;
  188. X      begin
  189. X         write_debug('%eval_number');
  190. X         result := 0;
  191. X         str := eval_atom(param);
  192. X         write_debug('%eval_number - param: ',str);
  193. X         if str = '' then eval_number := false
  194. X         else begin
  195. X            readv(str,result,error := continue);
  196. X            if statusv = 0 then eval_number := true
  197. X            else begin
  198. X               result := 0;
  199. X               eval_number := false
  200. X            end;
  201. X         end;
  202. X      end; `123 eval_number `125
  203. X
  204. X      function e_plus_n(p1,p2: integer): string_t;
  205. X      var result: string_t;
  206. X          a1,a2: integer;
  207. X      begin
  208. X        write_debug('%e_plus_n');
  209. X        result := '';
  210. X        if eval_number(p1,a1) and eval_number(p2,a2) then begin
  211. X           if abs((a1 div 3) + (a1 div 3)) > ((maxint div 3)-1) then
  212. X              result := ''
  213. X           else writev(result,a1+a2:1);
  214. X        end;                           `032
  215. X        write_debug('%e_plus_n - result: ',result);
  216. X        e_plus_n := result;
  217. X      end; `123 e_plus_n `125
  218. X
  219. X      function e_difference_n(p1,p2: integer): string_t;
  220. X      var result: string_t;
  221. X          a1,a2: integer;
  222. X      begin
  223. X        write_debug('%e_difference_n');
  224. X        result := '';
  225. X        if eval_number(p1,a1) and eval_number(p2,a2) then begin
  226. X           if abs((a1 div 3) - (a1 div 3)) > ((maxint div 3)-1) then
  227. X              result := ''
  228. X           else writev(result,a1-a2:1);
  229. X        end;                           `032
  230. X        write_debug('%e_difference_n - result: ',result);
  231. X        e_difference_n := result;
  232. X      end; `123 e_difference_n `125
  233. X
  234. X      function e_times_n(p1,p2: integer): string_t;
  235. X      var result: string_t;
  236. X          a1,a2: integer;
  237. X      begin
  238. X        write_debug('%e_times_n');
  239. X        result := '';
  240. X        if eval_number(p1,a1) and eval_number(p2,a2) then begin
  241. X           if ln(abs(a1)) + ln(abs(a2)) > (ln(maxint)-1) then result := ''
  242. X           else writev(result,a1*a2:1);
  243. X        end;                           `032
  244. X        write_debug('%e_times_n - result: ',result);
  245. X        e_times_n := result;
  246. X      end; `123 e_times_n `125
  247. X
  248. X      function e_quotient_n(p1,p2: integer): string_t;
  249. X      var result: string_t;
  250. X          a1,a2: integer;
  251. X      begin
  252. X        write_debug('%e_quotient_n');
  253. X        result := '';
  254. X        if eval_number(p1,a1) and eval_number(p2,a2) then begin
  255. X           if a2 <> 0 then writev(result,a1 div a2:1);
  256. X        end;                           `032
  257. X        write_debug('%e_quotient_n - result: ',result);
  258. X        e_quotient_n := result;
  259. X      end; `123 e_quotient_n `125
  260. X
  261. X      function e_set_experience(p1: integer): string_t;
  262. X      var result: string_t;
  263. X          exp: integer;
  264. X          owner,owner2: atom_t;
  265. X      begin
  266. X        write_debug('%e_set_experience');
  267. X        result := '';
  268. X        owner  := x_monster_owner(pool`091buffer`093.current_program); `123
  269. V get owner of this `125
  270. X        owner2 := x_monster_owner(pool`091buffer`093.current_program,1); `12
  271. V3 and code owner `125
  272. X        if eval_number(p1,exp) and`032
  273. X           (  (int_ask_privilege(monster,'experience') and`032
  274. X              (userid <> owner) and (userid <> owner2))`032
  275. X`009      or system_code`009`123 system override check `125
  276. X           ) then
  277. X           if exp >= 0 then
  278. X              if int_set_experience(myname,exp) then writev(result,exp:1);
  279. X        write_debug('%e_set_experience - result: ',result);
  280. X        e_set_experience := result;
  281. X      end; `123 e_set_experience `125
  282. X
  283. X      function e_get_state: string_t;
  284. X      var result: string_t;
  285. X      begin
  286. X         write_debug ('%e_get_state');
  287. X         getheader(pool`091buffer`093.current_program);
  288. X         freeheader;
  289. X         result := header.state;
  290. X         write_debug ('%e_get_state - result: ',result);
  291. X         e_get_state := result;
  292. X      end; `123 e_get_state `125
  293. X
  294. X      function e_set_state(p1: integer): string_t;
  295. X      var a: string_t;
  296. X      begin
  297. X         write_debug('%e_set_state');
  298. X         a := eval_atom(p1);
  299. X         write_debug('%e_set_state - p1: ',a);
  300. X         getheader(pool`091buffer`093.current_program);
  301. X         header.state := a;
  302. X         putheader;  `032
  303. X         write_debug('e_set_state - result: ',a);
  304. X         e_set_state := a;
  305. X      end; `123 e_set_state `125
  306. X
  307. X      function e_get_remote_state(p1: integer): string_t;
  308. X      var result: string_t;
  309. X          a1: string_t;
  310. X          code: integer;
  311. X`009  pub: atom_t;
  312. X      begin
  313. X`009 if not lookup_class(pub,'public') then
  314. X`009    writeln('%error in e_get_remote_state');
  315. X         write_debug ('%e_get_remote_state');
  316. X         a1 := eval_atom(p1);
  317. X         write_debug ('%e_get_remote_state - p1: ',a1);
  318. X         if length(a1) > atom_length then a1 := substr(a1,1,atom_length);
  319. X         code := int_get_code(a1);
  320. X         if code = 0 then result := ''
  321. X         else if (x_monster_owner(code) <>`032
  322. X`009`009x_monster_owner(pool`091buffer`093.current_program))
  323. X`009    and ((x_monster_owner(code) <> pub) or`032
  324. X`009`009 not int_ask_privilege(monster,'owner'))`032
  325. X`009    and not system_code then result := ''
  326. X         else begin
  327. X            getheader(code);
  328. X            freeheader;
  329. X            result := header.state;
  330. X         end;
  331. X         write_debug ('%e_get_remote_state - result: ',result);
  332. X         e_get_remote_state := result;
  333. X      end; `123 e_get_remote_state `125
  334. X
  335. X      function e_set_remote_state(p1,p2: integer): string_t;
  336. X      var result: string_t;
  337. X          a1,a2: string_t;
  338. X          code: integer;
  339. X`009  pub: atom_t;
  340. X      begin
  341. X         write_debug ('%e_set_remote_state');
  342. X`009 if not lookup_class(pub,'public') then
  343. X`009    writeln('%error in e_set_remote_state');
  344. X
  345. X         a1 := eval_atom(p1);
  346. X         a2 := eval_atom(p2);
  347. X         write_debug ('%e_set_remote_state - p1: ',a1);
  348. X         write_debug ('%                     p2: ',a2);
  349. X         if length(a1) > atom_length then a1 := substr(a1,1,atom_length);
  350. X         code := int_get_code(a1);
  351. X         if code = 0 then result := ''
  352. X         else if (x_monster_owner(code) <>`032
  353. X`009`009x_monster_owner(pool`091buffer`093.current_program))
  354. X`009    and ((x_monster_owner(code) <> pub) or`032
  355. X`009`009not int_ask_privilege(monster,'owner'))`032
  356. X`009    and not system_code then result := ''
  357. X         else begin
  358. X            getheader(code);
  359. X            header.state := a2;
  360. X            putheader;
  361. X            result := a2;
  362. X         end;
  363. X         write_debug ('%e_set_remote_state - result: ',result);
  364. X         e_set_remote_state := result;
  365. X      end; `123 e_set_remote_state `125
  366. X
  367. X      function e_less_n(p1,p2: integer): atom_t;
  368. X      var result: atom_t;
  369. X          a1,a2: integer;
  370. X      begin
  371. X        write_debug('%e_less_n');
  372. X        result := '';
  373. X        if eval_number(p1,a1) and eval_number(p2,a2) then begin
  374. X           if a1 < a2 then result := 'TRUE';
  375. X        end;                           `032
  376. X        write_debug('%e_less_n - result: ',result);
  377. X        e_less_n := result;
  378. X      end; `123 e_less_n `125
  379. X
  380. X      function e_number_n(p1: integer): string_t;
  381. X      var result: string_t;
  382. X          a1: integer;
  383. X      begin
  384. X        write_debug('%e_number_n');
  385. X        result := '';
  386. X        if eval_number(p1,a1) then writev(result,a1:1);
  387. X        write_debug('%e_number_n - result: ',result);
  388. X        e_number_n := result;
  389. X      end; `123 e_number_n `125
  390. X
  391. X      function e_heal(p1: integer): string_t;
  392. X      var result: string_t;
  393. X         a1: integer;
  394. X      begin
  395. X         write_debug('%e_heal');
  396. X         result := '';
  397. X         if eval_number(p1,a1) and privilegion then
  398. X            if a1 >= 0 then
  399. X               if int_heal(myname,a1) then writev(result,a1:1);
  400. X         write_debug('%e_heal - result: ',result);
  401. X         e_heal := result;
  402. X      end; `123 e_heal `125
  403. X
  404. X      function e_all_players: string_t;
  405. X      var result: string_t;
  406. X      begin
  407. X         write_debug('%e_all_players');
  408. X         result := int_l_player;
  409. X         write_debug('%e_all_players - result: ',result);
  410. X         e_all_players := result;
  411. X      end;
  412. X
  413. X
  414. X      function e_all_objects: string_t;
  415. X      var result: string_t;
  416. X      begin
  417. X         write_debug('%e_all_objects');
  418. X         result := int_l_object;
  419. X         write_debug('%e_all_objects - result: ',result);
  420. X         e_all_objects := result;
  421. X      end;
  422. X
  423. X      function e_all_rooms: string_t;
  424. X      var result: string_t;
  425. X      begin
  426. X         write_debug('%e_all_rooms');
  427. X         result := int_l_room;
  428. X         write_debug('%e_all_rooms - result: ',result);
  429. X         e_all_rooms := result;
  430. X      end;`032
  431. X
  432. X      function e_include(p1,p2: integer): string_t;
  433. X      var a1,a2,result: string_t;
  434. X      begin
  435. X         write_debug('%e_include');
  436. X         a1 := eval_atom(p1);
  437. X         a2 := eval_atom(p2);
  438. X         write_debug('%e_include - p1: ',a1);
  439. X         write_debug('%            p2: ',a2);
  440. X         if index(a1,a2) >0 then result := a2
  441. X         else result := '';
  442. X         write_debug('%e_include - result: ',result);
  443. X         e_include := result;
  444. X      end; `123 e_include `125
  445. X
  446. X      function e_string_head(p1: integer; c: char): string_t;
  447. X      var a1,result: string_t;
  448. X          i: integer;
  449. X      begin
  450. X         write_debug('%e_string_head');
  451. X         a1 := eval_atom(p1);
  452. X         write_debug('%e_string_head - p1: ',a1);
  453. X`009 write_debug('%                char: ',c);
  454. X         i := index(a1,c);
  455. X         if i = 0 then i := length(a1)+1;
  456. X         result := substr(a1,1,i-1);
  457. X         write_debug('%string_head - result: ',result);
  458. X         e_string_head := result;
  459. X      end; `123 e_string_head `125
  460. X
  461. X      function e_string_tail(p1: integer; c: char): string_t;
  462. X      var a1,result: string_t;
  463. X          i,n: integer;
  464. X      begin
  465. X         write_debug('%e_string_tail');
  466. X         a1 := eval_atom(p1);
  467. X         write_debug('%e_string_tail - p1: ',a1);
  468. X`009 write_debug('%                char: ',c);
  469. X         i := index(a1,c);
  470. X         if i = 0 then i := length(a1)+1;
  471. X         n := length(a1) - i;
  472. X         if n <= 0 then result := ''
  473. X         else result := substr(a1,i+1,n);
  474. X         write_debug('%string_tail - result: ',result);
  475. X         e_string_tail := result;
  476. X      end; `123 e_string_tail `125
  477. X
  478. X      function e_lookup_player (p1: integer): string_t;
  479. X      var result: string_t;
  480. X      begin
  481. X         write_debug('%e_lookup_player');
  482. X`009 result := meta_do(p1,int_lookup_player);
  483. X         write_debug('%e_lookup_player result: ',result);
  484. X         e_lookup_player := result
  485. X      end; `123 e_lookup_player `125
  486. X
  487. X      function e_lookup_object (p1: integer): string_t;
  488. X      var result: string_t;
  489. X      begin
  490. X         write_debug('%e_lookup_object');
  491. X`009 result := meta_do(p1,int_lookup_object);
  492. X         write_debug('%e_lookup_player result: ',result);
  493. X         e_lookup_object := result
  494. X      end; `123 e_lookup_object `125
  495. X
  496. X      function e_lookup_room (p1: integer): string_t;
  497. X      var list,result: string_t;
  498. X          atom,fill: atom_t;
  499. X          index: integer;
  500. X      begin
  501. X         write_debug('%e_lookup_room');
  502. X`009 result := meta_do(p1,int_lookup_room);
  503. X         write_debug('%e_lookup_room result: ',result);
  504. X         e_lookup_room := result
  505. X      end; `123 e_lookup_room `125
  506. X
  507. X      function e_lookup_direction (p1: integer): string_t;
  508. X      var list,result: string_t;
  509. X          atom,fill: atom_t;
  510. X          index: integer;
  511. X      begin
  512. X         write_debug('%e_lookup_direction');
  513. X`009 result := meta_do(p1,int_lookup_direction);
  514. X         write_debug('%e_lookup_direction result: ',result);
  515. X         e_lookup_direction := result
  516. X      end; `123 e_lookup_direction `125
  517. X
  518. X    function same_room(player: atom_t): boolean;
  519. X    var room: atom_t;
  520. X    begin
  521. X`009write_debug('%same_room: ',player);
  522. X`009room := int_where(player);
  523. X`009same_room :=`032
  524. X`009    (int_where(myname) = room) or
  525. X`009    (int_where(monster) = room);
  526. X    end; `123 same_room `125
  527. X`009   `032
  528. X      function e_submit(p1,p2: integer; label_name: atom_t): string_l;
  529. X      var r2,result: string_l;
  530. X          r1: integer;
  531. X      begin
  532. X         write_debug('%e_submit');
  533. X         write_debug('%e_submit - label_name:',label_name);
  534. X         if eval_number(p1,r1) then begin
  535. X            r2 := eval_atom(p2);
  536. X            write_debug('%e_submit - p2: ',r2);
  537. X            if length (r2) > atom_length then`032
  538. X               r2 := substr(r2,1,atom_length);
  539. X            if not same_room (r2) and
  540. X               not int_ask_privilege(monster,'manager') and
  541. X`009       not system_code then
  542. X               result := ''
  543. X            else if send_submit(monster,
  544. X`009`009pool`091buffer`093.current_program,label_name,r1,r2) then
  545. X               writev(result,r1:1)
  546. X            else result := '';          `032
  547. X         end else result := '';
  548. X         write_debug('%e_submit - result:',result);
  549. X         e_submit := result;
  550. X      end; `123 e_submit `125
  551. X
  552. X      function e_privilege (p1,p2: integer): string_t;
  553. X      var result,name: string_t;
  554. X
  555. X`009function action(atom: atom_t): atom_t;
  556. X`009begin
  557. X`009    if int_ask_privilege(name,atom) then action := atom
  558. X`009    else action := '';
  559. X`009end;
  560. X
  561. X      begin
  562. X         write_debug('%e_privilege');
  563. X         name := eval_atom (p1);
  564. X         write_debug('%e_privilege - p1: ',name);
  565. X`009 result := meta_do(p2,action);
  566. X         write_debug('%e_privilege result: ',result);
  567. X         e_privilege := result
  568. X      end; `123 e_privilege `125
  569. X
  570. X      function e_parse_player(p1: integer): string_t;
  571. X      var list,result: string_t;
  572. X
  573. X`009    function action(s: atom_t; id: integer): boolean;
  574. X`009    begin
  575. X`009`009add_atom(result,s);
  576. X`009`009action := true;
  577. X`009    end;
  578. X
  579. X`009    function undo(id: integer): boolean;
  580. X`009    begin undo := true; end;
  581. X
  582. X      begin
  583. X`009    write_debug('%e_parse_player');
  584. X`009    list := eval_atom(p1);
  585. X`009    write_debug('%e_parse_player - p1: ',list);
  586. X`009    result := '';
  587. X`009    scan_pers(action,list,TRUE,undo);
  588. X`009    write_debug('%e_parse_player result: ',result);
  589. X`009    e_parse_player := result;
  590. X      end; `123 e_parse_player `125
  591. X
  592. X      function e_parse_object(p1: integer):string_t;
  593. X      var list,result: string_t;
  594. X
  595. X`009    function action(s: atom_t; id: integer): boolean;
  596. X`009    begin
  597. X`009`009add_atom(result,s);
  598. X`009`009action := true;
  599. X`009    end;
  600. X
  601. X`009    function undo(id: integer): boolean;
  602. X`009    begin undo := true; end;
  603. X
  604. X      begin
  605. X`009    write_debug('%e_parse_object');
  606. X`009    list := eval_atom(p1);
  607. X`009    write_debug('%e_parse_object - p1: ',list);
  608. X`009    result := '';
  609. X`009    scan_obj(action,list,TRUE,undo);
  610. X`009    write_debug('%e_parse_object result: ',result);
  611. X`009    e_parse_object := result;
  612. X      end; `123 e_parse_object `125
  613. X
  614. X      function e_parse_room(p1: integer):string_t;`032
  615. X      var list,result: string_t;
  616. X
  617. X`009    function action(s: atom_t; id: integer): boolean;
  618. X`009    begin
  619. X`009`009add_atom(result,s);
  620. X`009`009action := true;
  621. X`009    end;
  622. X
  623. X`009    function undo(id: integer): boolean;
  624. X`009    begin undo := true; end;
  625. X
  626. X      begin
  627. X`009    write_debug('%e_parse_room');
  628. X`009    list := eval_atom(p1);
  629. X`009    write_debug('%e_parse_room - p1: ',list);
  630. X`009    result := '';
  631. X`009    scan_room(action,list,TRUE,undo);
  632. X`009    write_debug('%e_parse_room result: ',result);
  633. X`009    e_parse_room := result;
  634. X      end; `123 e_parse_room `125
  635. X
  636. X    function e_for(variable: atom_t; p1,p2: integer): string_t;
  637. X    var result: string_t;
  638. X
  639. X`009function action(atom: atom_t): atom_t;
  640. X`009begin
  641. X`009    set_variable(variable,atom);
  642. X`009    if eval_atom(p2) > '' then action := atom
  643. X`009    else action := '';
  644. X`009end;
  645. X
  646. X    begin
  647. X`009write_debug('%e_for');
  648. X`009write_debug('%e_for - variable: ',variable);
  649. X`009define_variable(variable);
  650. X`009result := meta_do(p1,action);
  651. X`009write_debug('%e_for result: ',result);
  652. X`009e_for := result;
  653. X    end; `123 e_for `125
  654. X`009
  655. X    function e_userid (p1: integer): string_t;
  656. X    var result: string_t;
  657. X    begin
  658. X`009write_debug('%e_userid');
  659. X        result := '';
  660. X        if int_ask_privilege(monster,'experience') or system_code then
  661. X`009    result := meta_do(p1,int_userid);
  662. X        write_debug('%e_userid result: ',result);
  663. X        e_userid := result
  664. X    end; `123 e_userid `125
  665. X
  666. X    function e_list(params: paramtable): string_t;
  667. X    var result: string_t;
  668. X`009i: integer;
  669. X
  670. X`009function action(atom: atom_t): atom_t;
  671. X`009begin
  672. X`009    add_atom(result,atom);
  673. X`009    action := '';
  674. X`009end;
  675. X
  676. X    begin
  677. X`009write_debug('%e_list');
  678. X`009result := '';
  679. X`009for i := 1 to count_params(params) do`032
  680. X`009    meta_do(params`091i`093,action);
  681. X`009write_debug('%e_list result: ',result);
  682. X`009e_list := result;
  683. X    end;
  684. X
  685. X    function e_mattack(p1,p2: integer):string_t;
  686. X    var a,result: string_t;
  687. X`009b: integer;
  688. X`009manager: boolean;
  689. X    begin
  690. X`009write_debug('%e_mattack');
  691. X`009a := eval_atom(p1);
  692. X`009write_debug('%e_mattack - p1: ',a);
  693. X`009manager := int_ask_privilege(monster,'manager') or system_code;
  694. X`009if length(a) > atom_length then a := substr(a,1,atom_length);
  695. X`009if (int_get_code(a) = 0) or`032
  696. X`009    not privilegion or
  697. X`009    ( not same_room(a) and
  698. X`009      not manager )
  699. X`009    then result := ''
  700. X`009else if not eval_number(p2,b) then result := ''
  701. X`009else if b < 0 then result := ''
  702. X`009else if not int_attack(a,b) then result := ''
  703. X`009else writev(result,b:1);
  704. X`009write_debug('%e_mattack result : ',result);
  705. X`009e_mattack := result
  706. X    end; `123 e_mattack `125
  707. X`009   `032
  708. X    function e_mheal(p1,p2: integer):string_t;
  709. X    var a,result: string_t;
  710. X`009b,code: integer;
  711. X`009manager: boolean;
  712. X    begin
  713. X`009write_debug('%e_mheal');
  714. X`009a := eval_atom(p1);
  715. X`009write_debug('%e_mheal - p1: ',a);
  716. X`009manager := int_ask_privilege(monster,'manager') or system_code;
  717. X`009if length(a) > atom_length then a := substr(a,1,atom_length);
  718. X`009code := int_get_code(a);
  719. X`009if (code = 0) or
  720. X`009    not privilegion or
  721. X`009    ((code = pool`091buffer`093.current_program) and`032
  722. X`009      not manager
  723. X`009    ) or`032
  724. X`009    ( not same_room(a) and
  725. X`009      not manager
  726. X`009    ) then result := ''
  727. X`009else if not eval_number(p2,b) then result := ''
  728. X`009else if b < 0 then result := ''
  729. X`009else if not int_heal(a,b) then result := ''
  730. X`009else writev(result,b:1);
  731. X`009write_debug('%e_mheal result : ',result);
  732. X`009e_mheal := result
  733. X    end; `123 e_mheal `125
  734. X
  735. X    function e_prog(params: paramtable): string_t;
  736. X    var i: integer;
  737. X`009result : string_t;
  738. X    begin
  739. X`009write_debug('%e_prog');
  740. X`009result := '';
  741. X`009for i := 1 to count_params(params) do result := eval_atom(params`091i`09
  742. V3);
  743. X`009write_debug('%e_prog result : ',result);
  744. X`009e_prog := result;
  745. X    end; `123 e_prog `125
  746. X
  747. X    function e_spell_level: string_t;
  748. X    var lev: integer;
  749. X`009result : string_t;
  750. X    begin
  751. X`009write_debug('%e_spell_level');
  752. X`009if spell_name = '' then result := ''
  753. X        else begin
  754. X`009    lev := int_spell_level(summoner_name,spell_name);
  755. X`009    if lev = -1 then result := ''
  756. X`009    else writev(result,lev:1);
  757. X`009end;
  758. X`009write_debug('%e_spell_level result : ',result);
  759. X`009e_spell_level := result;
  760. X    end; `123 e_spell_level `125
  761. X
  762. X    function e_set_spell_level(p: integer): string_t;
  763. X    var lev: integer;
  764. X`009result : string_t;
  765. X    begin
  766. X`009write_debug('%e_set_spell_level');
  767. X`009if spell_name = '' then result := ''
  768. X`009else if not eval_number(p,lev) then result := ''
  769. X`009else if lev < 0 then result := ''
  770. X        else if not int_set_spell_level(summoner_name,spell_name,lev) then r
  771. Vesult := ''
  772. X`009else  writev(result,lev:1);
  773. X`009write_debug('%e_set_spell_level result : ',result);
  774. X`009e_set_spell_level := result;
  775. X    end; `123 e_set_spell_level `125
  776. X
  777. X
  778. X      `123`009   `032
  779. X      function eval_function (name: atom_t; params: paramtable): string_t;
  780. X      var result: string_t;
  781. X          found: boolean;
  782. X`009  r1,r2,r3: string_t;
  783. X`009  p1,p2,p3: integer;
  784. X      begin
  785. X         write_debug('%eval_function: ',name);
  786. X`009 p1 := params`0911`093;
  787. X`009 p2 := params`0912`093;
  788. X`009 p3 := params`0913`093;
  789. X         result := '';
  790. X         if name = '+' then result := e_plus(params)
  791. X         else if name = '=' then result := e_equal(p1,p2)
  792. X         else if name = 'inv' then result := e_inv
  793. X         else if name = 'pinv' then result := e_pinv
  794. X         else if name = 'players' then result := e_players
  795. X         else if name = 'objects' then result := e_objects
  796. X         else if name = 'get' then result := e_get (p1)
  797. X         else if name = 'pget' then result := e_pget (p1)
  798. X         else if name = 'drop' then result := e_drop (p1)
  799. X         else if name = 'pdrop' then result := e_pdrop (p1)
  800. X         else if name = 'and' then result := e_and (p1,p2)
  801. X         else if name = 'or' then result := e_or (p1,p2,p3)
  802. X         else if name = 'move' then result := e_move (p1)
  803. X         else if name = 'pmove' then result := e_pmove (p1)
  804. X         else if name = 'pprint' then result := e_pprint (params,false)
  805. X         else if name = 'print' then result := e_print (params,false)
  806. X         else if name = 'oprint' then result := e_oprint (params,false)
  807. X         else if name = 'pprint raw' then result := e_pprint (params,true)
  808. X         else if name = 'print raw' then result := e_print (params,true)
  809. X         else if name = 'oprint raw' then result := e_oprint (params,true)
  810. X         else if name = 'print null' then result := e_print_null (params)
  811. X         else if name = 'if' then result := e_if (p1,p2,p3)
  812. X         else if name = 'where' then result := e_where (p1)
  813. X         else if name = 'null' then result := e_null (params)
  814. X         else if name = 'attack' then result := e_attack (p1)
  815. X         else if name = 'heal' then result := e_heal (p1)
  816. X         else if name = 'not' then result := e_not (p1)
  817. X         else if name = 'random' then result := e_random (p1)
  818. X         else if name = 'strip' then result := e_strip(p1)
  819. X         else if name = 'experience' then result := e_experience(p1)
  820. X         else if name = 'plus' then result := e_plus_n(p1,p2)
  821. X         else if name = 'difference' then result := e_difference_n(p1,p2)
  822. X         else if name = 'times' then result := e_times_n(p1,p2)
  823. X         else if name = 'quotient' then result := e_quotient_n(p1,p2)
  824. X         else if name = 'set experience' then result := e_set_experience(p1)
  825. X         else if name = 'get state' then result := e_get_state
  826. X         else if name = 'set state' then result := e_set_state(p1)
  827. X         else if name = 'less' then result := e_less_n(p1,p2)
  828. X         else if name = 'number' then result := e_number_n(p1)
  829. X         else if name = 'health' then result := e_health(p1)
  830. X
  831. X         else if name = 'all objects' then result := e_all_objects
  832. X         else if name = 'all rooms' then result := e_all_rooms
  833. X         else if name = 'all players' then result := e_all_players`032
  834. X
  835. X         else if name = 'control' then result := e_control(p1,p2)
  836. X         else if name = 'include' then result := e_include(p1,p2)
  837. X         else if name = 'exclude' then result := e_exclude(p1,p2)
  838. X         else if name = 'get remote state' then`032
  839. X            result := e_get_remote_state(p1)
  840. X         else if name = 'set remote state' then
  841. X            result := e_set_remote_state(p1,p2)
  842. X         else if name = 'remote players' then result := e_remote_players(p1)
  843. X         else if name = 'remote objects' then result := e_remote_objects(p1)
  844. X
  845. X         else if name = 'duplicate'  then result := e_duplicate(p1)
  846. X         else if name = 'pduplicate' then result := e_pduplicate(p1)
  847. X         else if name = 'destroy'    then result := e_destroy(p1)
  848. X         else if name = 'pdestroy'   then result := e_pdestroy(p1)
  849. X         else if name = 'string head' then result := e_string_head(p1,' ')
  850. X         else if name = 'string tail' then result := e_string_tail(p1,' ')
  851. X         else if name = 'head' then result := e_string_head(p1,',')
  852. X         else if name = 'tail' then result := e_string_tail(p1,',')
  853. X         else if name = 'lookup object' then result := e_lookup_object(p1)
  854. X         else if name = 'lookup player' then result := e_lookup_player(p1)
  855. X         else if name = 'lookup room' then result := e_lookup_room(p1)
  856. X`009 else if name = 'privilege' then result := e_privilege(p1,p2)
  857. X`009 else if name = 'parse player' then result := e_parse_player(p1)
  858. X`009 else if name = 'parse object' then result := e_parse_object(p1)
  859. X`009 else if name = 'parse room' then result   := e_parse_room(p1)
  860. X`009 else if name = 'userid' then result       := e_userid(p1)
  861. X`009 else if name = 'list' then result`009   := e_list(params)
  862. X`009 else if name = 'mattack' then result      := e_mattack(p1,p2)
  863. X`009 else if name = 'mheal' then result        := e_mheal(p1,p2)
  864. X
  865. X         else if index(name,'SUBMIT ') = 1 then
  866. X            if length(name) > 7 then begin`032
  867. X               result := e_submit(p1,p2,substr(name,8,length(name)-7));
  868. X            end else begin
  869. X                 result := '';
  870. X                 error_counter := error_counter +1
  871. X            end     `032
  872. X         else if index(name,'FOR ') = 1 then
  873. X            if length(name) > 4 then begin`032
  874. X               result := e_for(substr(name,5,length(name)-4),p1,p2);
  875. X            end else begin
  876. X                 result := '';
  877. X                 error_counter := error_counter +1
  878. X            end     `032
  879. X         else if index(name,'GOSUB ') = 1 then          `032
  880. X            if length(name) > 6 then begin
  881. X               r1 := eval_atom(p1);
  882. X               r2 := eval_atom(p2);
  883. X               r3 := eval_atom(p3);
  884. X               define_variable('p1');
  885. X               define_variable('p2');
  886. X               define_variable('p3');
  887. X               set_variable('p1',r1);
  888. X               set_variable('p2',r2);
  889. X               set_variable('p3',r3);
  890. X`009`009
  891. X               result := goto_label (substr(name,7,length(name)-6),found)
  892. X            end else begin
  893. X                 result := '';
  894. X                 error_counter := error_counter +1
  895. X            end     `032
  896. X         else if index(name,'DEFINE ') = 1 then begin
  897. X            if length(name) > 7 then
  898. X               define_variable (substr(name,8,length(name)-7))
  899. X            else begin
  900. X                 result := '';
  901. X                 error_counter := error_counter +1
  902. X            end;
  903. X            result := eval_atom(p1)
  904. X         end else if index(name,'SET ') = 1 then begin
  905. X            result := eval_atom(p1);
  906. X            if length(name) > 4 then
  907. X              set_variable (substr(name,5,length(name)-4),result)
  908. X            else begin
  909. X                 result := '';
  910. X                 error_counter := error_counter +1
  911. X            end
  912. X         end else if index(name,'LABEL ') = 1 then
  913. X            result := eval_atom(p1)
  914. X         else begin
  915. X                 result := '';
  916. X                 error_counter := error_counter +1
  917. X            end;
  918. X         write_debug('%eval_function result: ',result);
  919. X         if debug then writeln('%                  ec: ',error_counter:1);
  920. X         eval_function:= clean_spaces (result);
  921. X      end;
  922. X      `125
  923. X
  924. X    function eval_function (name: integer; params: paramtable): string_t;
  925. X    var result: string_t;
  926. X`009found: boolean;
  927. X`009r1,r2,r3: string_t;
  928. X`009p1,p2,p3: integer;
  929. X    begin
  930. X`009write_debug('%eval_function: ',ftable`091name`093.name);
  931. X`009p1 := params`0911`093;
  932. X`009p2 := params`0912`093;
  933. X`009p3 := params`0913`093;
  934. X`009result := '';
  935. X`009case name of
  936. X`009    1: `123 + `125`009result := e_plus(params);
  937. X`009    2: `123 = `125`009result := e_equal2(p1,p2);
  938. X`009    3: `123 inv `125`009result := e_inv;
  939. X`009    4: `123 pinv `125`009result := e_pinv;
  940. X`009    5: `123 players `125  result := e_players;
  941. X`009    6: `123 objects `125  result := e_objects;
  942. X`009    7: `123 get `125`009result`009:= e_get (p1);
  943. X`009    8: `123 pget `125 result`009:= e_pget (p1);
  944. X`009    9: `123 drop `125 result`009:= e_drop (p1);
  945. X`009    10: `123 pdrop `125   result := e_pdrop (p1);
  946. X`009    11: `123 and `125 result`009:= e_and (p1,p2);
  947. X`009    12: `123 or `125`009result := e_or (p1,p2,p3);
  948. X`009    13: `123 move `125    result := e_move (p1);
  949. X`009    14: `123 pmove `125   result := e_pmove (p1);
  950. X`009    15: `123 pprint `125  result := e_pprint (params,false);
  951. X`009    16: `123 print `125   result := e_print (params,false);
  952. X`009    17: `123 oprint `125  result := e_oprint (params,false);
  953. X`009    18: `123 pprint raw `125`009result := e_pprint (params,true);
  954. X`009    19: `123 print raw `125`009result := e_print (params,true);
  955. X`009    20: `123 oprint raw `125`009result := e_oprint (params,true);
  956. X`009    21: `123 print null `125`009result := e_print_null (params);
  957. X`009    22: `123if `125`009result := e_if (p1,p2,p3);
  958. X`009    23: `123 where `125   result := e_where (p1);
  959. X`009    24: `123 null `125    result := e_null (params);
  960. X`009    25: `123 attack `125  result := e_attack (p1);
  961. X`009    26: `123 heal `125    result := e_heal (p1);
  962. X`009    27: `123 not `125`009    result := e_not (p1);
  963. X`009    28: `123 random `125  result := e_random (p1);
  964. X`009    29: `123 strip `125   result := e_strip(p1);
  965. X`009    30: `123 experience `125`009    result := e_experience(p1);
  966. X`009    31: `123 plus `125`009    result := e_plus_n(p1,p2);
  967. X`009    32: `123 difference `125`009    result := e_difference_n(p1,p2);
  968. X`009    33: `123 times `125`009    result := e_times_n(p1,p2);
  969. X`009    34: `123 quotient `125`009    result := e_quotient_n(p1,p2);
  970. X`009    35: `123 set experience `125  result := e_set_experience(p1);
  971. X`009    36: `123 get state `125`009    result := e_get_state;
  972. X`009    37: `123 set state `125`009    result := e_set_state(p1);
  973. X`009    38: `123 less `125`009    result := e_less_n(p1,p2);
  974. X`009    39: `123 number `125`009    result := e_number_n(p1);
  975. X`009    40: `123 health `125`009    result := e_health(p1);
  976. X
  977. X`009    41: `123 all objects `125`009    result := e_all_objects;
  978. X`009    42: `123 all rooms `125`009    result := e_all_rooms;
  979. X`009    43: `123 all players `125`009    result := e_all_players;
  980. X
  981. X`009    44: `123 control `125`009    result := e_control(p1,p2);
  982. X`009    69: `123 include `125`009    result := e_include(p1,p2);
  983. X`009    45: `123 exclude `125`009    result := e_exclude(p1,p2);
  984. X`009    46: `123 get remote state `125`032
  985. X`009`009result := e_get_remote_state(p1);
  986. X`009    47: `123 set remote state `125
  987. X`009`009result := e_set_remote_state(p1,p2);
  988. X`009    48: `123 remote players `125  result := e_remote_players(p1);
  989. X`009    49: `123 remote objects `125  result := e_remote_objects(p1);
  990. X
  991. X`009    50: `123 duplicate `125`009result := e_duplicate(p1);
  992. X`009    51: `123 pduplicate `125`009result := e_pduplicate(p1);
  993. X`009    52: `123 destroy `125`009result := e_destroy(p1);
  994. X`009    53: `123 pdestroy `125`009result := e_pdestroy(p1);
  995. X`009    54: `123 string head `125`009result := e_string_head(p1,' ');
  996. X`009    55: `123 string tail `125`009result := e_string_tail(p1,' ');
  997. X`009    56: `123 head `125`009result := e_string_head(p1,',');
  998. X`009    57: `123 tail `125`009result := e_string_tail(p1,',');
  999. X`009    58: `123 lookup object `125   result := e_lookup_object(p1);
  1000. X`009    59: `123 lookup player `125   result := e_lookup_player(p1);
  1001. X`009    60: `123 lookup room `125`009result := e_lookup_room(p1);
  1002. X`009    61: `123 privilege `125`009result := e_privilege(p1,p2);
  1003. X`009    62: `123 parse player `125    result := e_parse_player(p1);
  1004. X`009    63: `123 parse object `125    result := e_parse_object(p1);
  1005. X`009    64: `123 parse room `125`009    result := e_parse_room(p1);
  1006. X`009    65: `123 userid `125`009    result := e_userid(p1);
  1007. X`009    66: `123 list `125`009    result := e_list(params);
  1008. X`009    67: `123 mattack `125`009    result := e_mattack(p1,p2);
  1009. X`009    68: `123 mheal `125`009    result := e_mheal(p1,p2);
  1010. X`009    ERROR_ID: `123 -ERROR- `125  begin
  1011. X`009`009result := '';
  1012. X`009`009error_counter := error_counter +1;
  1013. X`009    end;
  1014. X`009    71: `123 lookup direction `125 result := e_lookup_direction(p1);
  1015. X`009    72: `123 prog `125 result := e_prog (params);
  1016. X`009    73: `123 get global flag `125 result := e_get_global_flag(p1);
  1017. X`009    74: `123 == `125 result := e_equal(p1,p2);
  1018. X`009    75: `123 === `125 result := e_equal3(p1,p2);
  1019. X`009    76: `123 spell level `125 result := e_spell_level;
  1020. X`009    77: `123 set spell level `125 result := e_set_spell_level(p1);
  1021. X`009end; `123 case `125
  1022. X
  1023. X`009write_debug('%eval_function result: ',result);
  1024. X`009if debug then writeln('%                  ec: ',error_counter:1);
  1025. X`009eval_function:= clean_spaces (result);
  1026. X    end; `123 eval_function `125
  1027. X     `032
  1028. X    function eval_header(code: integer; par: atom_t; params: paramtable):`03
  1029. V2
  1030. X`009string_t;
  1031. X    var`009result: string_t;
  1032. X`009 found: boolean;
  1033. X`009 r: array `091 1 .. max_param`093 of string_t;
  1034. X`009 p1,p2,p3,i,n: integer;
  1035. X`009 temp: atom_t;
  1036. X    begin
  1037. X`009 write_debug('%eval_header: ',htable`091code`093.name);
  1038. X`009 write_debug('%           : ',par);
  1039. X`009 p1 := params`0911`093;
  1040. X`009 p2 := params`0912`093;
  1041. X`009 p3 := params`0913`093;
  1042. X`009 result := '';
  1043. X`009case(code) of
  1044. X`009    1: `123 SUBMIT `125 result := e_submit(p1,p2,par);
  1045. X`009    2: `123 FOR `125`009result := e_for(par,p1,p2);
  1046. X`009    3: `123 GOSUB  `125 begin
  1047. X`009`009for i := 1 to max_param do r`091i`093 := '';
  1048. X`009`009n := count_params(params);
  1049. X`009`009for i := 1 to n do r`091i`093 := eval_atom(params`091i`093);
  1050. X`009`009define_variable('p1');
  1051. X`009`009define_variable('p2');
  1052. X`009`009define_variable('p3');
  1053. X`009`009for i := 4 to n do begin
  1054. X`009`009    writev(temp,'p',i:1);
  1055. X`009`009    define_variable(temp);
  1056. X`009`009end;
  1057. X`009`009set_variable('p1',r`0911`093);
  1058. X`009`009set_variable('p2',r`0912`093);
  1059. X`009`009set_variable('p3',r`0913`093);
  1060. X`009`009for i := 4 to n do begin
  1061. X`009`009    writev(temp,'p',i:1);
  1062. X`009`009    set_variable(temp,r`091i`093);
  1063. X`009`009end;
  1064. X`009`009result := goto_label (par,found)
  1065. X            end;
  1066. X`009    4: `123 DEFINE `125 begin
  1067. X`009`009define_variable (par);
  1068. X`009`009result := eval_atom(p1);
  1069. X`009    end;
  1070. X`009    5: `123 SET `125 begin
  1071. X`009`009result := eval_atom(p1);
  1072. X`009`009set_variable (par,result);
  1073. X            end;
  1074. X`009    6: `123 LABEL  `125 result := e_prog (params);
  1075. X`009end; `123 case `125
  1076. X`009write_debug('%eval_header result: ',result);
  1077. X`009if debug then writeln('%                  ec: ',error_counter:1);
  1078. X`009eval_header:= clean_spaces (result);
  1079. X      end;
  1080. X     `032
  1081. X`009function eval_gosub(address: integer; params: paramtable): string_t;
  1082. X`009var result: string_t;
  1083. X`009    temp: atom_t;
  1084. X`009    r: array `091 1 .. max_param`093 of string_t;
  1085. X`009    i,n: integer;
  1086. X`009begin
  1087. X`009    if debug then writeln('%eval_gosub: ',address:1);
  1088. X`009    for i := 1 to max_param do r`091i`093 := '';
  1089. X`009    n := count_params(params);
  1090. X`009`009for i := 1 to n do r`091i`093 := eval_atom(params`091i`093);
  1091. X`009`009define_variable('p1');
  1092. X`009`009define_variable('p2');
  1093. X`009`009define_variable('p3');
  1094. X`009`009for i := 4 to n do begin
  1095. X`009`009    writev(temp,'p',i:1);
  1096. X`009`009    define_variable(temp);
  1097. X`009`009end;
  1098. X`009`009set_variable('p1',r`0911`093);
  1099. X`009`009set_variable('p2',r`0912`093);
  1100. X`009`009set_variable('p3',r`0913`093);
  1101. X`009`009for i := 4 to n do begin
  1102. X`009`009    writev(temp,'p',i:1);
  1103. X`009`009    set_variable(temp,r`091i`093);
  1104. X`009`009end;
  1105. X`009`009result := eval_atom(address);
  1106. X`009`009write_debug('%eval_gosub result: ',result);
  1107. X`009`009eval_gosub := clean_spaces (result);
  1108. X`009end; `123 eval_gosub `125
  1109. X                              `032
  1110. X      function eval_atom; `123 (item: integer): string_t; `125
  1111. X      var bf: string_t;                              `032
  1112. X
  1113. X         var_pointer: integer;
  1114. X
  1115. X         procedure eval_step;                              `032
  1116. X         begin
  1117. X            write_debug('%eval_step');
  1118. X            eval_count := eval_count +1;
  1119. X            if eval_count mod event_check = 0 then checkevents(true);
  1120. X            if eval_count >= MAXEVAL then begin           `032
  1121. X               WriteLn ('Error in monster code - out of time.');
  1122. X               goto 1
  1123. X            end
  1124. X         end; `123 eval_step `125
  1125. X
  1126. X      begin
  1127. X         write_debug('%eval_atom ENTER');
  1128. X         var_pointer := var_count;`032
  1129. X         eval_step;
  1130. X         if item = 0 then eval_atom := ''
  1131. X         else with pool`091buffer`093.table`091item`093 do begin
  1132. X`009    `123
  1133. X            if long_name=nil then atom_name := name
  1134. X            else atom_name := long_name`094;
  1135. X            if atom_name = '' then eval_atom := ''
  1136. X            else if atom_name = '-' then`032
  1137. X               eval_atom := eval_atom(params`0911`093)
  1138. X            else if atom_name`0911`093 = '"' then`032
  1139. X               eval_atom := clean_spaces
  1140. X`009`009    (substr(atom_name,2,length(atom_name)-2))
  1141. X            else if atom_name`0911`093 = '_' then`032
  1142. X
  1143. X               eval_atom := eval_variable(substr(atom_name,2,
  1144. X                  length(atom_name)-1))
  1145. X            else eval_atom := clean_spaces(eval_function (atom_name,params))
  1146. V;`032
  1147. X`009    `125
  1148. X`009    case nametype of`032
  1149. X`009`009n_function: eval_atom := eval_function(name,params);
  1150. X`009`009n_header:   eval_atom := eval_header(name,long_name`094,params);
  1151. X`009`009n_variable: eval_atom := eval_variable(long_name`094);
  1152. X`009`009n_gosub:    eval_atom := eval_gosub(name,params);
  1153. X`009`009n_const:    eval_atom := long_name`094;
  1154. +-+-+-+-+-+-+-+-  END  OF PART 15 +-+-+-+-+-+-+-+-
  1155.