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

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