home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part18 < 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 18/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.044848.10189@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 04:48:48 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1462
  12.  
  13. Archieve-name: monster_helsinki_104/part18
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 18/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 18 -+-+-+-+-+-+-+-+
  20. X`009`009   (event.evnt`091myevent`093.action = E_GLOBAL_CHANGE) then begin
  21. X`009`009`009if (event.evnt`091myevent`093.sender <> myslot) then begin
  22. X
  23. X`009`009`009`009`009`009`123 if sent by me don't look at it `125
  24. X`009`009`009`009`009`009`123 will use global record event `125
  25. X`009`009`009`009gethere; `009`123 we possible need this `125
  26. X`009`009`009`009handle_event(tmp);
  27. X`009`009`009`009if tmp then
  28. X`009`009`009`009`009printed := true;
  29. X
  30. X`009`009`009`009inmem := false;`009`123 re-read important data that `125
  31. X`009`009`009`009gethere;`009`123 may have been altered `125
  32. X
  33. X`009  `009`009`009gotone := true;
  34. X`009`009`009end;
  35. X`009`009end;
  36. X`009end;
  37. X
  38. X`009if myslot > 0 then
  39. X`009    printed := time_check or printed;`009`123 run submit queue `125
  40. X`009    `123 myslot is 0 during log_ping and during login password `125
  41. X
  42. X`009if (printed) `123and (gotone)`125 and not(silent) then begin
  43. X`009  `009reprint_grab;
  44. X`009end;
  45. X
  46. X`009rnd_event(silent);
  47. X`123    end; `125 `123 if not starting `125`032
  48. Xend;
  49. X
  50. X
  51. X`123 function find_numpeople moved to module CUSTOM `125
  52. X
  53. X`123 procedure noisehide moved to module CUSTOM `125
  54. X
  55. X`123 function checkhide moved to module CUSTOM `125
  56. X
  57. Xprocedure clear_command;
  58. X
  59. Xbegin
  60. X`009if logged_act then begin
  61. X`009`009getroom;
  62. X`009`009here.people`091myslot`093.act := 0;
  63. X`009`009putroom;
  64. X`009`009logged_act := false;
  65. X`009end;
  66. Xend;
  67. X
  68. X`123 forward procedure take_token(aslot, roomno: integer); `125
  69. Xprocedure take_token;
  70. X`009`009`009`123 remove self from a room's people list `125
  71. X
  72. Xbegin
  73. X`009getroom(roomno);
  74. X`009with here.people`091aslot`093 do begin
  75. X`009`009kind := 0;
  76. X`009`009username:= '';
  77. X`009`009`123 name := '';
  78. X`009`009`009prevents null messages when player exits rooms`032
  79. X`009`009`009(hurtta@finuh)
  80. X`009`009`125
  81. X`009end;
  82. X`009putroom;
  83. Xend;
  84. X
  85. X
  86. X`091global`093 function put_token(room: integer;var aslot:integer;
  87. X`009hidelev:integer := 0):boolean; `123
  88. X`009`009`009 put a person in a room's people list
  89. X`009`009`009 returns myslot `125
  90. Xvar
  91. X`009i,j: integer;
  92. X`009found: boolean;
  93. X`009savehold: array`0911..maxhold`093 of integer;
  94. X
  95. Xbegin
  96. X`009if first_puttoken then begin
  97. X`009`009for i := 1 to maxhold do
  98. X`009`009`009savehold`091i`093 := 0;
  99. X`009`009first_puttoken := false;
  100. X`009end else begin
  101. X`009`009gethere;
  102. X`009`009for i := 1 to maxhold do
  103. X`009`009`009savehold`091i`093 := here.people`091myslot`093.holding`091i`093;
  104. X`009end;
  105. X
  106. X`009getroom(room);
  107. X`009i := 1;
  108. X`009found := false;
  109. X`009while (i <= maxpeople) and (not found) do begin
  110. X`009`009if here.people`091i`093.kind = 0 then
  111. X`009`009`009`123 minor change by hurtta@finuh `125
  112. X`009`009`009found := true
  113. X`009`009else
  114. X`009`009`009i := i + 1;
  115. X`009end;
  116. X`009put_token := found;
  117. X`009if found then begin
  118. X`009`009here.people`091i`093.kind := P_PLAYER;`009`123 I'm a real player `12
  119. V5
  120. X`009`009here.people`091i`093.name := myname;
  121. X`009`009here.people`091i`093.username := userid;
  122. X`009`009here.people`091i`093.hiding := hidelev;
  123. X`009`009`009`123 hidelev is zero for most everyone
  124. X`009`009`009  unless you want to poof in and remain hidden `125
  125. X
  126. X`009`009here.people`091i`093.wearing := mywear;
  127. X`009`009here.people`091i`093.wielding := mywield;
  128. X`009`009here.people`091i`093.health := myhealth;
  129. X`009  `009here.people`091i`093.self := myself;
  130. X`009`009here.people`091i`093.experience := myexperience;
  131. X`009`009`009`123 write experience also to here (hurtta@finuh) `125
  132. X
  133. X`009`009here.people`091i`093.act := 0;
  134. X
  135. X`009`009here.people`091i`093.parm := 0; `009`123 hurtta@finuh `125
  136. X
  137. X`009`009for j := 1 to maxhold do
  138. X`009`009`009here.people`091i`093.holding`091j`093 := savehold`091j`093;
  139. X`009`009putroom;
  140. X
  141. X`009`009aslot := i;
  142. X`009`009for j := 1 to maxexit do`009`123 haven't found any exits in `125
  143. X`009`009`009found_exit`091j`093 := false;`009`123 the new room `125
  144. X
  145. X`009`009`123 note the user's new location in the logfile `125
  146. X`009`009getint(N_LOCATION);
  147. X`009`009anint.int`091mylog`093 := room;
  148. X`009`009putint;
  149. X`009`009if debug then`032
  150. X`009`009    writeln('%puttoken: <',mylog:1,'> => ',
  151. X`009`009`009room,'(',aslot:1,')');
  152. X`009end else
  153. X`009`009freeroom;
  154. Xend;
  155. X
  156. Xprocedure log_exit(direction,room,sender_slot: integer);
  157. X
  158. Xbegin
  159. X `009log_event(sender_slot,E_EXIT,direction,0,log_name,room);
  160. Xend;
  161. X
  162. Xprocedure log_entry(direction,room,sender_slot: integer);
  163. X
  164. Xbegin
  165. X`009log_event(sender_slot,E_ENTER,direction,0,log_name,room);
  166. Xend;
  167. X
  168. Xprocedure log_begin(room:integer := 1);
  169. X
  170. Xbegin
  171. X`009log_event(0,E_BEGIN,0,0,log_name,room);
  172. Xend;
  173. X
  174. Xprocedure log_quit(room:integer;dropped:boolean);
  175. X
  176. Xbegin
  177. X`009log_event(0,E_QUIT,0,0,log_name,room);
  178. X`009if dropped then
  179. X`009`009log_event(0,E_DROPALL,0,0,log_name,room);
  180. Xend;
  181. X
  182. X
  183. X
  184. X
  185. X`123 return the number of people you can see here `125
  186. X
  187. Xfunction n_can_see: integer;
  188. Xvar
  189. X`009sum: integer;
  190. X`009i: integer;
  191. X`009selfslot: integer;
  192. X
  193. Xbegin
  194. X`009if here.locnum = location then
  195. X`009`009selfslot := myslot
  196. X`009else
  197. X`009`009selfslot := 0;
  198. X
  199. X`009sum := 0;
  200. X`009for i := 1 to maxpeople do
  201. X`009`009if ( i <> selfslot ) and
  202. X`009`009   ( here.people`091i`093.kind > 0 ) and`009`123 hurtta@finuh `125
  203. X`009`009   ( here.people`091i`093.hiding = 0 ) then
  204. X`009`009`009sum := sum + 1;
  205. X`009n_can_see := sum;
  206. X`009if debug then
  207. X`009`009writeln('%n_can_see = ',sum:1);
  208. Xend;
  209. X
  210. X
  211. X
  212. Xfunction next_can_see(var point: integer): string;
  213. Xvar
  214. X`009found: boolean;
  215. X`009selfslot: integer;
  216. X`009wear: integer;
  217. X
  218. Xbegin
  219. X`009if here.locnum <> location then
  220. X`009`009selfslot := 0
  221. X`009else
  222. X`009`009selfslot := myslot;
  223. X`009found := false;
  224. X`009while (not found) and (point <= maxpeople) do begin
  225. X`009`009if (point <> selfslot) and
  226. X`009`009   (here.people`091point`093.kind > 0) and`009`123 hurtta@finuh `125
  227. X`009`009   (here.people`091point`093.hiding = 0) then
  228. X`009`009`009found := true
  229. X`009`009else
  230. X`009`009`009point := point + 1;
  231. X`009end;
  232. X
  233. X`009if found then begin
  234. X`009`009next_can_see := here.people`091point`093.name;
  235. X`009`009wear := here.people`091point`093.wearing;
  236. X`009`009if wear > 0 then begin
  237. X`009`009`009getobj(wear);
  238. X`009`009`009freeobj;
  239. X`009`009`009if obj.kind = O_DISGUISE then`032
  240. X`009`009`009`009next_can_see := 'Someone (with '+
  241. X`009`009`009`009`009obj_part(wear,false)+')';
  242. X`009`009end;
  243. X`009`009point := point + 1;
  244. X`009end else begin
  245. X`009`009next_can_see := myname;`009`123 error!  error! `125
  246. X`009`009writeln('%searching error in next_can_see; notify the Monster Manage
  247. Vr');
  248. X`009end;
  249. Xend;
  250. X
  251. X
  252. X
  253. Xprocedure people_header(where: shortstring);
  254. Xvar
  255. X`009point: integer;
  256. X`009tmp: string;
  257. X`009i: integer;
  258. X`009n: integer;
  259. X`009len: integer;
  260. X
  261. Xbegin
  262. X`009point := 1;
  263. X`009n := n_can_see;
  264. X`009case n of
  265. X`009`0090:;
  266. X`009`0091: begin
  267. X`009`009`009writeln(next_can_see(point),' is ',where);
  268. X`009`009   end;
  269. X`009`0092: begin
  270. X`009`009`009writeln(next_can_see(point),' and ',next_can_see(point),
  271. X`009`009`009`009' are ',where);
  272. X`009`009   end;
  273. X`009`009otherwise begin
  274. X`009`009`009len := 0;
  275. X`009`009`009for i := 1 to n - 1 do begin `123 at least 1 to 2 `125
  276. X`009`009`009`009tmp := next_can_see(point);
  277. X`009`009`009`009if i <> n - 1 then
  278. X`009`009`009`009`009tmp := tmp + ', ';
  279. X`009`009`009`009niceprint(len,tmp);
  280. X`009`009`009end;
  281. X
  282. X`009`009`009niceprint(len,' and ');
  283. X`009`009`009niceprint(len,next_can_see(point));
  284. X`009`009`009niceprint(len,' are ' + where);
  285. X`009`009`009writeln;
  286. X`009`009end;
  287. X`009end;
  288. Xend;
  289. X
  290. X
  291. Xprocedure desc_person(i: integer);
  292. Xvar
  293. X`009pname : string;
  294. X`009wear: integer;
  295. X`009lev,rel: integer;
  296. Xbegin
  297. X`009pname  := here.people`091i`093.name;
  298. X`009wear   := here.people`091i`093.wearing;
  299. X`009lev    := level(here.people`091i`093.experience);
  300. X
  301. X`009if wear > 0 then begin
  302. X`009`009getobj(wear);
  303. X`009`009freeobj;
  304. X`009`009if obj.kind = O_DISGUISE then begin
  305. X`009`009`009pname := 'Someone';
  306. X`009`009`009writeln('Someone is hiding behind ',obj_part(wear,false),'.');
  307. X`009`009end;
  308. X`009end;
  309. X
  310. X
  311. X`009if here.people`091i`093.act <> 0 then begin
  312. X`009`009write(pname,' is');
  313. X`009`009writeln(desc_action(here.people`091i`093.act,
  314. X`009`009`009here.people`091i`093.targ));
  315. X`009`009`009`009`009`123 describes what person last did `125
  316. X`009end;
  317. X
  318. X`009rel := here.people`091i`093.health * 10 div leveltable`091lev`093.health
  319. V;
  320. X
  321. X`009if rel <> GOODHEALTH then desc_health(i,pname+' ');
  322. X
  323. X`009if (wear > 0) and (pname <> 'Someone') then
  324. X`009`009writeln(pname,' is wearing ',obj_part(wear),'.');
  325. X
  326. X`009if here.people`091i`093.wielding > 0 then
  327. X`009`009writeln(pname,' is wielding ',obj_part(here.people`091i`093.wielding
  328. V),'.');
  329. X
  330. Xend;
  331. X
  332. X
  333. Xprocedure show_people;
  334. Xvar
  335. X`009i: integer;
  336. X
  337. Xbegin
  338. X`009people_header('here.');
  339. X`009for i := 1 to maxpeople do begin
  340. X`009`009if (here.people`091i`093.kind > 0) and
  341. X`009`009    `123 minor change by hurtta@finuh `125
  342. X`009`009   (i <> myslot) and
  343. X`009`009   (here.people`091i`093.hiding = 0) then
  344. X`009`009`009`009desc_person(i);
  345. X`009end;
  346. Xend;
  347. X
  348. X
  349. Xprocedure show_group;
  350. Xvar
  351. X`009gloc1,gloc2: integer;
  352. X`009gnam1,gnam2: shortstring;
  353. X
  354. Xbegin
  355. X`009gloc1 := here.grploc1;
  356. X`009gloc2 := here.grploc2;
  357. X`009gnam1 := here.grpnam1;
  358. X`009gnam2 := here.grpnam2;
  359. X
  360. X`009if gloc1 <> 0 then begin
  361. X`009`009gethere(gloc1);
  362. X`009`009people_header(gnam1);
  363. X`009end;
  364. X`009if gloc2 <> 0 then begin
  365. X`009`009gethere(gloc2);
  366. X`009`009people_header(gnam2);
  367. X`009end;
  368. X`009gethere;
  369. Xend;
  370. X
  371. X
  372. Xprocedure desc_obj(n: integer);
  373. X
  374. Xbegin
  375. X`009if n <> 0 then begin
  376. X`009`009getobj(n);
  377. X`009`009freeobj;
  378. X`009`009if (obj.linedesc = DEFAULT_LINE) then begin
  379. X`009`009`009writeln('On the ground here is ',obj_part(n,FALSE),'.');
  380. X
  381. X`009`009`009`009`123 the FALSE means obj_part shouldn't do its
  382. X`009`009`009`009  own getobj, cause we already did one `125
  383. X`009`009end else
  384. X`009`009`009print_line(obj.linedesc);
  385. X`009end;
  386. Xend;
  387. X
  388. X
  389. Xprocedure show_objects;
  390. X
  391. Xvar
  392. X`009i: integer;
  393. X
  394. Xbegin
  395. X`009for i := 1 to maxobjs do begin
  396. X`009`009if (here.objs`091i`093 <> 0) and (here.objhide`091i`093 = 0) then
  397. X`009`009`009desc_obj(here.objs`091i`093);
  398. X`009end;
  399. Xend;
  400. X
  401. X`123 function lookup_detail moved to module CUSTOM `125
  402. X
  403. Xfunction look_detail(s: string): boolean;
  404. Xvar
  405. X`009n: integer;
  406. X
  407. Xbegin
  408. X`009if lookup_detail(n,s) then begin
  409. X`009`009if here.detaildesc`091n`093 = 0 then
  410. X`009`009`009look_detail := false
  411. X`009`009else begin
  412. X`009`009`009print_desc(here.detaildesc`091n`093);
  413. X`009`009`009log_event(myslot,E_LOOKDETAIL,0,0,here.detail`091n`093);
  414. X`009`009`009look_detail := true;
  415. X`009`009`009if here.hook > 0 then
  416. X`009`009`009`009run_monster('',here.hook,'look detail',
  417. X`009`009`009`009`009'detail',here.detail`091n`093,
  418. X`009`009`009`009`009sysdate+' '+systime);
  419. X`009`009end;
  420. X`009end else
  421. X`009`009look_detail := false;
  422. Xend;
  423. X
  424. X
  425. Xfunction look_person(s: string; silent: boolean := false): boolean;
  426. Xlabel 0; `123 for panic `125
  427. Xvar
  428. X`009objnum,i,n,lev,oldloc: integer;
  429. X`009first: boolean;
  430. X
  431. X    function restriction(slot: integer): boolean;
  432. X    begin
  433. X`009restriction := here.people`091slot`093.hiding = 0;
  434. X`009`123 can't see hiding people `125
  435. X    end;
  436. X
  437. X    function action(s: shortstring; n: integer): boolean;
  438. X    begin
  439. X`009if n = myslot then begin
  440. X`009    log_event(myslot,E_LOOKSELF,n,0);
  441. X`009    writeln('You step outside of yourself for a moment to get an objecti
  442. Vve self-appraisal:');
  443. X`009    writeln;
  444. X`009end else log_event(myslot,E_LOOKYOU,n,0);
  445. X
  446. X`009if here.people`091n`093.self <> 0 then begin
  447. X`009    print_desc(here.people`091n`093.self);
  448. X`009    writeln;
  449. X`009   `032
  450. X`009end;
  451. X
  452. X`009if (here.people`091n`093.kind = P_MONSTER) and`032
  453. X`009    (here.people`091n`093.parm > 0) then
  454. X`009    run_monster(here.people`091n`093.name,
  455. X`009`009here.people`091n`093.parm,'look you','','',
  456. X`009`009    sysdate+' '+systime);
  457. X`009if oldloc <> location then goto 0; `123 panic `125
  458. X
  459. X`009desc_health(n);
  460. X
  461. X`009lev := level(here.people`091n`093.experience);
  462. X`009if here.people`091n`093.kind = P_PLAYER then
  463. X`009    writeln(here.people`091n`093.name,' is ',leveltable`091lev`093.name,
  464. V'.');
  465. X
  466. X`009`009`123 Do an inventory of person S `125
  467. X`009`009`123 What is he wearing? `125
  468. X`009if here.people`091n`093.wearing <> 0 then
  469. X`009    writeln(here.people`091n`093.name,' is wearing ',obj_part(here.peopl
  470. Ve`091n`093.wearing),'.');
  471. X`009`009`123 What is he wielding? `125
  472. X`009if here.people`091n`093.wielding <> 0 then
  473. X`009    writeln(here.people`091n`093.name,' is wielding ',obj_part(here.peop
  474. Vle`091n`093.wielding),'.');
  475. X`009if here.people`091n`093.act <> 0 then begin
  476. X`009    write(here.people`091n`093.name,' is');
  477. X`009    writeln(desc_action(here.people`091n`093.act,
  478. X`009`009`009here.people`091n`093.targ));
  479. X`009`009`123 describes what person last did `125
  480. X`009end;
  481. X
  482. X
  483. X`009`009`009`123 What other stuff does he carry? `125
  484. X`009first := true;
  485. X`009for i := 1 to maxhold do begin
  486. X`009    objnum := here.people`091n`093.holding`091i`093;
  487. X`009    `123 Show only once those things he wears or wields `125
  488. X`009    if (objnum <> 0) then begin
  489. X`009`009if (objnum <> here.people`091n`093.wearing) and
  490. X`009`009    (objnum <> here.people`091n`093.wielding) then begin
  491. X`009`009    if first then begin
  492. X`009`009`009writeln(here.people`091n`093.name,' is holding:');
  493. X`009`009`009first := false;
  494. X`009`009    end;
  495. X`009`009    writeln('   ',obj_part(objnum));
  496. X`009`009end;
  497. X`009    end;
  498. X`009end;
  499. X`009if first then
  500. X`009    writeln(here.people`091n`093.name,' is empty handed.');
  501. X`009action := true;
  502. X`009checkevents(TRUE);
  503. X`009if oldloc <> location then goto 0; `123 panic `125
  504. X    end;    `123 action `125
  505. X
  506. X
  507. Xbegin
  508. X    look_person := false;
  509. X    oldloc := location;
  510. X    if scan_pers_slot(action,s,silent,restriction) then begin
  511. X`009look_person := true;
  512. X    end else
  513. X`009look_person := false;
  514. X    0: `123 for panic `125
  515. Xend;
  516. X
  517. X
  518. Xprocedure do_examine(s: string;var three: boolean;silent:boolean := false);
  519. Xlabel 0;
  520. Xvar
  521. X`009n,oldloc: integer;
  522. X`009msg: string;
  523. X
  524. X    function action(s: shortstring; n: integer): boolean;
  525. X    begin
  526. X`009    three := true;
  527. X
  528. X`009`009getobj(n);
  529. X`009`009freeobj;
  530. X`009`009msg := log_name + ' is examining ' + obj_part(n) + '.';
  531. X`009`009log_event(myslot,E_EXAMINE,0,0,msg);
  532. X`009`009if (obj.home = location) and (obj.homedesc <> 0)`032
  533. X`009`009    and obj_here (n,TRUE) then
  534. X`009`009    print_desc(obj.homedesc)
  535. X`009`009else if obj.examine = 0 then
  536. X`009`009    writeln('You see nothing special about the ',
  537. X`009`009`009objnam.idents`091n`093,'.')
  538. X`009`009else
  539. X`009`009    print_desc(obj.examine);
  540. X`009`009if obj.actindx > 0 then
  541. X`009`009    run_monster('',obj.actindx,
  542. X`009`009`009'look you','','',
  543. X`009`009`009sysdate+' '+systime);
  544. X`009`009action := true;
  545. X`009    checkevents (TRUE);
  546. X`009    if oldloc <> location then goto 0; `123 panic `125
  547. X       end; `123 action `125
  548. X
  549. X    function restriction (n: integer): boolean;
  550. X`009begin
  551. X`009    restriction := obj_here(n,true) or obj_hold(n);
  552. X`009    `123 true = not found hidden objects `125
  553. X`009end;
  554. X
  555. Xbegin
  556. X`009`123 if s = '' then grab_line('Object? ',s); `125
  557. X
  558. X`009three`009:= false;
  559. X`009oldloc`009:= location;
  560. X`009if scan_obj(action,s,silent,restriction) then begin
  561. X`009end else
  562. X`009`009if not(silent) then
  563. X`009`009`009writeln('That object cannot be seen here.');
  564. X`0090: `123 for panic `125
  565. Xend;
  566. X
  567. X
  568. X
  569. Xprocedure print_room;
  570. X
  571. Xbegin
  572. X`009case here.nameprint of
  573. X`009`0090:;`009`123 don't print name `125
  574. X`009`0091: writeln('You''re in ',here.nicename);
  575. X`009`0092: writeln('You''re at ',here.nicename);
  576. X`009`0093: writeln('You''re in the ',here.nicename);
  577. X`009`0094: writeln('You''re at the ',here.nicename);
  578. X`009`0095: writeln('You''re in a ',here.nicename);
  579. X`009`0096: writeln('You''re at a ',here.nicename);
  580. X`009`0097: writeln('You''re in an ',here.nicename);
  581. X`009`0098: writeln('You''re at an ',here.nicename);
  582. X`009end;
  583. X
  584. X`009if not(brief) then begin
  585. X`009case here.which of
  586. X`009`0090: print_desc(here.primary);
  587. X`009`0091: print_desc(here.secondary);
  588. X`009`0092: begin
  589. X`009`009`009print_desc(here.primary);
  590. X`009`009`009print_desc(here.secondary);
  591. X`009`009   end;
  592. X`009`0093: begin
  593. X`009`009`009print_desc(here.primary);
  594. X`009`009`009if here.magicobj <> 0 then
  595. X`009`009`009`009if obj_hold(here.magicobj) then
  596. X`009`009`009`009`009print_desc(here.secondary);
  597. X`009`009   end;
  598. X`009`0094: begin
  599. X`009`009`009if here.magicobj <> 0 then begin
  600. X`009`009`009`009if obj_hold(here.magicobj) then
  601. X`009`009`009`009`009print_desc(here.secondary)
  602. X`009`009`009`009else
  603. X`009`009`009`009`009print_desc(here.primary);
  604. X`009`009`009end else
  605. X`009`009`009`009print_desc(here.primary);
  606. X`009`009   end;
  607. X`009end;
  608. X`009writeln;
  609. X`009end;   `123 if not(brief) `125
  610. Xend;
  611. X
  612. X
  613. X
  614. Xprocedure do_look(s: string := '');
  615. Xlabel 1;
  616. Xvar
  617. X`009n: integer;
  618. X`009one,two,three: boolean;
  619. X`009oldloc : integer;
  620. Xbegin
  621. X`009gethere;
  622. X`009if s = '' then begin`009`123 do an ordinary top-level room look `125
  623. X`009`009oldloc := location;
  624. X`009`009if hiding then begin
  625. X`009`009`009writeln('You can''t get a very good view of the details of the r
  626. Voom from where');
  627. X`009`009`009writeln('you are hiding.');
  628. X`009`009`009noisehide(67);
  629. X`009`009end else begin
  630. X`009`009`009log_event(myslot,E_LOOKAROUND);
  631. X`009`009`009print_room;
  632. X`009`009`009show_exits;
  633. X`009`009end;`009`009`123 end of what you can't see when you're hiding `125
  634. X`009`009show_people;   if oldloc <> location then goto 1;
  635. X`009`009show_group;
  636. X`009`009show_objects;  if oldloc <> location then goto 1;
  637. X`009`009if here.hook > 0 then`032
  638. X`009`009`009run_monster('',here.hook,'look around','','',
  639. X`009`009`009`009sysdate+' '+systime);
  640. X`009`009if oldloc <> location then goto 1;
  641. X`009`009meta_run('look','','');
  642. X`009end else begin`009`009`123 look at a detail in the room `125
  643. X                oldloc := location;
  644. X`009`009one := look_detail(s);
  645. X`009`009two := look_person(s,TRUE); if oldloc <> location then goto 1;
  646. X`009`009do_examine(s,three,TRUE); if oldloc <> location then goto 1;
  647. X`009`009if not(one or two or three) then
  648. X`009`009`009writeln('There isn''t anything here by that name to look at.')
  649. X`009`009else meta_run('look','','')
  650. X`009end;
  651. X`0091:
  652. Xend;
  653. X
  654. X
  655. Xprocedure init_exit(dir: integer);
  656. X
  657. Xbegin
  658. X`009with here.exits`091dir`093 do begin
  659. X`009`009exitdesc := DEFAULT_LINE;
  660. X`009`009fail := DEFAULT_LINE;`009`009`123 default descriptions `125
  661. X`009`009success := 0;`009`009`009`123 until they customize `125
  662. X`009`009comeout := DEFAULT_LINE;
  663. X`009`009goin := DEFAULT_LINE;
  664. X`009`009closed := DEFAULT_LINE;
  665. X
  666. X`009`009objreq := 0;`009`009`123 not a door (yet) `125
  667. X`009`009hidden := 0;`009`009`123 not hidden `125
  668. X`009`009reqalias := false;`009`123 don't require alias (i.e. can use
  669. X`009`009`009`009`009  direction of exit North, east, etc. `125
  670. X`009`009reqverb := false;
  671. X`009`009autolook := true;
  672. X`009`009alias := '';
  673. X`009end;
  674. Xend;
  675. X
  676. X
  677. X
  678. Xprocedure remove_exit(dir: integer);
  679. Xvar
  680. X`009targroom,targslot,owner: integer;
  681. X`009hereacc,targacc: boolean;
  682. X
  683. Xbegin
  684. X`009`009`123 Leave residual accepts if player is not the owner of
  685. X`009`009  the room that the exit he is deleting is in `125
  686. X
  687. X`009getroom;
  688. X`009targroom := here.exits`091dir`093.toloc;
  689. X`009targslot := here.exits`091dir`093.slot;
  690. X`009here.exits`091dir`093.toloc := 0;
  691. X`009init_exit(dir);
  692. X
  693. X`009if (here.owner = userid) or`032
  694. X`009    (owner_priv and (here.owner <> system_id)) or
  695. X`009    manager_priv then `123 minor change by leino@finuha and hurtta@finuh
  696. Va `125
  697. X`009`009hereacc := false
  698. X`009else
  699. X`009`009hereacc := true;
  700. X
  701. X`009if hereacc then begin
  702. X`009`009here.exits`091dir`093.kind := 5;`009`123 put an "accept" in its plac
  703. Ve `125
  704. X`009`009
  705. X`009`009if exact_user(owner,here.owner) then
  706. X`009`009    add_counter(N_ACCEPT,owner);
  707. X
  708. X`009end else
  709. X`009`009here.exits`091dir`093.kind := 0;
  710. X
  711. X`009putroom;
  712. X`009log_event(myslot,E_DETACH,dir,0,log_name,location);
  713. X
  714. X`009getroom(targroom);
  715. X`009here.exits`091targslot`093.toloc := 0;
  716. X
  717. X`009if (here.owner = userid) or (owner_priv) then `123 minor change by leino
  718. V@finuha `125
  719. X`009`009targacc := false
  720. X`009else
  721. X`009`009targacc := true;
  722. X
  723. X`009if targacc then
  724. X`009`009here.exits`091targslot`093.kind := 5`009`123 put an "accept" in its
  725. V place `125
  726. X`009else
  727. X`009`009here.exits`091targslot`093.kind := 0;
  728. X
  729. X`009putroom;
  730. X
  731. X`009if targroom <> location then
  732. X`009`009log_event(0,E_DETACH,targslot,0,log_name,targroom);
  733. X`009writeln('Exit destroyed.');
  734. Xend;
  735. X
  736. X
  737. X`123
  738. XUser procedure to unlink a room
  739. X`125
  740. Xprocedure do_unlink(s: string);
  741. Xlabel exit_label;
  742. Xvar
  743. X`009dir: integer;
  744. X
  745. X    procedure leave;
  746. X    begin
  747. X`009writeln('EXIT - no changes.');
  748. X`009goto exit_label;
  749. X    end;
  750. X
  751. X
  752. Xbegin
  753. X`009if s = '' then grab_line('Direction? ',s,eof_handler := leave);
  754. X
  755. X`009gethere;
  756. X`009if checkhide then begin
  757. X`009if lookup_dir(dir,s,true) then begin
  758. X`009`009if can_alter(dir) then begin
  759. X`009`009`009if here.exits`091dir`093.toloc = 0 then
  760. X`009`009`009`009writeln('There is no exit there to unlink.')
  761. X`009`009`009else
  762. X`009`009`009`009remove_exit(dir);
  763. X`009`009end else
  764. X`009`009`009writeln('You are not allowed to remove that exit.');
  765. X`009end else
  766. X`009`009writeln('To remove an exit, type UNLINK <direction of exit>.');
  767. X`009end;
  768. X`009exit_label:
  769. Xend;
  770. X
  771. X`123 slead and bite moved to PARSER.PAS `125
  772. X
  773. X`123 function desc_allowed moved to module CUSTOM `125
  774. X
  775. X
  776. X
  777. X`123 procedure do_descibe moved to module CUSTOM `125
  778. X
  779. Xprocedure del_room(n: integer);
  780. Xvar
  781. X`009i,oldowner: integer;
  782. X
  783. Xbegin
  784. X`009getnam;
  785. X`009nam.idents`091n`093 := '';`009`123 blank out name `125
  786. X`009putnam;
  787. X
  788. X`009getown;
  789. X`009own.idents`091n`093 := '';`009`123 blank out owner `125
  790. X`009putown;
  791. X
  792. X`009getroom(n);
  793. X`009if not exact_user(oldowner,here.owner) then oldowner := 0;
  794. X`009change_owner(oldowner,0);
  795. X
  796. X`009for i := 1 to maxexit do begin
  797. X`009`009with here.exits`091i`093 do begin
  798. X`009`009`009delete_line(exitdesc);
  799. X`009`009`009delete_block(fail);
  800. X`009`009`009delete_block(success);
  801. X`009`009`009delete_block(comeout);
  802. X`009`009`009delete_block(goin);
  803. X`009`009`009delete_block(hidden);
  804. X`009`009end;
  805. X`009end;
  806. X`009for i := 1 to maxdetail do begin
  807. X`009`009delete_block(here.detaildesc`091i`093);
  808. X`009end;
  809. X`009delete_block(here.primary);
  810. X`009delete_block(here.secondary);
  811. X        delete_line(here.objdesc);
  812. X        delete_line(here.objdest);
  813. X        delete_line(here.rndmsg);
  814. X        delete_block(here.xmsg2);
  815. X        delete_block(here.exitfail);
  816. X        delete_block(here.ofail);
  817. X`009if here.hook > 0 then begin`009`123 delete hook -code `125
  818. X`009`009delete_program(here.hook);
  819. X`009`009delete_general(I_HEADER,here.hook);
  820. X`009end;
  821. X`009putroom;
  822. X`009delete_room(n);`009`123 return room to free list `125
  823. Xend;
  824. X
  825. X
  826. X
  827. Xprocedure createroom(s: string);`009`123 create a room with name s `125
  828. Xvar
  829. X`009roomno: integer;
  830. X`009dummy: integer;
  831. X`009i:integer;
  832. X`009rand_accept: integer;
  833. X
  834. Xbegin
  835. X`009if length(s) = 0 then begin
  836. X`009`009writeln('Please specify the name of the room you wish to create as a
  837. V parameter to FORM.');
  838. X`009end else if length(s) > shortlen then begin
  839. X`009`009writeln('Please limit your room name to a maximum of ',shortlen:1,'
  840. V characters.');
  841. X`009end else if exact_room(dummy,s) then begin
  842. X`009`009writeln('That room name has already been used.  Please give a unique
  843. V room name.');
  844. X`009end else if alloc_room(roomno) then begin
  845. X`009`009log_action(form,0);
  846. X
  847. X`009`009getnam;
  848. X`009`009nam.idents`091roomno`093 := lowcase(s);`009`123 assign room name `12
  849. V5
  850. X`009`009putnam;`009`009`009`009`009`123 case insensitivity `125
  851. X
  852. X`009`009getown;
  853. X`009`009own.idents`091roomno`093 := userid;`009`123 assign room owner `125
  854. X`009`009putown;
  855. X
  856. X`009`009getroom(roomno);
  857. X
  858. X`009`009here.primary := 0;
  859. X`009`009here.secondary := 0;
  860. X`009`009here.which := 0;`009`123 print primary desc only by default `125
  861. X`009`009here.magicobj := 0;
  862. X
  863. X`009`009here.owner := userid;`009`123 owner and name are stored here too `12
  864. V5
  865. X`009`009here.nicename := s;
  866. X`009`009here.nameprint := 1;`009`123 You're in ... `125
  867. X`009`009here.objdrop := 0;`009`123 objects dropped stay here `125
  868. X`009`009here.objdesc := 0;`009`123 nothing printed when they drop `125
  869. X`009`009here.magicobj := 0;`009`123 no magic object default `125
  870. X`009`009here.trapto := 0;`009`123 no trapdoor `125
  871. X`009`009here.trapchance := 0;`009`123 no chance `125
  872. X`009`009here.rndmsg := DEFAULT_LINE;`009`123 bland noises message `125
  873. X`009`009here.pile := 0;
  874. X`009`009here.grploc1 := 0;
  875. X`009`009here.grploc2 := 0;
  876. X`009`009here.grpnam1 := '';
  877. X`009`009here.grpnam2 := '';
  878. X
  879. X`009`009here.effects := 0;
  880. X`009`009here.parm := 0;
  881. X
  882. X`009`009here.xmsg2 := 0;
  883. X`009`009here.hook := 0;
  884. X
  885. X`009`009here.exp3 := 0;
  886. X`009`009here.exp4 := 0;
  887. X`009`009here.exitfail := DEFAULT_LINE;
  888. X`009`009here.ofail := DEFAULT_LINE;
  889. X
  890. X`009`009for i := 1 to maxpeople do
  891. X`009`009`009here.people`091i`093.kind := 0;
  892. X
  893. X`009`009for i := 1 to maxpeople do
  894. X`009`009`009here.people`091i`093.name := '';
  895. X
  896. X`009`009for i := 1 to maxobjs do
  897. X`009`009`009here.objs`091i`093 := 0;
  898. X
  899. X`009`009for i := 1 to maxdetail do
  900. X`009`009`009here.detail`091i`093 := '';
  901. X`009`009for i := 1 to maxdetail do
  902. X`009`009`009here.detaildesc`091i`093 := 0;
  903. X
  904. X`009`009for i := 1 to maxobjs do
  905. X`009`009`009here.objhide`091i`093 := 0;
  906. X
  907. X`009`009for i := 1 to maxexit do
  908. X`009`009`009with here.exits`091i`093 do begin
  909. X`009`009`009`009toloc := 0;
  910. X`009`009`009`009kind := 0;
  911. X`009`009`009`009slot := 0;
  912. X`009`009`009`009exitdesc := DEFAULT_LINE;
  913. X`009`009`009`009fail := DEFAULT_LINE;
  914. X`009`009`009`009success := 0;`009`123 no success desc by default `125
  915. X`009`009`009`009goin := DEFAULT_LINE;
  916. X`009`009`009`009comeout := DEFAULT_LINE;
  917. X`009`009`009`009closed := DEFAULT_LINE;
  918. X
  919. X`009`009`009`009objreq := 0;
  920. X`009`009`009`009hidden := 0;
  921. X`009`009`009`009alias := '';
  922. X
  923. X`009`009`009`009reqverb := false;
  924. X`009`009`009`009reqalias := false;
  925. X`009`009`009`009autolook := true;
  926. X`009`009`009end;
  927. X`009`009
  928. X`123`009`009here.exits := zero;`009`125
  929. X
  930. X`009`009`009`009`123 random accept for this room `125
  931. X`009`009rand_accept := 1 + (rnd100 mod maxexit);
  932. X`009`009here.exits`091rand_accept`093.kind := 5;
  933. X
  934. X`009`009putroom;
  935. X`009`009writeln('Room created.');
  936. X`009`009change_owner(0,mylog);
  937. X`009end;
  938. Xend;
  939. X
  940. X
  941. X
  942. X
  943. Xfunction lookup_cmd(s: string):integer;
  944. Xvar
  945. X`009i,`009`009`123 index for loop `125
  946. X`009poss,`009`009`123 a possible match -- only for partial matches `125
  947. X`009maybe,`009`009`123 number of possible matches we have: > 2 is ambig. `12
  948. V5
  949. X`009num`009`009`123 the definite match `125
  950. X`009`009: integer;
  951. X
  952. X
  953. Xbegin
  954. X`009s := lowcase(s);
  955. X`009i := 1;
  956. X`009maybe := 0;
  957. X`009num := 0;
  958. X`009for i := 1 to numcmds do begin
  959. X`009`009if s = cmds`091i`093 then
  960. X`009`009`009num := i
  961. X`009`009else if index(cmds`091i`093,s) = 1 then begin
  962. X`009`009`009maybe := maybe + 1;
  963. X`009`009`009poss := i;
  964. X`009`009end;
  965. X`009end;
  966. X`009if num <> 0 then begin
  967. X`009`009lookup_cmd := num;
  968. X`009end else if maybe = 1 then begin
  969. X`009`009lookup_cmd := poss;
  970. X`009end else if maybe > 1 then
  971. X`009`009lookup_cmd := error`009`123 "Ambiguous" `125
  972. X`009else
  973. X`009`009lookup_cmd := error;`009`123 "Command not found " `125
  974. Xend;
  975. X
  976. X`123 addrooms moved to module DATABASE `125
  977. X
  978. X`123 addints moved to module DATABASE `125
  979. X
  980. X`123 addlines moved to module DATABASE `125
  981. X
  982. X`123 addblocks moved to module DATABASE `125
  983. X
  984. X`123 addobjects moved to module DATABASE `125
  985. X
  986. Xprocedure dist_list;
  987. Xvar
  988. X`009i,j: integer;
  989. X`009f: text;
  990. X`009where_they_are: intrec;
  991. X
  992. Xbegin
  993. X`009writeln('Writing distribution list . . .');
  994. X`009open(f,'monsters.dis',history := new);
  995. X`009rewrite(f);
  996. X
  997. X`009getindex(I_PLAYER);`009`123 Rec of valid player log records  `125
  998. X`009freeindex;`009`009`123 False if a valid player log `125
  999. X
  1000. X`009getuser;`009`009`123 Corresponding userids of players `125
  1001. X`009freeuser;
  1002. X
  1003. X`009getreal_user;`009`009`123 real usernames of players `125
  1004. X`009freereal_user;
  1005. X
  1006. X`009getpers;`009`009`123 Personal names of players `125
  1007. X`009freepers;
  1008. X
  1009. X`009getdate;`009`009`123 date of last play `125
  1010. X`009freedate;
  1011. X
  1012. X`009if manager_priv then begin `123 minor change by leino@finuha `125
  1013. X`009`009getint(N_LOCATION);
  1014. X`009`009freeint;
  1015. X`009`009where_they_are := anint;
  1016. X
  1017. X`009`009getnam;
  1018. X`009`009freenam;
  1019. X`009end;
  1020. X
  1021. X`009for i := 1 to maxplayers do begin
  1022. X`009`009if not(indx.free`091i`093) then begin
  1023. X`009`009`009if user.idents`091i`093 = '' then write(f,'! <null>        ')
  1024. X`009`009`009else if user.idents`091i`093`0911`093 = ':' then`032
  1025. X`009`009`009`009write(f,'! <monster>     ')
  1026. X`009`009`009else if user.idents`091i`093`0911`093 = '"' then begin
  1027. X                                write(f,real_user.idents`091i`093);
  1028. X`009`009`009`009for j := length(real_user.idents`091i`093) to 15 do
  1029. X`009`009`009`009`009write(f,' ');
  1030. X`009`009`009end else begin`032
  1031. X`123 if we have username, don't use real_username, because it can be of `009
  1032. V`125
  1033. X`123 Monster Manager `009`009`009`009`009`009`009`125
  1034. X`009`009`009`009write(f,user.idents`091i`093);
  1035. X`009`009`009`009for j := length(user.idents`091i`093) to 15 do
  1036. X`009`009`009`009`009write(f,' ');
  1037. X`009`009`009end;
  1038. X`009`009`009write(f,'! ',pers.idents`091i`093);
  1039. X`009`009`009for j := length(pers.idents`091i`093) to 21 do
  1040. X`009`009`009`009write(f,' ');
  1041. X
  1042. X`009`009`009write(f,adate.idents`091i`093);
  1043. X`009`009`009`009if length(adate.idents`091i`093) < 19 then
  1044. X`009`009`009`009`009for j := length(adate.idents`091i`093) to 18 do
  1045. X`009`009`009`009`009`009write(f,' ');
  1046. X`009`009`009if anint.int`091i`093 <> 0 then
  1047. X`009`009`009`009write(f,' * ')
  1048. X`009`009`009else
  1049. X`009`009`009`009write(f,'   ');
  1050. X
  1051. X`009`009`009if manager_priv then begin `123 minor change by leino@finuha `12
  1052. V5
  1053. X`009`009`009`009write(f,nam.idents`091 where_they_are.int`091i`093 `093);
  1054. X`009`009`009end;
  1055. X`009`009`009writeln(f);
  1056. X
  1057. X`009`009end;
  1058. X`009end;
  1059. X`009writeln('Done.');
  1060. Xend;
  1061. X
  1062. X
  1063. Xprocedure system_view;
  1064. Xvar
  1065. X`009used,free,total: integer;
  1066. X
  1067. Xbegin
  1068. X`009writeln;
  1069. X`009getindex(I_BLOCK);
  1070. X`009freeindex;
  1071. X`009used := indx.inuse;
  1072. X`009total := indx.top;
  1073. X`009free := total - used;
  1074. X
  1075. X`009writeln('               used   free   total');
  1076. X`009writeln('Block file   ',used:5,'  ',free:5,'   ',total:5);
  1077. X
  1078. X`009getindex(I_LINE);
  1079. X`009freeindex;
  1080. X`009used := indx.inuse;
  1081. X`009total := indx.top;
  1082. X`009free := total - used;
  1083. X`009writeln('Line file    ',used:5,'  ',free:5,'   ',total:5);
  1084. X
  1085. X`009getindex(I_ROOM);
  1086. X`009freeindex;
  1087. X`009used := indx.inuse;
  1088. X`009total := indx.top;
  1089. X`009free := total - used;
  1090. X`009writeln('Room file    ',used:5,'  ',free:5,'   ',total:5);
  1091. X
  1092. X`009getindex(I_OBJECT);
  1093. X`009freeindex;
  1094. X`009used := indx.inuse;
  1095. X`009total := indx.top;
  1096. X`009free := total - used;
  1097. X`009writeln('Object file  ',used:5,'  ',free:5,'   ',total:5);
  1098. X
  1099. X`009getindex(I_INT);
  1100. X`009freeindex;
  1101. X`009used := indx.inuse;
  1102. X`009total := indx.top;
  1103. X`009free := total - used;
  1104. X`009writeln('Integer file ',used:5,'  ',free:5,'   ',total:5);
  1105. X
  1106. X`009getindex(I_HEADER);
  1107. X`009freeindex;
  1108. X`009used := indx.inuse;
  1109. X`009total := indx.top;
  1110. X`009free := total - used;
  1111. X`009writeln('Header file  ',used:5,'  ',free:5,'   ',total:5);
  1112. X
  1113. X`009getindex(I_SPELL);
  1114. X`009freeindex;
  1115. X`009used := indx.inuse;
  1116. X`009total := indx.top;
  1117. X`009free := total - used;
  1118. X`009writeln('Spells       ',used:5,'  ',free:5,'   ',total:5);
  1119. X
  1120. X`009getindex(I_PLAYER);
  1121. X`009freeindex;
  1122. X`009used := indx.inuse;
  1123. X`009total := indx.top;
  1124. X`009free := total - used;
  1125. X`009writeln('Players      ',used:5,'  ',free:5,'   ',total:5);
  1126. X
  1127. X`009writeln;             `032
  1128. Xend;
  1129. X
  1130. X
  1131. X`123 remove a user from the log records (does not handle ownership) `125
  1132. X
  1133. Xprocedure kill_user(s:string);
  1134. Xvar
  1135. X`009n: integer;
  1136. X
  1137. Xbegin
  1138. X`009if length(s) = 0 then
  1139. X`009`009writeln('No user specified')
  1140. X`009else begin
  1141. X`009`009if lookup_user(n,s,true) then begin
  1142. X`009`009`009getindex(I_ASLEEP);
  1143. X`009`009`009freeindex;               `032
  1144. X                        `123 variable user is reading in lookup_user `125
  1145. X                        if user.idents`091n`093`0911`093 = ':' then begin
  1146. X `009`009`009`009writeln ('That is monster, not player.');
  1147. X`009`009`009`009writeln ('Use ERASE <monster name> to delete monster.')
  1148. X`009`009`009end else if indx.free`091n`093 then begin
  1149. X`009`009`009`009delete_log(n);
  1150. X`009`009`009`009writeln('Player deleted.');
  1151. X`009  `009`009end else
  1152. X`009`009`009`009writeln('That person is playing now.');
  1153. X`009`009end else
  1154. X`009`009`009writeln('No such userid found in log information.');
  1155. X`009end;
  1156. Xend;
  1157. X
  1158. X
  1159. X`123 disown everything a player owns `125
  1160. X
  1161. Xprocedure disown_user(s:string);
  1162. Xvar
  1163. X`009n: integer;
  1164. X`009i,count: integer;
  1165. X`009tmp: string;
  1166. X`009theuser: string;
  1167. X
  1168. Xbegin
  1169. X
  1170. X`009if length(s) > 0 then begin
  1171. X`009    if not lookup_user(n,s) then begin
  1172. X`009`009    writeln('User not in log info, attempting to disown anyway.');
  1173. X`009`009    theuser := s;
  1174. X`009    end else begin
  1175. X`009`009    theuser := user.idents`091n`093;
  1176. X
  1177. X`009    end;
  1178. X`009    `123 first disown all their rooms `125
  1179. X
  1180. X`009    getown;
  1181. X`009    freeown;
  1182. X`009    getindex(I_ROOM);
  1183. X`009    freeindex;
  1184. X`009    for i := 1 to indx.top do if not indx.free`091i`093 then
  1185. X`009`009`009if own.idents`091i`093 = theuser then begin
  1186. X`009`009`009`009    getown;
  1187. X`009`009`009`009    own.idents`091i`093 := disowned_id;
  1188. X`009`009`009`009    putown;
  1189. X
  1190. X`009`009`009`009    getroom(i);
  1191. X`009`009`009`009    tmp := here.nicename;
  1192. X`009`009`009`009    here.owner := disowned_id;
  1193. X`009`009`009`009    putroom;
  1194. X
  1195. X`009`009`009`009    writeln('Disowned room ',tmp);
  1196. X`009`009`009end;
  1197. X`009    writeln;
  1198. X
  1199. X`009    getobjown;
  1200. X`009    freeobjown;
  1201. X`009    getobjnam;
  1202. X`009    freeobjnam;
  1203. X
  1204. X`009    getindex(I_OBJECT);
  1205. X`009    freeindex;
  1206. X`009    for i := 1 to indx.top do if not indx.free`091i`093 then
  1207. X`009`009`009`009if objown.idents`091i`093 = theuser then begin
  1208. X`009`009`009`009    getobjown;
  1209. X`009`009`009`009    objown.idents`091i`093 := disowned_id;
  1210. X`009`009`009`009    putobjown;
  1211. X
  1212. X`009`009`009`009    tmp := objnam.idents`091i`093;
  1213. X`009`009`009`009    writeln('Disowned object ',tmp);
  1214. X`009`009`009`009end;
  1215. X
  1216. X`009    `123 writeln('Disown codes ...'); `125
  1217. X`009    count := 0;
  1218. X`009    getindex(I_HEADER);
  1219. X`009    freeindex;
  1220. X`009    for i := 1 to indx.top do if not indx.free`091i`093 then
  1221. X`009`009`009    if monster_owner(i) = theuser then begin
  1222. X`009`009`009`009set_owner(i,,disowned_id);
  1223. X`009`009`009`009count := count +1;
  1224. X`009`009`009    end;
  1225. X`009    if count > 0 then`032
  1226. X`009`009`009writeln('Disowned ',count:1,' codes.');
  1227. X`009`009   `032
  1228. X`009    sub_counter(N_NUMROOMS,n,get_counter(N_NUMROOMS,n));
  1229. X`009    sub_counter(N_ACCEPT,n,get_counter(N_ACCEPT,n));
  1230. X`009end else
  1231. X`009`009writeln('No user specified.');
  1232. Xend;
  1233. X
  1234. Xprocedure move_asleep (s : string);
  1235. Xlabel exit_label;
  1236. Xvar
  1237. X`009pname,rname:string;`009`123 player & room names `125
  1238. X`009newroom,n: integer;`009`123 room number & player slot number `125
  1239. X
  1240. X    procedure leave;
  1241. X    begin
  1242. X`009writeln('EXIT - no changes.');
  1243. X`009goto exit_label;
  1244. X    end;
  1245. X
  1246. X
  1247. Xbegin
  1248. X`009if s = '' then grab_line('Player name? ',pname,
  1249. X`009    eof_handler := leave)
  1250. X`009else pname := s;
  1251. X`009if lookup_user(n,pname,true) then begin
  1252. X`009`009grab_line('Room name?   ',rname,
  1253. X`009`009    eof_handler := leave);
  1254. X`009`009if lookup_room(newroom,rname,true) then begin
  1255. X`009`009`009getindex(I_ASLEEP);
  1256. X`009`009`009freeindex;
  1257. X`009`009`009if indx.free`091n`093 then begin
  1258. X`009`009`009`009getint(N_LOCATION);
  1259. X`009`009`009`009anint.int`091n`093 := newroom;
  1260. X`009`009`009`009putint;
  1261. X`009`009`009`009writeln('Player moved.');
  1262. X`009`009`009end else
  1263. X`009`009`009`009writeln('That player is not asleep.');
  1264. X`009`009end else
  1265. X`009`009`009writeln('No such room found.');
  1266. X`009end else
  1267. X`009`009writeln('User not found.');
  1268. X    exit_label:
  1269. Xend;
  1270. X
  1271. X     `032
  1272. X
  1273. Xprocedure authorize (param: string);
  1274. Xlabel exit_label;
  1275. X`123 leino@finuha `125
  1276. X
  1277. X    procedure leave;
  1278. X    begin
  1279. X`009writeln('EXIT - no changes.');
  1280. X`009goto exit_label;
  1281. X    end;
  1282. X
  1283. X
  1284. Xvar
  1285. X`009s, prompt, pname: string;
  1286. X`009cmd: char;
  1287. X`009done: boolean;
  1288. X`009n, i, j: integer;
  1289. X   `009privs,
  1290. X`009system,
  1291. X`009poof,
  1292. X`009room,
  1293. X`009object,
  1294. X`009special,
  1295. X`009monster,
  1296. X`009exp`009`009: integer;
  1297. X`009granted : unsigned;
  1298. X
  1299. Xbegin
  1300. X`009prompt:= 'Authorize> ';
  1301. X`009if param = '' then grab_line ('Player name? ', pname,
  1302. X`009    eof_handler := leave)
  1303. X`009else pname := param;
  1304. X`009if lookup_user(n, pname, true) then begin
  1305. X
  1306. X`009`009getint (N_PRIVILEGES);
  1307. X`009`009freeint;
  1308. X
  1309. X`009`009privs:= anint.int `091n`093;
  1310. X
  1311. X`009`009granted := all_privileges;
  1312. X`009`009if userid <> MM_userid  then`032
  1313. X`009`009    granted := uand(granted,unot(PR_manager));
  1314. X
  1315. X`009`009if custom_privileges(privs,granted) then begin
  1316. X`009`009   `032
  1317. X`009`009    getint (N_PRIVILEGES);
  1318. X`009`009    anint.int `091n`093 := privs;
  1319. X`009`009    putint;
  1320. X`009`009    writeln ('Database updated.');
  1321. X
  1322. X`009`009end else writeln('Database not updated.');
  1323. X
  1324. X
  1325. X(*  `009`009system:= privs mod 2;
  1326. X`124`009`009poof:= (privs mod 4) div 2;
  1327. X`124`009`009room:= (privs mod 8) div 4;
  1328. X`124`009`009object:= (privs mod 16) div 8;
  1329. X`124`009`009special:= (privs mod 32) div 16;
  1330. X`124`009`009monster:= (privs mod 64) div 32;
  1331. X`124`009`009exp:= (privs mod 128) div 64;
  1332. X`124
  1333. X`124`009`009done:= false;
  1334. X`124`009  `009repeat
  1335. X`124`009`009`009repeat
  1336. X`124`009`009`009`009grab_line(prompt,s,eof_handler := leave);
  1337. X`124`009`009`009`009s := slead(s);
  1338. X`124`009`009`009until length(s) > 0;
  1339. X`124`009`009`009s := lowcase(s);
  1340. X`124`009`009`009cmd := s`0911`093;
  1341. X`124
  1342. X`124`009`009`009case cmd of
  1343. X`124`009`009`009'h','?': begin      `032
  1344. X`124`009`009`009`009`009writeln ('C - Experience privilege');
  1345. X`124`009`009`009`009`009writeln ('D - Monster privilege');
  1346. X`124`009`009`009`009`009writeln ('E - Exit');
  1347. X`124`009`009`009`009`009writeln ('H - Help (this list)');
  1348. X`124`009`009`009`009`009if userid = MM_userid then
  1349. X`124`009`009`009`009`009`009writeln ('M - Manager rights');
  1350. X`124`009`009`009`009`009writeln ('O - Object privilege');
  1351. X`124`009`009`009`009`009writeln ('P - Poof privilege');
  1352. X`124`009`009`009`009`009writeln ('Q - Quit (do not save changes)');
  1353. X`124`009`009`009`009`009writeln ('R - Room privilege');
  1354. X`124`009`009`009`009`009writeln ('S - Special object privilege');
  1355. X`124`009`009`009`009`009writeln ('V - View current privileges');
  1356. X`124`009`009`009`009`009writeln ('? - This list');`032
  1357. X`124`009`009`009`009end;
  1358. X`124`009`009`009    'v': begin
  1359. X`124`009`009`009`009`009writeln ('Current privileges:');
  1360. X`124`009`009`009`009`009privs := system+ 2*poof+ 4*room+ 8*object+ 16*specia
  1361. Vl+ 32*monster+ 64*exp;
  1362. X`124`009`009`009`009`009list_privileges (privs); end;
  1363. X`124`009`009`009    'm': `009if userid <> MM_userid then
  1364. X`124`009`009`009`009`009`009writeln ('Only the Monster Manager can grant man
  1365. Vager rights.')
  1366. X`124`009`009`009`009else `009if system=1 then begin
  1367. X`124`009`009`009`009`009`009if n=mylog then
  1368. X`124`009`009`009`009`009`009`009writeln('You cannot remove your own manager
  1369. V rights.')
  1370. X`124`009`009`009`009`009`009else begin
  1371. X`124`009`009`009`009`009`009`009system:=0;
  1372. X`124`009`009`009`009`009`009`009writeln ('User has lost manager rights.');
  1373. X`124`009`009`009`009`009`009end;
  1374. X`124`009`009`009`009     `009end  else begin
  1375. X`124`009`009`009`009     `009`009system:=1;
  1376. X`124`009`009`009`009      `009    `009writeln ('User now has manager rights.
  1377. V');
  1378. X`124`009`009`009`009     `009end;
  1379. X`124`009`009`009    'p':`009if poof=1 then begin
  1380. X`124`009`009`009`009`009`009poof:=0;
  1381. X`124`009`009`009`009`009`009writeln ('User has lost poof privilege.');
  1382. X`124`009`009`009`009`009end else begin
  1383. X`124`009`009`009`009`009`009poof:=1;
  1384. X`124`009`009`009`009    `009`009writeln ('User now has poof privilege.');
  1385. X`124`009`009`009     `009`009end;                              `032
  1386. X`124`009`009`009    'r':`009if room=1 then begin
  1387. X`124`009`009`009`009`009`009room:=0;
  1388. X`124`009`009`009`009`009`009writeln ('User has lost room privilege.');
  1389. X`124`009`009`009`009`009end else begin
  1390. X`124`009`009`009`009`009`009room:=1;
  1391. X`124`009`009`009`009    `009`009writeln ('User now has room privilege.');
  1392. X`124`009`009`009`009     `009end;
  1393. X`124`009`009`009    'o':`009if object=1 then begin
  1394. X`124`009`009`009`009`009`009object:=0;
  1395. X`124`009`009`009`009`009`009writeln ('User has lost object privilege.');
  1396. X`124`009`009`009`009`009end else begin
  1397. X`124`009`009`009`009`009`009object:=1;
  1398. X`124`009`009`009`009    `009`009writeln ('User now has object privilege.');
  1399. X`124`009`009`009     `009`009end;
  1400. X`124`009`009`009    's':`009if special=1 then begin
  1401. X`124`009`009`009`009`009`009special:=0;
  1402. X`124`009`009`009`009`009`009writeln ('User has lost special privilege.');
  1403. X`124`009`009`009`009`009end else begin
  1404. X`124`009`009`009`009`009`009special:=1;
  1405. X`124`009`009`009`009    `009`009writeln ('User now has special privilege.');
  1406. X`124`009`009`009`009     `009end;
  1407. X`124`009`009`009    'd':`009if monster=1 then begin
  1408. X`124`009`009`009`009`009`009monster:=0;
  1409. X`124`009`009`009`009`009`009writeln ('User has lost monster privilege');
  1410. X`124`009`009`009`009`009end else begin
  1411. X`124`009`009`009`009`009`009monster:=1;
  1412. X`124`009`009`009`009    `009`009writeln ('User now has monster privilege.');
  1413. X`124`009`009`009`009     `009end;
  1414. X`124`009`009`009    'c':`009if exp=1 then begin
  1415. X`124`009`009`009`009`009`009exp:=0;
  1416. X`124`009`009`009`009`009`009writeln ('User has lost experience privilege.');
  1417. X`124`009`009`009`009`009end else begin
  1418. X`124`009`009`009`009`009`009exp:=1;
  1419. X`124`009`009`009`009    `009`009writeln ('User now has experience privilege.
  1420. V');
  1421. X`124`009`009`009`009     `009end;
  1422. X`124`009`009`009'q': begin
  1423. X`124`009`009`009`009`009writeln ('Database not updated');
  1424. X`124`009`009`009`009`009done := true;
  1425. X`124`009`009`009`009`009end;
  1426. X`124`009`009`009'e': begin
  1427. X`124`009`009 `009`009`009privs := system+ 2*poof+ 4*room+ 8*object+ 16*speci
  1428. Val+ 32*monster+ 64*exp;
  1429. X`124`009`009`009`009`009getint (N_PRIVILEGES);
  1430. X`124`009`009`009`009`009anint.int `091n`093:= privs;
  1431. X`124`009`009`009`009`009putint;
  1432. X`124`009`009`009`009`009writeln ('Database updated.');
  1433. X`124`009`009`009`009`009done := true;
  1434. X`124`009`009`009`009`009end;
  1435. X`124`009`009`009otherwise writeln('-- bad command, type ? for a list.');
  1436. X`124`009`009`009end;
  1437. X`124`009`009until done;
  1438. X*)
  1439. X
  1440. X`009end else if (pname = '*') or (pname = 'all') then begin
  1441. X
  1442. X`009`009getindex(I_PLAYER);`009`123 Rec of valid player log records  `125
  1443. X`009`009freeindex;`009`009`123 False if a valid player log `125
  1444. X
  1445. X`009`009getuser;`009`009`123 Corresponding userids of players `125
  1446. X`009`009freeuser;
  1447. X
  1448. X`009`009getpers;`009`009`123 Personal names of players `125
  1449. X`009`009freepers;
  1450. X
  1451. X`009`009getint (N_PRIVILEGES);`009`123 Privileges `125
  1452. X`009`009freeint;
  1453. X
  1454. X`009`009for i := 1 to maxplayers do begin
  1455. X`009`009`009if not(indx.free`091i`093) then begin
  1456. X`009`009`009`009write (user.idents`091i`093);
  1457. X`009`009`009`009for j := length(user.idents`091i`093) to 16 do
  1458. X`009`009`009`009`009write (' ');
  1459. X`009`009`009`009write(pers.idents`091i`093);
  1460. X`009`009`009`009for j := length(pers.idents`091i`093) to 21 do
  1461. X`009`009`009`009`009write (' ');
  1462. X`009`009`009`009list_privileges (anint.int `091i`093);
  1463. X`009`009`009end;
  1464. X`009`009end;
  1465. X`009end else
  1466. X`009`009writeln('No such player.');
  1467. X    exit_label:
  1468. Xend;
  1469. X
  1470. X
  1471. X
  1472. X`123 *************** FIX_STUFF ******************** `125
  1473. X
  1474. +-+-+-+-+-+-+-+-  END  OF PART 18 +-+-+-+-+-+-+-+-
  1475.