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

  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 7/7
  5. Message-ID: <1992Jun30.225324.14026@klaava.Helsinki.FI>
  6. Date: 30 Jun 92 22:53:24 GMT
  7. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  8. Followup-To: vmsnet.sources.d
  9. Organization: University of Helsinki
  10. Lines: 827
  11.  
  12. Archive-name: monster_helsinki_104_to_105/delta7
  13. Environment: VMS, Pascal
  14. Author: Kari.Hurtta@Helsinki.FI
  15.  
  16. -+-+-+-+-+-+-+-+ START OF PART 7 -+-+-+-+-+-+-+-+
  17. X  writeln ('Reallocation descriptions...');
  18. X  getindex(I_LINE);
  19. X  freeindex;
  20. X  ln := indx;
  21. X
  22. X  ln.inuse := 0;
  23. X  for i := 1 to maxindex do ln.free`091i`093 := true;
  24. X
  25. X  getindex(I_BLOCK);
  26. X  freeindex;
  27. X  bl := indx;
  28. X
  29. X  bl.inuse := 0;
  30. X  for i := 1 to maxindex do bl.free`091i`093 := true;
  31. X       `032
  32. X
  33. X  getindex (I_PLAYER);
  34. X  freeindex;
  35. X  pe := indx;
  36. X
  37. X  getindex(I_ROOM);
  38. X  freeindex;
  39. X  ro := indx;
  40. X
  41. X  getindex(I_OBJECT);
  42. X  freeindex;
  43. X  ob := indx;
  44. X
  45. X  writeln ('Scan self descriptions');
  46. X  getint(N_SELF);
  47. X  freeint;
  48. X  for i := 1 to pe.top do if not pe.free`091i`093 then alloc (anint.int`091i
  49. V`093);
  50. X
  51. X  writeln('Scan object file');
  52. X  for i := 1 to ob.top do if not ob.free`091i`093 then begin
  53. X    getobj(i);
  54. X    freeobj;
  55. X    with obj do begin
  56. X      alloc (-linedesc);
  57. X      alloc (homedesc);
  58. X      alloc (examine);
  59. X      alloc (getfail);
  60. X      alloc (getsuccess);`032
  61. X      alloc (usefail);
  62. X      alloc (usesuccess);
  63. X      alloc (d1);
  64. X      alloc (d2);
  65. X    end
  66. X  end;
  67. X `032
  68. X  writeln ('Scan room file');
  69. X  for i := 1 to ro.top do if not ro.free`091i`093 then begin
  70. X    getroom(i);
  71. X    freeroom;
  72. X    with here do begin
  73. X      for j := 1 to maxexit do with exits`091j`093 do begin
  74. X        alloc(-exitdesc);
  75. X        `123 alloc(-closed); This isn't use yet `125
  76. X        alloc(fail);
  77. X        alloc(success);`032
  78. X        alloc(goin);
  79. X        alloc(comeout);    `032
  80. X        alloc(hidden);      `123 is this in use ? `125
  81. X      end;                                   `032
  82. X      for j := 1 to maxdetail do alloc(here.detaildesc`091j`093);
  83. X      alloc(primary);
  84. X      alloc(secondary);
  85. X      alloc(-objdesc); `032
  86. X      alloc(-objdest);
  87. X      alloc(-rndmsg);                      `032
  88. X      alloc(xmsg2);
  89. X      alloc(exitfail);
  90. X      alloc(ofail);
  91. X    end
  92. X  end;              `032
  93. X
  94. X  writeln('Scan global codes');
  95. X  getglobal;
  96. X  freeglobal;
  97. X  for i := 1 to GF_MAX do if GF_Types`091i`093 = G_Text then alloc(global.in
  98. Vt`091i`093);
  99. X`032
  100. X  locate(indexfile,I_LINE);
  101. X  indexfile`094 := ln;
  102. X  put(indexfile);
  103. X
  104. X  locate(indexfile,I_BLOCK);
  105. X  indexfile`094 := bl;
  106. X  put(indexfile);
  107. X `032
  108. X  writeln ('Ready.');
  109. Xend;
  110. X
  111. Xprocedure fix_clear_privileges (batch: boolean);
  112. Xvar i,mm: integer;
  113. Xbegin
  114. X  if fix_sure('Do you want clear privileges database ? ',batch) then begin
  115. X     if not exact_user(mm,MM_userid) then mm := 0;
  116. X     int_in_use(N_PRIVILEGES);
  117. X     getint(N_PRIVILEGES);
  118. X     for i := 1 to maxplayers do anint.int`091i`093 := 0;
  119. X     if mm > 0 then anint.int`091mm`093 := all_privileges;`032
  120. X`009`123 more privilege for Monster Manager `125
  121. X     putint;
  122. X     writeln ('Ready.');
  123. X  end;
  124. Xend; `123 fix_clear_privileges `125
  125. X
  126. Xprocedure fix_clear_experience (batch: boolean);
  127. Xvar i,mm: integer;
  128. Xbegin
  129. X  if fix_sure('Do you want clear experience database ? ',batch) then begin
  130. X     if not exact_user(mm,MM_userid) then mm := 0;
  131. X     int_in_use(N_EXPERIENCE);
  132. X     getint(N_EXPERIENCE);
  133. X     for i := 1 to maxplayers do anint.int`091i`093 := 0;
  134. X     if mm > 0 then anint.int`091mm`093 := MaxInt;`032
  135. X        `123 Monster Manager is Archwizard `125
  136. X     putint;
  137. X     writeln ('Ready.');
  138. X  end;
  139. Xend; `123 fix_clear_privileges `125
  140. X
  141. Xprocedure fix_clear_health (batch: boolean);
  142. Xvar i: integer;
  143. X    exp: intrec;
  144. Xbegin
  145. X  if fix_sure('Do you want clear health database ? ',batch) then begin
  146. X     getint(N_EXPERIENCE);
  147. X     freeint;
  148. X     exp := anint;
  149. X     int_in_use(N_HEALTH);
  150. X     getint(N_HEALTH);
  151. X     for i := 1 to maxplayers do anint.int`091i`093 :=`032
  152. X         leveltable`091level(exp.int`091i`093)`093.health * goodhealth div 1
  153. V0;
  154. X     putint;
  155. X     writeln ('Ready.');
  156. X  end;
  157. Xend; `123 fix_clear_health `125
  158. X
  159. X
  160. Xprocedure fix_clear_password (batch: boolean);
  161. Xvar password: shortstring;
  162. X    i: integer;
  163. Xbegin
  164. X     if fix_sure('Want you really clear password database ? ',batch) then be
  165. Vgin
  166. X
  167. X        writeln('Intializing password record...');
  168. X        locate(namfile,T_PASSWD);
  169. X        namfile`094.validate := T_PASSWD;
  170. X        namfile`094.loctop := 0;
  171. X        for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  172. X`009put(namfile);
  173. X
  174. X        writeln('Initializing real name record ...');
  175. X        locate(namfile,T_REAL_USER);
  176. X        namfile`094.validate := T_REAL_USER;
  177. X        namfile`094.loctop := 0;
  178. X        for i := 1 to maxroom do namfile`094.idents`091i`093 := '';
  179. X`009put(namfile);
  180. X
  181. X`009getuser;
  182. X`009freeuser;
  183. X
  184. X`009writeln ('Making pseudo passowords... (same as virtual userid)');
  185. X        for i := 1 to maxplayers do begin
  186. X            password := user.idents`091i`093;
  187. X            if password > '' then if password`0911`093 = '"' then begin
  188. X               encrypt(password,i);
  189. X               getpasswd;
  190. X               passwd.idents`091i`093 := password;
  191. X               putpasswd;
  192. X               getreal_user;
  193. X               real_user.idents`091i`093 := '';
  194. X               putreal_user;
  195. X            end;
  196. X        end;
  197. X        writeln ('Ready.');
  198. X     end
  199. Xend; `123 fix_clear_password `125
  200. X
  201. Xprocedure fix_clear_quotas(batch: boolean);
  202. Xvar numrooms,allow,accept: intrec;
  203. X    room,exit,player,acp,i: integer;`032
  204. X    roomindx: indexrec;
  205. Xbegin
  206. X    writeln('Scanning rooms....');
  207. X    for i := 1 to maxplayers do numrooms.int`091i`093 := 0;
  208. X    numrooms.intnum := N_NUMROOMS;
  209. X    for i := 1 to maxplayers do allow.int`091i`093 := default_allow;
  210. X    allow.intnum := N_ALLOW;
  211. X    for i := 1 to maxplayers do accept.int`091i`093 := 0;
  212. X    accept.intnum := N_ACCEPT;
  213. X    getindex(I_ROOM);
  214. X    freeindex;
  215. X    roomindx := indx;
  216. X    for room := 1 to roomindx.top do if not roomindx.free`091room`093 then b
  217. Vegin
  218. X`009gethere(room);
  219. X`009if exact_user(player,here.owner) then begin
  220. X`009    acp := 0;
  221. X`009    for exit := 1 to maxexit do`032
  222. X`009`009if here.exits`091exit`093.kind = 5 then acp := acp +1;
  223. X`009    numrooms.int`091player`093 := numrooms.int`091player`093 +1;
  224. X`009    accept.int`091player`093 := accept.int`091player`093     +acp;
  225. X`009end;
  226. X    end;
  227. X    writeln('Clearing quota database and writing results to it...');
  228. X    int_in_use(N_NUMROOMS);
  229. X    int_in_use(N_ALLOW);
  230. X    int_in_use(N_ACCEPT);
  231. X
  232. X    getint(N_NUMROOMS);
  233. X    anint := numrooms;
  234. X    putint;
  235. X
  236. X    getint(N_ALLOW);
  237. X    anint := allow;
  238. X    putint;
  239. X
  240. X    getint(N_ACCEPT);
  241. X    anint := accept;
  242. X    putint;
  243. X
  244. X    writeln('OK.');
  245. Xend;
  246. X
  247. X
  248. Xprocedure fix_repair_location(batch: boolean);
  249. Xvar id,loc,slot,code,room,true_loc,found_counter: integer;
  250. Xvar ex_indx,sleep_indx,room_indx,header_indx: indexrec;
  251. X    locs: intrec;
  252. X    temp: namrec;
  253. Xbegin
  254. X    writeln('Scanning monsters...');
  255. X    getpers;
  256. X    freepers;
  257. X    getuser;
  258. X    freeuser;
  259. X    getindex(I_PLAYER);
  260. X    freeindex;
  261. X    ex_indx := indx;
  262. X    getindex(I_ASLEEP);
  263. X    freeindex;
  264. X    sleep_indx := indx;
  265. X    getindex(I_ROOM);
  266. X    freeindex;
  267. X    room_indx := indx;
  268. X    getindex(I_HEADER);
  269. X    freeindex;
  270. X    header_indx := indx;
  271. X    getint(N_LOCATION);
  272. X    freeint;
  273. X    locs := anint;
  274. X    for id := 1 to ex_indx.top do if not ex_indx.free`091id`093 then`032
  275. X`009if user.idents`091id`093 = '' then begin
  276. X`009    writeln('Bad player username record #',id:1);
  277. X`009    writeln('    player name: ',pers.idents`091id`093);
  278. X`009end else if user.idents`091id`093`0911`093 = ':' then begin`032
  279. X`009    found_counter := 0;
  280. X`009    true_loc := 0;
  281. X`009    loc := locs.int`091id`093;
  282. X`009    for room := 1 to room_indx.top do if not room_indx.free`091room`093
  283. V then begin
  284. X`009`009gethere(room);
  285. X`009`009for slot := 1 to maxpeople do begin
  286. X`009`009    if (here.people`091slot`093.username = user.idents`091id`093) an
  287. Vd`032
  288. X`009`009`009(here.people`091slot`093.kind = P_MONSTER) then begin
  289. X`009`009`009found_counter := found_counter +1;
  290. X`009`009`009true_loc := room;
  291. X`009`009    end;
  292. X`009`009end;
  293. X`009    end;
  294. X`009    if (found_counter = 1) and (true_loc = loc) then
  295. X`009`009writeln(pers.idents`091id`093,': ok')
  296. X`009    else if found_counter = 0 then begin
  297. X`009`009writeln(pers.idents`091id`093,': not found from any room - deleted '
  298. V,
  299. X`009`009    '- can''t update code database.');
  300. X`009`009ex_indx.free`091id`093 := true;
  301. X`009`009ex_indx.inuse := ex_indx.inuse - 1;
  302. X`009`009if not sleep_indx.free`091id`093 then begin
  303. X`009`009    sleep_indx.free`091id`093 := true;
  304. X`009`009    sleep_indx.inuse := sleep_indx.inuse - 1;`032
  305. X`009`009`009`123 onkohan tarpeelista ? `125
  306. X`009`009end;
  307. X`009`009pers.idents`091id`093 := '';
  308. X`009`009user.idents`091id`093 := '';
  309. X`009`009getint(N_SELF);`009`009`123 destroy self description `125
  310. X`009`009delete_block(anint.int`091id`093);
  311. X`009`009putint;
  312. X`009    end else if (found_counter = 1) and ( loc <> true_loc) then begin
  313. X`009`009writeln(pers.idents`091id`093,': found from wrong location - updated
  314. V.');
  315. X`009`009locs.int`091id`093 := true_loc;
  316. X`009    end else if (found_counter > 1) then begin
  317. X`009`009writeln(pers.idents`091id`093,': duplicated monster - deleted.');
  318. X`009`009for room := 1 to room_indx.top do if not room_indx.free`091room`093
  319. V then begin
  320. X`009`009    code := 0;
  321. X`009`009    getroom(room); `123 locking `125
  322. X`009`009    for slot := 1 to maxpeople do begin
  323. X`009`009`009if (here.people`091slot`093.username = user.idents`091id`093) an
  324. Vd`032
  325. X`009`009`009(here.people`091slot`093.kind = P_MONSTER) then begin
  326. X`009`009`009    code := here.people`091slot`093.parm;
  327. X`009`009`009    here.people`091slot`093.username := '';
  328. X`009`009`009    here.people`091slot`093.kind     := 0;
  329. X`009`009`009    here.people`091slot`093.parm     := 0;
  330. X`009`009`009end;
  331. X`009`009    end;
  332. X`009`009    putroom;`009    `123 unlocking `125
  333. X`009`009    if code > 0 then begin
  334. X`009`009`009if not header_indx.free`091code`093 then begin
  335. X`009`009`009    header_indx.free`091code`093 := true;
  336. X`009`009`009    header_indx.inuse := sleep_indx.inuse - 1;`032
  337. X`009`009`009    delete_program(code);`009`009`009
  338. X`009`009`009end;
  339. X`009`009    end;
  340. X`009`009end; `123 end of room loop `125
  341. X`009`009ex_indx.free`091id`093 := true;
  342. X`009`009ex_indx.inuse := ex_indx.inuse - 1;
  343. X`009`009if not sleep_indx.free`091id`093 then begin
  344. X`009`009    sleep_indx.free`091id`093 := true;
  345. X`009`009    sleep_indx.inuse := sleep_indx.inuse - 1;`032
  346. X`009`009`009`123 onkohan tarpeelista ? `125
  347. X`009`009end;
  348. X`009`009pers.idents`091id`093 := '';
  349. X`009`009user.idents`091id`093 := '';
  350. X`009`009getint(N_SELF);`009`009`123 destroy self description `125
  351. X`009`009delete_block(anint.int`091id`093);
  352. X`009`009putint;
  353. X    `009    end else writeln('%',pers.idents`091id`093,': bad software error
  354. V.');
  355. X`009end;
  356. X    writeln('Updating database...');
  357. X
  358. X    temp := pers;
  359. X    getpers;
  360. X    pers := temp;
  361. X    putpers;
  362. X   `032
  363. X    temp := user;
  364. X    getuser;
  365. X    user := temp;
  366. X    putuser;
  367. X   `032
  368. X    getindex(I_PLAYER);
  369. X    indx := ex_indx;
  370. X    putindex;
  371. X    getindex(I_ASLEEP);
  372. X    indx := sleep_indx;
  373. X    putindex;
  374. X    getindex(I_ROOM);
  375. X    indx := room_indx;
  376. X    putindex;
  377. X    getindex(I_HEADER);
  378. X    indx := header_indx;
  379. X    freeindex;
  380. X    getint(N_LOCATION);
  381. X    anint := locs;
  382. X    putint;
  383. X    writeln('Ready.');
  384. Xend; `123 fix_repair_location `125
  385. X
  386. Xprocedure fix_calculate_existence(batch: boolean);
  387. Xvar table: array `0911 .. maxroom `093 of integer;
  388. X    i,room,slot,object,old_value,pslot,inv: integer;
  389. Xbegin
  390. X    writeln ('Calculate objects'' number in existence');
  391. X    for i := 1 to maxroom do table`091i`093 := 0;
  392. X    getindex(I_ROOM);
  393. X    freeindex;
  394. X    writeln ('Scan room file');
  395. X    for room := 1 to indx.top do if not indx.free`091room`093 then begin
  396. X`009gethere (room);
  397. X`009for slot := 1 to maxobjs do begin
  398. X`009    i := here.objs`091slot`093;
  399. X`009    if (i < 0) or (i > maxroom) then
  400. X`009`009writeln('Invalid object #',i:1,' entry #',slot:1,
  401. X`009`009    ' at room ',here.nicename)
  402. X`009    else if i > 0 then table`091i`093 := table`091i`093 +1;
  403. X`009end;
  404. X`009for pslot := 1 to maxpeople do begin
  405. X`009    if here.people`091pslot`093.kind > 0 then begin
  406. X`009`009for inv := 1 to maxhold do begin
  407. X`009`009    i := here.people`091pslot`093.holding`091inv`093;
  408. X`009`009    if (i < 0) or (i > maxroom) then
  409. X`009`009`009writeln('Invalid object #',i:1,' entry #',inv:1,
  410. X`009`009`009    ' at monster ',here.people`091pslot`093.name)
  411. X`009`009    else if i > 0 then table`091i`093 := table`091i`093 +1;
  412. X`009`009end;
  413. X`009    end;
  414. X`009end;
  415. X    end;
  416. X    writeln('Write result to object file');
  417. X    getindex(I_OBJECT);
  418. X    freeindex;
  419. X    for object := 1 to maxroom do begin
  420. X`009if (object > indx.top) or indx.free`091object`093 then begin
  421. X`009    if table`091object`093 > 0 then begin
  422. X`009`009writeln('Object #',object:1,' not exist but here is');
  423. X`009`009writeln('  ',table`091object`093,' entries in room file.');
  424. X`009    end;
  425. X`009end else begin
  426. X`009    getobj(object);
  427. X`009    old_value := obj.numexist;
  428. X`009    obj.numexist := table`091object`093;
  429. X`009    putobj;
  430. X`009    if old_value <> table`091object`093 then writeln(obj.oname,' fixed.'
  431. V);
  432. X`009end;
  433. X    end;
  434. X    writeln ('Ready.');
  435. Xend;`009`123 fix_calculate_existence `125
  436. X
  437. X
  438. Xprocedure fix_repair_paths(batch: boolean);
  439. Xvar room,exit,room_to,second_exit,exit2: integer;
  440. X
  441. X    procedure delete_exit(room,exit: integer);
  442. X    begin
  443. X`009getroom(room);
  444. X`009writeln('  Removing exit from ',here.nicename,
  445. X`009    ' to ',direct`091exit`093,'.');
  446. X`009here.exits`091exit`093.kind  := 0;
  447. X`009here.exits`091exit`093.toloc := 0;
  448. X`009here.exits`091exit`093.slot  := 0;
  449. X`009putroom;
  450. X    end; `123 delete_exit `125
  451. X`009
  452. Xbegin
  453. X    writeln('Repairing paths...');
  454. X   `032
  455. X    getindex(I_ROOM);
  456. X    freeindex;
  457. X    for room := 1 to indx.top do if not indx.free`091room`093 then begin
  458. X`009for exit := 1 to maxexit do begin
  459. X
  460. X`009    gethere(room);`009`123 reread here `125
  461. X`009    if not (here.exits`091exit`093.kind in `0910,5`093) then begin
  462. X`009`009room_to := here.exits`091exit`093.toloc;
  463. X`009`009second_exit := here.exits`091exit`093.slot;
  464. X
  465. X`009`009if (second_exit < 0) or (second_exit > maxexit) then begin
  466. X`009`009    writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  467. X`009`009`009' is bad: target slot is out of range');
  468. X`009`009    delete_exit(room,exit);
  469. X`009`009
  470. X`009`009end else if room_to = 0 then begin
  471. X`009`009    writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  472. X`009`009`009' is nowhere.');
  473. X
  474. X`009`009end else if (room_to < 1) or (room_to > indx.top) then begin
  475. X`009`009    writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  476. X`009`009`009' is bad: target room is out of range.');
  477. X`009`009    delete_exit(room,exit);
  478. X
  479. X`009`009end else if indx.free`091room_to`093 then begin
  480. X`009`009    writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  481. X`009`009`009' is bad: target room isn''t in use');
  482. X`009`009    delete_exit(room,exit);
  483. X
  484. X`009`009end else begin
  485. X`009`009    if room = room_to then
  486. X`009`009`009writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  487. X`009`009`009    ' is loop.');
  488. X`009`009    if second_exit = 0 then begin
  489. X`009`009`009writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  490. X`009`009`009    ' is bad: no target slot');
  491. X`009`009`009delete_exit(room,exit);
  492. X`009`009    end else begin
  493. X`009`009`009gethere(room_to);
  494. X`009`009`009if (here.exits`091second_exit`093.toloc <> room) or
  495. X`009`009`009   (here.exits`091second_exit`093.slot <> exit) then begin
  496. X`009`009`009    writeln('Exits from ',here.nicename,' to ',
  497. X`009`009`009`009direct`091second_exit`093,
  498. X`009`009`009`009' and');
  499. X`009`009`009    gethere(room);
  500. X`009`009`009    writeln(' from ',here.nicename,' to ',direct`091exit`093,
  501. X`009`009`009`009' are bad: bad link');
  502. X`009`009`009    delete_exit(room,exit);
  503. X`009`009`009end;
  504. X`009`009    end;
  505. X`009`009end;
  506. X`009    end else if here.exits`091exit`093.toloc <> 0 then begin
  507. X`009`009writeln('Exit from ',here.nicename,' to ',direct`091exit`093,
  508. X`009`009    ' isn''t exit.');
  509. X`009    end;`032
  510. X`009end;`009`123 exit `125
  511. X    end;    `123 room `125
  512. X    writeln ('Ready.');
  513. Xend;
  514. X
  515. X`123 fix_view_global_flags moved to DATABASE.PAS `125
  516. X
  517. X`091global`093
  518. Xfunction fix
  519. X`009(batch: string := ''):  `123 in this procedure you not have logged in `1
  520. V25
  521. X`009`009`009`009`123 system ! `125
  522. X`009boolean;
  523. Xvar s: string;
  524. X    done: boolean;
  525. X    batch_mode: boolean;
  526. Xbegin            `009
  527. X   done := batch > '';
  528. X   fix := true;
  529. X   repeat
  530. X      if batch > '' then begin
  531. X`009    s := batch;
  532. X`009    `123 writeln('Batch mode: ',s); `125
  533. X`009    batch_mode := true;
  534. X      end else begin
  535. X`009    write ('fix> '); readln (s); writeln;
  536. X`009    batch_mode := false;
  537. X      end;
  538. X      s := lowcase(s);
  539. X      if s = '' then writeln ('Enter h for help.')
  540. X      else case s`0911`093 of `032
  541. X`009'a'`009: fix_clear_privileges`009    (batch_mode);
  542. X`009'b'`009: fix_clear_health`009    (batch_mode);
  543. X        'c'`009: fix_initialize_event`009    (batch_mode);
  544. X        'd'     : fix_descriptions`009    (batch_mode);
  545. X        'f'     : fix_clear_experience`009    (batch_mode);
  546. X`009'g'`009:`032
  547. X`009begin
  548. X`009`009if s = 'g' then`009`009fix_calculate_existence`009(batch_mode)
  549. X`009`009else if s = 'gl' then`009fix_clear_global`009(batch_mode)
  550. X`009`009else if s = 'gs' then`009set_global_flag(GF_ACTIVE,FALSE)
  551. X`009`009else if s = 'gu' then   set_global_flag(GF_ACTIVE,TRUE)
  552. X`009`009else if s = 'g-' then`009set_global_flag(GF_VALID,FALSE)
  553. X`009`009else if s = 'g+' then   set_global_flag(GF_VALID,TRUE)
  554. X`009`009else if s = 'gv' then   fix_view_global_flags
  555. X`009`009else writeln ('Enter ? for help.');
  556. X`009end;
  557. X        'i'     : fix_repair_index`009    (batch_mode);
  558. X`009'j'`009: fix_repair_paths`009    (batch_mode);
  559. X`009'k'`009: fix_codes`009`009    (batch_mode);
  560. X`009'l'`009: fix_repair_location`009    (batch_mode);
  561. X        'm'     : fix_clear_monster`009    (batch_mode);
  562. X`009'n'`009: fix_clear_quotas`009    (batch_mode);
  563. X        'o'     :`032
  564. X`009begin
  565. X`009    if s = 'o' then fix_clear_object(batch_mode)
  566. X`009    else if s = 'ow' then fix_owner (batch_mode)
  567. X`009    else writeln('Enter ? for help.');
  568. X`009end;
  569. X        'p'     : fix_clear_player`009    (batch_mode);
  570. X        'r'     : fix_clear_room`009    (batch_mode);
  571. X        's'     :`032
  572. X`009begin
  573. X`009    if s = 's' then fix_clear_password`009    (batch_mode)
  574. X`009    else if s = 'sp' then fix_clear_spell   (batch_mode)
  575. X`009    else writeln('Enter ? for help.');
  576. X`009end;
  577. X        'v'     : system_view;
  578. X        'h','?' : fix_help;
  579. X        'e'     : done := true;
  580. X        'q'     : begin
  581. X`009`009`009fix := false;
  582. X`009`009`009done := true;
  583. X`009`009end;
  584. X        otherwise writeln ('Use ? for help');
  585. X      end; `123 case `125
  586. X   until done
  587. Xend;
  588. X
  589. Xfunction batch (file_name: string): boolean;
  590. Xvar line: string;
  591. X    pos,errorcode: integer;
  592. X    batch_file: text;
  593. X    quit: boolean;
  594. Xbegin
  595. X    batch := true;
  596. X    open(batch_file,file_name,history := readonly, error := continue);
  597. X    quit := false;
  598. X    errorcode := status(batch_file);
  599. X    if errorcode <> 0 then begin
  600. X`009case errorcode of
  601. X`009    -1: `123 PAS$K_EOF `125 writeln('Batch file is empty.');
  602. X`009    3:  `123 PAS$K_FILNOTFOU `125 writeln('Batch file not foud.');
  603. X`009    4:  `123 PAS$K_INVFILSYN `125 writeln('Illegal name of batch file.')
  604. V;
  605. X`009    otherwise writeln('Can''t open batch file, error code (status): ',
  606. X`009`009errorcode:1);
  607. X`009end; `123 case `125
  608. X`009quit := true;
  609. X    end else begin
  610. X`009reset(batch_file);
  611. X`009while not quit and not eof(batch_file) do begin
  612. X`009    readln(batch_file,line);
  613. X`009    writeln(line);
  614. X`009    if line > '' then begin
  615. X`009`009pos := index(line,'!');
  616. X`009`009if pos > 0 then line := substr(line,1,pos-1);
  617. X`009    end;
  618. X`009    if line > '' then quit := not fix (line);
  619. X`009end;
  620. X    end;
  621. X    batch  := not quit;
  622. Xend; `123 batch `125
  623. X
  624. XBEGIN
  625. X    Get_Environment;
  626. X
  627. X    if not lookup_class(system_id,'system') then
  628. X`009writeln('%error in main program: system');
  629. X    if not lookup_class(public_id,'public') then
  630. X`009writeln('%error in main program: public');
  631. X    if not lookup_class(disowned_id,'disowned') then
  632. X`009writeln('%error in main program: disowned');
  633. X
  634. X    rebuild_system := false;
  635. X    fix_system := false;
  636. X
  637. X    Setup_Guts;
  638. X    userid := lowcase(get_userid);
  639. X    wizard := userid = MM_userid;
  640. X    Params;
  641. X
  642. X    if open_database(false) then begin
  643. X
  644. X`009if rebuild_system then rebuild;
  645. X
  646. X`009if batch_system then batch(name);
  647. X
  648. X`009if fix_system then fix;
  649. X
  650. X`009close_database;
  651. X    end else writeln ('Can''t open database. Maybe someone is playing Monste
  652. Vr.');
  653. X
  654. X    Finish_Guts;
  655. XEND.
  656. X
  657. $ CALL UNPACK MONSTER_REBUILD.PAS;14 1309722618
  658. $ create/nolog 'f'
  659. X/
  660. $ CALL UNPACK MONSTER_WHO.DIF;1 47
  661. $ create/nolog 'f'
  662. X-  268,  278
  663. X`123 write_debug moved to DATABASE.PAS `125
  664. X/
  665. $ CALL UNPACK PARSER.DIF;1 892696612
  666. $ create/nolog 'f'
  667. X/
  668. $ CALL UNPACK PRIVUSERS.DIF;1 47
  669. $ create/nolog 'f'
  670. X/
  671. $ CALL UNPACK QUEUE.DIF;1 47
  672. $ create/nolog 'f'
  673. X                  MONSTER Helsinki V 1.05
  674. X                  -----------------------
  675. X
  676. X    Monster, a multiplayer adventure game where the players create the
  677. X    world and make the rules.
  678. X
  679. X    Derived from Rich Skrenta's Monster (from version 1).
  680. X
  681. X    Includes programmable non-player characters (NPC) with own programming
  682. X    language - MDL (Monster Defination Language). Also rooms and objects
  683. X    can program with it (via so called hooks). NPCs are called to 'monster',
  684. X    all other MDL-objects are called to 'hook'.
  685. X
  686. XEnvironment: VMS V4.x (MONSTER_INSTALL.COM requires V5.x)
  687. X             PASCAL`032
  688. X
  689. XTHIS IS DELTA POSTING AGAIST VERSION 1.04
  690. XVersion 1.04 is posted 14.6.1992
  691. X
  692. XNew to version 1.04:
  693. X - MONSTER /BUILD and /DUMP commands now correct handle passwords
  694. X   of virual userids created by MONSTER/USER (you can't do
  695. X     text dump of database and build new database where password
  696. X     of virtual userids have saved in available)
  697. X - MDL function 'or' accept now any number of parameters
  698. X - MDL function 'and' accept now more than two parameters
  699. X - New modules: VERSION.PAS (version number of monster)
  700. X                ALLOC.PAS
  701. X - New image MONSTER_REBUILD.EXE - here is now commands:
  702. X`009`009MONSTER/REBUILD
  703. X`009`009MONSTER/FIX
  704. X`009`009MONSTER/BATCH
  705. X - Document have updated little
  706. X
  707. XNew in version 1.04 to version 1.03 (posted 24.11.1990):
  708. X -  Several bugfixes (of course)
  709. X -  New commands MONSTER/DUMP and MONSTER/BUILD (via MONSTER_DUMP.EXE)
  710. X -  Reading of keyboard and database polling starategy have rewrote -
  711. X    should cause smaller IO-load to system (new GUTS.PAS).
  712. X -  MDL -parser now writes offending line and points error position when`032
  713. X    it detects error in MDL-program.
  714. X
  715. XRunning delta:
  716. X    Get MONSTER Version 1.04 distribution
  717. X      Put logical name MONSTER104 to point that directory
  718. X    Create directory for sources of version 1.05`032
  719. X      Put logical name MONSTER105 to point that directory
  720. X    Go to directory where is this delta distribution
  721. X      execute UPDATE.COM:
  722. X         $ @UPDATE
  723. X
  724. X    Go directory MONSTER105
  725. X
  726. X    Compilation and installation - three possibility:
  727. X1)  Compile MONSTER_E.HLP
  728. X         $ LIBRARIAN/HELP/CREATE MONSTER_E MONSTER_E
  729. X    Read installation help
  730. X         $ HELP/LIBRARY=SYS$DISK:<>MONSTER_E Installation
  731. X    and follow help.
  732. X2)  Run installation-script
  733. X         $ @MONSTER_INSTALL
  734. X    and answer to questions.
  735. X
  736. X3)  Compile with MMS (there if file MAKEFILE.)
  737. X         $ MMS ALL
  738. X    Install manually
  739. X
  740. X    Send notice to me (Kari.Hurtta@Helsinki.Fi) if you get this
  741. X    working or if you have problems.
  742. X
  743. X- K E H
  744. X( Kari.Hurtta@Helsinki.FI,
  745. X  hurtta@cc.Helsinki.FI,
  746. X  hurtta@cs.Helsinki.FI,
  747. X  HURTTA@FINUH.BITNET
  748. X)
  749. $ CALL UNPACK READ.ME;1 620791259
  750. $ create/nolog 'f'
  751. X/
  752. $ CALL UNPACK RECEPTIONIST.DIF;1 47
  753. $ create/nolog 'f'
  754. X$ IF F$TRNLNm("MONSTER104") .eqs. "" .or. F$TRNLNM("MONSTER105") .eqs. ""
  755. X$  THEN
  756. X$  write sys$OUTPUT "Define MONSTER104 to point Monster Version 1.04"
  757. X$  write sys$OUTPUT "    distribution directory"
  758. X$  write sys$OUTPUT "Create directory for Monster Version 1.05 and
  759. X$  write SYS$OUTPUT "   MONSTER105 to point that directory"
  760. X$ ENDIF
  761. X$ EDIT/SUM MONSTER104:BONE.MDL        /UPDATE=SYS$DISK:<>BONE.DIF /OUTPUT=MO
  762. VNSTER105:
  763. X$ EDIT/SUM MONSTER104:CASTLE.DMP      /UPDATE=SYS$DISK:<>CASTLE.DIF /OUTPUT=
  764. VMONSTER105:
  765. X$ EDIT/SUM MONSTER104:CLD.PROTO       /UPDATE=SYS$DISK:<>CLD.DIF /OUTPUT=MON
  766. VSTER105:
  767. X$ EDIT/SUM MONSTER104:CLI.PAS         /UPDATE=SYS$DISK:<>CLI.DIF /OUTPUT=MON
  768. VSTER105:
  769. X$ EDIT/SUM MONSTER104:COMMANDS.PAPER  /UPDATE=SYS$DISK:<>COMMANDS.DIF /OUTPU
  770. VT=MONSTER105:
  771. X$ EDIT/SUM MONSTER104:CONVERT.BATCH   /UPDATE=SYS$DISK:<>CONVERT.DIF /OUTPUT
  772. V=MONSTER105:
  773. X$ EDIT/SUM MONSTER104:CUSTOM.PAS      /UPDATE=SYS$DISK:<>CUSTOM.DIF /OUTPUT=
  774. VMONSTER105:
  775. X$ EDIT/SUM MONSTER104:DATABASE.PAS    /UPDATE=SYS$DISK:<>DATABASE.DIF /OUTPU
  776. VT=MONSTER105:
  777. X$ EDIT/SUM MONSTER104:DOG.MDL         /UPDATE=SYS$DISK:<>DOG.DIF /OUTPUT=MON
  778. VSTER105:
  779. X$ EDIT/SUM MONSTER104:FIX.BATCH       /UPDATE=SYS$DISK:<>FIX.DIF /OUTPUT=MON
  780. VSTER105:
  781. X$ EDIT/SUM MONSTER104:GLOBAL.PAS      /UPDATE=SYS$DISK:<>GLOBAL.DIF /OUTPUT=
  782. VMONSTER105:
  783. X$ EDIT/SUM MONSTER104:GREAT_HALL.MDL  /UPDATE=SYS$DISK:<>GREAT_HALL.DIF /OUT
  784. VPUT=MONSTER105:
  785. X$ EDIT/SUM MONSTER104:GUTS.PAS        /UPDATE=SYS$DISK:<>GUTS.DIF /OUTPUT=MO
  786. VNSTER105:
  787. X$ EDIT/SUM MONSTER104:ILMOITUS.TXT    /UPDATE=SYS$DISK:<>ILMOITUS.DIF /OUTPU
  788. VT=MONSTER105:
  789. X$ EDIT/SUM MONSTER104:INIT.PROTO      /UPDATE=SYS$DISK:<>INIT.DIF /OUTPUT=MO
  790. VNSTER105:
  791. X$ EDIT/SUM MONSTER104:INTERPRETER.PAS /UPDATE=SYS$DISK:<>INTERPRETER.DIF /OU
  792. VTPUT=MONSTER105:
  793. X$ EDIT/SUM MONSTER104:KEYS.PAS        /UPDATE=SYS$DISK:<>KEYS.DIF /OUTPUT=MO
  794. VNSTER105:
  795. X$ EDIT/SUM MONSTER104:MON.PAS         /UPDATE=SYS$DISK:<>MON.DIF /OUTPUT=MON
  796. VSTER105:
  797. X$ EDIT/SUM MONSTER104:MONSTER.CLD              /UPDATE=SYS$DISK:<>MONSTER.DI
  798. VF /OUTPUT=MONSTER105:
  799. X$ EDIT/SUM MONSTER104:MONSTER.HELP             /UPDATE=SYS$DISK:<>MONSTER.DI
  800. VF /OUTPUT=MONSTER105:
  801. X$ EDIT/SUM MONSTER104:MONSTER.INIT             /UPDATE=SYS$DISK:<>MONSTER.DI
  802. VF /OUTPUT=MONSTER105:
  803. X$ EDIT/SUM MONSTER104:MONSTER_DUMP.PAS         /UPDATE=SYS$DISK:<>MONSTER_DU
  804. VMP.DIF /OUTPUT=MONSTER105:
  805. X$ EDIT/SUM MONSTER104:MONSTER_E.HLP            /UPDATE=SYS$DISK:<>MONSTER_E.
  806. VDIF /OUTPUT=MONSTER105:
  807. X$ EDIT/SUM MONSTER104:MONSTER_INSTALL.COM      /UPDATE=SYS$DISK:<>MONSTER_IN
  808. VSTALL.DIF /OUTPUT=MONSTER105:
  809. X$ EDIT/SUM MONSTER104:MONSTER_WHO.PAS          /UPDATE=SYS$DISK:<>MONSTER_WH
  810. VO.DIF /OUTPUT=MONSTER105:
  811. X$ EDIT/SUM MONSTER104:PARSER.PAS               /UPDATE=SYS$DISK:<>PARSER.DIF
  812. V /OUTPUT=MONSTER105:
  813. X$ EDIT/SUM MONSTER104:PRIVUSERS.PAS            /UPDATE=SYS$DISK:<>PRIVUSERS.
  814. VDIF /OUTPUT=MONSTER105:
  815. X$ EDIT/SUM MONSTER104:QUEUE.PAS                /UPDATE=SYS$DISK:<>QUEUE.DIF
  816. V /OUTPUT=MONSTER105:
  817. X$ EDIT/SUM MONSTER104:RECEPTIONIST.MDL         /UPDATE=SYS$DISK:<>RECEPTIONI
  818. VST.DIF /OUTPUT=MONSTER105:
  819. X$ COPY/LOG ALLOC.PAS`009`009 MONSTER105:
  820. X$ COPY/LOG VERSION.PAS             MONSTER105:
  821. X$ COPY/LOG MONSTER_REBUILD.PAS     MONSTER105:
  822. X$ COPY/LOG MAKEFILE.               MONSTER105:
  823. $ CALL UNPACK UPDATE.COM;3 660238337
  824. $ create/nolog 'f'
  825. X`091inherit ('GlobaL') `093
  826. XMODULE Global;
  827. X
  828. XVAR
  829. X    `123 externally definated of this have in GLOBAL.PAS `125
  830. X
  831. X    VERSION : `091global`093 string
  832. X`009:= 'Monster Helsinki 1.05';
  833. X    DISTRIBUTED : `091global`093 string
  834. X`009:= '1.7.1992';
  835. X
  836. XEND.
  837. $ CALL UNPACK VERSION.PAS;8 1075601448
  838. $ EXIT
  839.