home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part22 < 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 22/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.064856.11108@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 06:48:56 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1453
  12.  
  13. Archieve-name: monster_helsinki_104/part22
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 22/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 22 -+-+-+-+-+-+-+-+
  20. X`009for i := 1 to maxplayers do
  21. X`009`009if anint.int`091i`093 = loc then
  22. X`009`009`009anint.int`091i`093 := 1;
  23. X`009putint;
  24. Xend;
  25. X
  26. X
  27. Xprocedure do_zap(s: string);
  28. Xlabel exit_label;
  29. Xvar
  30. X`009loc: integer;
  31. X
  32. X    procedure leave;
  33. X    begin
  34. X`009writeln('EXIT - no changes.');
  35. X`009goto exit_label;
  36. X    end;
  37. X
  38. Xbegin
  39. X`009if s = '' then grab_line('Room? ',s,eof_handler := leave);
  40. X
  41. X`009gethere;
  42. X`009if checkhide then begin
  43. X`009if lookup_room(loc,s,true) then begin
  44. X`009`009gethere(loc);
  45. X`009`009if (here.owner = userid) or (owner_priv) then begin `123 minor chang
  46. Ve by leino@finuha `125
  47. X`009`009`009clear_people(loc);
  48. X`009`009`009if find_numpeople = 0 then begin
  49. X`009`009`009`009if find_numexits = 0 then begin
  50. X`009`009`009`009`009if find_numobjs = 0 then begin
  51. X`009`009`009`009`009`009del_room(loc);
  52. X`009`009`009`009`009`009writeln('Room deleted.');
  53. X`009`009`009`009`009end else
  54. X`009`009`009`009`009`009writeln('You must remove all of the objects from tha
  55. Vt room first.');
  56. X`009`009`009`009end else
  57. X`009`009`009`009`009writeln('You must delete all of the exits from that room
  58. V first.');
  59. X`009`009`009end else
  60. X`009`009`009`009writeln('Sorry, you cannot destroy a room if people are stil
  61. Vl in it.');
  62. X`009`009end else
  63. X`009`009`009writeln('You are not the owner of that room.');
  64. X`009end else
  65. X`009`009writeln('There is no room named ',s,'.');
  66. X`009end;
  67. X    exit_label:
  68. Xend;
  69. X
  70. X`123 custom_room moved to module CUSTOM `125
  71. X
  72. X
  73. X`123 procedure do_custom moved to module CUSTOM `125
  74. X
  75. Xprocedure reveal_people(var three: boolean);
  76. Xvar
  77. X`009retry,i: integer;
  78. X
  79. Xbegin
  80. X`009if debug then
  81. X`009`009writeln('%revealing people');
  82. X`009three := false;
  83. X`009retry := 1;
  84. X
  85. X`009repeat
  86. X`009`009retry := retry + 1;
  87. X`009`009i := (rnd100 mod maxpeople) + 1;
  88. X`009`009if (here.people`091i`093.hiding > 0) and
  89. X`009`009`009`009(i <> myslot) then begin
  90. X`009`009`009three := true;
  91. X`009`009`009writeln('You''ve found ',here.people`091i`093.name,' hiding in t
  92. Vhe shadows!');
  93. X`009`009`009log_event(myslot,E_FOUNDYOU,i,0);
  94. X`009`009end;
  95. X`009until (retry > 7) or three;
  96. Xend;
  97. X
  98. X
  99. X
  100. Xprocedure reveal_objects(var two: boolean);
  101. Xvar
  102. X`009tmp: string;
  103. X`009i: integer;
  104. X`009modified: boolean;
  105. X
  106. Xbegin
  107. X    if debug then
  108. X`009writeln('%revealing objects');
  109. X    two := false;
  110. X    modified := false;
  111. X    getroom;
  112. X    for i := 1 to maxobjs do begin
  113. X`009if here.objs`091i`093 <> 0 then`009`123 if there is an object here `125
  114. X`009    if (here.objhide`091i`093 <> 0) then begin
  115. X`009`009two := true;
  116. X
  117. X`009`009if here.objhide`091i`093 = DEFAULT_LINE then`032
  118. X`009`009    writeln('You''ve found ',obj_part(here.objs`091i`093),'.')
  119. X`009`009else begin
  120. X`009`009    print_desc(here.objhide`091i`093);
  121. X`009`009    delete_block(here.objhide`091i`093);
  122. X`009`009end;
  123. X`009`009here.objhide`091i`093 := 0; `123 mark them unhidden `125
  124. X`009`009`123 delete_block make this also - but writeln not ! `125
  125. X`009`009modified := true;   `123 mark: must write to database `125
  126. X`009    end;
  127. X    end;
  128. X    if modified then putroom else freeroom;
  129. Xend;
  130. X
  131. X
  132. Xprocedure reveal_exits(var one: boolean);
  133. Xvar
  134. X`009retry,i: integer;
  135. X
  136. Xbegin
  137. X`009if debug then
  138. X`009`009writeln('%revealing exits');
  139. X`009one := false;
  140. X`009retry := 1;
  141. X
  142. X`009repeat
  143. X`009`009retry := retry + 1;
  144. X`009`009i := (rnd100 mod maxexit) + 1;  `123 a random exit `125
  145. X`009`009if (here.exits`091i`093.hidden <> 0) and (not found_exit`091i`093) t
  146. Vhen begin
  147. X`009`009`009one := true;
  148. X`009`009`009found_exit`091i`093 := true;`009`123 mark exit as found `125
  149. X
  150. X`009`009`009if here.exits`091i`093.hidden = DEFAULT_LINE then begin
  151. X`009`009`009`009if here.exits`091i`093.alias = '' then
  152. X`009`009`009`009`009writeln('You''ve found a hidden exit: ',direct`091i`093,
  153. V'.')
  154. X`009`009`009`009else
  155. X`009`009`009`009`009writeln('You''ve found a hidden exit: ',here.exits`091i`
  156. V093.alias,'.');
  157. X`009`009`009end else
  158. X`009`009`009`009print_desc(here.exits`091i`093.hidden);
  159. X`009`009end;
  160. X`009until (retry > 4) or (one);
  161. Xend;
  162. X
  163. X
  164. Xprocedure do_search(s: string);
  165. Xvar
  166. X`009chance: integer;
  167. X`009found,dummy: boolean;
  168. X
  169. Xbegin
  170. X`009if checkhide then begin
  171. X`009`009chance := rnd100;
  172. X`009`009found := false;
  173. X`009`009dummy := false;
  174. X
  175. X`009`009if chance in `0911..20`093 then
  176. X`009`009`009reveal_objects(found)
  177. X`009`009else if chance in `09121..40`093 then
  178. X`009`009`009reveal_exits(found)
  179. X`009`009else if chance in `09141..60`093 then
  180. X`009`009`009reveal_people(dummy);
  181. X
  182. X`009`009if found then begin
  183. X`009`009`009log_event(myslot,E_FOUND,0,0);
  184. X`009`009end else if not(dummy) then begin
  185. X`009`009`009log_event(myslot,E_SEARCH,0,0);
  186. X`009`009`009writeln('You haven''t found anything.');
  187. X`009`009end;
  188. X`009end;
  189. Xend;
  190. X
  191. Xprocedure do_unhide(s: string);
  192. X
  193. Xbegin
  194. X`009if s = '' then begin
  195. X`009`009if hiding then begin
  196. X`009`009`009hiding := false;
  197. X`009`009`009log_event(myslot,E_UNHIDE,0,0);
  198. X`009`009`009getroom;
  199. X`009`009`009here.people`091myslot`093.hiding := 0;
  200. X`009`009`009putroom;
  201. X`009`009`009writeln('You are no longer hiding.');
  202. X`009`009end else
  203. X`009`009`009writeln('You were not hiding.');
  204. X`009end;
  205. Xend;
  206. X
  207. X
  208. Xprocedure do_hide(s: string);
  209. Xlabel 0; `123 for panic `125
  210. Xvar
  211. X`009slot,n,oldloc: integer;
  212. X`009founddsc: integer;
  213. X`009tmp: string;
  214. X
  215. X    function action(s: shortstring; n: integer): boolean;
  216. X    begin
  217. X`009if obj_here(n) then begin
  218. X`009    writeln('Enter the description the player will see when the ',s,' is
  219. V found:');
  220. X`009    writeln('(if no description is given a default will be supplied)');
  221. X`009    writeln;
  222. X`009    writeln('`091 Editing the "object found" description `093');
  223. X
  224. X`009    founddsc := 0;
  225. X`009    if edit_desc(founddsc) then ;
  226. X`009    if founddsc = 0 then
  227. X`009`009founddsc := DEFAULT_LINE;
  228. X  `032
  229. X`009    if oldloc <> location then begin
  230. X`009`009delete_block(founddsc);
  231. X`009`009goto 0; `123 panic `125
  232. X`009    end;
  233. X
  234. X`009    getroom;
  235. X`009    slot := find_obj(n);
  236. X`009    here.objhide`091slot`093 := founddsc;
  237. X`009    putroom;
  238. X
  239. X`009    tmp := obj_part(n);
  240. X`009    log_event(myslot,E_HIDOBJ,0,0,tmp);
  241. X`009    writeln('You have hidden ',tmp,'.');
  242. X`009    action := true;
  243. X`009end else if obj_hold(n) then begin
  244. X`009    writeln('You''ll have to put ',s,' down before it can be hidden.');
  245. X`009    action := true;
  246. X`009end else action := false;
  247. X`009checkevents(TRUE);
  248. X`009if oldloc <> location then goto 0; `123 panic `125
  249. X    end; `123 action `125
  250. X
  251. X    function restriction (n: integer): boolean;
  252. X`009begin
  253. X`009    restriction := obj_here(n,false) or obj_hold(n);
  254. X`009    `123 false = found also hidden objects `125
  255. X`009end;
  256. X
  257. Xbegin
  258. X`009gethere;
  259. X`009if s = '' then begin`009`123 hide yourself `125
  260. X
  261. X`009`009`009`123 don't let them hide (or hide better) if people
  262. X`009`009`009  that they can see are in the room.  Note that the
  263. X`009`009`009  use of n_can_see instead of find_numpeople will
  264. X`009`009`009  let them hide if other people are hidden in the
  265. X`009`009`009  room that they have not seen.  The previously hidden
  266. X`009`009`009  people will see them hide `125
  267. X
  268. X`009`009if n_can_see > 0 then begin
  269. X`009`009`009if hiding then
  270. X`009`009`009`009writeln('You can''t hide any better with people in the room.
  271. V')
  272. X`009`009`009else
  273. X`009`009`009`009writeln('You can''t hide when people are watching you.');
  274. X`009`009end else if (rnd100 > 25) then begin
  275. X`009`009`009if here.people`091myslot`093.hiding >= 4 then
  276. X`009`009`009`009writeln('You''re pretty well hidden now.  I don''t think you
  277. V could be any less visible.')
  278. X`009`009`009else begin
  279. X`009`009`009`009getroom;
  280. X`009`009`009`009here.people`091myslot`093.hiding :=`032
  281. X`009`009`009`009`009`009here.people`091myslot`093.hiding + 1;
  282. X`009`009`009`009putroom;
  283. X`009`009`009`009if hiding then begin
  284. X`009`009`009`009`009log_event(myslot,E_NOISES,rnd100,0);
  285. X`009`009`009`009`009writeln('You''ve managed to hide yourself a little bette
  286. Vr.');
  287. X`009`009`009`009end else begin
  288. X`009`009`009`009`009log_event(myslot,E_IHID,0,0);
  289. X`009`009`009`009`009writeln('You''ve hidden yourself from view.');
  290. X`009`009`009`009`009hiding := true;
  291. X`009`009`009`009end;
  292. X`009`009`009end;
  293. X`009`009end else begin `123 unsuccessful `125
  294. X`009`009`009if hiding then
  295. X`009`009`009`009writeln('You could not find a better hiding place.')
  296. X`009`009`009else
  297. X`009`009`009`009writeln('You could not find a good hiding place.');
  298. X`009`009end;
  299. X`009end else begin`009`123 Hide an object `125
  300. X`009`009oldloc := location;
  301. X`009`009if scan_obj(action,s,,restriction) then begin
  302. X`009`009end else
  303. X`009`009`009writeln('I see no such object here.');
  304. X`009end;
  305. X`0090:  `123 for panic `125
  306. Xend;
  307. X
  308. X
  309. Xprocedure do_punch(s: string);
  310. Xlabel exit_label;
  311. Xvar
  312. X`009sock,n: integer;
  313. X
  314. X    procedure leave;
  315. X    begin
  316. X`009writeln('EXIT - no changes.');
  317. X`009goto exit_label;
  318. X    end;
  319. X
  320. X
  321. Xbegin
  322. X`009if s = '' then grab_line('Victim? ',s,eof_handler := leave);
  323. X
  324. X`009if not read_global_flag(GF_WARTIME) then
  325. X`009    writeln('Don''t you dare disturb the Pax Monstruosa!')
  326. X`009else if s <> '' then begin
  327. X`009`009if parse_pers(n,s) then begin
  328. X`009  `009`009if n = myslot then
  329. X`009`009`009`009writeln('Self-abuse will not be tolerated in the Monster uni
  330. Vverse.')
  331. X`009`009`009else if protected(n) then begin
  332. X`009`009`009`009log_event(myslot,E_TRYPUNCH,n,0);
  333. X`009`009`009`009writeln('A mystic shield of force prevents you from attackin
  334. Vg.');
  335. X`009`009`009end else if (here.people`091n`093.experience >= protect_exp) `12
  336. V3 and protected_MM `125 then begin
  337. X`009`009`009`009log_event(myslot,E_TRYPUNCH,n,0);
  338. X`009`009`009`009writeln('You can''t punch that person.');
  339. X`009  `009`009end else begin
  340. X`009`009`009`009if hiding then begin
  341. X`009`009`009`009`009hiding := false;
  342. X
  343. X`009  `009`009`009`009getroom;
  344. X`009`009`009`009`009here.people`091myslot`093.hiding := 0;
  345. X`009`009`009`009`009putroom;
  346. X                                `032
  347. X`009`009`009`009`009log_event(myslot,E_HIDEPUNCH,n,0);
  348. X`009  `009`009`009`009writeln('You pounce unexpectedly on ',here.people`091n
  349. V`093.name,'!');
  350. X                                        if here.people`091n`093.kind = P_MON
  351. VSTER then attack_monster(n,2);
  352. X`009`009`009`009end else begin
  353. X`009`009`009`009`009if myexperience < (rnd100 div 3) then
  354. X                                          sock := (rnd100 mod numpunches)+1
  355. X                                        else sock := BAD_PUNCH;
  356. X
  357. X`009`009`009`009`009log_event(myslot,E_PUNCH,n,sock);
  358. X`009`009`009`009`009put_punch(sock,here.people`091n`093.name);
  359. X                                        if here.people`091n`093.kind = P_MON
  360. VSTER then attack_monster(n,punch_force(sock));
  361. X`009  `009`009`009end;
  362. X`009`009`009`009wait(1+random*3);`009`123 Ha ha ha `125
  363. X`009`009`009end;
  364. X`009`009end else
  365. X`009`009`009writeln('That person cannot be seen in this room.');
  366. X`009end else
  367. X`009`009writeln('To punch somebody, type PUNCH <personal name>.');
  368. X    exit_label:
  369. Xend;
  370. X
  371. X`123 procedure do_program moved to module CUSTOM `125
  372. X
  373. X`123 returns TRUE if anything was actually dropped `125
  374. Xfunction drop_everything;
  375. X`123 forward function drop_everything(pslot: integer := 0): boolean; `125
  376. Xvar
  377. X`009i: integer;
  378. X`009slot: integer;
  379. X`009didone: boolean;
  380. X`009theobj: integer;
  381. X`009tmp: string;
  382. X
  383. Xbegin
  384. X`009if pslot = 0 then
  385. X`009`009pslot := myslot;
  386. X
  387. X`009gethere;
  388. X`009didone := false;
  389. X
  390. X`009mywield := 0;
  391. X`009mywear := 0;
  392. X`009mydisguise := 0;
  393. X
  394. X`009for i := 1 to maxhold do begin
  395. X`009`009if here.people`091pslot`093.holding`091i`093 <> 0 then begin
  396. X`009`009`009didone := true;
  397. X`009`009`009theobj := here.people`091pslot`093.holding`091i`093;
  398. X`009`009`009slot := i;
  399. X`009`009`009if place_obj(theobj,TRUE) then begin
  400. X`009`009`009   `032
  401. X`009`009`009    drop_obj(slot,pslot);
  402. X`009`009`009   `032
  403. X`009`009`009    getobj(theobj);
  404. X`009`009`009    freeobj;
  405. X
  406. X`009`009`009    if obj.actindx > 0 then begin
  407. X`009`009`009`009run_monster('',obj.actindx,'drop you','','',
  408. X`009`009`009`009    sysdate+' '+systime);
  409. X
  410. X`009`009`009`009gethere;`009`123 necessary after run_monster `125
  411. X`009`009`009    end;
  412. X
  413. X`009`009`009end else begin`009`123 no place to put it, it's lost .... `125
  414. X`009`009`009`009getobj(theobj);
  415. X`009`009`009`009obj.numexist := obj.numexist - 1;
  416. X`009`009`009`009putobj;
  417. X`009`009`009`009tmp := obj.oname;
  418. X`009`009`009`009writeln('The ',tmp,' was lost.');
  419. X`009`009`009end;
  420. X`009`009end;
  421. X`009end;
  422. X
  423. X`009drop_everything := didone;
  424. Xend;
  425. X
  426. Xprocedure do_endplay(lognum: integer;ping:boolean := FALSE);
  427. X
  428. X`123 If update is true do_endplay will update the "last play" date & time
  429. X  we don't want to do this if this endplay is called from a ping `125
  430. X
  431. Xbegin
  432. X`009if not(ping) then begin
  433. X`009`009`009`123 Set the "last date & time of play" `125
  434. X`009`009getdate;
  435. X`009`009adate.idents`091lognum`093 := sysdate + ' ' + systime;
  436. X`009`009putdate;
  437. X`009end;
  438. X
  439. X
  440. X`009`123 Put the player to sleep.  Don't delete his information,
  441. X`009  so it can be restored the next time they play. `125
  442. X
  443. X`009getindex(I_ASLEEP);
  444. X`009indx.free`091lognum`093 := true;`009`123 Yes, I'm asleep `125
  445. X`009putindex;
  446. Xend;
  447. X
  448. X
  449. Xfunction check_person(n: integer;id: string):boolean;
  450. X
  451. Xbegin
  452. X`009inmem := false;
  453. X`009gethere;
  454. X`009if here.people`091n`093.username = id then
  455. X`009`009check_person := true
  456. X`009else
  457. X`009`009check_person := false;
  458. Xend;
  459. X
  460. X
  461. Xfunction nuke_person(n: integer;id: string): boolean;
  462. Xvar
  463. X`009lognum: integer;
  464. X`009tmp: string;
  465. X
  466. Xbegin
  467. X`009getroom;
  468. X`009if here.people`091n`093.username = id then begin
  469. X
  470. X`009`009`009`123 drop everything they're carrying `125
  471. X`009`009drop_everything(n);
  472. X
  473. X`009`009tmp := here.people`091n`093.username;
  474. X`009`009`009`123 we'll need this for do_endplay `125
  475. X
  476. X`009`009`009`123 Remove the person from the room `125
  477. X`009`009here.people`091n`093.kind := 0;
  478. X`009`009here.people`091n`093.username := '';
  479. X`009`009here.people`091n`093.name := '';
  480. X`009`009putroom;
  481. X
  482. X`009`009`009`123 update the log entries for them `125
  483. X`009`009`009`123 but first we have to find their log number
  484. X`009`009`009  (mylog for them).  We can do this with a lookup_user
  485. X`009`009`009  give the userid we got above `125
  486. X
  487. X`009`009if lookup_user(lognum,tmp) then begin
  488. X`009`009`009do_endplay(lognum,TRUE);
  489. X`009`009`009`009`123 TRUE tells do_endplay not to update the
  490. X`009`009`009`009  "time of last play" information 'cause we
  491. X`009`009`009`009  don't know how long the "zombie" has been
  492. X`009`009`009`009  there. `125
  493. X`009`009end else
  494. X`009`009`009writeln('%error in nuke_person; can''t fing their log number; no
  495. Vtify the Monster Manager');
  496. X
  497. X`009`009nuke_person := true;
  498. X`009end else begin
  499. X`009`009freeroom;
  500. X`009`009nuke_person := false;
  501. X`009end;
  502. Xend;
  503. X
  504. X
  505. Xfunction ping_player(n:integer;silent: boolean := false): boolean;
  506. Xvar
  507. X`009retry: integer;
  508. X`009id: string;
  509. X`009idname: string;
  510. X        kind: integer;
  511. X
  512. Xbegin
  513. X`009ping_player := false;
  514. X
  515. X`009id := here.people`091n`093.username;
  516. X`009idname := here.people`091n`093.name;
  517. X        kind := here.people`091n`093.kind;
  518. X
  519. X`009if kind = P_PLAYER then begin
  520. X`009`009retry := 0;
  521. X`009`009ping_answered := false;
  522. X
  523. X`009`009repeat
  524. X`009`009`009retry := retry + 1;
  525. X`009`009`009if not(silent) then
  526. X`009    `009`009`009writeln('Sending ping # ',retry:1,' to ',idname,' . . .'
  527. V);
  528. X       `032
  529. X`009`009`009log_event(myslot,E_PING,n,0,myname);
  530. X`009`009`009`123 leaving here myname, not replace it with log_name `125
  531. X
  532. X`009`009`009wait(1);
  533. X`009`009`009checkevents(TRUE);
  534. X`009`009`009`009`123 TRUE = don't reprint prompt `125
  535. X
  536. X`009`009`009if not(ping_answered) then
  537. X`009`009`009`009if check_person(n,id) then begin
  538. X`009`009`009`009`009wait(1);
  539. X`009`009`009`009`009checkevents(TRUE);
  540. X`009`009`009`009end else
  541. X`009`009`009`009`009ping_answered := true;
  542. X
  543. X`009`009`009if not(ping_answered) then
  544. X`009`009`009`009if check_person(n,id) then begin
  545. X`009`009`009`009`009wait(1);
  546. X`009`009`009`009`009checkevents(TRUE);
  547. X`009`009`009`009end else
  548. X`009`009`009`009`009ping_answered := true;
  549. X
  550. X`009`009until (retry >= MAX_PING) or ping_answered;
  551. X
  552. X`009`009if not(ping_answered) then begin
  553. X`009`009`009if not(silent) then
  554. X
  555. X`009`009`009`009writeln('That person is not responding to your pings . . .')
  556. V;
  557. X        `032
  558. X`009`009`009if nuke_person(n,id) then begin
  559. X`009`009`009`009ping_player := true;
  560. X`009`009`009`009if not(silent) then
  561. X`009`009`009`009`009writeln(idname,' shimmers and vanishes from sight.');
  562. X`009`009`009`009log_event(myslot,E_PINGONE,n,0,idname);
  563. X`009`009`009end else
  564. X`009`009`009`009if not(silent) then
  565. X`009`009`009`009`009writeln('That person is not a zombie after all.');
  566. X`009`009end else
  567. X`009`009`009if not(silent) then
  568. X`009`009`009`009writeln('That person is alive and well.');
  569. X`009end else if not(silent) then
  570. X`009`009writeln ('This isn''t player. You can only ping player.')
  571. Xend;
  572. X
  573. X
  574. Xprocedure do_ping(s: string);
  575. Xlabel exit_label;
  576. Xvar
  577. X`009n: integer;
  578. X`009dummy: boolean;
  579. X
  580. X    procedure leave;
  581. X    begin
  582. X`009writeln('EXIT - no changes.');
  583. X`009goto exit_label;
  584. X    end;
  585. X
  586. X
  587. Xbegin
  588. X`009if s = '' then grab_line('Player? ',s,eof_handler := leave);
  589. X
  590. X`009if s <> '' then begin
  591. X`009`009if parse_pers(n,s) then begin
  592. X`009`009`009if n = myslot then
  593. X`009`009`009`009writeln('Don''t ping yourself.')
  594. X`009`009`009else dummy := ping_player(n);
  595. X`009`009end else
  596. X`009`009`009writeln('You see no person here by that name.');
  597. X`009end else
  598. X`009`009writeln('To see if someone is really alive, type PING <personal name
  599. V>.');
  600. X    exit_label:
  601. Xend;
  602. X
  603. Xprocedure list_get;
  604. Xvar
  605. X`009first: boolean;
  606. X`009i: integer;
  607. X
  608. Xbegin
  609. X`009first := true;
  610. X`009for i := 1 to maxobjs do begin
  611. X`009`009if (here.objs`091i`093 <> 0) and
  612. X`009`009   (here.objhide`091i`093 = 0) then begin
  613. X`009`009`009if first then begin
  614. X`009`009`009`009writeln('Objects that you see here:');
  615. X`009`009`009`009first := false;
  616. X`009`009`009end;
  617. X`009`009`009writeln('   ',obj_part(here.objs`091i`093));
  618. X`009`009end;
  619. X`009end;
  620. X`009if first then
  621. X`009`009writeln('There is nothing you see here that you can get.');
  622. Xend;
  623. X
  624. X
  625. X
  626. X`123 print the get success message for object number n `125
  627. X
  628. Xprocedure p_getsucc(n: integer);
  629. X
  630. Xbegin
  631. X`009`123 we assume getobj has already been done `125
  632. X`009if (obj.getsuccess = 0) or (obj.getsuccess = DEFAULT_LINE) then
  633. X`009`009writeln('Taken ',obj_part(n,FALSE),'.')
  634. X`009else
  635. X`009`009print_desc(obj.getsuccess);
  636. Xend;
  637. X
  638. X
  639. Xprocedure do_meta_get(n: integer);
  640. Xvar
  641. X`009slot: integer;
  642. X
  643. Xbegin
  644. X`009if obj_here(n) then begin
  645. X`009`009if can_hold then begin
  646. X`009`009`009slot := find_obj(n);
  647. X`009`009`009if take_obj(n,slot) then begin
  648. X`009`009`009`009hold_obj(n);
  649. X`009`009`009`009log_event(myslot,E_GET,0,0,
  650. X`123 >>> `125`009`009log_name + ' has picked up ' + obj_part(n) + '.');
  651. X`009`009`009`009p_getsucc(n);
  652. X`009`009`009end else
  653. X`009`009`009`009writeln('Someone got to it before you did.');
  654. X`009`009end else
  655. X`009`009`009writeln('Your hands are full.  You''ll have to drop something yo
  656. Vu''re carrying first.');
  657. X`009end else if obj_hold(n) then
  658. X`009`009writeln('You''re already holding that item.')
  659. X`009else
  660. X`009`009writeln('That item isn''t in an obvious place.');
  661. Xend;     `032
  662. X
  663. X
  664. Xprocedure do_get(s: string);
  665. Xlabel 0;    `123 for panic `125
  666. Xvar
  667. X`009n,oldloc: integer;
  668. X`009ok: boolean;                                     `032
  669. X
  670. X`009procedure trapget;
  671. X`009begin
  672. X        `009log_event(myslot,E_TRAP,,obj.d1,obj.oname);
  673. X`009`009if (obj.getfail=0) or (obj.getfail=DEFAULT_LINE) then
  674. X`009`009`009writeln('You try get ',obj.oname,' but it bites you.')
  675. X`009  `009else print_desc(obj.getfail);
  676. X`009`009take_hit(obj.ap);
  677. X`009end;
  678. X
  679. X    function action(s: shortstring; n: integer): boolean;
  680. X    begin
  681. X`009if obj_here(n) then begin
  682. X`009    getobj(n);
  683. X`009    freeobj;
  684. X`009    ok := true;
  685. X
  686. X`009    if obj.sticky then begin
  687. X`009`009ok := false;  `032
  688. X`009`009if obj.kind = O_TRAP then trapget
  689. X`009`009else begin
  690. X`009`009    log_event(myslot,E_FAILGET,n,0);
  691. X`009`009    if (obj.getfail = 0) or (obj.getfail = DEFAULT_LINE) then
  692. X`009`009`009writeln('You can''t take ',obj_part(n,FALSE),'.')
  693. X`009`009    else
  694. X`009`009`009print_desc(obj.getfail);
  695. X`009`009end;
  696. X`009`009if obj.actindx > 0 then
  697. X`009`009    run_monster('',obj.actindx,
  698. X`009`009`009'get fail','','',
  699. X`009`009`009sysdate+' '+systime);
  700. X`009    end else if obj.getobjreq > 0 then begin
  701. X`009`009if not(obj_hold(obj.getobjreq)) then begin
  702. X`009`009    ok := false;
  703. X`009`009    if obj.kind = O_TRAP then trapget
  704. X`009`009    else begin
  705. X`009`009`009log_event(myslot,E_FAILGET,n,0);
  706. X`009`009`009if (obj.getfail = 0) or (obj.getfail = DEFAULT_LINE) then
  707. X`009`009`009    writeln('You''ll need something first to get the ',obj_part(
  708. Vn,FALSE),'.')
  709. X`009`009`009else
  710. X`009`009`009    print_desc(obj.getfail);
  711. X`009`009    end;
  712. X`009`009    if obj.actindx > 0 then
  713. X`009`009`009run_monster('',obj.actindx,
  714. X`009`009`009    'get fail','','',
  715. X`009`009`009    sysdate+' '+systime);
  716. X`009`009    end;
  717. X`009    end;`009`123 obj sticky `125
  718. X
  719. X`009    if ok then begin
  720. X`009`009do_meta_get(n);`009`009`123 get the object `125
  721. X`009`009if obj.actindx > 0 then
  722. X`009`009    run_monster('',obj.actindx,
  723. X`009`009`009'get succeed','','',
  724. X`009`009    sysdate+' '+systime);
  725. X`009    end;
  726. X`009    action := true;
  727. X`009end `123 else if obj_hold(n) then begin
  728. X`009    writeln('You have already ',obj_part(n),'.');
  729. X`009    action := true;
  730. X`009end `125 else action := false;
  731. X`009checkevents(TRUE);
  732. X`009if oldloc <> location then goto 0; `123 panic `125
  733. X    end; `123 action `125
  734. X`009  `032
  735. X    function restriction (n: integer): boolean;
  736. X`009begin
  737. X`009    restriction := obj_here(n,true) or obj_hold(n);
  738. X`009    `123 true = not found hidden objects `125
  739. X`009end;
  740. X
  741. X    procedure leave;
  742. X    begin
  743. X`009writeln('EXIT - no changes.');
  744. X`009goto 0;
  745. X    end;
  746. X
  747. X
  748. X
  749. Xbegin
  750. X`009if s = '' then begin                             `032
  751. X`009`009list_get;
  752. X`009`009writeln;
  753. X`009`009grab_line('Object? ',s,eof_handler := leave);
  754. X`009end;
  755. X`009oldloc := location;
  756. X
  757. X`009if scan_obj(action,s,,restriction) then begin
  758. X`009    `123 functin action make all `125
  759. X`009end else if lookup_detail(n,s) then begin
  760. X`009`009`009writeln('That detail of this room is here for the enjoyment of a
  761. Vll Monster players,');
  762. X`009`009`009writeln('and may not be taken.');
  763. X`009end else
  764. X`009`009writeln('There is no object here by that name.');
  765. X`0090:  `123 panic `125
  766. Xend;
  767. X
  768. X
  769. Xprocedure do_drop(s: string);
  770. Xlabel`0090;  `123 for panic `125
  771. Xvar
  772. X`009slot,n,oldloc: integer;
  773. X
  774. X    function action(s: shortstring; n: integer): boolean;
  775. X    begin
  776. X`009if obj_hold(n) then begin
  777. X`009    getobj(n);
  778. X`009    freeobj;
  779. X`009    if obj.sticky then
  780. X`009`009writeln(obj_part(n),': You can''t drop sticky objects.')
  781. X`009    else if can_drop then begin
  782. X`009`009slot := find_hold(n);
  783. X`009`009if place_obj(n) then begin
  784. X`009`009    drop_obj(slot);
  785. X`009`009    log_event(myslot,E_DROP,0,n,
  786. X`009`009`009log_name + ' has dropped '+obj_part(n) + '.');
  787. X
  788. X`009`009    if mywield = n then x_unwield;
  789. X`009`009    if mywear = n then x_unwear;
  790. X`009`009    if obj.actindx > 0 then
  791. X`009`009`009run_monster('',obj.actindx,
  792. X`009`009`009    'drop succeed','','',
  793. X`009`009`009    sysdate+' '+systime);
  794. X
  795. X`009`009end else
  796. X`009`009    writeln('Someone took the spot where your were going to drop ',o
  797. Vbj_part(n),'.');
  798. X`009    end else
  799. X`009`009writeln('It is too cluttered here.  Find somewhere else to drop your
  800. V things.');
  801. X`009    action := true;
  802. X`009end else begin
  803. X`009    action := false;
  804. X`009end;
  805. X`009checkevents(TRUE);
  806. X`009if oldloc <> location then goto 0; `123 panic `125
  807. X    end; `123 action `125
  808. X
  809. X    function restriction (n: integer): boolean;
  810. X`009begin
  811. X`009`009restriction := obj_hold(n);
  812. X`009end;
  813. X
  814. X    procedure leave;
  815. X    begin
  816. X`009writeln('EXIT - no changes.');
  817. X`009goto 0;
  818. X    end;
  819. X
  820. X
  821. X
  822. Xbegin
  823. X    if s = '' then grab_line('Object? ',s,eof_handler := leave);
  824. X    oldloc := location;
  825. X    if s = '' then begin
  826. X`009writeln('To drop an object, type DROP <object name>.');
  827. X`009writeln('To see what you are carrying, type INV (inventory).');
  828. X    end else if scan_obj(action,s,,restriction) then begin
  829. X    end else
  830. X`009writeln('You''re not holding that item.  To see what you''re holding, ty
  831. Vpe INVENTORY.');
  832. X    0:`009`123 for panic `125
  833. Xend;
  834. X
  835. X
  836. Xprocedure do_inv(s: string);
  837. Xlabel 0; `123 for panic `125
  838. Xvar
  839. X`009first: boolean;
  840. X`009i,n: integer;
  841. X`009objnum,oldloc: integer;
  842. X
  843. X`009function restriction(slot: integer): boolean;
  844. X`009begin
  845. X`009    restriction := here.people`091slot`093.hiding = 0;
  846. X`009    `123 can't se people when he is hiding `125
  847. X`009end;
  848. X
  849. X`009function action(s: shortstring; n: integer): boolean;
  850. X`009begin
  851. X`009    first := true;
  852. X`009    log_event(myslot,E_LOOKYOU,n,0);
  853. X`009    for i := 1 to maxhold do begin
  854. X`009`009objnum := here.people`091n`093.holding`091i`093;
  855. X`009`009if objnum <> 0 then begin
  856. X`009`009    if first then begin
  857. X`009`009`009writeln(here.people`091n`093.name,' is holding:');
  858. X`009`009`009first := false;
  859. X`009`009    end;
  860. X`009`009    write('   ',obj_part(objnum));
  861. X`009`009    if objnum = here.people`091n`093.wielding then write(' wielded')
  862. V;
  863. X`009`009    if objnum = here.people`091n`093.wearing then write(' worn');
  864. X`009`009    writeln;
  865. X`009`009end;
  866. X`009    end;
  867. X`009    if first then
  868. X`009`009writeln(here.people`091n`093.name,' is empty handed.');
  869. X`009    action := true;
  870. X`009    checkevents(TRUE);
  871. X`009    if oldloc <> location then goto 0; `123 panic `125
  872. X`009end;
  873. X
  874. Xbegin
  875. X`009gethere;
  876. X`009oldloc := location;
  877. X`009if s = '' then begin
  878. X`009`009noisehide(50);
  879. X`009`009first := true;
  880. X`009`009log_event(myslot,E_INVENT,0,0);
  881. X`009`009for i := 1 to maxhold do begin
  882. X`009`009    objnum := here.people`091myslot`093.holding`091i`093;
  883. X`009`009    if objnum <> 0 then begin
  884. X`009`009`009if first then begin
  885. X`009`009`009    writeln('You are holding:');
  886. X`009`009`009    first := false;
  887. X`009`009`009end;
  888. X`009`009`009write('   ',obj_part(objnum));
  889. X`009`009`009if objnum = mywield then write(' wielded');
  890. X`009`009`009if objnum = mywear then write(' worn');
  891. X`009`009`009writeln;
  892. X`009`009    end;
  893. X`009`009end;
  894. X`009`009if first then
  895. X`009  `009`009writeln('You are empty handed.');
  896. X`009end else if scan_pers_slot(action,s,,restriction) then begin
  897. X`009end else
  898. X`009`009writeln('To see what someone else is carrying, type INV <personal na
  899. Vme>.');
  900. X`0090: `123 for panic `125
  901. Xend;
  902. X
  903. X
  904. X`123 translate a personal name into a real userid on request `125
  905. X
  906. Xprocedure do_whois(s: string);
  907. Xlabel exit_label;
  908. Xvar
  909. X`009n: integer;
  910. X
  911. X    function action(s: shortstring; n: integer): boolean;
  912. X    begin
  913. X`009if user.idents`091n`093 = '' then`032
  914. X`009    writeln (s,' no have userid.')
  915. X`009else if user.idents`091n`093`0911`093 = ':' then
  916. X`009    writeln(s,' isn''t player, it is a monster.')
  917. X`009else writeln(s,' is ',user.idents`091n`093,'.');
  918. X`009action := true;
  919. X    end; `123 action `125
  920. X
  921. X    function restriction (n: integer): boolean;
  922. X`009begin
  923. X`009`009restriction := true;
  924. X`009end;
  925. X
  926. X    procedure leave;
  927. X    begin
  928. X`009writeln('EXIT - no changes.');
  929. X`009goto exit_label;
  930. X    end;
  931. X
  932. Xbegin
  933. X`009if s = '' then grab_line('Player? ',s,eof_handler := leave);
  934. X
  935. X`009getuser;
  936. X`009freeuser;
  937. X
  938. X`009if scan_pers(action,s,,restriction) then begin
  939. X               `032
  940. X`009end else
  941. X`009`009writeln('There is no one playing with that personal name.');
  942. X    exit_label:
  943. Xend;
  944. X
  945. X
  946. Xprocedure do_players(param: string);
  947. Xlabel 1,2; `123 for quit `125
  948. Xvar
  949. X`009i,j: integer;
  950. X`009tmpasleep: indexrec;
  951. X`009where_they_are: intrec;
  952. X`009ok: boolean;
  953. X`009c : char;
  954. X`009code : integer;
  955. X`009count: integer;
  956. X`009s1: string;
  957. X`009str: shortstring;
  958. X`009type_monsters,type_players,write_this: boolean;
  959. X
  960. X    procedure leave;
  961. X    begin
  962. X`009writeln('EXIT');
  963. X`009goto 2;
  964. X    end;
  965. X
  966. Xvar short_line: boolean;
  967. X
  968. Xbegin
  969. X
  970. X    short_line :=  terminal_line_len < 80;
  971. X   `032
  972. X    param := lowcase(param);
  973. X    if param = '' then param := 'players';
  974. X
  975. X    type_monsters := index(param,'mon') > 0;
  976. X    type_players  := index(param,'pla') > 0;
  977. X    if param = 'all' then begin
  978. X`009type_monsters := true;
  979. X`009type_players := true;
  980. X    end;
  981. X    if param = '?' then begin
  982. X`009command_help('players');
  983. X    end else if not type_monsters and not type_players then
  984. X`009writeln ('Type PLAYERS ? for help.')
  985. X    else begin
  986. X
  987. X`009count := 0;
  988. X`009log_event(myslot,E_PLAYERS,0,0);
  989. X`009getindex(I_ASLEEP);`009`123 Rec of bool; False if playing now `125
  990. X`009freeindex;
  991. X`009tmpasleep := indx;
  992. X
  993. X`009getindex(I_PLAYER);`009`123 Rec of valid player log records  `125
  994. X`009freeindex;`009`009`123 False if a valid player log `125
  995. X
  996. X`009getuser;`009`009`123 Corresponding userids of players `125
  997. X`009freeuser;
  998. X
  999. X`009getpers;`009`009`123 Personal names of players `125
  1000. X`009freepers;
  1001. X
  1002. X`009getdate;`009`009`123 date of last play `125
  1003. X`009freedate;
  1004. X
  1005. X`009getint(N_LOCATION);
  1006. X`009freeint;
  1007. X`009where_they_are := anint;
  1008. X
  1009. X`009getnam;`009`009`009`123 room names `125
  1010. X`009freenam;
  1011. X
  1012. X`009getown;`009`009`009`123 room owners `125
  1013. X`009freeown;
  1014. X
  1015. X`009getint(N_SELF);
  1016. X`009freeint;
  1017. X
  1018. X`009writeln;
  1019. X`009if not short_line then write ('Userid          ');
  1020. X`009write ('Personal Name          ');
  1021. X`009if not short_line then write ('    Last Play     ');
  1022. X`009writeln ('   Where');
  1023. X`009for i := 1 to maxplayers do begin
  1024. X`009`009if not(indx.free`091i`093) then begin
  1025. X`009`009`009write_this := true;
  1026. X                        if user.idents`091i`093 = '' then begin
  1027. X`009`009`009    if not short_line then write('<unknown>       ')
  1028. X                        end else if user.idents`091i`093`0911`093 <> ':' the
  1029. Vn begin
  1030. X`009`009`009   if not type_players then write_this := false
  1031. X`009`009`009   else if not short_line then begin
  1032. X`009`009`009       write(user.idents`091i`093);
  1033. X`009`009`009       for j := length(user.idents`091i`093) to 15 do
  1034. X`009`009`009`009    write(' ');
  1035. X`009`009`009   end;
  1036. X                        end else begin
  1037. X`009`009`009   if not type_monsters then write_this := false
  1038. X`009`009`009   else if not short_line then begin
  1039. X`009`009`009       readv(user.idents`091i`093,c,code);
  1040. X`009`009`009       str := class_out(monster_owner(code));
  1041. X`009`009`009       write('<',str,'>');
  1042. X`009`009`009       for j := length(str) to 13 do write(' ');
  1043. X`009`009`009   end;
  1044. X                        end;
  1045. X
  1046. X`009`009`009if write_this then begin
  1047. X`009`009`009    write(pers.idents`091i`093);
  1048. X`009`009`009    for j := length(pers.idents`091i`093) to 21 do
  1049. X`009`009`009`009write(' ');
  1050. X
  1051. X`009`009`009    if not short_line then begin
  1052. X`009`009`009`009if tmpasleep.free`091i`093 then begin
  1053. X`009`009`009`009    write(adate.idents`091i`093);
  1054. X`009`009`009`009    if length(adate.idents`091i`093) < 19 then
  1055. X`009`009`009`009`009for j := length(adate.idents`091i`093) to 18 do
  1056. X`009`009`009`009`009    write(' ');
  1057. X`009`009`009`009end else
  1058. X`009`009`009`009`009write('   -playing now-   ');
  1059. X`009`009`009    end;
  1060. X
  1061. X`009`009`009    if (anint.int`091i`093 <> 0) and (anint.int`091i`093 <> DEFA
  1062. VULT_LINE) then
  1063. X`009`009`009`009write(' * ')
  1064. X`009`009`009    else
  1065. X`009`009`009`009write('   ');
  1066. X
  1067. X`123 let people see, who have quitted in their rooms `125
  1068. X`009`009`009    if (own.idents`091where_they_are.int`091i`093`093 =
  1069. X`009`009`009`009    public_id) or
  1070. X`009`009`009       (own.idents`091where_they_are.int`091i`093`093 =
  1071. X`009`009`009`009    disowned_id) or
  1072. X`009`009`009       (own.idents`091where_they_are.int`091i`093`093 =
  1073. X`009`009`009`009    userid) then
  1074. X`009`009`009`009    ok := true
  1075. X`009`009`009    else
  1076. X`009`009`009`009ok := false;
  1077. X
  1078. X
  1079. X`123 let the Monster wizards see ev'rything.. `125
  1080. X`009`009`009    if manager_priv or`032
  1081. X`009`009`009       ( (poof_priv or owner_priv)`032
  1082. X`009`009`009`009and (here.owner <> system_id)) then`032
  1083. X`009`009`009`009`123 minor change by leino@finuha `125
  1084. X`009`009`009`009`123 and hurtta@finuh `125
  1085. X`009`009`009`009ok := true;
  1086. X
  1087. X
  1088. X`009`009`009    if ok then begin
  1089. X`009`009`009`009    write(nam.idents`091 where_they_are.int`091i`093 `093);
  1090. X`009`009`009    end else
  1091. X`009`009`009`009    write('n/a');
  1092. X
  1093. X
  1094. X`009`009`009    writeln;
  1095. X`009`009`009    count := count +1;
  1096. X`009`009`009    if count mod (terminal_page_len -2) = 0 then begin
  1097. X`009`009`009`009grab_line('-more-',s1,erase := true,
  1098. X`009`009`009`009    eof_handler := leave);
  1099. X`009`009`009`009if s1 > '' then goto 1;
  1100. X`009`009`009    end;
  1101. X`009`009`009end;
  1102. X`009`009end;
  1103. X`009end;
  1104. X`009writeln;
  1105. X`0091:
  1106. X    end;
  1107. X    2:
  1108. Xend;
  1109. X
  1110. X
  1111. Xprocedure do_self(s: string);
  1112. Xlabel 0; `123 for panic `125
  1113. Xvar
  1114. X`009n,oldloc: integer;
  1115. X
  1116. X    function action(s: shortstring; n: integer): boolean;
  1117. X    begin
  1118. X`009writeln(s,':');
  1119. X`009getint(N_SELF);
  1120. X`009freeint;
  1121. X`009if (anint.int`091n`093 = 0) or (anint.int`091n`093 = DEFAULT_LINE) then
  1122. X`009    writeln('That person has not made a self-description.')
  1123. X`009else begin
  1124. X`009    print_desc(anint.int`091n`093);
  1125. X`009    log_event(myslot,E_VIEWSELF,0,0,pers.idents`091n`093);
  1126. X`009end;
  1127. X`009action := true;
  1128. X`009checkevents(true);
  1129. X`009if oldloc <> location then goto 0; `123 panic `125
  1130. X    end; `123 action `125
  1131. X
  1132. X    function restriction (n: integer): boolean;
  1133. X`009begin
  1134. X`009`009restriction := true;
  1135. X`009end;
  1136. X
  1137. X
  1138. Xbegin
  1139. X`009oldloc := location;
  1140. X`009if length(s) = 0 then begin
  1141. X`009`009log_action(c_self,0);
  1142. X`009`009writeln('`091 Editing your self description `093');
  1143. X`009`009if edit_desc(myself) then begin
  1144. X`009`009`009getroom;
  1145. X`009`009`009here.people`091myslot`093.self := myself;
  1146. X`009`009`009putroom;
  1147. X`009`009`009getint(N_SELF);
  1148. X`009`009`009anint.int`091mylog`093 := myself;
  1149. X`009`009`009putint;
  1150. X`009`009`009log_event(myslot,E_SELFDONE,0,0);
  1151. X`009`009end;
  1152. X`009end else if scan_pers(action,s,,restriction) then begin
  1153. X`009end else
  1154. X`009`009writeln('There is no person by that name.');
  1155. X`0090: `123 for panic `125
  1156. Xend;
  1157. X
  1158. X
  1159. Xprocedure do_health(s: string);
  1160. Xvar lev,rel: integer;
  1161. Xbegin
  1162. X`009lev := level(myexperience);
  1163. X`009rel := myhealth * 10 div leveltable`091lev`093.health;
  1164. X
  1165. X`009writeln('Your health rate is ',myhealth:1,'/',
  1166. X`009    leveltable`091lev`093.health:1,'.');
  1167. X`009if rel > 9 then rel := 9;
  1168. X`009write('You ');
  1169. X        if  myhealth = 0 then writeln('are dead.')
  1170. X`009else case rel of
  1171. X`009`0099: writeln('are in exceptional health.');
  1172. X`009`0098: writeln('are in better than average condition.');
  1173. X`009`0097: writeln('are in perfect health.');
  1174. X`009`0096: writeln('feel a little bit dazed.');
  1175. X`009`0095: writeln('have some minor cuts and abrasions.');
  1176. X`009`0094: writeln('have some wounds, but are still fairly strong.');
  1177. X`009`0093: writeln('are suffering from some serious wounds.');
  1178. X`009`0092: writeln('are very badly wounded.');
  1179. X`009`0091,0: writeln('have many serious wounds, and are near death.');
  1180. X`009`009otherwise writeln('don''t seem to be in any condition at all.');
  1181. X`009end;
  1182. Xend;
  1183. X
  1184. X
  1185. Xprocedure crystal_look(chill_msg: integer);
  1186. Xvar
  1187. X`009numobj,numppl,numsee: integer;
  1188. X`009i: integer;
  1189. X`009yes: boolean;
  1190. X
  1191. Xbegin
  1192. X`009writeln;
  1193. X`009print_desc(here.primary);
  1194. X`009log_event(0,E_CHILL,chill_msg,0,'',here.locnum);
  1195. X`009numppl := find_numpeople;
  1196. X`009numsee := n_can_see + 1;
  1197. X
  1198. X`009if numppl > numsee then
  1199. X`009`009writeln('Someone is hiding here.')
  1200. X`009else if numppl = 0 then begin
  1201. X`009`009writeln('Strange, empty shadows swirl before your eyes.');
  1202. X`009end;
  1203. X`009if rnd100 > 50 then
  1204. X`009`009people_header('at this place.')
  1205. X`009else case numppl of
  1206. X`009`009`0090: writeln('Vague empty forms drift through your view.');
  1207. X`009`009`0091: writeln('You can make out a shadowy figure here.');
  1208. X`009`009`0092: writeln('There are two dark figures here.');
  1209. X`009`009`0093: writeln('You can see the silhouettes of three people.');
  1210. X`009`009`009otherwise
  1211. X`009`009`009`009writeln('Many dark figures can be seen here.');
  1212. X`009end;
  1213. X
  1214. X`009numobj := find_numobjs;
  1215. X`009if rnd100 > 50 then begin
  1216. X`009`009if rnd100 > 50 then
  1217. X`009`009`009show_objects
  1218. X`009`009else if numobj > 0 then
  1219. X`009`009`009writeln('Some objects are here.')
  1220. X`009`009else
  1221. X`009`009`009writeln('There are no objects here.');
  1222. X`009end else begin
  1223. X`009`009yes := false;
  1224. X`009`009for i := 1 to maxobjs do
  1225. X`009`009`009if here.objhide`091i`093 <> 0 then
  1226. X`009`009`009`009yes := true;
  1227. X`009`009if yes then
  1228. X`009`009`009writeln('Something is hidden here.');
  1229. X`009end;
  1230. X`009writeln;
  1231. Xend;
  1232. X
  1233. X
  1234. Xprocedure use_crystal(objnum: integer);
  1235. Xlabel exit_label;
  1236. Xvar
  1237. X`009done: boolean;
  1238. X`009s: string;
  1239. X`009n: integer;
  1240. X`009done_msg,chill_msg: integer;
  1241. X`009tmp: string;
  1242. X`009i: integer;
  1243. X
  1244. X    procedure leave;
  1245. X    begin
  1246. X`009writeln('EXIT');
  1247. X`009gethere;
  1248. X`009log_event(myslot,E_DONECRYSTALUSE,0,0);
  1249. X`009print_desc(done_msg);
  1250. X`009goto exit_label;
  1251. X    end;
  1252. X
  1253. X
  1254. X
  1255. Xbegin
  1256. X`009if obj_hold(objnum) then begin
  1257. X`009`009log_action(e_usecrystal,0);
  1258. X`009`009getobj(objnum);
  1259. X`009`009freeobj;
  1260. X`009`009done_msg := obj.d1;
  1261. X`009`009chill_msg := obj.d2;
  1262. X
  1263. X`009`009grab_line('',s,eof_handler := leave);
  1264. X`009`009if lookup_room(n,s) then begin
  1265. X`009`009`009gethere(n);
  1266. X`009`009`009crystal_look(chill_msg);
  1267. X`009`009`009done := false;
  1268. X`009`009end else
  1269. X`009`009`009done := true;
  1270. X
  1271. X`009`009while not(done) do begin
  1272. X`009`009`009grab_line('',s,eof_handler := leave);
  1273. X`009`009`009if lookup_dir(n,s) then begin
  1274. X`009`009`009`009if here.exits`091n`093.toloc > 0 then begin
  1275. X`009`009`009`009`009gethere(here.exits`091n`093.toloc);
  1276. X`009`009`009`009`009crystal_look(chill_msg);
  1277. X`009`009`009`009end;
  1278. X`009`009`009end else begin
  1279. X`009`009`009`009s := lowcase(s);
  1280. X`009`009`009`009tmp := bite(s);
  1281. X`009`009`009`009if tmp = 'poof' then begin
  1282. X`009`009`009`009`009if lookup_room(n,s) then begin
  1283. X`009`009`009`009`009`009gethere(n);
  1284. X`009`009`009`009`009`009crystal_look(chill_msg);
  1285. X`009`009`009`009`009end else
  1286. X`009`009`009`009`009`009done := true;
  1287. X`009`009`009`009end else if tmp = 'say' then begin
  1288. X`009`009`009`009`009i := (rnd100 mod 4) + 1;
  1289. X`009`009`009`009`009log_event(0,E_NOISE2,i,0,'',n);
  1290. X`009`009`009`009end else
  1291. X`009`009`009`009`009done := true;
  1292. X`009`009`009end;
  1293. X`009`009end;
  1294. X
  1295. X`009  `009gethere;
  1296. X`009`009log_event(myslot,E_DONECRYSTALUSE,0,0);
  1297. X`009`009print_desc(done_msg);
  1298. X`009end else
  1299. X`009`009writeln('You must be holding it first.');
  1300. X    exit_label:
  1301. Xend;
  1302. X
  1303. X
  1304. X
  1305. Xprocedure p_usefail(n: integer);
  1306. X
  1307. Xbegin
  1308. X`009`123 we assume getobj has already been done `125
  1309. X`009if (obj.usefail = 0) or (obj.usefail = DEFAULT_LINE) then
  1310. X   `009`009writeln('It doesn''t work for some reason.')
  1311. X`009else
  1312. X`009`009print_desc(obj.usefail);
  1313. Xend;
  1314. X
  1315. X
  1316. Xprocedure p_usesucc(n: integer);
  1317. X
  1318. Xbegin
  1319. X`009`123 we assume getobj has already been done `125
  1320. X`009if (obj.usesuccess = 0) or (obj.usesuccess = DEFAULT_LINE) then
  1321. X`009  `009writeln('It seems to work, but nothing appears to happen.')
  1322. X`009else
  1323. X`009`009print_desc(obj.usesuccess);
  1324. Xend;                  `032
  1325. X
  1326. Xprocedure p_attack (n,victim: integer);                                 `032
  1327. XVar vs: string;
  1328. Xbegin
  1329. X`009`123 we assume getroom has already been done `125
  1330. X        getobj (n);`009`123    can we remove this ? `125
  1331. X`009freeobj; `009`123 -> (what happen in grab_line) `125
  1332. X        vs := here.people`091victim`093.name;
  1333. X`009if (obj.usesuccess = 0) or (obj.usesuccess = DEFAULT_LINE) then
  1334. X`009`009writeln('You attack ',vs)
  1335. X`009else
  1336. X`009`009block_subs(obj.usesuccess,vs);
  1337. Xend;                                                              `032
  1338. X
  1339. X
  1340. Xprocedure use_weapon (n: integer);
  1341. Xlabel exit_label;
  1342. Xvar done: boolean;
  1343. X    victim,factor: integer;
  1344. X    s,last: string;
  1345. X
  1346. X    procedure leave;
  1347. X    begin
  1348. X`009writeln('EXIT');
  1349. X`009goto exit_label;
  1350. X    end;
  1351. X
  1352. Xbegin
  1353. X   factor := leveltable`091level(myexperience)`093.factor;
  1354. X   Writeln ('Use weapon - Whom do you attack ?');
  1355. X   done := False; last := '<unknown>';
  1356. X   repeat
  1357. X    `032
  1358. X     if not read_global_flag(GF_WARTIME) then begin
  1359. X`009writeln('Don''t you dare disturb the Pax Monstruosa!');
  1360. X`009done := true
  1361. X     end else if mywield <> n then begin
  1362. X`009writeln ('You are no longer wielding that weapon.');
  1363. X`009done := true;
  1364. X     end else begin
  1365. X`009grab_line ('Victim? ',s,eof_handler := leave);`032
  1366. X`009if s = '.' then s := last;
  1367. X`009last := s;
  1368. X
  1369. X`009if s = '' then done := true
  1370. X`009else if not parse_pers(victim,s) then begin
  1371. X`009    Writeln (s,' isn''t here.');
  1372. X`009    victim := 0
  1373. X`009end;
  1374. X     end;
  1375. X
  1376. X     if not done and (victim > 0) then
  1377. X       if victim = myslot Then Writeln ('Suicide is not allowed.')
  1378. X       else if protected (victim) or (rnd100 > factor) then begin `123 Ha Ha
  1379. V `125
  1380. X`009`009log_event(myslot,E_FAILUSE,n,0);
  1381. X`009`009p_usefail(n);
  1382. X       end else if (here.people`091victim`093.experience >= protect_exp)`032
  1383. X       `123`009and protected_MM `125 then begin
  1384. X`009`009log_event(myslot,E_FAILUSE,n,0);
  1385. X`009`009writeln('You can''t attack that person.');
  1386. X       end else begin
  1387. X`009`009if hiding then begin
  1388. X`009`009`009hiding := false;
  1389. X
  1390. X`009`009`009getroom;  `032
  1391. X`009`009`009here.people`091myslot`093.hiding := 0;
  1392. X`009`009`009putroom;
  1393. X                                `032
  1394. X                        log_event(myslot,E_HATTACK,victim,n);
  1395. X                        Writeln ('You step out from shadows and ...');
  1396. X                        p_attack (n,victim);
  1397. X`009`009       `009if here.people`091victim`093.kind = P_MONSTER then begin
  1398. X`009`009`009`009getobj(n);
  1399. X`009`009`009`009freeobj;
  1400. X`009`009`009`009attack_monster(victim,obj.ap);
  1401. X`009`009`009end;`032
  1402. X`009`009end else begin
  1403. X       `009      `009`009log_event(myslot,E_ATTACK,victim,n);
  1404. X`009`009`009p_attack (n,victim);
  1405. X`009`009       `009if here.people`091victim`093.kind = P_MONSTER then begin
  1406. X`009`009`009`009getobj(n);
  1407. X`009`009`009`009freeobj;
  1408. X`009`009`009`009attack_monster(victim,obj.ap);
  1409. X`009`009`009end;`032
  1410. X`009`009end;
  1411. X`009`009wait (1+random*4); `123 Ha Ha Ha `125
  1412. X`009end;
  1413. X   until done;
  1414. X   exit_label:
  1415. Xend;
  1416. X
  1417. Xprocedure use_book(n: integer);
  1418. Xvar p: integer;
  1419. Xbegin
  1420. X    p := obj.parms`091OP_SPELL`093;
  1421. X    if p > 0 then begin
  1422. X`009getint(N_SPELL);
  1423. X`009freeint;
  1424. X`009getspell_name;
  1425. X`009freespell_name;
  1426. X`009run_monster('',anint.int`091p`093,'learn',`032
  1427. X`009    'book name',objnam.idents`091n`093,
  1428. X`009    sysdate + ' ' + systime,
  1429. X`009    spell_name.idents`091p`093,myname);
  1430. X    end;
  1431. Xend; `123 use_book `125
  1432. X
  1433. Xprocedure do_use(s: string);
  1434. Xlabel exit_label;
  1435. Xvar
  1436. X`009n: integer;
  1437. X
  1438. X    procedure leave;
  1439. X    begin
  1440. X`009writeln('EXIT');
  1441. X`009goto exit_label;
  1442. X    end;
  1443. X
  1444. Xbegin
  1445. X`009if s = '' then grab_line('Object? ',s,eof_handler := leave);
  1446. X
  1447. X`009if length(s) = 0 then
  1448. X`009`009writeln('To use an object, type USE <object name>')
  1449. X`009else if parse_obj(n,s) then begin
  1450. X`009`009getobj(n);
  1451. X`009`009freeobj;
  1452. X
  1453. X`009`009if (obj.useobjreq > 0) and not(obj_hold(obj.useobjreq)) then begin
  1454. X`009`009`009log_event(myslot,E_FAILUSE,n,0);
  1455. X`009`009`009p_usefail(n);
  1456. X`009`009end else if (obj.uselocreq > 0) and (location <> obj.uselocreq) then
  1457. V begin
  1458. X`009`009`009log_event(myslot,E_FAILUSE,n,0);
  1459. X`009`009`009p_usefail(n);
  1460. X`009`009end else if (obj.kind = O_WEAPON) and`032
  1461. X                            ((obj.exreq > myexperience) or
  1462. X                            (n <> mywield)) then begin  `123 Ha Ha Ha `125
  1463. X`009`009`009log_event(myslot,E_FAILUSE,n,0);
  1464. X`009`009`009p_usefail(n);
  1465. +-+-+-+-+-+-+-+-  END  OF PART 22 +-+-+-+-+-+-+-+-
  1466.