home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part09 < prev    next >
Internet Message Format  |  1992-08-02  |  44KB

  1. Path: uunet!mcsun!fuug!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 09/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.001827.3836@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 00:18:27 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1272
  12.  
  13. Archieve-name: monster_helsinki_104/part09
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 09/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 9 -+-+-+-+-+-+-+-+
  20. X`009`009`0090: writeln('Only the primary description will print');
  21. X`009`009`0091: writeln('Only the secondary description will print');
  22. X`009`009`0092: writeln('Both the primary and secondary descriptions will pri
  23. Vnt');
  24. X`009`009`0093: begin
  25. X`009`009`009`009writeln('The primary description will print, followed by the
  26. V seconary description');
  27. X`009`009`009`009writeln('if the player is holding the magic object');
  28. X`009`009`009   end;
  29. X`009`009`0094: begin
  30. X`009`009`009`009writeln('If the player is holding the magic object, the seco
  31. Vndary description will print');
  32. X`009`009`009`009writeln('Otherwise, the primary description will print');
  33. X`009`009`009   end;
  34. X`009`009`009otherwise writeln('The way the room description prints is damage
  35. Vd');
  36. X`009`009end;
  37. X
  38. X`009`009writeln;
  39. X`009`009if magicobj = 0 then
  40. X`009`009`009writeln('There is no magic object for this room')
  41. X`009`009else
  42. X`009`009`009writeln('The magic object for this room is the ',objnam.idents`0
  43. V91magicobj`093,'.');
  44. X
  45. X`009`009if objdrop = 0 then
  46. X`009`009`009writeln('Dropped objects remain here')
  47. X`009`009else begin
  48. X`009`009`009writeln('Dropped objects go to ',nam.idents`091objdrop`093,'.');
  49. X`009`009`009if objdesc = 0 then
  50. X`009`009`009`009writeln('Dropped.')
  51. X`009`009`009else
  52. X`009`009`009`009print_line(objdesc);
  53. X`009`009`009if objdest = 0 then
  54. X`009`009`009`009writeln('Nothing is printed when object "bounces in" to targ
  55. Vet room')
  56. X`009`009`009else
  57. X`009`009`009`009print_line(objdest);
  58. X`009`009end;
  59. X`009`009writeln;
  60. X`009`009if trapto = 0 then
  61. X`009`009`009writeln('There is no trapdoor set')
  62. X`009`009else
  63. X`009`009`009writeln('The trapdoor sends players ',direct`091trapto`093,
  64. X`009`009`009`009' with a chance factor of ',trapchance:1,'%');
  65. X
  66. X`009`009if hook > 0 then writeln ('There is a hook in this room.');
  67. X`009`009for i := 1 to maxdetail do begin
  68. X`009`009`009if length(detail`091i`093) > 0 then begin
  69. X`009`009`009`009write('Detail "',detail`091i`093,'" ');
  70. X`009`009`009`009if detaildesc`091i`093 > 0 then
  71. X`009`009`009`009`009writeln('has a description')
  72. X`009`009`009`009else
  73. X`009`009`009`009`009writeln('has no description');
  74. X`009`009`009end;
  75. X`009`009end;
  76. X`009`009writeln;
  77. X`009end;
  78. Xend;
  79. X
  80. X
  81. X`091global`093 procedure custom_room;
  82. Xlabel exit_label;
  83. Xvar
  84. X`009done: boolean;
  85. X`009prompt,param: string;
  86. X`009n: integer;
  87. X`009s: string;
  88. X`009newdsc: integer;
  89. X`009bool: boolean;
  90. X`009prevloc: integer;
  91. X
  92. X    procedure leave;
  93. X    begin
  94. X`009writeln('EXIT - no changes.');
  95. X`009goto exit_label;
  96. X    end;
  97. X
  98. X
  99. Xbegin
  100. X`009log_action(e_custroom,0);
  101. X`009writeln;
  102. X`009writeln('Customizing this room');
  103. X`009writeln('If you would rather be customizing an exit, type CUSTOM <direct
  104. Vion of exit>');
  105. X`009writeln('If you would rather be customizing an object, type CUSTOM <obje
  106. Vct name>');
  107. X`009writeln;
  108. X`009done := false;
  109. X`009prompt := 'Custom> ';
  110. X
  111. X`009repeat
  112. X`009`009repeat
  113. X`009`009`009grab_line(prompt,s,eof_handler := leave);
  114. X`009`009`009param := slead(s);
  115. X`009`009`009s := bite(param);
  116. X`009`009until length(s) > 0;`009`009
  117. X`009`009s := lowcase(s);`009`009
  118. X`009`009case s`0911`093 of
  119. X`009`009`009'c': begin
  120. X`009`009`009`009gethere;
  121. X`009`009`009`009n := here.hook;
  122. X`009`009`009`009prevloc := location;
  123. X`009`009`009`009custom_hook(n,here.owner,
  124. X`009`009`009`009    trim_filename(here.nicename));
  125. X`009`009`009`009if (prevloc <> location) then begin
  126. X`009`009`009`009`009writeln('You can no longer customize this room.');
  127. X                                        done := true;
  128. X`009`009`009`009end else begin
  129. X                   `009`009`009getroom;
  130. X`009`009`009`009`009here.hook := n;
  131. X`009`009`009`009`009putroom
  132. X`009`009`009`009end;
  133. X`009`009`009     end;
  134. X`009`009`009'e','q': done := true;
  135. X`009`009`009'?','h': command_help('*room help*');
  136. X`009`009`009'r': do_rename (param);
  137. X`009`009`009'v': view_room;
  138. X`123dir trapdoor goes`125`009't': begin
  139. X`009`009`009`009if param > '' then s := param
  140. X`009`009`009`009else grab_line('What direction does the trapdoor exit throug
  141. Vh? ',
  142. X`009`009`009`009    s,eof_handler := leave);
  143. X`009`009`009`009if length(s) > 0 then begin
  144. X`009`009`009`009`009if lookup_dir(n,s) then begin
  145. X`009`009`009`009`009`009getroom;
  146. X`009`009`009`009`009`009here.trapto := n;
  147. X`009`009`009`009`009`009putroom;
  148. X`009`009`009`009`009`009writeln('Room updated.');
  149. X`009`009`009`009`009end else
  150. X`009`009`009`009`009`009writeln('No such direction.');
  151. X`009`009`009`009end else
  152. X`009`009`009`009`009writeln('No changes.');
  153. X`009`009`009     end;
  154. X`123chance`125`009`009'f': begin
  155. X`009`009`009`009if param > '' then s := param
  156. X`009`009`009`009else begin
  157. X`009`009`009`009`009writeln('Enter the chance that in any given minute the p
  158. Vlayer will fall through');
  159. X`009`009`009`009`009writeln('the trapdoor (0-100) :');
  160. X`009`009`009`009`009writeln;
  161. X`009`009`009`009`009grab_line('? ',s,eof_handler := leave);
  162. X`009`009`009`009end;
  163. X`009`009`009`009if isnum(s) then begin
  164. X`009`009`009`009`009n := number(s);
  165. X`009`009`009`009`009if n in `0910..100`093 then begin
  166. X`009`009`009`009`009`009getroom;
  167. X`009`009`009`009`009`009here.trapchance := n;
  168. X`009`009`009`009`009`009putroom;
  169. X`009`009`009`009`009end else
  170. X`009`009`009`009`009`009writeln('Out of range.');
  171. X`009`009`009`009end else
  172. X`009`009`009`009`009writeln('No changes.');
  173. X`009`009`009     end;
  174. X`009`009`009's': begin
  175. X`009`009`009`009newdsc := here.secondary;
  176. X`009`009`009`009writeln('`091 Editing the secondary room description `093');
  177. X`009`009`009`009if edit_desc(newdsc) then begin
  178. X`009`009`009`009`009getroom;
  179. X`009`009`009`009`009here.secondary := newdsc;
  180. X`009`009`009`009`009putroom;
  181. X`009`009`009`009end;
  182. X`009`009`009     end;
  183. X`009`009`009'i': begin
  184. X`009`009`009`009newdsc := here.exitfail;
  185. X`009`009`009`009writeln('`091 Editing th default exit failure  description `
  186. V093');
  187. X`009`009`009`009if edit_desc(newdsc) then begin
  188. X`009`009`009`009`009getroom;
  189. X`009`009`009`009`009here.exitfail := newdsc;
  190. X`009`009`009`009`009putroom;
  191. X`009`009`009`009end;
  192. X`009`009`009     end;
  193. X`009`009 `009'p': begin
  194. X`123 same as desc `125`009`009newdsc := here.primary;
  195. X`009`009`009`009writeln('`091 Editing the primary room description `093');
  196. X`009`009`009`009if edit_desc(newdsc) then begin
  197. X`009`009`009`009`009getroom;
  198. X`009`009`009`009`009here.primary := newdsc;
  199. X`009`009`009`009`009putroom;
  200. X`009`009`009`009end;
  201. X`009`009`009     end;
  202. X`009`009`009'o': begin
  203. X`009`009`009`009writeln('Enter the line that will be printed when someone dr
  204. Vops an object here:');
  205. X`009`009`009`009writeln('If dropped objects do not stay here, you may use a
  206. V # for the object name.');
  207. X`009`009`009`009writeln('Right now it says:');
  208. X`009`009`009`009if here.objdesc = 0 then
  209. X`009`009`009`009`009writeln('Dropped. `091default`093')
  210. X`009`009`009`009else
  211. X`009`009`009`009`009print_line(here.objdesc);
  212. X
  213. X`009`009`009`009n := here.objdesc;
  214. X`009`009`009`009make_line(n);
  215. X`009`009`009`009getroom;
  216. X`009`009`009`009here.objdesc := n;
  217. X`009`009`009`009putroom;
  218. X`009`009`009     end;
  219. X`009  `009`009'x': begin
  220. X`009`009`009`009writeln('Enter a line that will be randomly shown.');
  221. X`009`009`009`009writeln('Right now it says:');
  222. X`009`009`009`009if here.rndmsg = 0 then
  223. X`009`009`009`009`009writeln('`091none defined`093')
  224. X`009`009`009`009else
  225. X`009`009`009`009`009print_line(here.rndmsg);
  226. X
  227. X`009`009`009`009n := here.rndmsg;
  228. X`009`009`009`009make_line(n);
  229. X`009`009`009`009getroom;
  230. X`009`009`009`009here.rndmsg := n;
  231. X`009`009`009`009putroom;
  232. X`009`009`009     end;
  233. X`123alternate mystery msg`125`009'a': do_y_altmsg;`032
  234. X`123bounced in desc`125`009'b': begin
  235. X`009`009`009`009writeln('Enter the line that will be displayed in the room w
  236. Vhere an object really');
  237. X`009`009`009`009writeln('goes when an object dropped here "bounces" there:')
  238. V;
  239. X`009`009`009`009writeln('Place a # where the object name should go.');
  240. X`009`009`009`009writeln;
  241. X`009`009`009`009writeln('Right now it says:');
  242. X`009`009`009`009if here.objdest = 0 then
  243. X`009`009`009`009`009writeln('Something has bounced into the room.')
  244. X`009`009`009`009else
  245. X`009`009`009`009`009print_line(here.objdest);
  246. X
  247. X`009`009`009`009n := here.objdest;
  248. X`009`009`009`009make_line(n);
  249. X`009`009`009`009getroom;
  250. X`009`009`009`009here.objdest := n;
  251. X`009`009`009`009putroom;
  252. X`009`009`009     end;
  253. X`123visual links`125`009`009'1': do_group1;
  254. X`009`009`009'2': do_group2;
  255. X`009`009`009'm': begin
  256. X`009`009`009`009getobjnam;
  257. X`009`009`009`009freeobjnam;
  258. X`009`009`009`009if param > '' then s := param
  259. X`009`009`009`009else begin
  260. X`009`009`009`009`009if here.magicobj = 0 then
  261. X`009`009`009`009`009`009writeln('There is currently no magic object for this
  262. V room.')
  263. X`009`009`009`009`009else
  264. X`009`009`009`009`009`009writeln(objnam.idents`091here.magicobj`093,
  265. X`009`009`009`009`009`009`009' is currently the magic object for this room.')
  266. V;
  267. X`009`009`009`009`009writeln;
  268. X`009`009`009`009`009grab_line('New magic object? ',s,
  269. X`009`009`009`009`009    eof_handler := leave);
  270. X`009`009`009`009end;
  271. X`009`009`009`009if s = '' then
  272. X`009`009`009`009`009writeln('No changes.')
  273. X`009`009`009`009else if lookup_obj(n,s) then begin
  274. X`009`009`009`009`009getroom;
  275. X`009`009`009`009`009here.magicobj := n;
  276. X`009`009`009`009`009putroom;
  277. X`009`009`009`009`009writeln('Room updated.');
  278. X`009`009`009`009end else
  279. X`009`009`009`009`009writeln('No such object found.');
  280. X`009`009`009     end;
  281. X`009`009`009'g': begin
  282. X`009`009`009`009getnam;
  283. X`009`009`009`009freenam;
  284. X`009`009`009`009if param > '' then s := param
  285. X`009`009`009`009else begin
  286. X`009`009`009`009`009if here.objdrop = 0 then
  287. X`009`009`009`009`009`009writeln('Objects dropped fall here.')
  288. X`009`009`009`009`009else
  289. X`009`009`009`009`009`009writeln('Objects dropped fall in ',nam.idents`091her
  290. Ve.objdrop`093,'.');
  291. X`009`009`009`009`009writeln;
  292. X`009`009`009`009`009writeln('Enter * for `091this room`093:');
  293. X`009`009`009`009`009grab_line('Room dropped objects go to? ',
  294. X`009`009`009`009`009    s,eof_handler := leave);
  295. X`009`009`009`009end;
  296. X`009`009`009`009if s = '' then
  297. X`009`009`009`009`009writeln('No changes.')
  298. X`009`009`009`009else if s = '*' then begin
  299. X`009`009`009`009`009getroom;
  300. X`009`009`009`009`009here.objdrop := 0;
  301. X`009`009`009`009`009putroom;
  302. X`009`009`009`009`009writeln('Room updated.');
  303. X`009`009`009`009end else if lookup_room(n,s) then begin
  304. X`009`009`009`009`009getroom;
  305. X`009`009`009`009`009here.objdrop := n;
  306. X`009`009`009`009`009putroom;
  307. X`009`009`009`009`009writeln('Room updated.');
  308. X`009`009`009`009end else
  309. X`009`009`009`009`009writeln('No such room found.');
  310. X`009`009`009     end;
  311. X`009`009`009'd': begin
  312. X`009`009`009`009writeln('Print room descriptions how?');
  313. X`009`009`009`009writeln;
  314. X`009`009`009`009writeln('0)  Print primary (main) description only `091defau
  315. Vlt`093');
  316. X`009`009`009`009writeln('1)  Print only secondary description.');
  317. X`009`009`009`009writeln('2)  Print both primary and secondary descriptions t
  318. Vogether.');
  319. X`009`009`009`009writeln('3)  Print primary description first; then print sec
  320. Vondary description only if');
  321. X`009`009`009`009writeln('    the player is holding the magic object for this
  322. V room.');
  323. X`009`009`009`009writeln('4)  Print secondary if holding the magic obj; print
  324. V primary otherwise');
  325. X`009`009`009`009writeln;
  326. X`009`009`009`009grab_line('? ',s,eof_handler := leave);
  327. X`009`009`009`009if isnum(s) then begin
  328. X`009`009`009`009`009n := number(s);
  329. X`009`009`009`009`009if n in `0910..4`093 then begin
  330. X`009`009`009`009`009`009getroom;
  331. X`009`009`009`009`009`009here.which := n;
  332. X`009`009`009`009`009`009putroom;
  333. X`009`009`009`009`009`009writeln('Room updated.');
  334. X`009`009`009`009`009end else
  335. X`009`009`009`009`009`009writeln('Out of range.');
  336. X`009`009`009`009end else
  337. X`009`009`009`009`009writeln('No changes.');
  338. X
  339. X`009`009`009     end;
  340. X`009`009`009'n': begin
  341. X`009`009`009`009writeln('How would you like the room name to print?');
  342. X`009`009`009`009writeln;
  343. X`009`009`009`009writeln('0) No room name is shown');
  344. X`009`009`009`009writeln('1) "You''re in ..."');
  345. X`009`009`009`009writeln('2) "You''re at ..."');
  346. X`009`009`009`009writeln('3) "You''re in the ..."');
  347. X`009`009`009`009writeln('4) "You''re at the ..."');
  348. X`009`009`009`009writeln('5) "You''re in a ..."');
  349. X`009`009`009`009writeln('6) "You''re at a ..."');
  350. X`009`009`009`009writeln('7) "You''re in an ..."');
  351. X`009`009`009`009writeln('8) "You''re at an ..."');
  352. X`009`009`009`009writeln;
  353. X`009`009`009`009grab_line('? ',s,eof_handler := leave);
  354. X`009`009`009`009if isnum(s) then begin
  355. X`009`009`009`009`009n := number(s);
  356. X`009`009`009`009`009if n in `0910..8`093 then begin
  357. X`009`009`009`009`009`009getroom;
  358. X`009`009`009`009`009`009here.nameprint := n;
  359. X`009`009`009`009`009`009putroom;
  360. X`009`009`009`009`009end else
  361. X`009`009`009`009`009`009writeln('Out of range.');
  362. X`009`009`009`009end else
  363. X`009`009`009`009`009writeln('No changes.');
  364. X`009`009`009     end;
  365. X`009`009`009otherwise writeln('Bad command, type ? for a list');
  366. X`009`009end;
  367. X`009until done;
  368. X`009exit_label:
  369. X`009log_event(myslot,E_ROOMDONE,0,0);
  370. Xend;
  371. X
  372. X`123 custom EXIT -----------------------------------------------------------
  373. V--- `125
  374. X
  375. X`091global`093 procedure exit_default(dir, kind: integer);
  376. Xbegin
  377. X`009case kind of
  378. X`0091: writeln('There is a passage leading ',direct`091dir`093,'.');
  379. X`0092: writeln('There is a locked door leading ',direct`091dir`093,'.');
  380. X`0095:`009case dir of
  381. X`009`009`009north,south,east,west:
  382. X`009`009`009`009writeln('A note on the ',direct`091dir`093,' wall says "Your
  383. V exit here."');
  384. X`009`009`009up: writeln('A note on the ceiling says "Your exit here."');
  385. X`009`009`009down: writeln('A note on the floor says "Your exit here."');
  386. X`009`009end;
  387. X`009otherwise writeln('There is an exit: ',direct`091dir`093);
  388. X`009end;
  389. Xend;
  390. X
  391. Xprocedure analyze_exit(dir: integer);
  392. Xvar
  393. X`009s: string;
  394. X
  395. Xbegin
  396. X`009writeln;
  397. X`009getnam;
  398. X`009freenam;
  399. X`009getobjnam;
  400. X`009freeobjnam;
  401. X`009with here.exits`091dir`093 do begin
  402. X`009`009s := alias;
  403. X`009`009if s = '' then
  404. X`009`009`009s := '(no alias)'
  405. X`009`009else
  406. X`009`009`009s := '(alias ' + s + ')';
  407. X`009`009if here.exits`091dir`093.reqalias then
  408. X`009`009`009s := s + ' (required)'
  409. X`009`009else
  410. X`009`009`009s := s + ' (not required)';
  411. X
  412. X`009`009if toloc <> 0 then
  413. X`009`009`009writeln('The ',direct`091dir`093,' exit ',s,' goes to ',nam.iden
  414. Vts`091toloc`093)
  415. X`009`009else
  416. X`009`009`009writeln('The ',direct`091dir`093,' exit goes nowhere.');
  417. X`009`009if hidden <> 0 then
  418. X`009`009`009writeln('Concealed.');
  419. X`009`009write('Exit type: ');
  420. X`009`009case kind of
  421. X`009`009`0090: writeln('no exit.');
  422. X`009`009`0091: writeln('Open passage.');
  423. X`009`009`0092: writeln('Door, object required to pass.');
  424. X`009`009`0093: writeln('No passage if holding object.');
  425. X`009`009`0094: writeln('Randomly fails');
  426. X`009`009`0095: writeln('Potential exit.');
  427. X`009`009`0096: writeln('Only exists while holding the required object.');
  428. X`009`009`0097: writeln('Timed exit');
  429. X`009`009end;
  430. X`009`009if objreq = 0 then
  431. X`009`009`009writeln('No required object.')
  432. X`009`009else
  433. X`009`009`009writeln('Required object is: ',objnam.idents`091objreq`093);
  434. X
  435. X`009`009writeln;
  436. X`009`009if exitdesc = DEFAULT_LINE then
  437. X`009`009`009exit_default(dir,kind)
  438. X`009`009else
  439. X`009`009`009print_line(exitdesc);
  440. X
  441. X`009`009if success = 0 then
  442. X`009`009`009writeln('(no success message)')
  443. X`009`009else
  444. X`009`009`009print_desc(success);
  445. X
  446. X`009`009if fail = DEFAULT_LINE then begin
  447. X`009`009`009if kind = 5 then
  448. X`009`009`009`009writeln('There isn'' an exit there yet.')
  449. X`009`009`009else
  450. X`009`009`009`009writeln('You can''t that.');
  451. X`009`009end else
  452. X`009`009`009print_desc(fail);
  453. X
  454. X`009`009if comeout = DEFAULT_LINE then
  455. X`009`009`009writeln('# has come into the room from ',direct`091dir`093)
  456. X`009`009else
  457. X`009`009`009print_desc(comeout);
  458. X`009`009if goin = DEFAULT_LINE then
  459. X`009`009`009writeln('# has gone ',direct`091dir`093)
  460. X`009`009else
  461. X`009`009`009print_desc(goin);
  462. X
  463. X`009`009writeln;
  464. X`009`009if autolook then
  465. X`009`009`009writeln('LOOK automatically done after exit used')
  466. X`009`009else
  467. X`009`009`009writeln('LOOK supressed on exit use');
  468. X`009`009if reqverb then
  469. X`009`009`009writeln('The alias is required to be a verb for exit use')
  470. X`009`009else
  471. X`009`009`009writeln('The exit can be used with GO or as a verb');
  472. X`009end;
  473. X`009writeln;
  474. Xend;
  475. X
  476. X
  477. Xprocedure get_key(dir: integer; param: string := '');
  478. Xlabel exit_label;
  479. Xvar
  480. X`009s: string;
  481. X`009n: integer;
  482. X
  483. X    procedure leave;
  484. X    begin
  485. X`009writeln('EXIT - no changes.');
  486. X`009goto exit_label;
  487. X    end;
  488. X
  489. X
  490. Xbegin
  491. X`009getobjnam;
  492. X`009freeobjnam;
  493. X`009if param > '' then s := param
  494. X`009else begin
  495. X`009`009if here.exits`091dir`093.objreq = 0 then
  496. X`009`009`009writeln('Currently there is no key set for this exit.')
  497. X`009`009else
  498. X`009`009`009writeln(objnam.idents`091here.exits`091dir`093.objreq`093,' is t
  499. Vhe current key for this exit.');
  500. X`009`009writeln('Enter * for `091no key`093');
  501. X`009`009writeln;
  502. X`009
  503. X`009`009grab_line('What object is the door key? ',s,
  504. X`009`009    eof_handler := leave);
  505. X`009end;
  506. X`009if length(s) > 0 then begin
  507. X`009`009if s = '*' then begin
  508. X`009`009`009getroom;
  509. X`009`009`009here.exits`091dir`093.objreq := 0;
  510. X`009`009`009putroom;
  511. X`009`009`009writeln('Exit updated.');
  512. X`009`009end else if lookup_obj(n,s) then begin
  513. X`009`009`009getroom;
  514. X`009`009`009here.exits`091dir`093.objreq := n;
  515. X`009`009`009putroom;
  516. X`009`009`009writeln('Exit updated.');
  517. X`009`009end else
  518. X`009`009`009writeln('There is no object by that name.');
  519. X`009end else
  520. X`009`009writeln('No changes.');
  521. X    exit_label:
  522. Xend;
  523. X
  524. Xprocedure custom_exit(dirnam: string);
  525. Xlabel exit_label;
  526. Xvar
  527. X`009prompt: string;
  528. X`009done : boolean;
  529. X`009s,param: string;
  530. X`009dir,n: integer;
  531. X
  532. X    procedure leave;
  533. X    begin
  534. X`009writeln('EXIT - no changes.');
  535. X`009log_event(myslot,E_CUSTDONE,0,0);
  536. X`009goto exit_label;
  537. X    end;
  538. X
  539. Xbegin
  540. X`009if lookup_dir(dir,dirnam) then begin
  541. X`009   if can_alter(dir) then begin
  542. X
  543. X`009`009log_action(c_custom,0);
  544. X
  545. X`009`009writeln('Customizing ',direct`091dir`093,' exit');
  546. X`009`009writeln('If you would rather be customizing this room, type CUSTOM w
  547. Vith no arguments');
  548. X`009`009writeln('If you would rather be customizing an object, type CUSTOM <
  549. Vobject name>');
  550. X`009`009writeln('If you would rather be customizing a monster, type CUSTOM <
  551. Vmonster name>');
  552. X`009`009writeln;
  553. X`009`009writeln('Type ** for any line to leave it unchanged.');
  554. X`009`009writeln('Type return for any line to select the default.');
  555. X`009`009writeln;
  556. X`009`009writev(prompt,'Custom ',direct`091dir`093,'> ');
  557. X`009`009done := false;
  558. X`009`009repeat
  559. X`009`009`009repeat
  560. X`009`009`009`009grab_line(prompt,s,eof_handler := leave);
  561. X`009`009`009`009param := slead(s);
  562. X`009`009`009`009s := bite(param);
  563. X`009`009`009until length(s) > 0;
  564. X`009`009`009s := lowcase(s);
  565. X`009`009`009case s`0911`093 of
  566. X`009`009`009`009'?','h': command_help('*custom help*');
  567. X`009`009`009`009'q','e': done := true;
  568. X`009`009`009`009'k': get_key(dir,param);
  569. X`009`009`009`009'c': begin
  570. X`009`009`009`009`009writeln('Type the description that a player will see whe
  571. Vn the exit is found.');
  572. X`009`009`009`009`009writeln('Make no text for description to unconceal the e
  573. Vxit.');
  574. X`009`009`009`009`009writeln;
  575. X`009`009`009`009`009writeln('`091 Editing the "hidden exit found" descriptio
  576. Vn `093');
  577. X`009  `009`009`009`009n := here.exits`091dir`093.hidden;
  578. X`009`009`009`009`009if edit_desc(n) then begin
  579. X`009`009`009`009`009`009getroom;
  580. X`009`009`009`009`009`009here.exits`091dir`093.hidden := n;
  581. X`009`009`009`009`009`009putroom;
  582. X`009`009`009`009`009end;
  583. X`009`009`009`009     end;
  584. X`123req alias`125`009`009`009'r': begin
  585. X`009`009`009`009`009getroom;
  586. X`009`009`009`009`009here.exits`091dir`093.reqalias :=
  587. X`009`009`009`009`009`009not(here.exits`091dir`093.reqalias);
  588. X`009`009`009`009`009putroom;
  589. X
  590. X`009`009`009`009`009if here.exits`091dir`093.reqalias then
  591. X`009`009`009`009`009`009writeln('The alias for this exit will be required to
  592. V reference it.')
  593. X`009`009`009`009`009else
  594. X`009`009`009`009`009`009writeln('The alias will not be required to reference
  595. V this exit.');
  596. X`009`009`009`009     end;
  597. X`123req verb`125`009`009`009'x': begin
  598. X`009`009`009`009`009getroom;
  599. X`009`009`009`009`009here.exits`091dir`093.reqverb :=
  600. X`009`009`009`009`009`009not(here.exits`091dir`093.reqverb);
  601. X`009`009`009`009`009putroom;
  602. X
  603. X`009`009`009`009`009if here.exits`091dir`093.reqverb then
  604. X`009`009`009`009`009`009writeln('The exit name will be required to be used a
  605. Vs a verb to use the exit')
  606. X`009`009`009`009`009else
  607. X`009`009`009`009`009`009writeln('The exit name may be used with GO or as a v
  608. Verb to use the exit');
  609. X`009`009`009`009     end;
  610. X`123autolook`125`009`009`009'l': begin
  611. X`009`009`009`009`009getroom;
  612. X`009`009`009`009`009here.exits`091dir`093.autolook :=
  613. X`009`009`009`009`009`009not(here.exits`091dir`093.autolook);
  614. X`009`009`009`009`009putroom;
  615. X
  616. X`009`009`009`009`009if here.exits`091dir`093.autolook then
  617. X`009`009`009`009`009`009writeln('A LOOK will be done after the player travel
  618. Vs through this exit.')
  619. X`009`009`009`009`009else
  620. X`009`009`009`009`009`009writeln('The automatic LOOK will not be done when a
  621. V player uses this exit.');
  622. X`009`009`009`009     end;
  623. X`009`009`009`009'a': begin
  624. X`009`009`009`009`009if param > '' then s := param
  625. X`009  `009`009`009`009else grab_line('Alternate name for the exit? ',
  626. X`009`009`009`009`009    s,eof_handler := leave);
  627. X`009`009`009`009`009if length(s) > veryshortlen then
  628. X`009`009`009`009`009`009writeln('Your alias must be less than ',veryshortlen
  629. V:1,' characters.')
  630. X`009`009`009`009`009else begin
  631. X`009`009`009`009`009`009getroom;
  632. X`009`009`009`009`009`009here.exits`091dir`093.alias := lowcase(s);
  633. X`009`009`009`009`009`009putroom;
  634. X`009`009`009`009`009end;
  635. X`009`009`009`009     end;
  636. X`009`009`009`009'v': analyze_exit(dir);
  637. X`009`009`009`009't': begin
  638. X`009`009`009`009`009writeln;
  639. X`009`009`009`009`009writeln('Select the type of your exit:');
  640. X`009`009`009`009`009writeln;
  641. X`009`009`009`009`009writeln('0) No exit');
  642. X`009`009`009`009`009writeln('1) Open passage');
  643. X`009`009`009`009`009writeln('2) Door (object required to pass)');
  644. X`009`009`009`009`009writeln('3) No passage if holding key');
  645. X`009`009`009`009`009if special_priv then `123 minor change by leino@finuha `
  646. V125
  647. X`009`009`009`009`009`009writeln('4) exit randomly fails');
  648. X`009`009`009`009`009writeln('6) Exit exists only when holding object');
  649. X`009`009`009`009`009if special_priv then `123 minor change by leino@finuha `
  650. V125
  651. X`009`009`009`009`009`009writeln('7) exit opens/closes invisibly every minute
  652. V');
  653. X`009`009`009`009`009writeln;
  654. X`009`009`009`009`009grab_line('Which type? ',s,
  655. X`009`009`009`009`009    eof_handler := leave);
  656. X`009`009`009`009`009if isnum(s) then begin
  657. X`009`009`009`009`009`009n := number(s);
  658. X`009`009`009`009`009`009if ((n in `0914,7`093) and special_priv)
  659. X`009`009`009`009`009`009or (n in `0910..3,6`093) then begin `123 minor hack
  660. V by jlaiho@finuha `125
  661. X`009`009`009`009`009`009`009getroom;
  662. X`009`009`009`009`009`009`009here.exits`091dir`093.kind := n;
  663. X`009`009`009`009`009`009`009putroom;
  664. X`009`009`009`009`009`009`009writeln('Exit type updated.');
  665. X`009`009`009`009`009`009`009writeln;
  666. X`009`009`009`009`009`009`009if n in `0912,6`093 then
  667. X`009`009`009`009`009`009`009`009get_key(dir);
  668. X`009`009`009`009`009`009end else
  669. X`009`009`009`009`009`009`009writeln('Bad exit type.');
  670. X`009`009`009`009`009end else
  671. X`009`009`009`009`009`009writeln('Exit type not changed.');
  672. X`009`009`009`009     end;
  673. X`009`009`009`009'f': begin
  674. X`009`009`009`009`009writeln('The failure description will print if the playe
  675. Vr attempts to go through the');
  676. X`009`009`009`009`009writeln('the exit but cannot for any reason.');
  677. X`009`009`009`009`009writeln;
  678. X`009  `009`009`009`009writeln('`091 Editing the exit failure description `09
  679. V3');
  680. X
  681. X`009`009`009`009`009n := here.exits`091dir`093.fail;
  682. X`009`009`009`009`009if edit_desc(n) then begin
  683. X`009`009`009`009`009`009getroom;
  684. X`009`009`009`009`009`009here.exits`091dir`093.fail := n;
  685. X`009`009`009`009`009`009putroom;
  686. X`009`009`009`009`009end;
  687. X`009`009`009`009     end;
  688. X`009`009`009`009'i': begin
  689. X`009`009`009`009`009writeln('Edit the description that other players see whe
  690. Vn someone goes into');
  691. X`009`009`009`009`009writeln('the exit.  Place a # where the player''s name s
  692. Vhould appear.');
  693. X`009`009`009`009`009writeln;
  694. X`009`009`009`009`009writeln('`091 Editing the exit "go in" description `093'
  695. V);
  696. X`009`009`009`009`009n := here.exits`091dir`093.goin;
  697. X`009`009`009`009`009if edit_desc(n) then begin
  698. X`009`009`009`009`009`009getroom;
  699. X`009`009`009`009`009`009here.exits`091dir`093.goin := n;
  700. X`009`009`009`009`009`009putroom;
  701. X`009`009`009`009`009end;
  702. X`009`009`009`009     end;
  703. X`009`009`009`009'o': begin
  704. X`009`009`009`009`009writeln('Edit the description that other players see whe
  705. Vn someone comes out of');
  706. X`009`009`009`009`009writeln('the exit.  Place a # where the player''s name s
  707. Vhould appear.');
  708. X`009`009`009`009`009writeln;
  709. X`009`009`009`009`009writeln('`091 Editing the exit "come out of" description
  710. V `093');
  711. X`009`009`009`009`009n := here.exits`091dir`093.comeout;
  712. X`009`009`009`009`009if edit_desc(n) then begin
  713. X`009`009`009`009`009`009getroom;
  714. X`009`009`009`009`009`009here.exits`091dir`093.comeout := n;
  715. X`009`009`009`009`009`009putroom;
  716. X`009`009`009`009`009end;
  717. X`009`009`009`009     end;
  718. X`123 main exit desc `125`009`009'd': begin
  719. X`009`009`009`009`009writeln('Enter a one line description of the exit.');
  720. X`009`009`009`009`009writeln;
  721. X`009`009`009`009`009n := here.exits`091dir`093.exitdesc;
  722. X`009`009`009`009`009make_line(n);
  723. X`009`009`009`009`009getroom;
  724. X`009`009`009`009`009here.exits`091dir`093.exitdesc := n;
  725. X`009`009`009`009`009putroom;
  726. X`009`009`009`009     end;
  727. X`009`009`009`009's': begin
  728. X`009`009`009`009`009writeln('The success description will print when the pla
  729. Vyer goes through the exit.');
  730. X`009`009`009`009`009writeln;
  731. X`009`009`009`009`009writeln('`091 Editing the exit success description `093'
  732. V);
  733. X
  734. X`009`009`009`009`009n := here.exits`091dir`093.success;
  735. X`009`009`009`009`009if edit_desc(n) then begin
  736. X`009`009`009`009`009`009getroom;
  737. X`009`009`009`009`009`009here.exits`091dir`093.success := n;
  738. X`009`009`009`009`009`009putroom;
  739. X`009`009`009`009`009end;
  740. X`009`009`009`009     end;
  741. X`009`009`009`009otherwise writeln('-- Bad command, type ? for a list');
  742. X`009`009`009end;
  743. X`009`009until done;
  744. X`009   end else
  745. X`009`009writeln('You are not allowed to alter that exit.');
  746. X
  747. X`009`009log_event(myslot,E_CUSTDONE,0,0);
  748. X`009end else writeln('Unknown direction.');
  749. X    exit_label:
  750. X
  751. Xend;
  752. X
  753. X`091global`093 PROCEDURE do_custom(dirnam: string);
  754. Xvar`009n: integer;
  755. X`009t: o_type;
  756. X`009fi,ta: string; `123 first and tail `125
  757. Xbegin
  758. X    gethere;
  759. X    if checkhide then begin
  760. X`009ta := dirnam;
  761. X`009fi := bite(ta);
  762. X
  763. X`009if length(dirnam) = 0 then begin
  764. X`009    if is_owner(location,TRUE) then
  765. X`009`009custom_room
  766. X`009    else begin
  767. X`009`009writeln('You are not the owner of this room; you cannot customize it
  768. V.');
  769. X`009`009writeln('However, you may be able to customize some of the exits.  T
  770. Vo customize an');
  771. X`009`009writeln('exit, type CUSTOM <direction of exit>');
  772. X`009    end;
  773. X`009end else if lookup_dir(n,dirnam) then`032
  774. X`009    custom_exit(dirnam)
  775. X`009else if lookup_type(t,fi,pl := FALSE) then begin
  776. X`009    case t of`032
  777. X`009`009t_none: writeln('%Error in DO_CUSTOM. Notify Monster Manager.');
  778. X`009`009t_room: begin
  779. X`009`009    if ta > '' then writeln('You can only custom this room.')
  780. X`009`009    else if is_owner(location,TRUE) then custom_room
  781. X`009`009    else writeln('You are not the owner of this room; you cannot cus
  782. Vtomize it.');
  783. X`009`009end;
  784. X`009`009t_object: do_program(ta);
  785. X`009`009t_spell:  writeln('Use SET SPELL <spell name> to customize spell.');
  786. X`009`009t_monster: custom_monster(ta);
  787. X`009`009t_player: begin
  788. X`009`009    if manager_priv then writeln('Use SYSTEM to customize player.')
  789. X`009`009    else writeln('You can''t customize player.');
  790. X`009`009end;
  791. X`009    end; `123 case `125
  792. X`009end else if lookup_obj(n,dirnam) then
  793. X`123 if lookup_obj returns TRUE then dirnam is name of object to customize `
  794. V125
  795. X`009    do_program(dirnam)`009`123 customize the object `125
  796. X        else if lookup_pers(n,dirnam) then
  797. X`009    custom_monster(dirnam)
  798. X`009else begin
  799. X`009    writeln('To customize this room, type CUSTOM');
  800. X`009    writeln('To customize an exits, type CUSTOM <direction>');
  801. X`009    writeln('To customize an object, type CUSTOM <object name>');
  802. X`009    writeln('To customize a monster, type CUSTOM <monster name>');
  803. X`009end;
  804. X`123`009clear_command;`009`125
  805. X`009end;
  806. Xend;
  807. X
  808. X`123 custom OBJECT ---------------------------------------------------------
  809. V---- `125
  810. X
  811. X
  812. X`123 support for do_program (customize an object)
  813. X  Give the player a list of kinds of object he's allowed to make his object
  814. X  and update it `125
  815. X
  816. Xprocedure prog_kind(objnum: integer);
  817. Xlabel exit_label;
  818. Xvar
  819. X`009n: integer;
  820. X`009s: string;
  821. X`009p: integer;
  822. X
  823. X    procedure leave;
  824. X    begin
  825. X`009writeln('EXIT - no changes.');
  826. X`009goto exit_label;
  827. X    end;
  828. X
  829. Xbegin
  830. X`009writeln('Select the type of your object:');
  831. X`009writeln;
  832. X`009writeln(O_BLAND:3,`009'    Ordinary object (good for door keys)');
  833. X`009writeln(O_WEAPON:3,`009'    Weapon');
  834. X`009writeln(O_ARMOR:3,`009'    Armor');
  835. X`123`009writeln(O_THRUSTER:3,`009'    Exit thruster');`009`125
  836. X`009writeln(O_DISGUISE:3,`009'    Disguise');
  837. X`009writeln(O_BOOK:3,       '    Magic book.');
  838. X             `032
  839. X`009writeln(O_TRAP:3,`009'    Trap (bites if player fails to get it)'); `123
  840. V O_TRAP `125
  841. X`009if special_priv then begin `123 minor change by leino@finuha `125
  842. X`009`009writeln;
  843. X`123`009`009writeln(O_BAG:3,`009'    Bag');`009`125
  844. X`009`009writeln(O_CRYSTAL:3,`009'    Crystal Ball');
  845. X`123`009`009writeln(O_WAND:3,`009'    Wand of Power');`009`125
  846. X`123`009`009writeln(O_HAND:3,`009'    Hand of Glory');`009`125
  847. X`009`009writeln(O_TELEPORT_RING:3,'    Teleport Ring');
  848. X`009`009writeln(O_HEALTH_RING:3,'    Health Ring');
  849. X`009end;
  850. X`009writeln;
  851. X`009if wizard and special_priv then begin
  852. X`009`009writeln(O_MAGIC_RING:3,`009'    Magic Ring');
  853. X`009`009writeln;
  854. X`009end;
  855. X
  856. X`009grab_line('Which kind? ',s,eof_handler := leave);
  857. X
  858. X`009if isnum(s) then begin
  859. X`009`009n := number(s);
  860. X`009`009if (n >= 100) and (not special_priv)`032
  861. X`009`009`009or (n >= 200) and (not wizard) then
  862. X`009`009`009writeln('Out of range.')
  863. X`009`009else if n in `091O_BLAND,O_WEAPON,O_ARMOR,
  864. X`009`009`009O_DISGUISE,O_CRYSTAL,O_MAGIC_RING,
  865. X`009`009`009O_TELEPORT_RING,O_HEALTH_RING,
  866. X`009`009`009O_BOOK, O_TRAP`093 then begin
  867. X`009`009`009getobj(objnum);
  868. X`009`009`009`123 clear parms `125
  869. X`009`009`009for p := 1 to maxparm do obj.parms`091p`093 := 0;
  870. X                        obj.kind := n;
  871. X`009`009`009putobj;        `032
  872. X         `032
  873. X                        writeln('Object updated.');
  874. X`009`009end else
  875. X`009`009`009writeln('Out of range.');
  876. X`009end;
  877. X    exit_label:
  878. Xend;
  879. X     `032
  880. X
  881. X`123 support for do_program (customize an object)
  882. X  Based on the kind it is allow the
  883. X  user to set the various parameters for the effects associated with that
  884. X  kind `125
  885. X
  886. XProcedure program_weapon (objnum: integer);
  887. Xlabel exit_label;
  888. XVar attack_power: Integer;
  889. X    required_experience: Integer;
  890. X    n,top,lev: integer;
  891. X    s: string;
  892. X
  893. X    procedure leave;
  894. X    begin
  895. X`009writeln('EXIT - no changes.');
  896. X`009goto exit_label;
  897. X    end;
  898. X
  899. Xbegin
  900. X`123 getobj (objnum);
  901. X   freeobj;  `125   `123 prog_obj do this already `125
  902. X
  903. X   writeln ('Use 3 to edit failure attack message');
  904. X   writeln ('Use 4 to edit attack success message');
  905. X   writeln ('Use x to edit attack success message, what victim sees.');
  906. X   writeln ('Use 5 to edit attack success message, what others see.');
  907. X   writeln;
  908. X
  909. X   attack_power := obj.ap;
  910. X   required_experience := obj.exreq;
  911. X   lev := level(myexperience);
  912. X   top := leveltable`091lev`093.maxpower;
  913. X
  914. X   writeln ('Select attack power of this weapon: 0 - ',top:1);
  915. X   writeln ('Current attack power is ',attack_power:1);
  916. X   grab_line ('Power? ',s,eof_handler := leave);
  917. X   if isnum (s) then begin
  918. X     n := number (s);
  919. X     if (n >= 0) and (n <=top) then`032
  920. X       begin
  921. X         attack_power := n;`032
  922. X         getobj (objnum);
  923. X         obj.ap := attack_power;
  924. X         putobj;
  925. X         writeln ('Updated.');
  926. X
  927. X       end
  928. X     else writeln ('Out of range.'); `032
  929. X   end else writeln('No such power.');
  930. X   writeln;
  931. X
  932. X   writeln ('Select required experience to use this weapon: 0 - ',
  933. X      maxexperience:1);
  934. X   writeln ('Current required experience is ',required_experience:1);
  935. X   grab_line ('Experience? ',s,eof_handler := leave);
  936. X   if isnum (s) then begin
  937. X     n := number (s);
  938. X     if (n >=0) and (n <= maxexperience) then
  939. X       begin
  940. X         required_experience := n;
  941. X         getobj (objnum);
  942. X         obj.exreq := required_experience;
  943. X         putobj;
  944. X         writeln ('Updated.');
  945. X       end else writeln ('Out of range.');
  946. X   end else writeln ('No such experience.');
  947. X   writeln;
  948. X
  949. X    exit_label:
  950. X
  951. Xend;                                `032
  952. X
  953. XProcedure program_book (objnum: integer);
  954. Xlabel exit_label;
  955. XVar spell: Integer;
  956. X    required_experience: Integer;
  957. X    n: integer;
  958. X    s: string;
  959. X
  960. X    procedure leave;
  961. X    begin
  962. X`009writeln('EXIT - no changes.');
  963. X`009goto exit_label;
  964. X    end;
  965. X
  966. Xbegin
  967. X`123 getobj (objnum);
  968. X   freeobj;  `125   `123 prog_obj do this already `125
  969. X
  970. X   spell := obj.parms`091OP_SPELL`093;
  971. X   required_experience := obj.exreq;
  972. X   getspell_name;
  973. X   freespell_name;
  974. X
  975. X
  976. X   writeln ('Select spell for this magic book.');
  977. X
  978. X   if spell > 0 then`032
  979. X      writeln ('Current spell is ',spell_name.idents`091spell`093)
  980. X   else writeln('Current spell is <none>');
  981. X   grab_line ('Spell? ',s,eof_handler := leave);
  982. X   if lookup_spell(n,s) then begin
  983. X       if is_spell_owner(n,public_ok := true) then
  984. X       begin
  985. X         spell := n;`032
  986. X         getobj (objnum);
  987. X         obj.parms`091OP_SPELL`093 := spell;
  988. X         putobj;
  989. X         writeln ('Updated.');
  990. X       end
  991. X     else writeln ('You aren''t owner of this spell.'); `032
  992. X   end else writeln('No such spell.');
  993. X   writeln;
  994. X
  995. X   writeln ('Select required experience to use this magic book: 0 - ',
  996. X      maxexperience:1);
  997. X   writeln ('Current required experience is ',required_experience:1);
  998. X   grab_line ('Experience? ',s,eof_handler := leave);
  999. X   if isnum (s) then begin
  1000. X     n := number (s);
  1001. X     if (n >=0) and (n <= maxexperience) then
  1002. X       begin
  1003. X         required_experience := n;
  1004. X         getobj (objnum);
  1005. X         obj.exreq := required_experience;
  1006. X         putobj;
  1007. X         writeln ('Updated.');
  1008. X       end else writeln ('Out of range.');
  1009. X   end else writeln ('No such experience.');
  1010. X   writeln;
  1011. X
  1012. X   exit_label:
  1013. Xend;                                `032
  1014. X
  1015. Xprocedure program_trap (objnum: integer);
  1016. Xlabel exit_label;
  1017. Xvar attack_power: integer;
  1018. X    n,top,lev: integer;
  1019. X    s: string;
  1020. X
  1021. X    procedure leave;
  1022. X    begin
  1023. X`009writeln('EXIT - no changes.');
  1024. X`009goto exit_label;
  1025. X    end;
  1026. X
  1027. Xbegin
  1028. X`123 getobj (objnum);
  1029. X   freeobj;  `125   `123 prog_obj do this already `125
  1030. X  `032
  1031. X   writeln ('Use f to edit what victim sees when (s)he tries to get trap.');
  1032. X   writeln ('Use x to edit what others see when someone fails to get trap');
  1033. X
  1034. X   writeln;
  1035. X   writeln ('Attack power that the trap uses when it bites someone');
  1036. X   attack_power := obj.ap;
  1037. X   lev := level(myexperience);
  1038. X   top := leveltable`091lev`093.maxpower;
  1039. X
  1040. X   writeln ('Select attack power, range is 0 - ',top:1);
  1041. X   writeln ('Current attack power is ',attack_power:1);
  1042. X   grab_line ('Power? ',s,eof_handler := leave);
  1043. X   if isnum (s) then begin
  1044. X     n := number (s);
  1045. X     if (n >= 0) and (n <=top) then`032
  1046. X       begin
  1047. X         attack_power := n;           `032
  1048. X         getobj (objnum);
  1049. X         obj.ap := attack_power;
  1050. X         putobj;
  1051. X         writeln ('Updated.');
  1052. X
  1053. X       end
  1054. X     else writeln ('Out of range.'); `032
  1055. X   end else writeln('No such power.');
  1056. X   exit_label:
  1057. Xend;              `032
  1058. X
  1059. Xprocedure program_armor(objnum: integer);
  1060. Xlabel exit_label;
  1061. Xvar attack_power: integer;
  1062. X    n,top,lev: integer;
  1063. X    s: string;
  1064. X
  1065. X    procedure leave;
  1066. X    begin
  1067. X`009writeln('EXIT - no changes.');
  1068. X`009goto exit_label;
  1069. X    end;
  1070. X
  1071. Xbegin
  1072. X`123 getobj (objnum);
  1073. X   freeobj;  `125   `123 prog_obj do this already `125
  1074. X   writeln ('Protection rate of armor');
  1075. X   attack_power := obj.ap;
  1076. X   lev := level(myexperience);
  1077. X   top := leveltable`091lev`093.maxpower;
  1078. X
  1079. X   writeln ('Select protection rate, range is 0 - ',top:1);
  1080. X   writeln ('Current protection rate is ',attack_power:1);
  1081. X   grab_line ('Power? ',s,eof_handler := leave);
  1082. X   if isnum (s) then begin
  1083. X     n := number (s);
  1084. X     if (n >= 0) and (n <=top) then`032
  1085. X       begin
  1086. X         attack_power := n;           `032
  1087. X         getobj (objnum);
  1088. X         obj.ap := attack_power;
  1089. X         putobj;
  1090. X         writeln ('updated.');
  1091. X
  1092. X       end
  1093. X     else Writeln ('Out of range.'); `032
  1094. X   end else writeln('No such power.');
  1095. X   exit_label:
  1096. Xend;              `032
  1097. X
  1098. Xprocedure prog_obj(objnum: integer);
  1099. Xvar object_type: integer;
  1100. Xbegin            `032
  1101. X  getobj (objnum);
  1102. X  freeobj;
  1103. X`032
  1104. X  object_type := obj.kind;
  1105. X  case object_type of
  1106. X`009O_BLAND : WriteLn ('You can''t program ordinary object.');           `03
  1107. V2
  1108. X`009O_WEAPON: program_weapon (objnum);      `032
  1109. X`009O_TRAP: program_trap(objnum);
  1110. X`009O_ARMOR: program_armor(objnum);
  1111. X`009O_DISGUISE: Writeln ('You can''t program disguise.');
  1112. X`009O_BOOK: program_book(objnum);
  1113. X    otherwise  WriteLn ('This kind of object is not supported here.')
  1114. X  end; `123 case `125
  1115. Xend;
  1116. X
  1117. X
  1118. X`091global`093 PROCEDURE show_kind(p: integer; cr: boolean := true);
  1119. Xvar s: string;
  1120. Xbegin
  1121. X`009case p of
  1122. X`009`009O_BLAND:    s := 'Ordinary object';
  1123. X`009`009O_WEAPON:   s := 'Weapon';
  1124. X`009`009O_ARMOR:    s := 'Armor';
  1125. X       `009`009O_TRAP:     s := 'Trap';
  1126. X`009`009O_DISGUISE: s := 'Disguise';
  1127. X`009`009O_BOOK:`009    s := 'Magic book';
  1128. X`009`009O_BAG:      s := 'Bag';
  1129. X`009`009O_CRYSTAL:  s := 'Crystal Ball';
  1130. X`009`009O_WAND:     s := 'Wand of Power';
  1131. X`009`009O_HAND:     s := 'Hand of Glory';
  1132. X`009`009O_TELEPORT_RING:  s := 'Teleport Ring';
  1133. X`009`009O_HEALTH_RING:    s := 'Health Ring';
  1134. X`009`009O_MAGIC_RING:     s := 'Magic Ring';
  1135. X`009`009otherwise   s := 'Bad object type';
  1136. X`009end;
  1137. X`009if cr then writeln(s)
  1138. X`009else write(lowcase(s));
  1139. Xend;
  1140. X
  1141. Xprocedure obj_view(objnum: integer);
  1142. Xbegin
  1143. X`009writeln;
  1144. X`009getobj(objnum);
  1145. X`009freeobj;
  1146. X`009getobjown;
  1147. X`009freeobjown;
  1148. X`009writeln('Object name:    ',obj.oname);
  1149. X`009if objown.idents`091objnum`093 = public_id then writeln('Public')
  1150. X`009else if objown.idents`091objnum`093 = disowned_id then writeln('Disowned
  1151. V')
  1152. X`009else writeln('Owner:          ',class_out(objown.idents`091objnum`093));
  1153. X`009writeln;
  1154. X`009show_kind(obj.kind);
  1155. X`009writeln;
  1156. X
  1157. X`009if obj.linedesc = 0 then
  1158. X`009`009writeln('There is a(n) # here')
  1159. X`009else
  1160. X`009`009print_line(obj.linedesc);
  1161. X
  1162. X`009if obj.examine = 0 then
  1163. X`009`009writeln('No inspection description set')
  1164. X`009else
  1165. X`009`009print_desc(obj.examine);
  1166. X
  1167. X`123`009writeln('Worth (in points) of this object: ',obj.worth:1);`009`125
  1168. X`009if obj.home > 0 then begin
  1169. X`009    getnam;
  1170. X`009    freenam;
  1171. X`009    writeln('Home of this object is ',nam.idents`091obj.home`093);
  1172. X`009end;
  1173. X`009if obj.kind in `091O_WEAPON,O_ARMOR,O_TRAP`093 then`032
  1174. X`009`009writeln ('Power of this object: ',obj.ap:1);
  1175. X`009if obj.kind in `091O_WEAPON,O_BOOK`093 then
  1176. X`009`009writeln ('Required experience to use this object: ',obj.exreq:1);
  1177. X        if obj.kind = O_BOOK then begin
  1178. X`009`009getspell_name; freespell_name;
  1179. X`009`009if obj.parms`091OP_SPELL`093 > 0 then
  1180. X`009`009    writeln('Spell name of this object: ',
  1181. X`009`009`009spell_name.idents`091obj.parms`091OP_SPELL`093`093)
  1182. X`009`009else writeln('Spell name of this object: <none>');
  1183. X`009end;
  1184. X`009if obj.actindx > 0 then
  1185. X`009`009writeln ('In this object is a hook.')
  1186. X`009else writeln ('No hook in this object.');
  1187. X`009writeln('Number in existence: ',obj.numexist:1);
  1188. X`009writeln;
  1189. Xend;
  1190. X
  1191. X
  1192. X
  1193. X
  1194. XPROCEDURE do_program;`009`123 (object_name: string);  declared forward `125
  1195. Xlabel exit_label;
  1196. Xvar
  1197. X`009prompt: string;
  1198. X`009done : boolean;
  1199. X`009s,param: string;
  1200. X`009objnum: integer;
  1201. X`009n: integer;
  1202. X`009newdsc: integer;
  1203. X
  1204. X    procedure leave;
  1205. X    begin
  1206. X`009writeln('EXIT - no changes.');
  1207. X`009log_event(myslot,E_OBJDONE,objnum,0);
  1208. X`009goto exit_label;
  1209. X    end;
  1210. X
  1211. X
  1212. Xbegin
  1213. X    gethere;
  1214. X    if checkhide then begin
  1215. X`009if object_name = '' then writeln('To customize an object, type CUSTOM OB
  1216. VJECT <object name>.')
  1217. X`009else if lookup_obj(objnum,object_name) then begin
  1218. X`009    if not is_owner(location,TRUE) then begin
  1219. X`009`009writeln('You may only work on your objects when you are in one of yo
  1220. Vur own rooms.');
  1221. X`009    end else if obj_owner(objnum) then begin
  1222. X`009`009log_action(e_program,0);
  1223. X`009`009writeln;
  1224. X`009`009writeln('Customizing object');
  1225. X`009`009writeln('If you would rather be customizing an EXIT, type CUSTOM <di
  1226. Vrection of exit>');
  1227. X`009`009writeln('If you would rather be customizing this room, type CUSTOM')
  1228. V;
  1229. X`009`009writeln;
  1230. X`009`009getobj(objnum);
  1231. X`009`009freeobj;
  1232. X`009`009if (obj.kind = O_MAGIC_RING) and not wizard then begin
  1233. X`009`009`009writeln ('That kind of object may be customized only by Monster
  1234. V Manager.');
  1235. X`009`009`009done := true;
  1236. X`009`009end else done := false;
  1237. X`009`009prompt := 'Custom object> ';
  1238. X`009`009while not done do begin
  1239. X`009`009`009repeat
  1240. X`009`009`009`009grab_line(prompt,s,eof_handler := leave);
  1241. X`009`009`009`009param := slead(s);
  1242. X`009`009`009`009s := bite(param)
  1243. X`009`009`009until length(s) > 0;
  1244. X`009`009`009s := lowcase(s);
  1245. X`009`009`009case s`0911`093 of
  1246. X`009`009`009`009'?','h': command_help('*program help*');
  1247. X`009`009`009`009'q','e': done := true;
  1248. X`009`009`009`009'v': obj_view(objnum);
  1249. X`009`009`009`009'r': do_objrename(objnum,param);
  1250. X`009`009`009`009'c': begin
  1251. X`009`009`009`009`009getobj(objnum);
  1252. X`009`009`009`009`009freeobj;
  1253. X`009`009`009`009`009n := obj.actindx;
  1254. X`009`009`009`009`009`123 obj_owner is made getobjown `125
  1255. X`009`009`009`009`009`123 lookup_obj is made getobjnam `125
  1256. X`009`009`009`009`009custom_hook(n,objown.idents`091objnum`093,
  1257. X`009`009`009`009`009    trim_filename(
  1258. X`009`009`009`009`009`009objnam.idents`091objnum`093)
  1259. X`009`009`009`009`009    );
  1260. X`009`009`009`009`009getobj(objnum);
  1261. X`009`009`009`009`009obj.actindx := n;
  1262. X`009`009`009`009`009putobj;
  1263. X`009`009`009`009     end;
  1264. X`009`009`009`009'g': begin
  1265. X`009`009`009`009`009if param > '' then s := param
  1266. X`009`009`009`009`009else begin
  1267. X`009`009`009`009`009`009writeln('Enter * for no object');
  1268. X`009`009`009`009`009`009grab_line('Object required for GET? ',
  1269. X`009`009`009`009`009`009    s,eof_handler := leave);
  1270. X`009`009`009`009`009end;
  1271. X`009`009`009`009`009if s = '*' then begin
  1272. X`009`009`009`009`009`009getobj(objnum);
  1273. X`009`009`009`009`009`009obj.getobjreq := 0;
  1274. X`009`009`009`009`009`009putobj;
  1275. X`009`009`009`009`009end else if lookup_obj(n,s) then begin
  1276. X`009`009`009`009`009`009getobj(objnum);
  1277. X`009`009`009`009`009`009obj.getobjreq := n;
  1278. X`009`009`009`009`009`009putobj;
  1279. X`009`009`009`009`009`009writeln('Object modified.');
  1280. X`009`009`009`009`009end else
  1281. X`009`009`009`009`009`009writeln('No such object.');
  1282. X`009`009`009`009     end;
  1283. X`009`009`009`009'7': begin
  1284. +-+-+-+-+-+-+-+-  END  OF PART 9 +-+-+-+-+-+-+-+-
  1285.