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

  1. Path: uunet!mcsun!news.funet.fi!hydra!klaava!hurtta
  2. From: Kari.Hurtta@Helsinki.FI (Kari E. Hurtta)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Monster Helsinki V 1.04 - part 26/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.084904.12826@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 08:49:04 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1342
  12.  
  13. Archieve-name: monster_helsinki_104/part26
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 26/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 26 -+-+-+-+-+-+-+-+
  20. X               Get all
  21. X               Get <object,...>
  22. X
  23. XDescription:   Gets object
  24. X:go
  25. XSyntax:        Go <direction>
  26. XShorcut:       <direction>
  27. X:health
  28. XSyntax:        Health
  29. X
  30. XDescription:   Gives your health
  31. X:hide
  32. XSyntax:        Hide
  33. X               Hide <object>
  34. X               Hide all
  35. X               Hide <object,...>
  36. X
  37. XDescription:   Hides object or yourself
  38. X:inventory
  39. XSyntax:        Inventory
  40. X               Inventory <player>
  41. X               Inventory all
  42. X               Inventory <player,...>
  43. X
  44. XDescription:   Gives inventory of <player> or your inventory
  45. X:link
  46. XSyntax:        Link <direction>
  47. X
  48. XDescription:   Creates new exit from this room to <direction>
  49. XRequirements:  You are the owner of this room
  50. X               or <direction> is Accepted
  51. X               or you have the Owner -privilege
  52. X               or you have the Manager -privilege,`032
  53. X                  if the owner of this room is System
  54. X:list
  55. XSyntax:        List rooms`032
  56. X               List monsters
  57. X               List objects
  58. X               List spells
  59. X               List players
  60. X:look
  61. XSyntax:        Look
  62. X               Look <object>
  63. X               Look <monster>
  64. X               Look <player>
  65. X               Look <detail>
  66. X               Look all
  67. X               Look <object,...>
  68. X               Look <monster,...>
  69. X               Look <player,...>
  70. X
  71. XDescription:   Looks something. (Gives its description)
  72. X:make
  73. XSyntax:       Make <object>
  74. XAlias:        Create object <object>
  75. X
  76. XDescription:  Creates a new object with a name: <object>
  77. XRequirements: You are the owner of this room
  78. X              or this room is public
  79. X              or you have the Owner -privilege
  80. X              or you have the Manager -privilege,`032
  81. X                 if owner of this room is System
  82. X:bear
  83. XSyntax:       Bear <monster>
  84. XAlias:        Create monster <monster>
  85. X
  86. XDescription:  Creates a new monster with name <object>
  87. XRequirements: You are owner of this room
  88. X              or room is public
  89. X              or you have the Owner -privilege
  90. X              or you have the Manager -privilege,`032
  91. X                 if owner of this room is System
  92. X:name
  93. XSyntax:       Name <nicename>
  94. X
  95. XDescription:  Changes yoy player name to <nicename>
  96. X:objects
  97. XSyntax:       Objects`032
  98. X              Objects <player>
  99. X              Objects all
  100. X              Objects public
  101. X              Objects disowned
  102. X              Objects system
  103. X
  104. XDescription:  Types objets of <player> or yourself
  105. XRequirements: You, Public or Disowned have target
  106. X              or you have the Owner -privilege
  107. X:monsters
  108. XSyntax:       Monsters
  109. X              Monsters <player>
  110. X              Monsters all
  111. X              Monsters public
  112. X              Monsters disowned
  113. X              Monsters system
  114. XAlias:        List monsters
  115. X
  116. XDescription:  Types monsters of <player> or yourself
  117. XRequirements: You, Public or Disowned have target
  118. X              or you have the Owner -privilege
  119. X:players
  120. XSyntax:       Players
  121. X              Players all
  122. X              Players monster
  123. X              Players player
  124. XAlias:        List players
  125. X
  126. XDescription:  Lists players or monsters
  127. X:poof
  128. XSyntax:       Poof <room>
  129. X              Poof <player>
  130. X              Poof <monster>
  131. X
  132. XDescription:  Moves you to <room> or moves <player> or <monster>
  133. XRequirements: You are the owner of this room and <room>
  134. X              or You have the Poof -privilege
  135. X:punch
  136. XSyntax:       Punch <player>
  137. X
  138. XDescription:  Punches <player>
  139. XRequirements: Experience of <player> is lower than 700000
  140. X:quit
  141. XSyntax:       Quit
  142. XShortcut:     <F10>
  143. X
  144. XDescription:  Ends playing
  145. X:relink
  146. XSyntax:       Relink <direction>
  147. X
  148. XDescription:  Reroutes exit to <direction>
  149. XRequirements: You are the owner of this room
  150. X              You have the Owner -privilege
  151. X              You have the Manager -privilege,`032
  152. X                 if the owner of this room is System
  153. X:refuse
  154. XSyntax:       Refuse <direction>
  155. X
  156. XDescription:  Hinders other players to link to <direction>
  157. XRequirements: You are the owner of this room
  158. X              You have the Owner -privilege
  159. X              You have the Manager -privilege,`032
  160. X                 if owner of this room is System
  161. X:reveal
  162. XSyntax:       Reveal
  163. X
  164. XDescription:  Reveals yourself
  165. X:rooms
  166. XSyntax:       Rooms
  167. X              Rooms <player>
  168. X              Rooms all
  169. X              Rooms public
  170. X              Rooms disowned
  171. X              Rooms system
  172. XAlias:        List rooms
  173. X
  174. XDescription:  Types all the rooms of <player> or yourself
  175. XRequirements: the target is owned by you, public or is disowned.
  176. X              or you have the Owner -privilege
  177. X:say
  178. XSyntax:       Say <message>
  179. XShortcut:     "<message>
  180. X
  181. XDescription:  Says a message to other players in this room
  182. X:scan
  183. XSyntax:       Scan <object>
  184. X              Scan all
  185. X              Scan <object,...>
  186. X
  187. XDescription:  Lists all locations of object
  188. XRequirements: You are the owner of this very object
  189. X              or you have the Owner -privilege
  190. X              or you have the Manager -privilege,`032
  191. X                 if the owner of the object is System
  192. X              And you are the owner of this room
  193. X              or this room is public
  194. X              or you have the Owner -privilege
  195. X              or you have the Manager -privilege,`032
  196. X                 if the owner of this room is System
  197. X:reset
  198. XSyntax:       Reset <object>
  199. X              Reset all
  200. X              Reset <object,...>
  201. X
  202. XDescription:  Erases all instances of an object from public and your`032
  203. X                rooms - and from public and your monsters
  204. X              Creates one instance of the object to its home location
  205. X              Doesn't affect objects that players are carrying
  206. XRequirements: There is at least one instance of object in public or your roo
  207. Vm
  208. X                  or carrying by public or your monster
  209. X              You are the owner of object
  210. X              or you have the Owner -privilege
  211. X              or you have the Manager -privilege,`032
  212. X                 if the owner of this object is System
  213. X              And you are the owner of this room
  214. X              or this room is public
  215. X              or you have the Owner -privilege
  216. X              or you have the Manager -privilege,`032
  217. X                 if owner of this room is System
  218. X:score
  219. XSyntax:       Score
  220. X              Score <player>
  221. X              Score <level>
  222. X              Score all
  223. X
  224. XDescription:  Prints your score and level
  225. X              or prints score and level of <player>
  226. X              or prints players, whose level is <level>
  227. X:search
  228. XSyntax:       Search
  229. X
  230. XDescription:  Searches hidden objects and players
  231. X:self
  232. XSyntax:       Self`032
  233. X              Self <player>
  234. X              Self <monster>
  235. X              Self all
  236. X              Self <player,...>
  237. X              Self <monster,..>
  238. X
  239. XDescription:  Creates your own self-description
  240. X              or types the self-description of <player>
  241. X:set
  242. XSyntax:       Set <option>
  243. X
  244. XOptions:      Password`009`009Change your password
  245. X              War               Allow violance in Monster
  246. X              Peace             Forbid any violance in Monster
  247. X              Spell             Make new spell or customizing spell
  248. X              NewPlayer         Set new player's welcome text
  249. X              Welcome           Set welcome text
  250. X              Privilege         Change your privileges
  251. X
  252. X:show
  253. XSyntax:       Show <option>
  254. X
  255. XOptions:      Exits               Lists exits you can inspect here
  256. X              Object              Shows internals of an object
  257. X              Details             Shows all the details you can look at this
  258. V room
  259. X              Monster             Shows the owner of a monster
  260. X              Privileges          Shows your privileges
  261. X              Time                Shows time and date
  262. X              Room                Shows the owner of a room
  263. X              Commands.paper      Lists COMMANDS.PAPER
  264. X              Levels              Shows all the experience levels
  265. X              Quotas              Show your quotas
  266. X              Spells              Show your spell level or what spells you k
  267. Vnow
  268. X:summon
  269. XSyntax:       Summon <spell name>
  270. X              <victim name> (type to prompt)
  271. X:unlink
  272. XSyntax:       Unlink <direction>
  273. X
  274. XDescription:  Removes exit to <direction>
  275. XRequirements: You are the owner of this room
  276. X              or you have the Owner -privilege
  277. X              or you have the Manager -privilege,`032
  278. X                 if the owner of this room is System
  279. X:unmake
  280. XSyntax:       Unmake <object>
  281. X
  282. XDescription:  Removes description of <object>
  283. XRequirements: You are the owner of object
  284. X              or you have the Owner -privilege
  285. X              or you have the Manager -privilege,`032
  286. X                 if the owner of object is System
  287. X              And you are the owner of this room
  288. X              or this room is public
  289. X              or you have the Owner -privilege
  290. X              or you have the Manager -privilege,`032
  291. X                 if the owner of this room is System
  292. X:use
  293. XSyntax:       Use <object>
  294. X:wear
  295. XSyntax:       Wear
  296. X              Wear <armour>
  297. X:wield
  298. XSyntax:       Wield
  299. X              Wield <weapon>
  300. X:whisper
  301. XSyntax:       Whisper <player>
  302. X:who
  303. XSyntax:       Who
  304. X              Who all
  305. X              Who player
  306. X              Who monster
  307. X
  308. XDescription:  Lists active players or monsters
  309. X:whois
  310. XSyntax:       Whois <player>
  311. X              Whois all
  312. X              Whois <player,...>
  313. X
  314. XDescription:  Types the username of <player>
  315. X:zap
  316. XSyntax:       Zap <room>
  317. XAlias:        Delete room <room>
  318. X
  319. XDescription:  Removes <room>
  320. XRequirements: You are the owner of <room>
  321. X              or you have the Owner -privilege
  322. X              or you have the Manager -privilege,`032
  323. X                 if the owner of <room> is System
  324. X              And you are the owner of this room
  325. X              or this room is public
  326. X              or you have the Owner -privilege
  327. X              or you have the Manager -privilege,`032
  328. X                 if owner of this room is System
  329. X:help
  330. XSyntax:       Help
  331. X
  332. X:system
  333. XSyntax:       System
  334. X
  335. XDescription:  Manages Monster
  336. XRequirements: You have the Manager -privilege (which is rare)
  337. X
  338. X:public
  339. XSyntax:       Public
  340. X              Public <room>
  341. X              Public <object>
  342. X              Public <monster>
  343. X              Public <spell>
  344. X
  345. XDescription:  Sets the ownership of room or object or monster or spell
  346. X                  or this room to Public
  347. XRequirements: You have the Manager -privilege
  348. $ CALL UNPACK MONSTER.HELP;44 67553446
  349. $ create/nolog 'f'
  350. X! Monster initialization file   - written by Kari Hurtta
  351. X!`032
  352. X! Name of this file must be MONSTER.INIT
  353. X! The file must be located in the same direction as the monster's image.
  354. X
  355. XMM_userid: monster
  356. X`009
  357. X! The Monster Manager has the most power; this should be
  358. X! the game administrator.`032
  359. X
  360. X! protected_MM: true
  361. X
  362. Xgen_debug:   false
  363. X!`009`009   this tells whether everyone may use the debug command.
  364. X!                  it must be able to be disabled because it tells players
  365. X!                  too much about monsters. On the other hand, it must also`
  366. V032
  367. X!                  be able to be enabled, if we want to do test runs under
  368. X!                  an unprivileged userid`009`009
  369. X
  370. XREBUILD_OK: false
  371. X
  372. X!`009`009  if this is true, the MM can blow away and reformat the
  373. X!`009`009  entire universe. It's a good idea to set this to false
  374. X
  375. Xroot:    MONSTER_DATABASE_MON_: ! world database
  376. Xcoderoot:MONSTER_DATABASE_CODE_:  ! mdl database
  377. X       `032
  378. X!`009`009  This is where the Monster database goes.
  379. X!`009`009  The root directory must be  world:e  and
  380. X!`009`009  the  datafiles  Monster  creates  in  it
  381. X!`009`009  world:rw for people to be able to  play.
  382. X!`009`009  The  coderoot  directory  is  where  the
  383. X!`009`009  codefiles for monsters go. The directory
  384. X!`009`009  must additionally have  an  ACL  default
  385. X!`009`009  world:rw  for  files  and ACL rw for the
  386. X!`009`009  managers. This sucks, but we don't  have
  387. X!`009`009  setgid to games on VMS.`032
  388. X
  389. XLEVELTABLE:
  390. X!  name`009`009    exp`009         priv`009 health`009   h.fac    pow    hid
  391. Vden`032
  392. XBeginner,           0,           0,      10,       40,      0,     nohidden
  393. XNovice,             1,           0,      10,       40,      2,     nohidden
  394. XRanger,             500,         0,      15,       50,      3,     nohidden
  395. XAdventurer,         1000,        0,      20,       60,      5,     nohidden
  396. XHero,               2000,        32,     30,       60,      10,    nohidden
  397. XChampion,           6000,        0,      40,       70,      10,    nohidden
  398. XConjurer,           12000,       16,     50,       70,      12,    nohidden
  399. XMagician,           20000,       0,      60,       70,      15,    nohidden
  400. XEnchanter,          40000,       2,      80,       75,      20,    nohidden
  401. XSorcerer,           70000,       256,    100,      80,      20,    nohidden
  402. XWarlock,            120000,      4,      120,      85,      35,    nohidden
  403. XApprentice wizard,  300000,      8,      150,      85,      50,    nohidden
  404. XWizard,             700000,      64,     300,      90,      80,    nohidden
  405. XAlmost Dead,        1000100,     0,      10,       40,      2,     hidden
  406. XManager,            2000000,     1,      500,      100,     500,   hidden
  407. XDruid,              2001000,     0,      500,      100,     500,   hidden
  408. XCharlatan,          2008000,     0,      500,      100,     500,   hidden
  409. XWanderer,           2009000,     0,      500,      100,     500,   hidden
  410. XChief Architect,    3000000,     0,      500,      100,     500,   hidden
  411. XBug Hunter,         5000000,     0,      500,      100,     500,   hidden
  412. XEND OF LEVELTABLE
  413. XArchpriv:   0
  414. XArchhealth: 800
  415. XArchfactor: 100
  416. XArchpower:  1000
  417. X
  418. Xmaxexperience: 1000000
  419. X!  Monster Manager's experience is MaxInt
  420. X
  421. Xprotect_exp: 700000
  422. X!  gives protection agaist violence
  423. X
  424. XPlaytime: +++++++++--------+++++++
  425. X! Closed at 09-17 in workdays
  426. X
  427. Xdefault_allow: 20    ! How many rooms players made at default
  428. Xmin_room:      5     ! How many rooms players can made without exit request
  429. Xmin_accept:    5     ! How many accepts must players made
  430. $ CALL UNPACK MONSTER.INIT;37 857618867
  431. $ create/nolog 'f'
  432. X`091 INHERIT('database', 'guts', 'global' , 'privusers', 'parser')`093
  433. XPROGRAM MONSTER_DUMP (INPUT, OUTPUT) ;
  434. X`032
  435. X`123
  436. XPROGRAM DESCRIPTION:`032
  437. X`032
  438. X    Image for MONSTER/DUMP and MONSTER/BUILD -command
  439. X`032
  440. XAUTHORS:`032
  441. X`032
  442. X    Kari Hurtta
  443. X`032
  444. XCREATION DATE:`0099.2.1991
  445. X`032
  446. X`032
  447. X`009    C H A N G E   L O G
  448. X`032
  449. X     Date     `124   Name  `124 Description
  450. X--------------+---------+---------------------------------------------------
  451. V----
  452. X   10.02.1991 `124         `124 Some fixing (spelcially to *_PLAYER routines
  453. V)
  454. X   12.02.1991 `124         `124 Added /OUTPUT -qualifier and fixed OBJDROP%
  455. X   13.02.1991 `124         `124 read_EXIT : optional exitrec.closed moved`03
  456. V2
  457. X   13.02.1991 `124         `124 fixed OBJDROP% again!
  458. X   19.05.1992 `124         `124 while loop bug fixed in read ROOM and read_R
  459. VOOM2
  460. X              `124         `124 V 1.01    BOOKSPELL%   HIDDEN% was wrong !!
  461. X`009      `124         `124 obj.numexist bug fixed in read_MONSTER
  462. X   28.05.1992 `124`009`009`124 V 1.02    write going field also for exit
  463. X`125
  464. X
  465. XCONST VERSION = '1.02'; `123 DUMPER Version `125
  466. X`009`009`009`123 version numbers MUST be dictionary order !!! `125
  467. X`009`009`009`123 ie. '1.00' < '1.01' `125
  468. X
  469. Xvar READ_vers_101: boolean;
  470. X    READ_vers_102: boolean;
  471. X`032
  472. X`123 DUMMY for linker `125
  473. X`091global`093
  474. Xfunction player_here(id: integer; var slot: integer): boolean;
  475. Xbegin
  476. X    player_here := false;
  477. Xend;
  478. X
  479. X`123 DUMMY for linker `125
  480. X`091global`093
  481. Xprocedure gethere(n: integer := 0);
  482. Xbegin
  483. Xend;
  484. X
  485. X`123 DUMMY for linker `125
  486. X`091global`093
  487. Xprocedure checkevents(silent: boolean := false);
  488. Xbegin
  489. Xend;
  490. X
  491. X`123 ---------- `125
  492. X
  493. Xconst
  494. X`009cli$_present`009= 261401;
  495. X`009cli$_absent`009= 229872;
  496. X`009cli$_negated`009= 229880;
  497. X`009cli$_defaulted`009= 261409;
  498. X`009ss$_normal`009= 1;
  499. X
  500. Xtype
  501. X`009word_unsigned`009= `091word`093 0..65535;
  502. X`009cond_value`009= `091long`093 unsigned;
  503. X
  504. Xvar
  505. X`009userid`009`009: `091external`093 veryshortstring;
  506. X`009wizard`009`009: `091external`093 boolean;
  507. X
  508. X
  509. Xfunction cli$get_value (%descr entity_desc: string;
  510. X`009`009`009%descr retdesc: string;
  511. X`009`009`009%ref retlength: word_unsigned): cond_value;
  512. X`009external;
  513. X
  514. Xfunction cli$present (%descr entity_desc: string): cond_value;
  515. X`009external;
  516. X
  517. X
  518. Xvar dump_file : string := '';
  519. X    build_system : boolean := false;
  520. X    dump_system  : boolean := false;
  521. X
  522. Xprocedure params;
  523. X
  524. Xvar
  525. X`009qualifier,
  526. X`009value,
  527. X`009s`009`009: string;
  528. X`009value_length`009: word_unsigned;
  529. X`009status1,
  530. X`009status2`009`009: cond_value;
  531. X
  532. Xbegin
  533. X`009qualifier := 'DUMP_FILE';
  534. X`009status1 := cli$present (qualifier);
  535. X`009if status1 = cli$_present then begin
  536. X`009    status2 := cli$get_value (qualifier, value, value_length);
  537. X`009    if status2 = ss$_normal then begin
  538. X`009`009dump_file := value;
  539. X`009    end else begin
  540. X`009`009writeln ('Something is wrong with /DUMP_FILE.');
  541. X`009`009dump_file := '';
  542. X`009    end;
  543. X`009end else dump_file := '';
  544. X
  545. X`009qualifier := 'BUILD';
  546. X`009status1 := cli$present (qualifier);
  547. X`009if status1 = cli$_present then begin
  548. X`009`009if wizard then begin
  549. X`009`009`009if REBUILD_OK then begin
  550. X`009`009`009`009writeln('Do you really want to destroy the entire universe?'
  551. V);
  552. X`009`009`009`009readln(s);
  553. X`009`009`009`009if length(s) > 0 then
  554. X`009`009`009`009`009if substr(lowcase(s),1,1) = 'y' then
  555. X`009`009`009`009`009`009build_system := true;
  556. X`009`009`009end else
  557. X`009`009`009`009writeln('/BUILD is disabled.');
  558. X`009`009end else
  559. X`009`009`009writeln ('Only the Monster Manager may /BUILD.');
  560. X`009end;
  561. X
  562. X`009qualifier := 'DUMP';
  563. X`009status1 := cli$present (qualifier);
  564. X`009if status1 = cli$_present then begin
  565. X`009    if wizard then begin
  566. X`009`009dump_system := true;
  567. X`009    end else
  568. X`009`009writeln ('Only the Monster Manager may /DUMP.');
  569. X`009end;
  570. X
  571. X`009qualifier := 'VERSION';
  572. X`009status1 := cli$present (qualifier);
  573. X`009if status1 = cli$_present then begin
  574. X`009`009`123 Don't take this out please... `125
  575. X`009  `009writeln('Monster dumper, written  by Kari Hurtta  at University of
  576. V Helsinki,  1991-1992');
  577. X                writeln('Version: ',VERSION);
  578. X`009`009writeln;
  579. X`009end;
  580. X
  581. X`009qualifier := 'DEBUG';
  582. X`009status1 := cli$present (qualifier);
  583. X`009if status1 = cli$_present then begin
  584. X`009    if gen_debug then debug := true
  585. X`009    else if userid = MM_userid then debug := true
  586. X`009    else begin
  587. X`009`009writeln ('You may not use /DEBUG.');
  588. X`009`009debug := false
  589. X`009    end
  590. X`009end else debug := false;
  591. X
  592. X`009qualifier := 'OUTPUT';
  593. X`009status1 := cli$present (qualifier);
  594. X`009if status1 = cli$_present then begin
  595. X`009    status2 := cli$get_value (qualifier, value, value_length);
  596. X`009    if status2 = ss$_normal then begin
  597. X`009`009close(OUTPUT);
  598. X`009`009open(OUTPUT,value,new,default := '.LOG');
  599. X`009`009rewrite(OUTPUT);
  600. X`009    end else begin
  601. X`009`009writeln ('Something is wrong with /OUTPUT.');
  602. X`009    end;
  603. X`009end else if status1 = cli$_negated then begin
  604. X`009`009close(OUTPUT);
  605. X`009`009open(OUTPUT,'NLA0:',new);
  606. X`009`009rewrite(OUTPUT);
  607. X`009end;
  608. Xend;
  609. X
  610. X`123 --------------- `125
  611. X
  612. X`123 ITEM `125
  613. X
  614. Xprocedure write_ITEM(var f: TEXT; header,data : string);
  615. Xbegin
  616. X    writeln(f,header+data);
  617. Xend; `123 write_ITEM `125
  618. X
  619. Xfunction read_ITEM(var f: TEXT; header: string; var data : string): boolean;
  620. Xvar readed : `091static`093 boolean := false;
  621. X    line   : `091static`093 string := '';
  622. Xbegin
  623. X    if not readed and not eof(f) then begin
  624. X`009readln(f,line);
  625. X`009readed := true;
  626. X    end;
  627. X    if not readed then read_ITEM := false
  628. X    else if index(line,header) = 1 then begin
  629. X`009data := substr(line,1+length(header),length(line)-length(header));
  630. X`009readed := false;
  631. X`009read_ITEM := true;
  632. X    end else read_ITEM := false;
  633. Xend; `123 read_ITEM `125
  634. X
  635. X`123 DESCLINE `125
  636. X
  637. Xprocedure write_DESCLINE(var f: text; linenum: integer);
  638. Xvar error: boolean;
  639. Xbegin
  640. X
  641. X    if linenum = DEFAULT_LINE then`032
  642. X`009write_ITEM(f,'DEFAULT*DESCLINE','!')
  643. X    else if linenum = 0 then`032
  644. X`009write_ITEM(f,'NULL*DESCLINE','!')
  645. X    else begin
  646. X`009getindex (I_LINE); freeindex;
  647. X`009error := false;
  648. X`009if (linenum < 0) or (linenum > indx.top) then error := true
  649. X`009else if indx.free`091linenum`093 then error := true;
  650. X
  651. X`009if not error then begin
  652. X`009    getline(linenum);
  653. X`009    write_ITEM(f,'DESCLINE%',oneliner.theline);
  654. X`009    freeline;
  655. X`009end else begin
  656. X`009    writeln('Nonexisted description line #',linenum:1);
  657. X`009    write_ITEM(f,'DEFAULT*DESCLINE','!')
  658. X`009end;
  659. X    end;
  660. Xend; `123 write_DESCLINE `125
  661. X
  662. Xfunction read_DESCLINE(var f: text; var linenum: integer): boolean;
  663. Xvar data: string;
  664. Xbegin
  665. X    if read_ITEM(f,'DEFAULT*DESCLINE',data) then begin
  666. X`009linenum := DEFAULT_LINE;
  667. X`009read_DESCLINE := true;
  668. X    end else if read_ITEM(f,'NULL*DESCLINE',data) then begin
  669. X`009linenum := 0;
  670. X`009read_DESCLINE := true;
  671. X    end else if read_ITEM(f,'DESCLINE%',data) then begin
  672. X`009if alloc_general(I_LINE,linenum) then begin
  673. X`009    getline(linenum);
  674. X`009    oneliner.theline := data;
  675. X`009    putline;
  676. X`009    read_DESCLINE := true;
  677. X`009end else read_DESCLINE := false;
  678. X    end else read_DESCLINE := false;
  679. Xend; `123 read_DESCLINE `125
  680. X
  681. X`123 BLOCK `125
  682. X
  683. Xprocedure write_BLOCK(var f: text; code: integer);
  684. Xvar i : integer;
  685. X    error: boolean;
  686. Xbegin
  687. X    if code < 0 then write_DESCLINE(f,-code)
  688. X    else if code = DEFAULT_LINE then`032
  689. X`009write_ITEM(f,'DEFAULT*BLOCK','!')
  690. X    else if code = 0 then`032
  691. X`009write_ITEM(f,'NULL*BLOCK','!')
  692. X    else begin
  693. X`009getindex (I_BLOCK); freeindex;
  694. X`009error := false;
  695. X`009if (code < 0) or (code > indx.top) then error := true
  696. X`009else if indx.free`091code`093 then error := true;
  697. X
  698. X`009if not error then begin
  699. X`009    getblock(code);
  700. X`009    write_ITEM(f,'START*BLOCK','!');
  701. X`009    for i := 1 to block.desclen do`032
  702. X`009`009write_ITEM(f,'BLOCK%',block.lines`091i`093);
  703. X`009    freeblock;
  704. X`009end else begin
  705. X`009    writeln('Nonexisted block desciption #',code:1);
  706. X`009    write_ITEM(f,'NULL*BLOCK','!')
  707. X`009end;
  708. X    end;
  709. Xend; `123 write_BLOCK `125
  710. X
  711. Xfunction read_BLOCK(var f: text; var code: integer): boolean;
  712. Xvar data: string;
  713. Xbegin
  714. X    if read_DESCLINE(f,code) then begin
  715. X`009code := -code;
  716. X`009read_BLOCK := true;
  717. X    end else if read_ITEM(f,'DEFAULT*BLOCK',data) then begin
  718. X`009code := DEFAULT_LINE;
  719. X`009read_BLOCK := true;
  720. X    end else if read_ITEM(f,'NULL*BLOCK',data) then begin
  721. X`009code := 0;
  722. X`009read_BLOCK := true;
  723. X    end else if read_ITEM(f,'START*BLOCK',data) then begin
  724. X`009if alloc_general(I_block,code) then begin
  725. X`009    getblock(code);
  726. X`009    block.desclen := 0;
  727. X`009    while read_ITEM(f,'BLOCK%',data) do begin
  728. X`009`009block.desclen := block.desclen +1;
  729. X`009`009block.lines`091block.desclen`093 := data;
  730. X`009    end;
  731. X`009    putblock;
  732. X`009    read_BLOCK := true;
  733. X`009end else read_BLOCK := false;
  734. X    end else read_BLOCK := false;
  735. Xend; `123 read_BLOCK `125
  736. X
  737. X`123 MEGA `125
  738. X
  739. Xprocedure write_MEGA(var f: text; mega: mega_string);
  740. Xvar len, i, cut: integer;
  741. Xbegin
  742. X    if mega = '' then write_ITEM(f,'NULL*MEGA','!')
  743. X    else if length(mega) < string_len - 10 then
  744. X`009write_ITEM(f,'SHORTMEGA%',mega)
  745. X    else begin
  746. X`009write_ITEM(f,'START*MEGA','!');
  747. X`009i := 1;
  748. X`009len := length(mega);
  749. X`009repeat
  750. X`009    if i + string_len - 10 <= len then cut := string_len - 10
  751. X`009    else cut := len - i +1;
  752. X`009    if cut > 0 then write_ITEM(f,'MEGA%',substr(mega,i,cut));
  753. X`009    i := i + cut;
  754. X`009until cut = 0;
  755. X    end;
  756. Xend; `123 write_MEGA `125
  757. X
  758. Xfunction read_MEGA(var f: text; var mega: mega_string): boolean;
  759. Xvar data: string;
  760. Xbegin
  761. X    mega := '';
  762. X    if read_ITEM(f,'NULL*MEGA',data) then read_MEGA := true
  763. X    else if read_ITEM(f,'SHORTMEGA%',data) then begin
  764. X`009mega := data;
  765. X`009read_MEGA := true;
  766. X    end else if not read_ITEM(f,'START*MEGA',data) then read_MEGA := false
  767. X    else begin
  768. X`009mega := '';
  769. X`009while read_ITEM(f,'MEGA%',data) do mega := mega + data;
  770. X`009read_MEGA := true;
  771. X    end;
  772. Xend; `123 read_MEGA `125
  773. X
  774. X`123 INTEGER `125
  775. X
  776. Xprocedure write_INTEGER(var f: text; header: string; code: integer);
  777. Xvar data: string;
  778. Xbegin
  779. X  writev(data,code:1);
  780. X  write_ITEM(f,header,data);
  781. Xend;
  782. X
  783. Xfunction read_INTEGER(var f: text; header: string; var code: integer): BOOLE
  784. VAN;
  785. Xvar data: string;
  786. Xbegin
  787. X    if read_ITEM(f,header,data) then begin
  788. X`009readv(data,code);
  789. X`009read_INTEGER := true;
  790. X    end else read_INTEGER := false;
  791. Xend;
  792. X
  793. X`123 BINARY `125
  794. X
  795. Xprocedure write_BINARY(var f: TEXT; header,data : string);
  796. Xvar i: integer;
  797. Xbegin
  798. X    write_INTEGER(f,header,length(data));
  799. X    for i:= 1 to length(data) do
  800. X`009write_INTEGER(f,'BIN%',ord(data`091i`093));
  801. Xend;
  802. X
  803. Xfunction read_BINARY(var f: TEXT; header: string; var data: string): boolean
  804. V;
  805. Xvar i,len,c: integer;
  806. X    flag: boolean;
  807. Xbegin
  808. X    if not read_INTEGER(f,header,len) then
  809. X`009read_BINARY := false
  810. X    else begin
  811. X`009flag := true;
  812. X`009data := '';
  813. X`009for i := 1 to len do begin
  814. X`009    if not read_INTEGER(f,'BIN%',c) then flag := false;
  815. X`009    data := data + chr(c);
  816. X`009end;
  817. X`009if not flag then writeln('Error in reading binary string.');
  818. X`009read_BINARY := true;
  819. X    end;
  820. Xend;
  821. X
  822. X`123 BOOLEAN `125
  823. X
  824. Xprocedure write_BOOLEAN(var f: text; header: string; code: boolean);
  825. Xvar data: string;
  826. Xbegin
  827. X  writev(data,code:1);
  828. X  write_ITEM(f,header,data);
  829. Xend;
  830. X
  831. Xfunction read_BOOLEAN(var f: text; header: string; var code: boolean): BOOLE
  832. VAN;
  833. Xvar data: string;
  834. Xbegin
  835. X    if read_ITEM(f,header,data) then begin
  836. X`009readv(data,code);
  837. X`009read_BOOLEAN := true;
  838. X    end else read_BOOLEAN := false;
  839. Xend;
  840. X
  841. X`123 NAME `125
  842. X
  843. Xprocedure write_NAME(var f: text; header: string; class: integer; name: inte
  844. Vger);
  845. Xvar rec: namrec;
  846. Xbegin
  847. X    if name = 0 then write_ITEM(f,header,'%%NULL%%')
  848. X    else begin
  849. X`009get_namfile(class,rec);
  850. X`009unlock(namfile);
  851. X`009write_ITEM(f,header,rec.idents`091name`093);
  852. X    end
  853. Xend; `123 write_NAME `125
  854. X
  855. Xfunction read_NAME(var f: text; header: string; class,iclass: integer;`032
  856. X    var name: integer): boolean;
  857. Xvar code,i: integer;
  858. X    data: string;
  859. X    rec: namrec;
  860. Xbegin
  861. X    if not read_ITEM(f,header,data) then read_NAME := false
  862. X    else begin
  863. X`009if data = '%%NULL%%' then name := 0
  864. X`009else if data = '' then begin
  865. X`009    writeln('Empty name for class ',class:1,'/',iclass:1);
  866. X`009    writeln(' Treated as null name.');
  867. X`009    name := 0;
  868. X`009end else begin
  869. X`009    get_namfile(class,rec);
  870. X`009    unlock(namfile);
  871. X`009    getindex(iclass);
  872. X`009    freeindex;
  873. X`009    name := 0;
  874. X`009    for i := 1 to indx.top do`032
  875. X`009`009if not indx.free`091i`093 then
  876. X`009`009    if rec.idents`091i`093 = data then name := i;
  877. X`009    if name = 0 then writeln('Reference error in class ',
  878. X`009`009    class:1,'/',iclass:1, ' name ',data);
  879. X`009end;
  880. X`009read_NAME := true;
  881. X    end;
  882. Xend;
  883. X
  884. Xfunction read_NEWNAME(var f: text; header: string; class,iclass: integer;`03
  885. V2
  886. X    var name: integer): boolean;
  887. Xvar code,i: integer;
  888. X    data: string;
  889. X    rec: namrec;
  890. Xbegin
  891. X    if not read_ITEM(f,header,data) then read_NEWNAME := false
  892. X    else begin
  893. X`009if data = '%%NULL%%' then name := 0
  894. X`009else if data = '' then begin
  895. X`009    writeln('Empty name for class ',class:1,'/',iclass:1);
  896. X`009    writeln(' Treated as null name.');
  897. X`009    name := 0;
  898. X`009end else begin
  899. X`009    get_namfile(class,rec);
  900. X`009    getindex(iclass);
  901. X`009  `032
  902. X`009    name := 0;
  903. X`009    for i := 1 to indx.top do`032
  904. X`009`009if indx.free`091i`093 and (name = 0) then name := i;
  905. X`009    `123 must to come same order as original so that`032
  906. X`009`009Great Hall, Void and Pit of Fire gets right number `125
  907. X
  908. X`009    if name = 0 then writeln('Overflow error in class ',
  909. X`009`009    class:1,'/',iclass:1, ' name ',data)
  910. X`009    else begin
  911. X`009`009indx.free`091name`093 := false;
  912. X`009`009indx.inuse := indx.inuse +1;
  913. X`009`009rec.idents`091name`093 := data;
  914. X`009    end;
  915. X`009    putindex;
  916. X`009    put_namfile(class,rec);
  917. X
  918. X`009end;
  919. X`009read_NEWNAME := true;
  920. X    end;
  921. Xend;
  922. X
  923. X`123 MDL `125
  924. X
  925. Xprocedure write_MDL(var f: text; code: integer);
  926. Xvar i : integer;
  927. X    mdl: text;
  928. X    line: mega_string;
  929. X    error : boolean;
  930. Xbegin
  931. X   if code = 0 then write_ITEM(f,'NULL*MDL','!')
  932. X   else begin
  933. X`009getindex (I_HEADER); freeindex;
  934. X`009error := false;
  935. X`009if (code < 0) or (code > indx.top) then error := true
  936. X`009else if indx.free`091code`093 then error := true;
  937. X
  938. X`009if not error then begin     `032
  939. X`009    write_ITEM(f,'START*MDL','!');
  940. X`009    open(mdl,file_name(code),old,RECORD_LENGTH := mega_length + 20);
  941. X`009    reset(mdl);
  942. X`009    while not eof(mdl) do begin
  943. X`009`009readln(mdl,line);
  944. X`009`009write_MEGA(f,line);
  945. X`009    end;
  946. X`009    close(mdl);
  947. X`009    getheader(code);
  948. X`009    freeheader;
  949. X`009    write_BOOLEAN(f,'RUNNABLE%',header.runnable);
  950. X`009    write_BOOLEAN(f,'PRIV%',header.priv);
  951. X`009    write_ITEM(f,'OWNER%',header.owner);
  952. X`009    write_ITEM(f,'CTIME%',header.ctime);
  953. X`009    for i := 1 to statmax do if header.stats`091i`093.lab <> '' then
  954. X`009    begin
  955. X`009`009write_ITEM(f,'STATLAB%',header.stats`091i`093.lab);
  956. X`009`009write_INTEGER(f,'RCOUNT%',header.stats`091i`093.runcount);
  957. X`009`009write_INTEGER(f,'ECOUNT%',header.stats`091i`093.errorcount);
  958. X`009`009write_ITEM(f,'LASTRUN%',header.stats`091i`093.lastrun);
  959. X`009    end;
  960. X`009    write_ITEM(f,'AUTHOR%',header.author);
  961. X`009    write_ITEM(f,'WTIME%',header.wtime);
  962. X`009    write_MEGA(f,header.state);
  963. X`009    write_INTEGER(f,'FLAGS%',header.flags);
  964. X`009end else begin
  965. X`009    writeln('Nonexisted MDL code #',code:1);
  966. X`009    write_ITEM(f,'NULL*MDL','!')
  967. X`009end;
  968. X   end;
  969. Xend; `123 write_MDL `125
  970. X
  971. Xfunction read_MDL(var f: text; var code: integer): boolean;
  972. Xvar data: string;
  973. X    flag: boolean;
  974. X    mdl: text;
  975. X    line: mega_string;
  976. X    i: integer;
  977. Xbegin
  978. X    if read_ITEM(f,'NULL*MDL',data) then begin
  979. X`009code := 0;
  980. X`009read_MDL := true;
  981. X    end else if not read_ITEM(f,'START*MDL',data) then read_mdl := false
  982. X    else begin
  983. X`009getindex(I_HEADER);
  984. X`009flag := true;
  985. X`009code := 0;
  986. X`009for i := 1 to indx.top do`032
  987. X`009    if indx.free`091i`093 then code := i;
  988. X
  989. X`009if code = 0 then writeln('Overflow error in mdl store.')
  990. X`009else begin
  991. X`009    indx.free`091code`093 := false;
  992. X`009    indx.inuse := indx.inuse +1;
  993. X`009   `032
  994. X`009    getheader(code);
  995. X
  996. X`009    open(mdl,file_name(code),old,RECORD_LENGTH := mega_length + 20);
  997. X`009    rewrite(mdl);
  998. X`009    while read_MEGA(f,line) do writeln(mdl,line);
  999. X`009    close(mdl);
  1000. X`009    if not read_BOOLEAN(f,'RUNNABLE%',header.runnable) then flag := fals
  1001. Ve;
  1002. X`009    if not read_BOOLEAN(f,'PRIV%',header.priv) then flag := false;
  1003. X`009    header.interlocker := '';
  1004. X`009    if not read_ITEM(f,'OWNER%',data) then flag := false;
  1005. X`009    header.owner := data;
  1006. X`009    if not read_ITEM(f,'CTIME%',data) then flag := false;
  1007. X`009    header.ctime := data;
  1008. X`009   `032
  1009. X`009    for i := 1 to statmax do header.stats`091i`093.lab := '';
  1010. X`009    i := 1;
  1011. X`009    while read_ITEM(f,'STATLAB%',data) do begin
  1012. X`009`009header.stats`091i`093.lab := data;
  1013. X`009`009if not read_INTEGER(f,'RCOUNT%',header.stats`091i`093.runcount) then
  1014. V flag := false;
  1015. X`009`009if not read_INTEGER(f,'ECOUNT%',header.stats`091i`093.errorcount) th
  1016. Ven flag := false;
  1017. X`009`009if not read_ITEM(f,'LASTRUN%',data) then flag := false;
  1018. X`009`009header.stats`091i`093.lastrun := data;
  1019. X`009`009i := i +1;
  1020. X`009    end;
  1021. X`009    if not read_ITEM(f,'AUTHOR%',data) then flag := false;
  1022. X`009    header.author := data;
  1023. X`009    if not read_ITEM(f,'WTIME%',data) then flag := false;
  1024. X`009    header.wtime := data;
  1025. X`009    header.running_id := '';
  1026. X`009    if not read_MEGA(f,header.state) then flag := false;
  1027. X`009    header.version := 1;
  1028. X`009    header.ex1 := '';
  1029. X`009    header.ex2 := '';
  1030. X`009    header.ex3 := '';
  1031. X`009    if not read_INTEGER(f,'FLAGS%',header.flags) then flag := false;
  1032. X`009    header.ex5 := 0;
  1033. X`009    header.ex6 := 0.0;
  1034. X`009    putheader;
  1035. X`009end;
  1036. X`009putindex;
  1037. X`009if not flag then writeln('Error in reading mdl code.');
  1038. X`009read_MDL := true;
  1039. X    end;
  1040. Xend;
  1041. X
  1042. X`123 OBJECT `125
  1043. X
  1044. Xprocedure write_OBJECT(var f: text; object: integer);
  1045. Xbegin
  1046. X   if debug then writeln('Writing object #',object:1);
  1047. X   write_NAME(f,'OBJECT%',T_OBJNAM,object); `123 write object name `125
  1048. X
  1049. X   getobjown; freeobjown;
  1050. X   write_ITEM(f,'OWNER%',objown.idents`091object`093);
  1051. X
  1052. X   getobj(object);
  1053. X   freeobj;
  1054. X   write_ITEM(f,'NAME%',obj.oname);  `123 duplicate name `125
  1055. X   write_INTEGER(f,'KIND%',obj.kind);
  1056. X   write_DESCLINE(f,obj.linedesc);
  1057. X   `123 *** home must write later `125
  1058. X   write_BLOCK(f,obj.homedesc);
  1059. X   write_MDL(f,obj.actindx);
  1060. X   write_BLOCK(f,obj.examine);
  1061. X   write_INTEGER(f,'VALUE%',obj.worth);
  1062. X   `123 don't write numexit `125
  1063. X   write_BOOLEAN(f,'STICKY%',obj.sticky);
  1064. X   `123 *** getobjreq must write later `125
  1065. X   write_BLOCK(f,obj.getfail);
  1066. X   write_BLOCK(f,obj.getsuccess);
  1067. X   `123 *** useobjreq must write later `125
  1068. X   `123 *** uselogreq must write later `125
  1069. X   write_BLOCK(f,obj.usefail);
  1070. X   write_BLOCK(f,obj.usesuccess);
  1071. X   write_ITEM(f,'USEALIAS%',obj.usealias);
  1072. X   write_BOOLEAN(f,'REQALIAS%',obj.reqalias);
  1073. X   write_BOOLEAN(f,'REQVERB%',obj.reqverb);
  1074. X   write_INTEGER(f,'PARTICLE%',obj.particle);
  1075. X   case obj.kind of
  1076. X`009O_BOOK:
  1077. X`009    write_NAME(f,'BOOKSPELL%',T_SPELL_NAME,obj.parms`091OP_SPELL`093);
  1078. X`009otherwise ;
  1079. X   end;
  1080. X
  1081. X   write_BLOCK(f,obj.d1);
  1082. X   write_BLOCK(f,obj.d2);
  1083. X   write_INTEGER(f,'POWER%',obj.ap);
  1084. X   write_INTEGER(f,'EXP%',obj.exreq);
  1085. X   `123 *** exp5, exp6 not dumped `125
  1086. Xend; `123 write_OBJECT `125
  1087. X
  1088. Xfunction read_OBJECT(var f: text; var object: integer): boolean;
  1089. Xvar id: integer;
  1090. X    flag : boolean;
  1091. X    s: string;
  1092. Xbegin
  1093. X   if not read_NEWNAME(f,'OBJECT%',T_OBJNAM,I_OBJECT,object) then read_OBJEC
  1094. VT := false
  1095. X   else if object = 0 then begin
  1096. X      writeln('Object with empty/null name!');
  1097. X      read_ITEM(f,'OWNER%',s);
  1098. X      read_ITEM(f,'NAME%',s);
  1099. X      writeln('  Name: ',s);
  1100. X      read_INTEGER(f,'KIND%',id);
  1101. X      read_DESCLINE(f,id);
  1102. X      read_BLOCK(f,id);
  1103. X      read_MDL(f,id);
  1104. X      read_BLOCK(f,id);
  1105. X      read_INTEGER(f,'VALUE%',id);
  1106. X      read_BOOLEAN(f,'STICKY%',flag);
  1107. X      read_BLOCK(f,id);
  1108. X      read_BLOCK(f,id);
  1109. X      read_BLOCK(f,id);
  1110. X      read_BLOCK(f,id);
  1111. X      read_ITEM(f,'USEALIAS%',s);
  1112. X      read_BOOLEAN(f,'REQALIAS%',flag);
  1113. X      read_BOOLEAN(f,'REQVERB%',flag);
  1114. X      read_INTEGER(f,'PARTICLE%',id);
  1115. X`009`123 one possible parms: `125
  1116. X`009read_NAME(f,'BOOKSPELL%',T_SPELL_NAME,I_SPELL,id);
  1117. X      read_BLOCK(f,id);
  1118. X      read_BLOCK(f,id);
  1119. X      read_INTEGER(f,'POWER%',id);
  1120. X      read_INTEGER(f,'EXP%',id);
  1121. X
  1122. X      read_OBJECT := true;
  1123. X   end else begin
  1124. X      getobjnam; freeobjnam;
  1125. X      if debug then writeln('Reading object ',objnam.idents`091object`093);
  1126. X      flag := true;
  1127. X
  1128. X      getobjown;
  1129. X      if not read_ITEM(f,'OWNER%',s) then flag := false;
  1130. X      objown.idents`091object`093 := s;
  1131. X      putobjown;
  1132. X
  1133. X      getobj(object);
  1134. X      obj.onum := object; `123 !! `125
  1135. X      if not read_ITEM(f,'NAME%',s) then flag := false;
  1136. X      obj.oname := s;
  1137. X      if not read_INTEGER(f,'KIND%',obj.kind) then flag := false;
  1138. X      if not read_DESCLINE(f,obj.linedesc) then flag := false;
  1139. X      obj.home := 0;
  1140. X      if not read_BLOCK(f,obj.homedesc) then flag := false;
  1141. X      if not read_MDL(f,obj.actindx) then flag := false;
  1142. X      if not read_BLOCK(f,obj.examine) then flag := false;
  1143. X      if not read_INTEGER(f,'VALUE%',obj.worth) then flag := false;
  1144. X      obj.numexist := 0;
  1145. X      if not read_BOOLEAN(f,'STICKY%',obj.sticky) then flag := false;
  1146. X      obj.getobjreq := 0;
  1147. X      if not read_BLOCK(f,obj.getfail) then flag := false;
  1148. X      if not read_BLOCK(f,obj.getsuccess) then flag := false;
  1149. X      obj.useobjreq := 0;
  1150. X      obj.uselocreq := 0;
  1151. X      if not read_BLOCK(f,obj.usefail) then flag := false;
  1152. X      if not read_BLOCK(f,obj.usesuccess) then flag := false;
  1153. X      if not read_ITEM(f,'USEALIAS%',s) then flag := false;
  1154. X      obj.usealias := s;
  1155. X      if not read_BOOLEAN(f,'REQALIAS%',obj.reqalias) then flag := false;
  1156. X      if not read_BOOLEAN(f,'REQVERB%',obj.reqverb) then flag := false;
  1157. X      if not read_INTEGER(f,'PARTICLE%',obj.particle) then flag := false;
  1158. X      for id := 1 to maxparm do obj.parms`091id`093 := 0;
  1159. X      case obj.kind of`032
  1160. X`009    O_BOOK: if READ_vers_101 then `123 BOOKSPELL% was in version 1.01 !!
  1161. V `125
  1162. X`009`009if not read_NAME(f,'BOOKSPELL%',T_SPELL_NAME,I_SPELL,
  1163. X`009`009    obj.parms`091OP_SPELL`093) then flag := false;
  1164. X`009    otherwise ;
  1165. X      end;
  1166. X      if not read_BLOCK(f,obj.d1) then flag := false;
  1167. X      if not read_BLOCK(f,obj.d2) then flag := false;
  1168. X      if not read_INTEGER(f,'POWER%',obj.ap) then flag := false;
  1169. X      if not read_INTEGER(f,'EXP%',obj.exreq) then flag := false;
  1170. X      putobj;
  1171. X      if not flag then writeln('Error in reading object ',
  1172. X`009objnam.idents`091object`093);
  1173. X      read_OBJECT := true;
  1174. X   end;
  1175. Xend; `123 read_OBJECT `125
  1176. X
  1177. X`123 OBJECT2 `125
  1178. X
  1179. Xprocedure write_OBJECT2(var f: text; object: integer);
  1180. Xbegin
  1181. X   write_NAME(f,'OBJECT2%',T_OBJNAM,object); `123 write object name `125
  1182. X   getobj(object);
  1183. X   freeobj;
  1184. X   write_NAME(f,'HOME%',T_NAM,obj.home); `123 write room name `125
  1185. X   write_NAME(f,'GETOBJREQ%',T_OBJNAM,obj.getobjreq); `123 write object name
  1186. V `125
  1187. X   write_NAME(f,'USEOBJREQ%',T_OBJNAM,obj.useobjreq); `123 write object name
  1188. V `125
  1189. X   write_NAME(f,'USELOC%',T_NAM,obj.uselocreq); `123 write room name `125
  1190. X
  1191. X   case obj.kind of
  1192. X      O_BOOK: write_name(f,'SPELLREF%',T_SPELL_NAME,obj.parms`091OP_SPELL`09
  1193. V3);
  1194. X      otherwise ;
  1195. X   end; `123 case `125
  1196. X
  1197. Xend; `123 write_OBJECT2 `125
  1198. X
  1199. Xfunction read_OBJECT2(var f: text; var object: integer): boolean;
  1200. Xvar id: integer;
  1201. X    flag : boolean;
  1202. X    s: string;
  1203. Xbegin
  1204. X   if not read_NAME(f,'OBJECT2%',T_OBJNAM,I_OBJECT,object) then read_OBJECT2
  1205. V := false
  1206. X   else if object = 0 then begin
  1207. X`009writeln('Empty/null/unknown object name!');
  1208. X      read_NAME(f,'HOME%',T_NAM,I_ROOM,id);
  1209. X      read_NAME(f,'GETOBJREQ%',T_OBJNAM,I_OBJECT,id);
  1210. X      read_NAME(f,'USEOBJREQ%',T_OBJNAM,I_OBJECT,id);
  1211. X      read_NAME(f,'USELOC%',T_NAM,I_ROOM,id);
  1212. X      read_NAME(f,'SPELLREF%',T_SPELL_NAME,I_SPELL,id);
  1213. X      read_OBJECT2 := true;
  1214. X   end else begin
  1215. X      getobjnam; freeobjnam;
  1216. X      if debug then writeln('Reading object ',objnam.idents`091object`093);
  1217. X      flag := true;
  1218. X      getobj(object);
  1219. X      if not read_NAME(f,'HOME%',T_NAM,I_ROOM,obj.home) then flag := false;
  1220. V `123 room name `125
  1221. X      if not read_NAME(f,'GETOBJREQ%',T_OBJNAM,I_OBJECT,obj.getobjreq) then
  1222. V flag := false; `123 object name `125
  1223. X      if not read_NAME(f,'USEOBJREQ%',T_OBJNAM,I_OBJECT,obj.useobjreq) then
  1224. V flag := false; `123 object name `125
  1225. X      if not read_NAME(f,'USELOC%',T_NAM,I_ROOM,obj.uselocreq) then flag :=
  1226. V false;
  1227. X
  1228. X      case obj.kind of
  1229. X`009O_BOOK: begin
  1230. X`009    if not read_NAME(f,'SPELLREF%',T_SPELL_NAME,I_SPELL,obj.parms`091OP_
  1231. VSPELL`093) then flag := false;
  1232. X`009end;
  1233. X`009otherwise ;
  1234. X      end; `123 case `125
  1235. X
  1236. X      putobj;
  1237. X      if not flag then writeln('Error in reading object ',
  1238. X`009    objnam.idents`091object`093);
  1239. X      read_OBJECT2 := true;
  1240. X   end;
  1241. Xend; `123 read_OBJECT2 `125
  1242. X
  1243. X`123 MONSTER `125
  1244. X
  1245. Xprocedure write_MONSTER(var f: text; rec: peoplerec);
  1246. Xvar i: integer;
  1247. X    c: char;
  1248. X    id: integer;
  1249. X   `032
  1250. Xbegin
  1251. X    write_INTEGER(f,'MONSTERKIND%',rec.kind);
  1252. X    write_MDL(f,rec.parm);
  1253. X    `123 don't write rec.username - it's :<rec.parm> `125
  1254. X    write_ITEM(f,'NAME%',rec.name);
  1255. X    write_INTEGER(f,'HIDING%',rec.hiding);
  1256. X    for i := 1 to maxhold do if rec.holding`091i`093 <> 0 then
  1257. X`009write_NAME(f,'HOLD%',T_OBJNAM,rec.holding`091i`093); `123 write object n
  1258. Vame `125
  1259. X    write_NAME(f,'WEAR%',T_OBJNAM,rec.wearing); `123 write object name `125
  1260. X    write_NAME(f,'WIELD%',T_OBJNAM,rec.wielding); `123 write object name `12
  1261. V5
  1262. X    `123 don't write self desc `125
  1263. Xend; `123 write_MONSTER `125
  1264. X
  1265. Xfunction read_MONSTER(var f: text; var rec: peoplerec): boolean;
  1266. Xvar i,a,id: integer;
  1267. X    flag : boolean;
  1268. X    data: string;
  1269. Xbegin
  1270. X    if not read_INTEGER(f,'MONSTERKIND%',rec.kind) then read_MONSTER := fals
  1271. Ve
  1272. X    else begin
  1273. X`009getpers; freepers;
  1274. X`009flag := true;
  1275. X`009if not read_MDL(f,rec.parm) then flag := false;
  1276. X`009writev(rec.username,':',rec.parm:1); `123 username is MDL code number `1
  1277. V25
  1278. X
  1279. X`009if not read_ITEM(f,'NAME%',data) then flag := false;
  1280. X`009rec.name := data;
  1281. X    `009id := 0; `123 monster's number `125
  1282. X`009getpers; freepers; getindex(I_PLAYER); freeindex;
  1283. X`009for i := 1 to indx.top do if not indx.free`091i`093 then
  1284. X`009    if pers.idents`091i`093 = data then id := i;
  1285. X`009if id = 0 then writeln('Monster''s name ',data,' not found.');
  1286. X
  1287. X`009getuser;
  1288. X`009if id > 0 then writev(user.idents`091id`093,':',rec.parm:1); `123 update
  1289. V username `125
  1290. X`009putuser;
  1291. X
  1292. X`009if not read_INTEGER(f,'HIDING%',rec.hiding) then flag := false;
  1293. X`009rec.act  := 0;
  1294. X`009rec.targ := 0;
  1295. X`009for i := 1 to maxhold do rec.holding`091i`093 := 0;
  1296. X`009i := 1;
  1297. X`009while read_NAME(f,'HOLD%',T_OBJNAM,I_OBJECT,a) do begin
  1298. X`009    rec.holding`091i`093 := a;
  1299. X
  1300. X`009    getobj(a);  `032
  1301. X`009    obj.numexist := obj.numexist + 1;   `123 Update counter `125
  1302. X`009    putobj;
  1303. X
  1304. X
  1305. X`009    i := i +1;
  1306. X`009end;
  1307. X`009getint(N_EXPERIENCE); freeint;
  1308. X`009if id > 0 then rec.experience := anint.int`091id`093;
  1309. X
  1310. X`009if not read_NAME(f,'WEAR%',T_OBJNAM,I_OBJECT,rec.wearing) then flag := f
  1311. Valse; `123 object name `125
  1312. X`009if not read_NAME(f,'WIELD%',T_OBJNAM,I_OBJECT,rec.wielding) then flag :=
  1313. V false; `123 object name `125
  1314. X
  1315. X`009getint(N_HEALTH); freeint;
  1316. X`009if id > 0 then rec.health := anint.int`091id`093;
  1317. X
  1318. X`009getint(N_SELF); freeint;
  1319. X`009if id > 0 then rec.self := anint.int`091id`093;
  1320. X
  1321. X`009if not flag then writeln('Error in loading monster ',rec.name);
  1322. X`009read_MONSTER := true;
  1323. X    end;
  1324. Xend; `123 read_MONSTER `125
  1325. X
  1326. X`123 PLAYER `125
  1327. X
  1328. Xprocedure write_PLAYER(var f: text; player: integer);
  1329. Xvar i,owner: integer;
  1330. X    c: char;
  1331. Xbegin
  1332. X    getuser; freeuser;`032
  1333. X    if debug then writeln('Writing player ',user.idents`091player`093);
  1334. X    write_NAME(f,'PLAYER%',T_PERS,player);
  1335. X
  1336. X    if user.idents`091player`093`0911`093 = ':' then begin `123 monster ? `1
  1337. V25
  1338. X`009`123 what we can write - real username is MDL number `125
  1339. X`009`123 read_MONSTER will be update this data when reading `125
  1340. X    end else write_ITEM(f,'USER%',user.idents`091player`093);
  1341. X
  1342. X    getdate; freedate;
  1343. X    write_ITEM(f,'DATE%',adate.idents`091player`093);
  1344. X
  1345. X    gettime; freetime;
  1346. X    write_ITEM(f,'TIME%',atime.idents`091player`093);
  1347. X
  1348. X    getpasswd; freepasswd;
  1349. X    if passwd.idents`091player`093 > '' then
  1350. X`009write_BINARY(f,'PASSWD%',passwd.idents`091player`093);
  1351. X
  1352. X    getreal_user; freereal_user;
  1353. X    if real_user.idents`091player`093 > '' then
  1354. +-+-+-+-+-+-+-+-  END  OF PART 26 +-+-+-+-+-+-+-+-
  1355.