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

  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, Delta from 1.04 to 1.05 - part 3/7
  5. Message-ID: <1992Jun30.203950.11888@klaava.Helsinki.FI>
  6. Date: 30 Jun 92 20:39:50 GMT
  7. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  8. Followup-To: vmsnet.sources.d
  9. Organization: University of Helsinki
  10. Lines: 1197
  11.  
  12. Archive-name: monster_helsinki_104_to_105/delta3
  13. Environment: VMS, Pascal
  14. Author: Kari.Hurtta@Helsinki.FI
  15.  
  16. -+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
  17. X         putobj;
  18. X         writeln ('Updated.');
  19. X       end else writeln ('Out of range.');
  20. X   end else writeln ('No such experience.');
  21. X   writeln;
  22. X
  23. X   exit_label:
  24. Xend;                                `032
  25. X
  26. Xprocedure program_trap (objnum: integer);
  27. Xlabel exit_label;
  28. Xvar attack_power: integer;
  29. X    n,top,lev: integer;
  30. X    s: string;
  31. X
  32. X    procedure leave;
  33. X    begin
  34. X`009writeln('EXIT - no changes.');
  35. X`009goto exit_label;
  36. X    end;
  37. X
  38. Xbegin
  39. X`123 getobj (objnum);
  40. X   freeobj;  `125   `123 prog_obj do this already `125
  41. X  `032
  42. X   writeln ('Use f to edit what victim sees when (s)he tries to get trap.');
  43. X   writeln ('Use x to edit what others see when someone fails to get trap');
  44. X
  45. X   writeln;
  46. X   writeln ('Attack power that the trap uses when it bites someone');
  47. X   attack_power := obj.ap;
  48. X   lev := level(myexperience);
  49. X   top := leveltable`091lev`093.maxpower;
  50. X
  51. X   writeln ('Select attack power, range is 0 - ',top:1);
  52. X   writeln ('Current attack power is ',attack_power:1);
  53. X   grab_line ('Power? ',s,eof_handler := leave);
  54. X   if isnum (s) then begin
  55. X     n := number (s);
  56. X     if (n >= 0) and (n <=top) then`032
  57. X       begin
  58. X         attack_power := n;           `032
  59. X         getobj (objnum);
  60. X         obj.ap := attack_power;
  61. X         putobj;
  62. X         writeln ('Updated.');
  63. X
  64. X       end
  65. X     else writeln ('Out of range.'); `032
  66. X   end else writeln('No such power.');
  67. X   exit_label:
  68. Xend;              `032
  69. X
  70. Xprocedure program_armor(objnum: integer);
  71. Xlabel exit_label;
  72. Xvar attack_power: integer;
  73. X    n,top,lev: integer;
  74. X    s: string;
  75. X
  76. X    procedure leave;
  77. X    begin
  78. X`009writeln('EXIT - no changes.');
  79. X`009goto exit_label;
  80. X    end;
  81. X
  82. Xbegin
  83. X`123 getobj (objnum);
  84. X   freeobj;  `125   `123 prog_obj do this already `125
  85. X   writeln ('Protection rate of armor');
  86. X   attack_power := obj.ap;
  87. X   lev := level(myexperience);
  88. X   top := leveltable`091lev`093.maxpower;
  89. X
  90. X   writeln ('Select protection rate, range is 0 - ',top:1);
  91. X   writeln ('Current protection rate is ',attack_power:1);
  92. X   grab_line ('Power? ',s,eof_handler := leave);
  93. X   if isnum (s) then begin
  94. X     n := number (s);
  95. X     if (n >= 0) and (n <=top) then`032
  96. X       begin
  97. X         attack_power := n;           `032
  98. X         getobj (objnum);
  99. X         obj.ap := attack_power;
  100. X         putobj;
  101. X         writeln ('updated.');
  102. X
  103. X       end
  104. X     else Writeln ('Out of range.'); `032
  105. X   end else writeln('No such power.');
  106. X   exit_label:
  107. Xend;              `032
  108. X
  109. Xprocedure prog_obj(objnum: integer);
  110. Xvar object_type: integer;
  111. Xbegin            `032
  112. X  getobj (objnum);
  113. X  freeobj;
  114. X`032
  115. X  object_type := obj.kind;
  116. X  case object_type of
  117. X`009O_BLAND : WriteLn ('You can''t program ordinary object.');           `03
  118. V2
  119. X`009O_WEAPON: program_weapon (objnum);      `032
  120. X`009O_TRAP: program_trap(objnum);
  121. X`009O_ARMOR: program_armor(objnum);
  122. X`009O_DISGUISE: Writeln ('You can''t program disguise.');
  123. X`009O_BOOK: program_book(objnum);
  124. X    otherwise  WriteLn ('This kind of object is not supported here.')
  125. X  end; `123 case `125
  126. Xend;
  127. X
  128. X
  129. X`091global`093 PROCEDURE show_kind(p: integer; cr: boolean := true);
  130. Xvar s: string;
  131. Xbegin
  132. X`009case p of
  133. X`009`009O_BLAND:    s := 'Ordinary object';
  134. X`009`009O_WEAPON:   s := 'Weapon';
  135. X`009`009O_ARMOR:    s := 'Armor';
  136. X       `009`009O_TRAP:     s := 'Trap';
  137. X`009`009O_DISGUISE: s := 'Disguise';
  138. X`009`009O_BOOK:`009    s := 'Magic book';
  139. X`009`009O_BAG:      s := 'Bag';
  140. X`009`009O_CRYSTAL:  s := 'Crystal Ball';
  141. X`009`009O_WAND:     s := 'Wand of Power';
  142. X`009`009O_HAND:     s := 'Hand of Glory';
  143. X`009`009O_TELEPORT_RING:  s := 'Teleport Ring';
  144. X`009`009O_HEALTH_RING:    s := 'Health Ring';
  145. X`009`009O_MAGIC_RING:     s := 'Magic Ring';
  146. X`009`009otherwise   s := 'Bad object type';
  147. X`009end;
  148. X`009if cr then writeln(s)
  149. X`009else write(lowcase(s));
  150. Xend;
  151. X
  152. Xprocedure obj_view(objnum: integer);
  153. Xbegin
  154. X`009writeln;
  155. X`009getobj(objnum);
  156. X`009freeobj;
  157. X`009getobjown;
  158. X`009freeobjown;
  159. X`009writeln('Object name:    ',obj.oname);
  160. X`009if objown.idents`091objnum`093 = public_id then writeln('Public')
  161. X`009else if objown.idents`091objnum`093 = disowned_id then writeln('Disowned
  162. V')
  163. X`009else writeln('Owner:          ',class_out(objown.idents`091objnum`093));
  164. X`009writeln;
  165. X`009show_kind(obj.kind);
  166. X`009writeln;
  167. X
  168. X`009if obj.linedesc = 0 then
  169. X`009`009writeln('There is a(n) # here')
  170. X`009else
  171. X`009`009print_line(obj.linedesc);
  172. X
  173. X`009if obj.examine = 0 then
  174. X`009`009writeln('No inspection description set')
  175. X`009else
  176. X`009`009print_desc(obj.examine);
  177. X
  178. X`123`009writeln('Worth (in points) of this object: ',obj.worth:1);`009`125
  179. X`009if obj.home > 0 then begin
  180. X`009    getnam;
  181. X`009    freenam;
  182. X`009    writeln('Home of this object is ',nam.idents`091obj.home`093);
  183. X`009end;
  184. X`009if obj.kind in `091O_WEAPON,O_ARMOR,O_TRAP`093 then`032
  185. X`009`009writeln ('Power of this object: ',obj.ap:1);
  186. X`009if obj.kind in `091O_WEAPON,O_BOOK`093 then
  187. X`009`009writeln ('Required experience to use this object: ',obj.exreq:1);
  188. X        if obj.kind = O_BOOK then begin
  189. X`009`009getspell_name; freespell_name;
  190. X`009`009if obj.parms`091OP_SPELL`093 > 0 then
  191. X`009`009    writeln('Spell name of this object: ',
  192. X`009`009`009spell_name.idents`091obj.parms`091OP_SPELL`093`093)
  193. X`009`009else writeln('Spell name of this object: <none>');
  194. X`009end;
  195. X`009if obj.actindx > 0 then
  196. X`009`009writeln ('In this object is a hook.')
  197. X`009else writeln ('No hook in this object.');
  198. X`009writeln('Number in existence: ',obj.numexist:1);
  199. X- 2055, 2059
  200. X
  201. X
  202. XPROCEDURE do_program;`009`123 (object_name: string);  declared forward `125
  203. Xlabel exit_label;
  204. Xvar
  205. X`009prompt: string;
  206. X`009done : boolean;
  207. X`009s,param: string;
  208. X`009objnum: integer;
  209. X`009n: integer;
  210. X`009newdsc: integer;
  211. X- 2063
  212. X`009log_event(myslot,E_OBJDONE,objnum,0);
  213. X- 2069, 2132
  214. X    gethere;
  215. X    if checkhide then begin
  216. X`009if object_name = '' then writeln('To customize an object, type CUSTOM OB
  217. VJECT <object name>.')
  218. X`009else if lookup_obj(objnum,object_name) then begin
  219. X`009    if not is_owner(location,TRUE) then begin
  220. X`009`009writeln('You may only work on your objects when you are in one of yo
  221. Vur own rooms.');
  222. X`009    end else if obj_owner(objnum) then begin
  223. X`009`009log_action(e_program,0);
  224. X`009`009writeln;
  225. X`009`009writeln('Customizing object');
  226. X`009`009writeln('If you would rather be customizing an EXIT, type CUSTOM <di
  227. Vrection of exit>');
  228. X`009`009writeln('If you would rather be customizing this room, type CUSTOM')
  229. V;
  230. X`009`009writeln;
  231. X`009`009getobj(objnum);
  232. X`009`009freeobj;
  233. X`009`009if (obj.kind = O_MAGIC_RING) and not wizard then begin
  234. X`009`009`009writeln ('That kind of object may be customized only by Monster
  235. V Manager.');
  236. X`009`009`009done := true;
  237. X`009`009end else done := false;
  238. X`009`009prompt := 'Custom object> ';
  239. X`009`009while not done do begin
  240. X- 2136, 2136
  241. X`009`009`009`009s := bite(param)
  242. X- 2140, 2289
  243. X`009`009`009`009'?','h': command_help('*program help*');
  244. X`009`009`009`009'q','e': done := true;
  245. X`009`009`009`009'v': obj_view(objnum);
  246. X`009`009`009`009'r': do_objrename(objnum,param);
  247. X`009`009`009`009'c': begin
  248. X`009`009`009`009`009getobj(objnum);
  249. X`009`009`009`009`009freeobj;
  250. X`009`009`009`009`009n := obj.actindx;
  251. X`009`009`009`009`009`123 obj_owner is made getobjown `125
  252. X`009`009`009`009`009`123 lookup_obj is made getobjnam `125
  253. X`009`009`009`009`009custom_hook(n,objown.idents`091objnum`093,
  254. X`009`009`009`009`009    trim_filename(
  255. X`009`009`009`009`009`009objnam.idents`091objnum`093)
  256. X`009`009`009`009`009    );
  257. X`009`009`009`009`009getobj(objnum);
  258. X`009`009`009`009`009obj.actindx := n;
  259. X`009`009`009`009`009putobj;
  260. X`009`009`009`009     end;
  261. X`009`009`009`009'g': begin
  262. X`009`009`009`009`009if param > '' then s := param
  263. X`009`009`009`009`009else begin
  264. X`009`009`009`009`009`009writeln('Enter * for no object');
  265. X`009`009`009`009`009`009grab_line('Object required for GET? ',
  266. X`009`009`009`009`009`009    s,eof_handler := leave);
  267. X`009`009`009`009`009end;
  268. X`009`009`009`009`009if s = '*' then begin
  269. X`009`009`009`009`009`009getobj(objnum);
  270. X`009`009`009`009`009`009obj.getobjreq := 0;
  271. X`009`009`009`009`009`009putobj;
  272. X`009`009`009`009`009end else if lookup_obj(n,s) then begin
  273. X`009`009`009`009`009`009getobj(objnum);
  274. X`009`009`009`009`009`009obj.getobjreq := n;
  275. X`009`009`009`009`009`009putobj;
  276. X`009`009`009`009`009`009writeln('Object modified.');
  277. X`009`009`009`009`009end else
  278. X`009`009`009`009`009`009writeln('No such object.');
  279. X`009`009`009`009     end;
  280. X`009`009`009`009'7': begin
  281. X`009`009`009`009`009if param > '' then s := param
  282. X`009`009`009`009`009else begin
  283. X`009`009`009`009`009`009writeln('Enter * for no home.');
  284. X`009`009`009`009`009`009writeln('Set home of object. ');
  285. X`009`009`009`009`009`009grab_line('Home? ',s,
  286. X`009`009`009`009`009`009    eof_handler := leave);
  287. X`009`009`009`009`009end;
  288. X`009`009`009`009`009if s = '*' then begin
  289. X`009`009`009`009`009`009getobj(objnum);
  290. X`009`009`009`009`009`009obj.home := 0;
  291. X`009`009`009`009`009`009putobj;
  292. X`009`009`009`009`009`009writeln('Object modified.');
  293. X`009`009`009`009`009end else if lookup_room(n,s) then begin
  294. X`009`009`009`009`009    gethere(n);
  295. X`009`009`009`009`009    if (here.owner <> userid) and`032
  296. X`009`009`009`009`009`009    (not owner_priv) then
  297. X`009`009`009`009`009`009    writeln('Can''t set home to others room')
  298. X`009`009`009`009`009    else begin
  299. X`009`009`009`009`009`009getobj(objnum);
  300. X`009`009`009`009`009`009obj.home := n;
  301. X`009`009`009`009`009`009putobj;
  302. X`009`009`009`009`009`009writeln('Object modified.');
  303. X`009`009`009`009`009    end;
  304. X`009`009`009`009`009end else writeln('No such room.');
  305. X`009`009`009`009     end;
  306. X`009`009`009`009'u': begin
  307. X`009`009`009`009`009if param > '' then s := param
  308. X`009`009`009`009`009else begin
  309. X`009`009`009`009`009`009writeln('Enter * for no object');
  310. X`009`009`009`009`009`009grab_line('Object required for USE? ',
  311. X`009`009`009`009`009`009    s,eof_handler := leave);
  312. X`009`009`009`009`009end;
  313. X`009`009`009`009`009if s = '*' then begin
  314. X`009`009`009`009`009`009getobj(objnum);
  315. X`009`009`009`009`009`009obj.useobjreq := 0;
  316. X`009`009`009`009`009`009putobj;
  317. X`009`009`009`009`009end else if lookup_obj(n,s) then begin
  318. X`009`009`009`009`009`009getobj(objnum);
  319. X`009`009`009`009`009`009obj.useobjreq := n;
  320. X`009`009`009`009`009`009putobj;
  321. X`009`009`009`009`009`009writeln('Object modified.');
  322. X`009`009`009`009`009end else
  323. X`009`009`009`009`009`009writeln('No such object.');
  324. X`009`009`009`009     end;
  325. X`009`009`009`009'2': begin
  326. X`009`009`009`009`009if param > '' then s := param
  327. X`009`009`009`009`009else begin
  328. X`009`009`009`009`009`009writeln('Enter * for no special place');
  329. X`009`009`009`009`009`009grab_line('Place required for USE? ',
  330. X`009`009`009`009`009`009    s,eof_handler := leave);
  331. X`009`009`009`009`009end;
  332. X`009`009`009`009`009if s = '*' then begin
  333. X`009`009`009`009`009`009getobj(objnum);
  334. X`009`009`009`009`009`009obj.uselocreq := 0;
  335. X`009`009`009`009`009`009putobj;
  336. X`009`009`009`009`009end else if lookup_room(n,s) then begin
  337. X`009`009`009`009`009`009getobj(objnum);
  338. X`009`009`009`009`009`009obj.uselocreq := n;
  339. X`009`009`009`009`009`009putobj;
  340. X`009`009`009`009`009`009writeln('Object modified.');
  341. X`009`009`009`009`009end else
  342. X`009`009`009`009`009`009writeln('No such object.');
  343. X`009`009`009`009     end;
  344. X`009`009`009`009's': begin
  345. X`009`009`009`009`009getobj(objnum);
  346. X`009`009`009`009`009obj.sticky := not(obj.sticky);
  347. X`009`009`009`009`009putobj;
  348. X`009`009`009`009`009if obj.sticky then
  349. X`009`009`009`009`009`009writeln('The object will not be takeable.')
  350. X`009`009`009`009`009else
  351. X`009`009`009`009`009`009writeln('The object will be takeable.');
  352. X`009`009`009`009     end;
  353. X`009`009`009`009'a': begin
  354. X`009`009`009`009`009writeln;
  355. X`009  `009`009`009`009writeln('Select the article for your object:');
  356. X`009`009`009`009`009writeln;
  357. X`009`009`009`009`009writeln('0)`009None                ex: " You have taken
  358. V Excalibur "');
  359. X`009`009`009`009`009writeln('1)`009"a"                 ex: " You have taken
  360. V a small box "');
  361. X`009`009`009`009`009writeln('2)`009"an"                ex: " You have taken
  362. V an empty bottle "');
  363. X`009`009`009`009`009writeln('3)`009"some"              ex: " You have picked
  364. V up some jelly beans "');
  365. X`009`009`009`009`009writeln('4)     "the"               ex: " You have picke
  366. Vd up the Scepter of Power"');
  367. X`009`009`009`009`009writeln;
  368. X`009`009`009`009`009grab_line('? ',s,eof_handler := leave);
  369. X`009`009`009`009`009if isnum(s) then begin
  370. X`009`009`009`009`009`009n := number(s);
  371. X`009`009`009`009`009`009if n in `0910..4`093 then begin
  372. X`009`009`009`009`009`009`009getobj(objnum);
  373. X`009`009`009`009`009`009`009obj.particle := n;
  374. X`009`009`009`009`009`009`009putobj;
  375. X`009`009`009`009`009`009end else
  376. X`009`009`009`009`009`009`009writeln('Out of range.');
  377. X`009`009`009`009`009end else
  378. X`009`009`009`009`009`009writeln('No changes.');
  379. X`009`009`009`009     end;
  380. X`009`009`009`009'k': begin
  381. X`009`009`009`009`009prog_kind(objnum);
  382. X`009`009`009`009     end;
  383. X`009`009`009`009'p': begin
  384. X`009`009`009`009`009prog_obj(objnum);
  385. X`009`009`009`009     end;
  386. X`009`009`009`009'd': begin
  387. X`009`009`009`009`009newdsc := obj.examine;
  388. X`009`009`009`009`009writeln('`091 Editing the description of the object `093
  389. V');
  390. X`009`009`009`009`009if edit_desc(newdsc) then begin
  391. X`009`009`009`009`009`009getobj(objnum);
  392. X`009`009`009`009`009`009obj.examine := newdsc;
  393. X`009`009`009`009`009`009putobj;
  394. X`009`009`009`009`009end;
  395. X`009`009`009`009     end;
  396. X`009`009`009`009'x': begin
  397. X`009`009`009`009`009newdsc := obj.d1;
  398. X`009`009`009`009`009writeln('`091 Editing extra description #1 `093');
  399. X`009`009`009`009`009if obj.kind = O_WEAPON then`032
  400. X                                          WriteLn ('Victim sees this. ',
  401. X`009`009`009`009`009`009'# attacks you.')
  402. X`009`009`009`009`009else if obj.kind = O_TRAP then
  403. X`009`009    `009`009`009  writeln ('Others see this. ',
  404. X`009`009`009`009`009`009'# tries to get a trap.');
  405. X                                        if edit_desc(newdsc) then begin
  406. X`009`009`009`009`009`009getobj(objnum);
  407. X`009`009`009`009`009`009obj.d1 := newdsc;
  408. X`009`009`009`009`009`009putobj;
  409. X`009`009`009`009`009end;
  410. X`009`009`009`009     end;
  411. X`009`009`009`009'5': begin
  412. X`009`009`009`009`009newdsc := obj.d2;
  413. X`009`009`009`009`009writeln('`091 Editing extra description #2 `093');
  414. X`009`009`009`009`009if obj.kind = O_WEAPON then
  415. X                                          WriteLn ('Others see this. ',
  416. X`009`009`009`009`009`009'# is attacker.');
  417. X                                        if edit_desc(newdsc) then begin
  418. X`009`009`009`009`009`009getobj(objnum);
  419. X`009`009`009`009`009`009obj.d2 := newdsc;
  420. X`009`009`009`009`009`009putobj;
  421. X`009`009`009`009`009end;
  422. X`009`009`009`009     end;
  423. X`009`009`009`009'f': begin
  424. X`009`009`009`009`009newdsc := obj.getfail;
  425. X`009`009`009`009`009writeln('`091 Editing the get failure description `093')
  426. V;
  427. X`009`009`009`009`009if edit_desc(newdsc) then begin
  428. X`009`009`009`009`009`009getobj(objnum);
  429. X`009`009`009`009`009`009obj.getfail := newdsc;
  430. X`009`009`009`009`009`009putobj;
  431. X`009`009`009`009`009end;
  432. X`009`009`009`009     end;
  433. X`009`009`009`009'1': begin
  434. X`009`009`009`009`009newdsc := obj.getsuccess;
  435. X`009`009`009`009`009writeln('`091 Editing the get success description `093')
  436. V;
  437. X`009`009`009`009`009if edit_desc(newdsc) then begin
  438. X`009`009`009`009`009`009getobj(objnum);
  439. X`009`009`009`009`009`009obj.getsuccess := newdsc;
  440. X`009`009`009`009`009`009putobj;
  441. X`009`009`009`009`009end;
  442. X`009`009`009`009     end;
  443. X`009`009`009`009'3': begin
  444. X`009`009`009`009`009newdsc := obj.usefail;
  445. X`009`009`009`009`009writeln('`091 Editing the use failure description `093')
  446. V;
  447. X`009`009`009`009`009if edit_desc(newdsc) then begin
  448. X`009`009`009`009`009`009getobj(objnum);
  449. X`009`009`009`009`009`009obj.usefail := newdsc;
  450. X`009`009`009`009`009`009putobj;
  451. X`009`009`009`009`009end;
  452. X`009`009`009`009     end;
  453. X`009`009`009`009'6': begin
  454. X`009`009`009`009`009newdsc := obj.homedesc;
  455. X`009`009`009`009`009writeln('`091 Editing the home description `093');
  456. X`009`009`009`009`009if edit_desc(newdsc) then begin
  457. X`009`009`009`009`009`009getobj(objnum);
  458. X`009`009`009`009`009`009obj.homedesc := newdsc;
  459. X`009`009`009`009`009`009putobj;
  460. X`009`009`009`009`009end;
  461. X`009`009`009`009     end;
  462. X`009`009`009`009'4': begin
  463. X`009`009`009`009`009newdsc := obj.usesuccess;
  464. X`009`009`009`009`009writeln('`091 Editing the use success description `093')
  465. V;
  466. X`009`009`009`009`009if obj.kind = O_WEAPON then
  467. X`009`009`009`009`009`009writeln ('# is victim.');
  468. X`009`009`009`009`009if edit_desc(newdsc) then begin
  469. X`009`009`009`009`009`009getobj(objnum);
  470. X`009`009`009`009`009`009obj.usesuccess := newdsc;
  471. X`009`009`009`009`009`009putobj;
  472. X`009`009`009`009`009end;
  473. X`009`009`009`009     end;
  474. X`009`009`009`009'l': begin
  475. X`009`009`009`009`009writeln('Enter a one line description of what the object
  476. V will look like in any room.');
  477. X`009`009`009`009`009writeln('Example: "There is an as yet unknown object her
  478. Ve."');
  479. X`009`009`009`009`009writeln;
  480. X`009`009`009`009`009getobj(objnum);
  481. X`009`009`009`009`009freeobj;
  482. X`009`009`009`009`009n := obj.linedesc;
  483. X`009`009`009`009`009make_line(n);
  484. X`009`009`009`009`009getobj(objnum);
  485. X`009`009`009`009`009obj.linedesc := n;
  486. X`009`009`009`009`009putobj;
  487. X- 2293, 2350
  488. X`009`009end;
  489. X`009`009log_event(myslot,E_OBJDONE,objnum,0);
  490. X
  491. X`009end else
  492. X`009`009writeln('You are not allowed to program that object.');
  493. X`009end else
  494. X`009`009writeln('There is no object by that name.');
  495. X`009end;
  496. X`009exit_label:
  497. Xend;
  498. X
  499. X`123 -----------------------------------------------------------------------
  500. V---- `125
  501. X`091global`093 PROCEDURE type_paper;
  502. Xvar c_file: text;
  503. X    count,errorcode: integer;
  504. X    line: string;
  505. X    continue: boolean;
  506. X
  507. X    procedure leave;
  508. X    begin
  509. X`009writeln('EXIT');
  510. X`009line  := '-';
  511. X    end;
  512. X
  513. Xbegin
  514. X   open(c_file,root+'COMMANDS.PAPER',HISTORY := READONLY,
  515. X      sharing := READONLY ,error := continue);
  516. X   errorcode := status(c_file);
  517. X   if errorcode > 0 then begin
  518. X      case errorcode of
  519. X`0093: `123 PAS$K_FILNOTFOU `125 writeln('%File COMMANDS.PAPER not found.');
  520. X`009otherwise writeln('%Can''t open file COMMANDS.PAPER, error code (status)
  521. V: ',
  522. X`009    errorcode:1);
  523. X      end; `123 case `125
  524. X      writeln('% Notify Monster Manager.');
  525. X   end else begin
  526. X      reset(c_file);
  527. X      count := 0;
  528. X      continue := true;
  529. X      while not eof(c_file) and continue do begin
  530. X         readln(c_file,line);
  531. X         writeln(line);
  532. X         count := count +1;
  533. X         if count > terminal_page_len -2 then begin
  534. X            grab_line('-more-',line,,true,eof_handler := leave);
  535. X            continue := line = '';
  536. X            count := 0;
  537. X         end;
  538. X      end;
  539. X      close(c_file);
  540. X   end;
  541. Xend; `123 type_paper `125
  542. X
  543. Xprocedure do_y_altmsg;
  544. Xvar
  545. X`009newdsc: integer;
  546. X
  547. Xbegin
  548. X`009if is_owner then begin
  549. X`009`009gethere;
  550. X`009`009newdsc := here.xmsg2;
  551. X`009`009writeln('`091 Editing the alternate mystery message for this room `0
  552. V93');
  553. X`009`009if edit_desc(newdsc) then begin
  554. X`009`009`009getroom;
  555. X`009`009`009here.xmsg2 := newdsc;
  556. X`009`009`009putroom;
  557. X`009`009end;
  558. X- 2354, 2366
  559. X
  560. Xprocedure do_group1;
  561. Xlabel exit_label;
  562. Xvar
  563. X`009grpnam: string;
  564. X`009loc: integer;
  565. X`009tmp: string;
  566. X- 2370, 2370
  567. X`009writeln('EXIT - No changes.');
  568. X- 2374, 2419
  569. X`009
  570. Xbegin
  571. X`009if is_owner then begin
  572. X`009`009gethere;
  573. X`009`009if here.grploc1 = 0 then
  574. X`009`009`009writeln('No primary group location set')
  575. X`009`009else begin
  576. X`009`009`009getnam;
  577. X`009`009`009freenam;
  578. X`009`009`009writeln('The primary group location is ',nam.idents`091here.grpl
  579. Voc1`093,'.');
  580. X`009`009`009writeln('Descriptor string: `091',here.grpnam1,'`093');
  581. X`009`009end;
  582. X`009`009writeln;
  583. X`009`009writeln('Type * to turn off the primary group location');
  584. X`009`009grab_line('Room name of primary group? ',grpnam,
  585. X`009`009    eof_handler := leave);
  586. X`009`009if length(grpnam) = 0 then
  587. X`009`009`009writeln('No changes.')
  588. X`009`009else if grpnam = '*' then begin
  589. X`009`009`009getroom;
  590. X`009`009`009here.grploc1 := 0;
  591. X`009`009`009putroom;
  592. X`009`009end else if lookup_room(loc,grpnam) then begin
  593. X`009`009`009writeln('Enter the descriptive string.  It will be placed after
  594. V player names.');
  595. X`009`009`009writeln('Example:  Monster Manager is `091descriptive string, in
  596. Vstead of "here."`093');
  597. X`009`009`009writeln;
  598. X`009`009`009grab_line('Enter string? ',tmp,
  599. X`009`009`009    eof_handler := leave);
  600. X`009`009`009if length(tmp) > shortlen then begin
  601. X`009`009`009`009writeln('Your string was truncated to ',shortlen:1,' charact
  602. Vers.');
  603. X`009`009`009`009tmp := substr(tmp,1,shortlen);
  604. X`009`009`009end;
  605. X`009`009`009getroom;
  606. X`009`009`009here.grploc1 := loc;
  607. X`009`009`009here.grpnam1 := tmp;
  608. X`009`009`009putroom;
  609. X`009`009end else
  610. X`009`009`009writeln('No such room.');
  611. X- 2423, 2435
  612. X
  613. Xprocedure do_group2;
  614. Xlabel exit_label;
  615. Xvar
  616. X`009grpnam: string;
  617. X`009loc: integer;
  618. X`009tmp: string;
  619. X- 2439, 2439
  620. X`009writeln('EXIT - No changes.');
  621. X- 2444, 2502
  622. X`009if is_owner then begin
  623. X`009`009gethere;
  624. X`009`009if here.grploc2 = 0 then
  625. X`009`009`009writeln('No secondary group location set')
  626. X`009`009else begin
  627. X`009`009`009getnam;
  628. X`009`009`009freenam;
  629. X`009`009`009writeln('The secondary group location is ',nam.idents`091here.gr
  630. Vploc2`093,'.');
  631. X`009`009`009writeln('Descriptor string: `091',here.grpnam2,'`093');
  632. X`009`009end;
  633. X`009`009writeln;
  634. X`009`009writeln('Type * to turn off the secondary group location');
  635. X`009`009grab_line('Room name of secondary group? ',grpnam,
  636. X`009`009    eof_handler := leave);
  637. X`009`009if length(grpnam) = 0 then
  638. X`009`009`009writeln('No changes.')
  639. X`009`009else if grpnam = '*' then begin
  640. X`009`009`009getroom;
  641. X`009`009`009here.grploc2 := 0;
  642. X`009`009`009putroom;
  643. X`009`009end else if lookup_room(loc,grpnam) then begin
  644. X`009`009`009writeln('Enter the descriptive string.  It will be placed after
  645. V player names.');
  646. X`009`009`009writeln('Example:  Monster Manager is `091descriptive string, in
  647. Vstead of "here."`093');
  648. X`009`009`009writeln;
  649. X`009`009`009grab_line('Enter string? ',tmp,
  650. X`009`009`009    eof_handler := leave);
  651. X`009`009`009if length(tmp) > shortlen then begin
  652. X`009`009`009`009writeln('Your string was truncated to ',shortlen:1,' charact
  653. Vers.');
  654. X`009`009`009`009tmp := substr(tmp,1,shortlen);
  655. X`009`009`009end;
  656. X`009`009`009getroom;
  657. X`009`009`009here.grploc2 := loc;
  658. X`009`009`009here.grpnam2 := tmp;
  659. X`009`009`009putroom;
  660. X`009`009end else
  661. X`009`009`009writeln('No such room.');
  662. X`009end;
  663. X    exit_label:
  664. Xend;
  665. X
  666. X`123 custom MONSTER --------------------------------------------------------
  667. V---- `125
  668. X
  669. Xprocedure view2_monster(mid: integer);
  670. Xbegin
  671. X    getpers;
  672. X    freepers;
  673. X    writeln('Monster     : ',pers.idents`091mid`093);
  674. X    getint(N_EXPERIENCE);
  675. X    freeint;
  676. X    writeln(' experience : ',anint.int`091mid`093:1);
  677. X    writeln(' level      : ',leveltable`091level(anint.int`091mid`093)`093.n
  678. Vame);
  679. X    getint(N_HEALTH);
  680. X    freeint;
  681. X    writeln(' health     : ',anint.int`091mid`093:1);
  682. X    getint(N_PRIVILEGES);
  683. X    freeint;
  684. X    write  (' privileges : '); list_privileges(uint(anint.int`091mid`093));
  685. X    writeln;
  686. X    getint(N_SELF);
  687. X    freeint;
  688. X    if (anint.int`091mid`093 = 0) or (anint.int`091mid`093 = DEFAULT_LINE) t
  689. Vhen
  690. X`009writeln('Monster haven''t the self-description.')
  691. X    else print_desc(anint.int`091mid`093);
  692. Xend; `123 view2_monster `125
  693. X
  694. Xprocedure lister(code: integer);
  695. Xlabel 0; `123 out `125
  696. Xvar count: integer;
  697. X- 2506, 2506
  698. X`009writeln('EXIT');
  699. X`009goto 0;
  700. X    end;
  701. X
  702. X
  703. X    procedure print(l: mega_string);
  704. X    var s: string;
  705. X    begin
  706. X`009writeln(l);
  707. X`009count := count +1;
  708. X`009if count > terminal_page_len -2 then begin
  709. X`009    grab_line('-more-',s,erase := true,eof_handler := leave);
  710. X`009    if s > '' then goto 0;
  711. X`009    count := 0;
  712. X`009end;
  713. X    end; `123 print `125
  714. X
  715. Xbegin
  716. X    count := 0;
  717. X    list_program(code,print,terminal_line_len);
  718. X    0:
  719. Xend; `123 lister `125
  720. X
  721. Xprocedure lister_2(code: integer; param: string);
  722. Xlabel exit_label;
  723. Xvar list_file: text;
  724. X    name: string;
  725. X    counter,errorcode: integer;
  726. X    s: string;
  727. X
  728. X    procedure print(l: mega_string);
  729. X    begin
  730. X`009counter := counter + 1;
  731. X`009if (counter mod 50) = 0 then checkevents(TRUE);
  732. X`009writeln(list_file,l);
  733. X    end; `123 print `125
  734. X
  735. X    procedure leave;
  736. X    begin
  737. X`009writeln('EXIT');
  738. X- 2511, 2563
  739. X    counter := 0;
  740. X    if param = '' then begin
  741. X`009writeln('File name for listing ?');
  742. X`009writeln('Default: MDL.LIS');
  743. X`009grab_line('File name? ',s,eof_handler := leave);
  744. X    end else s := param;
  745. X    open(list_file,s,new,default := 'MDL.LIS',error := continue);
  746. X    errorcode := status(list_file);
  747. X    if errorcode > 0 then case errorcode of
  748. X`0094: `123 PAS$K_INVFILSYN `125 writeln('Illegal file name.');
  749. X`009otherwise writeln('Can''t open file for writing, error code (status): ',
  750. X`009    errorcode:1)
  751. X    end `123case `125
  752. X    else begin
  753. X`009rewrite(list_file);
  754. X`009list_program(code,print,terminal_line_len);
  755. X`009close(list_file);
  756. X    end;
  757. X    exit_label:
  758. Xend; `123 lister_2 `125
  759. X              `032
  760. XPROCEDURE custom_monster; `123 (name: string); forward; `125
  761. Xlabel exit_label;
  762. Xvar s,param,def: string;
  763. X    done,ok: boolean;
  764. X    mid,mslot,code,self,oldloc,old: integer;
  765. X    mname: shortstring;    `032
  766. X    notice: shortstring;
  767. X    lev,max,value,health,exp,i: integer;
  768. X    prevloc: integer;
  769. X- 2567, 2567
  770. X`009writeln('EXIT');
  771. X        log_event (myslot,E_MONSTERDONE,0,0,'');
  772. X- 2571, 2607
  773. X
  774. Xbegin
  775. X  oldloc := location;
  776. X  if not is_owner(location,TRUE) then `123 is_owner make gethere `125
  777. X     writeln('You must be in one of your own rooms to customize a monster.')
  778. X  else if name = '' then writeln('To customize a monster, type CUSTOM MONSTE
  779. VR <monster name>.')
  780. X  else if parse_pers(mslot,name) then begin
  781. X
  782. X     mname := here.people`091mslot`093.name;
  783. X     def := trim_filename(mname);
  784. X
  785. X     if exact_pers(mid,mname) then begin   `032
  786. X        if here.people`091mslot`093.kind = P_MONSTER then begin
  787. X           code := here.people`091mslot`093.parm;
  788. X           if (monster_owner(code) = userid) or owner_priv then begin
  789. X              log_action (e_custommonster,0);
  790. X              done := false;
  791. X              repeat
  792. X`009`009prevloc := location;
  793. X                grab_line ('Custom monster> ',s,eof_handler := leave);
  794. X                param := lowcase(s);
  795. X`009`009s := bite(param);
  796. X                getint(N_LOCATION);
  797. X                freeint;
  798. X`009`009if prevloc <> location then begin
  799. X`009`009   writeln('You can no longer customize this monster.');
  800. X                   done := true;
  801. X                end else if anint.int`091mid`093 <> location then begin
  802. X                   writeln ('Monster is no longer here.');
  803. X                   done := true
  804. X                end else if s > '' then case s`0911`093 of
  805. X                  'h','?': command_help('*monster help*');
  806. X                  'a'    : begin`032
  807. X                             lev := level(myexperience);
  808. X`009`009`009     if lev = levels then max := maxexperience
  809. X`009`009`009     else if leveltable`091lev+1`093.exp > maxexperience then
  810. X`009`009`009`009 max := maxexperience
  811. X`009`009`009     else max := leveltable`091lev+1`093.exp -1;
  812. X                             if param > '' then s := param
  813. X                             else begin
  814. X                                write('Give monster''s level ');
  815. X                                write(leveltable`0911`093.name,' - ');
  816. X`009`009`009`009writeln(leveltable`091lev`093.name);
  817. X`009`009`009`009writeln('or experience 0 - ',max:1,'.');
  818. X                                grab_line('Level or experience? ',s,
  819. X`009`009`009`009    eof_handler := leave);
  820. X                             end;
  821. X`009`009`009     value := -1;
  822. X                             if lookup_level(value,s) then begin
  823. X`009`009`009`009 value := leveltable`091value`093.exp;
  824. X`009`009`009     end else if isnum(s) then begin
  825. X`009`009`009`009 value := number(s);
  826. X`009`009`009`009 if (value < 0) or (value > max) then begin
  827. X`009`009`009`009     writeln('Out of range.');
  828. X`009`009`009`009     value := -1;
  829. X`009`009`009`009 end;
  830. X`009`009`009     end else begin
  831. X`009`009`009`009 writeln('Not such level or experience.');
  832. X`009`009`009`009 value := -1
  833. X`009`009`009     end;
  834. X`009`009`009     if userid <> MM_userid then begin
  835. X`009`009`009`009if leveltable`091level(value)`093.hidden and`032
  836. X`009`009`009`009    (level(value) <> lev) then begin
  837. X`009`009`009`009    writeln('You can give only your own hidden level.');
  838. X`009`009`009`009    value := -1;
  839. X`009`009`009`009end else if level(value) > lev then begin
  840. X`009`009`009`009    writeln('Not allowed.');
  841. X`009`009`009`009    value := -1;
  842. X`009`009`009`009end;
  843. X`009`009`009    end;
  844. X`009`009`009    if value >= 0 then begin
  845. X`009`009`009`009exp := value;`032
  846. X                                lev := level(value);
  847. X                                health := leveltable`091lev`093.health * goo
  848. Vdhealth`032
  849. X                                   div 10;
  850. X         `032
  851. X                                getroom;
  852. X                                here.people`091mslot`093.health := health;
  853. X                                here.people`091mslot`093.experience := exp;
  854. X                                putroom;
  855. X                                getint(N_HEALTH);
  856. X                                anint.int`091mid`093 := health;
  857. X                                putint;
  858. X                                getint(N_EXPERIENCE);
  859. X                                anint.int`091mid`093 := exp;
  860. X                                putint;
  861. X                                writeln('Monster''s experience is now ',exp:
  862. V1);
  863. X                                writeln('and health is ',health:1);
  864. X                             end;
  865. X                           end;
  866. X`009`009  'i'    : begin
  867. X`009`009`009     getint(N_EXPERIENCE);
  868. X`009`009`009     freeint;
  869. X`009`009`009     lev := level(anint.int`091mid`093);
  870. X`009`009`009     max := leveltable`091lev`093.health;
  871. X`009`009`009     if param > '' then s := param
  872. X`009`009`009     else begin
  873. X`009`009`009`009writeln('Give monster''s health 0 - ',max:1);
  874. X`009`009`009`009grab_line('Health? ',s,eof_handler := leave);
  875. X`009`009`009    end;
  876. X`009`009`009    if not isnum(s) then
  877. X`009`009`009`009writeln('Not such value.')
  878. X`009`009`009    else if (number(s) < 0) or (number(s) > max) then
  879. X`009`009`009`009writeln('Out of range.')
  880. X`009`009`009    else begin
  881. X`009`009`009`009health := number(s);
  882. X                                getroom;
  883. X                                here.people`091mslot`093.health := health;
  884. X                                putroom;
  885. X                                getint(N_HEALTH);
  886. X                                anint.int`091mid`093 := health;
  887. X                                putint;
  888. X`009`009`009`009writeln('Database updated.');
  889. X`009`009`009    end;
  890. X`009`009`009end;
  891. X                  'b'    : set_runnable(code,false);
  892. X                  'c'    : type_paper;
  893. X                  'd'    : begin
  894. X                             getint(N_PRIVILEGES);
  895. X                             freeint;
  896. X                             value := anint.int`091mid`093;
  897. X                             if custom_privileges(value,
  898. X`009`009`009`009read_cur_priv) then begin
  899. X                                getint(N_PRIVILEGES);
  900. X                                anint.int`091mid`093 := value;
  901. X                                putint;
  902. X                                writeln('Database updated.');
  903. X                             end else writeln('Database not updated.');
  904. X                           end;
  905. X                  'p'    : if monster_priv then monsterpriv(code)
  906. X                           else writeln ('This command is for Monster Manage
  907. Vr.');
  908. X                  'f'    : set_runnable(code,true);
  909. X                  'v'    : begin
  910. X`009`009`009       view2_monster(mid);
  911. X`009`009`009       grab_line('-more-',s,erase := true,
  912. X`009`009`009`009    eof_handler := leave);
  913. X`009`009`009       if s = '' then view_monster(code);
  914. X`009`009`009   end;
  915. X                  'm'    : begin
  916. X                             if param > '' then s := param
  917. X                             else grab_line('Label? ',s,eof_handler := leave
  918. V);
  919. X                             if s > '' then begin
  920. X                                if length(s) > shortlen then
  921. X                                  s := substr(s,1,shortlen);
  922. X                                if not run_monster(mname,code,s,'','',
  923. X                                   sysdate+' '+systime)
  924. X                                   then writeln ('Label not found or monster
  925. V is dead.');
  926. X                                if oldloc <> location then begin
  927. X                                   writeln('You are no longer customizing mo
  928. Vnster.');
  929. X                                   done := true;
  930. X                                end;
  931. X                             end;
  932. X                           end;
  933. X                  'g'    : begin
  934. X                             if param > '' then s := param
  935. X                             else begin
  936. X`009`009`009`009writeln('Default: ',def);
  937. X`009`009`009`009grab_line('File name? ',s,eof_handler := leave);
  938. X`009`009`009     end;
  939. X`009`009`009     load(code,s,sysdate+' '+systime,userid,def);
  940. X`009`009`009     getint(N_PRIVILEGES);
  941. X`009`009`009     value := anint.int`091mid`093;
  942. X`009`009`009     anint.int`091mid`093 := 0;
  943. X`009`009`009     putint;
  944. X`009`009`009     if value <> 0 then writeln('Monster''s privilege set is now
  945. V empty.');
  946. X                           end;
  947. X`009`009  'j'    : begin
  948. X`009`009`009     if get_flag(code,CF_NO_CONTROL) then begin
  949. X`009`009`009`009set_flag(code,CF_NO_CONTROL,false);
  950. X`009`009`009`009getint(N_PRIVILEGES);
  951. X`009`009`009`009value := anint.int`091mid`093;
  952. X`009`009`009`009anint.int`091mid`093 := 0;
  953. X`009`009`009`009putint;
  954. X`009`009`009`009if value <> 0 then writeln('Monster''s pprivilege set is now
  955. V empty.');
  956. X`009`009`009     end else set_flag(code,CF_NO_CONTROL,TRUE);
  957. X`009`009`009     writeln('Databse updated.');
  958. X`009`009`009   end;
  959. X                  's'    : begin
  960. X                             writeln ('Edit monster self description');
  961. X                             getint(N_SELF);
  962. X                             freeint;
  963. X                             self := anint.int`091mid`093;
  964. X                             if edit_desc(self) then begin
  965. X                                getroom;
  966. X                                here.people`091mslot`093.self := self;
  967. X                                putroom;
  968. X                                getint(N_SELF);
  969. X                                anint.int`091mid`093 := self;
  970. X                                putint;
  971. X                             end;
  972. X                           end;
  973. X                  'l'    : lister (code);
  974. X`009`009  'o'`009 : lister_2 (code,param);
  975. X                  'n'    : begin
  976. X                              if param > '' then s := param
  977. X                              else grab_line ('New name? ',s,eof_handler :=
  978. V leave);
  979. X                              if s = '' then writeln ('No changes')
  980. X                              else if length(s) > shortlen then
  981. X                                 writeln('Limit new name to ',shortlen:1,' c
  982. Vharacters.')
  983. X                              else if lowcase(s) = 'monster manager' then
  984. X                                 writeln ('That name is reserved for the Mon
  985. Vster Manager.')
  986. X                              else begin
  987. X                                 if exact_pers(old,s) then
  988. X                                    if old = mid then ok := true
  989. X                                    else begin
  990. X                                       ok := false;
  991. X                                       writeln ('Someone already has that na
  992. Vme.');
  993. X                                    end
  994. X                                 else ok := true;
  995. X                                 if ok then begin
  996. X                                    getroom;
  997. X                                    notice := here.people`091mslot`093.name;
  998. X                                    here.people`091mslot`093.name := s;
  999. X                                    putroom;
  1000. X                                    getpers;
  1001. X                                    pers.idents`091mid`093 := s;
  1002. X                                    putpers;
  1003. X                                    mname := s;
  1004. X                                    log_event(0,E_SETNAM,0,0,notice+' is now
  1005. V known as ' + s);
  1006. X                                 end
  1007. X                              end;
  1008. X                           end;
  1009. X                  'e','q': done := true;
  1010. X                   otherwise writeln ('Enter ? for help.');
  1011. X                end; `123 case `125
  1012. X              until done;               `032
  1013. X              log_event (myslot,E_MONSTERDONE,0,0,'');
  1014. X           end else writeln ('You are not the owner of this monster.');
  1015. X        end else writeln ('You can only customize monsters.');
  1016. X     end else writeln ('%serius error in custom_monster. Notify monster mana
  1017. Vger.');
  1018. X  end else writeln ('That monster isn''t here.');
  1019. X   exit_label:
  1020. X
  1021. Xend;`009`123 custom_monster `125
  1022. X
  1023. X`123 custom HOOK -----------------------------------------------------------
  1024. V---- `125
  1025. X
  1026. XPROCEDURE custom_hook `123(var code: integer; owner: shortstring;
  1027. X`009`009`009default: string := '.MDL')`125;
  1028. Xlabel exit_label;
  1029. Xvar done: boolean;
  1030. X    s,param: string;
  1031. X- 2611, 2611
  1032. X`009writeln('EXIT');
  1033. X- 2615, 2744
  1034. X
  1035. Xbegin
  1036. X  if code = 0 then begin `123 alloc code `125
  1037. X     if alloc_general(I_HEADER,code) then begin
  1038. X        create_program (code,owner,sysdate+' '+systime);
  1039. X        writeln ('New hook created.');
  1040. X     end else begin
  1041. X        writeln ('There is no place for any more hooks in this universe.');
  1042. X        code := 0
  1043. X     end;
  1044. X  end;
  1045. X  if code > 0 then begin
  1046. X     done := false;
  1047. X     repeat
  1048. X        grab_line ('Custom hook> ',s,eof_handler := leave);
  1049. X        param := lowcase(s);
  1050. X`009s := bite(param);
  1051. X        if s > '' then case s`0911`093 of
  1052. X           'h','?': command_help('*hook help*');
  1053. X           'b'    : set_runnable(code,false);
  1054. X           'c'    : type_paper;
  1055. X           'p'    : if monster_priv then monsterpriv(code)
  1056. X                    else writeln ('This command is for Monster Manager.');
  1057. X           'f'    : set_runnable(code,true);
  1058. X           'v'    : view_monster(code);
  1059. X           'm'    : begin
  1060. X                       if param > '' then s := param
  1061. X                       else grab_line('Label? ',s,eof_handler := leave);
  1062. X                       if s > '' then begin
  1063. X                          if length(s) > shortlen then
  1064. X                             s := substr(s,1,shortlen);
  1065. X                          if not run_monster('',code,s,'','',
  1066. X                             sysdate+' '+systime)
  1067. X                             then writeln ('Label not found.');
  1068. X                       end;
  1069. X                    end;
  1070. X           'g'    : begin
  1071. X                       if param > '' then s := param
  1072. X                       else begin
  1073. X`009`009`009    writeln('Default: ',default);
  1074. X`009`009`009    grab_line('File name? ',s,eof_handler := leave);
  1075. X`009`009       end;
  1076. X`009`009       load(code,s,sysdate+' '+systime,userid,default);
  1077. X                    end;                      `032
  1078. X           'l'    : lister (code);
  1079. X`009   'o'`009  : lister_2 (code,param);
  1080. X           'e','q': done := true;
  1081. X           'd'    : begin
  1082. X                       delete_program(code);
  1083. X                       delete_general(I_HEADER,code);
  1084. X                       done := true;
  1085. X                       code := 0;
  1086. X                       writeln ('Hook deleted.');
  1087. X                    end;
  1088. X           otherwise writeln ('Enter ? for help.');
  1089. X       end; `123 case `125
  1090. X     until done;
  1091. X  end;
  1092. X  exit_label:
  1093. Xend;
  1094. X
  1095. X`123 custom SPELL ----------------------------------------------------------
  1096. V----- `125
  1097. X
  1098. X`091global`093 PROCEDURE custom_spell(s: string);
  1099. Xlabel exit_label;
  1100. X
  1101. Xvar done: boolean;
  1102. X    param: string;
  1103. X    code: integer; owner: shortstring;
  1104. X    default: string;
  1105. X- 2748, 2749
  1106. X`009writeln('EXIT');
  1107. X`009log_event(myslot,E_SPELLDONE,0,0,'');
  1108. X- 2753, 3034
  1109. X    var new: boolean;
  1110. X`009sid,player: integer;
  1111. Xbegin
  1112. X  if (s = '') or (s = '?') then`032
  1113. X    writeln('Use SET SPELL <spell name> to customize spell.')
  1114. X  else begin
  1115. X    new := not lookup_spell(sid,s);
  1116. X `032
  1117. X    if new then begin
  1118. X`009code := 0;
  1119. X`009if alloc_general(I_SPELL,sid) then begin
  1120. X`009    getspell_name;
  1121. X`009    spell_name.idents`091sid`093 := s;
  1122. X`009    putspell_name;
  1123. X
  1124. X`009    if alloc_general(I_HEADER,code) then begin
  1125. X`009`009create_program (code,userid,sysdate+' '+systime);
  1126. X`009`009getint(N_SPELL);
  1127. X`009`009anint.int`091sid`093 := code;
  1128. X`009`009putint;
  1129. X
  1130. X`009`009getindex(I_PLAYER);
  1131. X`009`009freeindex;
  1132. X`009`009for player := 1 to indx.top do if not indx.free`091player`093 then
  1133. X`009`009    begin
  1134. X`009`009`009getspell(player);
  1135. X`009`009`009spell.level`091sid`093 := 0;
  1136. X`009`009`009putspell;
  1137. X`009`009    end;
  1138. X`009`009writeln ('New spell created.');
  1139. X`009`009       `009`009
  1140. X`009    end else begin
  1141. X`009`009writeln ('There is no place for any more spell codes in this univers
  1142. Ve.');
  1143. X`009`009code := 0;
  1144. X`009`009getspell_name;
  1145. X`009`009spell_name.idents`091sid`093 := '';
  1146. X`009`009putspell_name;
  1147. X`009`009delete_general(I_SPELL,sid);
  1148. X`009    end;
  1149. X`009end else writeln('There is no place for any more spells in this universe
  1150. V.');
  1151. X
  1152. X    end else begin
  1153. X`009getint(N_SPELL);
  1154. X`009freeint;
  1155. X`009code := anint.int`091sid`093;
  1156. X
  1157. X`009if not is_spell_owner(sid) then
  1158. X`009    begin
  1159. X`009`009writeln('You haven''t owner of this spell.');
  1160. X`009`009code := 0;
  1161. X`009    end;
  1162. X    end;
  1163. X
  1164. X    if code > 0 then begin
  1165. X       getspell_name;
  1166. X       freespell_name;
  1167. X       default := trim_filename(spell_name.idents`091sid`093);
  1168. X       log_action(e_customspell,0);
  1169. X
  1170. X       done := false;
  1171. X       repeat
  1172. X        grab_line ('Custom spell> ',s,eof_handler := leave);
  1173. X        param := lowcase(s);
  1174. X`009s := bite(param);
  1175. X        if s > '' then case s`0911`093 of
  1176. X           'h','?': command_help('*spell help*');
  1177. X           'b'    : set_runnable(code,false);
  1178. X           'c'    : type_paper;
  1179. X           'p'    : if monster_priv then monsterpriv(code)
  1180. X                    else writeln ('This command is for Monster Manager.');
  1181. X           'f'    : set_runnable(code,true);
  1182. X           'v'    : view_monster(code);
  1183. X           'm'    : begin
  1184. X                       if param > '' then s := param
  1185. X                       else grab_line('Label? ',s,eof_handler := leave);
  1186. X                       if s > '' then begin
  1187. X                          if length(s) > shortlen then
  1188. X                             s := substr(s,1,shortlen);
  1189. X                          if not run_monster('',code,s,'','',
  1190. X                             sysdate+' '+systime)
  1191. X                             then writeln ('Label not found.');
  1192. X                       end;
  1193. X                    end;
  1194. X           'g'    : begin
  1195. X                       if param > '' then s := param
  1196. X                       else begin
  1197. X`009`009`009    writeln('Default: ',default);
  1198. X`009`009`009    grab_line('File name? ',s,eof_handler := leave);
  1199. X`009`009       end;
  1200. X`009`009       if get_flag(code, CF_SPELL_MODE) then`032
  1201. X`009`009`009    set_flag(code, CF_SPELL_MODE,FALSE);
  1202. X`009`009       load(code,s,sysdate+' '+systime,userid,default);
  1203. X                    end;                      `032
  1204. X           'l'    : lister (code);
  1205. X`009   'o'`009  : lister_2 (code,param);
  1206. X           'e','q': done := true;
  1207. X           'd'    : begin
  1208. +-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
  1209.