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

  1. Path: uunet!mcsun!news.funet.fi!hydra!klaava!hurtta
  2. From: Kari.Hurtta@Helsinki.FI (Kari. E. Hurtta)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Monster Helsinki, Delta from 1.04 to 1.05 - part 6/7
  5. Message-ID: <1992Jun30.221956.13638@klaava.Helsinki.FI>
  6. Date: 30 Jun 92 22:19:56 GMT
  7. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  8. Followup-To: vmsnet.sources.d
  9. Organization: University of Helsinki
  10. Lines: 1449
  11.  
  12. Archive-name: monster_helsinki_104_to_105/delta6
  13. Environment: VMS, Pascal
  14. Author: Kari.Hurtta@Helsinki.FI
  15.  
  16. -+-+-+-+-+-+-+-+ START OF PART 6 -+-+-+-+-+-+-+-+
  17. X`009`009writeln('Only the Monster Manager may make things public.');
  18. X- 7455, 7518
  19. X
  20. X`123 sum up the number of real exits in this room `125
  21. X
  22. Xfunction find_numexits: integer;
  23. Xvar
  24. X`009i: integer;
  25. X`009sum: integer;
  26. X
  27. Xbegin
  28. X`009sum := 0;
  29. X`009for i := 1 to maxexit do
  30. X`009`009if here.exits`091i`093.toloc <> 0 then
  31. X`009`009`009sum := sum + 1;
  32. X`009find_numexits := sum;
  33. X- 7523, 7535
  34. X`123 clear all people who have played monster and quit in this location
  35. X  out of the room so that when they start up again they won't be here,
  36. X  because we are destroying this room `125
  37. X
  38. Xprocedure clear_people(loc: integer);
  39. Xvar
  40. X`009i: integer;
  41. X
  42. Xbegin
  43. X`009getint(N_LOCATION);
  44. X`009for i := 1 to maxplayers do
  45. X`009`009if anint.int`091i`093 = loc then
  46. X`009`009`009anint.int`091i`093 := 1;
  47. X`009putint;
  48. X- 7539, 7556
  49. X/
  50. $ CALL UNPACK MON.DIF;1 1853590203
  51. $ create/nolog 'f'
  52. X/
  53. $ CALL UNPACK MONSTER.DIF;1 47
  54. $ create/nolog 'f'
  55. X-   28,   30
  56. X   20.06.1992 `124         `124 V 1.03    write_VIRTUAL, read_VIRTUAL
  57. X`125
  58. X
  59. XCONST DVERSION = '1.03'; `123 DUMPER Version `125
  60. X-   35
  61. X    READ_vers_103: boolean;
  62. X-  140,  141
  63. X                writeln('Database version: ',DVERSION);
  64. X`009`009writeln('Version:          ',VERSION);
  65. X`009`009writeln('Distributed:      ',DISTRIBUTED);
  66. X-  863,  865
  67. X`123 PLAYER_body `125
  68. X
  69. Xprocedure write_PLAYER_body(var f: text; player: integer);
  70. X-  869,  877
  71. X    if debug then writeln('Writein player body #',player:1);
  72. X-  923, 1007
  73. Xend; `123 write_PLAYER_body `125
  74. X
  75. Xprocedure skip_PLAYER_body(var f: TEXT);
  76. Xvar i: integer;
  77. X    data: string;
  78. Xbegin
  79. X    if debug then writeln('Skipping player body');
  80. X    read_ITEM(f,'DATE%',data);
  81. X    read_ITEM(f,'TIME%',data);
  82. X    read_BINARY(f,'PASSWD%',data);
  83. X    read_ITEM(f,'REAL%',data);
  84. X    read_INTEGER(f,'ALLOW%',i);
  85. X    read_INTEGER(f,'EXP%',i);
  86. X    read_BLOCK(f,i);
  87. X    read_INTEGER(f,'PRIV%',i);
  88. X    read_INTEGER(f,'HEALTH%',i);
  89. X    read_NAME(f,'LOC%',T_NAM,I_ROOM,i);
  90. X    while read_NAME(f,'SPELL%',T_SPELL_NAME,I_SPELL,i) do begin
  91. X`009read_INTEGER(f,'LEVEL%',i);
  92. X    end;
  93. Xend; `123 skip_PLAYER_body `125
  94. X
  95. Xprocedure read_PLAYER_body(var f: text; name: integer; var flag: boolean);
  96. Xvar sp,i,owner: integer;
  97. X    data: string;
  98. Xbegin
  99. X    if debug then writeln('Reading player body #',name:1);
  100. X
  101. X    getdate;
  102. X    if not read_ITEM(f,'DATE%',data) then flag := false;
  103. X    adate.idents`091name`093 := data;
  104. X    putdate;
  105. X
  106. X    gettime;
  107. X    if not read_ITEM(f,'TIME%',data) then flag := false;
  108. X    atime.idents`091name`093 := data;
  109. X    puttime;
  110. X
  111. X    if read_BINARY(f,'PASSWD%',data) then begin
  112. X`009getpasswd;
  113. X`009passwd.idents`091name`093 := data;
  114. X`009putpasswd;
  115. X    end else begin
  116. X`009getpasswd;
  117. X`009passwd.idents`091name`093 := '';
  118. X`009putpasswd;
  119. X    end;
  120. X
  121. X    if read_ITEM(f,'REAL%',data) then begin
  122. X`009getreal_user;
  123. X`009real_user.idents`091name`093 := data;
  124. X`009putreal_user;
  125. X    end else begin
  126. X`009getreal_user;
  127. X`009real_user.idents`091name`093 := '';
  128. X`009putreal_user;
  129. X    end;
  130. X
  131. X    getint(N_ALLOW);
  132. X    if not read_INTEGER(f,'ALLOW%',anint.int`091name`093) then flag := false
  133. V;
  134. X    putint;
  135. X
  136. X    getint(N_EXPERIENCE);
  137. X    if not read_INTEGER(f,'EXP%',anint.int`091name`093) then flag := false;
  138. X    putint;
  139. X
  140. X    getint(N_SELF);
  141. X    if not read_BLOCK(f,anint.int`091name`093) then flag := false;
  142. X    putint;
  143. X
  144. X    getint(N_PRIVILEGES);
  145. X    if not read_INTEGER(f,'PRIV%',anint.int`091name`093) then flag := false;
  146. X    putint;
  147. X
  148. X    getint(N_HEALTH);
  149. X    if not read_INTEGER(f,'HEALTH%',anint.int`091name`093) then flag := fals
  150. Ve;
  151. X    putint;
  152. X
  153. X    getint(N_LOCATION);
  154. X    if not read_NAME(f,'LOC%',T_NAM,I_ROOM,anint.int`091name`093) then flag
  155. V := false;
  156. X    putint;
  157. X- 1021, 1026
  158. X    getspell(name);
  159. X    for sp := 1 to maxspells do spell.level`091sp`093 := 0;
  160. X    while read_NAME(f,'SPELL%',T_SPELL_NAME,I_SPELL,sp) do begin
  161. X`009if not read_INTEGER(f,'LEVEL%',spell.level`091sp`093) then flag := false
  162. V;
  163. X    end;
  164. X    putspell;
  165. X
  166. Xend; `123 read_PLAYER_body `125
  167. X
  168. X`123 PLAYER `125
  169. X
  170. Xprocedure write_PLAYER(var f: text; player: integer);
  171. Xbegin
  172. X    getuser; freeuser;`032
  173. X    if debug then writeln('Writing player ',user.idents`091player`093);
  174. X    write_NAME(f,'PLAYER%',T_PERS,player);
  175. X
  176. X    if user.idents`091player`093`0911`093 = ':' then begin `123 monster ? `1
  177. V25
  178. X`009`123 what we can write - real username is MDL number `125
  179. X`009`123 read_MONSTER will be update this data when reading `125
  180. X    end else write_ITEM(f,'USER%',user.idents`091player`093);
  181. X
  182. X    write_PLAYER_body(f,player);
  183. Xend; `123 write_PLAYER `125
  184. X
  185. Xfunction read_PLAYER(var f: text; var name: integer): boolean;
  186. Xvar flag: boolean;
  187. X    data: string;
  188. Xbegin
  189. X    if not read_NEWNAME(f,'PLAYER%',T_PERS,I_PLAYER,name) then read_PLAYER :
  190. V= false
  191. X    else if name = 0 then begin
  192. X`009writeln('Empty/null player name!');
  193. X`009read_ITEM(f,'USER%',data);
  194. X`009skip_PLAYER_body(f);
  195. X`009read_PLAYER := true;
  196. X    end else begin
  197. X
  198. X`009getpers; freepers;
  199. X`009if debug then writeln('Reading player ',pers.idents`091name`093);
  200. X`009flag := true;
  201. X
  202. X`009getuser;
  203. X`009if not read_ITEM(f,'USER%',data) then begin
  204. X`009    `123 monster: username is :<MDL code number> `125
  205. X`009    `123 read_MONSTER update this later `125
  206. X`009    data := ':0';
  207. X`009end;
  208. X`009user.idents`091name`093 := data;
  209. X`009putuser;
  210. X
  211. X`009read_PLAYER_body(f,name,flag);
  212. X- 1032
  213. X`123 VIRTUAL `125
  214. X
  215. Xprocedure write_VIRTUAL (var f: TEXT; player: integer);
  216. Xbegin
  217. X    getuser; freeuser;`032
  218. X
  219. X    if debug then writeln('Writing virtual player #',player:1,' (',
  220. X`009user.idents`091player`093,')');
  221. X    write_INTEGER(f,'VIRTUAL%',player);
  222. X    getpers; freepers;
  223. X    write_ITEM(f,'NAME%',pers.idents`091player`093);
  224. X    write_ITEM(f,'USER%',user.idents`091player`093);
  225. X
  226. X    write_PLAYER_body(f,player);
  227. Xend; `123 write_VIRTUAL `125
  228. X
  229. Xfunction read_VIRTUAL (var f: text; var player: integer): boolean;
  230. Xvar flag,skip: boolean;
  231. X    data: string;
  232. Xbegin
  233. X    if not read_INTEGER(f,'VIRTUAL%',player) then read_VIRTUAL := FALSE
  234. X    else begin
  235. X`009if debug then writeln('Reading virtual player #',player);
  236. X`009flag := true; skip := false;
  237. X`009getindex(I_PLAYER);
  238. X`009if (player < 1) or (player > indx.top) then begin
  239. X`009    writeln('Virtual player id #',player:1, 'out of range.');
  240. X`009    skip := true;
  241. X`009end else if not indx.free`091player`093 then begin
  242. X`009    writeln('Virtual player id #',player:1, 'is already reserved.');
  243. X`009    skip := true;
  244. X`009end else begin
  245. X`009    indx.free`091player`093 := false;
  246. X`009    indx.inuse := indx.inuse +1;
  247. X`009end;
  248. X`009putindex;
  249. X`009if skip then begin
  250. X`009    read_ITEM(f,'NAME%',data);
  251. X`009    read_ITEM(f,'USER%',data);
  252. X`009    skip_PLAYER_body(f);
  253. X
  254. X`009    read_VIRTUAL := true;
  255. X`009end else begin
  256. X`009    if not read_ITEM(f,'NAME%',data) then flag := false;
  257. X`009    getpers;
  258. X`009    pers.idents`091player`093 := data;
  259. X`009    putpers;
  260. X
  261. X`009    if not read_ITEM(f,'USER%',data) then flag := false;
  262. X`009    getuser;
  263. X`009    user.idents`091player`093 := data;
  264. X`009    putuser;
  265. X`009   `032
  266. X`009    read_PLAYER_body(f,player,flag);`032
  267. X
  268. X`009    if not flag then writeln('Error in reading virtual player #',
  269. X`009`009player:1,' (',pers.idents`091player`093,')');
  270. X
  271. X`009    read_VIRTUAL := true;
  272. X`009end;
  273. X    end;
  274. Xend; `123 read_VIRTUAL `125
  275. X
  276. X
  277. X- 1444, 1444
  278. X    write_ITEM(f,'DATABASE%',DVERSION);
  279. X- 1480, 1480
  280. X    writeln('   virtual');
  281. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then`032
  282. X`009if user.idents`091i`093`0911`093 = '"' then write_VIRTUAL(f,i);
  283. X    writeln('   real');
  284. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then`032
  285. X`009if user.idents`091i`093`0911`093 <> '"' then write_PLAYER(f,i);
  286. X
  287. X- 1521, 1521
  288. X    READ_vers_103 := ver >= '1.03';
  289. X    if (ver > DVERSION) then writeln('Unknown version!');
  290. X- 1660, 1662
  291. X    if READ_vers_103 then begin
  292. X`009j := 0;
  293. X`009while read_VIRTUAL(f,i) do j := j + 1;
  294. X`009writeln(j:3,' virtual players readed.');
  295. X    end;
  296. X    j := 0;
  297. X    while read_PLAYER(f,i) do j := j + 1;
  298. X    if READ_vers_103 then
  299. X`009writeln(j:3,' real players readed.')
  300. X    else
  301. X`009writeln(j:3,' players readed.');
  302. X/
  303. $ CALL UNPACK MONSTER_DUMP.DIF;1 1545068384
  304. $ create/nolog 'f'
  305. X-  281,  282
  306. X    Directory for MONSTER.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE and`032
  307. X      MONSTER_WHO.EXE, lets call it  IMAGE directory.
  308. X-  290,  290
  309. X  MONSTER_DUMP.PAS, MONSTER_REBUILD.PAS, ALLOC.PAS and VERSION.PAS.
  310. X-  296,  296
  311. X  MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE.
  312. X-  316,  333
  313. X$ PASCAL /CHECK=ALL GLOBAL               `032
  314. X$ PASCAL /CHECK=ALL GUTS                `032
  315. X$ PASCAL /CHECK=ALL DATABASE             `032
  316. X$ PASCAL /CHECK=ALL CLI
  317. X$ PASCAL /CHECK=ALL  PRIVUSERS
  318. X$ PASCAL /CHECK=ALL PARSER               `032
  319. X$ PASCAL /CHECK=ALL INTERPRETER         `032
  320. X$ PASCAL /CHECK=ALL QUEUE                `032
  321. X$ PASCAL /CHECK=ALL ALLOC       `032
  322. X$ PASCAL /CHECK=ALL CUSTOM              `032
  323. X$ PASCAL /CHECK=ALL MON                  `032
  324. X$ PASCAL /CHECK=ALL  KEYS        `032
  325. X$ PASCAL /CHECK=ALL VERSION             `032
  326. X$ LINK MON,GUTS,INTERPRETER,KEYS,PRIVUSERS,QUEUE,PARSER,CLI,GLOBAL, -
  327. XDATABASE,CUSTOM,ALLOC,VERSION `032
  328. X$ PASCAL /CHECK=ALL MONSTER_DUMP
  329. X$ LINK MONSTER_DUMP, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER,   VERSION
  330. X$ PASCAL /CHECK=ALL MONSTER_REBUILD
  331. X$ LINK MONSTER_REBUILD, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER, -
  332. XALLOC, KEYS, VERSION
  333. X$ PASCAL /CHECK=ALL MONSTER_WHO
  334. X$ LINK MONSTER_WHO, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER
  335. X
  336. X  You can also produce these files with command
  337. X$ MMS ALL
  338. X  if you have MMS (and MAKEFILE in that directory)
  339. X
  340. X  Put MON.EXE, MONSTER_WHO.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE`032
  341. X  and MONSTER_E.HLB to IMAGE directory.
  342. X-  351
  343. Xdefine syntax MONSTER_DUMP
  344. X   image <IMAGE -directory>monster_dump
  345. X   parameter P1
  346. X        label = DUMP_FILE
  347. X        prompt = "Dump file"
  348. X        value(type=$file,required)
  349. Xdefine syntax MONSTER_REBUILD
  350. X  image <IMAGE -directory>>monster_rebuild
  351. X-  412,  412
  352. X  MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE don't need to be executable`032
  353. X  by world.
  354. X- 2434, 2435
  355. X  players`009()`032
  356. X  objects`009()`032
  357. X- 2440, 2446
  358. X  and`009`009(<item list 1>,<item list 2>,...,<item list n>)`032
  359. X  or`009`009(<item list 1>,...,<item list n>)`032
  360. X  move`009`009(<room's name>)`032
  361. X  pmove`009`009(<room's name>)`032
  362. X  pprint`009(<message part 1>,...,<message part n>)`032
  363. X  print`009`009(<message part 1>,...,<message part n>)`032
  364. X  oprint`009(<message part 1>,...,<message part n>)`032
  365. X- 2454, 2459
  366. X  attack`009(<attack force: nr>)`032
  367. X  not`009`009(<p1>)
  368. X  random`009(<item list>)`032
  369. X  strip`009`009(<string>)`032
  370. X  experience`009(<player's name>)`032
  371. X  set experience (<player's new experience>)`032
  372. X- 2495, 2500
  373. X  userid`009(<player list>)
  374. X  mheal`009`009(<monster name>,<heal amount: nr>)
  375. X  mattack`009(<monster name>,<attck amont>: nr>)
  376. X  list`009`009(<item list 1>,...,<item list n>)
  377. X  spell level`009()
  378. X  set spell level`009(level number)
  379. X- 2505, 2507
  380. X  SET <variable>`009(<value>)
  381. X  SUBMIT <label>`009(<delta time>,<player's name>)
  382. X  FOR <variable>`009(<list>,<action>)
  383. X- 2707, 2709
  384. X  Funktio: and (p1,p2,...)
  385. X
  386. X  Laskee parametrien p1,p2 jne. arvon.
  387. X- 2717, 2717
  388. X     ...
  389. X     pn    - lista
  390. X     tulos - lista
  391. X  Huomautus:
  392. X     Parameterja pit`228`228 v`228hint`228`228n olla kaksi.
  393. X- 3558, 3563
  394. X  Funktio: or (p1,p2,p3,...)
  395. X
  396. X  Laskee parametrien p1,p2,p3,... arvon.
  397. X
  398. X  Palauttaa listan, jossa on ne alkiot, jotka ovat p1:ss`228,`032
  399. X  p2:ssa tai p3:ssa (jne). Jokainen alkio esiintyy tuloksessa`032
  400. X- 3573, 3574
  401. X     ...
  402. X     p<n>   - lista
  403. X/
  404. $ CALL UNPACK MONSTER_E.DIF;1 1571466610
  405. $ create/nolog 'f'
  406. X-    4,    4
  407. X$ ON WARNING THEN CALL FATAL "ERROR !!"
  408. X$ df = F$ENVIRONMENT("DEFAULT")
  409. X-   10,   18
  410. X$ work_directory == ""
  411. X$ CALL ASK_DIR work_directory "Give work directory for compilation" 'df
  412. X$ option == 0
  413. X$ CALL ASK_OPTION
  414. X$ database_directory == ""
  415. X$ image_directory == ""
  416. X$ IF option .eq. 4`032
  417. X$    THEN
  418. X$    CALL QUERY_DIR image_directory "Give directory for (current) installed
  419. V MON.EXE"
  420. X$    CALL CHECK_FILE 'image_directory'MONSTER.INIT
  421. X$    CALL QUERY_DIR database_directory "Give existed database directory" ""
  422. X$    CALL CHECK_FILE 'database_directory'DB.DIR
  423. X$    CALL CHECK_FILE 'database_directory'C.DIR
  424. X$    ELSE
  425. X$    CALL ASK_DIR image_directory "Give directory for installed MON.EXE"
  426. X$    CALL ASK_DIR database_directory "Give directory for Monster database"
  427. X$ ENDIF
  428. X-   39,   41
  429. X$ IF option .ne. 4 THEN CALL CHECK_FILE 'source_directory'ILMOITUS.TXT
  430. X$ CALL CHECK_FILE 'source_directory'CLD.PROTO
  431. X$ IF option .ne. 4 THEN CALL CHECK_FILE 'source_directory'INIT.PROTO
  432. X-   46
  433. X$ CALL MAKE_REBUILD ! Produce MONSTER_REBUILD.EXE
  434. X-   51
  435. X$ CALL CHECK_FILE MONSTER_REBUILD.EXE
  436. X-   56,   56
  437. X$ COPY/LOG MON.EXE,MONSTER_DUMP.EXE,MONSTER_WHO.EXE,MONSTER_E.HLB,MONSTER_RE
  438. VBUILD.EXE 'image_directory
  439. X-   64,   66
  440. X$ COPY/LOG 'source_directory'MONSTER.HELP 'DBDIR'
  441. X$ IF .not. $SEVERITY THEN CALL FATAL "Copy failed"
  442. X$ IF option .ne. 4`032
  443. X$   THEN
  444. X$   COPY/LOG 'source_directory'ILMOITUS.TXT 'DBDIR'
  445. X$   IF .not. $SEVERITY THEN CALL FATAL "Copy failed"
  446. X$ ENDIF
  447. X$ SET FILE/PROTECTION=(W:R)/LOG 'DBDIR'MONSTER.HELP,ILMOITUS.TXT
  448. X-   77,   77
  449. X$ IF option .ne. 4 THEN CALL MAKE_FILE 'source_directory'INIT.PROTO 'image_d
  450. Virectory'MONSTER.INIT
  451. X-  101,  101
  452. X$ SET NOON
  453. X$ IF F$TYPE(df) .eqs. "STRING" THEN SET DEFAULT 'df'
  454. X$ IF F$TRNLMN("FROM") .nes. "" THEN CLOSE FROM
  455. X$ IF F$TRNLMN("TO") .nes. "" THEN CLOSE TO
  456. X$ SET ON
  457. X-  125,  125
  458. X$   CREATE/DIRECTORY/LOG/PROTECTION=(S:RWE,O:RWE,G:E,W:E) 'full
  459. X-  133,  134
  460. X-  150,  153
  461. X$ if F$PARSE(dir) .eqs. "" THEN CREATE/DIRECTORY/LOG/PROTECTION=(S:RWE,O:RWE
  462. V,G:E,W:E) 'dir
  463. X$ CALL DIRNAME 'dir' dirname
  464. X-  181,  183
  465. X$ name = last - ">" - "`093" - "<" - "`091"      ! if not . in name
  466. X$ tail = last - name`032
  467. X$ IF build .nes. ""`032
  468. X$ THEN
  469. X$    dirname = disk + build + tail + name + ".DIR"
  470. X$ ELSE
  471. X$    dirname = disk + "<000000>" + name + ".DIR"
  472. X$ ENDIF
  473. X-  263
  474. X$ CALL COMPILE VERSION
  475. X-  272,  274
  476. X$ CALL COMPILE ALLOC
  477. X$ CALL COMPILE CUSTOM
  478. X$ CALL COMPILE MON
  479. X$ LINK MON,GLOBAL,GUTS,KEYS,PRIVUSERS,DATABASE,PARSER,INTERPRETER,QUEUE,CLI,
  480. VCUSTOM,ALLOC,VERSION
  481. X-  296
  482. X$ CALL COMPILE VERSION
  483. X-  302,  302
  484. X$ LINK MONSTER_DUMP,GLOBAL,GUTS,PRIVUSERS,DATABASE,PARSER,VERSION
  485. X-  307,  313
  486. X$`032
  487. X$ MAKE_REBUILD: SUBROUTINE
  488. X$ IF F$SEARCH("MONSTER_REBUILD.EXE") .nes. "" THEN EXIT
  489. X$ CALL COMPILE GLOBAL
  490. X$ CALL COMPILE VERSION
  491. X$ CALL COMPILE GUTS`032
  492. X$ CALL COMPILE PRIVUSERS
  493. X$ CALL COMPILE DATABASE
  494. X$ CALL COMPILE PARSER
  495. X$ CALL COMPILE ALLOC
  496. X$ CALL COMPILE KEYS
  497. X$ CALL COMPILE MONSTER_REBUILD
  498. X$ LINK MONSTER_REBUILD,GLOBAL,GUTS,PRIVUSERS,DATABASE,PARSER,VERSION,ALLOC,K
  499. VEYS
  500. X$ IF .not. $SEVERITY THEN CALL FATAL "Linking of MONSTER_REBUILD.EXE failed"
  501. X$ IF F$SEARCH("MONSTER_REBUILD.EXE") .eqs. "" THEN CALL FATAL "Link failed:
  502. V MONSTER_REBUILD.EXE not found"
  503. X-  316
  504. X$ MAKE_HELP: SUBROUTINE
  505. X$ IF F$SEARCH("MONSTER_E.HLB") .nes. "" THEN EXIT
  506. X$ CALL CHECK_FILE 'source_directory'MONSTER_E.HLP
  507. X$ LIBRARY/HELP/LOG/CREATE MONSTER_E.HLB 'source_directory'MONSTER_E.HLP
  508. X$ IF .not. $SEVERITY THEN CALL FATAL "Creating of MONSTER_E.HLB failed"
  509. X$ IF F$SEARCH("MONSTER_E.HLB") .eqs. "" THEN CALL FATAL "Creating failed: MO
  510. VNSTER_E.HLB not found"
  511. X$ EXIT
  512. X$ ENDSUBROUTINE
  513. X$
  514. X-  326,  329
  515. X$ WRITE SYS$OUTPUT "(To define this in future add to your LOGIN.COM command:
  516. V"
  517. X$ WRITE SYS$OUTPUT " $ SET COMMAND ''image_directory'MONSTER.CLD"
  518. X$ WRITE SYS$OUTPUT ")"
  519. X-  346,  348
  520. X$ WRITE SYS$OUTPUT "  4 =  Only install NEW Monster image (database exist)"
  521. X$ INQUIRE i "Select 1, 2, 3 or 4"
  522. X$ option == f$integer(i)
  523. X$ IF option .lt. 1 .or. option .gt. 4 THEN GOTO again7
  524. X/
  525. $ CALL UNPACK MONSTER_INSTALL.DIF;1 240912472
  526. $ create/nolog 'f'
  527. X`091 INHERIT('database', 'guts', 'global' , 'privusers', 'parser', 'alloc')`
  528. V093
  529. XPROGRAM MONSTER_REBULD (INPUT, OUTPUT) ;
  530. X`032
  531. X`123
  532. XPROGRAM DESCRIPTION:`032
  533. X`032
  534. X    Image for MONSTER/REBUILD (and MONSTER/FIX) -command
  535. X`032
  536. XAUTHORS:`032
  537. X`032
  538. X    Kari Hurtta
  539. X    Rick Skrenta (original REBUILD in MON.PAS)
  540. X`032
  541. XCREATION DATE:`00925.6.1992 (moved to MONSTER_REBUILD)
  542. X`032
  543. X`032
  544. X`009    C H A N G E   L O G
  545. X`032
  546. X     Date     `124   Name  `124 Description
  547. X--------------+---------+---------------------------------------------------
  548. V----
  549. X   25.06.1992 `124 Hurtta  `124 /REBUILD
  550. X   26.06.1992 `124         `124 /FIX and /BATCH
  551. X   27.06.1992 `124         `124 Module VERSION
  552. X`125
  553. X
  554. X`123 in module KEYS `125
  555. X`091external`093
  556. Xprocedure encrypt(key: shortstring; n : integer := 0);
  557. Xexternal;
  558. X
  559. X`123 DUMMY for linker `125
  560. X`091global`093
  561. Xfunction player_here(id: integer; var slot: integer): boolean;
  562. Xbegin
  563. X    player_here := false;
  564. Xend;
  565. X
  566. X`123 DUMMY for linker `125
  567. X`091global`093
  568. Xprocedure gethere(n: integer := 0);
  569. Xbegin
  570. Xend;
  571. X
  572. X`123 DUMMY for linker `125
  573. X`091global`093
  574. Xprocedure checkevents(silent: boolean := false);
  575. Xbegin
  576. Xend;
  577. X
  578. X`123 ---------- `125
  579. X
  580. Xconst
  581. X`009cli$_present`009= 261401;
  582. X`009cli$_absent`009= 229872;
  583. X`009cli$_negated`009= 229880;
  584. X`009cli$_defaulted`009= 261409;
  585. X`009ss$_normal`009= 1;
  586. X
  587. Xtype
  588. X`009word_unsigned`009= `091word`093 0..65535;
  589. X`009cond_value`009= `091long`093 unsigned;
  590. X
  591. Xvar
  592. X`009`123 userid have in module ALLOC `125
  593. X`009wizard`009`009: `091external`093 boolean;
  594. X
  595. X
  596. Xfunction cli$get_value (%descr entity_desc: string;
  597. X`009`009`009%descr retdesc: string;
  598. X`009`009`009%ref retlength: word_unsigned): cond_value;
  599. X`009external;
  600. X
  601. Xfunction cli$present (%descr entity_desc: string): cond_value;
  602. X`009external;
  603. X
  604. X
  605. Xvar`032
  606. X    rebuild_system : boolean := false;
  607. X    fix_system  : boolean := false;
  608. X    batch_system : boolean := false;
  609. X    name : string := '';
  610. X
  611. Xprocedure params;
  612. X
  613. Xvar
  614. X`009qualifier,
  615. X`009value,
  616. X`009s`009`009: string;
  617. X`009value_length`009: word_unsigned;
  618. X`009status1,
  619. X`009status2`009`009: cond_value;
  620. X
  621. Xbegin
  622. X`009qualifier := 'REBUILD';
  623. X`009status1 := cli$present (qualifier);
  624. X`009if status1 = cli$_present then begin
  625. X`009`009if wizard then begin
  626. X`009`009`009if REBUILD_OK then begin
  627. X`009`009`009`009writeln('Do you really want to destroy the entire universe?'
  628. V);
  629. X`009`009`009`009readln(s);
  630. X`009`009`009`009if length(s) > 0 then
  631. X`009`009`009`009`009if substr(lowcase(s),1,1) = 'y' then
  632. X`009`009`009`009`009`009rebuild_system := true;
  633. X`009`009`009end else
  634. X`009`009`009`009writeln('/REBUILD is disabled.');
  635. X`009`009end else
  636. X`009`009`009writeln ('Only the Monster Manager may /REBUILD.');
  637. X`009end;
  638. X
  639. X`009qualifier := 'FIX';
  640. X`009status1 := cli$present (qualifier);
  641. X`009if status1 = cli$_present then begin
  642. X`009    if wizard then begin
  643. X`009`009fix_system := true;
  644. X`009    end else
  645. X`009`009writeln ('Only the Monster Manager may /FIX.');
  646. X`009end;
  647. X
  648. X`009qualifier := 'BATCH';
  649. X`009status1 := cli$present (qualifier);
  650. X`009if status1 = cli$_present then begin
  651. X`009    if userid = MM_userid then begin
  652. X`009`009status2 := cli$get_value (qualifier, value, value_length);
  653. X`009`009if status2 = ss$_normal then begin
  654. X`009`009    name := value;
  655. X`009`009    batch_system := true `123 hurtta@finuh `125
  656. X`009`009end else begin
  657. X`009`009    writeln ('Something is wrong with /BATCH.');
  658. X`009`009end;
  659. X`009    end else begin
  660. X`009`009writeln ('Only Monster Manager may /BATCH.');
  661. X`009    end;
  662. X`009end;
  663. X
  664. X`009qualifier := 'DEBUG';
  665. X`009status1 := cli$present (qualifier);
  666. X`009if status1 = cli$_present then begin
  667. X`009    if gen_debug then debug := true
  668. X`009    else if userid = MM_userid then debug := true
  669. X`009    else begin
  670. X`009`009writeln ('You may not use /DEBUG.');
  671. X`009`009debug := false
  672. X`009    end
  673. X`009end else debug := false;
  674. X
  675. X`009qualifier := 'OUTPUT';
  676. X`009status1 := cli$present (qualifier);
  677. X`009if status1 = cli$_present then begin
  678. X`009    status2 := cli$get_value (qualifier, value, value_length);
  679. X`009    if status2 = ss$_normal then begin
  680. X`009`009close(OUTPUT);
  681. X`009`009open(OUTPUT,value,new,default := '.LOG');
  682. X`009`009rewrite(OUTPUT);
  683. X`009    end else begin
  684. X`009`009writeln ('Something is wrong with /OUTPUT.');
  685. X`009    end;
  686. X`009end else if status1 = cli$_negated then begin
  687. X`009`009close(OUTPUT);
  688. X`009`009open(OUTPUT,'NLA0:',new);
  689. X`009`009rewrite(OUTPUT);
  690. X`009end;
  691. X
  692. X`009qualifier := 'VERSION';
  693. X`009status1 := cli$present (qualifier);
  694. X`009if status1 = cli$_present then begin
  695. X`009`009`123 Don't take this out please... `125
  696. X`009  `009writeln('Monster builder, written  by Kari Hurtta  at University o
  697. Vf Helsinki,  1992');
  698. X`009`009writeln('VERSION:     ',VERSION);
  699. X`009`009writeln('DISTRIBUTED: ',DISTRIBUTED);
  700. X`009end;
  701. X
  702. Xend;
  703. X
  704. Xvar
  705. X   `123 userid is in module ALLOC `125
  706. X
  707. X    public_id, disowned_id, system_id: shortstring;
  708. X
  709. X
  710. Xprocedure rebuild; `123 was rebuild_system `125
  711. Xvar
  712. X`009i,j: integer;
  713. X
  714. Xbegin
  715. X`009mylog := 0;
  716. X`009writeln('Creating index file 1-10');
  717. X`009for i := 1 to 10 do begin
  718. X`009`009`009`123 1 is blocklist
  719. X`009`009`009  2 is linelist
  720. X`009`009`009  3 is roomlist
  721. X`009`009`009  4 is playeralloc
  722. X`009`009`009  5 is player awake (playing game)
  723. X`009`009`009  6 are objects
  724. X`009`009`009  7 is intfile`032
  725. X`009`009`009  8 is headerfile
  726. X`009`009`009  9 is ???
  727. X`009`009`009  10 is spells
  728. X`009`009`009`125
  729. X
  730. X`009`009locate(indexfile,i);
  731. X`009`009for j := 1 to maxindex do
  732. X`009`009`009indexfile`094.free`091j`093 := true;
  733. X`009`009indexfile`094.indexnum := i;
  734. X`009`009indexfile`094.top := 0; `123 none of each to start `125
  735. X`009`009indexfile`094.inuse := 0;
  736. X`009`009put(indexfile);
  737. X`009end;
  738. X         `032
  739. X
  740. X`009writeln('Initializing roomfile with 10 rooms');
  741. X`009addrooms(10);
  742. X
  743. X`009writeln('Initializing block file with 10 description blocks');
  744. X`009addblocks(10);
  745. X
  746. X`009writeln('Initializing line file with 10 lines');
  747. X`009addlines(10);
  748. X
  749. X`009writeln('Initializing object file with 10 objects');
  750. X`009addobjects(10);  `032
  751. X
  752. X`009writeln('Initializing header file for monsters with 5 headers');
  753. X`009addheaders(5);
  754. X
  755. X`009writeln('Initializing namfile 1-',T_MAX:1);
  756. X`009for j := 1 to T_MAX do begin
  757. X`009`009locate(namfile,j);
  758. X`009`009namfile`094.validate := j;
  759. X`009`009namfile`094.loctop := 0;
  760. X`009`009for i := 1 to maxroom do begin
  761. X`009`009`009namfile`094.idents`091i`093 := '';
  762. X`009`009end;
  763. X`009`009put(namfile);
  764. X`009end;
  765. X
  766. X`009writeln('Initializing eventfile');
  767. X`009for i := 1 to numevnts + 1 do begin
  768. X`009`009locate(eventfile,i);
  769. X`009`009eventfile`094.validat := i;
  770. X`009`009eventfile`094.point := 1;
  771. X`009`009put(eventfile);
  772. X`009end;
  773. X
  774. X`009writeln('Initializing intfile'); `123 minor changes by leino@finuha, `12
  775. V5
  776. X `009for i := 1 to 10 do begin`009`123 hurtta@finuh `125
  777. X`009`009locate(intfile,i);
  778. X `009`009intfile`094.intnum := i;
  779. X`009`009put(intfile);
  780. X`009end;
  781. X
  782. X`009getindex(I_INT);
  783. X`009for i := 1 to 10 do
  784. X`009`009indx.free`091i`093 := false;
  785. X`009indx.top := 10;
  786. X`009indx.inuse := 10;
  787. X`009putindex;
  788. X
  789. X`009writeln('Initializing global values.'); `123 Record #10 in intfile `125
  790. X`009getglobal;
  791. X`009for I := 1 to GF_MAX do global.int`091i`093 := 0;
  792. X`009putglobal;
  793. X`009set_global_flag(GF_VALID, TRUE); `123 Database is valid now `125
  794. X`009set_global_flag(GF_ACTIVE, TRUE); `123 Database is open `125
  795. X`009set_global_flag(GF_WARTIME, TRUE); `123 Violance is allowed `125
  796. X
  797. X`009`123 Player log records should have all their slots initially,
  798. X`009  they don't have to be allocated because they use namrec
  799. X`009  and intfile for their storage; they don't have their own
  800. X`009  file to allocate
  801. X`009`125
  802. X`009getindex(I_PLAYER);
  803. X`009indx.top := maxplayers;
  804. X`009putindex;
  805. X`009getindex(I_ASLEEP);
  806. X`009indx.top := maxplayers;
  807. X`009putindex;
  808. X
  809. X`009writeln('Creating the Great Hall');
  810. X`009if not nc_createroom('Great Hall') then begin
  811. X`009    writeln('Creating the Great Hall FAILED');
  812. X`009    halt;
  813. X`009end;
  814. X`009getroom(1);
  815. X`009here.owner := public_id;
  816. X`009putroom;
  817. X`009getown;
  818. X`009own.idents`0911`093 := public_id;
  819. X`009putown;
  820. X
  821. X`009writeln('Creating the Void');
  822. X`009if not nc_createroom('Void') then begin`009        `123 loc 2 `125
  823. X`009    writeln('Creating Void FAILED');
  824. X`009    halt;
  825. X`009end;
  826. X`009getroom(2);
  827. X`009here.owner := system_id;
  828. X`009putroom;
  829. X`009getown;
  830. X`009own.idents`0912`093 := system_id;
  831. X`009putown;
  832. X
  833. X`009writeln('Creating the Pit of Fire');
  834. X`009if not nc_createroom('Pit of Fire') then begin`009`009`123 loc 3 `125
  835. X`009    writeln('Creating Pit of Fire FAILED');
  836. X`009    halt;
  837. X`009end;
  838. X`009getroom(3);
  839. X`009here.owner := system_id;
  840. X`009putroom;
  841. X`009getown;
  842. X`009own.idents`0913`093 := system_id;
  843. X`009putown;
  844. X
  845. X`009  `009`009`123 note that these are NOT public locations `125
  846. X
  847. X`009`123 spells have constant amount `125
  848. X`009getindex(I_SPELL);
  849. X`009indx.top := maxspells;
  850. X`009putindex;
  851. X
  852. X
  853. X`009writeln('Use the SYSTEM command to view and add capacity to the database
  854. V');
  855. X`009writeln;
  856. Xend; `123 rebuild `125
  857. X
  858. X
  859. Xprocedure fix_help;     `123 fix -subsystem by hurtta@finuh `125
  860. Xbegin `032
  861. X
  862. X   writeln ('A        Clear/create privileges database.');
  863. X   writeln ('B        Clear/create health database.');
  864. X   writeln ('C        Create event file.');
  865. X   writeln ('D        Reallocate describtins');
  866. X   writeln ('E        (Exit subsystem) Start monster playing.');
  867. X   writeln ('F        Clear/create experience database.');
  868. X   writeln ('G        Calculate objects'' number in existence.');
  869. X   writeln ('GL       Clear/create global database.');
  870. X   writeln ('GS       Mark moster shutdown to global database.');
  871. X   writeln ('GU       Mark monster active to global database.');
  872. X   writeln ('GV       Show global database.');
  873. X   writeln ('G-       Mark monster database as invalid.');
  874. X   writeln ('G+       Mark monster database as valid.');
  875. X   writeln ('H        This list');
  876. X   writeln ('I        Repair index file.');
  877. X   writeln ('J        Repair paths.');
  878. X   writeln ('K        Reallocate MDL codes.');
  879. X   writeln ('L        Repair monsters'' location.');
  880. X   writeln ('M        Clear/create MDL database.');
  881. X   writeln ('N        Clear/create and recount quota database.');
  882. X   writeln ('O        Clear/create object database.');
  883. X   writeln ('OW       Check owners of objects, rooms and monsters.');
  884. X   writeln ('P        Clear/create player database.');
  885. X   writeln ('Q        (Quit) Leave monster.');
  886. X   writeln ('R        Clear/create room database.');
  887. X   writeln ('S        Clear/create password database.');
  888. X   writeln ('SP       Clear/create spell database.');
  889. X   writeln ('V        View database capacity.');
  890. X   writeln ('?        This list');`032
  891. X   writeln;
  892. X   writeln ('Use SYSTEM command to add database capacity.');
  893. Xend; `123 fix_help `125
  894. X         `032
  895. Xfunction fix_sure (s: string; batch: boolean): boolean;
  896. Xvar a: string;
  897. Xbegin
  898. X  if batch then begin
  899. X    writeln(s,'yes');
  900. X    fix_sure := true
  901. X  end else begin
  902. X    write (s); readln (a); writeln; `032
  903. X    a := lowcase(a);
  904. X    fix_sure := (a = 'y') or (a = 'yes');       `032
  905. X  end;
  906. Xend;
  907. X
  908. Xprocedure fix_initialize_event (batch: boolean);
  909. XVar i: integer;
  910. Xbegin
  911. X   writeln('Initializing eventfile');
  912. X   for i := 1 to numevnts + 1 do begin
  913. X      locate(eventfile,i);
  914. X      eventfile`094.validat := i;
  915. X      eventfile`094.point := 1;
  916. X      put(eventfile);
  917. X   end;
  918. X   writeln ('Ready.');
  919. Xend; `123 fix_initialize_event `125
  920. X
  921. X
  922. Xprocedure fix_clear_monster (batch: boolean);`032
  923. Xvar i,j,apu: integer;
  924. Xbegin `032
  925. X   if fix_sure ('Do you want clear monster (NPC) database ?',batch) then beg
  926. Vin
  927. X      writeln ('Clearing monster database...');
  928. X    `032
  929. X      locate(indexfile,I_HEADER);
  930. X      indexfile`094.indexnum := I_HEADER;
  931. X      indexfile`094.top := 0;
  932. X      indexfile`094.inuse := 0; `032
  933. X      for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  934. X      put(indexfile);   `032
  935. X `032
  936. X      writeln ('Deleting code files...');
  937. X      DELETE_FILE (coderoot+'CODE*.MON.*'); `123 deleteing all codefiles `12
  938. V5
  939. X
  940. X      writeln('Initializing header file for monsters with 5 headers');
  941. X      addheaders(5);
  942. X `032
  943. X      getindex (I_ROOM);
  944. X      freeindex;
  945. X                  `032
  946. X      writeln ('Clearing monsters from room database...');
  947. X      for i := 1 to maxroom do
  948. X         if not indx.free`091i`093 then begin
  949. X  `032
  950. X            getroom (i);
  951. X            here.hook := 0;
  952. X`009
  953. X`009    for j := 1 to maxpeople do with here.people`091j`093 do `032
  954. X               if kind = P_MONSTER then begin
  955. X                  kind := 0;
  956. X                  username := '';
  957. X                  name := '';
  958. X                  parm := 0;
  959. X                end;
  960. X            putroom;
  961. X         end;         `032
  962. X        `032
  963. X      getuser;
  964. X      freeuser;
  965. X      getindex(I_player);
  966. X      freeindex;
  967. X   `032
  968. X      Writeln ('Clearing monsters from player list...');
  969. X      for i := 1 to maxplayers do`032
  970. X         if not indx.free`091i`093 then if user.idents`091i`093 = '' then be
  971. Vgin`032
  972. X              apu := i;
  973. X              delete_log(apu)     `123 delete_log also command `125`032
  974. X                                  `123 getindex(I_PLAYER)      `125
  975. X         end else if user.idents`091i`093`0911`093 = ':' then begin
  976. X             apu := i;
  977. X             delete_log (apu);
  978. X         end;
  979. X
  980. X      writeln('Clearing hook from objects...');
  981. X      getindex(I_OBJECT);
  982. X      freeindex;
  983. X      for i := 1 to maxroom do
  984. X         if not indx.free`091i`093 then begin
  985. X            getobj(i);
  986. X            obj.actindx := 0;
  987. X            putobj;
  988. X         end;
  989. X
  990. X      writeln('Clearing spells...');
  991. X      getindex(I_SPELL);
  992. X      getint(N_SPELL);
  993. X      for i := 1 to maxspells do
  994. X          if not indx.free`091i`093 then begin
  995. X`009    anint.int`091i`093 := 0;
  996. X`009    indx.free`091i`093 := true;
  997. X`009    indx.inuse := indx.inuse -1;
  998. X`009  end;
  999. X      putindex;
  1000. X      putint;
  1001. X
  1002. X      writeln('Clearing global codes...');
  1003. X      getglobal;
  1004. X      for i := 1 to GF_Max do if GF_Types `091i`093 = G_Code then
  1005. X`009 global.int`091i`093 := 0;
  1006. X      freeglobal;
  1007. X
  1008. X      writeln ('Ready.');
  1009. X   end;
  1010. Xend;               `032
  1011. X
  1012. Xprocedure int_in_use (n:integer);
  1013. Xvar i: integer;
  1014. X    free: boolean;
  1015. Xbegin
  1016. X   getindex(I_INT);
  1017. X   free := false;
  1018. X   if indx.top < n then begin
  1019. X      for i := indx.top +1 to n do begin
  1020. X         locate(intfile,i);
  1021. X         intfile`094.intnum := i;
  1022. X         put(intfile);
  1023. X         indx.free`091i`093 := true;
  1024. X      end;
  1025. X      indx.top := n;
  1026. X   end;
  1027. X   if indx.free`091n`093 then begin
  1028. X      indx.free`091n`093 := false;
  1029. X      indx.inuse := indx.inuse +1
  1030. X   end;
  1031. X   putindex;
  1032. Xend; `123 int_in_use `125
  1033. X
  1034. Xprocedure fix_clear_spell (batch: boolean);
  1035. Xvar i,j: integer;
  1036. Xbegin
  1037. X    if fix_sure ('Do you want clear spell database ?',batch) then begin
  1038. X`009writeln('Clearing spell levels...');
  1039. X`009for i := 1 to maxplayers do begin
  1040. X`009    locate(spellfile,i);
  1041. X`009    spellfile`094.recnum := i;
  1042. X`009    for j := 1 to maxspells do spellfile`094.level`091j`093 := 0;
  1043. X`009    put(spellfile);
  1044. X`009end;
  1045. X`009
  1046. X`009writeln('Clearing spell using database...');
  1047. X`009locate(indexfile,I_SPELL);
  1048. X`009indexfile`094.indexnum := I_SPELL;
  1049. X`009indexfile`094.top := maxspells;
  1050. X`009indexfile`094.inuse := 0;
  1051. X`009for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1052. X`009put(indexfile);
  1053. X
  1054. X`009writeln ('Clearing spellname database...');
  1055. X`009locate(namfile,T_SPELL_NAME);  `032
  1056. X`009namfile`094.validate := T_SPELL_NAME;
  1057. X`009namfile`094.loctop := 0;
  1058. X`009for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1059. X`009put(namfile);        `032
  1060. X
  1061. X`009writeln ('Clearing spell link database....');
  1062. X`009int_in_use(N_SPELL);
  1063. X`009getint(N_SPELL);
  1064. X`009for i := 1 to maxspells do anint.int`091i`093 := 0;
  1065. X`009putint;
  1066. X
  1067. X`009writeln('Ready. Reallocate code file.');
  1068. X
  1069. X    end;
  1070. Xend;
  1071. X
  1072. Xprocedure fix_clear_player (batch: boolean);  `123 don't handle monsters `12
  1073. V5
  1074. Xvar i,j: integer;
  1075. Xbegin
  1076. X  if fix_sure ('Do you want clear player file ?',batch) then begin
  1077. X     writeln  ('Clearing player database ...');
  1078. X
  1079. X     locate(indexfile,I_PLAYER);
  1080. X     indexfile`094.indexnum := I_PLAYER;
  1081. X     indexfile`094.top := maxplayers;
  1082. X     indexfile`094.inuse := 0;
  1083. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1084. X     put(indexfile);
  1085. X
  1086. X     locate(indexfile,I_ASLEEP);
  1087. X     indexfile`094.indexnum := I_ASLEEP;
  1088. X     indexfile`094.top := maxplayers;
  1089. X     indexfile`094.inuse := 0;
  1090. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1091. X     put(indexfile);
  1092. X
  1093. X     getindex(I_ROOM);
  1094. X     freeindex;
  1095. X
  1096. X     writeln ('Reset player names');
  1097. X     locate(namfile,T_USER);    `123 players' userids `125
  1098. X     namfile`094.validate := T_USER;
  1099. X     namfile`094.loctop := 0;
  1100. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1101. X     put(namfile);         `123 players' personal names `125
  1102. X     locate(namfile,T_PERS);
  1103. X     namfile`094.validate := T_PERS;
  1104. X     namfile`094.loctop := 0;
  1105. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1106. X     put(namfile);
  1107. X
  1108. X     writeln ('Disowning rooms...');
  1109. X     for i := 1 to maxroom do
  1110. X        if not indx.free`091i`093 then begin
  1111. X           getown;
  1112. X`009   if own.idents`091i`093 <> system_id then
  1113. X`009       own.idents`091i`093 := disowned_id;
  1114. X           putown;
  1115. X  `032
  1116. X           getroom (i);
  1117. X`009   if here.owner <> system_id then
  1118. X`009       here.owner := disowned_id;
  1119. X`009   putroom;
  1120. X        end;         `032
  1121. X
  1122. X               `032
  1123. X     getindex(I_OBJECT);
  1124. X     freeindex;
  1125. X    `032
  1126. X                          `032
  1127. X     writeln ('Disowning objects ...');
  1128. X     for i:= 1 to maxroom do if not indx.free`091i`093 then begin
  1129. X
  1130. X        getobjown;
  1131. X`009if objown.idents`091i`093 <> system_id then
  1132. X`009    objown.idents`091i`093 := disowned_id;
  1133. X        putobjown;
  1134. X
  1135. X     end;
  1136. X
  1137. X     writeln ('Ready.');
  1138. X     writeln ('Clear monster database and reallocate usage of line and block
  1139. V descriptions.');
  1140. X    `032
  1141. X  end else writeln ('Cancel.');
  1142. Xend;   `032
  1143. X
  1144. Xprocedure fix_owner (batch: boolean);
  1145. Xvar i,num: integer;
  1146. X    rm,ob,code: indexrec;
  1147. X    s: shortstring;
  1148. Xbegin
  1149. X
  1150. X    getindex(I_ROOM);
  1151. X    freeindex;
  1152. X    rm := indx;
  1153. X
  1154. X     writeln ('Checking rooms ...');
  1155. X     for i := 1 to maxroom do if not rm.free`091i`093 then begin
  1156. X`009getown;  `123 locked `125
  1157. X`009if (own.idents`091i`093 <> system_id) and`032
  1158. X`009      (own.idents`091i`093 <> disowned_id) and
  1159. X`009      (own.idents`091i`093 <> public_id) then
  1160. X`009`009if not exact_user(num,own.idents`091i`093) then begin
  1161. X`009`009    getroom(i); `123 locked `125
  1162. X`009`009    writeln('Invalid owner of ',here.nicename,': ',
  1163. X`009`009`009own.idents`091i`093,', disowning.');
  1164. X`009`009    own.idents`091i`093 := disowned_id;
  1165. X`009`009    here.owner := disowned_id;
  1166. X`009`009    putroom;`009`123 freed `125
  1167. X`009`009end;
  1168. X`009putown; `123 freed `125
  1169. X    end;
  1170. X
  1171. X     getindex(I_OBJECT);
  1172. X     freeindex; ob := indx;
  1173. X     getobjnam; freeobjnam;
  1174. X           `032
  1175. X     writeln ('Checking objects ...');
  1176. X     for i:= 1 to maxroom do if not ob.free`091i`093 then begin
  1177. X        getobjown; `123 locked `125
  1178. X`009if (objown.idents`091i`093 <> system_id) and`032
  1179. X`009    (objown.idents`091i`093 <> disowned_id) and
  1180. X`009    (objown.idents`091i`093 <> public_id) then
  1181. X`009    if not exact_user(num,objown.idents`091i`093) then begin
  1182. X`009`009writeln('Invalid owner of ',objnam.idents`091i`093,': ',
  1183. X`009`009    objown.idents`091i`093,', disowning.');
  1184. X`009`009objown.idents`091i`093 := disowned_id;
  1185. X`009    end;
  1186. X`009putobjown; `123 freed `125
  1187. X    end;
  1188. X
  1189. X
  1190. X    getindex(I_HEADER);
  1191. X    freeindex; code := indx;
  1192. X
  1193. X    writeln ('Checking MDL codes (monsters and hooks) ...');
  1194. X    for i := 1 to code.top do if not code.free`091i`093 then begin
  1195. X`009s := monster_owner(i);
  1196. X`009if (s <> system_id) and  (s <> disowned_id) and (s <> public_id) then
  1197. X`009    if not exact_user(num,s) then begin
  1198. X`009`009writeln('Invalid owner of MDL code #',i:1,': ',
  1199. X`009`009    s,', disowning (author: ',monster_owner(i,1),').');
  1200. X`009`009set_owner(i,0,disowned_id); `123 don't change author of code `125
  1201. X`009    end;
  1202. X    end;
  1203. X
  1204. X    writeln('Ready.');
  1205. Xend; `123 fix_owner `125
  1206. X
  1207. Xprocedure fix_clear_room (batch: boolean);
  1208. Xlabel 0;
  1209. Xvar i: integer;
  1210. Xbegin
  1211. X  mylog := 0;
  1212. X  if fix_sure('Do you want clear room database ? ',batch) then begin
  1213. X
  1214. X     Writeln ('Creating index record for room database.');
  1215. X     locate(indexfile, I_ROOM);
  1216. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1217. X     indexfile`094.indexnum := I_ROOM;
  1218. X     indexfile`094.top := 0; `123 none of each to start `125
  1219. X     indexfile`094.inuse := 0;
  1220. X     put(indexfile);
  1221. X
  1222. X     writeln ('Reseting room names');
  1223. X     locate(namfile,T_NAM);
  1224. X     namfile`094.validate := T_NAM;
  1225. X     namfile`094.loctop := 0;
  1226. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1227. X     put(namfile);
  1228. X
  1229. X     writeln ('Reset room owners');
  1230. X     locate(namfile,T_OWN);
  1231. X     namfile`094.validate := T_OWN;
  1232. X     namfile`094.loctop := 0;
  1233. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1234. X     put(namfile);
  1235. X
  1236. X     writeln('Initializing roomfile with 10 rooms');
  1237. X     addrooms(10);
  1238. X
  1239. X     writeln('Creating the Great Hall');
  1240. X     if not nc_createroom('Great Hall') then begin
  1241. X`009writeln ('Creatin of Great Hall FAILED');
  1242. X`009goto 0;
  1243. X     end;
  1244. X     getroom(1);
  1245. X     here.owner := public_id; `123 public location `125
  1246. X     putroom;
  1247. X     getown;
  1248. X     own.idents`0911`093 := public_id;
  1249. X     putown;
  1250. X
  1251. X     writeln('Creating the Void');
  1252. X     if not nc_createroom('Void') then begin`009`009`009`123 loc 2 `125
  1253. X`009writeln ('Creatin of Void FAILED');
  1254. X`009goto 0;
  1255. X     end;
  1256. X     getroom(2);
  1257. X     here.owner := system_id;
  1258. X     putroom;
  1259. X     getown;
  1260. X     own.idents`0912`093 := system_id;
  1261. X     putown;
  1262. X
  1263. X
  1264. X     writeln('Creating the Pit of Fire');
  1265. X     if not nc_createroom('Pit of Fire') then begin`009`123 loc 3 `125
  1266. X`009writeln ('Creatin of Pit of Fire FAILED');
  1267. X`009goto 0;
  1268. X     end;
  1269. X     getroom(3);
  1270. X     here.owner := system_id;
  1271. X     putroom;
  1272. X     getown;
  1273. X     own.idents`0913`093 := system_id;
  1274. X     putown;
  1275. X
  1276. X`009  `009`009`123 note that these are NOT public locations `125
  1277. X
  1278. X     writeln ('Put all players to Great Hall');
  1279. X     locate(intfile,N_LOCATION);
  1280. X     intfile`094.intnum := N_LOCATION;
  1281. X     for i := 1 to maxplayers do intfile`094.int`091i`093 := 1;
  1282. X     put(intfile);
  1283. X
  1284. X     writeln ('Set existence of object to zero.');
  1285. X     getindex(I_OBJECT);
  1286. X     freeindex;
  1287. X     for i := 1 to indx.top do if not indx.free`091i`093 then begin
  1288. X       getobj(i);
  1289. X       obj.numexist := 0;
  1290. X       putobj;
  1291. X     end;
  1292. X     writeln ('Ready.');
  1293. X     writeln ('Clear monster (NPC) database and reallocate block and line de
  1294. Vscriptions');
  1295. X
  1296. X  end else writeln ('Cancel.');
  1297. X  0:
  1298. Xend;
  1299. X
  1300. Xprocedure fix_clear_global (batch: boolean);
  1301. Xvar i: integer;
  1302. Xbegin
  1303. X   if fix_sure ('Do you want clear global value database ? ',batch) then beg
  1304. Vin
  1305. X`009writeln ('Clearing global value database ...');
  1306. X
  1307. X`009int_in_use(N_GLOBAL);
  1308. X`009locate(intfile,N_GLOBAL);
  1309. X`009intfile`094.intnum := N_GLOBAL;
  1310. X`009for i := 1 to GF_MAX do intfile`094.int`091i`093 := 0;
  1311. X`009put(intfile);
  1312. X
  1313. X`009writeln('Ready.');
  1314. X`009writeln('Reallocate code file (NPC database) and desciptions.');
  1315. X    end;
  1316. Xend; `123 fix_clear_global `125
  1317. X
  1318. X
  1319. Xprocedure fix_clear_object (batch: boolean);
  1320. Xvar i: integer;
  1321. Xbegin
  1322. X   if fix_sure ('Do you want clear object database ? ',batch) then begin
  1323. X      writeln ('Clearing object database ...');
  1324. X
  1325. X      locate(indexfile,I_OBJECT);
  1326. X      indexfile`094.indexnum := I_OBJECT;
  1327. X      indexfile`094.top := 0;
  1328. X      indexfile`094.inuse := 0;
  1329. X      for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1330. X      put(indexfile);
  1331. X
  1332. X     writeln ('Reseting object names');
  1333. X     locate(namfile,T_OBJNAM);
  1334. X     namfile`094.validate := T_OBJNAM;
  1335. X     namfile`094.loctop := 0;
  1336. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1337. X     put(namfile);
  1338. X
  1339. X     writeln ('Reset object owners');
  1340. X     locate(namfile,T_OBJOWN);
  1341. X     namfile`094.validate := T_OBJOWN;
  1342. X     namfile`094.loctop := 0;
  1343. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1344. X     put(namfile);
  1345. X
  1346. X      writeln('Initializing object file with 10 objects');
  1347. X      addobjects(10);  `032
  1348. X
  1349. X      writeln ('Ready.');
  1350. X      writeln ('Reallocate usage of block and line descriptions.');
  1351. X   end;
  1352. Xend;                           `032
  1353. X
  1354. Xprocedure fix_repair_index (batch: boolean);
  1355. Xvar i,j,count,old: integer;
  1356. Xbegin
  1357. X   writeln ('Repairing index file...');
  1358. X   for i := 1 to 10 do begin
  1359. X      getindex(i); `032
  1360. X      count := 0;
  1361. X      for j := 1 to indx.top do`032
  1362. X         if not indx.free`091j`093 then count := count +1;
  1363. X      old := indx.inuse;
  1364. X      indx.inuse := count;
  1365. X      putindex;
  1366. X      if old <> count then writeln('In index record #',i:1,
  1367. X         ' is wrong allocation counter. Repaired.');
  1368. X   end;
  1369. X   writeln('Ready.');
  1370. Xend;                        `032
  1371. X
  1372. X
  1373. Xprocedure fix_codes (batch: boolean);   `032
  1374. Xvar ro,ob,cd,sp: indexrec;
  1375. X    i,j: integer;`032
  1376. X
  1377. X    procedure alloc(n: integer);
  1378. X    begin
  1379. X      if n > 0 then begin
  1380. X        cd.free`091n`093 := false;
  1381. X        cd.inuse := cd.inuse +1
  1382. X      end;
  1383. X    end;
  1384. X
  1385. Xbegin
  1386. X  writeln ('Reallacation MDL codes...');
  1387. X  getindex(I_HEADER);
  1388. X  freeindex;
  1389. X  cd := indx;
  1390. X  cd.inuse := 0;
  1391. X  for i := 1 to maxindex do cd.free`091i`093 := true;
  1392. X
  1393. X  getindex(I_ROOM);
  1394. X  freeindex;
  1395. X  ro := indx;
  1396. X
  1397. X  getindex(I_OBJECT);
  1398. X  freeindex;
  1399. X  ob := indx;
  1400. X
  1401. X  getindex(I_SPELL);
  1402. X  freeindex;
  1403. X  sp := indx;
  1404. X
  1405. X  writeln('Scan object file');
  1406. X  for i := 1 to ob.top do if not ob.free`091i`093 then begin
  1407. X    getobj(i);
  1408. X    freeobj;
  1409. X    with obj do begin
  1410. X      alloc (actindx);
  1411. X    end
  1412. X  end;
  1413. X `032
  1414. X  writeln ('Scan room file');
  1415. X  for i := 1 to ro.top do if not ro.free`091i`093 then begin
  1416. X    getroom(i);
  1417. X    freeroom;
  1418. X    alloc (here.hook);
  1419. X    for j := 1 to maxpeople do with here.people`091j`093 do begin
  1420. X`009if (kind = P_MONSTER) then alloc (parm);
  1421. X    end
  1422. X  end;              `032
  1423. X
  1424. X  writeln('Scan spell database');
  1425. X  getint(N_SPELL);
  1426. X  freeint;
  1427. X  for i := 1 to sp.top do if not sp.free`091i`093 then`032
  1428. X    if anint.int`091i`093 > 0 then alloc(anint.int`091i`093);
  1429. X
  1430. X  locate(indexfile,I_HEADER);
  1431. X  indexfile`094 := cd;
  1432. X  put(indexfile);
  1433. X
  1434. X  writeln('Scan global codes');
  1435. X  getglobal;
  1436. X  freeglobal;
  1437. X  for i := 1 to GF_MAX do if GF_Types`091i`093 = G_Code then
  1438. X    if global.int`091i`093 > 0 then alloc(global.int`091i`093);
  1439. X `032
  1440. X  writeln ('Ready.');
  1441. Xend;
  1442. X
  1443. Xprocedure fix_descriptions (batch: boolean);   `032
  1444. Xvar pe,ro,ob,ln,bl: indexrec;
  1445. X    i,j: integer;`032
  1446. X
  1447. X    procedure alloc(n: integer);
  1448. X    begin
  1449. X      if (abs(n) = DEFAULT_LINE) or (n = 0) then `123 no allocate `125
  1450. X      else if n < 0 then begin
  1451. X        ln.free`091-n`093 := false;
  1452. X        ln.inuse := ln.inuse +1
  1453. X      end else begin
  1454. X        bl.free`091n`093 := false;
  1455. X        bl.inuse := bl.inuse +1
  1456. X      end;
  1457. X    end;
  1458. X
  1459. Xbegin
  1460. +-+-+-+-+-+-+-+-  END  OF PART 6 +-+-+-+-+-+-+-+-
  1461.