home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part21 < 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 21/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.061855.10719@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 06:18:55 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1391
  12.  
  13. Archieve-name: monster_helsinki_104/part21
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 21/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 21 -+-+-+-+-+-+-+-+
  20. X`009`009substitute that one & use;
  21. X
  22. X`009if there is a room default other-person failure desc, then
  23. X`009`009print that;
  24. X
  25. X`009if they tried to go through a valid exit,
  26. X`009  and the exit has no required alias, then
  27. X`009`009print default exit fail
  28. X`009else
  29. X`009`009print generic "didn't leave room" message
  30. X
  31. Xcases:
  32. X1) valid/alias exit and specific fail message
  33. X2) valid/alias exit and blanket fail message
  34. X3) valid exit (no specific or blanket) "x fails to go `091direct`093"
  35. X4) alias exit and blanket fail
  36. X5) blanket fail
  37. X6) generic fail
  38. X`125
  39. X
  40. X`009if dir <> 0 then
  41. X`009`009log_event(myslot,E_FAILGO,dir,0);
  42. Xend;
  43. X
  44. X
  45. X
  46. Xprocedure do_exit; `123 (exit_slot: integer)-- declared forward `125
  47. Xlabel`0090;
  48. Xvar
  49. X`009orig_slot,
  50. X`009targ_slot,
  51. X`009orig_room,
  52. X`009enter_slot,
  53. X`009targ_room,
  54. X`009old_loc,prevcode: integer;
  55. X`009doalook: boolean;
  56. X
  57. Xbegin
  58. X`009getnam;`009`009`123 rooms' names `125
  59. X`009freenam;
  60. X
  61. X`009if (exit_slot < 1) or (exit_slot > 6) then
  62. X`009`009exit_fail(exit_slot)
  63. X`009else if here.exits`091exit_slot`093.toloc > 0 then begin
  64. X
  65. X`009`009orig_slot := myslot;
  66. X`009`009orig_room := location;
  67. X`009`009targ_room := here.exits`091exit_slot`093.toloc;
  68. X`009`009enter_slot := here.exits`091exit_slot`093.slot;
  69. X`009`009doalook := here.exits`091exit_slot`093.autolook;
  70. X
  71. X`009`009old_loc := location;
  72. X`009`009prevcode := here.hook;
  73. X`009`009if here.hook > 0 then
  74. X`009`009`009run_monster('',here.hook,'leave',
  75. X`009`009`009`009'target',nam.idents`091targ_room`093,
  76. X`009`009`009`009sysdate+' '+systime);
  77. X`009`009if old_loc = location then meta_run('leave',
  78. X`009`009`009`009'target',nam.idents`091targ_room`093);
  79. X`009`009if old_loc = location then meta_run_2('leave',
  80. X`009`009`009`009'target',nam.idents`091targ_room`093);
  81. X`009`009if location <> old_loc then begin
  82. X`009`009`009`123 writeln ('You must interrupt walking.'); `125
  83. X`009`009`009goto 0
  84. X`009`009end;
  85. X
  86. X`009`009block_subs(here.exits`091exit_slot`093.success,myname);
  87. X               `032
  88. X`009`009`009`009`123 optimization for exit that goes nowhere;
  89. X`009`009`009`009  why go nowhere?  For special effects, we
  90. X`009`009`009`009  don't want it to take too much time,
  91. X`009`009`009`009  the logs are important because they force the
  92. X`009`009`009`009  exit descriptions, but actually moving the
  93. X`009`009`009`009  player is unnecessary `125
  94. X
  95. X`009`009if orig_room = targ_room then begin
  96. X`009`009`009log_exit(exit_slot,orig_room,orig_slot);
  97. X`009`009`009log_entry(enter_slot,targ_room,orig_slot);
  98. X`009`009`009`009`123 orig_slot in log_entry 'cause we're not
  99. X`009`009`009`009  really going anwhere `125
  100. X`009`009`009old_loc := location;
  101. X`009`009`009if doalook then
  102. X`009`009`009`009do_look;
  103. X`009`009`009if here.hook > 0 then
  104. X`009`009`009`009run_monster('',here.hook,'enter','','',
  105. X`009`009`009`009`009sysdate+' '+systime);
  106. X`009`009`009if old_loc = location then meta_run('enter','','');
  107. X`009`009`009if old_loc = location then meta_run_2('enter','','');
  108. X`009`009end else begin
  109. X`009`009`009take_token(orig_slot,orig_room);
  110. X`009`009`009if not put_token(targ_room,targ_slot) then begin
  111. X`009`009`009`009`009`123 no room in room! `125
  112. X`123 put them back! Quick! `125`009if not put_token(orig_room,myslot) then b
  113. Vegin
  114. X`009`009`009`009`009writeln('%Oh no!');
  115. X`009`009`009`009`009halt;
  116. X`009`009`009`009end;
  117. X`009`009`009end else begin
  118. X`009`009`009`009log_exit(exit_slot,orig_room,orig_slot);
  119. X`009`009`009`009log_entry(enter_slot,targ_room,targ_slot);
  120. X
  121. X`009`009`009`009myslot := targ_slot;
  122. X`009`009`009`009`123 one trap `125
  123. X`009`009`009`009location := targ_room;
  124. X`009`009`009`009old_loc := location;
  125. X`009`009`009`009setevent;
  126. X
  127. X`009`009`009`009if prevcode > 0 then`032
  128. X`009`009`009`009    run_monster('',prevcode,'escaped','','',
  129. X`009`009`009`009    sysdate+' '+systime);
  130. X`009`009`009`009if old_loc <> location then goto 0; `123 panic `125
  131. X
  132. X`009`009`009`009if doalook then
  133. X`009`009`009`009`009do_look;
  134. X`009`009`009`009if old_loc <> location then goto 0;
  135. X
  136. X`009`009`009`009if here.hook > 0 then
  137. X`009`009`009`009`009run_monster('',here.hook,'enter',
  138. X`009`009`009`009`009`009'','',
  139. X       `009`009`009`009`009`009sysdate+' '+systime);
  140. X`009`009`009`009if old_loc = location then meta_run('enter','','');
  141. X                                if old_loc = location then meta_run_2('enter
  142. V','','');
  143. X
  144. X`009`009`009end;
  145. X`009`009end;
  146. X`009end else
  147. X`009  `009exit_fail(exit_slot);
  148. X`0090: `123 if monster (NPC) trow player to somewhere `125
  149. Xend;
  150. X
  151. X
  152. X
  153. Xfunction cycle_open: boolean;
  154. Xvar
  155. X`009ch: char;
  156. X`009s: string;
  157. X
  158. Xbegin
  159. X`009s := systime;
  160. X`009ch := s`0915`093;
  161. X`009if ch in `091'1','3','5','7','9'`093 then
  162. X`009`009cycle_open := true
  163. X`009else
  164. X`009`009cycle_open := false;                   `032
  165. Xend;
  166. X
  167. X
  168. Xfunction which_dir(var dir:integer;s: string): boolean;
  169. Xvar
  170. X`009aliasdir, exitdir: integer;
  171. X`009aliasmatch,exitmatch,
  172. X`009aliasexact,exitexact: boolean;
  173. X`009exitreq: boolean;
  174. X
  175. Xbegin
  176. X`009s := lowcase(s);
  177. X`009if lookup_alias(aliasdir,s) then
  178. X`009`009aliasmatch := true
  179. X`009else
  180. X`009`009aliasmatch := false;
  181. X`009if lookup_dir(exitdir,s) then
  182. X`009`009exitmatch := true
  183. X`009else
  184. X`009`009exitmatch := false;
  185. X`009if aliasmatch then begin
  186. X`009`009if s = here.exits`091aliasdir`093.alias then
  187. X`009`009`009aliasexact := true
  188. X`009`009else
  189. X`009`009`009aliasexact := false;
  190. X`009end else
  191. X`009`009aliasexact := false;
  192. X`009if exitmatch then begin
  193. X`009`009if (s = direct`091exitdir`093) or (s = substr(direct`091exitdir`093,
  194. V1,1)) then
  195. X`009`009`009exitexact := true
  196. X`009`009else
  197. X`009`009`009exitexact := false;
  198. X`009end else
  199. X`009`009exitexact := false;
  200. X`009if exitmatch then
  201. X`009`009exitreq := here.exits`091exitdir`093.reqalias
  202. X`009else
  203. X`009`009exitreq := false;
  204. X
  205. X`009dir := 0;
  206. X`009which_dir := true;
  207. X`009if aliasexact and exitexact then
  208. X`009`009dir := aliasdir
  209. X`009else if aliasexact then
  210. X`009`009dir := aliasdir
  211. X`009else if exitexact and not exitreq then
  212. X`009`009dir := exitdir
  213. X`009else if aliasmatch then
  214. X`009`009dir := aliasdir
  215. X`009else if exitmatch and not exitreq then
  216. X`009`009dir := exitdir
  217. X`009else if exitmatch and exitreq then begin
  218. X`009`009dir := exitdir;
  219. X`009`009which_dir := false;
  220. X`009end else begin
  221. X`009`009which_dir := false;
  222. X`009end;
  223. Xend;
  224. X
  225. X
  226. Xprocedure exit_case(dir: integer);
  227. X
  228. Xbegin
  229. X`009case here.exits`091dir`093.kind of
  230. X`009`0090: exit_fail(dir);
  231. X`009`0091: do_exit(dir);  `123 more checking goes here `125
  232. X
  233. X`009`0093: if obj_hold(here.exits`091dir`093.objreq) then
  234. X`009`009`009exit_fail(dir)
  235. X`009`009   else
  236. X`009`009`009do_exit(dir);
  237. X`009`0094: if rnd100 < 34 then
  238. X`009`009`009do_exit(dir)
  239. X`009`009   else
  240. X`009`009`009exit_fail(dir);
  241. X
  242. X`009`0092: begin
  243. X`009`009`009if obj_hold(here.exits`091dir`093.objreq) then
  244. X`009`009`009`009do_exit(dir)
  245. X`009`009`009else
  246. X`009`009`009`009exit_fail(dir);
  247. X`009`009   end;
  248. X`009`0096: if obj_hold(here.exits`091dir`093.objreq) then
  249. X`009`009`009do_exit(dir)
  250. X`009`009     else
  251. X`009`009`009exit_fail(dir);
  252. X`009`0097: if cycle_open then
  253. X`009`009`009do_exit(dir)
  254. X`009`009   else
  255. X`009`009exit_fail(dir);
  256. X`009end;
  257. Xend;
  258. X
  259. X`123
  260. XPlayer wants to go to s
  261. XHandle everthing, this is the top level procedure
  262. X
  263. XCheck that he can go to s
  264. XPut him through the exit`009( in do_exit )
  265. XDo a look for him`009`009( in do_exit )
  266. X`125
  267. Xprocedure do_go(s: string;verb:boolean := true);
  268. Xlabel exit_label;
  269. Xvar
  270. X`009dir: integer;               `032
  271. X
  272. X    procedure leave;
  273. X    begin
  274. X`009writeln('EXIT - no changes.');
  275. X`009goto exit_label;
  276. X    end;
  277. X
  278. X    procedure exit_fail2(dir: integer);
  279. X    begin
  280. X`009if here.hook = 0 then exit_fail(dir)
  281. X`009else if not run_monster (
  282. X`009    '',here.hook,'wrong dir','direction',
  283. X`009    s,sysdate+' '+systime) then exit_fail(dir);
  284. X    end; `123 exit_fail2 `125
  285. X
  286. Xbegin
  287. X    if s = '' then grab_line('Direction? ',s,eof_handler := leave);
  288. X
  289. X    gethere;
  290. X    if checkhide then begin
  291. X`009if length(s) = 0 then
  292. X`009    writeln('You must give the direction you wish to travel.')
  293. X`009else begin
  294. X`009    if which_dir(dir,s) then begin
  295. X`009`009if (dir >= 1) and (dir <= maxexit) then begin
  296. X`009`009    if here.exits`091dir`093.toloc = 0 then exit_fail2(dir)
  297. X`009`009    else if here.exits`091dir`093.reqverb and not verb then`032
  298. X`009`009`009exit_fail2(dir)
  299. X`009`009    else exit_case(dir);
  300. X
  301. X`009`009end else exit_fail2(dir);
  302. X`009    end else exit_fail2(dir);
  303. X`009end;
  304. X    end;
  305. X    exit_label:
  306. Xend;
  307. X
  308. X
  309. Xprocedure nice_say(var s: string);
  310. X
  311. Xbegin
  312. X`009`009`123 capitalize the first letter of their sentence `125
  313. X
  314. X`009if s`0911`093 in `091'a'..'z'`093 then
  315. X`009`009s`0911`093 := chr( ord('A') + (ord(s`0911`093) - ord('a')) );
  316. X
  317. X`009`009`009`123 put a period on the end of their sentence if
  318. X`009`009`009  they don't use any punctuation. `125
  319. X
  320. X`009if s`091length(s)`093 in `091'a'..'z','A'..'Z'`093 then
  321. X`009`009s := s + '.';
  322. Xend;
  323. X
  324. X
  325. Xprocedure do_say(s:string);
  326. Xlabel exit_label;
  327. Xvar`009old_loc: integer;
  328. X
  329. X    procedure leave;
  330. X    begin
  331. X`009writeln('EXIT - no changes.');
  332. X`009goto exit_label;
  333. X    end;
  334. X
  335. Xbegin
  336. X`009if s = '' then grab_line('Message? ',s,
  337. X`009    eof_handler := leave);
  338. X
  339. X`009if length(s) > 0 then begin
  340. X
  341. X`123`009`009if length(s) + length(myname) > 79 then begin
  342. X`009`009`009s := substr(s,1,75-length(myname));
  343. X`009`009`009writeln('Your message was truncated:');
  344. X`009`009`009writeln('-- ',s);
  345. X`009`009end;`009`009`009`009`009`125
  346. X
  347. X`009`009nice_say(s);
  348. X`009`009if hiding then
  349. X`009`009`009log_event(myslot,E_HIDESAY,0,0,s)
  350. X`009`009else
  351. X`009  `009`009log_event(myslot,E_SAY,0,0,s);
  352. X
  353. X`009`009old_loc := location;
  354. X`009`009if here.hook > 0 then`032
  355. X`009`009`009run_monster('',here.hook,'say','speech',s,
  356. X`009`009`009`009sysdate+' '+systime);
  357. X`009`009if old_loc = location then meta_run('say','speech',s);
  358. X`009end else
  359. X`009`009writeln('To talk to others in the room, type SAY <message>.');
  360. X    exit_label:
  361. Xend;
  362. X
  363. Xprocedure do_setname(s: string);
  364. Xvar
  365. X`009notice: string;
  366. X`009ok: boolean;
  367. X`009dummy: integer;
  368. X`009sprime: string;
  369. X
  370. Xbegin
  371. X  `123 if s = '' then grab_line('Name? ',s); `125
  372. X
  373. X  gethere;
  374. X  if s <> '' then begin
  375. X     if length(s) <= shortlen then begin
  376. X         sprime := lowcase(s);
  377. X`009 if (sprime = 'monster manager') and (userid <> MM_userid) then begin
  378. X            writeln('Only the Monster Manager can have that personal name.')
  379. V;
  380. X            ok := false;
  381. X         end else ok := true;
  382. X         if ok then begin
  383. X            if exact_pers(dummy,sprime) then begin
  384. X               if dummy = mylog then ok := true
  385. X               else begin`032
  386. X                  writeln('Someone already has that name.  Your personal nam
  387. Ve must be unique.');
  388. X                  ok := false;
  389. X               end;
  390. X            end;
  391. X         end;
  392. X         if ok then begin
  393. X            myname := s;
  394. X            getroom;
  395. X            notice := here.people`091myslot`093.name;
  396. X            here.people`091myslot`093.name := s;
  397. X            putroom;
  398. X            notice := notice + ' is now known as ' + s;
  399. X            if not(hiding) then log_event(0,E_SETNAM,0,0,notice);
  400. X            `123 slot 0 means notify this player also `125
  401. X            getpers;`009`123 note the new personal name in the logfile `125
  402. X            pers.idents`091mylog`093 := s; `123 don't lowcase it `125
  403. X            putpers;
  404. X         end;
  405. X     end else writeln('Please limit your personal name to ',shortlen:1,' cha
  406. Vracters.');
  407. X  end else writeln('You are known to others as ',myname);
  408. Xend;
  409. X
  410. Xprocedure meta_run; `123 (label_name,variable: shortstring;
  411. X                    value: mega_string); forward `125
  412. Xlabel 1;
  413. Xvar i: integer;
  414. X    oldloc: integer;
  415. Xbegin    `032
  416. X   oldloc := location;
  417. X   gethere;
  418. X   for i:= 1 to maxpeople do
  419. X      if here.people`091i`093.kind = P_MONSTER then`032
  420. X         if here.people`091i`093.health > 0 then begin
  421. X            run_monster (here.people`091i`093.name,
  422. X                                  here.people`091i`093.parm,
  423. X                                  label_name,variable,value,
  424. X                                  sysdate+' '+systime);
  425. X            if location <> oldloc then goto 1; `123 oobss !! `125
  426. X`009    gethere;`009    `123 this is necessary `125
  427. X         end;
  428. X  1:
  429. Xend;
  430. X
  431. Xprocedure meta_run_2; `123 (label_name,variable: shortstring;
  432. X                    value: mega_string); forward `125
  433. Xlabel 1;
  434. Xvar i: integer;
  435. X    oldloc,num: integer;
  436. Xbegin    `032
  437. X   oldloc := location;
  438. X   gethere;
  439. X   for i:= 1 to maxobjs do begin
  440. X      num := here.objs`091i`093;
  441. X      if num > 0 then begin
  442. X         getobj(num);
  443. X         freeobj;
  444. X         if obj.actindx > 0 then
  445. X            run_monster ('',obj.actindx,
  446. X                                  label_name,variable,value,
  447. X                                  sysdate+' '+systime);
  448. X         if location <> oldloc then goto 1; `123 oobss !! `125
  449. X`009 gethere;`009    `123 this is neccessary `125
  450. X      end;
  451. X  end;
  452. X  1:
  453. Xend;
  454. X
  455. X  `032
  456. Xprocedure attack_monster(mslot,power: integer);
  457. Xvar health,mid,old_health: integer;
  458. X    tmp: intrec;
  459. Xbegin
  460. X   getroom;
  461. X   if here.people`091mslot`093.kind <> P_MONSTER then begin
  462. X      freeroom;
  463. X      writeln ('%trap_1 in attack_monster. Notify Monster Manager.');
  464. X      writeln ('% I mean that really !!');
  465. X   end else begin
  466. X      if not exact_user(mid,here.people`091mslot`093.username) then begin
  467. X           freeroom;
  468. X           writeln('%trap_2 in attack_monster. Notify Monster Manager.');
  469. X           writeln('% It is best for you !');
  470. X      end else begin
  471. X         health := here.people`091mslot`093.health;
  472. X`009 old_health := health;
  473. X         health := health - power; if health < 0 then health := 0;
  474. X         here.people`091mslot`093.health := health;
  475. X         putroom;          `032
  476. X
  477. X         tmp := anint;
  478. X         getint(N_HEALTH);
  479. X         anint.int`091mid`093 := health;
  480. X         putint;
  481. X         anint := tmp;
  482. X
  483. X         if health = 0 then begin
  484. X`009    drop_everything(mslot);
  485. X`009    if old_health > 0 then`032
  486. X`009`009if monster_owner(here.people`091mslot`093.parm) <> userid then
  487. X`009`009    add_experience(here.people`091mslot`093.experience div 6 +1);
  488. X`009 end;
  489. X         if power > 0 then desc_health(mslot);
  490. X         if health > 0 then`032
  491. X            run_monster (here.people`091mslot`093.name,
  492. X                                  here.people`091mslot`093.parm,
  493. X                               'attack','','',
  494. X                               sysdate+' '+systime);
  495. X      end
  496. X   end
  497. Xend;
  498. X
  499. X
  500. X`123
  501. X1234567890123456789012345678901234567890
  502. Xexample display for alignment:
  503. X
  504. X       Monster Status
  505. X    19-MAR-1988 08:59pm
  506. X
  507. X`125
  508. X
  509. Xprocedure do_who (param: string);
  510. Xlabel 1,2; `123 exit `125
  511. Xvar
  512. X`009i,j: integer;
  513. X`009ok: boolean;
  514. X`009metaok: boolean;
  515. X`009roomown: veryshortstring;
  516. X        code: integer;
  517. X`009c: char;
  518. X`009s: shortstring;
  519. X`009play,exist: indexrec;
  520. X`009write_this: boolean;
  521. X`009count: integer;
  522. X`009s1: string;
  523. X`009type_players,type_monsters: boolean;
  524. X
  525. X    procedure leave;
  526. X    begin
  527. X`009writeln('EXIT');
  528. X`009goto 2;
  529. X    end;
  530. X
  531. X
  532. Xvar short_line : boolean;
  533. Xbegin
  534. X
  535. X    short_line := terminal_line_len < 50;
  536. X
  537. X    param := lowcase(param);
  538. X    if param = '' then param := 'players';
  539. X
  540. X    type_monsters := index(param,'mon') > 0;
  541. X    type_players  := index(param,'pla') > 0;
  542. X    if param = 'all' then begin
  543. X`009type_monsters := true;
  544. X`009type_players := true;
  545. X    end;
  546. X    if param = '?' then begin
  547. X`009command_help('who');
  548. X    end else if not type_monsters and not type_players then
  549. X`009    writeln ('Type WHO ? for help.')
  550. X    else begin
  551. X
  552. X`009log_event(myslot,E_WHO,0,(rnd100 mod 4));
  553. X`009count := 0;
  554. X
  555. X`009`123 we need just about everything to print this list:
  556. X`009`009player alloc index, userids, personal names,
  557. X`009`009room names, room owners, and the log record`009`125
  558. X
  559. X`009getindex(I_ASLEEP);`009`123 Get index of people who are playing now `125
  560. X`009freeindex;
  561. X`009play := indx;
  562. X`009getindex(I_PLAYER);
  563. X`009freeindex;
  564. X`009exist := indx;
  565. X`009getuser;
  566. X`009freeuser;
  567. X`009getpers;
  568. X`009freepers;
  569. X`009getnam;
  570. X`009freenam;
  571. X`009getown;
  572. X`009freeown;
  573. X`009getint(N_LOCATION);`009`123 get where they are `125
  574. X`009freeint;
  575. X`009if not short_line then write('              ');
  576. X`009writeln('     Monster Status');
  577. X`009if not short_line then write('              ');
  578. X`009writeln('  ',sysdate,' ',systime);
  579. X`009writeln;
  580. X`009if not short_line then write('Username        ');
  581. X`009writeln('Game Name                 Where');
  582. X
  583. X
  584. X`009if (poof_priv or owner_priv) `123 or has_kind(O_ALLSEEING) `125 then `12
  585. V3 minor change by leino@finuha `125
  586. X`009`009metaok := true
  587. X`009else
  588. X`009`009metaok := false;
  589. X
  590. X`009for i := 1 to exist.top do begin
  591. X`009`009if not(exist.free`091i`093) then begin
  592. X
  593. X`009`009`009write_this := not play.free`091i`093;
  594. X                        if user.idents`091i`093 = '' then begin
  595. X                           if write_this and not short_line then`032
  596. X`009`009`009    write('<unknown>       ')
  597. X                        end else if user.idents`091i`093`0911`093 <> ':' the
  598. Vn begin
  599. X`009`009`009   if not type_players then write_this := false;
  600. X`009`009`009   if write_this and not short_line then begin
  601. X`009`009`009`009write(user.idents`091i`093);
  602. X`009`009`009`009for j := length(user.idents`091i`093) to 15 do
  603. X`009`009`009`009    write(' ');
  604. X`009`009`009   end;
  605. X                        end else begin
  606. X`009`009`009   readv(user.idents`091i`093,c,code);
  607. X`009`009`009   write_this := write_this or monster_runnable(code);
  608. X`009`009`009   if not type_monsters then write_this := false;
  609. X`009`009`009   if write_this and not short_line then begin
  610. X`009`009`009      s := monster_owner(code);
  611. X`009`009`009      write('<',class_out(s),'>');
  612. X                              for j := length(class_out(s)) to 13 do write('
  613. V ');
  614. X                           end;
  615. X                        end;
  616. X                       `032
  617. X                        if write_this then begin
  618. X`009`009`009   write(pers.idents`091i`093);
  619. X`009`009`009   j := length(pers.idents`091i`093);
  620. X`009`009`009   while j <= 25 do begin
  621. X`009`009`009      write(' ');
  622. X`009`009`009      j := j + 1;
  623. X`009`009`009   end;
  624. X                                                   `032
  625. X`009`009`009   if not(metaok) then begin
  626. X`009`009`009      roomown := own.idents`091anint.int`091i`093`093;
  627. X
  628. X`123 if a person is in a public or disowned room, or
  629. X  if they are in the domain of the WHOer, then the player should know
  630. X  where they are  `125
  631. X
  632. X`009`009`009      if (roomown = public_id) or
  633. X`009`009`009`009    (roomown = disowned_id) or
  634. X`009`009`009`009    (roomown = userid) then
  635. X`009`009`009`009`009ok := true
  636. X`009`009`009      else
  637. X`009`009`009`009`009ok := false;
  638. X
  639. X
  640. X`009`009`009   end;
  641. X
  642. X
  643. X`009`009`009   if ok or metaok then begin
  644. X`009`009`009`009writeln(nam.idents`091anint.int`091i`093`093);
  645. X`009`009`009   end else
  646. X`009`009`009`009writeln('n/a');
  647. X`009`009`009  count := count +1;
  648. X`009`009`009  if count mod ( terminal_page_len - 2) = 0 then begin
  649. X`009`009`009`009grab_line('-more-',s1,erase := true,
  650. X`009`009`009`009    eof_handler := leave);
  651. X`009`009`009`009if s1 > '' then goto 1;
  652. X`009`009`009  end;
  653. X                       end; `123 write_this `125
  654. X`009`009end;
  655. X`009end;
  656. X`0091:  `123 for quit `125
  657. X    end;
  658. X    2:
  659. Xend;
  660. X
  661. X
  662. Xprocedure list_rooms(s: shortstring; PROCEDURE more);
  663. Xvar
  664. X`009first: boolean;
  665. X`009i,j,posit: integer;
  666. X
  667. X`009columns: integer;
  668. Xbegin
  669. X`009columns := terminal_line_len div 24;
  670. X`009if columns < 1 then columns := 1;
  671. X
  672. X`009first := true;
  673. X`009posit := 0;
  674. X`009for i := 1 to indx.top do begin
  675. X`009`009if (not indx.free`091i`093) and (own.idents`091i`093 = s) then begin
  676. X`009`009`009if posit = columns then begin
  677. X`009`009`009`009posit := 1;
  678. X`009`009`009`009writeln;
  679. X`009`009`009`009more;
  680. X`009`009`009end else
  681. X`009`009`009`009posit := posit + 1;
  682. X`009`009`009if first then begin
  683. X`009`009`009`009first := false;
  684. X`009`009`009`009writeln(class_out(s),':');
  685. X`009`009`009`009more;
  686. X`009`009`009end;
  687. X`009`009`009write('    ',nam.idents`091i`093);
  688. X`009`009`009for j := length(nam.idents`091i`093) to 21 do
  689. X`009`009`009`009write(' ');
  690. X`009`009end;
  691. X`009end;
  692. X`009if posit <> 3 then begin
  693. X`009`009writeln;
  694. X`009`009more;
  695. X`009end;
  696. X
  697. X`009if first then
  698. X`009`009writeln('No rooms owned by ',class_out(s))
  699. X`009else
  700. X`009`009writeln;
  701. X`009more;
  702. Xend;
  703. X
  704. X
  705. Xprocedure list_all_rooms;
  706. Xlabel 1;
  707. X
  708. X    procedure leave;
  709. X    begin
  710. X`009writeln('EXIT');
  711. X`009goto 1;
  712. X    end;
  713. X
  714. Xvar
  715. X`009i,j: integer;
  716. X`009tmp: packed array`0911..maxroom`093 of boolean;
  717. X`009linecount: integer;
  718. X
  719. X    procedure more;
  720. X    var s: string;
  721. X    begin
  722. X`009linecount := linecount +1;
  723. X`009if linecount > terminal_page_len -2 then begin
  724. X`009    grab_line('-more-',s,erase:=true,
  725. X`009`009eof_handler := leave);
  726. X`009    if s > '' then goto 1;
  727. X`009    linecount := 0
  728. X`009end;
  729. X    end;
  730. X
  731. Xbegin
  732. X
  733. X`009linecount := 0;
  734. X`009tmp := zero;
  735. X
  736. X`009list_rooms(public_id,more); `009`123 public rooms first `125
  737. X`009list_rooms(system_id,more); `009`123 system rooms `125
  738. X`009list_rooms(disowned_id,more); `009`123 disowned rooms next `125
  739. X`009for i := 1 to indx.top do begin
  740. X`009`009if not(indx.free`091i`093) and not(tmp`091i`093) and
  741. X`009`009   (own.idents`091i`093 <> system_id) and`032
  742. X`009`009   (own.idents`091i`093 <> disowned_id) and
  743. X`009`009   (own.idents`091i`093 <> public_id) then begin
  744. X`009`009`009`009list_rooms(own.idents`091i`093,more);`009`123 player rooms `
  745. V125
  746. X`009`009`009`009for j := 1 to indx.top do
  747. X`009`009`009`009`009if own.idents`091j`093 = own.idents`091i`093 then
  748. X`009`009`009`009`009`009tmp`091j`093 := TRUE;
  749. X`009`009end;
  750. X`009end;
  751. X    1: `123 out `125`032
  752. Xend;
  753. X
  754. Xprocedure do_rooms(s: string);
  755. Xlabel 1;
  756. X
  757. X    procedure leave;
  758. X    begin
  759. X`009writeln('EXIT');
  760. X`009goto 1;
  761. X    end;
  762. X
  763. Xvar
  764. X`009cmd: string;
  765. X`009id: shortstring;
  766. X`009listall: boolean;
  767. X`009linecount: integer;
  768. X
  769. X    procedure more;
  770. X    var s: string;
  771. X    begin
  772. X`009linecount := linecount +1;
  773. X`009if linecount > terminal_page_len -2 then begin
  774. X`009    grab_line('-more-',s,erase:=true,
  775. X`009`009eof_handler := leave);
  776. X`009    if s > '' then goto 1;
  777. X`009    linecount := 0
  778. X`009end;
  779. X    end;
  780. X
  781. X
  782. Xbegin
  783. X    linecount := 0;
  784. X    getnam;
  785. X    freenam;
  786. X    getown;
  787. X    freeown;
  788. X    getindex(I_ROOM);
  789. X    freeindex;
  790. X
  791. X    listall := false;
  792. X    s := lowcase(s);
  793. X    cmd := bite(s);
  794. X    if cmd = '?' then begin
  795. X`009command_help('rooms');
  796. X    end else begin
  797. X`009if cmd = '' then
  798. X`009`009id := userid
  799. X`009else if lookup_class(id,cmd) then   `123 hurtta@finuh `125
  800. X`009else if (cmd = '*') or (cmd = 'all') then
  801. X`009`009listall := true
  802. X`009else if length(cmd) > veryshortlen then
  803. X`009`009id := substr(cmd,1,veryshortlen)
  804. X`009else
  805. X`009`009id := cmd;
  806. X
  807. X`009if listall then begin
  808. X`009`009if poof_priv or owner_priv then `123 minor change by leino@finuha `1
  809. V25
  810. X`009`009`009list_all_rooms
  811. X`009`009else
  812. X`009`009`009writeln('You may not obtain a list of all the rooms.');
  813. X`009end else begin
  814. X`009`009if poof_priv or owner_priv or`032
  815. X`009`009`009(userid = id) or`032
  816. X`009`009`009(id = public_id) or`032
  817. X`009`009`009(id = disowned_id) then
  818. X`009`009`009`123 minor change by leino@finuha `125
  819. X`009`009`009list_rooms(id,more)
  820. X`009`009else
  821. X`009`009`009writeln('You may not list rooms that belong to another player.')
  822. V;
  823. X`009end;
  824. X    end;
  825. X    1: `123 out `125
  826. Xend;
  827. X
  828. X
  829. X
  830. Xprocedure do_objects (param: string);
  831. Xlabel 0; `123 out `125
  832. Xvar
  833. X`009i: integer;
  834. X`009total,public,disowned,private,system: integer;
  835. X`009id: shortstring;
  836. X`009print_count: integer;
  837. X`009s1: string;
  838. X`009all: boolean;`032
  839. X`009player: shortstring;
  840. X`009myindex: indexrec;
  841. X
  842. X    procedure leave;
  843. X    begin
  844. X`009writeln('EXIT');
  845. X`009goto 0;
  846. X    end;
  847. X
  848. Xbegin
  849. X    param := lowcase(param);
  850. X    all := false;
  851. X    if param = '' then player := userid
  852. X    else if (param = '*') or (param = 'all') then begin
  853. X`009player := '<all objects>';
  854. X`009all := true
  855. X    end else if lookup_class(player,param) then
  856. X    else if length(param) > shortlen then`032
  857. X`009player := substr(param,1,shortlen)
  858. X    else player := param;
  859. X`009
  860. X    if param = '?' then begin
  861. X`009command_help('objects');
  862. X    end else if (player <> public_id) and (player <> disowned_id) and
  863. X`009(player <> userid) and not owner_priv then
  864. X`009writeln('You can only get list of your own objects.')
  865. X    else begin
  866. X`009if all then writeln('Objects:')
  867. X`009else writeln('Objects of ',class_out(player),':');
  868. X`009print_count := 0;
  869. X`009getobjnam;
  870. X`009freeobjnam;
  871. X`009getobjown;
  872. X`009freeobjown;
  873. X`009getindex(I_OBJECT);
  874. X`009freeindex; myindex := indx;
  875. X
  876. X`009total := 0;
  877. X`009public := 0;
  878. X`009disowned := 0;
  879. X`009private := 0;
  880. X`009system := 0;
  881. X
  882. X`009writeln;
  883. X`009for i := 1 to myindex.top do`032
  884. X`009    if not(myindex.free`091i`093) then begin
  885. X`009`009total := total + 1;
  886. X`009`009id := objown.idents`091i`093;
  887. X`009`009if id = public_id then public := public + 1
  888. X`009`009else if id = disowned_id then  disowned := disowned + 1
  889. X`009`009else if id = system_id then system := system + 1
  890. X`009`009else private := private + 1;
  891. X
  892. X`009`009if (id = player) or (all) then  begin`032
  893. X`009`009`009writeln(i:4,'    ',
  894. X`009`009`009    class_out(id):12,'    ',
  895. X`009`009`009    objnam.idents`091i`093);
  896. X`009`009`009print_count := print_count +1;
  897. X`009`009`009if print_count > terminal_page_len -2 then begin
  898. X`009`009`009    grab_line('-more-',s1,erase := true,
  899. X`009`009`009`009eof_handler := leave);
  900. X`009`009`009    if s1 > '' then goto 0;
  901. X`009`009`009    print_count := 0;
  902. X`009`009`009end;
  903. X`009`009    end;
  904. X`009    end;
  905. X`009writeln;
  906. X`009writeln('Public:      ',public:4);
  907. X`009writeln('Disowned:    ',disowned:4);
  908. X`009writeln('Private:     ',private:4);
  909. X`009writeln('System:      ',system:4);
  910. X`009writeln('             ----');
  911. X`009writeln('Total:       ',total:4);
  912. X    end;
  913. X    0:
  914. Xend;
  915. X
  916. Xprocedure do_monsters (param: string);
  917. Xlabel 0; `123 out `125
  918. Xvar
  919. X`009i: integer;
  920. X`009total,public,disowned,private,system,mid: integer;
  921. X`009id: shortstring;
  922. X`009print_count: integer;
  923. X`009s1: string;
  924. X`009all: boolean;`032
  925. X`009player: shortstring;
  926. X`009myindex: indexrec;
  927. X`009c,x: char;
  928. X
  929. X    procedure leave;
  930. X    begin
  931. X`009writeln('EXIT');
  932. X`009goto 0;
  933. X    end;
  934. X
  935. Xbegin
  936. X    param := lowcase(param);
  937. X    all := false;
  938. X    if param = '' then player := userid
  939. X    else if (param = '*') or (param = 'all') then begin
  940. X`009player := '<all monsters>';
  941. X`009all := true
  942. X    end else if lookup_class(player,param) then
  943. X    else if length(param) > shortlen then`032
  944. X`009player := substr(param,1,shortlen)
  945. X    else player := param;
  946. X`009
  947. X    if param = '?' then begin
  948. X`009command_help('monsters');
  949. X    end else if (player <> public_id) and (player <> disowned_id) and
  950. X`009(player <> userid) and not owner_priv then
  951. X`009writeln('You can only get list of your own monsters.')
  952. X    else begin
  953. X`009if all then writeln('Monsters:')
  954. X`009else writeln('Monsters of ',class_out(player),':');
  955. X`009print_count := 0;
  956. X`009getuser;
  957. X`009freeuser;
  958. X`009getpers;
  959. X`009freepers;
  960. X`009getindex(I_PLAYER);
  961. X`009freeindex; myindex := indx;
  962. X
  963. X`009total := 0;
  964. X`009public := 0;
  965. X`009disowned := 0;
  966. X`009private := 0;
  967. X`009system := 0;
  968. X
  969. X`009writeln;
  970. X`009for i := 1 to myindex.top do`032
  971. X`009    if not(myindex.free`091i`093) then begin
  972. X`009`009id := user.idents`091i`093;
  973. X`009`009if id > '' then if id`0911`093 = ':' then begin
  974. X`009`009    total := total + 1;
  975. X`009`009    readv(id,c,mid);
  976. X`009`009    id := monster_owner(mid);
  977. X
  978. X`009`009    if monster_runnable(mid) then x := '*'
  979. X`009`009    else x := ' ';
  980. X
  981. X`009`009    if id = public_id then public := public + 1
  982. X`009`009    else if id = disowned_id then  disowned := disowned + 1
  983. X`009`009    else if id = system_id then system := system + 1
  984. X`009`009    else private := private + 1;
  985. X
  986. X`009`009    if (id = player) or (all) then  begin`032
  987. X`009`009`009writeln(i:4,' ',x,'  ',
  988. X`009`009`009    class_out(id):12,'    ',
  989. X`009`009`009    pers.idents`091i`093);
  990. X`009`009`009print_count := print_count +1;
  991. X`009`009`009if print_count > terminal_page_len -2 then begin
  992. X`009`009`009    grab_line('-more-',s1,erase := true,
  993. X`009`009`009`009eof_handler := leave);
  994. X`009`009`009    if s1 > '' then goto 0;
  995. X`009`009`009    print_count := 0;
  996. X`009`009`009end;
  997. X`009`009    end;
  998. X`009`009end;
  999. X`009    end;
  1000. X`009writeln;
  1001. X`009writeln('Public:      ',public:4);
  1002. X`009writeln('Disowned:    ',disowned:4);
  1003. X`009writeln('Private:     ',private:4);
  1004. X`009writeln('System:      ',system:4);
  1005. X`009writeln('             ----');
  1006. X`009writeln('Total:       ',total:4);
  1007. X    end;
  1008. X    0:
  1009. Xend; `123 do_monsters `125
  1010. X
  1011. Xprocedure do_spells (param: string);
  1012. Xlabel 0; `123 out `125
  1013. Xvar
  1014. X`009i: integer;
  1015. X`009total,public,disowned,private,system: integer;
  1016. X`009id: shortstring;
  1017. X`009print_count: integer;
  1018. X`009s1: string;
  1019. X`009all: boolean;`032
  1020. X`009player: shortstring;
  1021. X
  1022. X`009myindex: indexrec;
  1023. X`009myint:   intrec;
  1024. X
  1025. X    procedure leave;
  1026. X    begin
  1027. X`009writeln('EXIT');
  1028. X`009goto 0;
  1029. X    end;
  1030. X
  1031. Xbegin
  1032. X    param := lowcase(param);
  1033. X    all := false;
  1034. X    if param = '' then player := userid
  1035. X    else if (param = '*') or (param = 'all') then begin
  1036. X`009player := '<all spells>';
  1037. X`009all := true
  1038. X    end else if lookup_class(player,param) then
  1039. X    else if length(param) > shortlen then`032
  1040. X`009player := substr(param,1,shortlen)
  1041. X    else player := param;
  1042. X`009
  1043. X    if param = '?' then begin
  1044. X`009command_help('spells');
  1045. X    end else if (player <> public_id) and (player <> disowned_id) and
  1046. X`009(player <> userid) and not owner_priv then
  1047. X`009writeln('You can only get list of your own spells.')
  1048. X    else begin
  1049. X`009if all then writeln('Spells:')
  1050. X`009else writeln('Spells of ',class_out(player),':');
  1051. X`009print_count := 0;
  1052. X`009getspell_name;
  1053. X`009freespell_name;
  1054. X`009getint(N_SPELL);
  1055. X`009freeint; myint := anint;
  1056. X
  1057. X`009getindex(I_SPELL);
  1058. X`009freeindex; myindex := indx;
  1059. X
  1060. X`009total := 0;
  1061. X`009public := 0;
  1062. X`009disowned := 0;
  1063. X`009private := 0;
  1064. X`009system := 0;
  1065. X
  1066. X`009writeln;
  1067. X`009for i := 1 to myindex.top do`032
  1068. X`009    if not(myindex.free`091i`093) then begin
  1069. X`009`009total := total + 1;
  1070. X`009`009id := monster_owner(myint.int`091i`093);
  1071. X`009`009if id = public_id then public := public + 1
  1072. X`009`009else if id = disowned_id then  disowned := disowned + 1
  1073. X`009`009else if id = system_id then system := system + 1
  1074. X`009`009else private := private + 1;
  1075. X
  1076. X`009`009if (id = player) or (all) then  begin`032
  1077. X`009`009`009writeln(i:4,'    ',
  1078. X`009`009`009    class_out(id):12,'    ',
  1079. X`009`009`009    spell_name.idents`091i`093);
  1080. X`009`009`009print_count := print_count +1;
  1081. X`009`009`009if print_count > terminal_page_len -2 then begin
  1082. X`009`009`009    grab_line('-more-',s1,erase := true,
  1083. X`009`009`009`009eof_handler := leave);
  1084. X`009`009`009    if s1 > '' then goto 0;
  1085. X`009`009`009    print_count := 0;
  1086. X`009`009`009end;
  1087. X`009`009    end;
  1088. X`009    end;
  1089. X`009writeln;
  1090. X`009writeln('Public:      ',public:4);
  1091. X`009writeln('Disowned:    ',disowned:4);
  1092. X`009writeln('Private:     ',private:4);
  1093. X`009writeln('System:      ',system:4);
  1094. X`009writeln('             ----');
  1095. X`009writeln('Total:       ',total:4);
  1096. X    end;
  1097. X    0:
  1098. Xend;
  1099. X
  1100. X
  1101. Xprocedure do_claim(s: string);
  1102. Xvar
  1103. X`009n,code,mslot: integer;
  1104. X`009ok: boolean;
  1105. X`009tmp: string;
  1106. X`009oldowner : integer;
  1107. X
  1108. Xbegin
  1109. X`009if length(s) = 0 then begin`009`123 claim this room `125
  1110. X`009`009getroom;
  1111. X`009`009if not exact_user(oldowner,here.owner) then oldowner := 0;
  1112. X`009`009if (here.owner = disowned_id) or`032
  1113. X`009`009    (owner_priv and (here.owner <> system_id)) or
  1114. X`009`009    manager_priv then begin `123 minor change by leino@finuha `125
  1115. X`009`009`009`009`009    `123 and hurtta@finuh `125
  1116. X`009`009`009here.owner := userid;
  1117. X`009`009`009putroom;
  1118. X`009`009`009change_owner(oldowner,mylog);
  1119. X`009`009`009if here.hook > 0 then set_owner(here.hook,0,userid);
  1120. X`009`009`009getown;
  1121. X`009`009`009own.idents`091location`093 := userid;
  1122. X`009`009`009putown;
  1123. X`009`009`009log_event(myslot,E_CLAIM,0,0);
  1124. X`009`009`009writeln('You are now the owner of this room.');
  1125. X`009`009end else begin
  1126. X`009`009`009freeroom;
  1127. X`009`009`009if here.owner = public_id then
  1128. X`009`009`009`009writeln('This is a public room.  You may not claim it.')
  1129. X`009`009`009else if here.owner = system_id then
  1130. X`009`009`009`009writeln('The system own this room.  You may not claim it.')
  1131. X`009`009`009else
  1132. X`009`009`009`009writeln('This room has an owner.');
  1133. X`009`009end;
  1134. X`009end else if lookup_obj(n,s) then begin
  1135. X`009`009getobjown;
  1136. X`009`009freeobjown;
  1137. X      `009  `009`123*** Let the MM claim any object ***`125
  1138. X`009`009`123 jlaiho@finuh `125
  1139. X`009`009if ( (objown.idents`091n`093 = public_id)`032
  1140. X`009`009    and (not owner_priv) ) then `123 minor change by leino@finuha `1
  1141. V25
  1142. X`009`009    writeln('That is a public object.  You may DUPLICATE it, but may
  1143. V not CLAIM it.')
  1144. X`009`009else if ( (objown.idents`091n`093 = system_id)`032
  1145. X`009`009    and (not manager_priv) ) then `123 minor change by hurtta@finuha
  1146. V `125
  1147. X`009`009    writeln('That is a system''s object. ')
  1148. X`009`009else if ( (objown.idents`091n`093 <> disowned_id)`032
  1149. X`009`009    and (not owner_priv) ) then `123 minor change by leino@finuha `1
  1150. V25
  1151. X`009`009    writeln('That object has an owner.')
  1152. X`009`009else begin
  1153. X`009`009`009getobj(n);
  1154. X`009`009`009freeobj;
  1155. X`009`009`009if obj.numexist = 0 then
  1156. X`009`009`009`009ok := true
  1157. X`009`009`009else begin
  1158. X`009`009`009`009if obj_hold(n) or obj_here(n) then
  1159. X`009`009`009`009`009ok := true
  1160. X`009`009`009`009else
  1161. X`009`009`009`009`009ok := false;
  1162. X`009`009`009end;
  1163. X                       `032
  1164. X`009`009`009if ok then begin
  1165. X`009`009`009`009getobjown;
  1166. X`009`009`009`009objown.idents`091n`093 := userid;
  1167. X`009`009`009`009putobjown;
  1168. X`009`009`009`009if obj.actindx > 0 then
  1169. X`009`009`009`009`009set_owner(obj.actindx,0,userid);
  1170. X`009`009`009`009tmp := obj.oname;
  1171. X`009`009`009`009log_event(myslot,E_OBJCLAIM,0,0,tmp);
  1172. X`009`009`009`009writeln('You are now the owner of ',tmp,'.');
  1173. X`009`009`009end else
  1174. X`009`009`009`009writeln('You must have one to claim it.');
  1175. X`009`009end;
  1176. X`009end else if lookup_pers(n,s) then begin
  1177. X`009`009if parse_pers(mslot,s) then begin   `123 parse_pers make gethere `12
  1178. V5
  1179. X`009`009`009if here.people`091mslot`093.kind = P_MONSTER then begin
  1180. X          `009`009`009code := here.people`091mslot`093.parm;
  1181. X`009`009`009`009if ( (monster_owner(code) = public_id)`032
  1182. X`009`009`009`009    and (not owner_priv) ) then`032
  1183. X`009`009`009`009    writeln('That is a public monster.')
  1184. X`009`009`009`009else if ( (monster_owner(code) = system_id)`032
  1185. X`009`009`009`009    and (not manager_priv) ) then
  1186. X`009`009`009`009    writeln('That is a system''s monster.')
  1187. X`009`009`009`009else if ( (monster_owner(code) <> disowned_id)`032
  1188. X`009`009`009`009    and (not owner_priv) ) then`032
  1189. X`009`009`009`009    writeln('That monster has an owner.')
  1190. X`009`009`009`009else begin
  1191. X`009`009`009`009`009set_owner(code,0,userid);
  1192. X`009`009`009`009`009tmp := here.people`091mslot`093.name;
  1193. X`009`009`009`009`009log_event(myslot,E_OBJCLAIM,0,0,tmp);
  1194. X`009`009`009`009`009writeln('You are now the owner of ',tmp,'.');
  1195. X`009`009`009`009end;
  1196. X`009`009`009end else writeln ('That isn''t a monster.');`009`009`009
  1197. X                end else writeln ('That monster isn''t here.');
  1198. X`009end else if lookup_spell(n,s) then begin
  1199. X`009    if ( (spell_owner(n) = public_id) and (not owner_priv) ) then`032
  1200. X`009`009`009`009    writeln('That is a public spell.')
  1201. X`009    else if ( (spell_owner(n) = system_id) and (not manager_priv) ) then
  1202. X`009`009`009`009    writeln('That is a system''s spell.')
  1203. X`009    else if ( (spell_owner(n) <> disowned_id) and (not owner_priv) ) the
  1204. Vn`032
  1205. X`009`009`009`009    writeln('That spell has an owner.')
  1206. X`009    else begin
  1207. X`009`009`009`009`009getint(N_SPELL);
  1208. X`009`009`009`009`009freeint;
  1209. X`009`009`009`009`009code := anint.int`091n`093;
  1210. X`009`009`009`009`009set_owner(code,0,userid);
  1211. X`009`009`009`009`009tmp := spell_name.idents`091n`093;
  1212. X`009`009`009`009`009log_event(myslot,E_OBJCLAIM,0,0,tmp);
  1213. X`009`009`009`009`009writeln('You are now the owner of ',tmp,'.');
  1214. X`009    end;
  1215. X`009end else writeln('There is nothing here by that name to claim.');
  1216. Xend;
  1217. X
  1218. Xprocedure do_disown(s: string);
  1219. Xvar
  1220. X`009n,mslot,code,oldowner: integer;
  1221. X`009tmp: string;
  1222. Xbegin
  1223. X
  1224. X`009if length(s) = 0 then begin`009`123 claim this room `125
  1225. X`009`009getroom;
  1226. X`009`009if not exact_user(oldowner,here.owner) then oldowner := 0;
  1227. X`009`009if (here.owner = userid) or`032
  1228. X`009`009    (owner_priv and (here.owner <> system_id)) or
  1229. X`009`009    manager_priv then begin `123 minor change by leino@finuha `125
  1230. X`009`009`009getroom;
  1231. X`009`009`009here.owner := disowned_id;
  1232. X`009`009`009putroom;
  1233. X`009`009`009change_owner(oldowner,0);
  1234. X`009`009`009if here.hook > 0 then set_owner(here.hook,0,disowned_id);
  1235. X`009`009`009getown;
  1236. X`009`009`009own.idents`091location`093 := disowned_id;
  1237. X`009`009`009putown;
  1238. X`009`009`009log_event(myslot,E_DISOWN,0,0);
  1239. X`009`009`009writeln('You have disowned this room.');
  1240. X`009`009end else begin
  1241. X`009`009`009freeroom;
  1242. X`009`009`009if here.owner = system_id then
  1243. X`009`009`009    writeln('Owner of this room is system.')
  1244. X`009`009`009else writeln('You are not the owner of this room.');
  1245. X`009`009end;
  1246. X`009end else begin`009`123 disown an object `125
  1247. X`009`009if lookup_obj(n,s) then begin
  1248. X`009`009`009getobj(n);
  1249. X`009`009`009freeobj;
  1250. X`009`009`009tmp := obj.oname;
  1251. X
  1252. X`009`009`009getobjown;
  1253. X`009`009`009if (objown.idents`091n`093 = userid) or`032
  1254. X`009`009`009    (owner_priv and ( objown.idents`091n`093 <> system_id))
  1255. X`009`009`009    or manager_priv then begin
  1256. X`009`009`009`009objown.idents`091n`093 := disowned_id;
  1257. X`009`009`009`009putobjown;
  1258. X`009`009`009`009if obj.actindx > 0 then
  1259. X`009`009`009`009`009set_owner(obj.actindx,0,disowned_id);
  1260. X`009`009`009`009log_event(myslot,E_OBJDISOWN,0,0,tmp);
  1261. X`009`009`009`009writeln('You are no longer the owner of the ',tmp,'.');
  1262. X`009`009`009end else begin
  1263. X`009`009`009`009freeobjown;
  1264. X`009`009`009`009if objown.idents`091n`093 = system_id then
  1265. X`009`009`009`009    writeln('System is owner of this.')
  1266. X`009`009`009`009else writeln('You are not the owner of any such thing.');
  1267. X`009`009`009end;
  1268. X`009`009end else if lookup_pers(n,s) then begin
  1269. X`009`009`009if parse_pers(mslot,s) then begin   `123 parse_pers make gethere
  1270. V `125`009`009 `032
  1271. X`009`009`009`009if here.people`091mslot`093.kind = P_MONSTER then begin
  1272. X`009`009`009`009    code := here.people`091mslot`093.parm;
  1273. X`009`009`009`009    if (monster_owner(code) = system_id)
  1274. X`009`009`009`009`009and not manager_priv then
  1275. X`009`009`009`009`009    writeln('The owner of this monster is system.') `009
  1276. X`009`009`009`009    else if  (monster_owner(code) <> userid)`032
  1277. X`009`009`009`009`009and not owner_priv then`032
  1278. X`009`009`009`009`009    writeln('You are not the owner of this monster')
  1279. X`009`009`009`009    else begin
  1280. X`009`009`009`009`009set_owner(code,0,disowned_id);
  1281. X`009`009`009`009`009tmp := here.people`091mslot`093.name;
  1282. X`009`009`009`009`009log_event(myslot,E_OBJDISOWN,0,0,tmp);
  1283. X`009`009`009`009`009writeln('You are no longer the owner of the ',tmp,'.');
  1284. X`009`009`009`009    end;
  1285. X`009`009`009`009end else writeln ('That isn''t monster.');
  1286. X                `009end else writeln ('Here isn''t that monster.');
  1287. X`009`009end else if lookup_spell(n,s) then begin
  1288. X`009`009    if (spell_owner(n) = system_id) and not manager_priv then
  1289. X`009`009`009writeln('The owner of this spell is system.') `009
  1290. X`009`009    else if (spell_owner(n) <> userid) and not owner_priv then`032
  1291. X`009`009`009writeln('You are not the owner of this spell')
  1292. X`009`009    else begin
  1293. X`009`009`009getint(N_SPELL);
  1294. X`009`009`009freeint;
  1295. X`009`009`009code := anint.int`091n`093;
  1296. X`009`009`009set_owner(code,0,disowned_id);
  1297. X`009`009`009tmp := spell_name.idents`091n`093;
  1298. X`009`009`009log_event(myslot,E_OBJDISOWN,0,0,tmp);
  1299. X`009`009`009writeln('You are no longer the owner of the ',tmp,'.');
  1300. X`009`009    end;
  1301. X`009`009end else writeln('You are not the owner of any such thing.');
  1302. X`009end;
  1303. Xend;
  1304. X
  1305. X
  1306. Xprocedure do_public(s: string);
  1307. Xvar
  1308. X`009ok: boolean;
  1309. X`009tmp: string;
  1310. X`009n,mslot,code,oldowner: integer;
  1311. X`009pub: shortstring;
  1312. X
  1313. Xbegin
  1314. X
  1315. X`009if manager_priv then begin `123 minor change by leino@finuha `125
  1316. X`009`009if length(s) = 0 then begin
  1317. X`009`009`009getroom;
  1318. X`009`009`009if not exact_user(oldowner,here.owner) then oldowner := 0;
  1319. X`009`009`009here.owner := public_id;
  1320. X`009`009`009putroom;
  1321. X`009`009`009change_owner(oldowner,0);
  1322. X`009`009`009if here.hook > 0 then set_owner(here.hook,0,public_id);
  1323. X`009`009`009getown;
  1324. X`009`009`009own.idents`091location`093 := public_id;
  1325. X`009`009`009putown;
  1326. X`009`009`009writeln('This room is now public.');
  1327. X
  1328. X`009`009end else if lookup_obj(n,s) then begin
  1329. X`009`009`009getobj(n);
  1330. X`009`009`009freeobj;
  1331. X`009`009`009if obj.numexist = 0 then ok := true
  1332. X`009`009`009else begin
  1333. X`009`009`009    if obj_hold(n) or obj_here(n) then ok := true
  1334. X`009`009`009    else ok := false;
  1335. X`009`009`009end;
  1336. X
  1337. X`009`009`009if ok then begin
  1338. X`009`009`009    getobjown;
  1339. X`009`009`009    objown.idents`091n`093 := public_id;
  1340. X`009`009`009    putobjown;
  1341. X`009`009`009    if obj.actindx > 0 then
  1342. X`009`009`009`009set_owner(obj.actindx,0,public_id);
  1343. X
  1344. X`009`009`009    tmp := obj.oname;
  1345. X`009`009`009    log_event(myslot,E_OBJPUBLIC,0,0,tmp);
  1346. X`009`009`009    writeln('The ',tmp,' is now public.');
  1347. X`009`009`009end else
  1348. X`009`009`009`009    writeln('You must have one to claim it.');
  1349. X`009`009end else if lookup_pers(n,s) then begin
  1350. X`009`009`009if parse_pers(mslot,s) then begin   `123 parse_pers make gethere
  1351. V `125`009`009 `032
  1352. X`009`009`009`009if here.people`091mslot`093.kind = P_MONSTER then begin
  1353. X`009`009`009`009    code := here.people`091mslot`093.parm;
  1354. X`009`009`009`009    set_owner(code,0,public_id);
  1355. X`009`009`009`009    tmp := here.people`091mslot`093.name;
  1356. X`009`009`009`009    log_event(myslot,E_OBJPUBLIC,0,0,tmp);
  1357. X`009`009`009`009    writeln('The ',tmp,' is now public.');
  1358. X`009`009`009`009end else writeln ('That isn''t monster.');
  1359. X                `009end else writeln ('Here isn''t that monster.');
  1360. X`009`009end else if lookup_spell(n,s) then begin
  1361. X`009`009    getint(N_SPELL);
  1362. X`009`009    freeint;
  1363. X`009`009    code := anint.int`091n`093;
  1364. X`009`009    set_owner(code,0,public_id);
  1365. X`009`009    tmp := spell_name.idents`091n`093;
  1366. X`009`009    log_event(myslot,E_OBJPUBLIC,0,0,tmp);
  1367. X`009`009    writeln('The ',tmp,' is now public.');
  1368. X`009`009end else writeln('There is nothing here by that name to make public.
  1369. V');
  1370. X`009end else
  1371. X`009`009writeln('Only the Monster Manager may make things public.');
  1372. Xend;
  1373. X
  1374. X
  1375. X
  1376. X`123 sum up the number of real exits in this room `125
  1377. X
  1378. Xfunction find_numexits: integer;
  1379. Xvar
  1380. X`009i: integer;
  1381. X`009sum: integer;
  1382. X
  1383. Xbegin
  1384. X`009sum := 0;
  1385. X`009for i := 1 to maxexit do
  1386. X`009`009if here.exits`091i`093.toloc <> 0 then
  1387. X`009`009`009sum := sum + 1;
  1388. X`009find_numexits := sum;
  1389. Xend;
  1390. X
  1391. X
  1392. X
  1393. X`123 clear all people who have played monster and quit in this location
  1394. X  out of the room so that when they start up again they won't be here,
  1395. X  because we are destroying this room `125
  1396. X
  1397. Xprocedure clear_people(loc: integer);
  1398. Xvar
  1399. X`009i: integer;
  1400. X
  1401. Xbegin
  1402. X`009getint(N_LOCATION);
  1403. +-+-+-+-+-+-+-+-  END  OF PART 21 +-+-+-+-+-+-+-+-
  1404.