home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part17 < 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 17/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.041851.9940@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 04:18:51 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1277
  12.  
  13. Archieve-name: monster_helsinki_104/part17
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 17/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 17 -+-+-+-+-+-+-+-+
  20. X
  21. X`009`009`009end else
  22. X`009`009`009`009ok := false;
  23. X`009`009end;
  24. X`009`009putroom;
  25. X`009`009if ok then begin
  26. X`009`009`009log_event(myslot,E_REFUSE,0,0);
  27. X`009`009`009writeln('Exits ',direct`091dir`093,' will be refused.');
  28. X`009`009end else
  29. X`009`009`009writeln('Exits were not being accepted there.');
  30. X`009end else
  31. X`009`009writeln('To undo an Accept, type REFUSE <direction>.');
  32. X    exit_label:
  33. Xend;
  34. X
  35. X`123 function systime moved to module CUSTOM `125
  36. X
  37. X`123 substitute a parameter string for the # sign in the source string `125
  38. Xfunction subs_parm(s,parm: string): mega_string;
  39. Xvar
  40. X`009right,left: mega_string;
  41. X`009i: integer;`009`009`123 i is point to break at `125
  42. Xbegin
  43. X`009i := index(s,'#');
  44. X`009if (i > 0) and ((length(s) + length(parm))`032
  45. X`009    <= terminal_line_len) then begin
  46. X`009`009if i >= length(s) then begin
  47. X`009`009`009right := '';
  48. X`009`009`009left := s;
  49. X`009`009end else if i < 1 then begin
  50. X`009`009`009right := s;
  51. X`009`009`009left := '';
  52. X`009`009end else begin
  53. X`009`009`009right := substr(s,i+1,length(s)-i);
  54. X`009`009`009left := substr(s,1,i);
  55. X`009`009end;
  56. X`009`009if length(left) <= 1 then
  57. X`009`009`009left := ''
  58. X`009`009else
  59. X`009`009`009left := substr(left,1,length(left)-1);
  60. X
  61. X`009`009subs_parm := left + parm + right;
  62. X`009end else begin
  63. X`009`009subs_parm := s;
  64. X`009end;
  65. Xend;
  66. X
  67. X`123 function level moved to database module `125
  68. X
  69. Xprocedure time_health;
  70. Xvar tmp: objectrec;
  71. X    tmp2: intrec;
  72. X    mylevel,good,rel: integer;
  73. Xbegin
  74. X`009mylevel:=level(myexperience);
  75. X`009good := leveltable`091mylevel`093.health * 7 div 10;
  76. X`009if healthcycle > 0 then begin`009`009`123 how quickly they heal `125
  77. X`009`009if myhealth < good then begin`009`123 heal a little bit `125
  78. X`009`009`009myhealth := myhealth + (good div 10) +1;
  79. X
  80. X`009`009`009if mywield > 0 then begin
  81. X`009`009`009`009tmp := obj;
  82. X`009`009`009`009getobj(mywield);
  83. X`009`009`009`009freeobj;
  84. X`009`009`009`009if (obj.kind = O_HEALTH_RING) and
  85. X`009`009`009`009   (myhealth < leveltable`091mylevel`093.health) then
  86. X`009`009`009`009`009myhealth := myhealth + good div 5;
  87. X`009`009`009`009obj := tmp;
  88. X`009`009`009end;
  89. X
  90. X`009`009`009getroom;
  91. X`009`009`009here.people`091myslot`093.health := myhealth;
  92. X`009`009`009putroom;
  93. X
  94. X`009`009`009tmp2 := anint;
  95. X`009`009`009getint(N_HEALTH);`009`123 hurtta@finuh `125
  96. X`009`009`009anint.int`091mylog`093 := myhealth;
  97. X`009`009`009putint;
  98. X`009`009`009anint := tmp2;
  99. X
  100. X`009`009`009`123show new health rating `125
  101. X`009`009`009rel := myhealth * 10 div leveltable`091mylevel`093.health;
  102. X`009`009`009if rel > 9 then rel := 9;
  103. X                if myhealth = 0 then writeln('You are still dead.')
  104. X`009`009else case rel of
  105. X`009`009`0099: writeln('You are now in exceptional health.');
  106. X`009`009`0098: writeln('You feel much stronger.  You are in better than aver
  107. Vage condition.');
  108. X`009`009`0097: writeln('You are now in perfect health.');
  109. X`009`009`0096: writeln('You only feel a little bit dazed now.');
  110. X`009`009`0095: begin
  111. X`009`009`009`009writeln('You only have some minor cuts and abrasions now.  M
  112. Vost of your serious wounds');
  113. X`009`009`009`009writeln('have healed.');
  114. X`009`009`009   end;
  115. X`009`009`0094: writeln('You are only suffering from some minor wounds now.')
  116. V;
  117. X`009`009`0093: writeln('Your most serious wounds have healed, but you are st
  118. Vill in bad shape.');
  119. X`009`009`0092: writeln('You have healed somewhat, but are still very badly w
  120. Vounded.');
  121. X`009`009`0090,1: writeln('You are in critical condition, but there may be ho
  122. Vpe.');
  123. X`009`009`009otherwise writeln('You don''t seem to be in any condition at all
  124. V.');
  125. X`009`009end;
  126. X
  127. X`009`009reprint_grab;
  128. X
  129. X`009`009end;
  130. X`009`009healthcycle := 0;
  131. X`009end else
  132. X`009`009healthcycle := healthcycle + 1;
  133. Xend;
  134. X
  135. X
  136. Xprocedure time_noises;
  137. Xvar
  138. X`009n: integer;
  139. X
  140. Xbegin
  141. X`009if rnd100 <= 2 then begin
  142. X`009`009n := rnd100;
  143. X`009`009if n in `0910..40`093 then
  144. X`009`009`009log_event(0,E_NOISES,rnd100,0)
  145. X`009`009else if n in `09141..60`093 then
  146. X`009`009`009log_event(0,E_ALTNOISE,rnd100,0);
  147. X`009end;
  148. Xend;
  149. X
  150. Xprocedure time_trapdoor(silent: boolean);
  151. Xvar fall: boolean;
  152. Xbegin                  `032
  153. X`009if (rnd100-1) < here.trapchance then begin
  154. X`009`009`009`123 trapdoor fires! `125
  155. X`009`009if here.trapto > 0 then begin
  156. X`009`009`009`009`123 logged action should cover (protected) `125
  157. X`009`009`009if (protected) or (logged_act) then
  158. X`009`009`009`009fall := false
  159. X`009`009`009else if here.magicobj = 0 then
  160. X`009`009`009`009fall := true
  161. X`009`009`009else if obj_hold(here.magicobj) then
  162. X`009`009`009`009fall := false
  163. X`009`009`009else
  164. X`009`009`009`009fall := true;
  165. X`009`009end else
  166. X`009`009`009fall := false;
  167. X
  168. X`009  `009if fall then begin
  169. X`009`009`009do_exit(here.trapto);
  170. X`009`009`009if not(silent) then
  171. X`009`009`009    reprint_grab;
  172. X`009`009end;
  173. X`009end;
  174. Xend;
  175. X
  176. Xprocedure time_teleport;
  177. Xvar`009tmp: objectrec;
  178. X`009target,i: integer;
  179. Xbegin
  180. X`009tmp := obj;
  181. X`009if mywield > 0 then begin
  182. X`009`009getobj(mywield);
  183. X`009`009freeobj;
  184. X`009`009if (obj.kind = O_TELEPORT_RING) and not protected then begin
  185. X`009`009`009target := location;
  186. X`009`009`009getindex(I_ROOM);
  187. X`009`009`009freeindex;
  188. X`009`009`009for i := 1 to indx.top do if not indx.free`091i`093 then
  189. X`009`009`009`009if rnd100 < 30 then target := i;
  190. X`009`009`009if location <> target then begin
  191. X`009`009`009`009if obj.d1 > 0 then print_desc(obj.d1);
  192. X`009`009`009`009xpoof(target);
  193. X`009`009`009`009reprint_grab;
  194. X`009`009`009end;
  195. X`009`009end;
  196. X`009end;
  197. X`009obj := tmp;
  198. Xend;
  199. X
  200. Xprocedure time_midnight;
  201. Xbegin
  202. X  if systime = '12:00am' then log_event(0,E_MIDNIGHT,rnd100,0);
  203. Xend;
  204. X
  205. X`123 cause random events to occurr (ha ha ha) `125
  206. X
  207. Xprocedure rnd_event(silent: boolean := false);
  208. Xvar n: integer;
  209. Xbegin
  210. X`009if rndcycle >= RANDOM_EVENT_CYCLE then begin `123 inside here 6 times/mi
  211. Vn `125
  212. X`009`009time_noises;
  213. X`009`009time_health;
  214. X`009`009time_trapdoor(silent);        `032
  215. X`009`009time_midnight;
  216. X`009`009time_teleport;
  217. X
  218. X`009`009rndcycle := 0;
  219. X`009end else
  220. X`009`009rndcycle := rndcycle + 1;
  221. Xend;
  222. X
  223. X`123 handle levels `125
  224. X
  225. Xfunction droplevel(score: integer): integer;
  226. Xvar cur: integer;
  227. Xbegin
  228. X   cur := level(score);
  229. X   if (cur > 1) and (not leveltable`091cur`093.hidden) then cur := cur -1;
  230. X   droplevel := leveltable`091cur`093.exp;
  231. X   if score >= protect_exp then droplevel := score;
  232. X      `123 works even though we show Manager levels `125
  233. Xend;
  234. X
  235. X`123 function lookup_level moved to module CUSTOM `125
  236. X
  237. Xprocedure do_die (killer : integer := 0);
  238. Xvar
  239. X`009some: boolean;
  240. X`009tmp: intrec;
  241. X`009oldlevel,newlevel: integer;
  242. X
  243. Xbegin
  244. X        if killer > 0 then log_event (myslot,E_ADDEXPERIENCE,killer,
  245. X                                      (myexperience div 6) + 1);
  246. X
  247. X        oldlevel := level(myexperience);
  248. X`009writeln;
  249. X`009writeln('        *** You are dead ***');
  250. X`009writeln;
  251. X`009some := drop_everything;
  252. X`009`123 changes by hurtta@finuh `125
  253. X
  254. X        tmp := anint;
  255. X        myexperience := droplevel(myexperience);
  256. X`009newlevel := level(myexperience);
  257. X        getint(N_EXPERIENCE);
  258. X        anint.int`091mylog`093 := myexperience;
  259. X        putint;`032
  260. X        if newlevel < oldlevel then prevlevel(oldlevel,newlevel);
  261. X`009anint := tmp;
  262. X
  263. X`009take_token(myslot,location);
  264. X`009log_event(0,E_DIED,0,0,log_name);
  265. X`009if put_token(2,myslot) then begin
  266. X`009`009location := 2;
  267. X`009`009inmem := false;
  268. X`009`009setevent;
  269. X`123 log entry to death loc `125
  270. X`123 perhaps turn off refs to other people `125
  271. X`009end else begin
  272. X`009`009writeln('The Monster universe regrets to inform you that you cannot
  273. V be ressurected at');
  274. X`009`009writeln('the moment.');
  275. X`009`009finish_interpreter;
  276. X`009`009halt;
  277. X`009end;
  278. Xend;
  279. X
  280. Xprocedure poor_health(p: integer; killer : integer := 0);
  281. Xvar
  282. X`009some: boolean;
  283. X`009tmp: intrec;
  284. X`009rel,mylevel: integer;
  285. X
  286. Xbegin
  287. X`009mylevel := level(myexperience);
  288. X`009if myhealth > p then begin
  289. X`009`009myhealth := myhealth - 1;
  290. X`009`009getroom;
  291. X`009`009here.people`091myslot`093.health := myhealth;
  292. X`009`009putroom;
  293. X
  294. X`009`009tmp := anint;
  295. X`009`009getint(N_HEALTH);
  296. X`009`009anint.int`091mylog`093 := myhealth;
  297. X`009`009putint;
  298. X`009`009anint := tmp;
  299. X
  300. X`009`009log_event(myslot,E_WEAKER,myhealth,0);
  301. X
  302. X`009`009`123 show new health rating `125
  303. X`009`009rel := myhealth * 10 div leveltable`091mylevel`093.health;
  304. X`009`009if rel > 9 then rel := 9;
  305. X`009`009write('You ');
  306. X                if myhealth = 0 then writeln('are dead.')
  307. X                else if myhealth = 1 then writeln('will be die.')
  308. X`009`009else case rel of
  309. X`009`009`0099: writeln('are still in exceptional health.');
  310. X`009`009`0098: writeln('feel weaker, but are in better than average conditio
  311. Vn.');
  312. X`009`009`0097: writeln('are somewhat weaker, but are in perfect health.');
  313. X`009`009`0096: writeln('feel a little bit dazed.');
  314. X`009`009`0095: writeln('have some minor cuts and abrasions.');
  315. X`009`009`0094: writeln('have some wounds, but are still fairly strong.');
  316. X`009`009`0093: writeln('are suffering from some serious wounds.');
  317. X`009`009`0092: writeln('are very badly wounded.');
  318. X`009`009`0090,1: writeln('have many serious wounds, and are near death.');
  319. X`009`009`009otherwise writeln('don''t seem to be in any condition at all.');
  320. X`009`009end;
  321. X`009end else begin `123 they died `125
  322. X`009`009do_die (killer);
  323. X`009end;
  324. Xend;
  325. X
  326. X`123 count objects here `125
  327. X
  328. Xfunction find_numobjs: integer;
  329. Xvar
  330. X`009sum,i: integer;
  331. Xbegin
  332. X`009sum := 0;
  333. X`009for i := 1 to maxobjs do
  334. X`009`009if here.objs`091i`093 <> 0 then
  335. X`009`009`009sum := sum + 1;
  336. X`009find_numobjs := sum;
  337. Xend;
  338. X
  339. X`123 optional parameter is slot of player's objects to count `125
  340. X
  341. Xfunction find_numhold(player: integer := 0): integer;
  342. Xvar sum,i: integer;
  343. Xbegin
  344. X`009if player = 0 then player := myslot;
  345. X
  346. X`009sum := 0;
  347. X`009for i := 1 to maxhold do
  348. X`009`009if here.people`091player`093.holding`091i`093 <> 0 then
  349. X`009`009`009sum := sum + 1;
  350. X`009find_numhold := sum;
  351. Xend;
  352. X
  353. Xprocedure take_hit(p: integer; killer : integer := 0 );
  354. Xvar                          `032
  355. X`009i: integer;
  356. X`009objtemp: objectrec;
  357. X`009pro: integer;
  358. X
  359. Xbegin       `032
  360. X`009if protected then p := 0              `032
  361. X`009else if mywear > 0 then begin
  362. X`009`009objtemp := obj; `123 is this necessary ? `125
  363. X
  364. X`009`009getobj (mywear);`032
  365. X`009`009freeobj;        `032
  366. X                    `032
  367. X`009`009pro := trunc(obj.ap*random);`009`123 He he He `125
  368. X`009`009p := p - pro;
  369. X`009`009if p < 0 then p := 0;
  370. X
  371. X`009`009obj := objtemp;
  372. X`009end;
  373. X
  374. X`009if p > 0 then begin
  375. X`009`009if rnd100 < (55 + (p-1) * 30) then `123 chance that they're hit `125
  376. X`009`009`009poor_health(p, killer);
  377. X
  378. X`009`009if find_numobjs < maxobjs + 1 then begin
  379. X`009`009`009`123 maybe they drop something if they're hit `125
  380. X`009`009`009for i := 1 to p do
  381. X`009`009`009`009maybe_drop;
  382. X`009`009end;
  383. X`009end;
  384. Xend;
  385. X
  386. Xfunction punch_force(sock: integer): integer;
  387. Xvar
  388. X`009p: integer;
  389. X
  390. Xbegin
  391. X`009if sock in `0912,3,6,7,8,11,12`093 then`009`123 no punch or a graze `125
  392. X`009`009p := 0
  393. X`009else if sock in `0914,9,10`093 then`009`123 hard punches `125
  394. X`009`009p := 2
  395. X`009else`009`123 1,5,13,14,15 `125
  396. X`009`009p := 1;`009`009`123 all others are medium punches `125
  397. X`009punch_force := p;
  398. Xend;
  399. X
  400. Xprocedure put_punch(sock: integer;s: string);
  401. Xbegin
  402. X`009case sock of
  403. X`009`0091: writeln('You deliver a quick jab to ',s,'''s jaw.');
  404. X`009`0092: writeln('You swing at ',s,' and miss.');
  405. X`009`0093: writeln('A quick punch, but it only grazes ',s,'.');
  406. X`009`0094: writeln(s,' doubles over after your jab to the stomach.');
  407. X`009`0095: writeln('Your punch lands square on ',s,'''s face!');
  408. X`009`0096: writeln('You swing wild and miss.');
  409. X`009`0097: writeln('A good swing, but it misses ',s,' by a mile!');
  410. X`009`0098: writeln('Your punch is blocked by ',s,'.');
  411. X`009`0099: writeln('Your roundhouse blow sends ',s,' reeling.');
  412. X`009`00910:writeln('You land a solid uppercut on ',s,'''s chin.');
  413. X`009`00911:writeln(s,' fends off your blow.');
  414. X`009`00912:writeln(s,' ducks and avoids your punch.');
  415. X`009`00913:writeln('You thump ',s,' in the ribs.');
  416. X`009`00914:writeln('You catch ',s,'''s face on your elbow.');
  417. X`009`00915:writeln('You knock the wind out of ',s,' with a punch to the ches
  418. Vt.');
  419. X`009end;
  420. Xend;
  421. X
  422. Xprocedure get_punch(sock: integer;s: string);
  423. Xbegin
  424. X`009case sock of
  425. X`009`0091: writeln(s,' delivers a quick jab to your jaw!');
  426. X`009`0092: writeln(s,' swings at you but misses.');
  427. X`009`0093: writeln(s,'''s fist grazes you.');
  428. X`009`0094: writeln('You double over after ',s,' lands a mean jab to your sto
  429. Vmach!');
  430. X`009`0095: writeln('You see stars as ',s,' bashes you in the face.');
  431. X`009`0096: writeln('You only feel the breeze as ',s,' swings wildly.');
  432. X`009`0097: writeln(s,'''s swing misses you by a yard.');
  433. X`009`0098: writeln('With lightning reflexes you block ',s,'''s punch.');
  434. X`009`0099: writeln(s,'''s blow sends you reeling.');
  435. X`009`00910:writeln('Your head snaps back from ',s,'''s uppercut!');
  436. X`009`00911:writeln('You parry ',s,'''s attack.');
  437. X`009`00912:writeln('You duck in time to avoid ',s,'''s punch.');
  438. X`009`00913:writeln(s,' thumps you hard in the ribs.');
  439. X`009`00914:writeln('Your vision blurs as ',s,' elbows you in the head.');
  440. X`009`00915:writeln(s,' knocks the wind out of you with a punch to your chest
  441. V.');
  442. X`009end;
  443. Xend;
  444. X
  445. Xprocedure view_punch(a,b: string;p: integer);
  446. Xbegin
  447. X`009case p of
  448. X`009`0091: writeln(a,' jabs ',b,' in the jaw.');
  449. X`009`0092: writeln(a,' throws a wild punch at the air.');
  450. X`009`0093: writeln(a,'''s fist barely grazes ',b,'.');
  451. X`009`0094: writeln(b,' doubles over in pain with ',a,'''s punch');
  452. X`009`0095: writeln(a,' bashes ',b,' in the face.');
  453. X`009`0096: writeln(a,' takes a wild swing at ',b,' and misses.');
  454. X`009`0097: writeln(a,' swings at ',b,' and misses by a yard.');
  455. X`009`0098: writeln(b,'''s punch is blocked by ',a,'''s quick reflexes.');
  456. X`009`0099: writeln(b,' is sent reeling from a punch by ',a,'.');
  457. X`009`00910:writeln(a,' lands an uppercut on ',b,'''s head.');
  458. X`009`00911:writeln(b,' parrys ',a,'''s attack.');
  459. X`009`00912:writeln(b,' ducks to avoid ',a,'''s punch.');
  460. X`009`00913:writeln(a,' thumps ',b,' hard in the ribs.');
  461. X`009`00914:writeln(a,'''s elbow connects with ',b,'''s head.');
  462. X`009`00915:writeln(a,' knocks the wind out of ',b,'.');
  463. X`009end;
  464. Xend;
  465. X
  466. Xprocedure desc_health(n: integer;header:shortstring := '');
  467. Xvar tmp: objectrec;
  468. X    hide : boolean;
  469. X    wear,lev,rel: integer;
  470. Xbegin
  471. X`009lev := level(here.people`091n`093.experience);
  472. X
  473. X`009if header = '' then begin
  474. X`009`009hide := false;
  475. X`009`009wear := here.people`091n`093.wearing;
  476. X`009`009if wear > 0 then begin
  477. X`009`009`009tmp := obj;
  478. X
  479. X`009`009`009getobj(wear);
  480. X`009`009`009freeobj;
  481. X`009`009`009if obj.kind = O_DISGUISE then hide := true;
  482. X
  483. X`009`009`009obj := tmp;
  484. X`009`009end;
  485. X`009`009if hide then write ('Someone ')
  486. X`009`009else write(here.people`091n`093.name,' ')
  487. X`009end else
  488. X`009`009write(header);
  489. X
  490. X`009rel := here.people`091n`093.health * 10 div leveltable`091lev`093.health
  491. V;
  492. X`009if rel > 9 then rel := 9;
  493. X        if here.people`091n`093.health = 0 then writeln('is dead.')
  494. X`009else case rel of
  495. X`009`0099: writeln('is in exceptional health, and looks very strong.');
  496. X`009`0098: writeln('is in better than average condition.');
  497. X`009`0097: writeln('is in perfect health.');
  498. X`009`0096: writeln('looks a little dazed.');
  499. X`009`0095: writeln('has some minor cuts and abrasions.');
  500. X`009`0094: writeln('has some minor wounds.');
  501. X`009`0093: writeln('is suffering from some serious wounds.');
  502. X`009`0092: writeln('is very badly wounded.');
  503. X`009`0090,1: writeln('has many serious wounds, and is near death.');
  504. X`009`009otherwise writeln('doesn''t seem to be in any condition at all.');
  505. X`009end;
  506. Xend;
  507. X
  508. X
  509. Xfunction obj_part(objnum: integer;doread: boolean := TRUE): string;
  510. Xvar
  511. X`009s: string;
  512. X
  513. Xbegin
  514. X`009if doread then begin
  515. X`009`009getobj(objnum);
  516. X`009`009freeobj;
  517. X`009end;
  518. X`009s := obj.oname;
  519. X`009case obj.particle of
  520. X`009`0090:;
  521. X`009`0091: s := 'a ' + s;
  522. X`009`0092: s := 'an ' + s;
  523. X`009`0093: s := 'some ' + s;
  524. X`009`0094: s := 'the ' + s;
  525. X`009end;
  526. X`009obj_part := s;
  527. Xend;
  528. X
  529. X
  530. Xprocedure print_subs(n: integer;s: string);
  531. X
  532. Xbegin
  533. X`009if (n > 0) and (n <> DEFAULT_LINE) then begin
  534. X`009`009getline(n);
  535. X`009`009freeline;
  536. X`009`009writeln(subs_parm(oneliner.theline,s));
  537. X`009end else if n = DEFAULT_LINE then
  538. X`009`009writeln('%<default line> in print_subs');
  539. Xend;
  540. X
  541. X`123 print out a (up to) 10 line description block, substituting string s fo
  542. Vr
  543. X  up to one occurance of # per line `125
  544. X
  545. Xprocedure block_subs(n: integer;s: string);
  546. Xvar
  547. X`009p,i: integer;
  548. X`009len: integer;
  549. Xbegin
  550. X`009if n < 0 then
  551. X`009`009print_subs(abs(n),s)
  552. X`009else if (n > 0) and (n <> DEFAULT_LINE) then begin
  553. X`009`009getblock(n);
  554. X`009`009freeblock;
  555. X`009`009i := 1;
  556. X`009`009len := 0;
  557. X`009`009while i <= block.desclen do begin
  558. X`009`009`009p := index(block.lines`091i`093,'#');
  559. X`009`009`009if (p > 0) then
  560. X`009`009`009    if terminal_line_len < 80 then
  561. X`009`009`009`009print_short(subs_parm(block.lines`091i`093,s),
  562. X`009`009`009`009    i = block.desclen,len)
  563. X`009`009`009    else
  564. X`009`009`009`009writeln(subs_parm(block.lines`091i`093,s))
  565. X`009`009`009else
  566. X`009`009`009    if terminal_line_len < 80 then
  567. X`009`009`009`009print_short(block.lines`091i`093,
  568. X`009`009`009`009    i = block.desclen,len)
  569. X`009`009`009    else
  570. X`009`009`009`009writeln(block.lines`091i`093);
  571. X`009`009`009i := i + 1;
  572. X`009`009end;
  573. X`009end;
  574. Xend;
  575. X
  576. X`123 list_privileges moved to PARSER.PAS `125
  577. X
  578. X`123  function custom_privileges moved to module CUSTOM `125
  579. X
  580. Xprocedure newlevel `123 (oldlev,newlev: integer) `125;
  581. Xvar newpriv,oldpriv,sum: unsigned;
  582. X    tmp: intrec;
  583. X    i: integer;
  584. Xbegin
  585. X  tmp := anint;
  586. X  writeln ('You are now ',leveltable`091newlev`093.name,'.');
  587. X  log_event(myslot,E_NEWLEVEL,,,leveltable`091newlev`093.name);
  588. X
  589. X  `123 health `125
  590. X  myhealth := leveltable`091newlev`093.health * 7 div 10;
  591. X  getint(N_HEALTH);`009
  592. X  anint.int`091mylog`093 := myhealth;
  593. X  putint;`009
  594. X  getroom;
  595. X  here.people`091myslot`093.health := myhealth;
  596. X  putroom;
  597. X
  598. X  `123 privileges `125
  599. X  getint(N_PRIVILEGES);
  600. X  freeint;
  601. X  oldpriv := anint.int`091mylog`093;
  602. X
  603. X  sum := 0;
  604. X  for i := oldlev+1 to newlev do sum := uor(sum,leveltable`091i`093.priv);
  605. X  newpriv := uor(oldpriv,sum);
  606. X  getint(N_PRIVILEGES);
  607. X  anint.int`091mylog`093 :=  int(newpriv);
  608. X  putint;
  609. X
  610. X  if newpriv > oldpriv then begin
  611. X     write ('You have now follow privileges: ');
  612. X     list_privileges(newpriv);
  613. X     set_auth_priv(newpriv);
  614. X     set_cur_priv(newpriv);
  615. X  end;
  616. X
  617. X  anint := tmp;
  618. Xend; `123 newlevel `125
  619. X
  620. Xprocedure prevlevel `123 (oldlev,newlev: integer) `125;
  621. Xvar newpriv,oldpriv: unsigned;
  622. X    tmp: intrec;
  623. X    sum: unsigned;
  624. X    i: integer;
  625. Xbegin
  626. X  tmp := anint;
  627. X  writeln ('You are now only ',leveltable`091newlev`093.name,'.');
  628. X
  629. X  `123 health `125
  630. X  myhealth := leveltable`091newlev`093.health * 7 div 10;
  631. X  getint(N_HEALTH);`009
  632. X  anint.int`091mylog`093 := myhealth;
  633. X  putint;`009
  634. X  getroom;
  635. X  here.people`091myslot`093.health := myhealth;
  636. X  putroom;
  637. X
  638. X  `123 privileges `125
  639. X  getint(N_PRIVILEGES);
  640. X  freeint;
  641. X  oldpriv := anint.int`091mylog`093;
  642. X
  643. X  sum := 0;
  644. X  for i := newlev+1 to oldlev do sum := uor(sum,leveltable`091i`093.priv);
  645. X  newpriv := uand(oldpriv,unot(sum));
  646. X  getint(N_PRIVILEGES);
  647. X  anint.int`091mylog`093 := int(newpriv);
  648. X  putint;
  649. X
  650. X  if newpriv < oldpriv then begin
  651. X     writeln('You have lost some privileges.');
  652. X     set_auth_priv(newpriv);
  653. X  end;
  654. X  anint := tmp;
  655. Xend; `123 prevlevel `125
  656. X
  657. Xprocedure show_noises(n: integer);
  658. Xbegin
  659. X`009if n < 33 then
  660. X`009`009writeln('There are strange noises coming from behind you.')
  661. X`009else if n < 66 then
  662. X`009`009writeln('You hear strange rustling noises behind you.')
  663. X`009else
  664. X`009`009writeln('There are faint noises coming from behind you.');
  665. Xend;
  666. X
  667. X
  668. Xprocedure show_altnoise(n: integer);
  669. Xbegin
  670. X`009if n < 33 then
  671. X`009`009writeln('A chill wind blows, ruffling your clothes and chilling your
  672. V bones.')
  673. X`009else if n < 66 then
  674. X`009`009writeln('Muffled scuffling sounds can be heard behind you.')
  675. X`009else
  676. X`009`009writeln('A loud crash can be heard in the distance.');
  677. Xend;
  678. X
  679. Xprocedure show_midnight(n: integer;var printed: boolean);
  680. Xbegin
  681. X`009if midnight_notyet then begin
  682. X`009`009if n < 50 then begin
  683. X`009`009`009writeln('A voice booms out of the air from all around you!');
  684. X`009`009`009writeln('The voice says,  " It is now midnight. "');
  685. X`009`009end else begin
  686. X`009`009`009writeln('You hear a clock chiming in the distance.');
  687. X`009`009`009writeln('It rings twelve times for midnight.');
  688. X`009`009end;
  689. X`009`009midnight_notyet := false;
  690. X`009end else
  691. X`009`009printed := false;
  692. Xend;
  693. X
  694. Xprocedure low_experience (amount: integer);
  695. Xvar prev,nlevel: integer;
  696. X    tmp: intrec;
  697. XBegin
  698. X  prev := level(myexperience);
  699. X  if myexperience >= protect_exp then `123 Protected `125
  700. X  else if myexperience - amount > 0 then
  701. X     myexperience := myexperience - amount
  702. X  else myexperience := 0;
  703. X  tmp := anint;
  704. X  getint (N_EXPERIENCE);
  705. X  anint.int`091mylog`093 := myexperience;
  706. X  putint;
  707. X  anint := tmp;
  708. X
  709. X  getroom;`009`009`123 write experience also to here `125
  710. X  here.people`091myslot`093.experience := myexperience;
  711. X  putroom;
  712. X  inmem := true;`009`123 right 'here' IS in memory `125
  713. X
  714. X  nlevel := level(myexperience);
  715. X  if nlevel < prev then prevlevel(prev,nlevel);
  716. XEnd;    `032
  717. X
  718. XProcedure add_experience (amount: integer); `123 hurtta@finuh `125
  719. Xvar prev,nlevel: integer;
  720. X    tmp: intrec;
  721. XBegin
  722. X  prev := level(myexperience);
  723. X  if myexperience > maxexperience then `123 Monster Manager `125
  724. X  else if myexperience + amount < maxexperience then
  725. X     myexperience := myexperience + amount
  726. X  else myexperience := maxexperience;
  727. X  tmp := anint;
  728. X  getint (N_EXPERIENCE);
  729. X  anint.int`091mylog`093 := myexperience;
  730. X  putint;
  731. X  anint := tmp;
  732. X
  733. X  getroom;`009`009`123 write experience also to here `125
  734. X  here.people`091myslot`093.experience := myexperience;
  735. X  putroom;
  736. X  inmem := true;`009`123 right 'here' IS in memory `125
  737. X
  738. X  nlevel := level(myexperience);
  739. X  if nlevel > prev then newlevel(prev,nlevel);
  740. XEnd;    `032
  741. X
  742. XProcedure p_getattack (att: String; mess: Integer);
  743. Xbegin
  744. X  if (mess = 0) or (mess = DEFAULT_LINE) Then
  745. X    WriteLn (Att,' attacks you.')
  746. X  else block_subs(mess,att)
  747. Xend;
  748. X
  749. XProcedure p_viewattack (att: String; mess: Integer);
  750. Xbegin                        `032
  751. X  if (mess = 0) or (mess = DEFAULT_LINE) Then
  752. X    WriteLn (Att,' attacks someone.')
  753. X  else block_subs(mess,att)
  754. Xend;
  755. X
  756. XProcedure get_hideattack (attacker,victim,weapon:integer);
  757. Xvar objtemp: objectrec;
  758. X    ath: string;`032
  759. X    power: Integer;
  760. Xbegin`032
  761. X  objtemp := obj; `123 is this necessary ? `125
  762. X
  763. X  getobj (weapon);`032
  764. X  freeobj;        `032
  765. X `032
  766. X  if here.people`091attacker`093.experience > (rnd100 * 3) then           `0
  767. V32
  768. X    power := obj.ap + 3    `123 <<<<< `125
  769. X  else power := obj.ap +1; `123 Ha Ha `125
  770. X
  771. X  ath := here.people`091attacker`093.name; `032
  772. X  if victim = myslot then begin `123 oh `125
  773. X`009Writeln (ath,' jumps from shadows and ...');
  774. X`009p_getattack (ath,obj.d1);
  775. X        take_hit (power,attacker);
  776. X  end else begin
  777. X`009Writeln (ath,' jumps from shadow and ...');
  778. X`009p_viewattack(ath,obj.d2);
  779. X  end;  `032
  780. X                `032
  781. X`123 relic, but not harmful `125`009`009ping_answered := true;
  782. X`009`009`009`009`009healthcycle := 0;
  783. X
  784. X  obj := objtemp;
  785. Xend;
  786. X
  787. XProcedure get_attack (attacker,victim,weapon:integer);
  788. Xvar objtemp: objectrec;
  789. X    ath: string;`032
  790. X    power: Integer;
  791. Xbegin    `032
  792. X  objtemp := obj; `123 is this necessary ? `125
  793. X
  794. X  getobj (weapon);`032
  795. X  freeobj;       `032
  796. X `032
  797. X  if here.people`091attacker`093.experience > (rnd100 * 10) then
  798. X    power := obj.ap + 1
  799. X  else power := obj.ap;
  800. X  ath := here.people`091attacker`093.name;
  801. X  if victim = myslot then begin `123 oh `125
  802. X`009p_getattack (ath,obj.d1);
  803. X        take_hit (power ,attacker);
  804. X  end else begin
  805. X`009p_viewattack(ath,obj.d2);
  806. X  end;  `032
  807. X                    `032
  808. X`123 relic, but not harmful `125`009`009ping_answered := true;
  809. X`009`009`009`009`009healthcycle := 0;
  810. X
  811. X  obj := objtemp;`032
  812. Xend;
  813. X
  814. Xprocedure see_trap (victim,message: integer; object: string);
  815. Xvar`009name: string;                                     `032
  816. Xbegin
  817. X`009name := here.people`091victim`093.name;
  818. X`009if message <> 0 then
  819. X`009`009if message = DEFAULT_LINE then
  820. X`009`009`009Writeln (name,' tries to get ',object,', but ',object,
  821. X`009`009`009`009' bites ',name,' !')
  822. X`009`009else block_subs (message,name);
  823. Xend;
  824. X`009
  825. Xprocedure handle_event(var printed: boolean);
  826. Xvar
  827. X`009n,send,act,targ,p: integer;
  828. X`009s: string;
  829. X`009sendname: string;
  830. X`009tmp: objectrec;
  831. X`009tmp2: intrec;
  832. X`009wear: integer;
  833. Xbegin
  834. X`009`123 WARNING ! myslot (and sometimes mylog ) is 0 during log_ping
  835. X`009    and login password `125
  836. X
  837. X`009printed := true;
  838. X`009if debug then
  839. X`009`009writeln('%handling event ',myevent);
  840. X`009with event.evnt`091myevent`093 do begin
  841. X`009`009send := sender;
  842. X`009`009act := action;
  843. X                targ := target;
  844. X`009`009p := parm;
  845. X`009`009s := msg;
  846. X`009end;
  847. X`009if ((send <> 0) and`032
  848. X`009    ( not ((act=E_DIED) or (act=E_ANNOUNCE)
  849. X`009`009 or (act=E_GLOBAL_CHANGE)))) then begin
  850. X`009`009tmp := obj;
  851. X`009`009sendname := here.people`091send`093.name;
  852. X`009`009wear := here.people`091send`093.wearing;
  853. X`009`009if wear > 0 then begin
  854. X`009`009`009getobj(wear);
  855. X`009`009`009freeobj;
  856. X`009`009`009if obj.kind = O_DISGUISE then sendname := 'Someone';
  857. X`009`009end;
  858. X`009`009obj := tmp;
  859. X`009end else
  860. X`009`009sendname := 'Unknown';
  861. X
  862. X
  863. X`009case act of
  864. X`009`009E_SUMMON: begin
  865. X`009`009`009    if (send > 0) and (targ = myslot) then begin
  866. X`009`009`009`009tmp2 := anint; `123 is this necessary ? `125
  867. X`009`009`009`009getint(N_SPELL);
  868. X`009`009`009`009freeint;
  869. X`009`009`009`009getspell_name;
  870. X`009`009`009`009freespell_name;
  871. X`009`009`009`009writeln(sendname,' summons ',
  872. X`009`009`009`009    spell_name.idents`091p`093,' to you.');
  873. X`009`009`009`009printed := run_monster('',anint.int`091p`093,
  874. X`009`009`009`009    'summon', '','',
  875. X`009`009`009`009    sysdate + ' ' + systime,
  876. X`009`009`009`009    spell_name.idents`091p`093,
  877. X`009`009`009`009    here.people`091send`093.name);
  878. X`009`009`009`009anint := tmp2;
  879. X`009`009`009    end else begin
  880. X`009`009`009`009getspell_name;
  881. X`009`009`009`009freespell_name;
  882. X`009`009`009`009writeln(sendname,' summons ',
  883. X`009`009`009`009    spell_name.idents`091p`093,' to someone.');
  884. X`009`009`009`009end;
  885. X`009`009`009end;
  886. X                E_SUBMIT: begin
  887. X`009`009`009`009get_submit(targ,s,p);
  888. X`009`009`009`009printed := false;
  889. X`009`009`009end;
  890. X`009`009E_EXIT: begin
  891. X`009`009`009`009if here.exits`091targ`093.goin = DEFAULT_LINE then
  892. X`009`009`009`009`009writeln(s,' has gone ',direct`091targ`093,'.')
  893. X`009`009`009`009else if (here.exits`091targ`093.goin <> 0) and
  894. X`009`009`009`009(here.exits`091targ`093.goin <> DEFAULT_LINE) then begin
  895. X`009`009`009`009`009block_subs(here.exits`091targ`093.goin,s);
  896. X`009`009`009`009end else
  897. X`009`009`009`009`009printed := false;
  898. X`009`009`009end;
  899. X`009`009E_ENTER: begin
  900. X`009`009`009`009if here.exits`091targ`093.comeout = DEFAULT_LINE then
  901. X`009`009`009`009`009writeln(s,' has come into the room from: ',direct`091tar
  902. Vg`093)
  903. X`009`009`009`009else if (here.exits`091targ`093.comeout <> 0) and
  904. X`009`009`009`009(here.exits`091targ`093.comeout <> DEFAULT_LINE) then begin
  905. X`009`009`009`009`009block_subs(here.exits`091targ`093.comeout,s);
  906. X`009`009`009`009end else
  907. X`009`009`009`009`009printed := false;
  908. X`009`009`009end;
  909. X`009`009E_BEGIN:writeln(s,' appears in a brilliant burst of multicolored lig
  910. Vht.');
  911. X`009`009E_QUIT:writeln(s,' vanishes in a brilliant burst of multicolored lig
  912. Vht.');
  913. X`009`009E_SAY: begin
  914. X`009`009`009if length(s) + length(sendname) > 73 then begin
  915. X`009`009`009`009writeln(sendname,' says,');
  916. X`009`009`009`009writeln('"',s,'"');
  917. X`009`009`009end else begin
  918. X`009`009`009`009if (rnd100 < 50) or (length(s) > 50) then
  919. X`009`009`009`009`009writeln(sendname,': "',s,'"')
  920. X`009`009`009`009else
  921. X`009`009`009`009`009writeln(sendname,' says, "',s,'"');
  922. X`009`009`009end;
  923. X`009`009       end;
  924. X`009`009E_HIDESAY: begin
  925. X`009`009`009`009writeln('An unidentified voice speaks to you:');
  926. X`009`009`009`009writeln('"',s,'"');
  927. X`009`009`009   end;
  928. X`009`009E_SETNAM: writeln(s);
  929. X`009`009E_POOFIN: writeln('In an explosion of orange smoke ',s,' poofs into
  930. V the room.');
  931. X`009`009E_POOFOUT: writeln(s,' vanishes from the room in a cloud of orange s
  932. Vmoke.');
  933. X`009`009E_DETACH: begin
  934. X`009`009`009`009writeln(s,' has destroyed the exit ',direct`091targ`093,'.')
  935. V;
  936. X`009`009`009  end;
  937. X`009`009E_EDITDONE:begin
  938. X`009`009`009`009writeln(sendname,' is done editing the room description.');
  939. X`009`009`009   end;
  940. X`009`009E_NEWEXIT: begin
  941. X`009`009`009`009writeln(s,' has created an exit here.');
  942. X`009`009`009   end;
  943. X`009`009E_CUSTDONE:begin
  944. X`009`009`009`009writeln(sendname,' is done customizing an exit here.');
  945. X`009`009`009   end;
  946. X`009`009E_SEARCH: writeln(sendname,' seems to be looking for something.');
  947. X`009`009E_FOUND: writeln(sendname,' appears to have found something.');
  948. X`009`009E_DONEDET:begin
  949. X`009`009`009`009writeln(sendname,' is done adding details to the room.');
  950. X`009`009`009  end;
  951. X`009`009E_ROOMDONE: begin
  952. X`009`009`009`009writeln(sendname,' is finished customizing this room.');
  953. X`009`009`009    end;
  954. X`009`009E_OBJDONE: begin
  955. X`009`009`009`009writeln(sendname,' is finished customizing an object.');
  956. X`009`009`009   end;
  957. X`009`009E_UNHIDE:writeln(sendname,' has stepped out of the shadows.');
  958. X`009`009E_FOUNDYOU: begin
  959. X`009`009`009`009if targ = myslot then begin `123 found me! `125
  960. X`009`009`009`009`009writeln('You''ve been discovered by ',sendname,'!');
  961. X`009`009`009`009`009hiding := false;
  962. X`009`009`009`009`009getroom;
  963. X`123 they're not hidden anymore `125`009`009here.people`091myslot`093.hiding
  964. V := 0;
  965. X`009`009`009`009`009putroom;
  966. X`009`009`009`009end else
  967. X`009`009`009`009`009writeln(sendname,' has found ',here.people`091targ`093.n
  968. Vame,' hiding in the shadows!');
  969. X`009`009`009    end;
  970. X`009`009E_PUNCH: begin
  971. X`009`009`009`009if targ = myslot then begin `123 punched me! `125
  972. X`009`009`009`009`009get_punch(p,sendname);
  973. X`009`009`009`009`009take_hit( punch_force(p),send );
  974. X`123 relic, but not harmful `125`009`009ping_answered := true;
  975. X`009`009`009`009`009healthcycle := 0;
  976. X`009`009`009`009end else
  977. X`009`009`009`009`009view_punch(sendname,here.people`091targ`093.name,p);
  978. X`009`009`009 end;
  979. X`009`009E_MADEOBJ: writeln(s);
  980. X`009`009E_GET: writeln(s);
  981. X`009`009E_DROP: begin
  982. X`009`009`009`009writeln(s);
  983. X`009`009`009`009if here.objdesc <> 0 then
  984. X`009`009`009`009`009print_subs(here.objdesc,obj_part(p));
  985. X`009`009`009end;
  986. X`009`009E_BOUNCEDIN: begin
  987. X`009`009`009`009if (targ = 0) or (targ = DEFAULT_LINE) then
  988. X`009`009`009`009`009writeln(obj_part(p),' has bounced into the room.')
  989. X`009`009`009`009else begin
  990. X`009`009`009`009`009print_subs(targ,obj_part(p));
  991. X`009`009`009`009end;
  992. X`009`009`009     end;
  993. X`009`009E_DROPALL: writeln('Some objects drop to the ground.');
  994. X`009`009E_EXAMINE: writeln(s);
  995. X`009`009E_IHID: writeln(sendname,' has hidden in the shadows.');
  996. X`009`009E_NOISES: begin
  997. X`009`009`009`009if (here.rndmsg = 0) or
  998. X`009`009`009`009   (here.rndmsg = DEFAULT_LINE) then begin
  999. X`009`009`009`009`009show_noises(rnd100);
  1000. X`009`009`009`009end else
  1001. X`009`009`009`009`009print_line(here.rndmsg);
  1002. X`009`009`009  end;
  1003. X`009`009E_ALTNOISE: begin
  1004. X`009`009`009`009if (here.xmsg2 = 0) or
  1005. X`009`009`009`009   (here.xmsg2 = DEFAULT_LINE) then
  1006. X`009`009`009`009`009show_altnoise(rnd100)
  1007. X`009`009`009`009else
  1008. X`009`009`009`009`009block_subs(here.xmsg2,myname);
  1009. X`009`009`009    end;
  1010. X`009`009E_REALNOISE: show_noises(rnd100);
  1011. X`009`009E_HIDOBJ: writeln(sendname,' has hidden the ',s,'.');
  1012. X`009`009E_PING: begin
  1013. X`009`009`009`009if targ = myslot then begin
  1014. X`009`009`009`009`009writeln(sendname,' is trying to ping you.');
  1015. X`009`009`009`009`009log_event(myslot,E_PONG,send,0);
  1016. X`009`009`009`009end else
  1017. X`009`009`009`009`009writeln(sendname,' is pinging ',here.people`091targ`093.
  1018. Vname,'.');
  1019. X`009`009`009end;
  1020. X`009`009E_PONG: begin
  1021. X`009`009`009`009ping_answered := true;
  1022. X`009`009`009end;
  1023. X`009`009E_HIDEPUNCH: begin
  1024. X`009`009`009`009if targ = myslot then begin
  1025. X`009`009`009`009`009writeln(sendname,' pounces on you from the shadows!');
  1026. X`009`009`009`009`009take_hit(2,send);
  1027. X`009`009`009`009end else begin
  1028. X`009`009`009`009`009writeln(sendname,' jumps out of the shadows and attacks
  1029. V ',here.people`091targ`093.name,'.');
  1030. X`009`009`009`009end;
  1031. X`009`009`009     end;
  1032. X`009`009E_SLIPPED: begin
  1033. X`009`009`009`009writeln('The ',s,' has slipped from ',
  1034. X`009`009`009`009`009sendname,'''s hands.');
  1035. X`009`009`009   end;
  1036. X`009`009E_HPOOFOUT:begin
  1037. X`009`009`009`009if rnd100 > 50 then
  1038. X`009`009`009`009`009writeln('Great wisps of orange smoke drift out of the sh
  1039. Vadows.')
  1040. X`009`009`009`009else
  1041. X`009`009`009`009`009printed := false;
  1042. X`009`009`009   end;
  1043. X`009`009E_HPOOFIN:begin
  1044. X`009`009`009`009if rnd100 > 50 then
  1045. X`009`009`009`009`009writeln('Some wisps of orange smoke drift about in the s
  1046. Vhadows.')
  1047. X`009`009`009`009else
  1048. X`009`009`009`009`009printed := false;
  1049. X`009`009`009  end;
  1050. X`009`009E_FAILGO: begin
  1051. X`009`009`009`009if targ > 0 then begin
  1052. X`009`009`009`009`009write(sendname,' has failed to go ');
  1053. X`009`009`009`009`009writeln(direct`091targ`093,'.');
  1054. X`009`009`009`009end;
  1055. X`009`009`009  end;
  1056. X`009`009E_TRYPUNCH: begin
  1057. X`009`009`009`009if targ = myslot then
  1058. X`009`009`009`009`009writeln(sendname,' fails to punch you.')
  1059. X`009`009`009`009else
  1060. X`009`009`009`009`009writeln(sendname,' fails to punch ',here.people`091targ`
  1061. V093.name,'.');
  1062. X`009`009`009    end;
  1063. X`009`009E_PINGONE:begin
  1064. X`009`009`009`009if targ = myslot then begin `123 ohoh---pinged away `125
  1065. X`009`009`009`009`009writeln('The Monster program regrets to inform you that
  1066. V a destructive ping has');
  1067. X`009`009`009`009`009writeln('destroyed your existence.  Please accept our ap
  1068. Vologies.');
  1069. X`009`009`009`009`009finish_interpreter;
  1070. X`009`009`009`009`009halt; `123 uggg `125
  1071. X`009`009`009`009end else
  1072. X`009`009`009`009`009writeln(s,' shimmers and vanishes from sight.');
  1073. X`009`009`009  end;
  1074. X`009`009E_CLAIM: writeln(sendname,' has claimed this room.');
  1075. X`009`009E_DISOWN: writeln(sendname,' has disowned this room.');
  1076. X`009`009E_WEAKER: begin
  1077. X`123`009`009`009`009inmem := false;
  1078. X`009`009`009`009gethere;`009`009`125
  1079. X
  1080. X`009`009`009`009here.people`091send`093.health := targ;
  1081. X
  1082. X`123 This is a hack for efficiency so we don't read the room record twice;
  1083. X  we need the current data now for desc_health, but checkevents, our caller,
  1084. X  is about to re-read it anyway; we make an incremental fix here so desc_hea
  1085. Vlth
  1086. X  is happy, then checkevents will do the real read later `125
  1087. X
  1088. X`009`009`009`009desc_health(send);
  1089. X`009`009`009  end;
  1090. X`009`009E_SCAN: writeln(sendname,' scans some object from universe.');
  1091. X`009`009E_RESET: writeln(sendname,' has moved ',s,' to home position.');
  1092. X`009`009E_OBJCLAIM: writeln(sendname,' is now the owner of the ',s,'.');
  1093. X`009`009E_OBJDISOWN: writeln(sendname,' has disowned the ',s,'.');
  1094. X`009`009E_SELFDONE: writeln(sendname,'''s self-description is finished.');
  1095. X`009`009E_WHISPER: begin
  1096. X`009`009`009`009if targ = myslot then begin
  1097. X`009`009`009`009`009if length(s) < 39 then
  1098. X`009`009`009`009`009`009writeln(sendname,' whispers to you, "',s,'"')
  1099. X`009`009`009`009`009else begin
  1100. X`009`009`009`009`009`009writeln(sendname,' whispers something to you:');
  1101. X`009`009`009`009`009`009write(sendname,' whispers, ');
  1102. X`009`009`009`009`009`009if length(s) > 50 then
  1103. X`009`009`009`009`009`009`009writeln;
  1104. X`009`009`009`009`009`009writeln('"',s,'"');
  1105. X`009`009`009`009`009end;
  1106. X`009`009`009`009end else if (manager_priv) or (rnd100 > 85) then begin `123
  1107. V minor change by leino@finuha `125
  1108. X`009`009`009`009`009writeln('You overhear ',sendname,' whispering to ',here.
  1109. Vpeople`091targ`093.name,'!');
  1110. X`009`009`009`009`009write(sendname,' whispers, ');
  1111. X`009`009`009`009`009if length(s) > 50 then
  1112. X`009`009`009`009`009`009writeln;
  1113. X`009`009`009`009`009writeln('"',s,'"');
  1114. X`009`009`009`009end else
  1115. X`009`009`009`009`009writeln(sendname,' is whispering to ',here.people`091tar
  1116. Vg`093.name,'.');
  1117. X`009`009`009   end;
  1118. X`009`009E_WIELD: writeln(sendname,' is now wielding the ',s,'.');
  1119. X`009`009E_UNWIELD: writeln(sendname,' is no longer wielding the ',s,'.');
  1120. X`009`009E_WEAR: writeln(sendname,' is now wearing the ',s,'.');
  1121. X`009`009E_UNWEAR: writeln(sendname,' has taken off the ',s,'.');
  1122. X`009`009E_DONECRYSTALUSE: begin
  1123. X`009`009`009`009`009writeln(sendname,' emerges from the glow of the crystal.
  1124. V');
  1125. X`009`009`009`009`009writeln('The orb becomes dark.');
  1126. X`009`009`009`009  end;
  1127. X`009`009E_DESTROY: writeln(s);
  1128. X`009`009E_OBJPUBLIC: writeln('The ',s,' is now public.');
  1129. X`009`009E_SYSDONE: writeln(sendname,' is no longer in system maintenance mod
  1130. Ve.');
  1131. X`009`009E_UNMAKE: writeln(sendname,' has unmade ',s,'.');
  1132. X`009`009E_LOOKDETAIL: writeln(sendname,' is looking at the ',s,'.');
  1133. X`009`009E_LOOKAROUND: writeln(sendname,' is looking around here.');
  1134. X`009`009E_NEWLEVEL: writeln(sendname,' is now ',s,'.');
  1135. X`009`009E_ACCEPT: writeln(sendname,' has accepted an exit here.');
  1136. X`009`009E_REFUSE: writeln(sendname,' has refused an Accept here.');
  1137. X`009`009E_DIED: writeln(s,' expires and vanishes in a cloud of greasy black
  1138. V smoke.');
  1139. X`009`009E_LOOKYOU: begin
  1140. X`009`009`009`009if targ = myslot then begin
  1141. X`009`009`009`009`009writeln(sendname,' is looking at you.')
  1142. X`009`009`009`009end else
  1143. X`009`009`009`009`009writeln(sendname,' looks at ',here.people`091targ`093.na
  1144. Vme,'.');
  1145. X`009`009`009   end;
  1146. X`009`009E_LOOKSELF: writeln(sendname,' is making a self-appraisal.');
  1147. X`009`009E_FAILGET: writeln(sendname,' fails to get ',obj_part(targ),'.');
  1148. X`009`009E_FAILUSE: writeln(sendname,' fails to use ',obj_part(targ),'.');
  1149. X`009`009E_CHILL: if (targ = 0) or (targ = DEFAULT_LINE) then
  1150. X`009`009`009`009writeln('A chill wind blows over you.')
  1151. X`009`009`009 else
  1152. X`009`009`009`009print_desc(targ);
  1153. X`009`009E_NOISE2:begin
  1154. X`009`009`009`009case targ of
  1155. X`009`009`009`009`0091: writeln('Strange, guttural noises sound from everywhe
  1156. Vre.');
  1157. X`009`009`009`009`0092: writeln('A chill wind blows past you, almost whisperi
  1158. Vng as it ruffles your clothes.');
  1159. X`009`009`009`009`0093: writeln('Muffled voices speak to you from the air!');
  1160. X`009`009`009`009`0094: writeln('The air vibrates with a chill shudder.');
  1161. X`009`009`009`009`009otherwise begin
  1162. X`009`009`009`009`009`009writeln('An unidentified voice speaks to you:');
  1163. X`009`009`009`009`009`009writeln('"',s,'"');
  1164. X`009`009`009`009`009   end;
  1165. X`009`009`009`009end;
  1166. X`009`009`009 end;
  1167. X`009`009E_INVENT: writeln(sendname,' is taking inventory.');
  1168. X`009`009E_POOFYOU: begin
  1169. X`009`009`009`009if targ = myslot then begin
  1170. X`009`009`009`009`009writeln;
  1171. X`009`009`009`009`009writeln(sendname,' directs a firey burst of bluish energ
  1172. Vy at you!');
  1173. X`009`009`009`009`009writeln('Suddenly, you find yourself hurtling downwards
  1174. V through misty orange clouds.');
  1175. X`009`009`009`009`009writeln('Your descent slows, the smoke clears, and you f
  1176. Vind yourself in a new place...');
  1177. X`009`009`009`009`009xpoof(p);
  1178. X`009`009`009`009`009writeln;
  1179. X`009`009`009`009end else begin
  1180. X`009`009`009`009`009writeln(sendname,' directs a firey burst of energy at ',
  1181. Vhere.people`091targ`093.name,'!');
  1182. X`009`009`009`009`009writeln('A thick burst of orange smoke results, and when
  1183. V it clears, you see');
  1184. X`009`009`009`009`009writeln('that ',here.people`091targ`093.name,' is gone.'
  1185. V);
  1186. X`009`009`009`009end;
  1187. X`009`009`009   end;
  1188. X`009`009E_WHO: begin
  1189. X`009`009`009case p of
  1190. X`009`009`009`0090: writeln(sendname,' produces a "who" list and reads it.');
  1191. X`009`009`009`0091: writeln(sendname,' is seeing who''s playing Monster.');
  1192. X`009`009`009`009otherwise writeln(sendname,' checks the "who" list.');
  1193. X`009`009`009end;
  1194. X`009`009       end;
  1195. X`009`009E_PLAYERS:begin
  1196. X`009`009`009`009writeln(sendname,' checks the "players" list.');
  1197. X`009`009`009  end;
  1198. X`009`009E_VIEWSELF: writeln(sendname,' is reading ',s,'''s self-description.
  1199. V');
  1200. X`009  `009E_MIDNIGHT: show_midnight(targ,printed);
  1201. X                E_DCLDONE: writeln(sendname,' is no longer in dcl-level.');
  1202. X                E_ADDEXPERIENCE: begin
  1203. X                                   if targ = myslot then add_experience(p)
  1204. X                                   else `123 some message ? `125
  1205. X                                 end;
  1206. X                E_HATTACK: get_hideattack (send,targ,p);
  1207. X`009`009E_ATTACK: get_attack (send,targ,p);
  1208. X`009`009E_TRAP: see_trap (send,p,s);
  1209. X                E_ERASE: writeln (sendname,' is destroying monster here.');
  1210. X                E_MONSTERDONE: writeln(sendname,' is done customizing monste
  1211. Vr.');
  1212. X                E_SPELLDONE: writeln(sendname,' is done customizing spell.')
  1213. V;
  1214. X`009`009E_BROADCAST: writeln(s); `123 NPC broadcasting `125
  1215. X
  1216. X`009`009E_ATMOSPHERE: writeln(s); `123 s.c. atmosphere command `125
  1217. X
  1218. X
  1219. X`009`009E_ACTION:writeln(sendname,' is',desc_action(p,targ));
  1220. X
  1221. X`009`009`123 in that events targ is player's log - NOT player's slot `125
  1222. X`009`009E_KICK_OUT: begin
  1223. X`009`009    if targ = mylog then begin
  1224. X`009`009`009if s > '' then writeln(s)
  1225. X`009`009`009else writeln('System throw you out from Monster.');
  1226. X`009`009`009quit_monster; `123 generate eof `125
  1227. X`009`009    end else begin
  1228. X`009`009`009getpers;
  1229. X`009`009`009freepers;
  1230. X`009`009`009writeln('System throw ',pers.idents`091targ`093,
  1231. X`009`009`009    ' out from Monster.');
  1232. X`009`009    end;
  1233. X`009`009end;
  1234. X`009`009E_ANNOUNCE: if (((targ=0) and (p=0)) `123For all`125 or
  1235. X`009`009`009`009(targ=mylog) `123For me`125`032
  1236. X`009`009`009`009`123or (p=md_grp)`125 )  `123My group`125
  1237. X`009`009`009    then writeln(s)
  1238. X`009`009`009    else printed:=false;
  1239. X`009`009E_SHUTDOWN: if manager_priv then writeln('SHUTDOWN: ',s)
  1240. X`009`009`009    else begin
  1241. X`009`009`009`009writeln('MONSTER SHUTDOWN: ',s);
  1242. X`009`009`009`009quit_monster;
  1243. X`009`009`009    end;
  1244. X`009`009E_GLOBAL_CHANGE: begin
  1245. X`009`009    if s <> '' then writeln(s)
  1246. X`009`009    else if manager_priv then writeln
  1247. X`009`009`009('Global flags are changed.')
  1248. X`009`009    else printed := false;
  1249. X`009`009    read_global := true; `123 need read `125
  1250. X`009`009end;
  1251. X
  1252. X`009`009otherwise writeln('*** Bad Event ***');
  1253. X`009end;
  1254. Xend;
  1255. X
  1256. X
  1257. X`091global`093
  1258. Xprocedure checkevents(silent: boolean := false);
  1259. Xvar
  1260. X`009gotone: boolean;
  1261. X`009tmp,printed: boolean;
  1262. X
  1263. Xbegin
  1264. X`123 if not starting then begin `125
  1265. X`009getevent;
  1266. X`009freeevent;
  1267. X
  1268. X`009event := eventfile`094;
  1269. X`009gotone := false;
  1270. X`009printed := false;
  1271. X`009while myevent <> event.point do begin
  1272. X`009`009myevent := myevent + 1;
  1273. X`009`009if myevent > maxevent then
  1274. X`009`009`009myevent := 1;
  1275. X
  1276. X`009`009if debug then begin
  1277. X`009`009`009writeln('%checking event ',myevent);
  1278. X`009`009`009if event.evnt`091myevent`093.loc = location then
  1279. X`009`009`009`009writeln('  - event here')
  1280. X`009`009`009else
  1281. X`009`009`009`009writeln('  - event elsewhere');
  1282. X`009`009`009writeln('  - event number = ',event.evnt`091myevent`093.action:1
  1283. V);
  1284. X`009`009end;
  1285. X
  1286. X`009`009if (event.evnt`091myevent`093.loc = location) or
  1287. X`009`009   (event.evnt`091myevent`093.action = E_ANNOUNCE) or
  1288. X`009`009   (event.evnt`091myevent`093.action = E_SHUTDOWN) or`032
  1289. +-+-+-+-+-+-+-+-  END  OF PART 17 +-+-+-+-+-+-+-+-
  1290.