home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part25 < 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 25/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.081902.12132@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 08:19:02 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1264
  12.  
  13. Archieve-name: monster_helsinki_104/part25
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 25/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 25 -+-+-+-+-+-+-+-+
  20. X            if not obj_here (oid) then oid := 0
  21. X         end else oid := 0;
  22. X
  23. X         mslot := x_slot(player);          `123 monster slot `125
  24. X         if mslot = 0 then int_get := false
  25. X         else if here.people`091mslot`093.kind = P_MONSTER then begin `123 m
  26. Vonster `125
  27. X            if oid > 0 then begin
  28. X               slot := find_obj(oid);            `123 object current slot `1
  29. V25
  30. X               if mslot > 0 then begin
  31. X`009          getroom(room);                    `123 locking `125
  32. X                  i := 1;
  33. X`009          found := false;
  34. X`009          while (i <= maxhold) and (not found) do begin
  35. X`009`009     if here.people`091mslot`093.holding`091i`093 = 0 then
  36. X`009`009`009found := true
  37. X`009`009     else
  38. X`009`009`009i := i + 1;
  39. X`009          end;
  40. X`009          if found and (here.objs`091slot`093 = oid) then begin
  41. X`009       `009     here.people`091mslot`093.holding`091i`093 := oid;
  42. X                     here.objs`091slot`093 := 0;
  43. X                     here.objhide`091slot`093 := 0;
  44. X`009       `009     putroom;          `032
  45. X                     int_get := true;
  46. X`009          end else begin
  47. X`009`009     freeroom;
  48. X                     int_get := false
  49. X                  end
  50. X               end
  51. X            end else int_get := false        `123 someone is moving monster
  52. V ? `125
  53. X         end else if pid = mylog then begin `123 player `125
  54. X            if oid > 0 then begin
  55. X               if can_hold then begin
  56. X                  slot := find_obj(oid);
  57. X                  if take_obj(oid,slot) then begin
  58. X                     hold_obj(oid);`032
  59. X                     int_get := true
  60. X                  end else int_get := false
  61. X               end else int_get := false
  62. X            end else int_get := false
  63. X         end else begin         `032
  64. X            writeln ('%serious error in int_get. Notify Monster Manager.');
  65. X            int_get := false;
  66. X         end
  67. X      end else int_get := false;
  68. X   end else int_get := false;
  69. Xend;
  70. X
  71. X`091global`093
  72. Xfunction int_drop(player,object: shortstring): boolean;
  73. Xvar room,i,pid,oid,slot,mslot: integer;    `032
  74. X    found : boolean;
  75. Xbegin
  76. X   if debug then begin
  77. X      writeln('%int_drop: ',player);
  78. X      writeln('%        : ',object);
  79. X   end;
  80. X   if player > '' then begin
  81. X      room := x_where (player,pid);
  82. X      if room > 0 then begin
  83. X         gethere(room); `032
  84. X         mslot := x_slot(player); `032
  85. X         if mslot = 0 then oid := 0    `123 is  monster moving ? `125
  86. X         else if exact_obj (oid,object) then begin
  87. X            if not x_hold (oid,mslot) then oid := 0
  88. X         end else oid := 0;
  89. X    `032
  90. X         if mslot = 0 then int_drop := false
  91. X         else if here.people`091mslot`093.kind = P_MONSTER then begin `123 m
  92. Vonster `125
  93. X            if oid > 0 then begin
  94. X               slot := find_hold(oid,mslot);     `123 object current slot `1
  95. V25
  96. X`009       if slot > 0 then begin            `123 is object here yet ? `125
  97. X                  getroom(room);                    `123 locking `125
  98. X                  i := 1;
  99. X`009          found := false;
  100. X`009          while (i <= maxobjs) and (not found) do begin
  101. X`009`009     if here.objs`091i`093 = 0 then
  102. X`009`009`009found := true
  103. X`009`009     else
  104. X`009`009`009i := i + 1;
  105. X`009          end;
  106. X`009          if found and (here.people`091mslot`093.holding`091slot`093 = o
  107. Vid) then begin
  108. X`009       `009     here.people`091mslot`093.holding`091slot`093 := 0;
  109. X                     if here.people`091mslot`093.wielding = oid then
  110. X                        here.people`091mslot`093.wielding := 0;
  111. X                     if here.people`091mslot`093.wearing = oid then
  112. X                        here.people`091mslot`093.wearing := 0;
  113. X                     here.objs`091i`093 := oid;
  114. X                     here.objhide`091i`093 := 0;
  115. X`009       `009     putroom;          `032
  116. X                     int_drop := true;
  117. X`009          end else begin           `032
  118. X`009`009     freeroom;
  119. X                     int_drop := false
  120. X                  end
  121. X               end
  122. X            end else int_drop := false `123 someone is droping object ? `125
  123. X                                       `123 two user must run same monster `
  124. V125
  125. X         end else if pid = mylog then begin `123 player `125
  126. X            if oid > 0 then begin
  127. X               if can_drop then begin
  128. X                  slot := find_hold(oid);
  129. X                  if place_obj(oid,TRUE) then begin
  130. X                     drop_obj(slot);`032
  131. X                     int_drop := true;
  132. X                     if mywield = oid then x_unwield;
  133. X                     if mywear = oid then x_unwear;
  134. X                  end else int_drop := false
  135. X               end else int_drop := false
  136. X            end else int_drop := false
  137. X         end else begin         `032
  138. X            writeln ('%serious error in int_drop. Notify Monster manager');
  139. X            int_drop := false;
  140. X         end
  141. X      end else int_drop := false;
  142. X   end else int_drop := false;
  143. Xend;
  144. X
  145. X`091global`093
  146. Xfunction int_poof (player,room,owner: shortstring;`032
  147. X                   general,own: boolean): boolean;
  148. Xvar pid,cur,loc,targslot,code,apu,mslot: integer;
  149. X    pub,dis: shortstring;
  150. Xbegin
  151. X  if debug then begin
  152. X     writeln('%int_poof: ',player);
  153. X     writeln('%        : ',room);
  154. X     writeln('%        : ',owner);
  155. X     writeln('%        : ',general); `123 poof privilegio `125
  156. X     writeln('%        : ',own);     `123 privileged code `125
  157. X  end;
  158. X
  159. X  if player > '' then begin
  160. X     cur := x_where(player,pid);
  161. X     if cur > 0 then begin
  162. X        gethere(cur);
  163. X        mslot := x_slot(player);
  164. X        if (mslot >0) then begin
  165. X           if exact_room(loc,room) then begin
  166. X              if cur = loc then int_poof := true
  167. X              else if here.people`091mslot`093.kind = P_MONSTER then begin `
  168. V123 monster `125
  169. X                  code := here.people`091mslot`093.parm;
  170. X                  gethere(loc);                         `123 target room `12
  171. V5
  172. X                  if (owner = here.owner) or`032
  173. X                     (here.owner = disowned_id) or`032
  174. X`009`009     (here.owner = public_id) or general then begin
  175. X                     if x_puttoken (cur,pid,mslot,loc,targslot) then begin
  176. X                        take_token(mslot,cur);
  177. X                        int_poof := true
  178. X                     end else int_poof := false
  179. X                  end else int_poof := false
  180. X              end else if pid = mylog then begin       `123 player `125
  181. X                 if own then begin                    `032
  182. X                    gethere(loc);                      `123 target room `125
  183. X                    if (owner = here.owner) or`032
  184. X`009`009`009(here.owner = disowned_id) or
  185. X`009`009`009(here.owner = public_id) or
  186. X                       general then begin
  187. X                       if put_token (loc,targslot,0) then begin
  188. X                          take_token(mslot,cur);
  189. X                          myslot := targslot;
  190. X                          location := loc;
  191. X                          setevent;
  192. X                          do_look;
  193. X                          int_poof := true`032
  194. X                       end else int_poof := false;
  195. X                    end else int_poof := false;
  196. X                 end else int_poof := false;
  197. X              end else begin
  198. X                 writeln ('%seriuos error in int_poof. Notify Monster Manage
  199. Vr.');
  200. X                 int_poof := false;
  201. X              end;
  202. X           end else int_poof := false
  203. X        end else int_poof := false
  204. X      end else int_poof := false
  205. X   end else int_poof := false
  206. Xend; `123 int_poof `125
  207. X        `032
  208. X`091global`093
  209. Xfunction int_login (player: shortstring; force: boolean): integer;
  210. X`123 0 = no such player name `125
  211. X`123 1 = login ok `125
  212. X`123 2 = monster is already logged in `125   `032
  213. X`123 3 = miscelagous failure `125
  214. Xvar room,pid,mslot: integer;
  215. Xbegin
  216. X  if debug then begin
  217. X     writeln('%int_login: ',player);
  218. X     writeln('%         : ',force);
  219. X  end;  `032
  220. X  if player = '' then int_login := 1`009`009`123 pseudo login `125
  221. X  else begin
  222. X     room := x_where(player,pid);
  223. X     if room = 0 then int_login := 0
  224. X     else begin
  225. X        gethere(room);
  226. X        mslot := x_slot(player);
  227. X        if mslot = 0 then int_login := 3
  228. X        else if here.people`091mslot`093.kind < P_MONSTER then begin
  229. X           writeln('%serious error in int_login. Notify Monster Manager.');
  230. X           int_login := 3;
  231. X        end else begin
  232. X           getindex(I_ASLEEP);         `123 locking `125
  233. X           if indx.free`091pid`093 or force then begin     `123 ok `125
  234. X              indx.free`091pid`093 := false;
  235. X              putindex;
  236. X              int_login := 1
  237. X           end else begin
  238. X              freeindex;              `032
  239. X              int_login := 2
  240. X           end
  241. X       end
  242. X     end `032
  243. X   end
  244. Xend; `123 int_login `125
  245. X
  246. X`091global`093
  247. Xprocedure int_logout (player: shortstring);
  248. Xvar pid,room,mslot: integer;
  249. Xbegin
  250. X  if debug then writeln('%int_logout: ',player);
  251. X  if player > '' then begin`032
  252. X     room := x_where(player,pid);
  253. X     if room > 0 then begin
  254. X        gethere(room);
  255. X        mslot := x_slot(player);
  256. X        if mslot > 0 then`032
  257. X           if here.people`091mslot`093.kind < P_MONSTER then begin
  258. X              writeln('%serious error in int_logout. Notify Monster Manager.
  259. V');
  260. X           end else do_endplay (pid)              `032
  261. X     end
  262. X   end
  263. Xend; `123 int_logout `125
  264. X
  265. X`091global`093
  266. Xfunction int_attack(player: shortstring; power: integer): boolean;
  267. Xvar cur,pid,mslot,health,lev: integer;
  268. Xbegin
  269. X  if debug then begin
  270. X     writeln('%int_attack: ',player);
  271. X     writeln('%          : ',power:1);
  272. X  end;
  273. X  if not read_global_flag(GF_WARTIME) then int_attack := false
  274. X  else if player > '' then begin
  275. X     cur := x_where(player,pid);
  276. X     if cur > 0 then gethere(cur);                      `032
  277. X     mslot := x_slot(player);
  278. X     if (cur > 0) and (mslot >0) then begin
  279. X        if here.people`091mslot`093.kind = P_MONSTER then begin `123 monster
  280. V `125
  281. X           getroom;             `032
  282. X           if here.people`091mslot`093.kind <> P_MONSTER then begin `123 is
  283. V this `125
  284. X              int_attack := false;                   `123 double cheking ? `
  285. V125
  286. X              freeroom          `032
  287. X           end else begin
  288. X              health := here.people`091mslot`093.health;
  289. X              health := health - power;
  290. X              if health < 0 then health := 0;     `032
  291. X              here.people`091mslot`093.health := health;
  292. X              int_attack := true;
  293. X              putroom;
  294. X              getint(N_HEALTH);
  295. X              anint.int`091pid`093 := health;
  296. X              putint;
  297. X           end;
  298. X        end else if pid = mylog then begin        `123 player `125
  299. X           if (myexperience >= protect_exp) `123 and protected_MM `125 then
  300. V int_attack := false
  301. X           else begin                        `032
  302. X              take_hit(power);         `032
  303. X              int_attack := true;
  304. X           end
  305. X        end else begin`032
  306. X           writeln ('%serious error in int_attack. Notify Monster Manager.')
  307. V;
  308. X           int_attack := false;
  309. X        end;
  310. X      end else int_attack := false
  311. X   end else int_attack := false
  312. Xend; `123 int_poof `125
  313. X        `032
  314. X
  315. X
  316. X`091global`093
  317. Xfunction int_where(player: shortstring): shortstring;
  318. Xvar room,pid: integer;
  319. Xbegin
  320. X  if debug then writeln('%int_where: ',player);
  321. X  room := x_where(player,pid);
  322. X  if room = 0 then int_where := ''
  323. X  else begin
  324. X    getnam;   `123 room names `125
  325. X    freenam;
  326. X    int_where := nam.idents`091room`093;
  327. X  end
  328. Xend; `123 int_where `125
  329. X
  330. X`091global`093
  331. Xfunction player_room(player: shortstring): integer;
  332. Xvar unused: integer;
  333. Xbegin
  334. X  player_room := x_where(player,unused);
  335. Xend;
  336. X
  337. Xprocedure poof_monster `123 (n: integer; s: string) declared forward `125 ;
  338. Xvar name: shortstring;
  339. X    loc: integer;
  340. Xbegin
  341. X    name := here.people`091n`093.name;
  342. X    if lookup_room(loc,s) then begin
  343. X`009log_event(myslot,E_POOFYOU,n,loc);
  344. X`009writeln;
  345. X`009writeln('You extend your arms, muster some energy, and ',name,' is');
  346. X`009writeln('engulfed in a cloud of orange smoke.');
  347. X`009writeln;
  348. X`009wait(1);`009`123 try fixing event problem - yes - that isn't good `125
  349. X`009int_poof(name,nam.idents`091loc`093,'',true,true);
  350. X`009checkevents;
  351. X    end else
  352. X`009writeln('There is no room named ',s,'.');
  353. Xend; `123 poof monster `125
  354. X
  355. Xprocedure block_monster(s: string);
  356. Xvar room,pid,mslot,parm: integer;
  357. Xbegin      `032
  358. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: A <monster>')
  359. X   else if lookup_pers(pid,s,true) then begin
  360. X      getint(N_LOCATION);
  361. X      freeint;
  362. X      room := anint.int`091pid`093;
  363. X      getpers;
  364. X      freepers;
  365. X      s := pers.idents`091pid`093;
  366. X      gethere(room);   `032
  367. X      mslot := x_slot (s);
  368. X      if mslot = 0 then writeln ('%error')
  369. X      else if here.people`091mslot`093.kind <> P_MONSTER then writeln ('No m
  370. Vonster')
  371. X      else begin
  372. X         parm := here.people`091mslot`093.parm;
  373. X         if parm = 0 then writeln ('%error')
  374. X         else begin
  375. X            set_runnable(parm,false);
  376. X            writeln('Blocked.');
  377. X         end
  378. X      end
  379. X   end else writeln ('No such monster.');
  380. Xend;
  381. X
  382. Xprocedure block_spell(s: string);
  383. Xvar n,parm: integer;
  384. Xbegin      `032
  385. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: G <spell>')
  386. X   else if lookup_spell(n,s,true) then begin
  387. X`009getint(N_SPELL);
  388. X`009freeint;
  389. X`009parm := anint.int`091n`093;
  390. X`009if parm = 0 then writeln ('%error')
  391. X`009else begin
  392. X            set_runnable(parm,false);
  393. X            writeln('Blocked.');
  394. X`009end
  395. X   end else writeln ('No such spell.');
  396. Xend;
  397. X
  398. Xprocedure block_object(s: string);
  399. Xvar room,pid,mslot,parm,oid: integer;
  400. Xbegin      `032
  401. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: B <object>')
  402. X   else if lookup_obj(oid,s,true) then begin
  403. X      getobj(oid);
  404. X      freeobj;
  405. X      if obj.actindx > 0 then begin
  406. X         set_runnable(obj.actindx,false);
  407. X         writeln('Blocked.');
  408. X      end else writeln ('No hook defined.')
  409. X   end else writeln('No such room.');
  410. Xend;
  411. X
  412. Xprocedure block_room (s: string);
  413. Xvar room,pid,mslot,parm: integer;
  414. Xbegin      `032
  415. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: C <room>')
  416. X   else if lookup_room(room,s,true) then begin
  417. X      gethere(room);
  418. X      if here.hook > 0 then begin
  419. X         set_runnable(here.hook,false);
  420. X         writeln('Blocked.');
  421. X      end else writeln ('No hook defined.')
  422. X   end else writeln ('No such room.')
  423. Xend;
  424. X
  425. Xprocedure system_claim_room(s: string);
  426. Xvar room,pid,mslot,parm,oldowner: integer;
  427. Xbegin      `032
  428. X    if (s = '') or (length(s) > shortlen) then writeln('USAGE: R <room>')
  429. X    else if lookup_room(room,s,true) then begin
  430. X`009getroom(room);
  431. X`009if not exact_user(oldowner,here.owner) then oldowner := 0;
  432. X`009here.owner := system_id;
  433. X`009putroom;
  434. X`009getown;
  435. X`009own.idents`091room`093 := system_id;
  436. X`009putown;
  437. X`009change_owner(oldowner,0);
  438. X`009if here.hook > 0 then set_owner(here.hook,,system_id);
  439. X`009writeln('System is now owner of ',here.nicename,'.');
  440. X    end else writeln('No such room.');
  441. Xend;
  442. X
  443. Xprocedure system_claim_object(s: string);
  444. Xvar pid,mslot,parm,oid: integer;
  445. Xbegin      `032
  446. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: O <object>')
  447. X   else if lookup_obj(oid,s,true) then begin
  448. X      getobj(oid);
  449. X      putobj;
  450. X      getobjown;
  451. X      objown.idents`091oid`093 := system_id;
  452. X      putobjown;
  453. X      if obj.actindx > 0 then set_owner(obj.actindx,,system_id);
  454. X      writeln('System is now owner of ',obj.oname,'.');
  455. X    end else writeln('No such object.');
  456. Xend;
  457. X
  458. Xprocedure system_claim_monster(s: shortstring);
  459. Xvar room,pid,mslot,parm: integer;
  460. Xbegin      `032
  461. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: M <monster>')
  462. X   else if lookup_pers(pid,s,true) then begin
  463. X      getint(N_LOCATION);
  464. X      freeint;
  465. X      room := anint.int`091pid`093;
  466. X      getpers;
  467. X      freepers;
  468. X      s := pers.idents`091pid`093;
  469. X      gethere(room);   `032
  470. X      mslot := x_slot (s);
  471. X      if mslot = 0 then writeln ('%error')
  472. X      else if here.people`091mslot`093.kind <> P_MONSTER then writeln ('No m
  473. Vonster')
  474. X      else begin
  475. X         parm := here.people`091mslot`093.parm;
  476. X         if parm = 0 then writeln ('%error')
  477. X         else begin
  478. X            set_owner(parm,,system_id);
  479. X`009    writeln('System is now owner of ',here.people`091mslot`093.name,'.')
  480. V;
  481. X         end
  482. X      end
  483. X   end else writeln ('No such monster.');
  484. Xend;
  485. X
  486. Xprocedure system_claim_spell(s: shortstring);
  487. Xvar room,n,parm: integer;
  488. Xbegin      `032
  489. X   if (s = '') or (length(s) > shortlen) then writeln('USAGE: S <spell>')
  490. X   else if lookup_spell(n,s,true) then begin
  491. X      getint(N_SPELL);
  492. X      freeint;
  493. X      parm := anint.int`091n`093;
  494. X      if parm = 0 then writeln ('%error')
  495. X      else begin
  496. X            set_owner(parm,,system_id);
  497. X`009    writeln('System is now owner of ',spell_name.idents`091n`093,'.');
  498. X      end
  499. X   end else writeln ('No such spell.');
  500. Xend;
  501. X
  502. Xprocedure system_2 `123(s: string); forward `125;
  503. Xvar continue: boolean;
  504. X    a: string;
  505. X
  506. X    procedure leave;
  507. X    begin
  508. X`009writeln('EXIT');
  509. X`009s := 'q';
  510. X    end;
  511. X
  512. X    procedure null;
  513. X    begin
  514. X`009writeln('QUIT');
  515. X`009s := '';
  516. X    end;
  517. X
  518. Xbegin
  519. X   continue := true;
  520. X   if s = '' then grab_line('Subsystem> ',s,eof_handler := leave)
  521. X   else continue := false;
  522. X   repeat
  523. X       s := lowcase(s);
  524. X       a := bite(s);
  525. X       if a > '' then case a`0911`093 of
  526. X`009    '?','h': command_help('*system 2 help*');
  527. X`009    'a': block_monster(s);
  528. X`009    'b': block_object(s);
  529. X`009    'c': block_room(s);
  530. X`009    'd': begin
  531. X`009`009    if s = '' then grab_line('Message? ',s,eof_handler := null);
  532. X`009`009    do_s_shutdown(s);
  533. X`009`009    set_global_flag(GF_ACTIVE,FALSE);
  534. X`009`009 end;
  535. X`009    'f': set_global_flag(GF_ACTIVE,TRUE);
  536. X`009    'g': block_spell(s);
  537. X`009    'i': custom_global_code(GF_CODE);
  538. X`009    'o': system_claim_object(s);
  539. X`009    'r': system_claim_room(s);
  540. X`009    'w': begin
  541. X`009`009    if s = '' then grab_line('Message? ',s,eof_handler := null);
  542. X`009`009    do_s_announce(s);
  543. X`009`009 end;
  544. X`009    'm': system_claim_monster(s);
  545. X`009    's': system_claim_spell(s);
  546. X`009    'v': fix_view_global_flags;
  547. X`009    'e','q': continue := false;
  548. X`009    otherwise`032
  549. X`009`009if continue then writeln('Type ? for help.')
  550. X`009`009else writeln('Type C ? for help.');
  551. X       end;
  552. X       if continue then grab_line('Subsystem> ',s,eof_handler := leave);
  553. X   until not continue;
  554. Xend;
  555. X
  556. Xprocedure throw_player `123(s: string)`125;
  557. Xlabel exit_label;
  558. Xvar mess: string;
  559. X    room,pid,count: integer;
  560. X    done: boolean;
  561. X
  562. X    procedure leave;
  563. X    begin
  564. X`009writeln('EXIT');
  565. X`009goto exit_label;
  566. X    end;
  567. X
  568. Xbegin
  569. X    if s = '' then grab_line('Player''s (personal) name? ',s,
  570. X`009eof_handler := leave);
  571. X    if (s = '') or (s = '?') then`032
  572. X`009writeln ('Usage: T <Player''s personal name>')
  573. X    else if length(s) > shortlen then writeln('Limit name to ',
  574. X`009shortlen:1,' characters.')
  575. X    else begin
  576. X`009grab_line('Message? ',mess,
  577. X`009    eof_handler := leave);
  578. X`009room := x_where(s,pid);
  579. X`009if pid = mylog then`032
  580. X`009    writeln ('You can''t throw yourself out from Monster.')
  581. X`009else if room = 0 then writeln('Player isn''t in Monster now.')
  582. X`009else begin
  583. X`009    log_event(0,E_KICK_OUT,pid,,mess,room);
  584. X`009    done := false;
  585. X`009    count := 0;
  586. X`009    while not done and (count < 20) do begin
  587. X`009`009wait(2);
  588. X`009`009checkevents(TRUE);
  589. X`009`009getindex(I_ASLEEP);
  590. X`009`009freeindex;
  591. X`009`009done := indx.free`091pid`093;
  592. X`009`009count := count +1;
  593. X`009    end;
  594. X`009    if done then writeln('Ok.');
  595. X`009end;
  596. X    end;
  597. X    exit_label:
  598. Xend;
  599. X
  600. X
  601. X
  602. Xbegin`009    `123 main program `125
  603. X    Get_Environment;
  604. X
  605. X    if not lookup_class(system_id,'system') then
  606. X`009writeln('%error in main program: system');
  607. X    if not lookup_class(public_id,'public') then
  608. X`009writeln('%error in main program: public');
  609. X    if not lookup_class(disowned_id,'disowned') then
  610. X`009writeln('%error in main program: disowned');
  611. X
  612. X    done := false;
  613. X    setup_guts;
  614. X    if terminal_line_len < 40 then begin `123 to avoid run time errors `125
  615. X`009writeln('Monster requires, that');
  616. X`009writeln('terminal width is at');
  617. X`009writeln('least 40 chars.');
  618. X    end else if terminal_page_len < 5 then begin `123 to avoid run time erro
  619. Vrs `125
  620. X`009writeln('Monster requires, that');
  621. X`009writeln('terminal height is at');
  622. X`009writeln('least 5 lines.');
  623. X    end else begin
  624. X
  625. X      very_init;
  626. X      very_prestart;  `123 very_prestart reopen OUTPUT `125
  627. X      if init then begin
  628. X
  629. X`009init_interpreter;
  630. X`009prestart;`032
  631. X`009`009`009
  632. X`009if not(done) then begin
  633. X`009    if not read_global_flag(GF_VALID) then begin
  634. X`009`009writeln('Can''t enter Monster universe.');
  635. X`009`009writeln('Database marked as invalid by Monster Manager.');
  636. X`009`009if userid = MM_userid then
  637. X`009`009    writeln('Use /FIX option to mark database as valid.');
  638. X
  639. X`009    end else if enter_universe then begin
  640. X`009`009repeat
  641. X`009`009`009parser;
  642. X`009`009`009if not read_global_flag(GF_ACTIVE) then begin
  643. X`009`009`009    if manager_priv then`032
  644. X`009`009`009`009writeln('WARNING: Monster is shutdown.')
  645. X`009`009`009    else begin
  646. X`009`009`009`009writeln('Monster is shutdown.');
  647. X`009`009`009`009done := true;
  648. X`009`009`009    end;
  649. X`009`009`009end;
  650. X`009`009until done;
  651. X`009`009leave_universe;
  652. X`009    end else
  653. X`009`009writeln('You attempt to enter the Monster universe, but a strange fo
  654. Vrce repels you.');
  655. X`009end;
  656. X`009finish_interpreter;
  657. X`009close_database;
  658. X      end else if work_time then write_message   `123 now is work time `125
  659. X      else writeln('Monster is ill, please notify Monster Manager.');
  660. X`009    `123 file protection problem `125
  661. X    end;
  662. X    finish_guts;
  663. Xend.
  664. X
  665. X`123 Notes to other who may inherit this program:
  666. X
  667. X`009Change all occurances in this file of dolpher to the account which
  668. X`009you will use for maintenance of this program.  That account will
  669. X`009have special administrative powers.
  670. X
  671. X`009This program uses several data files.  These files are in a directory
  672. X`009specified by the variable root in procedure init.  In my implementation,
  673. X`009I have a default ACL on the directory allowing everyone READ and WRITE
  674. X`009access to the files created in that directory.  Whoever plays the game
  675. X`009must be able to write to these data files.
  676. X
  677. X
  678. XWritten by Rich Skrenta, 1988.
  679. X
  680. X
  681. X
  682. X
  683. XBrief program organization overview:
  684. X------------------------------------
  685. X
  686. XMonster's Shared Files:
  687. X
  688. XMonster uses several shared files for communication.
  689. XEach shared file is accessed within Monster by a group of 3 procedures of th
  690. Ve
  691. Xform:`009getX(), freeX and putX.
  692. X
  693. XgetX takes an integer and attempts to get and lock that record from the
  694. Xappropriate data file.  If it encounters a "collision", it waits a short
  695. Xrandom amount of time and tries again.  After maxerr collisions it prints
  696. Xa deadlock warning message.
  697. X
  698. XIf data is to be read but not changed, a freeX should immediately follow
  699. Xthe getX so that other Monster processes can access the record.  If the
  700. Xrecord is to be written then a putX must eventually follow the getX.
  701. X
  702. X
  703. XMonster's Record Allocation:
  704. X
  705. XMonster dynamically allocates some resources such as description blocks and
  706. Xlines and player log entries.  The allocation is from a bitmap.  I chose a
  707. Xbitmap over a linked list to make the multiuser access to the database
  708. Xmore stable.  A particular resource (such as log entries) will have a
  709. Xparticular bitmap in the file INDEXFILE.  A getindex(I_LOG) will retrieve
  710. Xthe bitmap for it.
  711. X
  712. XActually allocation and deallocation is done through the group of functions
  713. Xalloc_X and delete_X.  If alloc_X returns true, the allocation was successfu
  714. Vl,
  715. Xand the integer parameter is the number of the block allocated.
  716. X
  717. XThe top available record in each group is stored in indexrec.  To increase
  718. Xthe top, the new records must be initially written so that garbage data is
  719. Xnot in them and the getX routines can locate them.  This can be done with
  720. Xthe addX(n) group of routines, which add capacity to resources.
  721. X
  722. X
  723. X
  724. XParsing in Monster:
  725. X
  726. XThe main parser(s) use a first-unique-characters method to lookup command
  727. Xkeywords and parameters.  The format of these functions is lookup_x(n,s).
  728. XIf it returns true, it successfully found an unambiguous match to string s.
  729. XThe integer index will be in n.
  730. X
  731. XIf an unambiguating match is needed (for example, if someone makes a new roo
  732. Vm,
  733. Xthe match to see if the name exists shouldn't disambiguate), the group of
  734. Xroutines exact_X(n,s) are called.  They function similarly to lookup_x(n,s).
  735. X
  736. XThe customization subsystems and the editor use very primitive parsers
  737. Xwhich only use first character match and integer arguments.
  738. X
  739. X
  740. X
  741. XAsynchronous events in Monster:
  742. X
  743. XWhen someone comes into a room, the other players in that room need
  744. Xto be notified, even if they might be typing a command on their terminal.
  745. X
  746. XThis is done in a two part process (producer/consumer problem):
  747. X
  748. XWhen an event takes place, the player's Monster that caused the event
  749. Xmakes a call to log_event.  Parameters include the slot of the sender (which
  750. Xperson in the room caused the event), the actual event that occurred
  751. X(E_something) and parameters.  Log_event works by sticking the event
  752. Xinto a circular buffer associated with the room (room may be specified on
  753. Xlog_event).
  754. X
  755. XNote: there is not an event record for every room; instead, the event
  756. X      record used is  ROOM # mod ACTUAL NUMBER of EVENT RECORDS
  757. X
  758. XThe other half of the process occurrs when a player's Monster calls
  759. Xgrab_line to get some input.  Grab line looks for keystrokes, and if
  760. Xthere are none, it calls checkevent and then sleeps for a short time
  761. X(.1 - .2 seconds).  Checkevent loads the event record associated with this
  762. Xroom and compare's the player's buffer pointer with the record's buffer
  763. Xpointer.  If they are different, checkevent bites off events and sends them
  764. Xto handle_event until there are no more events to be processed.  Checkevent
  765. Xignores events logged by it's own player.
  766. X
  767. X`125
  768. $ CALL UNPACK MON.PAS;454 1694381216
  769. $ create/nolog 'f'
  770. X!*************************************MONSTER*******************************
  771. V*******
  772. Xdefine syntax MONSTER_WHO
  773. X   image MONSTER_IMAGE_:monster_who
  774. X   noqualifiers
  775. Xdefine syntax MONSTER_DUMP
  776. X   image MONSTER_IMAGE_:monster_dump
  777. X   parameter P1
  778. X`009label = DUMP_FILE
  779. X`009prompt = "Dump file"
  780. X`009value(type=$file,required)
  781. Xdefine verb MONSTER
  782. X   image MONSTER_IMAGE_:mon
  783. X   qualifier WHO
  784. X      nonnegatable
  785. X      syntax = MONSTER_WHO
  786. X   qualifier REBUILD
  787. X   qualifier FIX
  788. X   qualifier VERSION
  789. X   qualifier DEBUG
  790. X   qualifier REAL_USERID
  791. X      value(required)
  792. X   qualifier USERID
  793. X      value(required)
  794. X   qualifier BATCH
  795. X      value(required,type=$infile)
  796. X   qualifier START
  797. X   qualifier OUTPUT
  798. X      value(default="SYS$OUTPUT",type=$outfile)
  799. X   qualifier DUMP
  800. X      nonnegatable
  801. X      syntax = MONSTER_DUMP
  802. X   qualifier BUILD
  803. X      nonnegatable
  804. X      syntax = MONSTER_DUMP
  805. X   disallow any2 (REBUILD, FIX, REAL_USERID, USERID, BATCH, DUMP, BUILD)
  806. X   disallow ((OUTPUT or neg OUTPUT) and FIX)`032
  807. X   disallow (START and (BUILD or DUMP))
  808. $ CALL UNPACK MONSTER.CLD;20 388957007
  809. $ create/nolog 'f'
  810. X:*privilege help*
  811. X
  812. X- <privilege>   Remove privilege
  813. X+ <privilege>   Add privilege
  814. XE               Exit
  815. XL               List possible privileges.
  816. XQ               Quit (do not save changes)
  817. XV               View current privileges
  818. X
  819. X? - This list
  820. X:*system 2 help*
  821. X
  822. XA         Block monster''s code.
  823. XB         Block object''s code.
  824. XC         Block room''s code.
  825. XD         Shutdown Monster.
  826. XE         Leave subsystem.
  827. XF         Open Monster for playing.
  828. XG         Block spell's code.
  829. XH         This text.
  830. XM         Claim monster to System.
  831. XO         Claim object to System.
  832. XW         Announce over Monster Universe.
  833. XQ         Leave subsystem.
  834. XR         Claim room to System.
  835. XS         Claim spell to System
  836. XV`009  View global flags.
  837. X?         This text.  `032
  838. X
  839. X:*hook help*
  840. X
  841. XB       Block hook code.
  842. XC       Type COMMANDS.PAPER.
  843. XD       Delete hook.
  844. XE       Exit customizing hook.
  845. XF       Free hook code.
  846. XG       Get program file, default extension is .MDL.
  847. XH       This list.
  848. XL       List hook code.
  849. XM       Run manually hook code.
  850. XO       List hook code to file.
  851. XP       Change hook privilege.
  852. XQ       Exit customizing hook.
  853. XV       View hook.
  854. X?       This list.
  855. X
  856. X:*global c help*
  857. X
  858. XB       Block hook code.
  859. XC       Type COMMANDS.PAPER.
  860. XD       Delete code.
  861. XE       Exit customizing code.
  862. XF       Free code.
  863. XG       Get program file, default extension is .MDL.
  864. XH       This list.
  865. XL       List code.
  866. XM       Run manually code.
  867. XO       List hook code to file.
  868. XQ       Exit customizing code.
  869. XV       View hook.
  870. X?       This list.
  871. X
  872. X:*spell help*
  873. X
  874. XA       Toggle spell mode
  875. XB       Block spell code.
  876. XC       Type COMMANDS.PAPER.
  877. XD       Delete spell.
  878. XE       Exit customizing spell.
  879. XF       Free hook code.
  880. XG       Get program file, default extension is .MDL.
  881. XH       This list.
  882. XI       Change your own level of this hook
  883. XL       List spell code.
  884. XM       Run manually spell code.
  885. XO       List spell code to file.
  886. XP       Change spell privilege.
  887. XQ       Exit customizing spell.
  888. XV       View hook.
  889. X?       This list.
  890. X
  891. X:*monster help*
  892. X
  893. XA       Give monster's level and heal monster.
  894. XB       Block monster
  895. XC       Type COMMANDS.PAPER
  896. XD       Customize monster's privilege  set.
  897. XE       Exit customizing monster
  898. XF       Free monster
  899. XG       Get program file, default extension is .MDL
  900. XH       This list
  901. XI       Give monster's health.
  902. XJ       Disable/Enable control access.
  903. XL       List monster code.
  904. XM       Run manually monster code
  905. XN       Change monster's name
  906. XO       List monster code to file.
  907. XP       Change monster's privilege
  908. XQ       Exit customizing monster
  909. XS       Write monster's self description
  910. XV       View monster.
  911. X?       This list
  912. X
  913. X
  914. X:*do y help*
  915. X
  916. XPassword          Change your password.
  917. XWar               Allow violance in Monster
  918. XPeace             Forbid any violance in Monster
  919. XSpell             Make new spell or customizing spell
  920. XNewPlayer         Set new player's welcome text
  921. XWelcome           Set welcome text
  922. X
  923. X
  924. X:*do s help*
  925. X
  926. XExits             Lists exits you can inspect here
  927. XObject            Show internals of an object
  928. XDetails           Show details you can look at in this room
  929. XMonster           Show owner of a monster
  930. XPrivileges        Show your privileges
  931. XTime              Show time and date
  932. XRoom              Show owner of a room
  933. XCommands.paper    List COMMANDS.PAPER
  934. XLevels            Show experience levels
  935. XQuotas            Show your quotas
  936. XSpells            Show your spell level or what spells you know
  937. X
  938. X:*program help*
  939. X
  940. XA`009"a", "an", "some", etc.
  941. XC`009Customizing hook
  942. XD`009Edit a Description of the object
  943. XF`009Edit the GET failure message
  944. XG`009Set the object required to pick up this object
  945. X1`009Set the get success message
  946. XK`009Set the Kind of object this is
  947. XL`009Edit the label description ("There is a ... here.")
  948. XP`009Program the object based on the kind it is
  949. XR`009Rename the object
  950. XS`009Toggle the sticky bit
  951. X
  952. XU`009Set the object required for use
  953. X2`009Set the place required for use
  954. X3`009Edit the use failure description
  955. X4`009Edit the use success description
  956. XV`009View attributes of this object
  957. X
  958. XX`009Edit the extra description
  959. X5`009Edit extra desc #2
  960. XE`009Exit (same as Quit)
  961. XQ`009Quit (same as Exit)
  962. X?`009This list
  963. X
  964. X6`009Set home description
  965. X7`009Set home of object
  966. X
  967. X:*custom help*
  968. X
  969. XA`009Set an Alias for the exit
  970. XC`009Conceal an exit
  971. XD`009Edit the exit's main Description
  972. XE`009EXIT custom (saves changes)
  973. XF`009Edit the exit''s failure line
  974. XI`009Edit the line that others see when a player goes Into an exit
  975. XK`009Set the object that is the Key to this exit
  976. XL`009Automatically look `091default`093 / don't look on exit
  977. XO`009Edit the line that people see when a player comes Out of an exit
  978. XQ`009QUIT Custom (saves changes)
  979. XR`009Require/don't require alias for exit; ignore direction
  980. XS`009Edit the success line
  981. XT`009Alter Type of exit (passage, door, etc)
  982. XV`009View exit information
  983. XX`009Require/don't require exit name to be a verb
  984. X?`009This list
  985. X
  986. X:*room help*
  987. X
  988. XA`009Define an alternate mystery message block
  989. XB`009Edit the target room (G) "bounced in" description  `032
  990. XC`009Define action code (hook) for room  `032
  991. XD`009Alter the way the room description prints  `032
  992. XE`009Exit (same as quit)  `032
  993. XF`009Set the chance of the trapdoor functioning  `032
  994. XG`009Set the location that a dropped object really goes to  `032
  995. XH`009This list  `032
  996. XI`009Edit the default exit failure message  `032
  997. XM`009Define the magic object for this room
  998. XN`009Change how the room Name prints
  999. XO`009Edit the object drop description (for drop effects)
  1000. XP`009Edit the Primary room description <the default one> (same as desc)
  1001. XQ`009Quit (same as exit)
  1002. XR`009Rename the room
  1003. XS`009Edit the Secondary room description
  1004. XT`009Set the direction that the Trapdoor goes to
  1005. XV`009View settings on this room
  1006. XX`009Define a mystery message
  1007. X1`009Set the primary visual link for this room
  1008. X2`009Set the secondary visual link for this room
  1009. X
  1010. X?`009This list
  1011. X
  1012. X
  1013. X:*fix p help*
  1014. X
  1015. XA      Change player''s health.
  1016. XE,Q    for quit.
  1017. XL      Change player's level/experience.
  1018. XN      Change player's personal name.
  1019. XP      Change player's password.
  1020. XR      Change player's room quota.
  1021. XV      View player''s data.
  1022. XH,?    for help.
  1023. X
  1024. X:*system help*
  1025. X
  1026. X1      Customize player database.
  1027. XA      Alter player privileges
  1028. XB      Add description blocks
  1029. XC      Subsystem
  1030. XD      Disown <user>
  1031. XE      Exit (same as quit)
  1032. XH      Add header blocks
  1033. XK      Kill <user>
  1034. XL      Add one liner records
  1035. XM      Move a player who is asleep (not playing now)
  1036. XO      Add object records
  1037. XP      Write a distribution list of players
  1038. XQ      Quit (same as exit)
  1039. XR      Add rooms
  1040. XT      Throw player out from Monster
  1041. XV      View current sizes/usage
  1042. XW      List of players
  1043. X?      This list
  1044. X
  1045. X:*show help*
  1046. XList of commands:
  1047. X
  1048. XType <command> ? for more info.
  1049. X
  1050. XAccept #         Allow others to Link an exit here at direction #
  1051. XAtmosphere       Atmosphere command
  1052. XBear #           Create monster #
  1053. XBrief            Toggle printing of room descriptions
  1054. XClaim #          Get ownership of room/object/monster/spell
  1055. XCreate #         Create room/object/monster
  1056. XCustomize #      Customize this room / Customize exit # / Customize object #
  1057. XDcl #            Spawn subprocess/Run command #
  1058. XDelete #         Delete room/object/monster
  1059. XDescribe #       Describe this room / Describe a feature (#) in detail
  1060. XDestroy  *       Destroy an instance of object #
  1061. XDisown #         Disown room/object/monster/spell
  1062. XDrop *           Drop object #
  1063. XDuplicate *      Make a duplicate of an already-created object.
  1064. XErase #          Erase monster #
  1065. XForm #           Form a new room with name #
  1066. XGet *            Get object #
  1067. X#,Go #           Go towards # (Some: N/North S/South E/East W/West U/Up D/Do
  1068. Vwn)
  1069. XHealth           Show how healthy you are
  1070. XHide *           Hide yoursef / Hide object (#)
  1071. XI,Inventory *    See what you or someone else is carrying
  1072. XLink #           Link this room to/from another via exit at direction #
  1073. XList #           List rooms/objects/monsters/spells
  1074. XLook,L *         Look here / Look at something or someone (#) closely
  1075. XMake #           Make a new object named #
  1076. XMonsters #       Show information about monsters  : monsters ? for help
  1077. XName #           Set your game name to #
  1078. XObjects #        Show information about objects  : objects ? for help
  1079. XPlayers          List people who have played Monster
  1080. XPoof #           Jump other room or move other player
  1081. XPunch #          Punch person #
  1082. XQuit             Leave the game
  1083. XRelink           Move an exit
  1084. XRefuse #         Disallow others to Link an exit here at direction #
  1085. XReset *          Move object to its home.
  1086. XReveal           Reveal yourself
  1087. XRooms            Show information about rooms you have made
  1088. XSay, ' (quote)   Say line of text following command to others in the room
  1089. XScan #           Scan location of object # in universe
  1090. XScore #          Show score of you/other player/all in some level.
  1091. XSearch           Look around the room for anything hidden
  1092. XSelf *           Edit a description of yourself / View #'s self-description
  1093. XSet #            Set something : SET ? for a list
  1094. XShow #           Show something : SHOW ? for a list
  1095. XSpells #         Show information about spells  : spells ? for help
  1096. XSummon #         Summon spell #
  1097. XUnlink #         Unlink this room to/from another via exit at direction #
  1098. XUnmake #         Remove the form definition of object #
  1099. XUse #            Use object #
  1100. XWear #           Wear the object # / unwear
  1101. XWield #          Wield the weapon # / wield the ring # / unwield
  1102. XWhisper #        Whisper something (prompted for) to person #
  1103. XWho              List of people playing Monster now
  1104. XWhois *          What is a player's username  `032
  1105. XZap #            Destroy room named #  `032
  1106. X?,Help           This list  `032
  1107. X. (period)       Repeat last command        `032
  1108. X
  1109. XCommands for manager:  `032
  1110. X
  1111. XSystem           Go to system maintenance mode  `032
  1112. XPublic #         Make room/object/monster/spell public    `032
  1113. XDebug            Debug system  `032
  1114. X
  1115. X
  1116. XParameter is optional in all commands
  1117. X# = normal parameter (= one item)
  1118. X* = parameter list with or without joker(*) or 'all'
  1119. X
  1120. X:*edit help*
  1121. X
  1122. XA`009Append text to end
  1123. XC`009Check text for correct length with parameter substitution (#)
  1124. XD #`009Delete line #
  1125. XE`009Exit & save changes
  1126. XI #`009Insert lines before line #
  1127. XP`009Print out description
  1128. XQ`009Quit: THROWS AWAY CHANGES
  1129. XR #`009Replace text of line #
  1130. XZ`009Zap all text
  1131. X@`009Throw away text & exit with the default description
  1132. X?`009This list
  1133. X
  1134. X:accept
  1135. XSyntax:        Accept <direction>
  1136. X
  1137. XDescription:   Allows others to link exits here at <direction>
  1138. XRequirements:  You are the owner of this room
  1139. X               or you have the Owner -privilege
  1140. X               or you have the Manager -privilege,`032
  1141. X                  if the owner of this room is System
  1142. X:atmosphere
  1143. XSyntax:        Atmosphere <your action>
  1144. XShortcut:      :<your action>
  1145. X
  1146. XDescription:   Prints other players and you`032
  1147. X               a text <your player name> <your action>
  1148. X:brief
  1149. XSyntax:        Brief
  1150. X
  1151. XDescription:   Toggles brief printing of room description off or on
  1152. X:claim
  1153. XSyntax:        Claim
  1154. X               Claim <object>
  1155. X               Claim <monster>
  1156. X               Claim <spell>
  1157. X
  1158. XDescription:   Sets the ownership of <object> or <monster> or <spell> or
  1159. X                  this room to you
  1160. XRequirements:  Current ownership of target is Disowned
  1161. X                  or you have the Manager -privilege
  1162. X:create
  1163. XSyntax:        Create room <room>
  1164. X               Create object <object>
  1165. X               Create monster <monster>
  1166. X:customize
  1167. XSyntax:        Customize
  1168. X               Customize <direction>
  1169. X               Customize <object>
  1170. X               Customize <monster>
  1171. X               Customize room
  1172. X               Customize object <object>
  1173. X               Customize monster <monster>
  1174. X
  1175. XDescription:   Customizes <object> or <monster> or <direction> or this room
  1176. XRequirements:  You are the owner of the target
  1177. X               or you have the Owner -privilege,`032
  1178. X               or you have the Manager -privilege,`032
  1179. X                  if owner of target is System
  1180. X
  1181. XBugs:          Following non-existed commands is recognized:
  1182. X               Customize player <...>
  1183. X               Customize spell <...>
  1184. X:dcl
  1185. XSyntax:        Dcl
  1186. X               Dcl <command>
  1187. X
  1188. XDescription:   Starts subprocess for shell and  leaves  Monster  running `03
  1189. V2
  1190. X               Executes <command>, if given`032
  1191. X:describe
  1192. XSyntax:        Describe`032
  1193. X               Describe <detail>
  1194. X
  1195. XDescription:   Writes description of <detail> or this room
  1196. XRequirements:  You are owner of this room
  1197. X               or you have the Owner -privilege
  1198. X               or you have the Manager -privilege,`032
  1199. X                  if owner of this room is System
  1200. X:delete
  1201. XSyntax:        Delete room <room>
  1202. X               Delete object <object>
  1203. X               Delete monster <monster>
  1204. X:destroy
  1205. XSyntax:        Destroy <object>
  1206. X               Destroy all
  1207. X               Destroy <object,...>
  1208. XAlias:         Delete object <object>
  1209. X
  1210. XDescription:   Destroys an instance of object(s)`032
  1211. XRequirements:  You are the owner of the object
  1212. X               or you have the Owner -privilege
  1213. X               or you have the Manager -privilege,`032
  1214. X                  if owner of object is System
  1215. X               And you are the owner of this room
  1216. X               or this room is public
  1217. X               or you have the Owner -privilege
  1218. X               or you have the Manager -privilege,`032
  1219. X                  if owner of this room is System
  1220. X:disown
  1221. XSyntax:        Disown
  1222. X               Disown <object>
  1223. X               Disown <monster>
  1224. X               Disown <spell>
  1225. X
  1226. XDescription:   Sets ownership of <object> or <monster> or <spell>
  1227. X                  this room to Disowned
  1228. XRequirements:  You happen to be the owner of the target
  1229. X               or you have the Owner -privilege, if target is this room
  1230. X               or you have the Owner -privilege,`032
  1231. X                  if target is object or monster
  1232. X               or you have the Manager -privilege,`032
  1233. X                  if owner of target is System
  1234. X:drop
  1235. XSyntax:        Drop <object>
  1236. X               Drop all
  1237. X               Drop <object,...>
  1238. X
  1239. XDescription:   Drops object
  1240. X:duplicate
  1241. XSyntax:        Duplicate <object>
  1242. X               Duplicate all
  1243. X               Duplicate <object,...>
  1244. X
  1245. XDescription:   Creates an instance of object(s)
  1246. XRequirements:  You are the owner of the particular object
  1247. X               or you have the Owner -privilege
  1248. X               or you have the Manager -privilege,`032
  1249. X                  if the owner of object is System
  1250. X               And you are the owner of this room
  1251. X               or this room is public
  1252. X               or you have the Owner -privilege
  1253. X               or you have the Manager -privilege,`032
  1254. X                  if the owner of this room is System
  1255. X:erase
  1256. XSyntax:        Erase <monster>
  1257. XAlias:         Delete monster <monster>
  1258. X
  1259. XDescription:   Destroys <monster>
  1260. XRequirements:  You are the owner of the monster
  1261. X               or you have the Owner -privilege
  1262. X               or you have the Manager -privilege,`032
  1263. X                  if the owner of monster is System
  1264. X:form
  1265. XSyntax:        Form <room>
  1266. XAlias:         Create room <room>
  1267. X
  1268. XDescription:   Creates new room with a name: <room>
  1269. XRequirements:  You are the owner of this room
  1270. X               or this room have some kind of exit with Accept
  1271. X               or you have the Owner -privilege
  1272. X               or you have the Manager -privilege,`032
  1273. X                  if owner of this room is System
  1274. X:get
  1275. XSyntax:        Get <object>
  1276. +-+-+-+-+-+-+-+-  END  OF PART 25 +-+-+-+-+-+-+-+-
  1277.