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

  1. Path: uunet!mcsun!news.funet.fi!hydra!klaava!hurtta
  2. From: Kari.Hurtta@Helsinki.FI (Kari. E. Hurtta)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Monster Helsinki, Delta from 1.04 to 1.05 - part 1/7
  5. Message-ID: <1992Jun30.193316.10771@klaava.Helsinki.FI>
  6. Date: 30 Jun 92 19:33:16 GMT
  7. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  8. Followup-To: vmsnet.sources.d
  9. Organization: University of Helsinki
  10. Lines: 1511
  11.  
  12. Archive-name: monster_helsinki_104_to_105/delta1
  13. Environment: VMS, Pascal
  14. Author: Kari.Hurtta@Helsinki.FI
  15.  
  16. $! ------------------ CUT HERE -----------------------
  17. $!
  18. $! This archive created by VMS_SHARE Version 7.1-001  26-JUN-1989
  19. $!   On 30-JUN-1992 21:29:14.89   By user HURTTA (Kari E. Hurtta <Kari.Hurtta@Helsinki.FI>)
  20. $!
  21. $! This VMS_SHARE Written by:
  22. $!    Andy Harper, Kings College London UK
  23. $!
  24. $! Acknowledgements to:
  25. $!    James Gray       - Original VMS_SHARE
  26. $!    Michael Bednarek - Original Concept and implementation
  27. $!
  28. $!+ THIS PACKAGE DISTRIBUTED IN 7 PARTS, TO KEEP EACH PART
  29. $!  BELOW 90 BLOCKS
  30. $!
  31. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  32. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  33. $!
  34. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  35. $!       1. ALLOC.PAS;8
  36. $!       2. BONE.DIF;1
  37. $!       3. CASTLE.DIF;1
  38. $!       4. CLD.DIF;1
  39. $!       5. CLI.DIF;1
  40. $!       6. COMMANDS.DIF;1
  41. $!       7. CONVERT.DIF;1
  42. $!       8. CUSTOM.DIF;1
  43. $!       9. DATABASE.DIF;1
  44. $!      10. DOG.DIF;1
  45. $!      11. FIX.DIF;1
  46. $!      12. GLOBAL.DIF;1
  47. $!      13. GREAT_HALL.DIF;1
  48. $!      14. GUTS.DIF;1
  49. $!      15. ILMOITUS.DIF;1
  50. $!      16. INIT.DIF;1
  51. $!      17. INTERPRETER.DIF;1
  52. $!      18. KEYS.DIF;1
  53. $!      19. MAKEFILE.;61
  54. $!      20. MON.DIF;1
  55. $!      21. MONSTER.DIF;1
  56. $!      22. MONSTER_DUMP.DIF;1
  57. $!      23. MONSTER_E.DIF;1
  58. $!      24. MONSTER_INSTALL.DIF;1
  59. $!      25. MONSTER_REBUILD.PAS;14
  60. $!      26. MONSTER_WHO.DIF;1
  61. $!      27. PARSER.DIF;1
  62. $!      28. PRIVUSERS.DIF;1
  63. $!      29. QUEUE.DIF;1
  64. $!      30. READ.ME;1
  65. $!      31. RECEPTIONIST.DIF;1
  66. $!      32. UPDATE.COM;3
  67. $!      33. VERSION.PAS;8
  68. $!
  69. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  70. $e="write sys$error  ""%UNPACK"", "
  71. $w="write sys$output ""%UNPACK"", "
  72. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  73. $ if f$getsyi("version") .ges. "4.4" then $ goto START
  74. $ e "-E-OLDVER, Must run at least VMS 4.4"
  75. $ exit 44
  76. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  77. $ if f$search(P1) .eqs. "" then $ goto file_absent
  78. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  79. $ delete/nolog 'f'*
  80. $ exit
  81. $file_absent:
  82. $ if f$parse(P1) .nes. "" then $ goto dirok
  83. $ dn=f$parse(P1,,,"DIRECTORY")
  84. $ w "-I-CREDIR, Creating directory ''dn'."
  85. $ create/dir 'dn'
  86. $ if $status then $ goto dirok
  87. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  88. $ delete/nolog 'f'*
  89. $ exit
  90. $dirok:
  91. $ w "-I-PROCESS, Processing file ''P1'."
  92. $ define/user sys$output nl:
  93. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  94. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  95. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");
  96. buff:=CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(buff))
  97. ;LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  98. BEGINNING_OF(buff));g:=0;LOOP EXITIF MARK(NONE)=END_OF(buff);x:=
  99. ERASE_CHARACTER(1);IF g = 0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x=
  100. "V" THEN APPEND_LINE;MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;
  101. IF x="+" THEN g:=1;ERASE_LINE;ENDIF;ELSE IF x="-" THEN g:=0;ENDIF;ERASE_LINE;
  102. ENDIF;ENDLOOP;p:="`";POSITION(BEGINNING_OF(buff));LOOP r:=SEARCH(p,FORWARD);
  103. EXITIF r=0;POSITION(r);ERASE(r);COPY_TEXT(ASCII(INT(ERASE_CHARACTER(3))));
  104. ENDLOOP;o:=GET_INFO(COMMAND_LINE,"output_file");WRITE_FILE(buff,o);
  105. ENDPROCEDURE;Unpacker;EXIT;
  106. $ delete/nolog 'f'*
  107. $ CHECKSUM 'P1'
  108. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  109. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  110. $ ENDSUBROUTINE
  111. $START:
  112. $ create/nolog 'f'
  113. X`091 ENVIRONMENT, INHERIT('database', 'guts', 'global' , 'privusers', 'parse
  114. Vr')`093
  115. XMODULE ALLOC (OUTPUT) ;
  116. X`032
  117. X`123
  118. XPROGRAM DESCRIPTION:`032
  119. X`032
  120. X    ALLOC module for CUSTOM module (and MONSTER/REBUILD and /FIX)
  121. X`032
  122. XAUTHORS:`032
  123. X`032
  124. X    Kari Hurtta
  125. X`032
  126. XCREATION DATE:`00925.6.1992
  127. X`032
  128. X`032
  129. X`009    C H A N G E   L O G
  130. X`032
  131. X     Date     `124   Name  `124 Description
  132. X--------------+---------+---------------------------------------------------
  133. V----
  134. X   25.60.1992 `124 Hurtta  `124 Allocation routines moved to module ALLOC fr
  135. Vom`032
  136. X              `124         `124 module CUSTOM, nc_createroom
  137. X`125
  138. X
  139. XVAR
  140. X
  141. X`009userid: `091global`093 veryshortstring;`009`123 userid of this player `1
  142. V25
  143. X`032
  144. X`123 allocation routines ---------------------------------------------------
  145. V--- `125
  146. X
  147. X`123
  148. XFirst procedure of form alloc_X
  149. XAllocates the oneliner resource using the indexrec bitmaps
  150. X
  151. XReturn the number of a one liner if one is available
  152. Xand remove it from the free list
  153. X`125
  154. X`091global`093 FUNCTION alloc_line(var n: integer):boolean;
  155. Xvar
  156. X`009found: boolean;
  157. X
  158. Xbegin
  159. X`009getindex(I_LINE);
  160. X`009if indx.inuse = indx.top then begin
  161. X`009`009freeindex;
  162. X`009`009n := 0;
  163. X`009`009alloc_line := false;
  164. X`009`009writeln('There are no available one line descriptions.');
  165. X`009end else begin
  166. X`009`009n := 1;
  167. X`009`009found := false;
  168. X`009`009while (not found) and (n <= indx.top) do begin
  169. X`009`009`009if indx.free`091n`093 then
  170. X`009`009`009`009found := true
  171. X`009`009`009else
  172. X`009`009`009`009n := n + 1;
  173. X`009`009end;
  174. X`009`009if found then begin
  175. X`009`009`009indx.free`091n`093 := false;
  176. X`009`009`009alloc_line := true;
  177. X`009`009`009indx.inuse := indx.inuse + 1;
  178. X`009`009`009putindex;
  179. X`009`009end else begin
  180. X`009`009`009freeindex;
  181. X`009`009`009writeln('%serious error in alloc_line; notify Monster Manager');
  182. X`009`009`009
  183. X`009`009`009alloc_line := false;
  184. X`009`009end;
  185. X`009end;
  186. Xend;
  187. X
  188. X`123
  189. Xput the line specified by n back on the free list
  190. Xzeroes n also, for convenience
  191. X`125
  192. X`091global`093 PROCEDURE delete_line(var n: integer);
  193. X
  194. Xbegin
  195. X`009if n = DEFAULT_LINE then
  196. X`009`009n := 0
  197. X`009else if n > 0 then begin
  198. X`009`009getindex(I_LINE);
  199. X`009`009indx.inuse := indx.inuse - 1;
  200. X`009`009indx.free`091n`093 := true;
  201. X`009`009putindex;
  202. X`009end;
  203. X`009n := 0;
  204. Xend;
  205. X
  206. X
  207. X
  208. X`091global`093 FUNCTION alloc_int(var n: integer):boolean;
  209. Xvar
  210. X`009found: boolean;
  211. X
  212. Xbegin
  213. X`009getindex(I_INT);
  214. X`009if indx.inuse = indx.top then begin
  215. X`009`009freeindex;
  216. X`009`009n := 0;
  217. X`009`009alloc_int := false;
  218. X`009`009writeln('There are no available integer records.');
  219. X`009end else begin
  220. X`009`009n := 1;
  221. X`009`009found := false;
  222. X`009`009while (not found) and (n <= indx.top) do begin
  223. X`009`009`009if indx.free`091n`093 then
  224. X`009`009`009`009found := true
  225. X`009`009`009else
  226. X`009`009`009`009n := n + 1;
  227. X`009`009end;
  228. X`009`009if found then begin
  229. X`009`009`009indx.free`091n`093 := false;
  230. X`009`009`009alloc_int := true;
  231. X`009`009`009indx.inuse := indx.inuse + 1;
  232. X`009`009`009putindex;
  233. X`009`009end else begin
  234. X`009`009`009freeindex;
  235. X`009`009`009writeln('%serious error in alloc_int; notify Monster Manager');
  236. X`009`009`009
  237. X`009`009`009alloc_int := false;
  238. X`009`009end;
  239. X`009end;
  240. Xend;
  241. X
  242. X
  243. X`091global`093 PROCEDURE delete_int(var n: integer);
  244. X
  245. Xbegin
  246. X`009if n > 0 then begin
  247. X`009`009getindex(I_INT);
  248. X`009`009indx.inuse := indx.inuse - 1;
  249. X`009`009indx.free`091n`093 := true;
  250. X`009`009putindex;
  251. X`009end;
  252. X`009n := 0;
  253. Xend;
  254. X
  255. X
  256. X
  257. X`123
  258. XReturn the number of a description block if available and
  259. Xremove it from the free list
  260. X`125
  261. X`091global`093 FUNCTION alloc_block(var n: integer):boolean;
  262. Xvar
  263. X`009found: boolean;
  264. X
  265. Xbegin
  266. X`009if debug then
  267. X`009`009writeln('%alloc_block entry');
  268. X`009getindex(I_BLOCK);
  269. X`009if indx.inuse = indx.top then begin
  270. X`009`009freeindex;
  271. X`009`009n := 0;
  272. X`009`009alloc_block := false;
  273. X`009`009writeln('There are no available description blocks.');
  274. X`009end else begin
  275. X`009`009n := 1;
  276. X`009`009found := false;
  277. X`009`009while (not found) and (n <= indx.top) do begin
  278. X`009`009`009if indx.free`091n`093 then
  279. X`009`009`009`009found := true
  280. X`009`009`009else
  281. X`009`009`009`009n := n + 1;
  282. X`009`009end;
  283. X`009`009if found then begin
  284. X`009`009`009indx.free`091n`093 := false;
  285. X`009`009`009alloc_block := true;
  286. X`009`009`009indx.inuse := indx.inuse + 1;
  287. X`009`009`009putindex;
  288. X`009`009`009if debug then
  289. X`009`009`009`009writeln('%alloc_block successful');
  290. X`009`009end else begin
  291. X`009`009`009freeindex;
  292. X`009`009`009writeln('%serious error in alloc_block; notify Monster Manager')
  293. V;
  294. X`009`009`009alloc_block := false;
  295. X`009`009end;
  296. X`009end;
  297. Xend;
  298. X
  299. X
  300. X
  301. X
  302. X`123
  303. Xputs a description block back on the free list
  304. Xzeroes n for convenience
  305. X`125
  306. X`091global`093 PROCEDURE delete_block(var n: integer);
  307. X
  308. Xbegin
  309. X`009if n = DEFAULT_LINE then
  310. X`009`009n := 0`009`009`123 no line really exists in the file `125
  311. X`009else if n > 0 then begin
  312. X`009`009getindex(I_BLOCK);
  313. X`009`009indx.inuse := indx.inuse - 1;
  314. X`009`009indx.free`091n`093 := true;
  315. X`009`009putindex;
  316. X`009`009n := 0;
  317. X`009end else if n < 0 then begin
  318. X`009`009n := (- n);
  319. X`009`009delete_line(n);
  320. X`009end;
  321. Xend;
  322. X
  323. X
  324. X
  325. X`123
  326. XReturn the number of a room if one is available
  327. Xand remove it from the free list
  328. X`125
  329. X`091global`093 FUNCTION alloc_room(var n: integer):boolean;
  330. Xvar
  331. X`009found: boolean;
  332. X
  333. Xbegin
  334. X`009getindex(I_ROOM);
  335. X`009if indx.inuse = indx.top then begin
  336. X`009`009freeindex;
  337. X`009`009n := 0;
  338. X`009`009alloc_room := false;
  339. X`009`009writeln('There are no available free rooms.');
  340. X`009end else begin
  341. X`009`009n := 1;
  342. X`009`009found := false;
  343. X`009`009while (not found) and (n <= indx.top) do begin
  344. X`009`009`009if indx.free`091n`093 then
  345. X`009`009`009`009found := true
  346. X`009`009`009else
  347. X`009`009`009`009n := n + 1;
  348. X`009`009end;
  349. X`009`009if found then begin
  350. X`009`009`009indx.free`091n`093 := false;
  351. X`009`009`009alloc_room := true;
  352. X`009`009`009indx.inuse := indx.inuse + 1;
  353. X`009`009`009putindex;
  354. X`009`009end else begin
  355. X`009`009`009freeindex;
  356. X`009`009`009writeln('%serious error in alloc_room; notify Monster Manager');
  357. X`009`009`009alloc_room := false;
  358. X`009`009end;
  359. X`009end;
  360. Xend;
  361. X
  362. X`123
  363. XCalled by DEL_ROOM()
  364. Xput the room specified by n back on the free list
  365. Xzeroes n also, for convenience
  366. X`125
  367. X`091global`093 PROCEDURE delete_room(var n: integer);
  368. X
  369. Xbegin
  370. X`009if n <> 0 then begin
  371. X`009`009getindex(I_ROOM);
  372. X`009`009indx.inuse := indx.inuse - 1;
  373. X`009`009indx.free`091n`093 := true;
  374. X`009`009putindex;
  375. X`009`009n := 0;
  376. X`009end;
  377. Xend;
  378. X
  379. X
  380. X
  381. X`091global`093 FUNCTION alloc_log(var n: integer):boolean;
  382. Xvar
  383. X`009found: boolean;
  384. X
  385. Xbegin
  386. X`009getindex(I_PLAYER);
  387. X`009if indx.inuse = indx.top then begin
  388. X`009`009freeindex;
  389. X`009`009n := 0;
  390. X`009`009alloc_log := false;
  391. X`009`009writeln('There are too many monster players, you can''t find a space
  392. V.');
  393. X`009end else begin
  394. X`009`009n := 1;
  395. X`009`009found := false;
  396. X`009`009while (not found) and (n <= indx.top) do begin
  397. X`009`009`009if indx.free`091n`093 then
  398. X`009`009`009`009found := true
  399. X`009`009`009else
  400. X`009`009`009`009n := n + 1;
  401. X`009`009end;
  402. X`009`009if found then begin
  403. X`009`009`009indx.free`091n`093 := false;
  404. X`009`009`009alloc_log := true;
  405. X`009`009`009indx.inuse := indx.inuse + 1;
  406. X`009`009`009putindex;
  407. X`009`009end else begin
  408. X`009`009`009freeindex;
  409. X`009`009`009writeln('%serious error in alloc_log; notify Monster Manager');
  410. X`009`009`009alloc_log := false;
  411. X`009`009end;
  412. X`009end;
  413. Xend;
  414. X
  415. X`091global`093 PROCEDURE delete_log(var n: integer);
  416. X
  417. Xbegin
  418. X`009if n <> 0 then begin
  419. X`009`009getindex(I_PLAYER);
  420. X`009`009indx.inuse := indx.inuse - 1;
  421. X`009`009indx.free`091n`093 := true;
  422. X`009`009putindex;
  423. X`009`009n := 0;
  424. X`009end;
  425. Xend;
  426. X
  427. X
  428. X`091global`093 FUNCTION alloc_obj(var n: integer):boolean;
  429. Xvar
  430. X`009found: boolean;
  431. X
  432. Xbegin
  433. X`009getindex(I_OBJECT);
  434. X`009if indx.inuse = indx.top then begin
  435. X`009`009freeindex;
  436. X`009`009n := 0;
  437. X`009`009alloc_obj := false;
  438. X`009`009writeln('All of the possible objects have been made.');
  439. X`009end else begin
  440. X`009`009n := 1;
  441. X`009`009found := false;
  442. X`009`009while (not found) and (n <= indx.top) do begin
  443. X`009`009`009if indx.free`091n`093 then
  444. X`009`009`009`009found := true
  445. X`009`009`009else
  446. X`009`009`009`009n := n + 1;
  447. X`009`009end;
  448. X`009`009if found then begin
  449. X`009`009`009indx.free`091n`093 := false;
  450. X`009`009`009alloc_obj := true;
  451. X`009`009`009indx.inuse := indx.inuse + 1;
  452. X`009`009`009putindex;
  453. X`009`009end else begin
  454. X`009`009`009freeindex;
  455. X`009`009`009writeln('%serious error in alloc_obj; notify Monster Manager');
  456. X`009`009`009alloc_obj := false;
  457. X`009`009end;
  458. X`009end;
  459. Xend;
  460. X
  461. X
  462. X`091global`093 PROCEDURE delete_obj(var n: integer);
  463. X
  464. Xbegin
  465. X`009if n <> 0 then begin
  466. X`009`009getindex(I_OBJECT);
  467. X`009`009indx.inuse := indx.inuse - 1;
  468. X`009`009indx.free`091n`093 := true;
  469. X`009`009putindex;
  470. X`009`009n := 0;
  471. X`009end;
  472. Xend;
  473. X
  474. X
  475. X`091GLOBAL`093 function alloc_detail(var n: integer;s: string): boolean;
  476. Xvar
  477. X`009found: boolean;
  478. X
  479. Xbegin
  480. X`009n := 1;
  481. X`009found := false;
  482. X`009while (n <= maxdetail) and (not found) do begin
  483. X`009`009if here.detaildesc`091n`093 = 0 then
  484. X`009`009`009found := true
  485. X`009`009else
  486. X`009`009`009n := n + 1;
  487. X`009end;
  488. X`009alloc_detail := found;
  489. X`009if not(found) then
  490. X`009`009n := 0
  491. X`009else begin
  492. X`009`009getroom;
  493. X`009`009here.detail`091n`093 := lowcase(s);
  494. X`009`009putroom;
  495. X`009end;
  496. Xend;
  497. X
  498. X`123------------------------------------------------------------------------
  499. V---- `125
  500. X
  501. X`091global`093
  502. Xfunction nc_createroom(s: string):boolean; `123 create a room with name s `1
  503. V25
  504. Xvar
  505. X`009roomno: integer;
  506. X`009dummy: integer;
  507. X`009i:integer;
  508. X`009rand_accept: integer;
  509. X
  510. Xbegin
  511. X`009if alloc_room(roomno) then begin
  512. X
  513. X`009`009getnam;
  514. X`009`009nam.idents`091roomno`093 := lowcase(s);`009`123 assign room name `12
  515. V5
  516. X`009`009putnam;`009`009`009`009`009`123 case insensitivity `125
  517. X
  518. X`009`009getown;
  519. X`009`009own.idents`091roomno`093 := userid;`009`123 assign room owner `125
  520. X`009`009putown;
  521. X
  522. X`009`009getroom(roomno);
  523. X
  524. X`009`009here.primary := 0;
  525. X`009`009here.secondary := 0;
  526. X`009`009here.which := 0;`009`123 print primary desc only by default `125
  527. X`009`009here.magicobj := 0;
  528. X
  529. X`009`009here.owner := userid;`009`123 owner and name are stored here too `12
  530. V5
  531. X`009`009here.nicename := s;
  532. X`009`009here.nameprint := 1;`009`123 You're in ... `125
  533. X`009`009here.objdrop := 0;`009`123 objects dropped stay here `125
  534. X`009`009here.objdesc := 0;`009`123 nothing printed when they drop `125
  535. X`009`009here.magicobj := 0;`009`123 no magic object default `125
  536. X`009`009here.trapto := 0;`009`123 no trapdoor `125
  537. X`009`009here.trapchance := 0;`009`123 no chance `125
  538. X`009`009here.rndmsg := DEFAULT_LINE;`009`123 bland noises message `125
  539. X`009`009here.pile := 0;
  540. X`009`009here.grploc1 := 0;
  541. X`009`009here.grploc2 := 0;
  542. X`009`009here.grpnam1 := '';
  543. X`009`009here.grpnam2 := '';
  544. X
  545. X`009`009here.effects := 0;
  546. X`009`009here.parm := 0;
  547. X
  548. X`009`009here.xmsg2 := 0;
  549. X`009`009here.hook := 0;
  550. X
  551. X`009`009here.exp3 := 0;
  552. X`009`009here.exp4 := 0;
  553. X`009`009here.exitfail := DEFAULT_LINE;
  554. X`009`009here.ofail := DEFAULT_LINE;
  555. X
  556. X`009`009for i := 1 to maxpeople do
  557. X`009`009`009here.people`091i`093.kind := 0;
  558. X
  559. X`009`009for i := 1 to maxpeople do
  560. X`009`009`009here.people`091i`093.name := '';
  561. X
  562. X`009`009for i := 1 to maxobjs do
  563. X`009`009`009here.objs`091i`093 := 0;
  564. X
  565. X`009`009for i := 1 to maxdetail do
  566. X`009`009`009here.detail`091i`093 := '';
  567. X`009`009for i := 1 to maxdetail do
  568. X`009`009`009here.detaildesc`091i`093 := 0;
  569. X
  570. X`009`009for i := 1 to maxobjs do
  571. X`009`009`009here.objhide`091i`093 := 0;
  572. X
  573. X`009`009for i := 1 to maxexit do
  574. X`009`009`009with here.exits`091i`093 do begin
  575. X`009`009`009`009toloc := 0;
  576. X`009`009`009`009kind := 0;
  577. X`009`009`009`009slot := 0;
  578. X`009`009`009`009exitdesc := DEFAULT_LINE;
  579. X`009`009`009`009fail := DEFAULT_LINE;
  580. X`009`009`009`009success := 0;`009`123 no success desc by default `125
  581. X`009`009`009`009goin := DEFAULT_LINE;
  582. X`009`009`009`009comeout := DEFAULT_LINE;
  583. X`009`009`009`009closed := DEFAULT_LINE;
  584. X
  585. X`009`009`009`009objreq := 0;
  586. X`009`009`009`009hidden := 0;
  587. X`009`009`009`009alias := '';
  588. X
  589. X`009`009`009`009reqverb := false;
  590. X`009`009`009`009reqalias := false;
  591. X`009`009`009`009autolook := true;
  592. X`009`009`009end;
  593. X`009`009
  594. X`123`009`009here.exits := zero;`009`125
  595. X
  596. X`009`009`009`009`123 random accept for this room `125
  597. X`009`009rand_accept := 1 + (rnd100 mod maxexit);
  598. X`009`009here.exits`091rand_accept`093.kind := 5;
  599. X
  600. X`009`009putroom;
  601. X
  602. X`009`009change_owner(0,mylog);
  603. X`009`009nc_createroom := true;      `123 succeed `125
  604. X`009end else nc_createroom := false;    `123 failed `125
  605. Xend; `123 createroom `125
  606. X
  607. XEND.
  608. $ CALL UNPACK ALLOC.PAS;8 2052593655
  609. $ create/nolog 'f'
  610. X/
  611. $ CALL UNPACK BONE.DIF;1 47
  612. $ create/nolog 'f'
  613. X-    1,    4
  614. XDATABASE%1.03
  615. XBY%hurtta
  616. XBLOCKCOUNT%133
  617. XLINECOUNT%186
  618. X-  895,  897
  619. XRCOUNT%86
  620. XECOUNT%86
  621. XLASTRUN%30-JUN-1992  8:07pm
  622. X- 1917, 1919
  623. XRCOUNT%67
  624. XECOUNT%67
  625. XLASTRUN%30-JUN-1992  8:07pm
  626. X- 1929, 1935
  627. XRCOUNT%286
  628. XECOUNT%0
  629. XLASTRUN%30-JUN-1992  8:07pm
  630. XSTATLAB%look around
  631. XRCOUNT%966
  632. XECOUNT%0
  633. XLASTRUN%30-JUN-1992  8:07pm
  634. X- 1941, 1943
  635. XRCOUNT%209
  636. XECOUNT%0
  637. XLASTRUN%30-JUN-1992  8:05pm
  638. X- 4478, 4480
  639. XVIRTUAL%1
  640. XNAME%Debugger
  641. XUSER%"debugger"
  642. XDATE%30-JUN-1992  8:07pm
  643. X- 4499, 4499
  644. XLOC%great hall
  645. X- 4659, 4659
  646. XDATE%30-JUN-1992  8:07pm
  647. X- 6525, 6525
  648. XDESCLINE%Why don't you just go out instead of hitting your head against the
  649. V wall
  650. X- 6541, 6541
  651. XDESCLINE%Why don't you just go out instead of hitting your head against the
  652. V wall
  653. X- 6557, 6557
  654. XDESCLINE%Why don't you just go out instead of hitting your head against the
  655. V wall
  656. X- 6573, 6573
  657. XDESCLINE%Why don't you just go out instead of hitting your head against the
  658. V wall
  659. X- 9112, 9122
  660. XRCOUNT%133
  661. XECOUNT%133
  662. XLASTRUN%30-JUN-1992  8:07pm
  663. XSTATLAB%look
  664. XRCOUNT%183
  665. XECOUNT%183
  666. XLASTRUN%30-JUN-1992  8:07pm
  667. XSTATLAB%leave
  668. XRCOUNT%134
  669. XECOUNT%134
  670. XLASTRUN%30-JUN-1992  8:07pm
  671. X-11116,11116
  672. XGRPLOC2%%%NULL%%
  673. X/
  674. $ CALL UNPACK CASTLE.DIF;1 203844372
  675. $ create/nolog 'f'
  676. X-   10
  677. Xdefine syntax MONSTER_REBUILD
  678. X   image %image_dir%monster_rebuild
  679. X-   17,   17
  680. X      nonnegatable
  681. X      syntax = MONSTER_REBUILD
  682. X   qualifier FIX
  683. X      nonnegatable
  684. X      syntax = MONSTER_REBUILD
  685. X-   25
  686. X      nonnegatable
  687. X      syntax = MONSTER_REBUILD
  688. X/
  689. $ CALL UNPACK CLD.DIF;1 1445682434
  690. $ create/nolog 'f'
  691. X-   31,   36
  692. X-   46,   47
  693. X`009writeln('VERSION:     ',VERSION);
  694. X`009writeln('DISTRIBUTED: ',DISTRIBUTED);
  695. X-   59,   91
  696. X
  697. X-  102,  107
  698. X`009do_fix, do_batch : boolean;
  699. Xbegin
  700. X-  127,  173
  701. X-  185,  198
  702. X/
  703. $ CALL UNPACK CLI.DIF;1 1784836156
  704. $ create/nolog 'f'
  705. X-   39,   39
  706. X                                spell level / set spell level / prog
  707. X-   79
  708. X`009`009prog`009eval all paramaters, return value of last paramater
  709. X-  445,  446
  710. Xand`009`009(<item list 1>,<item list 2>,...,<item list n>)`032
  711. Xor`009`009(<item list 1>,...,<item list n>)`032
  712. X-  458
  713. Xprog`009`009(<action 1>,<action 2>,<action 3>,...,<action n>)`032
  714. X-  495,  495
  715. Xlookup direction(<direction list>)
  716. X/
  717. $ CALL UNPACK COMMANDS.DIF;1 157238978
  718. $ create/nolog 'f'
  719. X/
  720. $ CALL UNPACK CONVERT.DIF;1 47
  721. $ create/nolog 'f'
  722. X-    2,    2
  723. X`009`009`009'Interpreter','Queue', 'Alloc') `093
  724. X-   27,   27
  725. X    5.10.1990 `124 Hurtta  `124 Spells
  726. X-   31,   31
  727. X   25.06.1992 `124         `124 Moved to module ALLOC
  728. X   25.06.1992 `124 Hurtta  `124 Allocation routines moved to module ALLOC fr
  729. Vom`032
  730. X              `124         `124 module CUSTOM
  731. X`125
  732. X-   42,   43
  733. X`009`123 userid moved to module ALLOC `125
  734. X
  735. X-  143,  181
  736. X
  737. X`123 -----------------------------------------------------------------------
  738. V--- `125
  739. X
  740. X
  741. X`123
  742. XReturns TRUE if player is owner of room n
  743. XIf no n is given default will be this room (location)
  744. X`125
  745. X`091global`093 FUNCTION is_owner(n: integer := 0;surpress:boolean := false):
  746. V boolean;
  747. Xbegin
  748. X`009gethere(n);
  749. X`009if (here.owner = userid) or`032
  750. X`009    (owner_priv and (here.owner <> system_id)) or`032
  751. X`009    manager_priv then  `123 minor change by leino@finuha `125
  752. X`009`009`009`009`123 and hurtta@finuh `125
  753. X`009`009is_owner := true
  754. X`009else begin
  755. X`009`009is_owner := false;
  756. X`009`009if not(surpress) then begin
  757. X`009`009    if here.owner = system_id then
  758. X`009`009`009writeln('System is the owner of this room.')
  759. X`009`009    else
  760. X`009`009`009writeln('You are not the owner of this room.');
  761. X-  186,  235
  762. X`091global`093 FUNCTION room_owner(n: integer): string;
  763. Xbegin
  764. X`009if n <> 0 then begin
  765. X`009`009gethere(n);
  766. X`009`009room_owner := here.owner;
  767. X`009`009gethere;`009`123 restore old state! `125
  768. X`009end else
  769. X`009`009room_owner := 'no room';
  770. Xend;
  771. X
  772. X`123
  773. XReturns TRUE if player is allowed to alter the exit
  774. XTRUE if either this room or if target room is owned by player
  775. X`125
  776. X`091global`093 FUNCTION can_alter(dir: integer;room: integer := 0): boolean;
  777. Xbegin
  778. X`009gethere;
  779. X`009if (here.owner = userid) or`032
  780. X`009    (owner_priv and (here.owner <> system_id)) or
  781. X`009    manager_priv then begin  `123 minor change by leino@finuha `125
  782. X`009`009can_alter := true
  783. X`009end else begin
  784. X`009`009if here.exits`091dir`093.toloc > 0 then begin
  785. X`009`009`009if room_owner(here.exits`091dir`093.toloc) = userid then
  786. X`009`009`009`009can_alter := true
  787. X`009`009`009else can_alter := false;
  788. X`009`009end else can_alter := false;
  789. X`009end;
  790. Xend;
  791. X`091global`093 FUNCTION can_make(dir: integer;room: integer := 0): boolean;
  792. Xbegin
  793. X
  794. X`009gethere(room);`009`123 5 is accept door `125
  795. X`009if (here.exits`091dir`093.toloc <> 0) then begin
  796. X`009`009writeln('There is already an exit there.  Use UNLINK or RELINK.');
  797. X`009`009can_make := false;
  798. X`009end else begin
  799. X`009`009if (here.owner = userid) or`009`009`123 I'm the owner `125
  800. X`009`009   (here.exits`091dir`093.kind = 5) or`009`123 there's an accept `12
  801. V5
  802. X`009`009   (owner_priv and (here.owner <> system_id)) or`009
  803. X`009`009   manager_priv or `123 Monster Manager `125`032
  804. X`009`009   `123 minor change by leino@finuha and hurtta@finuh `125
  805. X`009`009   (here.owner = disowned_id)`009       `123 disowned room `125
  806. X`009`009`009`009`009`009`009 then
  807. X`009`009`009can_make := true
  808. X`009`009else begin
  809. X`009`009`009can_make := false;
  810. X`009`009`009writeln('You are not allowed to create an exit there.');
  811. X-  240,  292
  812. X`091global`093 PROCEDURE niceprint(var len: integer; s: string);
  813. Xbegin
  814. X`009if len + length(s) > terminal_line_len -2 then begin
  815. X`009`009len := length(s);
  816. X`009`009writeln;
  817. X`009end else begin
  818. X`009`009len := len + length(s);
  819. X`009end;
  820. X`009write(s);
  821. Xend;
  822. X`091global`093 PROCEDURE print_short(s: string; cr: boolean; var len: intege
  823. Vr);
  824. Xvar i,j: integer;
  825. Xbegin
  826. X    i := 1;
  827. X    for j := 1 to length(s) do begin
  828. X`009if s`091j`093 = ' ' then begin
  829. X`009    niceprint(len,substr(s,i,j-i+1));
  830. X`009    i := j+1;
  831. X`009end;
  832. X    end;
  833. X    if i <= length(s) then
  834. X`009niceprint(len,substr(s,i,length(s)-i+1));
  835. X    if cr then begin
  836. X`009writeln;   `032
  837. X`009len := 0;
  838. X    end;
  839. Xend;`032
  840. X
  841. X`123
  842. Xprint a one liner
  843. X`125
  844. X`091global`093 PROCEDURE print_line(n: integer);
  845. Xvar len: integer;
  846. Xbegin
  847. X`009len := 0;
  848. X`009if n = DEFAULT_LINE then
  849. X`009`009writeln('<default line>')
  850. X`009else if n > 0 then begin
  851. X`009`009getline(n);
  852. X`009`009freeline;
  853. X`009`009if terminal_line_len < 80 then`032
  854. X`009`009    print_short(oneliner.theline,true,len)
  855. X`009`009else
  856. X`009`009    writeln(oneliner.theline);
  857. X-  296,  316
  858. X`091global`093 PROCEDURE print_desc(dsc: integer;default:string := '<no defa
  859. Vult supplied>');
  860. Xvar
  861. X`009i: integer;
  862. X`009len: integer;
  863. Xbegin
  864. X`009if dsc = DEFAULT_LINE then begin
  865. X`009`009writeln(default);
  866. X`009end else if dsc > 0 then begin
  867. X`009`009getblock(dsc);
  868. X`009`009freeblock;
  869. X`009`009i := 1;
  870. X`009`009len := 0;
  871. X`009`009while i <= block.desclen do begin
  872. X`009`009    if terminal_line_len < 80 then
  873. X`009`009`009print_short(block.lines`091i`093,i = block.desclen,len)
  874. X`009`009    else
  875. X`009`009`009writeln(block.lines`091i`093);
  876. X`009`009    i := i + 1;
  877. X`009`009end;
  878. X`009end else if dsc < 0 then begin
  879. X`009`009print_line(abs(dsc));
  880. X-  320,  355
  881. X`091global`093 procedure print_global(flag: integer; noti: boolean := true;
  882. X`009`009`009force_read: boolean := false);
  883. Xvar code: integer;
  884. Xbegin
  885. X    if Gf_Types `091 flag`093 <> G_text then begin
  886. X`009writeln('%Error in print_global:');
  887. X        writeln('%Global value #',flag:1,' isn''t global desciption');
  888. X`009writeln('%Notify Monster Manager.');
  889. X`009code := 0;
  890. X    end else begin
  891. X`009if read_global or force_read then begin
  892. X`009    getglobal;
  893. X`009    freeglobal;
  894. X`009    read_global := false;
  895. X`009end;
  896. X`009code := global.int`091flag`093;
  897. X    end;
  898. X
  899. X    if code = 0 then begin
  900. X`009if noti then writeln('No (global) desciption.');
  901. X    end  else print_desc(code);
  902. X
  903. Xend; `123 print_global `125
  904. X `032
  905. X`091global`093 PROCEDURE make_line(var n: integer;prompt : string := '';limi
  906. Vt:integer := 79);
  907. Xlabel exit_label;
  908. Xvar
  909. X`009s: string;
  910. X`009ok: boolean;
  911. X
  912. X    procedure leave;
  913. X    begin
  914. X`009writeln('EXIT - no changes.');
  915. X`009goto exit_label;
  916. X    end;
  917. X`009
  918. Xbegin
  919. X    if (n <> DEFAULT_LINE) and (n <> 0) then
  920. X`009begin
  921. X`009    getline(n);
  922. X`009    freeline;
  923. X`009    s := oneliner.theline;
  924. X`009end
  925. X    else s := '';
  926. X
  927. X`009writeln('Type ** to leave line unchanged, * to make `091no line`093');
  928. X`009repeat`032
  929. X`009    grab_line(prompt,s,edit_mode := true, eof_handler := leave);
  930. X`009until (grab_next = 0) or (grab_next = 1);
  931. X
  932. X`009if s = '**' then begin
  933. X`009`009writeln('No changes.');
  934. X`009end else if s = '***' then begin
  935. X`009`009n := DEFAULT_LINE;
  936. X`009end else if s = '*' then begin
  937. X`009`009if debug then
  938. X`009`009`009writeln('%deleting line ',n:1);
  939. X`009`009delete_line(n);
  940. X`009end else if s = '' then begin
  941. X`009`009if debug then
  942. X`009`009`009writeln('%deleting line ',n:1);
  943. X`009`009delete_line(n);
  944. X`009end else if length(s) > limit then begin
  945. X`009`009writeln('Please limit your string to ',limit:1,' characters.');
  946. X`009end else begin
  947. X`009`009if (n = 0) or (n = DEFAULT_LINE) then begin
  948. X`009`009`009if debug then
  949. X`009`009`009`009writeln('%make_line: allocating line');
  950. X`009`009`009ok := alloc_line(n);
  951. X`009`009end else
  952. X`009`009`009ok := true;
  953. X
  954. X`009`009if ok then begin
  955. X`009`009`009if debug then
  956. X`009`009`009`009writeln('%ok in make_line');
  957. X`009`009`009getline(n);
  958. X`009`009`009oneliner.theline := s;
  959. X`009`009`009putline;
  960. X
  961. X`009`009`009if debug then
  962. X`009`009`009`009writeln('%completed putline in make_line');
  963. X`009`009end;
  964. X`009end;
  965. X    exit_label:
  966. Xend;
  967. X
  968. X`091global`093 FUNCTION isnum(s: string): boolean;
  969. Xvar
  970. X`009i: integer;
  971. X
  972. Xbegin
  973. X    if s = '' then isnum := false
  974. X    else begin
  975. X`009readv(s,i,error := continue);
  976. X`009if statusv <> 0 then isnum := false
  977. X`009else if i < 0 then isnum := false
  978. X`009else isnum := true;
  979. X    end; `123 isnum `125
  980. Xend;
  981. X
  982. X`091global`093 FUNCTION number(s: string): integer;
  983. Xvar
  984. X`009i: integer;
  985. Xbegin
  986. X`009if (length(s) < 1) or not(s`0911`093 in `091'0'..'9'`093) then
  987. X`009`009number := 0
  988. X`009else begin
  989. X`009`009readv(s,i,error := continue);
  990. X`009`009if statusv <> 0 then number := 0
  991. X`009`009else number := i;
  992. X-  359,  372
  993. X`091global`093 FUNCTION log_name: string;`009`123 myname or 'Someone' if use
  994. V disguise `125
  995. X`009`009`009`009`123 hurtta@finuh `125
  996. Xbegin
  997. X`009if mydisguise = 0 then log_name := myname
  998. X`009else log_name := 'Someone';
  999. Xend;
  1000. X
  1001. X`091global`093 PROCEDURE log_action(theaction,thetarget: integer);
  1002. Xbegin
  1003. X`009if debug then
  1004. X`009`009writeln('%log_action(',theaction:1,',',thetarget:1,')');
  1005. X`009getroom;
  1006. X`009here.people`091myslot`093.act := theaction;
  1007. X`009here.people`091myslot`093.targ := thetarget;
  1008. X`009putroom;
  1009. X
  1010. X`009logged_act := true;
  1011. X`009log_event(myslot,E_ACTION,thetarget,theaction,log_name);
  1012. Xend;
  1013. X
  1014. X`091global`093
  1015. Xfunction systime:string;
  1016. Xvar
  1017. X`009hourstring: string;
  1018. X`009hours: integer;
  1019. X`009thetime: packed array`0911..11`093 of char;
  1020. X`009dayornite: string;
  1021. X
  1022. Xbegin
  1023. X`009time(thetime);
  1024. X`009if thetime`0911`093 = ' ' then
  1025. X`009`009hours := ord(thetime`0912`093) - ord('0')
  1026. X`009else
  1027. X`009`009hours := (ord(thetime`0911`093) - ord('0'))*10 +
  1028. X`009`009`009  (ord(thetime`0912`093) - ord('0'));
  1029. X
  1030. X`009if hours < 12 then
  1031. X`009`009dayornite := 'am'
  1032. X`009else
  1033. X`009`009dayornite := 'pm';
  1034. X`009if hours >= 13 then
  1035. X`009`009hours := hours - 12;
  1036. X`009if hours = 0 then
  1037. X`009`009hours := 12;
  1038. X
  1039. X`009writev(hourstring,hours:2);
  1040. X
  1041. X`009systime := hourstring + ':' + thetime`0914`093 + thetime`0915`093 + dayo
  1042. Vrnite;
  1043. Xend;
  1044. X
  1045. X`091global`093 FUNCTION custom_privileges(var privs: integer;
  1046. X`009`009authorized: unsigned): boolean;
  1047. Xlabel exit_label;
  1048. Xvar s: string;
  1049. X    update: boolean;
  1050. X    upriv,mask : unsigned;
  1051. X
  1052. X    procedure leave;
  1053. X    begin
  1054. X`009writeln('EXIT - no changes.');
  1055. X`009update := false;
  1056. X`009goto exit_label;
  1057. X    end;
  1058. X
  1059. Xbegin
  1060. X   upriv := uint(privs);
  1061. X   update := false;
  1062. X   repeat
  1063. X      grab_line('Custom privileges> ',s,eof_handler := leave);
  1064. X      s := lowcase(s);
  1065. X      if s > '' then case s`0911`093 of
  1066. X         'v': begin
  1067. X                write('Current set: ');
  1068. X                list_privileges(upriv);
  1069. X              end;
  1070. X         'h','?': begin
  1071. X`009`009    command_help('*privilege help*');
  1072. X                 end;
  1073. X`009 'l'    : begin
  1074. X`009`009    write('Possible privilege set: ');
  1075. X`009`009    list_privileges(authorized);
  1076. X`009`009  end;
  1077. X         '-'   : begin
  1078. X`009           if length(s) < 3 then writeln('Type ? for help.')
  1079. X`009`009   else if lookup_priv(mask,slead(substr(s,3,length(s)-2))) then
  1080. X`009`009   begin
  1081. X`009`009`009if uand(mask,upriv) > 0 then begin
  1082. X`009`009`009    upriv := uand(upriv,unot(mask));
  1083. X`009`009`009    write('Removed: '); list_privileges(mask);
  1084. X`009`009`009end else writeln('Isn''t in current set.');
  1085. X`009`009    end else writeln('Type L for list.');
  1086. X`009`009end;
  1087. X         '+'   : begin
  1088. X`009           if length(s) < 3 then writeln('Type ? for help.')
  1089. X`009`009   else if lookup_priv(mask,slead(substr(s,3,length(s)-2))) then
  1090. X`009`009   begin
  1091. X`009`009`009if uand(mask,authorized) <> mask then`032
  1092. X`009`009`009    writeln('Not authorized.')
  1093. X`009`009`009else if uand(mask,upriv) = 0 then begin
  1094. X`009`009`009    upriv := uor(upriv,mask);
  1095. X`009`009`009    write('Added: '); list_privileges(mask);
  1096. X`009`009`009end else writeln('Is already in current set.');
  1097. X`009`009    end else writeln('Type L for list.');
  1098. X`009`009end;
  1099. X         'q'   : update := false;
  1100. X         'e'   : update := true;
  1101. X         otherwise writeln ('Type ? for list.');
  1102. X      end; `123 case `125
  1103. X   until (s = 'q') or (s = 'e');
  1104. X   exit_label:
  1105. X   if update then privs := int(upriv);
  1106. X   custom_privileges := update;
  1107. Xend; `123 custom_privileges `125
  1108. X
  1109. X         `032
  1110. X`091global`093 FUNCTION desc_allowed: boolean;
  1111. Xbegin
  1112. X`009if (here.owner = userid) or
  1113. X`009   (owner_priv) then `123 minor change by leino@finuha `125
  1114. X`009`009desc_allowed := true
  1115. X`009else begin
  1116. X`009`009writeln('Sorry, you are not allowed to alter the descriptions in thi
  1117. Vs room.');
  1118. X`009`009desc_allowed := false;
  1119. X-  376,  407
  1120. X`123 count the number of people in this room; assumes a gethere has been don
  1121. Ve `125
  1122. X
  1123. X`091global`093 function find_numpeople: integer;
  1124. Xvar
  1125. X`009sum,i: integer;
  1126. Xbegin
  1127. X`009sum := 0;
  1128. X`009for i := 1 to maxpeople do
  1129. X`009`009if here.people`091i`093.kind > 0 then
  1130. X`123`009`009if here.people`091i`093.username <> '' then`009`125
  1131. X`009`009`009sum := sum + 1;
  1132. X`009find_numpeople := sum;
  1133. Xend;
  1134. X
  1135. X
  1136. X
  1137. X`123 don't give them away, but make noise--maybe
  1138. X  percent is percentage chance that they WON'T make any noise `125
  1139. Xprocedure noisehide(percent: integer);
  1140. Xbegin
  1141. X`009`123 assumed gethere;  `125
  1142. X`009if (hiding) and (find_numpeople > 1) then begin
  1143. X`009`009if rnd100 > percent then
  1144. X`009`009`009log_event(myslot,E_REALNOISE,rnd100,0);
  1145. X`009`009`009`123 myslot: don't tell them they made noise `125
  1146. X-  411,  419
  1147. X
  1148. X`091global`093 function checkhide: boolean;
  1149. Xbegin
  1150. X`009if (hiding) then begin
  1151. X`009`009checkhide := false;
  1152. X`009`009noisehide(50);
  1153. X`009`009writeln('You can''t do that while you''re hiding.');
  1154. X`009end else
  1155. X`009`009checkhide := true;
  1156. Xend;
  1157. X
  1158. X`123 edit DESCRIBTION ------------------------------------------------------
  1159. V--- `125
  1160. X
  1161. Xprocedure edit_replace(n: integer);
  1162. Xlabel exit_label;
  1163. Xvar
  1164. X`009prompt: string;
  1165. X`009s: string;
  1166. X
  1167. X    procedure leave;
  1168. X    begin
  1169. X`009writeln('EXIT - no changes.');
  1170. X`009goto exit_label;
  1171. X    end;
  1172. X
  1173. X
  1174. Xbegin
  1175. X`009if (n > heredsc.desclen) or (n < 1) then
  1176. X`009`009writeln('-- Bad line number')
  1177. X`009else begin
  1178. X`009`009writev(prompt,n:2,': ');
  1179. X`009`009s := heredsc.lines`091n`093;
  1180. X`009`009grab_line(prompt,s,edit_mode := True,eof_handler := leave);
  1181. X`009`009if s <> '**' then
  1182. X`009`009`009heredsc.lines`091n`093 := s;
  1183. X`009end;
  1184. X    exit_label:
  1185. Xend;
  1186. X
  1187. Xprocedure edit_insert(n: integer);
  1188. Xvar
  1189. X`009i: integer;
  1190. X
  1191. Xbegin
  1192. X`009if heredsc.desclen = descmax then
  1193. X`009`009writeln('You have already used all ',descmax:1,' lines of text.')
  1194. X`009else if (n < 1) or (n > heredsc.desclen+1) then begin
  1195. X`009`009writeln('Invalid line #; valid lines are between 1 and ',heredsc.des
  1196. Vclen+1:1);
  1197. X`009`009writeln('Use A (add) to add text to the end of your description.');
  1198. X`009end else begin
  1199. X`009`009for i := heredsc.desclen+1 downto n + 1 do
  1200. X`009`009`009heredsc.lines`091i`093 := heredsc.lines`091i-1`093;
  1201. X`009`009heredsc.desclen := heredsc.desclen + 1;
  1202. X`009`009heredsc.lines`091n`093 := '';
  1203. X-  423,  452
  1204. Xprocedure edit_doinsert(n: integer);
  1205. Xlabel exit_label;
  1206. Xvar
  1207. X`009s: string;
  1208. X`009prompt: string;            `032
  1209. X`009i: integer;
  1210. X
  1211. X    procedure leave;
  1212. X    begin
  1213. X`009writeln('EXIT - no changes.');
  1214. X`009goto exit_label;
  1215. X    end;
  1216. X
  1217. X
  1218. Xbegin
  1219. X`009if heredsc.desclen = descmax then
  1220. X`009`009writeln('You have already used all ',descmax:1,' lines of text.')
  1221. X`009else if (n < 1) or (n > heredsc.desclen+1) then begin
  1222. X`009`009writeln('Invalid line #; valid lines are between 1 and ',heredsc.des
  1223. Vclen:1);
  1224. X`009`009writeln('Use A (add) to add text to the end of your description.');
  1225. X`009end else begin
  1226. X`009`009edit_insert(n);`032
  1227. X`009`009repeat   `032
  1228. X`009`009`009writev(prompt,n:2,': ');`032
  1229. X`009`009`009s := heredsc.lines`091n`093;
  1230. X`009`009`009grab_line(prompt,s,edit_mode := true,eof_handler := leave);
  1231. X`009`009`009if s <> '**' then begin
  1232. X`009`009`009`009heredsc.lines`091n`093 := s;`009`123 copy this line onto it
  1233. V `125
  1234. X`009   `009`009`009if (grab_next < 0) and (n > 1) then
  1235. X`009`009`009`009`009n := n -1
  1236. X`009`009`009`009else if (grab_next >0) and`032
  1237. X`009`009`009`009`009(n < heredsc.desclen) then
  1238. X`009`009`009`009`009n := n +1
  1239. X`009`009`009`009else if (grab_next = 0) and`032
  1240. X`009`009`009`009`009(n < descmax)then begin
  1241. X`009`009`009`009`009n := n +1;
  1242. X`009`009`009`009`009edit_insert(n);
  1243. X`009`009       `009`009end
  1244. X`009`009`009end else begin
  1245. X`009`009   `009`009for i := n+1 to heredsc.desclen do
  1246. X`009`009`009`009`009heredsc.lines`091i-1`093 := heredsc.lines`091i`093;
  1247. X`009`009`009`009heredsc.desclen := heredsc.desclen -1
  1248. X`009`009`009end;
  1249. X`009`009until (heredsc.desclen = descmax) or (s = '**');
  1250. X`009end;
  1251. X`009exit_label:
  1252. Xend;
  1253. X                                         `032
  1254. Xprocedure edit_show;
  1255. Xvar
  1256. X`009i: integer;
  1257. X
  1258. Xbegin
  1259. X`009writeln;
  1260. X`009if heredsc.desclen = 0 then
  1261. X`009`009writeln('`091no text`093')
  1262. X`009else begin
  1263. X`009`009i := 1;
  1264. X`009`009while i <= heredsc.desclen do begin
  1265. X`009`009`009writeln(i:2,': ',heredsc.lines`091i`093);
  1266. X`009`009`009i := i + 1;
  1267. X-  457,  466
  1268. Xprocedure edit_append; `009`009`123 changed by hurtta@finuh `125
  1269. Xvar
  1270. X`009prompt,s: string;
  1271. X`009stilladding: boolean;`032
  1272. X`009ln: integer;
  1273. X
  1274. X    procedure leave;
  1275. X    begin
  1276. X`009writeln('EXIT');
  1277. X`009stilladding := false;
  1278. X`009grab_next := 0;
  1279. X    end;
  1280. X
  1281. X
  1282. Xbegin
  1283. X`009stilladding := true;
  1284. X`009writeln('Enter text.  Terminate with ** at the beginning of a line.');
  1285. X`009writeln('You have ',descmax:1,' lines maximum.');
  1286. X`009writeln;`032
  1287. X`009ln := heredsc.desclen+1;
  1288. X`009if ln > descmax then ln := descmax;
  1289. X`009while stilladding do begin  `032
  1290. X`009`009if ln > heredsc.desclen then heredsc.lines`091ln`093 := '';
  1291. X`009`009s := heredsc.lines`091ln`093;
  1292. X`009`009writev(prompt,ln:2,': ');
  1293. X`009`009grab_line(prompt,s, edit_mode := true,eof_handler := leave);
  1294. X`009`009if s = '**' then begin
  1295. X`009`009`009stilladding := false;
  1296. X`009`009`009heredsc.desclen := ln -1
  1297. X`009`009end else begin
  1298. X`009`009`009if heredsc.desclen < ln then heredsc.desclen := ln;
  1299. X`009`009`009heredsc.lines`091ln`093 := s;     `032
  1300. X`009`009`009if grab_next = 0 then begin
  1301. X`009`009`009`009if ln < descmax then ln := ln+1
  1302. X`009`009`009`009else stilladding := false
  1303. X`009`009`009end else if grab_next > 0 then begin              `032
  1304. X`009`009`009`009if ln < heredsc.desclen then ln := ln+1
  1305. X`009`009`009end else begin
  1306. X`009`009`009`009if ln > 1 then ln := ln -1
  1307. X`009`009`009end;
  1308. X`009`009end;    `032
  1309. X`009end;
  1310. Xend;    `123 edit_append `125
  1311. X
  1312. Xprocedure edit_delete(n: integer);
  1313. Xvar
  1314. X`009i: integer;
  1315. X
  1316. Xbegin
  1317. X`009if heredsc.desclen = 0 then
  1318. X`009`009writeln('-- No lines to delete')
  1319. X`009else if (n > heredsc.desclen) or (n < 1) then
  1320. X`009`009writeln('-- Bad line number')
  1321. X`009else if (n = 1) and (heredsc.desclen = 1) then
  1322. X`009`009heredsc.desclen := 0
  1323. X`009else begin
  1324. X`009`009for i := n to heredsc.desclen-1 do
  1325. X`009`009`009heredsc.lines`091i`093 := heredsc.lines`091i + 1`093;
  1326. X`009`009heredsc.desclen := heredsc.desclen - 1;
  1327. X-  470,  490
  1328. Xprocedure check_subst;
  1329. Xvar i: integer;
  1330. Xbegin
  1331. X`009if heredsc.desclen > 0 then begin
  1332. X`009`009for i := 1 to heredsc.desclen do
  1333. X`009`009`009if (index(heredsc.lines`091i`093,'#') > 0) and
  1334. X`009`009`009   (length(heredsc.lines`091i`093) > 59) then
  1335. X`009`009`009`009writeln('Warning: line ',i:1,' is too long for correct param
  1336. Veter substitution.');
  1337. X-  494,  625
  1338. X
  1339. X`091global`093 function edit_desc(var dsc: integer):boolean;
  1340. Xvar
  1341. X`009cmd: char;
  1342. X`009s: string;
  1343. X`009done: boolean;
  1344. X`009n: integer;
  1345. X
  1346. X    procedure leave;
  1347. X    begin
  1348. X`009writeln('EXIT');
  1349. X`009s := 'e';
  1350. X    end;
  1351. X
  1352. Xbegin
  1353. X`009if dsc = DEFAULT_LINE then begin
  1354. X`009`009heredsc.desclen := 0;
  1355. X-  629,  639
  1356. X`009`009heredsc := block;
  1357. X`009end else if dsc < 0 then begin
  1358. X`009`009n := (- dsc);
  1359. X`009`009getline(n);
  1360. X`009`009freeline;
  1361. X`009`009heredsc.lines`0911`093 := oneliner.theline;
  1362. X`009`009heredsc.desclen := 1;
  1363. X`009end else begin
  1364. X`009`009heredsc.desclen := 0;
  1365. X`009end;
  1366. X
  1367. X`009edit_desc := true;
  1368. X`009done := false;
  1369. X        edit_append;
  1370. X`009repeat
  1371. X`009`009writeln;
  1372. X`009`009repeat
  1373. X`009`009`009grab_line('* ',s,eof_handler := leave);
  1374. X`009`009`009s := slead(s);
  1375. X`009`009until length(s) > 0;
  1376. X`009`009s := lowcase(s);
  1377. X`009`009cmd := s`0911`093;
  1378. X
  1379. X`009`009if length(s)>1 then begin
  1380. X`009`009`009n := number(slead(substr(s,2,length(s)-1)))
  1381. X`009`009end else
  1382. X`009`009`009n := 0;
  1383. X
  1384. X`009`009case cmd of
  1385. X`009`009`009'h','?': command_help('*edit help*');
  1386. X`009`009`009'a': edit_append;
  1387. X`009`009`009'z': heredsc.desclen := 0;
  1388. X`009`009`009'c': check_subst;
  1389. X`009`009`009'p','l','t': edit_show;
  1390. X`009`009`009'd': edit_delete(n);
  1391. X`009`009`009'e': begin
  1392. X`009`009`009`009check_subst;
  1393. X`009`009`009`009if debug then
  1394. X`009`009`009`009`009writeln('edit_desc: dsc is ',dsc:1);
  1395. X
  1396. X
  1397. X`123 what I do here may require some explanation:
  1398. X
  1399. X`009dsc is a pointer to some text structure:
  1400. X`009`009dsc = 0 :  no text
  1401. X`009`009dsc > 0 :  dsc refers to a description block (descmax lines)
  1402. X`009`009dsc < 0 :  dsc refers to a description "one liner".  abs(dsc)
  1403. X`009`009`009   is the actual pointer
  1404. X
  1405. X`009If there are no lines of text to be written out (heredsc.desclen = 0)
  1406. X`009then we deallocate whatever dsc is when edit_desc was invoked, if
  1407. X`009it was pointing to something;
  1408. X
  1409. X`009if there is one line of text to be written out, allocate a one liner
  1410. X`009record, assign the string to it, and return dsc as negative;
  1411. X
  1412. X`009if there is mmore than one line of text, allocate a description block,
  1413. X`009store the lines in it, and return dsc as positive.
  1414. X
  1415. X`009In all cases if there was already a record allocated to dsc then
  1416. X`009use it and don't reallocate a new record.
  1417. X`125
  1418. X
  1419. X`123 kill the default `125`009`009if (heredsc.desclen > 0) and
  1420. X`123 if we're gonna put real `125`009`009(dsc = DEFAULT_LINE) then
  1421. X`123 texty in here `125`009`009`009`009dsc := 0;
  1422. X
  1423. X`123 no lines, delete existing `125`009if heredsc.desclen = 0 then
  1424. X`123 desc, if any `125`009`009`009delete_block(dsc)
  1425. X`009`009`009`009else if heredsc.desclen = 1 then begin
  1426. X`009`009`009`009`009if (dsc = 0) then begin
  1427. X`009`009`009`009`009`009if alloc_line(dsc) then;
  1428. X`009`009`009`009`009`009dsc := (- dsc);
  1429. X`009`009`009`009`009end else if dsc > 0 then begin
  1430. X`009`009`009`009`009`009delete_block(dsc);
  1431. X`009`009`009`009`009`009if alloc_line(dsc) then;
  1432. X`009`009`009`009`009`009dsc := (- dsc);
  1433. X`009`009`009`009`009end;
  1434. X
  1435. X`009`009`009`009`009if dsc < 0 then begin
  1436. X`009`009`009`009`009`009getline( abs(dsc) );
  1437. X`009`009`009`009`009`009oneliner.theline := heredsc.lines`0911`093;
  1438. X`009`009`009`009`009`009putline;
  1439. X`009`009`009`009`009end;
  1440. X`123 more than 1 lines `125`009`009end else begin
  1441. X`009`009`009`009`009if dsc = 0 then begin
  1442. X`009`009`009`009`009`009if alloc_block(dsc) then;
  1443. X`009`009`009`009`009end else if dsc < 0 then begin
  1444. X`009`009`009`009`009`009dsc := (- dsc);
  1445. X`009`009`009`009`009`009delete_line(dsc);
  1446. X`009`009`009`009`009`009if alloc_block(dsc) then;
  1447. X`009`009`009`009`009end;
  1448. X
  1449. X`009`009`009`009`009if dsc > 0 then begin
  1450. X`009`009`009`009`009`009getblock(dsc);
  1451. X`009`009`009`009`009`009block := heredsc;
  1452. X`123 This is a fudge `125`009`009`009`009block.descrinum := dsc;
  1453. X`009`009`009`009`009`009putblock;
  1454. X`009`009`009`009`009end;
  1455. X`009`009`009`009end;
  1456. X`009`009`009`009done := true;
  1457. X`009`009`009     end;
  1458. X`009`009`009'r': edit_replace(n);
  1459. X`009`009`009'@': begin
  1460. X`009`009`009`009delete_block(dsc);
  1461. X`009`009`009`009dsc := DEFAULT_LINE;
  1462. X`009`009`009`009done := true;
  1463. X`009`009`009     end;
  1464. X`009`009`009'i': edit_doinsert(n);
  1465. X`009`009`009'q': begin
  1466. X`009`009`009`009grab_line('Throw away changes, are you sure? ',
  1467. X`009`009`009`009    s,eof_handler := leave);
  1468. X`009`009`009`009s := lowcase(s);
  1469. X`009`009`009`009if (s = 'y') or (s = 'yes') then begin
  1470. X`009`009`009`009`009done := true;
  1471. X`009`009`009`009`009edit_desc := false; `123 signal caller not to save `125
  1472. X`009`009`009`009end;
  1473. X`009`009`009     end;
  1474. X`009`009`009otherwise writeln('-- Invalid command, type ? for a list.');
  1475. X`009`009end;
  1476. X`009until done;
  1477. Xend;
  1478. X
  1479. X`123 -----------------------------------------------------------------------
  1480. V--- `125
  1481. X
  1482. X`091global`093 procedure custom_global_desc(code: integer);
  1483. Xvar val,lcv: integer;
  1484. Xbegin
  1485. X    if GF_Types`091code`093 <> G_text then begin
  1486. X`009writeln('%Error in custom_global_desc:');
  1487. X`009writeln('%Global item #',code:1,' isn''t global desciption.');
  1488. X`009writeln('%Notify Monster Manager.');
  1489. X    end else if not global_priv then begin
  1490. X`009writeln('You haven''t power for this.');
  1491. X    end else begin
  1492. X`009case code of
  1493. X`009    GF_NEWPLAYER: writeln('Edit new player welcome text.');
  1494. X`009    GF_STARTGAME: Writeln('Edit welcome text.');
  1495. X`009    otherwise writeln('Edit global descibtion #',code:1,' (unknown).');
  1496. X`009end; `123 case `125
  1497. X`009getglobal; freeglobal;
  1498. X`009val := global.int`091code`093;
  1499. X`009if edit_desc(val) then begin
  1500. X`009    getglobal;
  1501. X`009    global.int`091code`093 := val;
  1502. X`009    putglobal;
  1503. X`009    read_global := false;
  1504. X`009    writeln('Database is updated.');
  1505. X`009    for lcv :=1 to numevnts do
  1506. X`009`009log_event(0,E_GLOBAL_CHANGE,0,0,'',lcv);
  1507. X`009end else writeln('No changes.');
  1508. X    end;
  1509. Xend; `123 custom_global_desc `125
  1510. X
  1511. X
  1512. X`123 -----------------------------------------------------------------------
  1513. V--- `125
  1514. X
  1515. X`091global`093 function lookup_detail(var n: integer;s:string): boolean;
  1516. Xvar
  1517. X`009i,poss,maybe,num: integer;
  1518. Xbegin
  1519. X`009n := 0;
  1520. X`009s := lowcase(s);
  1521. X`009i := 1;
  1522. +-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
  1523.