home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part19 < 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 19/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.051850.10362@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 05:18:50 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1490
  12.  
  13. Archieve-name: monster_helsinki_104/part19
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 19/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 19 -+-+-+-+-+-+-+-+
  20. Xprocedure fix_p_passwd(n: integer; s: string);
  21. Xlabel exit_label;
  22. Xvar key: shortstring;
  23. X
  24. X    procedure leave;
  25. X    begin
  26. X`009writeln('EXIT - no changes.');
  27. X`009goto exit_label;
  28. X    end;
  29. X
  30. Xbegin
  31. X   if s = '' then grab_line('Player''s password? ',s,eof_handler := leave);
  32. X   if length(s) > shortlen then`032
  33. X      writeln('Limit password to ',shortlen:1,' characters.')
  34. X   else begin
  35. X      key := s;
  36. X      encrypt(key,n);
  37. X      getpasswd;
  38. X      passwd.idents`091n`093 := key;
  39. X      putpasswd;
  40. X      writeln('Database updated.');
  41. X   end;
  42. X   exit_label:
  43. Xend; `123 fix_p_passwd `125
  44. X
  45. Xprocedure fix_p_pers(n: integer; s: string);
  46. Xlabel exit_label;
  47. Xvar dummy: integer;
  48. X    ok: boolean;
  49. X
  50. X    procedure leave;
  51. X    begin
  52. X`009writeln('EXIT - no changes.');
  53. X`009goto exit_label;
  54. X    end;
  55. X
  56. Xbegin
  57. X   if s = '' then grab_line('Player''s personal name? ',s,
  58. X      eof_handler := leave);
  59. X   s := slead(s);
  60. X   if s = '' then
  61. X      writeln('No changes.')
  62. X   else if length(s) > shortlen then`032
  63. X      writeln('Limit password to ',shortlen:1,' characters.')
  64. X   else begin
  65. X      if exact_pers(dummy,s) then`032
  66. X         if dummy = n then ok := true
  67. X         else ok := false
  68. X      else ok := true;
  69. X      if not ok then`032
  70. X         writeln('That persoanal name is already in use.')
  71. X      else begin
  72. X         getpers;
  73. X         pers.idents`091n`093 := s;
  74. X         putpers;
  75. X         writeln('Database updated.');
  76. X      end;
  77. X   end;
  78. X   exit_label:
  79. Xend; `123 fix_p_pers `125
  80. X
  81. Xprocedure fix_p_health(n: integer; s: string);
  82. Xlabel exit_label;
  83. Xvar exp,lev, top: integer;
  84. X
  85. X    procedure leave;
  86. X    begin
  87. X`009writeln('EXIT - no changes.');
  88. X`009goto exit_label;
  89. X    end;
  90. X
  91. Xbegin
  92. X   getint(N_EXPERIENCE);
  93. X   freeint;
  94. X   exp := anint.int`091n`093;
  95. X   lev := level(exp);
  96. X   top := leveltable`091lev`093.health;
  97. X
  98. X   if s = '' then begin
  99. X      writeln('Enter health 0 - ',top:1);
  100. X      grab_line('Player''s health? ',s,eof_handler := leave);
  101. X   end;
  102. X
  103. X   if s = '' then writeln ('No changes.')
  104. X   else if not isnum(s) then
  105. X      writeln('No such health.')
  106. X   else if (number(s) < 0) or (number(s)> top) then
  107. X      writeln('Out of range.')
  108. X   else begin
  109. X      getint(N_HEALTH);
  110. X      anint.int`091n`093 := number(s);
  111. X      putint;
  112. X      writeln('Database updated.');
  113. X   end;
  114. X   exit_label:
  115. Xend; `123 fix_p_health `125
  116. X
  117. X
  118. Xprocedure fix_p_quota(n: integer; s: string);
  119. Xlabel exit_label;
  120. Xvar exp,lev, top: integer;
  121. X
  122. X    procedure leave;
  123. X    begin
  124. X`009writeln('EXIT - no changes.');
  125. X`009goto exit_label;
  126. X    end;
  127. X
  128. Xbegin
  129. X
  130. X   if s = '' then begin
  131. X      writeln('Enter quota 0 - ',maxroom:1);
  132. X      grab_line('Player''s room quota? ',s,eof_handler := leave);
  133. X   end;
  134. X
  135. X   if s = '' then writeln ('No changes.')
  136. X   else if not isnum(s) then
  137. X      writeln('No such quota.')
  138. X   else if (number(s) < 0) or (number(s)> maxroom) then
  139. X      writeln('Out of range.')
  140. X   else begin
  141. X      getint(N_ALLOW);
  142. X      anint.int`091n`093 := number(s);
  143. X      putint;
  144. X      writeln('Database updated.');
  145. X   end;
  146. X   exit_label:
  147. Xend; `123 fix_p_quota `125
  148. X
  149. X
  150. X
  151. Xprocedure fix_p_level(n: integer; s: string);
  152. Xlabel exit_label;
  153. Xvar exp,lev,i: integer;
  154. X    ok : boolean;
  155. X    prevlevel,nextlevel: integer;
  156. X    prevpriv,nextpriv: unsigned;
  157. X
  158. X    procedure leave;
  159. X    begin
  160. X`009writeln('EXIT - no changes.');
  161. X`009goto exit_label;
  162. X    end;
  163. X
  164. Xbegin
  165. X  if s = '' then begin
  166. X     writeln('Enter player''s level ',leveltable`0911`093.name,
  167. X        ' - ',leveltable`091levels`093.name);
  168. X     writeln('or enter player experience 0 - ',maxexperience:1);
  169. X     grab_line('Player''s level or experience? ',s,eof_handler := leave);
  170. X  end;
  171. X
  172. X  if s = '' then writeln('No changes.')
  173. X  else begin
  174. X     ok := true;
  175. X     if lookup_level(lev,s) then exp := leveltable`091lev`093.exp
  176. X     else if not isnum(s) then begin
  177. X        writeln('No such level or experience.');
  178. X        ok := false;
  179. X     end else begin`032
  180. X        exp := number(s);
  181. X        if (exp < 0) or (exp > maxexperience) then begin
  182. X           writeln('Out of range.');
  183. X           ok := false;
  184. X        end;
  185. X     end;
  186. X
  187. X     getint(N_EXPERIENCE);
  188. X     freeint;
  189. X     prevlevel := level(anint.int`091n`093);
  190. X     nextlevel := level(exp);
  191. X     if ok and (leveltable`091prevlevel`093.hidden or leveltable`091nextleve
  192. Vl`093.hidden)`032
  193. X         and (userid <> MM_userid) then begin
  194. X            writeln('Only Monster Manager can make this change.');
  195. X            ok := false;
  196. X     end;
  197. X
  198. X     if ok then begin
  199. X        getint(N_PRIVILEGES);
  200. X        freeint;
  201. X        prevpriv := uint(anint.int`091n`093);
  202. X       `032
  203. X        nextpriv := 0;
  204. X        for i := 1 to nextlevel do nextpriv := uor(nextpriv,
  205. X            leveltable`091i`093.priv);
  206. X
  207. X        getint(N_PRIVILEGES);
  208. X        anint.int`091n`093 := int(nextpriv);
  209. X        putint;
  210. X
  211. X        if (prevpriv <> nextpriv) then begin
  212. X           write('Privileges changed from: '); list_privileges(int(prevpriv)
  213. V);
  214. X           write('to:                      '); list_privileges(int(nextpriv)
  215. V);
  216. X        end;
  217. X
  218. X`009if (prevlevel <> nextlevel) then begin
  219. X`009    getint(N_HEALTH);
  220. X`009    anint.int`091n`093 := leveltable`091nextlevel`093.health * 7 div 10;
  221. X`009    putint;
  222. X`009    writeln('Health database updated.');
  223. X`009end;
  224. X
  225. X        getint(N_EXPERIENCE);
  226. X        anint.int`091n`093 := exp;
  227. X        putint;
  228. X        writeln('Experience database updated.');
  229. X     end;
  230. X  end;
  231. X  exit_label:
  232. Xend; `123 fix_p_level `125
  233. X
  234. Xprocedure fix_p_view(n: integer);
  235. Xvar exp,lev: integer;
  236. Xbegin
  237. X   getpers;
  238. X   freepers;
  239. X   getuser;
  240. X   freeuser;
  241. X   writeln('Player''s personal name : ',pers.idents`091n`093);
  242. X   writeln('         userident     : ',user.idents`091n`093);
  243. X   getint(N_EXPERIENCE);
  244. X   freeint;
  245. X   writeln('         experience    : ',anint.int`091n`093:1);
  246. X   writeln('         level         : ',leveltable`091level(anint.int`091n`09
  247. V3)`093.name);
  248. X   getint(N_HEALTH);
  249. X   freeint;
  250. X   writeln('         health        : ',anint.int`091n`093:1);
  251. X   getint(N_PRIVILEGES);
  252. X   freeint;
  253. X   write  ('         privileges    : '); list_privileges(anint.int`091n`093)
  254. V;
  255. X   writeln('         room quota    : ',get_counter(N_ALLOW,n):1);
  256. X   writeln('         rooms         : ',get_counter(N_NUMROOMS,n):1);
  257. X   writeln('         accepts       : ',get_counter(N_ACCEPT,n):1);
  258. Xend; `123 fix_p_view `125
  259. X
  260. Xprocedure fix_stuff(s: string);
  261. Xlabel exit_label;
  262. Xvar player_id: integer;
  263. X    param,raw: string;
  264. X
  265. X    procedure leave;
  266. X    begin
  267. X`009writeln('EXIT');
  268. X`009goto exit_label;
  269. X    end;
  270. X
  271. Xbegin
  272. X  if s = '' then grab_line('Player''s (user)name? ',s,
  273. X    eof_handler := leave);
  274. X  if (s = '') or (s = '?') then`032
  275. X     writeln('To customize player data in database, type 1 <player''s name>'
  276. V)
  277. X  else if not lookup_user(player_id,s,true) then
  278. X     writeln ('No such player name.')
  279. X  else begin
  280. X     getindex(I_ASLEEP);
  281. X     freeindex;
  282. X     if s`0911`093 = ':' then
  283. X        writeln('That isn''t player.')
  284. X     else if not indx.free`091player_id`093 then
  285. X        writeln('This player playing now.')
  286. X     else repeat
  287. X        grab_line('Custom player> ',s,eof_handler := leave);
  288. X
  289. X        raw := slead(s); if bite(raw) > '' then;
  290. X
  291. X        param := slead(lowcase(s));
  292. X        s := bite(param);
  293. X
  294. X        if s = '' then writeln ('Type ? for help.')
  295. X        else case s`0911`093 of
  296. X          '?','h' : command_help('*fix p help*');
  297. X          'a'     : fix_p_health(player_id,param);
  298. X          'l'     : fix_p_level(player_id,param);
  299. X          'v'     : fix_p_view(player_id);
  300. X          'p'     : fix_p_passwd(player_id,raw);
  301. X`009  'r'`009  : fix_p_quota(player_id,param);
  302. X          'n'     : fix_p_pers(player_id,raw);
  303. X          'e','q' : ;
  304. X          otherwise writeln ('Type ? for help.');
  305. X        end
  306. X     until (s = 'e') or ( s = 'q');
  307. X  end;
  308. X  exit_label:
  309. Xend;`032
  310. X
  311. Xprocedure system_2(s: string); forward;
  312. X
  313. X
  314. Xprocedure throw_player(s: string); forward;
  315. X
  316. Xfunction complete(s: string; n: integer): string;
  317. Xbegin
  318. X   while length(s) < n do s := s + ' ';
  319. X   complete := s
  320. Xend;
  321. X
  322. Xprocedure system_who;
  323. Xlabel 1;
  324. Xvar i,count: integer;
  325. X    more: string;
  326. X
  327. X    procedure leave;
  328. X    begin
  329. X`009writeln('EXIT');
  330. X`009goto 1;
  331. X    end;
  332. X
  333. Xbegin
  334. X    getindex(I_PLAYER);`009`123 Rec of valid player log records  `125
  335. X    freeindex;`009`009`123 False if a valid player log `125
  336. X
  337. X    getpers;`009`009`123 player names `125
  338. X    freepers;
  339. X
  340. X    getuser;`009`009`123 userids `125
  341. X    freeuser;
  342. X
  343. X    getreal_user;`009`123 real userids for virtual userid `125
  344. X    freereal_user;
  345. X
  346. X    getint(N_EXPERIENCE);
  347. X    freeint;
  348. X
  349. X    write(complete('Username',15));
  350. X    write(complete('Real userid',15));
  351. X    write(complete('Personal name',20));
  352. X    writeln ('Level');
  353. X
  354. X            `032
  355. X    count := 1;
  356. X    for i := 1 to indx.top do if not indx.free`091i`093 then begin
  357. X`009if user.idents`091i`093`0911`093 <> ':' then begin
  358. X`009    write(complete(user.idents`091i`093,15));
  359. X`009    if user.idents`091i`093`0911`093 = '"' then`032
  360. X`009`009write(complete(real_user.idents`091i`093,15))
  361. X`009    else
  362. X`009`009write(complete('',15));
  363. X`009    write(complete(pers.idents`091i`093,20));
  364. X`009    writeln(leveltable`091level(anint.int`091i`093)`093.name);
  365. X`009    count := count +1;
  366. X`009    if count > terminal_page_len -2 then begin
  367. X`009`009grab_line('-more-',more,erase := true,
  368. X`009`009    eof_handler := leave);
  369. X`009`009if more > '' then goto 1;
  370. X`009`009count := 0;
  371. X`009    end;
  372. X`009end;
  373. X    end;
  374. X    1:
  375. Xend;
  376. X
  377. Xprocedure do_system(s: string);
  378. Xvar
  379. X`009prompt: string;
  380. X`009done: boolean;
  381. X`009cmd: char;
  382. X`009n: integer;
  383. X`009p: string;
  384. X
  385. X    procedure leave;
  386. X    begin
  387. X`009writeln('EXIT');
  388. X`009s := 'e';
  389. X    end;
  390. X
  391. Xbegin
  392. X`009if (manager_priv) or (wizard `123 and privd `125) then begin `123 minor
  393. V change by leino@finuha `125
  394. X`009`009log_action(c_system,0);
  395. X`009`009prompt := 'System> ';
  396. X`009`009done := false;
  397. X`009`009repeat
  398. X`009`009`009repeat
  399. X`009`009`009`009grab_line(prompt,s,eof_handler := leave);
  400. X`009`009`009`009s := slead(s);
  401. X`009`009`009until length(s) > 0;
  402. X`009`009`009s := lowcase(s);
  403. X`009`009`009cmd := s`0911`093;
  404. X
  405. X`009`009`009n := 0;
  406. X`009`009`009p := '';
  407. X`009`009`009if length(s) > 1 then begin
  408. X`009`009`009`009p := slead( substr(s,2,length(s)-1) );
  409. X`009`009`009`009n := number(p)
  410. X`009`009`009end;
  411. X`009`009`009if debug then begin
  412. X`009`009       `009`009writeln('p = ',p);
  413. X`009`009`009end;
  414. X      `032
  415. X`009`009`009case cmd of
  416. X`009  `009`009`009'?': command_help('*system help*');
  417. X`009  `009`009`009'1': fix_stuff(p);
  418. X  `009`009`009`009'a': authorize(p); `123 leino@finuha `125
  419. X`123remove a user`125`009`009`009'k': kill_user(p);
  420. X`009`009`009`009'c': system_2(p);
  421. X`123disown`125`009`009`009'd': disown_user(p);
  422. X`123dist list of players`125`009`009'p': dist_list;
  423. X`123move where user will wakeup`125`009'm': move_asleep (p);
  424. X`123add rooms`125`009`009`009'r': begin
  425. X`009  `009`009`009`009if n > 0 then begin
  426. X`009`009`009`009`009`009addrooms(n);
  427. X`009`009`009`009`009end else
  428. X`009`009`009`009`009`009writeln('To add rooms, say R <# to add>');
  429. X`009`009`009`009     end;
  430. X`123add ints`125`009   `123`009`009'i': begin
  431. X`009`009`009`009`009if n > 0 then begin
  432. X`009`009`009`009`009`009addints(n);
  433. X`009`009`009`009`009end else
  434. X`009`009`009`009`009`009writeln('To add integers, say I <# to add>');
  435. X`009`009`009`009     end;`009`125
  436. X`123add description blocks`125`009'b': begin
  437. X`009`009`009`009`009if n > 0 then begin
  438. X`009`009`009`009`009`009addblocks(n);
  439. X`009`009`009`009`009end else
  440. X`009`009`009`009`009`009writeln('To add description blocks, say B <# to add>
  441. V');
  442. X`009`009`009`009     end;
  443. X`123add objects`125`009`009`009'o': begin
  444. X`009`009`009`009`009if n > 0 then begin
  445. X`009`009`009`009`009`009addobjects(n);
  446. X`009`009`009`009`009end else
  447. X`009`009`009`009`009`009writeln('To add object records, say O <# to add>');
  448. X`009`009`009`009     end;
  449. X`123add one-liners`125`009`009'l': begin
  450. X`009`009`009`009`009if n > 0 then begin
  451. X`009`009`009`009`009`009addlines(n);
  452. X`009`009`009`009`009end else
  453. X`009`009`009`009`009`009writeln('To add one liner records, say L <# to add>'
  454. V);
  455. X`009  `009`009`009     end;
  456. X`123add header records `125`009`009'h': begin
  457. X`009`009`009`009`009if n > 0 then begin
  458. X`009`009`009`009`009`009addheaders(n)
  459. X`009`009`009`009`009end else`032
  460. X`009`009`009`009`009`009writeln('To add header records, say H <# to add>.');
  461. X                                     end;
  462. X`123view current stats`125`009`009'v': begin
  463. X`009`009`009`009`009system_view;
  464. X`009`009`009`009     end;
  465. X`009`009`009`009't': begin
  466. X`009`009`009`009`009throw_player(p);
  467. X`009`009`009`009     end;
  468. X`009`009`009`009'w': system_who;
  469. X`123quit`125`009`009`009`009'q','e': done := true;
  470. X`009`009`009otherwise writeln('-- bad command, type ? for a list.');
  471. X`009`009`009end;
  472. X`009`009until done;
  473. X`009`009log_event(myslot,E_SYSDONE,0,0);
  474. X`009end else
  475. X`009`009writeln('Only the Monster Manager may enter system maintenance mode.
  476. V');
  477. Xend;
  478. X
  479. X
  480. Xprocedure do_version(s: string);
  481. Xbegin
  482. X`009monster_version;
  483. Xend;
  484. X
  485. X
  486. X
  487. Xprocedure do_score(s: string);
  488. Xlabel 1; `123 for out `125
  489. Xvar n: integer;
  490. X    header_printed: boolean;
  491. X    print_count: integer;
  492. X    short_line: boolean;
  493. X
  494. X    sort_table : array `091 1 .. maxplayers `093 of 0 .. maxplayers;
  495. X    used : 0 .. maxplayers;
  496. X
  497. X    scorerec: intrec;
  498. X
  499. X    procedure sort_score;
  500. X    var i,j,sco,loc: integer;
  501. X`009break: boolean;
  502. X    begin
  503. X`009used := 0;
  504. X`009for i := 1 to indx.top do if not indx.free`091i`093 then`032
  505. X`009    if user.idents`091i`093 > '' then if user.idents`091i`093`0911`093 <
  506. V> ':' then begin
  507. X`009`009sco := scorerec.int`091i`093;
  508. X`009`009loc := 1;
  509. X`009`009break := false;
  510. X`009`009while ( loc < used ) and not break do begin
  511. X`009`009    if scorerec.int`091sort_table`091loc`093`093 >= sco then break :
  512. V= true
  513. X`009`009    else loc := loc +1;
  514. X`009`009end;
  515. X`009`009for j := used downto loc do sort_table`091j+1`093 := sort_table`091j
  516. V`093;
  517. X`009`009used := used +1;
  518. X`009`009sort_table`091loc`093 := i;
  519. X`009    end;
  520. X    end; `123 sort_score `125     `032
  521. X
  522. X    procedure leave;
  523. X    begin
  524. X`009writeln('EXIT');
  525. X`009goto 1;
  526. X    end;
  527. X
  528. X   procedure write_line(i: integer);
  529. X   var s: string;
  530. X       c: char;
  531. X   begin
  532. X      if not header_printed then begin
  533. X         if not short_line then write('  Level                 ');
  534. X`009 writeln('Name                   Score');
  535. X         header_printed := true;        `032
  536. X      end;         `032
  537. X      if scorerec.int`091i`093 > protect_exp then c := '*'
  538. X      else c := ' ';
  539. X      if not short_line then`032
  540. X`009write(c,' ',complete(leveltable`091level(scorerec.int`091i`093)`093.name
  541. V,22));
  542. X      write(complete(pers.idents`091i`093,20));
  543. X      if scorerec.int`091i`093 > maxexperience then writeln('-':8)
  544. X      else writeln(scorerec.int`091i`093:8);
  545. X      print_count := print_count +1;
  546. X      if print_count > terminal_page_len -2 then begin
  547. X`009    grab_line('-more-',s,erase := true,eof_handler := leave);
  548. X`009    if s > '' then goto 1;
  549. X`009    print_count := 0;
  550. X      end;
  551. X   end;
  552. X
  553. X   procedure write_level(l: integer);
  554. X   var i,j : integer;
  555. X   begin
  556. X      for j := used downto 1 do begin
  557. X`009i := sort_table`091j`093;
  558. X        if (level(scorerec.int`091i`093) = l) and (user.idents`091i`093`0911
  559. V`093 <> ':') then
  560. X           write_line(i);
  561. X      end;
  562. X   end;
  563. X
  564. Xbegin
  565. X  short_line := terminal_line_len < 54;
  566. X  print_count := 0;
  567. X  header_printed := false;
  568. X  getint(N_EXPERIENCE); freeint; scorerec := anint;
  569. X  getuser;
  570. X  freeuser;
  571. X  if s = '?' then begin
  572. X    command_help('score');
  573. X  end else if s = '' then begin
  574. X      getpers;
  575. X      freepers;
  576. X      write_line(mylog);
  577. X   end else if (s = '*') or (s = 'all') then begin
  578. X      getpers;
  579. X      freepers;
  580. X      getindex(I_PLAYER);
  581. X      freeindex;
  582. X      sort_score;
  583. X      for n := used downto 1 do write_line(sort_table`091n`093);
  584. X   end else if length(s) > shortlen then`032
  585. X      writeln('Limit name and level to ',shortlen:1,' characters.')
  586. X   else if lookup_pers(n,s) then
  587. X      write_line(n)
  588. X   else if lookup_level(n,s) then begin
  589. X      sort_score;
  590. X      write_level(n);
  591. X      if not header_printed then writeln('No players on this level.')
  592. X   end else writeln('No such player or level.');
  593. X   1:
  594. Xend;
  595. X
  596. X`091global`093
  597. Xprocedure rebuild_system;
  598. Xvar
  599. X`009i,j: integer;
  600. X
  601. Xbegin
  602. X`009mylog := 0;
  603. X`009writeln('Creating index file 1-10');
  604. X`009for i := 1 to 10 do begin
  605. X`009`009`009`123 1 is blocklist
  606. X`009`009`009  2 is linelist
  607. X`009`009`009  3 is roomlist
  608. X`009`009`009  4 is playeralloc
  609. X`009`009`009  5 is player awake (playing game)
  610. X`009`009`009  6 are objects
  611. X`009`009`009  7 is intfile`032
  612. X`009`009`009  8 is headerfile
  613. X`009`009`009  9 is ???
  614. X`009`009`009  10 is spells
  615. X`009`009`009`125
  616. X
  617. X`009`009locate(indexfile,i);
  618. X`009`009for j := 1 to maxindex do
  619. X`009`009`009indexfile`094.free`091j`093 := true;
  620. X`009`009indexfile`094.indexnum := i;
  621. X`009`009indexfile`094.top := 0; `123 none of each to start `125
  622. X`009`009indexfile`094.inuse := 0;
  623. X`009`009put(indexfile);
  624. X`009end;
  625. X         `032
  626. X
  627. X`009writeln('Initializing roomfile with 10 rooms');
  628. X`009addrooms(10);
  629. X
  630. X`009writeln('Initializing block file with 10 description blocks');
  631. X`009addblocks(10);
  632. X
  633. X`009writeln('Initializing line file with 10 lines');
  634. X`009addlines(10);
  635. X
  636. X`009writeln('Initializing object file with 10 objects');
  637. X`009addobjects(10);  `032
  638. X
  639. X`009writeln('Initializing header file for monsters with 5 headers');
  640. X`009addheaders(5);
  641. X
  642. X`009writeln('Initializing namfile 1-',T_MAX:1);
  643. X`009for j := 1 to T_MAX do begin
  644. X`009`009locate(namfile,j);
  645. X`009`009namfile`094.validate := j;
  646. X`009`009namfile`094.loctop := 0;
  647. X`009`009for i := 1 to maxroom do begin
  648. X`009`009`009namfile`094.idents`091i`093 := '';
  649. X`009`009end;
  650. X`009`009put(namfile);
  651. X`009end;
  652. X
  653. X`009writeln('Initializing eventfile');
  654. X`009for i := 1 to numevnts + 1 do begin
  655. X`009`009locate(eventfile,i);
  656. X`009`009eventfile`094.validat := i;
  657. X`009`009eventfile`094.point := 1;
  658. X`009`009put(eventfile);
  659. X`009end;
  660. X
  661. X`009writeln('Initializing intfile'); `123 minor changes by leino@finuha, `12
  662. V5
  663. X `009for i := 1 to 10 do begin`009`123 hurtta@finuh `125
  664. X`009`009locate(intfile,i);
  665. X `009`009intfile`094.intnum := i;
  666. X`009`009put(intfile);
  667. X`009end;
  668. X
  669. X`009getindex(I_INT);
  670. X`009for i := 1 to 10 do
  671. X`009`009indx.free`091i`093 := false;
  672. X`009indx.top := 10;
  673. X`009indx.inuse := 10;
  674. X`009putindex;
  675. X
  676. X`009writeln('Initializing global values.'); `123 Record #10 in intfile `125
  677. X`009getglobal;
  678. X`009for I := 1 to GF_MAX do global.int`091i`093 := 0;
  679. X`009putglobal;
  680. X`009set_global_flag(GF_VALID, TRUE); `123 Database is valid now `125
  681. X`009set_global_flag(GF_ACTIVE, TRUE); `123 Database is open `125
  682. X`009set_global_flag(GF_WARTIME, TRUE); `123 Violance is allowed `125
  683. X
  684. X`009`123 Player log records should have all their slots initially,
  685. X`009  they don't have to be allocated because they use namrec
  686. X`009  and intfile for their storage; they don't have their own
  687. X`009  file to allocate
  688. X`009`125
  689. X`009getindex(I_PLAYER);
  690. X`009indx.top := maxplayers;
  691. X`009putindex;
  692. X`009getindex(I_ASLEEP);
  693. X`009indx.top := maxplayers;
  694. X`009putindex;
  695. X
  696. X`009writeln('Creating the Great Hall');
  697. X`009createroom('Great Hall');
  698. X`009getroom(1);
  699. X`009here.owner := public_id;
  700. X`009putroom;
  701. X`009getown;
  702. X`009own.idents`0911`093 := public_id;
  703. X`009putown;
  704. X
  705. X`009writeln('Creating the Void');
  706. X`009createroom('Void');`009`009`009`123 loc 2 `125
  707. X`009getroom(2);
  708. X`009here.owner := system_id;
  709. X`009putroom;
  710. X`009getown;
  711. X`009own.idents`0912`093 := system_id;
  712. X`009putown;
  713. X
  714. X`009writeln('Creating the Pit of Fire');
  715. X`009createroom('Pit of Fire');`009`009`123 loc 3 `125
  716. X`009getroom(3);
  717. X`009here.owner := system_id;
  718. X`009putroom;
  719. X`009getown;
  720. X`009own.idents`0913`093 := system_id;
  721. X`009putown;
  722. X
  723. X`009  `009`009`123 note that these are NOT public locations `125
  724. X
  725. X`009`123 spells have constant amount `125
  726. X`009getindex(I_SPELL);
  727. X`009indx.top := maxspells;
  728. X`009putindex;
  729. X
  730. X
  731. X`009writeln('Use the SYSTEM command to view and add capacity to the database
  732. V');
  733. X`009writeln;
  734. Xend;                      `032
  735. X
  736. Xprocedure fix_help;     `123 fix -subsystem by hurtta@finuh `125
  737. Xbegin `032
  738. X
  739. X   writeln ('A        Clear/create privileges database.');
  740. X   writeln ('B        Clear/create health database.');
  741. X   writeln ('C        Create event file.');
  742. X   writeln ('D        Reallocate describtins');
  743. X   writeln ('E        (Exit subsystem) Start monster playing.');
  744. X   writeln ('F        Clear/create experience database.');
  745. X   writeln ('G        Calculate objects'' number in existence.');
  746. X   writeln ('GL       Clear/create global database.');
  747. X   writeln ('GS       Mark moster shutdown to global database.');
  748. X   writeln ('GU       Mark monster active to global database.');
  749. X   writeln ('GV       Show global database.');
  750. X   writeln ('G-       Mark monster database as invalid.');
  751. X   writeln ('G+       Mark monster database as valid.');
  752. X   writeln ('H        This list');
  753. X   writeln ('I        Repair index file.');
  754. X   writeln ('J        Repair paths.');
  755. X   writeln ('K        Reallocate MDL codes.');
  756. X   writeln ('L        Repair monsters'' location.');
  757. X   writeln ('M        Clear/create MDL database.');
  758. X   writeln ('N        Clear/create and recount quota database.');
  759. X   writeln ('O        Clear/create object database.');
  760. X   writeln ('OW       Check owners of objects, rooms and monsters.');
  761. X   writeln ('P        Clear/create player database.');
  762. X   writeln ('Q        (Quit) Leave monster.');
  763. X   writeln ('R        Clear/create room database.');
  764. X   writeln ('S        Clear/create password database.');
  765. X   writeln ('SP       Clear/create spell database.');
  766. X   writeln ('V        View database capacity.');
  767. X   writeln ('?        This list');`032
  768. X   writeln;
  769. X   writeln ('Use SYSTEM command to add database capacity.');
  770. Xend; `123 fix_help `125
  771. X         `032
  772. Xfunction fix_sure (s: string; batch: boolean): boolean;
  773. Xvar a: string;
  774. Xbegin
  775. X  if batch then begin
  776. X    writeln(s,'yes');
  777. X    fix_sure := true
  778. X  end else begin
  779. X    write (s); readln (a); writeln; `032
  780. X    a := lowcase(a);
  781. X    fix_sure := (a = 'y') or (a = 'yes');       `032
  782. X  end;
  783. Xend;
  784. X
  785. Xprocedure fix_initialize_event (batch: boolean);
  786. XVar i: integer;
  787. Xbegin
  788. X   writeln('Initializing eventfile');
  789. X   for i := 1 to numevnts + 1 do begin
  790. X      locate(eventfile,i);
  791. X      eventfile`094.validat := i;
  792. X      eventfile`094.point := 1;
  793. X      put(eventfile);
  794. X   end;
  795. X   writeln ('Ready.');
  796. Xend; `123 fix_initialize_event `125
  797. X
  798. X
  799. Xprocedure fix_clear_monster (batch: boolean);`032
  800. Xvar i,j,apu: integer;
  801. Xbegin `032
  802. X   if fix_sure ('Do you want clear monster (NPC) database ?',batch) then beg
  803. Vin
  804. X      writeln ('Clearing monster database...');
  805. X    `032
  806. X      locate(indexfile,I_HEADER);
  807. X      indexfile`094.indexnum := I_HEADER;
  808. X      indexfile`094.top := 0;
  809. X      indexfile`094.inuse := 0; `032
  810. X      for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  811. X      put(indexfile);   `032
  812. X `032
  813. X      writeln ('Deleting code files...');
  814. X      DELETE_FILE (coderoot+'CODE*.MON.*'); `123 deleteing all codefiles `12
  815. V5
  816. X
  817. X      writeln('Initializing header file for monsters with 5 headers');
  818. X      addheaders(5);
  819. X `032
  820. X      getindex (I_ROOM);
  821. X      freeindex;
  822. X                  `032
  823. X      writeln ('Clearing monsters from room database...');
  824. X      for i := 1 to maxroom do
  825. X         if not indx.free`091i`093 then begin
  826. X  `032
  827. X            getroom (i);
  828. X            here.hook := 0;
  829. X`009
  830. X`009    for j := 1 to maxpeople do with here.people`091j`093 do `032
  831. X               if kind = P_MONSTER then begin
  832. X                  kind := 0;
  833. X                  username := '';
  834. X                  name := '';
  835. X                  parm := 0;
  836. X                end;
  837. X            putroom;
  838. X         end;         `032
  839. X        `032
  840. X      getuser;
  841. X      freeuser;
  842. X      getindex(I_player);
  843. X      freeindex;
  844. X   `032
  845. X      Writeln ('Clearing monsters from player list...');
  846. X      for i := 1 to maxplayers do`032
  847. X         if not indx.free`091i`093 then if user.idents`091i`093 = '' then be
  848. Vgin`032
  849. X              apu := i;
  850. X              delete_log(apu)     `123 delete_log also command `125`032
  851. X                                  `123 getindex(I_PLAYER)      `125
  852. X         end else if user.idents`091i`093`0911`093 = ':' then begin
  853. X             apu := i;
  854. X             delete_log (apu);
  855. X         end;
  856. X
  857. X      writeln('Clearing hook from objects...');
  858. X      getindex(I_OBJECT);
  859. X      freeindex;
  860. X      for i := 1 to maxroom do
  861. X         if not indx.free`091i`093 then begin
  862. X            getobj(i);
  863. X            obj.actindx := 0;
  864. X            putobj;
  865. X         end;
  866. X
  867. X      writeln('Clearing spells...');
  868. X      getindex(I_SPELL);
  869. X      getint(N_SPELL);
  870. X      for i := 1 to maxspells do
  871. X          if not indx.free`091i`093 then begin
  872. X`009    anint.int`091i`093 := 0;
  873. X`009    indx.free`091i`093 := true;
  874. X`009    indx.inuse := indx.inuse -1;
  875. X`009  end;
  876. X      putindex;
  877. X      putint;
  878. X
  879. X      writeln('Clearing global codes...');
  880. X      getglobal;
  881. X      for i := 1 to GF_Max do if GF_Types `091i`093 = G_Code then
  882. X`009 global.int`091i`093 := 0;
  883. X      freeglobal;
  884. X
  885. X      writeln ('Ready.');
  886. X   end;
  887. Xend;               `032
  888. X
  889. Xprocedure int_in_use (n:integer);
  890. Xvar i: integer;
  891. X    free: boolean;
  892. Xbegin
  893. X   getindex(I_INT);
  894. X   free := false;
  895. X   if indx.top < n then begin
  896. X      for i := indx.top +1 to n do begin
  897. X         locate(intfile,i);
  898. X         intfile`094.intnum := i;
  899. X         put(intfile);
  900. X         indx.free`091i`093 := true;
  901. X      end;
  902. X      indx.top := n;
  903. X   end;
  904. X   if indx.free`091n`093 then begin
  905. X      indx.free`091n`093 := false;
  906. X      indx.inuse := indx.inuse +1
  907. X   end;
  908. X   putindex;
  909. Xend; `123 int_in_use `125
  910. X
  911. Xprocedure fix_clear_spell (batch: boolean);
  912. Xvar i,j: integer;
  913. Xbegin
  914. X    if fix_sure ('Do you want clear spell database ?',batch) then begin
  915. X`009writeln('Clearing spell levels...');
  916. X`009for i := 1 to maxplayers do begin
  917. X`009    locate(spellfile,i);
  918. X`009    spellfile`094.recnum := i;
  919. X`009    for j := 1 to maxspells do spellfile`094.level`091j`093 := 0;
  920. X`009    put(spellfile);
  921. X`009end;
  922. X`009
  923. X`009writeln('Clearing spell using database...');
  924. X`009locate(indexfile,I_SPELL);
  925. X`009indexfile`094.indexnum := I_SPELL;
  926. X`009indexfile`094.top := maxspells;
  927. X`009indexfile`094.inuse := 0;
  928. X`009for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  929. X`009put(indexfile);
  930. X
  931. X`009writeln ('Clearing spellname database...');
  932. X`009locate(namfile,T_SPELL_NAME);  `032
  933. X`009namfile`094.validate := T_SPELL_NAME;
  934. X`009namfile`094.loctop := 0;
  935. X`009for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  936. X`009put(namfile);        `032
  937. X
  938. X`009writeln ('Clearing spell link database....');
  939. X`009int_in_use(N_SPELL);
  940. X`009getint(N_SPELL);
  941. X`009for i := 1 to maxspells do anint.int`091i`093 := 0;
  942. X`009putint;
  943. X
  944. X`009writeln('Ready. Reallocate code file.');
  945. X
  946. X    end;
  947. Xend;
  948. X
  949. Xprocedure fix_clear_player (batch: boolean);  `123 don't handle monsters `12
  950. V5
  951. Xvar i,j: integer;
  952. Xbegin
  953. X  if fix_sure ('Do you want clear player file ?',batch) then begin
  954. X     writeln  ('Clearing player database ...');
  955. X
  956. X     locate(indexfile,I_PLAYER);
  957. X     indexfile`094.indexnum := I_PLAYER;
  958. X     indexfile`094.top := maxplayers;
  959. X     indexfile`094.inuse := 0;
  960. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  961. X     put(indexfile);
  962. X
  963. X     locate(indexfile,I_ASLEEP);
  964. X     indexfile`094.indexnum := I_ASLEEP;
  965. X     indexfile`094.top := maxplayers;
  966. X     indexfile`094.inuse := 0;
  967. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  968. X     put(indexfile);
  969. X
  970. X     getindex(I_ROOM);
  971. X     freeindex;
  972. X
  973. X     writeln ('Reset player names');
  974. X     locate(namfile,T_USER);    `123 players' userids `125
  975. X     namfile`094.validate := T_USER;
  976. X     namfile`094.loctop := 0;
  977. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  978. X     put(namfile);         `123 players' personal names `125
  979. X     locate(namfile,T_PERS);
  980. X     namfile`094.validate := T_PERS;
  981. X     namfile`094.loctop := 0;
  982. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  983. X     put(namfile);
  984. X
  985. X     writeln ('Disowning rooms...');
  986. X     for i := 1 to maxroom do
  987. X        if not indx.free`091i`093 then begin
  988. X           getown;
  989. X`009   if own.idents`091i`093 <> system_id then
  990. X`009       own.idents`091i`093 := disowned_id;
  991. X           putown;
  992. X  `032
  993. X           getroom (i);
  994. X`009   if here.owner <> system_id then
  995. X`009       here.owner := disowned_id;
  996. X`009   putroom;
  997. X        end;         `032
  998. X
  999. X               `032
  1000. X     getindex(I_OBJECT);
  1001. X     freeindex;
  1002. X    `032
  1003. X                          `032
  1004. X     writeln ('Disowning objects ...');
  1005. X     for i:= 1 to maxroom do if not indx.free`091i`093 then begin
  1006. X
  1007. X        getobjown;
  1008. X`009if objown.idents`091i`093 <> system_id then
  1009. X`009    objown.idents`091i`093 := disowned_id;
  1010. X        putobjown;
  1011. X
  1012. X     end;
  1013. X
  1014. X     writeln ('Ready.');
  1015. X     writeln ('Clear monster database and reallocate usage of line and block
  1016. V descriptions.');
  1017. X    `032
  1018. X  end else writeln ('Cancel.');
  1019. Xend;   `032
  1020. X
  1021. Xprocedure fix_owner (batch: boolean);
  1022. Xvar i,num: integer;
  1023. X    rm,ob,code: indexrec;
  1024. X    s: shortstring;
  1025. Xbegin
  1026. X
  1027. X    getindex(I_ROOM);
  1028. X    freeindex;
  1029. X    rm := indx;
  1030. X
  1031. X     writeln ('Checking rooms ...');
  1032. X     for i := 1 to maxroom do if not rm.free`091i`093 then begin
  1033. X`009getown;  `123 locked `125
  1034. X`009if (own.idents`091i`093 <> system_id) and`032
  1035. X`009      (own.idents`091i`093 <> disowned_id) and
  1036. X`009      (own.idents`091i`093 <> public_id) then
  1037. X`009`009if not exact_user(num,own.idents`091i`093) then begin
  1038. X`009`009    getroom(i); `123 locked `125
  1039. X`009`009    writeln('Invalid owner of ',here.nicename,': ',
  1040. X`009`009`009own.idents`091i`093,', disowning.');
  1041. X`009`009    own.idents`091i`093 := disowned_id;
  1042. X`009`009    here.owner := disowned_id;
  1043. X`009`009    putroom;`009`123 freed `125
  1044. X`009`009end;
  1045. X`009putown; `123 freed `125
  1046. X    end;
  1047. X
  1048. X     getindex(I_OBJECT);
  1049. X     freeindex; ob := indx;
  1050. X     getobjnam; freeobjnam;
  1051. X           `032
  1052. X     writeln ('Checking objects ...');
  1053. X     for i:= 1 to maxroom do if not ob.free`091i`093 then begin
  1054. X        getobjown; `123 locked `125
  1055. X`009if (objown.idents`091i`093 <> system_id) and`032
  1056. X`009    (objown.idents`091i`093 <> disowned_id) and
  1057. X`009    (objown.idents`091i`093 <> public_id) then
  1058. X`009    if not exact_user(num,objown.idents`091i`093) then begin
  1059. X`009`009writeln('Invalid owner of ',objnam.idents`091i`093,': ',
  1060. X`009`009    objown.idents`091i`093,', disowning.');
  1061. X`009`009objown.idents`091i`093 := disowned_id;
  1062. X`009    end;
  1063. X`009putobjown; `123 freed `125
  1064. X    end;
  1065. X
  1066. X
  1067. X    getindex(I_HEADER);
  1068. X    freeindex; code := indx;
  1069. X
  1070. X    writeln ('Checking MDL codes (monsters and hooks) ...');
  1071. X    for i := 1 to code.top do if not code.free`091i`093 then begin
  1072. X`009s := monster_owner(i);
  1073. X`009if (s <> system_id) and  (s <> disowned_id) and (s <> public_id) then
  1074. X`009    if not exact_user(num,s) then begin
  1075. X`009`009writeln('Invalid owner of MDL code #',i:1,': ',
  1076. X`009`009    s,', disowning (author: ',monster_owner(i,1),').');
  1077. X`009`009set_owner(i,0,disowned_id); `123 don't change author of code `125
  1078. X`009    end;
  1079. X    end;
  1080. X
  1081. X    writeln('Ready.');
  1082. Xend; `123 fix_owner `125
  1083. X
  1084. Xprocedure fix_clear_room (batch: boolean);
  1085. Xvar i: integer;
  1086. Xbegin
  1087. X  mylog := 0;
  1088. X  if fix_sure('Do you want clear room database ? ',batch) then begin
  1089. X
  1090. X     Writeln ('Creating index record for room database.');
  1091. X     locate(indexfile, I_ROOM);
  1092. X     for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1093. X     indexfile`094.indexnum := I_ROOM;
  1094. X     indexfile`094.top := 0; `123 none of each to start `125
  1095. X     indexfile`094.inuse := 0;
  1096. X     put(indexfile);
  1097. X
  1098. X     writeln ('Reseting room names');
  1099. X     locate(namfile,T_NAM);
  1100. X     namfile`094.validate := T_NAM;
  1101. X     namfile`094.loctop := 0;
  1102. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1103. X     put(namfile);
  1104. X
  1105. X     writeln ('Reset room owners');
  1106. X     locate(namfile,T_OWN);
  1107. X     namfile`094.validate := T_OWN;
  1108. X     namfile`094.loctop := 0;
  1109. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1110. X     put(namfile);
  1111. X
  1112. X     writeln('Initializing roomfile with 10 rooms');
  1113. X     addrooms(10);
  1114. X
  1115. X     writeln('Creating the Great Hall');
  1116. X     createroom('Great Hall');
  1117. X     getroom(1);
  1118. X     here.owner := public_id; `123 public location `125
  1119. X     putroom;
  1120. X     getown;
  1121. X     own.idents`0911`093 := public_id;
  1122. X     putown;
  1123. X
  1124. X     writeln('Creating the Void');
  1125. X     createroom('Void');`009`009`009`123 loc 2 `125
  1126. X     getroom(2);
  1127. X     here.owner := system_id;
  1128. X     putroom;
  1129. X     getown;
  1130. X     own.idents`0912`093 := system_id;
  1131. X     putown;
  1132. X
  1133. X
  1134. X     writeln('Creating the Pit of Fire');
  1135. X     createroom('Pit of Fire');`009`009`123 loc 3 `125
  1136. X     getroom(3);
  1137. X     here.owner := system_id;
  1138. X     putroom;
  1139. X     getown;
  1140. X     own.idents`0913`093 := system_id;
  1141. X     putown;
  1142. X
  1143. X`009  `009`009`123 note that these are NOT public locations `125
  1144. X
  1145. X     writeln ('Put all players to Great Hall');
  1146. X     locate(intfile,N_LOCATION);
  1147. X     intfile`094.intnum := N_LOCATION;
  1148. X     for i := 1 to maxplayers do intfile`094.int`091i`093 := 1;
  1149. X     put(intfile);
  1150. X
  1151. X     writeln ('Set existence of object to zero.');
  1152. X     getindex(I_OBJECT);
  1153. X     freeindex;
  1154. X     for i := 1 to indx.top do if not indx.free`091i`093 then begin
  1155. X       getobj(i);
  1156. X       obj.numexist := 0;
  1157. X       putobj;
  1158. X     end;
  1159. X     writeln ('Ready.');
  1160. X     writeln ('Clear monster (NPC) database and reallocate block and line de
  1161. Vscriptions');
  1162. X
  1163. X  end else writeln ('Cancel.');
  1164. Xend;
  1165. X
  1166. Xprocedure fix_clear_global (batch: boolean);
  1167. Xvar i: integer;
  1168. Xbegin
  1169. X   if fix_sure ('Do you want clear global value database ? ',batch) then beg
  1170. Vin
  1171. X`009writeln ('Clearing global value database ...');
  1172. X
  1173. X`009int_in_use(N_GLOBAL);
  1174. X`009locate(intfile,N_GLOBAL);
  1175. X`009intfile`094.intnum := N_GLOBAL;
  1176. X`009for i := 1 to GF_MAX do intfile`094.int`091i`093 := 0;
  1177. X`009put(intfile);
  1178. X
  1179. X`009writeln('Ready.');
  1180. X`009writeln('Reallocate code file (NPC database) and desciptions.');
  1181. X    end;
  1182. Xend; `123 fix_clear_global `125
  1183. X
  1184. X
  1185. Xprocedure fix_clear_object (batch: boolean);
  1186. Xvar i: integer;
  1187. Xbegin
  1188. X   if fix_sure ('Do you want clear object database ? ',batch) then begin
  1189. X      writeln ('Clearing object database ...');
  1190. X
  1191. X      locate(indexfile,I_OBJECT);
  1192. X      indexfile`094.indexnum := I_OBJECT;
  1193. X      indexfile`094.top := 0;
  1194. X      indexfile`094.inuse := 0;
  1195. X      for i := 1 to maxindex do indexfile`094.free`091i`093 := true;
  1196. X      put(indexfile);
  1197. X
  1198. X     writeln ('Reseting object names');
  1199. X     locate(namfile,T_OBJNAM);
  1200. X     namfile`094.validate := T_OBJNAM;
  1201. X     namfile`094.loctop := 0;
  1202. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1203. X     put(namfile);
  1204. X
  1205. X     writeln ('Reset object owners');
  1206. X     locate(namfile,T_OBJOWN);
  1207. X     namfile`094.validate := T_OBJOWN;
  1208. X     namfile`094.loctop := 0;
  1209. X     for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1210. X     put(namfile);
  1211. X
  1212. X      writeln('Initializing object file with 10 objects');
  1213. X      addobjects(10);  `032
  1214. X
  1215. X      writeln ('Ready.');
  1216. X      writeln ('Reallocate usage of block and line descriptions.');
  1217. X   end;
  1218. Xend;                           `032
  1219. X
  1220. Xprocedure fix_repair_index (batch: boolean);
  1221. Xvar i,j,count,old: integer;
  1222. Xbegin
  1223. X   writeln ('Repairing index file...');
  1224. X   for i := 1 to 10 do begin
  1225. X      getindex(i); `032
  1226. X      count := 0;
  1227. X      for j := 1 to indx.top do`032
  1228. X         if not indx.free`091j`093 then count := count +1;
  1229. X      old := indx.inuse;
  1230. X      indx.inuse := count;
  1231. X      putindex;
  1232. X      if old <> count then writeln('In index record #',i:1,
  1233. X         ' is wrong allocation counter. Repaired.');
  1234. X   end;
  1235. X   writeln('Ready.');
  1236. Xend;                        `032
  1237. X
  1238. X
  1239. Xprocedure fix_codes (batch: boolean);   `032
  1240. Xvar ro,ob,cd,sp: indexrec;
  1241. X    i,j: integer;`032
  1242. X
  1243. X    procedure alloc(n: integer);
  1244. X    begin
  1245. X      if n > 0 then begin
  1246. X        cd.free`091n`093 := false;
  1247. X        cd.inuse := cd.inuse +1
  1248. X      end;
  1249. X    end;
  1250. X
  1251. Xbegin
  1252. X  writeln ('Reallacation MDL codes...');
  1253. X  getindex(I_HEADER);
  1254. X  freeindex;
  1255. X  cd := indx;
  1256. X  cd.inuse := 0;
  1257. X  for i := 1 to maxindex do cd.free`091i`093 := true;
  1258. X
  1259. X  getindex(I_ROOM);
  1260. X  freeindex;
  1261. X  ro := indx;
  1262. X
  1263. X  getindex(I_OBJECT);
  1264. X  freeindex;
  1265. X  ob := indx;
  1266. X
  1267. X  getindex(I_SPELL);
  1268. X  freeindex;
  1269. X  sp := indx;
  1270. X
  1271. X  writeln('Scan object file');
  1272. X  for i := 1 to ob.top do if not ob.free`091i`093 then begin
  1273. X    getobj(i);
  1274. X    freeobj;
  1275. X    with obj do begin
  1276. X      alloc (actindx);
  1277. X    end
  1278. X  end;
  1279. X `032
  1280. X  writeln ('Scan room file');
  1281. X  for i := 1 to ro.top do if not ro.free`091i`093 then begin
  1282. X    getroom(i);
  1283. X    freeroom;
  1284. X    alloc (here.hook);
  1285. X    for j := 1 to maxpeople do with here.people`091j`093 do begin
  1286. X`009if (kind = P_MONSTER) then alloc (parm);
  1287. X    end
  1288. X  end;              `032
  1289. X
  1290. X  writeln('Scan spell database');
  1291. X  getint(N_SPELL);
  1292. X  freeint;
  1293. X  for i := 1 to sp.top do if not sp.free`091i`093 then`032
  1294. X    if anint.int`091i`093 > 0 then alloc(anint.int`091i`093);
  1295. X
  1296. X  locate(indexfile,I_HEADER);
  1297. X  indexfile`094 := cd;
  1298. X  put(indexfile);
  1299. X
  1300. X  writeln('Scan global codes');
  1301. X  getglobal;
  1302. X  freeglobal;
  1303. X  for i := 1 to GF_MAX do if GF_Types`091i`093 = G_Code then
  1304. X    if global.int`091i`093 > 0 then alloc(global.int`091i`093);
  1305. X `032
  1306. X  writeln ('Ready.');
  1307. Xend;
  1308. X
  1309. Xprocedure fix_descriptions (batch: boolean);   `032
  1310. Xvar pe,ro,ob,ln,bl: indexrec;
  1311. X    i,j: integer;`032
  1312. X
  1313. X    procedure alloc(n: integer);
  1314. X    begin
  1315. X      if (abs(n) = DEFAULT_LINE) or (n = 0) then `123 no allocate `125
  1316. X      else if n < 0 then begin
  1317. X        ln.free`091-n`093 := false;
  1318. X        ln.inuse := ln.inuse +1
  1319. X      end else begin
  1320. X        bl.free`091n`093 := false;
  1321. X        bl.inuse := bl.inuse +1
  1322. X      end;
  1323. X    end;
  1324. X
  1325. Xbegin
  1326. X  writeln ('Reallocation descriptions...');
  1327. X  getindex(I_LINE);
  1328. X  freeindex;
  1329. X  ln := indx;
  1330. X
  1331. X  ln.inuse := 0;
  1332. X  for i := 1 to maxindex do ln.free`091i`093 := true;
  1333. X
  1334. X  getindex(I_BLOCK);
  1335. X  freeindex;
  1336. X  bl := indx;
  1337. X
  1338. X  bl.inuse := 0;
  1339. X  for i := 1 to maxindex do bl.free`091i`093 := true;
  1340. X       `032
  1341. X
  1342. X  getindex (I_PLAYER);
  1343. X  freeindex;
  1344. X  pe := indx;
  1345. X
  1346. X  getindex(I_ROOM);
  1347. X  freeindex;
  1348. X  ro := indx;
  1349. X
  1350. X  getindex(I_OBJECT);
  1351. X  freeindex;
  1352. X  ob := indx;
  1353. X
  1354. X  writeln ('Scan self descriptions');
  1355. X  getint(N_SELF);
  1356. X  freeint;
  1357. X  for i := 1 to pe.top do if not pe.free`091i`093 then alloc (anint.int`091i
  1358. V`093);
  1359. X
  1360. X  writeln('Scan object file');
  1361. X  for i := 1 to ob.top do if not ob.free`091i`093 then begin
  1362. X    getobj(i);
  1363. X    freeobj;
  1364. X    with obj do begin
  1365. X      alloc (-linedesc);
  1366. X      alloc (homedesc);
  1367. X      alloc (examine);
  1368. X      alloc (getfail);
  1369. X      alloc (getsuccess);`032
  1370. X      alloc (usefail);
  1371. X      alloc (usesuccess);
  1372. X      alloc (d1);
  1373. X      alloc (d2);
  1374. X    end
  1375. X  end;
  1376. X `032
  1377. X  writeln ('Scan room file');
  1378. X  for i := 1 to ro.top do if not ro.free`091i`093 then begin
  1379. X    getroom(i);
  1380. X    freeroom;
  1381. X    with here do begin
  1382. X      for j := 1 to maxexit do with exits`091j`093 do begin
  1383. X        alloc(-exitdesc);
  1384. X        `123 alloc(-closed); This isn't use yet `125
  1385. X        alloc(fail);
  1386. X        alloc(success);`032
  1387. X        alloc(goin);
  1388. X        alloc(comeout);    `032
  1389. X        alloc(hidden);      `123 is this in use ? `125
  1390. X      end;                                   `032
  1391. X      for j := 1 to maxdetail do alloc(here.detaildesc`091j`093);
  1392. X      alloc(primary);
  1393. X      alloc(secondary);
  1394. X      alloc(-objdesc); `032
  1395. X      alloc(-objdest);
  1396. X      alloc(-rndmsg);                      `032
  1397. X      alloc(xmsg2);
  1398. X      alloc(exitfail);
  1399. X      alloc(ofail);
  1400. X    end
  1401. X  end;              `032
  1402. X
  1403. X  writeln('Scan global codes');
  1404. X  getglobal;
  1405. X  freeglobal;
  1406. X  for i := 1 to GF_MAX do if GF_Types`091i`093 = G_Text then alloc(global.in
  1407. Vt`091i`093);
  1408. X`032
  1409. X  locate(indexfile,I_LINE);
  1410. X  indexfile`094 := ln;
  1411. X  put(indexfile);
  1412. X
  1413. X  locate(indexfile,I_BLOCK);
  1414. X  indexfile`094 := bl;
  1415. X  put(indexfile);
  1416. X `032
  1417. X  writeln ('Ready.');
  1418. Xend;
  1419. X
  1420. Xprocedure fix_clear_privileges (batch: boolean);
  1421. Xvar i,mm: integer;
  1422. Xbegin
  1423. X  if fix_sure('Do you want clear privileges database ? ',batch) then begin
  1424. X     if not exact_user(mm,MM_userid) then mm := 0;
  1425. X     int_in_use(N_PRIVILEGES);
  1426. X     getint(N_PRIVILEGES);
  1427. X     for i := 1 to maxplayers do anint.int`091i`093 := 0;
  1428. X     if mm > 0 then anint.int`091mm`093 := all_privileges;`032
  1429. X`009`123 more privilege for Monster Manager `125
  1430. X     putint;
  1431. X     writeln ('Ready.');
  1432. X  end;
  1433. Xend; `123 fix_clear_privileges `125
  1434. X
  1435. Xprocedure fix_clear_experience (batch: boolean);
  1436. Xvar i,mm: integer;
  1437. Xbegin
  1438. X  if fix_sure('Do you want clear experience database ? ',batch) then begin
  1439. X     if not exact_user(mm,MM_userid) then mm := 0;
  1440. X     int_in_use(N_EXPERIENCE);
  1441. X     getint(N_EXPERIENCE);
  1442. X     for i := 1 to maxplayers do anint.int`091i`093 := 0;
  1443. X     if mm > 0 then anint.int`091mm`093 := MaxInt;`032
  1444. X        `123 Monster Manager is Archwizard `125
  1445. X     putint;
  1446. X     writeln ('Ready.');
  1447. X  end;
  1448. Xend; `123 fix_clear_privileges `125
  1449. X
  1450. Xprocedure fix_clear_health (batch: boolean);
  1451. Xvar i: integer;
  1452. X    exp: intrec;
  1453. Xbegin
  1454. X  if fix_sure('Do you want clear health database ? ',batch) then begin
  1455. X     getint(N_EXPERIENCE);
  1456. X     freeint;
  1457. X     exp := anint;
  1458. X     int_in_use(N_HEALTH);
  1459. X     getint(N_HEALTH);
  1460. X     for i := 1 to maxplayers do anint.int`091i`093 :=`032
  1461. X         leveltable`091level(exp.int`091i`093)`093.health * goodhealth div 1
  1462. V0;
  1463. X     putint;
  1464. X     writeln ('Ready.');
  1465. X  end;
  1466. Xend; `123 fix_clear_health `125
  1467. X
  1468. X
  1469. Xprocedure fix_clear_password (batch: boolean);
  1470. Xvar password: shortstring;
  1471. X    i: integer;
  1472. Xbegin
  1473. X     if fix_sure('Want you really clear password database ? ',batch) then be
  1474. Vgin
  1475. X
  1476. X        writeln('Intializing password record...');
  1477. X        locate(namfile,T_PASSWD);
  1478. X        namfile`094.validate := T_PASSWD;
  1479. X        namfile`094.loctop := 0;
  1480. X        for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1481. X`009put(namfile);
  1482. X
  1483. X        writeln('Initializing real name record ...');
  1484. X        locate(namfile,T_REAL_USER);
  1485. X        namfile`094.validate := T_REAL_USER;
  1486. X        namfile`094.loctop := 0;
  1487. X        for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  1488. X`009put(namfile);
  1489. X
  1490. X`009getuser;
  1491. X`009freeuser;
  1492. X
  1493. X`009writeln ('Making pseudo passowords... (same as virtual userid)');
  1494. X        for i := 1 to maxplayers do begin
  1495. X            password := user.idents`091i`093;
  1496. X            if password > '' then if password`0911`093 = '"' then begin
  1497. X               encrypt(password,i);
  1498. X               getpasswd;
  1499. X               passwd.idents`091i`093 := password;
  1500. X               putpasswd;
  1501. X               getreal_user;
  1502. +-+-+-+-+-+-+-+-  END  OF PART 19 +-+-+-+-+-+-+-+-
  1503.