home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part24 < 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 24/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.074900.11884@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 07:49:00 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1382
  12.  
  13. Archieve-name: monster_helsinki_104/part24
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 24/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 24 -+-+-+-+-+-+-+-+
  20. X`009    if reset_object(oid) then writeln(s,' moved to home position.')
  21. X`009    else writeln('Failing to reset ',s);
  22. X
  23. X`009end;
  24. X`009action := true;
  25. X`009checkevents(TRUE);
  26. X`009if oldloc <> location then goto 0; `123 panic `125
  27. X    end; `123 action `125
  28. X
  29. X    function restriction (n: integer): boolean;
  30. X`009begin
  31. X`009`009restriction := true;
  32. X`009end;
  33. X
  34. X    procedure leave;
  35. X    begin
  36. X`009writeln('EXIT');
  37. X`009goto 0;
  38. X    end;
  39. X
  40. Xbegin
  41. X
  42. X`009if s = '' then grab_line('Object? ',s,eof_handler := leave);
  43. X
  44. X`009oldloc := location;
  45. X`009if not is_owner(location,TRUE) then begin
  46. X`009`009writeln('You may only work on your objects when you are in one of yo
  47. Vur own rooms.');
  48. X`009end else if scan_obj(action,s,,restriction) then begin
  49. X`009end else writeln ('To move object to home position use RESET <object nam
  50. Ve>');
  51. X`0090:  `123 for panic `125
  52. Xend; `123 do_reset `125
  53. X
  54. X`123 alaises `125
  55. X
  56. Xprocedure alias_list(s: string);
  57. Xlabel 0;
  58. X    procedure leave;
  59. X    begin
  60. X`009writeln('QUIT');
  61. X`009goto 0;
  62. X    end;
  63. Xvar what: shortstring;
  64. X    g: o_type;
  65. X
  66. Xbegin
  67. X    if s = '' then grab_line('List what? ',s,eof_handler := leave);
  68. X    if s > '' then begin
  69. X`009what := bite(s);
  70. X`009if lookup_type(g,what,true,true) then case g of
  71. X`009    t_room:`009do_rooms(s);
  72. X`009    t_object:`009do_objects(s);
  73. X`009    t_monster:`009do_monsters(s);
  74. X`009    t_spell:`009do_spells(s);
  75. X`009    t_player:   do_players(s);
  76. X`009end `123 case `125
  77. X`009else writeln('You can''t do that.');
  78. X    end else writeln('You can''t do that.');
  79. X    0:`032
  80. Xend;
  81. X
  82. Xprocedure alias_create(s: string);
  83. Xlabel 0;
  84. X    procedure leave;
  85. X    begin
  86. X`009writeln('QUIT');
  87. X`009goto 0;
  88. X    end;
  89. Xvar what : shortstring;
  90. X    g: o_type;
  91. Xbegin
  92. X    if s = '' then grab_line('Create what? ',s,eof_handler := leave);
  93. X    if s > '' then begin
  94. X`009what := bite(s);
  95. X`009if lookup_type(g,what,false,true) then case g of
  96. X`009    t_room:`009do_form(s);
  97. X`009    t_object:`009do_makeobj(s);
  98. X`009    t_monster:`009do_monster(s);
  99. X`009    t_spell:`009writeln('You can''t do that.');
  100. X`009    t_player:`009writeln('You can''t do that.');
  101. X`009end `123 case `125
  102. X`009else writeln('You can''t do that.');
  103. X    end else writeln('You can''t do that.');
  104. X    0:`032
  105. Xend;
  106. X
  107. Xprocedure alias_delete(s: string);
  108. Xlabel 0;
  109. X    procedure leave;
  110. X    begin
  111. X`009writeln('QUIT');
  112. X`009goto 0;
  113. X    end;
  114. Xvar what : shortstring;
  115. X    g: o_type;
  116. Xbegin
  117. X    if s = '' then grab_line('Delete what? ',s,eof_handler := leave);
  118. X    if s > '' then begin
  119. X`009what := bite(s);
  120. X`009if lookup_type(g,what,false,true) then case g of
  121. X`009    t_room:`009do_zap(s);
  122. X`009    t_object:`009do_destroy(s);
  123. X`009    t_monster:`009do_erase(s);
  124. X`009    t_spell:`009writeln('You can''t do that.');
  125. X`009    t_player:`009writeln('You can''t do that.');
  126. X`009end `123 case `125
  127. X`009else writeln('You can''t do that.');
  128. X    end else writeln('You can''t do that.');
  129. X    0:`032
  130. Xend;
  131. X
  132. X`123 -------- `125
  133. X
  134. X
  135. Xprocedure do_error(cmd,param: string);
  136. Xlabel 0; `123 for panic `125
  137. Xvar error: boolean;
  138. X    n,oldloc: integer;
  139. X
  140. X    function action_obj(s: shortstring; n: integer): boolean;
  141. X    begin
  142. X`009    getobj(n);
  143. X`009    freeobj;
  144. X`009    if obj.actindx = 0 then action_obj := false
  145. X`009    else action_obj := run_monster('',obj.actindx,'command','command',
  146. X`009`009cmd,sysdate+' '+systime);
  147. X`009checkevents(TRUE);
  148. X`009if oldloc <> location then goto 0; `123 panic `125
  149. X    end; `123 action_obj `125
  150. X
  151. X    function restriction (n: integer): boolean;
  152. X    begin
  153. X`009restriction := obj_here(n,false) or obj_hold(n);
  154. X`009`123 false = found also hidden objects `125
  155. X    end;
  156. X
  157. X    function res_monster (n: integer): boolean;
  158. X    begin
  159. X`009res_monster := here.people`091n`093.kind = P_MONSTER;
  160. X`009`123 can found also hiding monster's `125
  161. X    end;
  162. X
  163. X    function action_monster(s: shortstring; n: integer): boolean;
  164. X    begin
  165. X       if here.people`091n`093.parm = 0 then action_monster := false
  166. X       else action_monster := run_monster(here.people`091n`093.name,
  167. X          here.people`091n`093.parm,'command','command',cmd,sysdate+' '+syst
  168. Vime);
  169. X`009checkevents(TRUE);
  170. X`009if oldloc <> location then goto 0; `123 panic `125
  171. X    end;
  172. X
  173. Xbegin
  174. X   error := false;
  175. X   oldloc := location;
  176. X   cmd := lowcase(cmd);
  177. X   if length(param) > shortlen then error := true
  178. X   else if param = '' then begin
  179. X      gethere;
  180. X      if here.hook = 0 then error := true
  181. X      else error := not run_monster('',here.hook,'command','command',
  182. X         cmd,sysdate+' '+systime);
  183. X   end else if scan_obj(action_obj,param,true,restriction) or
  184. X`009      scan_pers_slot(action_monster,param,true,res_monster) then begin
  185. X   end else error := true;
  186. X   if error then writeln('You can''t do that.');
  187. X   0: `123 for panic `125
  188. Xend;`032
  189. X
  190. Xprocedure parser;
  191. Xlabel 9999;
  192. Xvar
  193. X`009s: string;
  194. X`009cmd: string;
  195. X`009n,i: integer;
  196. X`009dummybool: boolean;
  197. X
  198. X        procedure leave;
  199. X`009begin
  200. X`009    writeln('QUIT');
  201. X`009    in_main_prompt := false;
  202. X`009    done := true;
  203. X`009    goto 9999;
  204. X`009end;
  205. X
  206. X      `032
  207. Xbegin
  208. X   in_main_prompt := true;
  209. X   repeat
  210. X`009if hiding then grab_line('(>) ',s,eof_handler := leave)
  211. X`009else grab_line('> ',s,eof_handler := leave);
  212. X`009s := slead(s);
  213. X   until length(s) > 0;
  214. X   in_main_prompt := false;
  215. X
  216. X
  217. X`009if s = '.' then
  218. X`009`009s := oldcmd
  219. X`009else
  220. X`009  `009oldcmd := s;
  221. X         `032
  222. X`009if (s`0911`093='''') and (length(s) > 1) then
  223. X`009`009do_say(substr(s,2,length(s)-1))
  224. X`009else if (s`0911`093=':') and (length(s) > 1) then
  225. X`009`009do_atmosphere(substr(s,2,length(s)-1))
  226. X`009else if (lookup_alias(n,s)) or
  227. X`009        (lookup_dir(n,s)) then begin
  228. X`009`009do_go(s);
  229. X`009end else begin
  230. X`009`009cmd := bite(s);
  231. X
  232. X`009`009`123 for help: `125
  233. X`009`009if s = '?' then begin
  234. X
  235. X`009`009    i := lookup_cmd(cmd);
  236. X`009`009    if i = error then command_help(cmd)
  237. X`009`009    else command_help(cmds`091i`093);
  238. X
  239. X`009`009end else case lookup_cmd(cmd) of
  240. X`009`009`009error: do_error(cmd,s);
  241. X`009`009`009setnam: do_setname(s);
  242. X`009  `009`009help,quest: command_help('*show help*');
  243. X`009`009`009quit: done := true;
  244. X`009`009`009c_l,look: do_look(s);
  245. X`009`009`009c_atmosphere: do_atmosphere(s);
  246. X`009`009`009c_summon: do_summon(s);
  247. X`009`009`009go: do_go(s,FALSE);`009`123 FALSE = dir not a verb `125
  248. X`009`009`009form: do_form(s);
  249. X`009`009`009link: do_link(s);
  250. X`009`009`009unlink: do_unlink(s);
  251. X`009`009`009poof: do_poof(s);
  252. X`009`009`009desc: do_describe(s);
  253. X`009`009`009say: do_say(s);
  254. X`009`009`009c_scan: do_scan(s);
  255. X`009`009`009c_rooms: do_rooms(s);
  256. X`009`009`009c_claim: do_claim(s);
  257. X`009`009`009c_disown: do_disown(s);
  258. X`009`009`009c_public: do_public(s);
  259. X`009`009`009c_accept: do_accept(s);
  260. X`009`009`009c_refuse: do_refuse(s);
  261. X`009`009`009c_zap: do_zap(s);
  262. X
  263. X`009`009`009c_north,c_n,
  264. X`009`009`009c_south,c_s,
  265. X`009`009`009c_east,c_e,
  266. X`009`009`009c_west,c_w,
  267. X`009`009`009c_up,c_u,
  268. X`009`009`009c_down,c_d: do_go(cmd);
  269. X
  270. X`009`009`009c_who: do_who (s);
  271. X`009`009`009c_custom: do_custom(s);
  272. X`009`009`009c_search: do_search(s);
  273. X`009`009`009c_system: do_system(s);
  274. X`009`009`009c_hide: do_hide(s);
  275. X`009`009`009c_unhide: do_unhide(s);
  276. X`009`009`009c_punch: do_punch(s);
  277. X`009`009`009c_ping: do_ping(s);
  278. X`009`009`009c_create: do_makeobj(s);
  279. X`009`009`009c_get: do_get(s);
  280. X`009`009`009c_drop: do_drop(s);
  281. X`009`009`009c_i,c_inv: do_inv(s);
  282. X`009`009`009c_whois: do_whois(s);
  283. X`009`009`009c_players: do_players(s);
  284. X`009`009`009c_health: do_health(s);
  285. X`009`009`009c_duplicate: do_duplicate(s);
  286. X`009`009`009c_score: do_score(s);
  287. X`009`009`009c_version: do_version(s);
  288. X`009`009`009c_objects: do_objects (s);
  289. X`009`009`009c_spells: do_spells(s);
  290. X`009`009`009c_self: do_self(s);
  291. X`009`009`009c_use: do_use(s);
  292. X`009`009`009c_whisper: do_whisper(s);
  293. X`009`009`009c_wield: do_wield(s);
  294. X`009`009`009c_brief: do_brief;
  295. X`009`009`009c_wear: do_wear(s);
  296. X`009`009`009c_destroy: do_destroy(s);
  297. X`009`009`009c_relink: do_relink(s);
  298. X`009`009`009c_unmake: do_unmake(s);
  299. X`009`009`009c_show: do_show(s);
  300. X`009`009`009c_set: do_set(s);
  301. X                                         `032
  302. X`009`009`009c_monster: do_monster(s);
  303. X`009`009`009c_monsters: do_monsters(s);
  304. X                        c_erase: do_erase(s);
  305. X`009`009`009c_reset: do_reset(s);
  306. X
  307. X`009`009`009A_list:   alias_list(s);
  308. X`009`009`009A_delete: alias_delete(s);
  309. X`009`009`009A_create: alias_create(s);
  310. X
  311. X`009`009`009dbg: begin
  312. X`009`009`009`009if debug then begin
  313. X`009`009`009`009`009debug := false;
  314. X`009`009`009`009`009writeln('Debugging is off.')
  315. X`009`009`009`009end else begin
  316. X`009`009`009`009`009if manager_priv or gen_debug then begin
  317. X`009`009`009`009`009`009debug := true;
  318. X`009`009`009`009`009`009writeln('Debugging is on.');
  319. X`009`009`009`009`009end else writeln ('DEBUG isn''t for you.');
  320. X`009`009`009        end;
  321. X                             end;
  322. X                       `032
  323. X                        c_dcl: go_dcl (s);
  324. X
  325. X`009`009`009otherwise begin
  326. X`009  `009`009`009writeln('%Parser error, bad return from lookup');
  327. X`009`009`009end;
  328. X`009`009end;
  329. X`009`009clear_command;
  330. X`009end;
  331. X`0099999:
  332. Xend;
  333. X
  334. Xprocedure very_init;
  335. Xbegin
  336. X
  337. X`009rndcycle := 0;
  338. X`009location := 1;`009`009`123 Great Hall `125
  339. X
  340. X`009mywield := 0;`009`009`123 not initially wearing or weilding any weapon `
  341. V125
  342. X`009mywear := 0;
  343. X`009mydisguise := 0;
  344. X`009myhealth := GOODHEALTH;`009`123 how healthy they are to start `125
  345. X`009healthcycle := 0;`009`123 pretty much meaningless at the start `125
  346. X        myexperience := 0;
  347. X        userid := lowcase(get_userid);
  348. X
  349. X`009real_userid := userid;
  350. X`009`123*** Some minor changes below. jlaiho@finuh ***`125
  351. X`123`009privd := false;  `125
  352. X`009if (userid = MM_userid) then begin
  353. X`009`009myname := 'Monster Manager';
  354. X`009`009wizard := true;
  355. X `009end else begin
  356. X `009`009myname := lowcase(userid);
  357. X `009`009if myname`0911`093 >= 'a' then`032
  358. X`009`009`009myname`0911`093 := chr( ord('A') +`032
  359. X`009`009`009    (ord(myname`0911`093) - ord('a')));
  360. X`009end;
  361. Xend;
  362. X
  363. Xfunction init: boolean;
  364. Xvar
  365. X`009i: integer;
  366. X`009s: string;
  367. X
  368. Xbegin
  369. X`009`123 MOVED to very_init `125
  370. X
  371. X`009`123*** End of changed area. jlaiho@finuh ***`125
  372. X`009numcmds:= 76; `123 minor change by hurtta@finuh `125
  373. X
  374. X`009show`091s_exits`093 := 'exits';
  375. X`009show`091s_object`093 := 'object';
  376. X`009show`091s_quest`093 := '?';
  377. X`009show`091s_details`093 := 'details';
  378. X`009show`091s_monster`093 := 'monster';
  379. X`009show`091s_priv`093 := 'privileges';
  380. X`009show`091s_time`093 := 'time';
  381. X`009show`091s_room`093 := 'room';
  382. X`009show`091s_paper`093 := 'commands.paper';
  383. X`009show`091s_levels`093 := 'levels';
  384. X`009show`091s_quota`093 := 'quota';
  385. X`009show`091s_spell`093 := 'spells';
  386. X`009
  387. X`009numshow := 12;
  388. X
  389. X`009setkey`091y_quest`093 := '?';
  390. X
  391. X`123`009setkey`091y_altmsg`093 := 'altmsg';
  392. X`009setkey`091y_group1`093 := 'group1';
  393. X`009setkey`091y_group2`093 := 'group2';`009`125
  394. X      `032
  395. X`009setkey`091y_passwd`093 := 'password';
  396. X`009setkey`091y_peace`093  := 'peace';
  397. X`009setkey`091y_war`093`009 := 'war';
  398. X`009setkey`091y_priv`093   := 'privileges';
  399. X`009setkey`091y_spell`093  := 'spell';
  400. X`009setkey`091y_newplayer`093 := 'newplayer';
  401. X`009setkey`091y_welcome`093 := 'welcome';
  402. X`009numset := 8;
  403. X
  404. X`009init := open_database;
  405. Xend;
  406. X
  407. X
  408. Xprocedure welcome_back(var mylog: integer);
  409. Xvar
  410. X`009tmp: string;
  411. X`009sdate,stime: shortstring;
  412. X
  413. Xbegin
  414. X`009getdate;
  415. X`009freedate;
  416. X
  417. X`009write('Welcome back, ',myname,'.');
  418. X`009if length(myname) > 18 then
  419. X`009`009writeln;
  420. X
  421. X`009write('  Your last play was on');
  422. X
  423. X`009if length(adate.idents`091mylog`093) < 11 then begin
  424. X`009`009writeln(' ???');
  425. X`009end else begin
  426. X`009`009sdate := substr(adate.idents`091mylog`093,1,11);`009`123 extract the
  427. V date `125
  428. X`009`009if length(adate.idents`091mylog`093) = 19 then
  429. X`009`009`009stime := substr(adate.idents`091mylog`093,13,7)
  430. X`009`009else
  431. X`009`009`009stime := '???';
  432. X
  433. X`009`009if sdate`0911`093 = ' ' then
  434. X`009`009`009tmp := sdate
  435. X`009`009else
  436. X`009`009`009tmp := ' ' + sdate;
  437. X
  438. X`009`009if stime`0911`093 = ' ' then
  439. X`009`009`009tmp := tmp + ' at' + stime
  440. X`009`009else
  441. X`009`009`009tmp := tmp + ' at ' + stime;
  442. X`009`009writeln(tmp,'.');
  443. X`009end;
  444. X`009writeln;
  445. Xend;
  446. X
  447. X
  448. Xfunction loc_ping:boolean;
  449. Xvar
  450. X`009i: integer;
  451. X`009found: boolean;
  452. X
  453. Xbegin
  454. X`009if debug then begin
  455. X`009    writeln('%loc_ping: location = ',location:1);
  456. X`009    writeln('%          myname   = ',myname);
  457. X`009end;
  458. X`009inmem := false;
  459. X`009gethere;
  460. X
  461. X`009i := 1;
  462. X`009found := false;
  463. X
  464. X`009`009`123 first get the slot that the supposed "zombie" is in `125
  465. X`009while (not found) and (i <= maxpeople) do begin
  466. X`009`009if here.people`091i`093.kind = P_PLAYER then `123 hurtta@finuh `125
  467. X`009`009`009if here.people`091i`093.name = myname then
  468. X`009`009`009`009found := true
  469. X`009`009`009else
  470. X`009`009`009`009i := i + 1
  471. X`009`009else i := i + 1;
  472. X`009end;
  473. X
  474. X`009myslot := 0;`009`123 setup for ping_player `125
  475. X
  476. X`009if found then begin
  477. X`009`009setevent;
  478. X`009`009loc_ping := ping_player(i,TRUE);  `123 TRUE = silent operation `125
  479. X`009end else
  480. X`009`009loc_ping := true;
  481. X`009`009`009`123 well, if we can't find them, let's assume
  482. X`009`009`009  that they're not in any room records, so they're
  483. X`009`009`009  ok . . . Let's hope... `125
  484. Xend;
  485. X
  486. X
  487. X
  488. X`123 attempt to fix the player using loc_ping if the database incorrectly
  489. X  shows someone playing who isn' playing `125
  490. X
  491. Xfunction fix_player:boolean;
  492. Xvar
  493. X`009ok: boolean;
  494. X
  495. Xbegin
  496. X`009writeln('There may have been some trouble the last time you played.');
  497. X`009writeln('Trying to fix it . . .');
  498. X`009if loc_ping then begin
  499. X`009`009writeln('All should be fixed now.');
  500. X`009`009writeln;
  501. X`009`009fix_player := true;
  502. X`009end else begin
  503. X`009`009writeln('Either someone else is playing Monster on your account, or
  504. V something is');
  505. X`009`009writeln('very wrong with the database.');
  506. X`009`009writeln;
  507. X`009`009fix_player := false;
  508. X`009end;
  509. Xend;
  510. X
  511. X
  512. Xfunction revive_player(var mylog: integer): boolean;
  513. Xvar
  514. X`009ok: boolean;
  515. X`009i,n: integer;
  516. X`009s: string;
  517. X`009pwd, pwd_check: shortstring;
  518. X`009privs, lev: integer;
  519. X
  520. X        procedure panic;
  521. X`009begin
  522. X`009    writeln('--- NO ---');
  523. X`009    halt;
  524. X`009end;
  525. X
  526. X
  527. Xbegin
  528. X`009if exact_user(mylog,userid) then begin`009`123 player has played before
  529. V `125
  530. X`009`009if userid`0911`093 = '"' then begin
  531. X`009`009`009if wizard then begin
  532. X`009`009`009`009wizard := false;
  533. X`009`009`009`009ok := true;
  534. X`009`009`009end else begin
  535. X`009`009`009`123`009starting := true; `125
  536. X`009`009`009`009myslot := 0;
  537. X`009`009`009`009setevent;    `123 for  grab_line `125
  538. X`009`009`009`009i := 0;
  539. X`009`009`009`009ok := false;
  540. X`009`009`009`009getpasswd;
  541. X`009`009`009`009freepasswd;
  542. X`009`009`009`009repeat
  543. X`009`009`009`009`009grab_line ('Password: ', s, FALSE,
  544. X`009`009`009`009`009    eof_handler := panic);
  545. X`009`009`009`009`009if length(s) > shortlen then
  546. X`009`009`009`009`009`009pwd := substr(s,1,shortlen)
  547. X`009`009`009`009`009else pwd := s;
  548. X`009`009`009`009`009encrypt (pwd);
  549. X`009`009`009`009`009if pwd = passwd.idents `091mylog`093 then
  550. X`009`009`009`009`009`009ok := true;
  551. X`009`009`009`009`009i := i + 1;
  552. X`009`009`009`009until (ok) or (i > 2);
  553. X`009`009`009`123`009starting := false;   `125
  554. X`009`009`009end
  555. X`009`009end else
  556. X`009`009`009ok := true;
  557. X`009`009if ok then begin
  558. X`009`009`009getint(N_LOCATION);
  559. X`009`009`009freeint;
  560. X`009`009`009location := anint.int`091mylog`093;`009`123 Retrieve their old l
  561. Voc `125
  562. X`009
  563. X`009`009`009`123 make unique userid - that is fast bug fixing `125
  564. X`009`009`009getuser;
  565. X`009`009`009freeuser;
  566. X`009`009`009userid := user.idents`091mylog`093;
  567. X
  568. X`009`009`009getpers;
  569. X`009`009`009freepers;
  570. X`009`009`009myname := pers.idents`091mylog`093;`009`123 Retrieve old persona
  571. Vl name `125
  572. X`009
  573. X`009`009`009getint(N_EXPERIENCE);
  574. X`009`009`009freeint;
  575. X`009`009`009myexperience := anint.int`091mylog`093;
  576. X`009
  577. X`009`009`009getint(N_SELF);
  578. X`009`009`009freeint;
  579. X`009`009`009myself := anint.int`091mylog`093;
  580. X`009
  581. X`009`009`009getint(N_HEALTH);`009`009`123 hurtta@finuh `125
  582. X`009`009`009freeint;
  583. X`009`009`009myhealth := anint.int`091mylog`093;
  584. X
  585. X`009`009`009getindex(I_ASLEEP);
  586. X`009`009`009freeindex;
  587. X`009
  588. X`009`009`009getint(N_PRIVILEGES);
  589. X`009`009`009freeint;
  590. X`009`009`009privs := anint.int(.mylog.);
  591. X`009`009`009set_auth_priv(uint(privs)); `123 here is call ready `125
  592. X`009`009`009set_cur_priv(uint(privs));
  593. X
  594. X`009`009`009if indx.free`091mylog`093 then begin
  595. X`009`009`009`009`009`123 if player is asleep, all is well `125
  596. X`009`009`009`009ok := true;
  597. X`009`009`009end else begin
  598. X`009`009`009`009`009`123 otherwise, there is one of two possibilities:
  599. X`009`009`009`009`009`0091) someone on the same account is
  600. X`009`009`009`009`009`009   playing Monster
  601. X`009`009`009`009`009`0092) his last play terminated abnormally
  602. X`009`009`009`009`009`125
  603. X`009`009`009`009ok := fix_player;
  604. X`009`009`009end;
  605. X`009
  606. X`009`009`009if ok then
  607. X`009`009`009`009welcome_back(mylog);
  608. X`009`009end;
  609. X
  610. X`009end else begin`009`123 must allocate a log block for the player `125
  611. X
  612. X`009`032
  613. X`009`009if alloc_log(mylog) then begin
  614. X
  615. X
  616. X`009`009`009gethere (START_LOCATION);
  617. X
  618. X`009`009`009writeln('Welcome to Monster, ',myname,'!');
  619. X`009`009`009writeln('You will start in the ',here.nicename,'.');
  620. X`009`009`009writeln;
  621. X
  622. X
  623. X`009`009`009`123 Store their userid `125
  624. X`009`009`009getuser;
  625. X`009`009`009user.idents`091mylog`093 := lowcase(userid);
  626. X`009`009`009putuser;
  627. X
  628. X`009`009`009`123 Store their userid `125
  629. X`009`009`009getreal_user;
  630. X`009`009`009real_user.idents`091mylog`093 := lowcase(real_userid);
  631. X`009`009`009putreal_user;
  632. X
  633. X`009`009`009`123 Store their names `125
  634. X`009`009`009getpers;
  635. X`009`009`009pers.idents`091mylog`093 := myname;
  636. X`009`009`009putpers;
  637. X
  638. X
  639. X`009`009`009`123 Set their initial location `125
  640. X`009`009`009getint(N_LOCATION);
  641. X`009`009`009anint.int`091mylog`093 := START_LOCATION;`009
  642. X`009`009`009`009    `123 Start out in Great Hall `125
  643. X`009`009`009putint;
  644. X`009`009`009location := START_LOCATION;
  645. X
  646. X`009`009`009if (userid = MM_userid) then`032
  647. X`009`009`009`009myexperience := MaxInt
  648. X`009`009`009else myexperience := 0;
  649. X`009 `009`009getint(N_EXPERIENCE);
  650. X`009 `009`009anint.int`091mylog`093 := myexperience;
  651. X`009`009`009putint;
  652. X`009`009`009myexperience := 0;
  653. X
  654. X`009 `009`009getint(N_PRIVILEGES); `123 leino@finuha `125
  655. X`009`009`009if userid = MM_userid then
  656. X`009`009`009`009anint.int`091mylog`093 := all_privileges
  657. X`009`009`009else
  658. X`009`009`009`009anint.int`091mylog`093 := 0;
  659. X`009`009`009putint;
  660. X
  661. X`009`009`009set_auth_priv(uint(anint.int`091mylog`093)); `123 here is call r
  662. Veady `125
  663. X`009`009`009set_cur_priv(uint(anint.int`091mylog`093));
  664. X
  665. X
  666. X`009`009`009getint(N_SELF);
  667. X`009`009`009anint.int`091mylog`093 := 0;
  668. X`009`009`009putint;
  669. X`009`009`009myself := 0;
  670. X
  671. X`009`009`009`123 quotas hurtta@finuh `125
  672. X`009`009`009getint(N_NUMROOMS);
  673. X`009`009`009anint.int`091mylog`093 := 0;
  674. X`009`009`009putint;
  675. X`009`009`009getint(N_ALLOW);
  676. X`009`009`009anint.int`091mylog`093 := default_allow;
  677. X`009`009`009putint;
  678. X`009`009`009getint(N_ACCEPT);
  679. X`009`009`009anint.int`091mylog`093 := 0;
  680. X`009`009`009putint;
  681. X
  682. X`009`009`009lev := level(myexperience);
  683. X`009`009`009myhealth := leveltable`091lev`093.health * 7 div 10;
  684. X`009`009`009getint(N_HEALTH);
  685. X`009`009`009anint.int`091mylog`093 := myhealth;
  686. X`009`009`009putint;
  687. X
  688. X`009`009`009`009`123 initialize the record containing the
  689. X`009`009`009`009  level of each spell they have to start;
  690. X`009`009`009`009  all start at zero; since the spellfile is
  691. X`009`009`009`009  directly parallel with mylog, we can hack
  692. X`009`009`009`009  init it here without dealing with SYSTEM `125
  693. X
  694. X`009`009`009locate(spellfile,mylog);
  695. X`009`009`009for i := 1 to maxspells do
  696. X`009`009`009`009spellfile`094.level`091i`093 := 0;
  697. X`009`009`009spellfile`094.recnum := mylog;
  698. X`009`009`009put(spellfile);
  699. X
  700. X`009`009`009if userid`0911`093 = '"' then begin
  701. X`009`009`009`009`123starting := true;  `125
  702. X`009`009`009`009setevent;
  703. X`009`009`009`009myslot := 0; `123 for grab_line `125
  704. X`009`009`009`009wizard := false;
  705. X`009`009`009`009repeat
  706. X`009`009`009`009`009grab_line ('New password: ', s, false,
  707. X`009`009`009`009`009    eof_handler := panic);
  708. X`009`009`009`009`009if length(s) > shortlen then
  709. X`009`009`009`009`009`009pwd := substr(s,1,shortlen)
  710. X`009`009`009`009`009else pwd := s;
  711. X`009`009`009`009`009while pwd = '' do begin
  712. X`009`009`009`009`009`009writeln ('Sorry, you must have a password for ', myn
  713. Vame, '.');
  714. X`009`009`009`009`009`009grab_line ('New password: ', s
  715. X`009`009`009`009`009`009    , false,eof_handler := panic);
  716. X`009`009`009`009`009`009if length(s) > shortlen then
  717. X`009`009`009`009`009`009`009pwd := substr(s,1,shortlen)
  718. X`009`009`009`009`009`009else pwd := s;
  719. X`009`009`009`009`009end;
  720. X`009`009`009`009`009grab_line ('Verification: ', s, false,
  721. X`009`009`009`009`009    eof_handler := panic);
  722. X`009`009`009`009`009if length(s) > shortlen then
  723. X`009`009`009`009`009`009pwd_check := substr(s,1,shortlen)
  724. X`009`009`009`009`009else pwd_check := s;
  725. X`009`009`009`009`009if pwd = pwd_check then begin
  726. X`009`009`009`009`009`009ok := true;
  727. X`009`009`009`009`009`009encrypt (pwd);
  728. X`009`009`009`009`009end else begin
  729. X`009`009`009`009`009`009ok := false;
  730. X`009`009`009`009`009`009writeln ('You seem to have made a mistake. Please tr
  731. Vy again.');
  732. X`009`009`009`009`009end;
  733. X`009`009`009`009until ok;
  734. X`009`009`009`123`009starting := false;  `125
  735. X`009`009`009end else pwd := '';
  736. X
  737. X`009`009`009`123 Store their password `125
  738. X`009`009`009getpasswd;
  739. X`009`009`009passwd.idents `091mylog`093 := pwd;
  740. X`009`009`009putpasswd;
  741. X
  742. X`009`009`009ok := true;
  743. X`009`009end else
  744. X`009`009`009ok := false;
  745. X`009end;
  746. X
  747. X`009if ok then begin `123 Successful, MYLOG is my log slot `125
  748. X
  749. X`009`009`123 Wake up the player `125
  750. X`009`009getindex(I_ASLEEP);
  751. X`009`009indx.free`091mylog`093 := false;`009`123 I'm NOT asleep now `125
  752. X`009`009putindex;
  753. X
  754. X`009`009`123 Set the "last date of play" `125
  755. X`009`009getdate;
  756. X`009`009adate.idents`091mylog`093 := sysdate + ' ' + systime;
  757. X`009`009putdate;
  758. X`009end else
  759. X`009`009writeln('There is no place for you in Monster.  Contact the Monster
  760. V Manager.');
  761. X`009revive_player := ok;
  762. Xend;
  763. X
  764. X
  765. Xfunction enter_universe:boolean;
  766. Xvar
  767. X`009orignam: string;
  768. X`009dummy,i,old_loc: integer;
  769. X`009ok: boolean;
  770. X
  771. Xbegin
  772. X
  773. X
  774. X`009`009`123 take MYNAME given to us by init or revive_player and make
  775. X`009`009  sure it's unique.  If it isn't tack _1, _2, etc onto it
  776. X`009`009  until it is.  Code must come before alloc_log, or there
  777. X`009`009  will be an invalid pers record in there cause we aren't in yet
  778. X`009`009`125
  779. X`009`009orignam := myname;
  780. X`009`009i := 0;
  781. X`009`009repeat`009`123 tack _n onto pers name until a unique one is found `1
  782. V25
  783. X`009`009`009ok := true;
  784. X
  785. X`123*** Should this use exact_pers instead?  Is this a copy of exact_pers co
  786. Vde? `125
  787. X
  788. X`009`009`009if lookup_pers(dummy,myname) then
  789. X`009`009`009`009if lowcase(pers.idents`091dummy`093) = lowcase(myname) then
  790. V begin
  791. X`009`009`009`009`009ok := false;
  792. X`009`009`009`009`009i := i + 1;
  793. X`009`009`009`009`009writev(myname,orignam,'_',i:1);
  794. X`009`009`009`009end;
  795. X`009`009until ok;
  796. X
  797. X`009if revive_player(mylog) then begin
  798. X
  799. X`009    if not play_allow then begin`009`123 don't play work time `125
  800. X
  801. X`009`009write_message;
  802. X
  803. X`009`009`123 mark player not play yet `125
  804. X`009`009getindex(I_ASLEEP);
  805. X`009`009indx.free`091mylog`093 := TRUE;`009`123 I'm asleep now `125
  806. X`009`009putindex;
  807. X
  808. X`009`009enter_universe := false;
  809. X
  810. X`009    end else if not read_global_flag(GF_ACTIVE)`032
  811. X`009`009and not manager_priv then begin
  812. X`009`009    writeln('Monster is shutdown.');
  813. X`009`009    writeln('Notify Monster Manager.');
  814. X`009`009    Enter_universe := False;
  815. X
  816. X`009`009    `123 mark player not play yet `125
  817. X`009`009    getindex(I_ASLEEP);
  818. X`009`009    indx.free`091mylog`093 := TRUE;`009`123 I'm asleep now `125
  819. X`009`009    putindex;
  820. X`009    end else if put_token(location,myslot) then begin
  821. X`009`009enter_universe := true;
  822. X`009`009log_begin(location);
  823. X`009`009setevent;
  824. X`009`009old_loc := location;
  825. X
  826. X`009`009if (location = START_LOCATION) and
  827. X`009`009   (myexperience = 0) then`032
  828. X`009`009       print_global(GF_NEWPLAYER,FALSE)
  829. X`009`009else print_global(GF_STARTGAME,FALSE);
  830. X`009`009   `032
  831. X`009`009do_look;
  832. X`009`009exec_global(GF_CODE,FORCE_READ := TRUE,LABEL_NAME := 'start');
  833. X`009`009if (old_loc = location) and (here.hook > 0) then
  834. X`009`009`009run_monster('',here.hook,'start',
  835. X`009`009`009`009'','',
  836. X       `009`009`009`009sysdate+' '+systime);
  837. X`009`009if old_loc = location then meta_run('enter','','');
  838. X`009`009if old_loc = location then meta_run_2('start','','');
  839. X
  840. X`009`009if not read_global_flag(GF_ACTIVE) then
  841. X`009`009    writeln('WARNING: Monster is shutdown!');
  842. X
  843. X`009    end else begin
  844. X`009`009writeln('put_token failed.');
  845. X`009`009enter_universe := false;
  846. X`009    end;
  847. X`009end else begin
  848. X`009`009writeln('revive_player failed.');
  849. X`009`009enter_universe := false;
  850. X`009end;
  851. Xend;
  852. X
  853. Xprocedure leave_universe;
  854. Xvar
  855. X`009diddrop: boolean;
  856. X`009temp: integer;
  857. X
  858. Xbegin
  859. X`009meta_run('leave','target','');
  860. X`009exec_global(GF_CODE,LABEL_NAME := 'quit');
  861. X`009temp := mydisguise;
  862. X`009diddrop := drop_everything;
  863. X`009mydisguise := temp;`009`123 this is wrong information but necessary `125
  864. X`009log_quit(location,diddrop);
  865. X`009take_token(myslot,location);
  866. X`009do_endplay(mylog);
  867. X
  868. X`009writeln('You vanish in a brilliant burst of multicolored light.');
  869. X`009if diddrop then
  870. X`009`009writeln('All of your belongings drop to the ground.');
  871. Xend;
  872. X
  873. X
  874. X`123 global procedures for module interpreter `125 `123 hurtta@finuh `125
  875. X
  876. X`123 int_lookup_player moved to PARSER.PAS `125
  877. X
  878. X`123 int_lookup_object moved to PARSER.PAS `125
  879. X
  880. X`123 int_lookup_room moved to PARSER.PAS `125
  881. X`032
  882. X`091global`093
  883. Xfunction int_heal(player: shortstring; amount: integer): boolean;
  884. Xvar room,pid,lev,top,mslot,health: integer;
  885. Xbegin
  886. X   if debug then begin
  887. X      writeln('%int_heal: ',player);
  888. X      writeln('%                 : ',amount);
  889. X   end;
  890. X   int_heal := false;
  891. X   if player > '' then begin
  892. X      room := x_where(player,pid);
  893. X      if room > 0 then begin
  894. X         getroom(room);`009`009`009`123 locking `125
  895. X         mslot := x_slot(player);
  896. X         if mslot = 0 then freeroom `009`123 unlocking `125
  897. X         else if here.people`091mslot`093.kind = P_MONSTER then begin
  898. X            lev := level(here.people`091mslot`093.experience);
  899. X            top := leveltable`091lev`093.health;
  900. X            health := here.people`091mslot`093.health;
  901. X            health := health + amount;
  902. X            if health > top then health := top;
  903. X            here.people`091mslot`093.health := health;
  904. X            int_heal := true;
  905. X            putroom;`009`009`009`123 writing `125
  906. X            getint(N_HEALTH);
  907. X            anint.int`091pid`093 := health;
  908. X            putint;
  909. X         end else if pid = mylog then begin`032
  910. X           if (myexperience >= protect_exp) `123 and protected_MM `125 then`
  911. V032
  912. X              freeroom`009`009`009`123 unlocking `125
  913. X           else begin                        `032
  914. X              lev := level(myexperience);
  915. X              top := leveltable`091lev`093.health;
  916. X              myhealth := myhealth + amount;
  917. X              if myhealth > top then myhealth := top;
  918. X              here.people`091mslot`093.health := myhealth;
  919. X              int_heal := true;
  920. X              putroom;`009`009`009`123 writing `125
  921. X              getint(N_HEALTH);
  922. X              anint.int`091pid`093 := myhealth;
  923. X              putint;
  924. X           end;
  925. X         end else begin
  926. X           freeroom; `009`009`009`123 unlocking `125
  927. X           writeln('%serious error in int_heal. Notify Monster Manager.');
  928. X         end;
  929. X      end;
  930. X   end;
  931. Xend; `123 int_heal `125
  932. X
  933. X
  934. X`091global`093
  935. Xfunction int_ask_privilege(player,privilege: shortstring): boolean;
  936. Xvar room,pid,priv: integer;
  937. X    mask: unsigned;
  938. Xbegin
  939. X   if debug then begin
  940. X      writeln('%int_ask_privilege: ',player);
  941. X      writeln('%                 : ',privilege);
  942. X   end;
  943. X   int_ask_privilege := false;
  944. X   room := x_where(player,pid);
  945. X   if room > 0 then begin
  946. X      getint(N_PRIVILEGES);
  947. X      freeint;
  948. X      priv := anint.int`091pid`093;
  949. X      if lookup_priv(mask,privilege) then
  950. X`009int_ask_privilege := uand(mask,uint(priv)) > 0
  951. X      else if privilege = 'wizard' then begin  `123 pseudo privilege : Monst
  952. Ver Manager `125
  953. X         getuser;
  954. X         freeuser;
  955. X         int_ask_privilege := user.idents`091pid`093 = MM_userid;
  956. X      end;`032
  957. X   end;
  958. Xend; `123 int_ask_privilege `125
  959. X
  960. X`091global`093
  961. Xfunction int_set_experience(player: shortstring; amount: integer): boolean;
  962. Xvar pid,pslot,room,adding: integer;
  963. Xbegin
  964. X   if debug then begin
  965. X      writeln('%int_set_experience: ',player);
  966. X      writeln('%                  : ',amount:1);
  967. X   end;
  968. X   if player = '' then int_set_experience := false
  969. X   else begin
  970. X      room := x_where(player,pid);
  971. X      if room = 0 then int_set_experience := false
  972. X      else begin
  973. X         gethere(room);
  974. X         pslot := x_slot(player);
  975. X         if pslot = 0 then int_set_experience := false
  976. X         else if (here.people`091pslot`093.kind <> P_MONSTER) and (pid <> my
  977. Vlog) then begin
  978. X            writeln('%serious error in int_set_experience.');
  979. X            writeln('%notify Monster Manager.');
  980. X         end else begin
  981. X            if pid = mylog then begin
  982. X               if amount > myexperience then`032
  983. X                  add_experience(amount - myexperience)
  984. X               else
  985. X                  low_experience(myexperience - amount);
  986. X            end else begin
  987. X               getroom(room);   `123 locking `125
  988. X               if lowcase(here.people`091pslot`093.username) <> lowcase(play
  989. Ver) then freeroom
  990. X               else begin
  991. X                  here.people`091pslot`093.experience := amount;
  992. X                  putroom;
  993. X               end;
  994. X               getint(N_EXPERIENCE);
  995. X               anint.int`091pid`093 := amount;
  996. X               putint;
  997. X               int_set_experience := true;
  998. X            end;
  999. X         end;
  1000. X      end;
  1001. X   end;
  1002. Xend; `123 int_set_experience `125
  1003. X
  1004. X`091global`093
  1005. Xfunction int_get_experience(player: shortstring): integer; `123 = -1 not fou
  1006. Vnd `125
  1007. Xvar pid: integer;
  1008. Xbegin
  1009. X   if debug then writeln('%int_get_experience: ',player);
  1010. X   if exact_pers(pid,player) then begin
  1011. X     getint(N_EXPERIENCE);
  1012. X     freeint;
  1013. X     int_get_experience := anint.int`091pid`093;
  1014. X   end else int_get_experience := -1;
  1015. Xend; `123 int_get_experience `125
  1016. X
  1017. X`091global`093
  1018. Xfunction int_get_health(player: shortstring): integer; `123 = -1 not found `
  1019. V125
  1020. Xvar pid,room: integer;
  1021. Xbegin
  1022. X   if debug then writeln('%int_get_health: ',player);
  1023. X   if exact_pers(pid,player) then begin
  1024. X     getint(N_HEALTH);
  1025. X     freeint;
  1026. X     int_get_health := anint.int`091pid`093;
  1027. X   end else int_get_health := -1;
  1028. Xend; `123 int_get_health `125
  1029. X
  1030. X`091global`093
  1031. Xfunction int_userid(player: shortstring): shortstring; `123 = "" not found `
  1032. V125
  1033. Xvar pid: integer;
  1034. Xbegin
  1035. X   if debug then writeln('%int_get_health: ',player);
  1036. X   if exact_pers(pid,player) then begin
  1037. X       getuser;
  1038. X       freeuser;
  1039. X       int_userid := user.idents`091pid`093;
  1040. X   end else int_userid := '';
  1041. Xend; `123 int_get_health `125
  1042. X     `032
  1043. X`091global`093 `032
  1044. Xfunction int_inv (player: shortstring): mega_string;
  1045. Xvar result: mega_string;
  1046. X    room,i,pid,oid,slot: integer;    `032
  1047. Xbegin`032
  1048. X   if debug then writeln('%int_inv: ',player);
  1049. X   getobjnam;
  1050. X   freeobjnam;
  1051. X   result := '';
  1052. X   if player > '' then begin
  1053. X      room := x_where (player,pid);
  1054. X      if room > 0 then begin
  1055. X         gethere(room);
  1056. X         slot := x_slot(player);
  1057. X         if slot > 0 then
  1058. X            for i := 1 to maxhold do begin
  1059. X               oid := here.people`091slot`093.holding`091i`093;
  1060. X               if oid > 0 then x_add(result,objnam.idents`091oid`093)
  1061. X            end;
  1062. X      end;
  1063. X   end;
  1064. X   int_inv := result
  1065. Xend; `123 int_inv `125
  1066. X
  1067. X`091global`093
  1068. Xfunction int_get_code(player: shortstring): integer; `123 = 0 not found `125
  1069. Xvar pid,room,slot: integer;
  1070. Xbegin
  1071. X   if debug then writeln('%int_get_code: ',player);
  1072. X   room := x_where(player,pid);
  1073. X   if room = 0 then int_get_code := 0
  1074. X   else begin
  1075. X      gethere(room);
  1076. X      slot := x_slot(player);
  1077. X      if slot > 0 then int_get_code := here.people`091slot`093.parm
  1078. X      else int_get_code := 0;
  1079. X   end;
  1080. Xend; `123 int_get_code`125
  1081. X
  1082. X`091global`093 `032
  1083. Xfunction int_objects (player: shortstring): mega_string;
  1084. Xvar result: mega_string;
  1085. X    room,i,pid,oid,slot: integer;    `032
  1086. Xbegin`032
  1087. X   if debug then writeln('%int_objects: ',player);
  1088. X   getobjnam;
  1089. X   freeobjnam;
  1090. X   result := '';
  1091. X   if player > '' then begin
  1092. X      room := x_where (player,pid);
  1093. X      if room > 0 then begin
  1094. X         gethere(room);
  1095. X         slot := x_slot(player);
  1096. X         if slot > 0 then
  1097. X            for i := 1 to maxobjs do begin
  1098. X               oid := here.objs`091i`093;
  1099. X               if oid > 0 then x_add(result,objnam.idents`091oid`093)
  1100. X            end;
  1101. X      end;
  1102. X   end;
  1103. X   int_objects := result
  1104. Xend; `123 int_objects `125
  1105. X
  1106. X`091global`093      `032
  1107. Xfunction int_l_object: mega_string;
  1108. Xvar result: mega_string;
  1109. X    i: integer;
  1110. Xbegin
  1111. X   if debug then writeln('%int_l_object');
  1112. X   getindex(I_OBJECT);
  1113. X   freeindex;
  1114. X   getobjnam;
  1115. X   freeobjnam;
  1116. X   result := '';
  1117. X   for i := 1 to indx.top do if not indx.free`091i`093 then
  1118. X     x_add(result,objnam.idents`091i`093);
  1119. X   int_l_object := result;
  1120. Xend;
  1121. X
  1122. X`091global`093
  1123. Xfunction int_l_player: mega_string;
  1124. Xvar result: mega_string;
  1125. X    i: integer;
  1126. Xbegin
  1127. X   if debug then writeln('%int_l_player');
  1128. X   getindex(I_PLAYER);
  1129. X   freeindex;
  1130. X   getpers;
  1131. X   freepers;
  1132. X   result := '';
  1133. X   for i := 1 to indx.top do if not indx.free`091i`093 then
  1134. X     x_add(result,pers.idents`091i`093);
  1135. X   int_l_player := result;
  1136. Xend;`032
  1137. X
  1138. X`091global`093
  1139. Xfunction int_l_room: mega_string;
  1140. Xvar result: mega_string;
  1141. X    i: integer;
  1142. Xbegin
  1143. X   if debug then writeln('%int_list_room');
  1144. X   getindex(I_ROOM);
  1145. X   freeindex;
  1146. X   getnam;
  1147. X   freenam;
  1148. X   result := '';
  1149. X   for i := 1 to indx.top do if not indx.free`091i`093 then
  1150. X     x_add(result,nam.idents`091i`093);
  1151. X   int_l_room := result;
  1152. Xend;`032
  1153. X
  1154. X
  1155. X`091global`093`032
  1156. Xprocedure int_broadcast(player: shortstring; s: string; to_other: boolean);
  1157. Xvar room,i,pid,oid,code: integer;    `032
  1158. Xbegin
  1159. X   if debug then begin`032
  1160. X      writeln('%int_broadcast: ',player);
  1161. X      writeln('%             : ',s);
  1162. X      writeln('%             : ',to_other);
  1163. X   end;
  1164. X   if player = '' then room := location
  1165. X   else room := x_where (player,pid);
  1166. X   code := 0;
  1167. X   if to_other then code := myslot;
  1168. X   if room > 0 then log_event(code,E_BROADCAST,,,s,room);
  1169. X   checkevents(true);
  1170. Xend; `123 int_broadcast `125                     `032
  1171. X
  1172. X`091global`093
  1173. Xfunction int_players(player: shortstring): mega_string;
  1174. Xvar result: mega_string;
  1175. X    room,i,pid: integer;
  1176. X    name: shortstring;    `032
  1177. Xbegin              `032
  1178. X   if debug then writeln('%int_players: ',player);
  1179. X   result := '';
  1180. X   if player = '' then room := location
  1181. X   else room := x_where (player,pid);
  1182. X   if room > 0 then
  1183. X      gethere(room);
  1184. X      for i := 1 to maxpeople do begin
  1185. X          name := here.people`091i`093.name;`032
  1186. X          if here.people`091i`093.kind <> P_PLAYER then name := '';
  1187. X                             `123 don't get monsters `125
  1188. X          if name > '' then x_add(result,name)
  1189. X      end;
  1190. X  int_players := result
  1191. Xend; `123 int_players `125                     `032
  1192. X
  1193. X`091global`093`032
  1194. Xfunction int_remote_players (room: shortstring): mega_string;
  1195. Xvar result: mega_string;
  1196. X    n,i: integer;
  1197. X    name: shortstring;    `032
  1198. Xbegin              `032
  1199. X   if debug then writeln('%int_remote_players: ',room);
  1200. X   result := '';
  1201. X   if exact_room(n,room) then begin
  1202. X      gethere(n);
  1203. X      for i := 1 to maxpeople do begin
  1204. X          name := here.people`091i`093.name;`032
  1205. X          if here.people`091i`093.kind <> P_PLAYER then name := '';
  1206. X                             `123 don't get monsters `125
  1207. X          if name > '' then x_add(result,name)
  1208. X      end;
  1209. X   end;
  1210. X   int_remote_players := result;
  1211. Xend; `123 int_remote_players `125
  1212. X
  1213. X`091global`093`032
  1214. Xfunction int_remote_objects (room: shortstring): mega_string;
  1215. Xvar result: mega_string;
  1216. X    n,i,oid: integer;
  1217. X    name: shortstring;    `032
  1218. Xbegin              `032
  1219. X   if debug then writeln('%int_remote_objects: ',room);
  1220. X   getobjnam;
  1221. X   freeobjnam;
  1222. X   result := '';
  1223. X   if exact_room(n,room) then begin
  1224. X      gethere(n);
  1225. X      for i := 1 to maxobjs do begin
  1226. X         oid := here.objs`091i`093;
  1227. X         if oid > 0 then x_add(result,objnam.idents`091oid`093)
  1228. X      end;
  1229. X   end;
  1230. X   int_remote_objects := result;
  1231. Xend; `123 int_remote_objects `125
  1232. X
  1233. X`091global`093
  1234. Xfunction int_duplicate(player,object,owner: shortstring;
  1235. X                       privileged: boolean): boolean;
  1236. Xvar room,i,pid,oid,slot,mslot: integer;    `032
  1237. X    found : boolean;
  1238. Xbegin                                    `032
  1239. X   if debug then begin
  1240. X      writeln('%int_duplicate: ',player);
  1241. X      writeln('%             : ',object);
  1242. X      writeln('%             : ',owner);
  1243. X      writeln('%             : ',privileged);
  1244. X   end;                           `032
  1245. X   if player > '' then begin
  1246. X      room := x_where (player,pid);        `032
  1247. X      if room > 0 then begin
  1248. X         gethere(room);`032
  1249. X         if exact_obj (oid,object) then begin
  1250. X            getobjown;
  1251. X            freeobjown;
  1252. X            if (objown.idents`091oid`093 <> owner) and not privileged then o
  1253. Vid := 0;
  1254. X         end else oid := 0;
  1255. X
  1256. X         mslot := x_slot(player);          `123 monster slot `125
  1257. X         if mslot = 0 then int_duplicate := false
  1258. X         else if here.people`091mslot`093.kind = P_MONSTER then begin `123 m
  1259. Vonster `125
  1260. X            if oid > 0 then begin
  1261. X               if mslot > 0 then begin
  1262. X`009          getroom(room);                    `123 locking `125
  1263. X                  i := 1;
  1264. X`009          found := false;
  1265. X`009          while (i <= maxhold) and (not found) do begin
  1266. X`009`009     if here.people`091mslot`093.holding`091i`093 = 0 then
  1267. X`009`009`009found := true
  1268. X`009`009     else
  1269. X`009`009`009i := i + 1;
  1270. X`009          end;
  1271. X`009          if found then begin
  1272. X`009       `009     here.people`091mslot`093.holding`091i`093 := oid;
  1273. X`009       `009     putroom;       `032
  1274. X                     getobj(oid);
  1275. X                     obj.numexist := obj.numexist +1;
  1276. X                     putobj;
  1277. X                     int_duplicate := true;
  1278. X`009          end else begin
  1279. X`009`009     freeroom;
  1280. X                     int_duplicate := false
  1281. X                  end
  1282. X               end
  1283. X            end else int_duplicate := false    `123 someone is moving monste
  1284. Vr ? `125
  1285. X         end else if pid = mylog then begin `123 player `125
  1286. X            if oid > 0 then begin
  1287. X               if hold_obj(oid) then begin
  1288. X                     getobj(oid);
  1289. X                     obj.numexist := obj.numexist +1;
  1290. X                     putobj;
  1291. X                     int_duplicate := true;
  1292. X               end else int_duplicate := false;
  1293. X            end else int_duplicate := false
  1294. X         end else begin         `032
  1295. X            writeln ('%serious error in int_duplicate. Notify Monster Manage
  1296. Vr.');
  1297. X            int_duplicate := false;
  1298. X         end
  1299. X      end else int_duplicate := false;
  1300. X   end else int_duplicate := false;
  1301. Xend;
  1302. X
  1303. X`091global`093
  1304. Xfunction int_destroy(player,object,owner: shortstring;
  1305. X`009 privileged: boolean): boolean;
  1306. Xvar room,i,pid,oid,slot,mslot: integer;    `032
  1307. X    found : boolean;
  1308. Xbegin
  1309. X   if debug then begin
  1310. X      writeln('%int_destroy: ',player);
  1311. X      writeln('%           : ',object);
  1312. X      writeln('%           : ',owner);
  1313. X      writeln('%           : ',privileged);
  1314. X   end;
  1315. X   if player > '' then begin
  1316. X      room := x_where (player,pid);
  1317. X      if room > 0 then begin
  1318. X         gethere(room); `032
  1319. X         mslot := x_slot(player); `032
  1320. X         if mslot = 0 then oid := 0    `123 is  monster moving ? `125
  1321. X         else if exact_obj (oid,object) then begin
  1322. X            getobjown;
  1323. X            freeobjown;
  1324. X            if (objown.idents`091oid`093 <> owner) and not privileged then o
  1325. Vid := 0
  1326. X            else if not x_hold (oid,mslot) then oid := 0
  1327. X         end else oid := 0;
  1328. X    `032
  1329. X         if mslot = 0 then int_destroy := false
  1330. X         else if here.people`091mslot`093.kind = P_MONSTER then begin `123 m
  1331. Vonster `125
  1332. X            if oid > 0 then begin
  1333. X               slot := find_hold(oid,mslot);     `123 object current slot `1
  1334. V25
  1335. X`009       if slot > 0 then begin            `123 is object here yet ? `125
  1336. X                  getroom(room);                    `123 locking `125
  1337. X`009          if here.people`091mslot`093.holding`091slot`093 = oid then beg
  1338. Vin
  1339. X`009       `009     here.people`091mslot`093.holding`091slot`093 := 0;
  1340. X                     if here.people`091mslot`093.wielding = oid then
  1341. X                        here.people`091mslot`093.wielding := 0;
  1342. X                     if here.people`091mslot`093.wearing = oid then
  1343. X                        here.people`091mslot`093.wearing := 0;
  1344. X`009       `009     putroom;          `032
  1345. X                     getobj(oid);
  1346. X                     obj.numexist := obj.numexist -1;
  1347. X                     putobj;
  1348. X                     int_destroy := true;
  1349. X`009          end else begin           `032
  1350. X`009`009     freeroom;
  1351. X                     int_destroy := false
  1352. X                  end
  1353. X               end
  1354. X            end else int_destroy := false `123 someone is droping object ? `
  1355. V125
  1356. X                                       `123 two user must run same monster `
  1357. V125
  1358. X         end else if pid = mylog then begin `123 player `125
  1359. X            if oid > 0 then begin
  1360. X               slot := find_hold(oid);
  1361. X               if slot > 0 then begin
  1362. X                  drop_obj(slot);`032
  1363. X                  getobj(oid);
  1364. X                  obj.numexist := obj.numexist -1;
  1365. X                  putobj;
  1366. X                  int_destroy := true;
  1367. X                  if mywield = oid then x_unwield;
  1368. X                  if mywear = oid then x_unwear;
  1369. X               end else int_destroy := false
  1370. X            end else int_destroy := false
  1371. X         end else begin         `032
  1372. X            writeln ('%serious error in int_destroy. Notify Monster manager'
  1373. V);
  1374. X            int_destroy := false;
  1375. X         end
  1376. X      end else int_destroy := false;
  1377. X   end else int_destroy := false;
  1378. Xend; `123 int_destroy `125
  1379. X
  1380. X`091global`093                  `032
  1381. Xfunction int_get(player,object: shortstring): boolean;
  1382. Xvar room,i,pid,oid,slot,mslot: integer;    `032
  1383. X    found : boolean;
  1384. Xbegin                                    `032
  1385. X   if debug then begin
  1386. X      writeln('%int_get: ',player);
  1387. X      writeln('%       : ',object);
  1388. X   end;                           `032
  1389. X   if player > '' then begin
  1390. X      room := x_where (player,pid);        `032
  1391. X      if room > 0 then begin
  1392. X         gethere(room);`032
  1393. X         if exact_obj (oid,object) then begin
  1394. +-+-+-+-+-+-+-+-  END  OF PART 24 +-+-+-+-+-+-+-+-
  1395.