home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / monhl104 / part27 < 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 27/32
  5. Keywords: Monster, a multiplayer adventure game
  6. Message-ID: <1992Jun14.091906.13440@klaava.Helsinki.FI>
  7. Date: 14 Jun 92 09:19:06 GMT
  8. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  9. Followup-To: vmsnet.sources.d
  10. Organization: University of Helsinki
  11. Lines: 1372
  12.  
  13. Archieve-name: monster_helsinki_104/part27
  14. Author: Kari.Hurtta@Helsinki.FI
  15. Product: Monster Helsinki V 1.04
  16. Environment: VMS, Pascal
  17. Part: 27/32
  18.  
  19. -+-+-+-+-+-+-+-+ START OF PART 27 -+-+-+-+-+-+-+-+
  20. X`009write_ITEM(f,'REAL%',real_user.idents`091player`093);
  21. X
  22. X    `123 location must write later `125
  23. X    `123 don't write numrooms `125
  24. X
  25. X    getint(N_ALLOW); freeint;
  26. X    write_INTEGER(f,'ALLOW%',anint.int`091player`093);`032
  27. X
  28. X    `123 don't write accept `125
  29. X
  30. X    getint(N_EXPERIENCE); freeint;
  31. X    write_INTEGER(f,'EXP%',anint.int`091player`093);`032
  32. X
  33. X    getint(N_SELF); freeint;
  34. X    write_BLOCK(f,anint.int`091player`093);`032
  35. X   `032
  36. X    getint(N_PRIVILEGES); freeint;
  37. X    write_INTEGER(f,'PRIV%',anint.int`091player`093);`032
  38. X
  39. X    getint(N_HEALTH); freeint;
  40. X    write_INTEGER(f,'HEALTH%',anint.int`091player`093);`032
  41. X
  42. X    getint(N_LOCATION); freeint;
  43. X    write_NAME(f,'LOC%',T_NAM,anint.int`091player`093);`032
  44. X
  45. X    getspell(player); freespell;
  46. X    for i := 1 to maxspells do begin
  47. X`009if spell.level`091i`093 > 0 then begin
  48. X`009    write_NAME(f,'SPELL%',T_SPELL_NAME,i);
  49. X`009    write_INTEGER(f,'LEVEL%',spell.level`091i`093);
  50. X`009end;
  51. X    end;
  52. X
  53. Xend; `123 write_PLAYER `125
  54. X
  55. Xfunction read_PLAYER(var f: text; var name: integer): boolean;
  56. Xvar sp,i,owner: integer;
  57. X    flag: boolean;
  58. X    data: string;
  59. Xbegin
  60. X    if not read_NEWNAME(f,'PLAYER%',T_PERS,I_PLAYER,name) then read_PLAYER :
  61. V= false
  62. X    else if name = 0 then begin
  63. X`009writeln('Empty/null player name!');
  64. X`009read_ITEM(f,'USER%',data);
  65. X`009read_ITEM(f,'DATE%',data);
  66. X`009read_ITEM(f,'TIME%',data);
  67. X`009read_BINARY(f,'PASSWD%',data);
  68. X`009read_ITEM(f,'REAL%',data);
  69. X`009read_INTEGER(f,'ALLOW%',i);
  70. X`009read_INTEGER(f,'EXP%',i);
  71. X`009read_BLOCK(f,i);
  72. X`009read_INTEGER(f,'PRIV%',i);
  73. X`009read_INTEGER(f,'HEALTH%',i);
  74. X`009read_NAME(f,'LOC%',T_NAM,I_ROOM,i);
  75. X`009while read_NAME(f,'SPELL%',T_SPELL_NAME,I_SPELL,i) do begin
  76. X`009    read_INTEGER(f,'LEVEL%',i);
  77. X`009end;
  78. X`009read_PLAYER := true;
  79. X    end else begin
  80. X
  81. X`009getpers; freepers;
  82. X`009if debug then writeln('Reading player ',pers.idents`091name`093);
  83. X`009flag := true;
  84. X
  85. X`009getuser;
  86. X`009if not read_ITEM(f,'USER%',data) then begin
  87. X`009    `123 monster: username is :<MDL code number> `125
  88. X`009    `123 read_MONSTER update this later `125
  89. X`009    data := ':0';
  90. X`009end;
  91. X`009user.idents`091name`093 := data;
  92. X`009putuser;
  93. X
  94. X`009getdate;
  95. X`009if not read_ITEM(f,'DATE%',data) then flag := false;
  96. X`009adate.idents`091name`093 := data;
  97. X`009putdate;
  98. X
  99. X`009gettime;
  100. X`009if not read_ITEM(f,'TIME%',data) then flag := false;
  101. X`009atime.idents`091name`093 := data;
  102. X`009puttime;
  103. X
  104. X`009if read_BINARY(f,'PASSWD%',data) then begin
  105. X`009    getpasswd;
  106. X`009    passwd.idents`091name`093 := data;
  107. X`009    putpasswd;
  108. X`009end;
  109. X
  110. X`009if read_ITEM(f,'REAL%',data) then begin
  111. X`009    getreal_user;
  112. X`009    real_user.idents`091name`093 := data;
  113. X`009    putreal_user;
  114. X`009end;
  115. X
  116. X`009getint(N_ALLOW);
  117. X`009if not read_INTEGER(f,'ALLOW%',anint.int`091name`093) then flag := false
  118. V;
  119. X`009putint;
  120. X
  121. X`009getint(N_EXPERIENCE);
  122. X`009if not read_INTEGER(f,'EXP%',anint.int`091name`093) then flag := false;
  123. X`009putint;
  124. X
  125. X`009getint(N_SELF);
  126. X`009if not read_BLOCK(f,anint.int`091name`093) then flag := false;
  127. X`009putint;
  128. X
  129. X`009getint(N_PRIVILEGES);
  130. X`009if not read_INTEGER(f,'PRIV%',anint.int`091name`093) then flag := false;
  131. X`009putint;
  132. X
  133. X`009getint(N_HEALTH);
  134. X`009if not read_INTEGER(f,'HEALTH%',anint.int`091name`093) then flag := fals
  135. Ve;
  136. X`009putint;
  137. X
  138. X`009getint(N_LOCATION);
  139. X`009if not read_NAME(f,'LOC%',T_NAM,I_ROOM,anint.int`091name`093) then flag
  140. V := false;
  141. X`009putint;
  142. X
  143. X                     `123 initialize the record containing the
  144. X                       level of each spell they have to start;
  145. X                       all start at zero; since the spellfile is
  146. X                       directly parallel with mylog, we can hack
  147. X                       init it here without dealing with SYSTEM `125
  148. X
  149. X                     locate(spellfile,name);
  150. X                     for i := 1 to maxspells do
  151. X                        spellfile`094.level`091i`093 := 0;
  152. X                     spellfile`094.recnum := name;
  153. X                     put(spellfile);
  154. X
  155. X`009getspell(name);
  156. X`009for sp := 1 to maxspells do spell.level`091sp`093 := 0;
  157. X`009while read_NAME(f,'SPELL%',T_SPELL_NAME,I_SPELL,sp) do begin
  158. X`009    if not read_INTEGER(f,'LEVEL%',spell.level`091sp`093) then flag := f
  159. Valse;
  160. X`009end;
  161. X`009putspell;
  162. X
  163. X`009if not flag then writeln('Error in reading player ',pers.idents`091name`
  164. V093);
  165. X`009read_PLAYER := true;
  166. X    end;
  167. Xend; `123 read_PLAYER `125
  168. X
  169. X`123 EXIT `125
  170. X
  171. Xprocedure write_EXIT(var f: text; from,slot: integer; exitrec: exit);
  172. Xbegin
  173. X    if debug then writeln('Writing exit #',from:1,'/',slot:1);
  174. X    write_NAME(f,'EXITFROM%',T_NAM,from);
  175. X    write_INTEGER(f,'SLOT%',slot);`009    `123 must be same slot in `125
  176. X`009`009`009`009`009    `123 in BUILDed database `125
  177. X
  178. X    write_NAME(f,'TO%',T_NAM,exitrec.toloc);
  179. X    write_INTEGER(f,'KIND%',exitrec.kind);
  180. X    write_INTEGER(f,'TOSLOT%',exitrec.slot);
  181. X
  182. X    write_DESCLINE(f,exitrec.exitdesc);
  183. X    write_BLOCK(f,exitrec.fail);
  184. X    write_BLOCK(f,exitrec.success);
  185. X    write_BLOCK(f,exitrec.goin);`009`123  new for dump version 1.02 `125
  186. X    write_BLOCK(f,exitrec.comeout);
  187. X
  188. X   `032
  189. X    `123 write_INTEGER(f,'HIDDEN%',exitrec.hidden); WRONG !! `125
  190. X    write_BLOCK(f,exitrec.hidden);
  191. X   `032
  192. X    write_NAME(f,'OBJREQ%',T_OBJNAM,exitrec.objreq);
  193. X    write_ITEM(f,'ALIAS%',exitrec.alias);
  194. X    write_BOOLEAN(f,'REQVERB%',exitrec.reqverb);
  195. X    write_BOOLEAN(f,'REQALIAS%',exitrec.reqalias);
  196. X    write_BOOLEAN(f,'AUTOLOOK%',exitrec.autolook);
  197. X    `123 write_DESCLINE(f,exitrec.closed); not used yet ? `125
  198. Xend;
  199. X
  200. Xfunction read_EXIT(var f: text; var from,slot: integer;
  201. X`009    var exitrec: exit): boolean;
  202. Xvar flag: boolean;
  203. X    data: string;
  204. X    tmp: integer;
  205. Xbegin
  206. X    if not read_NAME(f,'EXITFROM%',T_NAM,I_ROOM,from) then
  207. X`009read_EXIT := false
  208. X    else begin
  209. X`009flag := true;
  210. X`009getnam; freenam;
  211. X`009if not read_INTEGER(f,'SLOT%',slot) then flag := false;
  212. X`009if debug and (from > 0) then writeln('Reading exit ',
  213. X`009    nam.idents`091from`093,'/',direct`091slot`093);
  214. X`009
  215. X`009if not read_NAME(f,'TO%',T_NAM,I_ROOM,exitrec.toloc) then flag := false;
  216. X`009if not read_INTEGER(f,'KIND%',exitrec.kind) then flag := false;
  217. X`009if not read_INTEGER(f,'TOSLOT%',exitrec.slot) then flag := false;
  218. X
  219. X`009if not read_DESCLINE(f,exitrec.exitdesc) then flag := false;
  220. X`009if not read_BLOCK(f,exitrec.fail) then flag := false;
  221. X`009if not read_BLOCK(f,exitrec.success) then flag := false;
  222. X`009if READ_vers_102 then begin`009    `123 new for version 1.02 `125
  223. X`009    if not read_BLOCK(f,exitrec.goin) then flag := false;
  224. X`009end else begin
  225. X`009    exitrec.goin := 0;`009    `123 none `125
  226. X`009end;
  227. X
  228. X`009if not read_BLOCK(f,exitrec.comeout) then flag := false;
  229. X
  230. X`009if READ_vers_101 then begin`009`123 was wrong in version 1.00 !! `125
  231. X`009    if not read_BLOCK(f,exitrec.hidden) then flag := false;
  232. X`009end else begin
  233. X`009    if not read_INTEGER(f,'HIDDEN%',tmp) then flag := false;
  234. X`009    if tmp <> 0 then writeln('Warning: Bad hidden field of exit in dump
  235. V due bug in database version 1.00');
  236. X`009    exitrec.hidden := 0;
  237. X`009end;
  238. X`009if not read_NAME(f,'OBJREQ%',T_OBJNAM,I_OBJECT,exitrec.objreq) then flag
  239. V := false;
  240. X
  241. X`009if not read_ITEM(f,'ALIAS%',data) then flag := false;
  242. X`009exitrec.alias := data;
  243. X`009if not read_BOOLEAN(f,'REQVERB%',exitrec.reqverb) then flag := false;
  244. X`009if not read_BOOLEAN(f,'REQALIAS%',exitrec.reqalias) then flag := false;
  245. X`009if not read_BOOLEAN(f,'AUTOLOOK%',exitrec.autolook) then flag := false;
  246. X`009if not read_DESCLINE(f,exitrec.closed) then`032
  247. X`009    exitrec.closed := 0; `123 not used yet `125
  248. X`009
  249. X`009if not flag then begin
  250. X`009    if (from > 0) then writeln('Error in loading exit ',
  251. X`009`009nam.idents`091from`093,'/',direct`091slot`093)
  252. X`009    else writeln('Error in loading exit #',from:1,'/',direct`091slot`093
  253. V);
  254. X`009end;
  255. X`009read_EXIT := true;
  256. X    end;
  257. Xend;`032
  258. X
  259. X`123 SPELL `125
  260. X
  261. Xprocedure write_SPELL(var f: text; spell: integer);
  262. Xbegin
  263. X    if debug then writeln('Writing spell #',spell:1);
  264. X    write_NAME(f,'SPELL%',T_SPELL_NAME,spell);
  265. X    getint(N_SPELL); freeint;
  266. X    write_MDL(f,anint.int`091spell`093);
  267. Xend;
  268. X
  269. Xfunction read_SPELL(var f: text; var spell: integer): boolean;
  270. Xvar flag: boolean;
  271. X    j: integer;
  272. Xbegin
  273. X    if not read_NEWNAME(f,'SPELL%',T_SPELL_NAME,I_SPELL,spell) then
  274. X`009read_SPELL := false
  275. X    else if spell = 0 then begin
  276. X`009writeln('Empty/null spell name!');
  277. X`009read_MDL(f,j);
  278. X`009read_SPELL := true;
  279. X    end else begin
  280. X`009getspell_name;freespell_name;
  281. X`009if debug then writeln('Reading spell ',spell_name.idents`091spell`093);
  282. X`009flag := true;
  283. X`009if not read_MDL(f,j) then flag := false;
  284. X`009getint(N_SPELL);
  285. X`009anint.int`091spell`093 := j;
  286. X`009putint;
  287. X
  288. X`009if not flag then writeln('Error in reading spell ',spell_name.idents`091
  289. Vspell`093);
  290. X`009read_SPELL := true;
  291. X    end;
  292. Xend;
  293. X
  294. X`123 ROOM `125
  295. X
  296. Xprocedure write_ROOM(var f: text; id: integer);
  297. Xvar i: integer;
  298. Xbegin
  299. X    getroom(id); freeroom;
  300. X    if debug then writeln('Writing room ',here.nicename);
  301. X   `032
  302. X    write_NAME(f,'ROOM%',T_NAM,id);
  303. X    `123 dont't write locnum `125
  304. X    write_ITEM(f,'OWNER%',here.owner);
  305. X    write_ITEM(f,'NICENAME%',here.nicename);
  306. X    write_INTEGER(f,'NAMEPRINT%',here.nameprint);
  307. X
  308. X    write_BLOCK(f,here.primary);
  309. X    write_BLOCK(f,here.secondary);
  310. X    write_INTEGER(f,'WHICH%',here.which);
  311. X   `032
  312. X    write_NAME(f,'MAGICOBJ%',T_OBJNAM,here.magicobj);
  313. X    `123 don't write effects `125
  314. X    `123 don't write parm `125
  315. X   `032
  316. X    `123 write exits later `125
  317. X
  318. X    `123 don't write pile `125
  319. X    for i := 1 to maxobjs do if here.objs`091i`093 > 0 then begin
  320. X`009write_NAME(f,'OBJHERE%',T_OBJNAM,here.objs`091i`093);
  321. X`009write_INTEGER(f,'OBJHIDE%',here.objhide`091i`093);
  322. X    end;
  323. X
  324. X    `123 write objdrop later `125
  325. X
  326. X    write_DESCLINE(f,here.objdesc);
  327. X    write_DESCLINE(f,here.objdest);
  328. X   `032
  329. X    `123 write monsters later `125
  330. X   `032
  331. X    `123 write grploc1 later `125
  332. X    `123 write grploc2 later `125
  333. X    write_ITEM(f,'GRPNAM1%',here.grpnam1);
  334. X    write_ITEM(f,'GRPNAM2%',here.grpnam2);
  335. X
  336. X    for i := 1 to maxdetail do if here.detaildesc`091i`093 <> 0 then begin
  337. X`009write_ITEM(f,'DETAIL%',here.detail`091i`093);
  338. X`009write_BLOCK(f,here.detaildesc`091i`093);
  339. X    end;
  340. X
  341. X    write_INTEGER(f,'TRAPTO%',here.trapto); `123 exit numbers are same also
  342. X`009`009`009`009`009      in BUILDed database `125
  343. X    write_INTEGER(f,'TRAPCHANCE%',here.trapchance);
  344. X    write_DESCLINE(f,here.rndmsg);
  345. X    write_BLOCK(f,here.xmsg2);
  346. X    write_MDL(f,here.hook);
  347. X    `123 don't write exp3, exp4 `125
  348. X    write_BLOCK(f,here.exitfail);   `123 is this in use ? `125
  349. X    write_BLOCK(f,here.ofail);      `123 is this in use ? `125
  350. Xend;
  351. X
  352. Xfunction read_ROOM(var f: text; var id: integer): boolean;
  353. Xvar flag: boolean;
  354. X    data: string;
  355. X    i: integer;
  356. X    intdata: integer;
  357. Xbegin
  358. X    if not read_NEWNAME(f,'ROOM%',T_NAM,I_ROOM,id) then
  359. X`009read_ROOM := false
  360. X    else if id = 0 then begin`032
  361. X`009writeln('Empty/null room name!');
  362. X`009read_ITEM(f,'OWNER%',data);
  363. X`009read_ITEM(f,'NICENAME%',data);
  364. X`009writeln(' Name: ',data);
  365. X`009read_INTEGER(f,'NAMEPRINT%',i);
  366. X`009read_BLOCK(f,i);
  367. X`009read_BLOCK(f,i);
  368. X`009read_INTEGER(f,'WHICH%',i);
  369. X`009read_NAME(f,'MAGICOBJ%',T_OBJNAM,I_OBJECT,i);
  370. X`009while read_NAME(f,'OBJHERE%',T_OBJNAM,I_OBJECT,i) do begin
  371. X`009    read_INTEGER(f,'OBJHIDE%',i);
  372. X`009end;
  373. X`009read_DESCLINE(f,here.objdesc);
  374. X`009read_DESCLINE(f,i);
  375. X`009read_ITEM(f,'GRPNAM1%',data);
  376. X`009read_ITEM(f,'GRPNAM2%',data);
  377. X`009while read_ITEM(f,'DETAIL%',data) do begin
  378. X    `009    read_BLOCK(f,i);
  379. X`009end;
  380. X`009read_INTEGER(f,'TRAPTO%',i);
  381. X`009read_INTEGER(f,'TRAPCHANCE%',i);
  382. X`009read_DESCLINE(f,i);
  383. X`009read_BLOCK(f,i);
  384. X`009read_MDL(f,i);
  385. X`009read_BLOCK(f,i);
  386. X`009read_BLOCK(f,i);
  387. X`009read_ROOM := true;
  388. X    end else begin
  389. X`009getnam; freenam;
  390. X`009if debug then writeln('Reading room ',nam.idents`091id`093);
  391. X`009flag := true;
  392. X`009getroom(id);
  393. X`009if not read_ITEM(f,'OWNER%',data) then flag := false;
  394. X`009here.owner := data;
  395. X`009getown;`032
  396. X`009own.idents`091id`093 := data;  `123 update owner `125
  397. X`009putown;
  398. X`009if not read_ITEM(f,'NICENAME%',data) then flag := false;
  399. X`009here.nicename := data;
  400. X`009if not read_INTEGER(f,'NAMEPRINT%',here.nameprint) then flag := false;
  401. X
  402. X`009if not read_BLOCK(f,here.primary) then flag := false;
  403. X`009if not read_BLOCK(f,here.secondary) then flag := false;
  404. X`009if not read_INTEGER(f,'WHICH%',here.which) then flag := false;
  405. X
  406. X`009if not read_NAME(f,'MAGICOBJ%',T_OBJNAM,I_OBJECT,here.magicobj) then fla
  407. Vg := false;
  408. X
  409. X`009for i := 1 to maxobjs do begin
  410. X`009    here.objs`091i`093 := 0;
  411. X`009    here.objhide`091i`093 := 0;
  412. X`009end;
  413. X`009i := 1;
  414. X`009while read_NAME(f,'OBJHERE%',T_OBJNAM,I_OBJECT,intdata) do begin
  415. X`009    here.objs`091i`093 := intdata;
  416. X`009    if not read_INTEGER(f,'OBJHIDE%',here.objhide`091i`093) then flag :=
  417. V false;
  418. X
  419. X`009    getobj(here.objs`091i`093);  `032
  420. X`009    obj.numexist := obj.numexist + 1;   `123 Update counter `125
  421. X`009    putobj;
  422. X
  423. X`009    i := i+1;
  424. X`009end;
  425. X
  426. X`009if not read_DESCLINE(f,here.objdesc) then flag := false;
  427. X`009if not read_DESCLINE(f,here.objdest) then flag := false;
  428. X`009
  429. X`009for i := 1 to maxpeople do here.people`091i`093.kind := 0;
  430. X
  431. X`009if not read_ITEM(f,'GRPNAM1%',data) then flag := false;
  432. X`009here.grpnam1 := data;
  433. X`009if not read_ITEM(f,'GRPNAM2%',data) then flag := false;
  434. X`009here.grpnam2 := data;
  435. X
  436. X`009for i := 1 to maxdetail do begin
  437. X`009    here.detaildesc`091i`093 := 0;
  438. X`009    here.detail`091i`093 := '';
  439. X`009end;
  440. X
  441. X`009i := 1;
  442. X`009while read_ITEM(f,'DETAIL%',data) do begin
  443. X`009    here.detail`091i`093 := data;
  444. X`009    if not read_BLOCK(f,here.detaildesc`091i`093) then flag := false;
  445. X`009    i := i +1;
  446. X`009end;
  447. X
  448. X`009if not read_INTEGER(f,'TRAPTO%',here.trapto) then flag := false;
  449. X`009if not read_INTEGER(f,'TRAPCHANCE%',here.trapchance) then flag := false;
  450. X`009if not read_DESCLINE(f,here.rndmsg) then flag := false;
  451. X`009if not read_BLOCK(f,here.xmsg2) then flag := false;
  452. X`009if not read_MDL(f,here.hook) then flag := false;
  453. X`009if not read_BLOCK(f,here.exitfail) then flag := false;
  454. X`009if not read_BLOCK(f,here.ofail) then flag := false;
  455. X
  456. X`009putroom;
  457. X`009if not flag then writeln('Error in reading room ',here.nicename);
  458. X`009read_ROOM := true;
  459. X    end;
  460. Xend;
  461. X
  462. X`123 ROOM2 `125
  463. X
  464. Xprocedure write_ROOM2(var f: text; id: integer);
  465. Xvar i: integer;
  466. Xbegin
  467. X    getroom(id); freeroom;
  468. X    if debug then writeln('Writing room ',here.nicename);
  469. X    write_NAME(f,'ROOM2%',T_NAM,id);
  470. X    for i := 1 to maxexit do write_EXIT(f,id,i,here.exits`091i`093);
  471. X    write_NAME(f,'OBJDROP%',T_NAM,here.objdrop);
  472. X    write_NAME(f,'GRPLOC1%',T_NAM,here.grploc1);
  473. X    write_NAME(f,'GRPLOC2%',T_NAM,here.grploc2);
  474. X
  475. X    for i := 1 to maxpeople do if here.people`091i`093.kind = P_MONSTER then
  476. X`009write_MONSTER(f,here.people`091i`093);
  477. X
  478. Xend;`032
  479. X
  480. Xfunction read_ROOM2(var f: text; var id: integer): boolean;
  481. Xvar i,j,k: integer;
  482. X    flag : boolean;
  483. X    tmp: exit;
  484. X    tmp2: peoplerec;
  485. X    ownerid: integer;
  486. Xbegin
  487. X    if not read_NAME(f,'ROOM2%',T_NAM,I_ROOM,id) then
  488. X`009read_ROOM2 := false
  489. X    else if id = 0 then begin
  490. X`009writeln('Empty/null/unknown room name!');
  491. X
  492. X`009for i := 1 to maxexit do begin
  493. X`009    read_EXIT(f,j,k,tmp);
  494. X`009end;
  495. X`009read_NAME(f,'OBJDROP%',T_NAM,I_ROOM,i);
  496. X`009read_NAME(f,'GRPLOC1%',T_NAM,I_ROOM,i);
  497. X`009read_NAME(f,'GRPLOC2%',T_NAM,I_ROOM,i);
  498. X
  499. X`009while read_MONSTER(f,tmp2) do;
  500. X`009read_ROOM2 := true;
  501. X    end else begin
  502. X`009getroom(id);
  503. X`009if debug then writeln('Reading room ',here.nicename);
  504. X`009flag := true;
  505. X
  506. X`009getuser; freeuser; getindex(I_PLAYER); freeindex;
  507. X`009ownerid := 0;
  508. X`009for i := 1 to indx.top do if not indx.free`091i`093 then
  509. X`009    if user.idents`091i`093 = here.owner then ownerid := i;
  510. X
  511. X`009for i := 1 to maxexit do begin
  512. X`009    if not read_EXIT(f,j,k,here.exits`091i`093) then flag := false;
  513. X`009    if j <> id then flag := false;
  514. X`009    if k <> i then flag := false;
  515. X`009end;
  516. X
  517. X`009change_owner(0,ownerid); `123 update owner's counters `125
  518. X
  519. X`009if not read_NAME(f,'OBJDROP%',T_NAM,I_ROOM,here.objdrop) then flag := fa
  520. Vlse;
  521. X`009if not read_NAME(f,'GRPLOC1%',T_NAM,I_ROOM,here.grploc1) then flag := fa
  522. Vlse;
  523. X`009if not read_NAME(f,'GRPLOC2%',T_NAM,I_ROOM,here.grploc2) then flag := fa
  524. Vlse;
  525. X
  526. X`009i := 1;
  527. X`009while read_MONSTER(f,tmp2) do begin
  528. X`009    here.people`091i`093 := tmp2;
  529. X`009    i := i+1;
  530. X`009end;
  531. X`009
  532. X`009putroom;
  533. X`009if not flag then writeln('Error in reading room ',here.nicename);
  534. X`009read_ROOM2 := true;
  535. X    end;
  536. Xend;
  537. X
  538. X`123 GVAL `125
  539. Xprocedure write_GVAL(var f: text; id: integer);
  540. Xbegin
  541. X    if debug then writeln('Writing global #',id);
  542. X    write_INTEGER(f,'GLOBAL%',id);
  543. X    getglobal; freeglobal;
  544. X    case GF_Types`091id`093 of
  545. X`009G_Flag: write_BOOLEAN(f,'GBOOL%',global.int`091id`093 > 0);
  546. X`009G_Int:  write_INTEGER(f,'GINT%',global.int`091id`093);
  547. X`009G_Text: write_BLOCK(f,global.int`091id`093);
  548. X`009G_Code: write_MDL(f,global.int`091id`093);
  549. X    end; `123 cases `125
  550. Xend;
  551. X
  552. Xfunction read_GVAL(var f: text; var id: integer): boolean;
  553. Xvar flag: boolean;
  554. X    tmp: boolean;
  555. Xbegin
  556. X    if not read_INTEGER(f,'GLOBAL%',id) then
  557. X`009read_GVAL := false
  558. X    else begin
  559. X`009if debug then writeln('Reading global #',id:1);
  560. X`009getglobal;
  561. X`009case Gf_Types`091id`093 of
  562. X`009    g_flag: begin
  563. X`009`009flag := read_BOOLEAN(f,'GBOOL%',tmp);
  564. X`009`009if tmp then global.int`091id`093 := 1 else global.int`091id`093 := 0
  565. V;
  566. X`009    end;
  567. X`009    G_Int: flag := read_INTEGER(f,'GINT%',global.int`091id`093);
  568. X`009    G_text: flag := read_BLOCK(f,global.int`091id`093);
  569. X`009    G_Code: flag := read_MDL(f,global.int`091id`093);
  570. X`009end `123 cases `125;
  571. X`009putglobal;
  572. X
  573. X`009if not flag then writeln('Error in reading global #',id);
  574. X`009read_GVAL := true;
  575. X    end;
  576. Xend;
  577. X
  578. X`123 DATABASE `125
  579. X
  580. Xprocedure write_DATABASE(var f: text);
  581. Xvar block_use,
  582. X    line_use,
  583. X    room_use,
  584. X    object_use,
  585. X    header_use: integer;
  586. X    tmp: indexrec;
  587. X    i: integer;
  588. Xbegin
  589. X    writeln('Database writing to ',dump_file,' started.');
  590. X    write_ITEM(f,'DATABASE%',VERSION);
  591. X    write_ITEM(f,'BY%',userid);
  592. X
  593. X    getindex(I_BLOCK); freeindex; block_use := indx.inuse;
  594. X    getindex(I_LINE); freeindex; line_use := indx.inuse;
  595. X    getindex(I_ROOM); freeindex; room_use := indx.inuse;
  596. X    getindex(I_OBJECT); freeindex; object_use := indx.inuse;
  597. X    getindex(I_HEADER); freeindex; header_use := indx.inuse;
  598. X
  599. X    writeln('Block descriptions: ',block_use:3);
  600. X    writeln('Line descriptions:  ',line_use:3);
  601. X    writeln('Rooms:              ',room_use:3);
  602. X    writeln('Objects:            ',object_use:3);
  603. X    writeln('MDL codes:          ',header_use:3);
  604. X
  605. X    write_INTEGER(f,'BLOCKCOUNT%',block_use);
  606. X    write_INTEGER(f,'LINECOUNT%',line_use);
  607. X    write_INTEGER(f,'ROOMCOUNT%',room_use);
  608. X    write_INTEGER(f,'OBJECTCOUNT%',object_use);
  609. X    write_INTEGER(f,'HEADERCOUNT%',header_use);
  610. X
  611. X    writeln('Writing spells');
  612. X    getindex(I_SPELL); freeindex; tmp := indx;
  613. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_SPELL(f,i);
  614. X
  615. X    writeln('Writing objects, pass 1');
  616. X    getindex(I_OBJECT); freeindex; tmp := indx;
  617. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_OBJECT(f,i)
  618. V;
  619. X
  620. X    writeln('Writing rooms, pass 1');
  621. X    getindex(I_ROOM); freeindex; tmp := indx;
  622. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_ROOM(f,i);
  623. X
  624. X    writeln('Writing players');
  625. X    getindex(i_PLAYER); freeindex; tmp := indx;
  626. X    getuser; freeuser;
  627. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_PLAYER(f,i)
  628. V;
  629. X
  630. X    writeln('Writing objects, pass 2');
  631. X    getindex(I_OBJECT); freeindex; tmp := indx;
  632. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_OBJECT2(f,i
  633. V);
  634. X
  635. X    writeln('Writing rooms, pass 2');
  636. X    getindex(I_ROOM); freeindex; tmp := indx;
  637. X    for i := 1 to tmp.top do if not tmp.free`091i`093 then write_ROOM2(f,i);
  638. X
  639. X    writeln('Writing global data');
  640. X    for i := 1 to GF_max do write_GVAL(f,i);
  641. X
  642. Xend;
  643. X
  644. Xprocedure read_DATABASE(var f: text);
  645. Xlabel loppu;
  646. Xvar block_use,
  647. X    line_use,
  648. X    room_use,
  649. X    object_use,
  650. X    header_use: integer;
  651. X    tmp: indexrec;
  652. X    i,j: integer;
  653. X    ver,user: string;
  654. X    error: boolean;
  655. Xbegin
  656. X    writeln('Database reading from ',dump_file,' started.');
  657. X    error := false;
  658. X    if not read_ITEM(f,'DATABASE%',ver) then begin
  659. X`009error := true;
  660. X`009goto loppu;
  661. X    end;
  662. X    if not read_ITEM(f,'BY%',user) then begin
  663. X`009error := true;
  664. X`009goto loppu;
  665. X    end;
  666. X    writeln('Database (version ',ver,') written by ',user);
  667. X
  668. X    READ_vers_101 := ver >= '1.01';
  669. X    READ_vers_102 := ver >= '1.02';
  670. X    if (ver > VERSION) then writeln('Unknown version!');
  671. X
  672. X    if not read_INTEGER(f,'BLOCKCOUNT%',block_use) then begin
  673. X`009error := true;
  674. X`009goto loppu;
  675. X    end;
  676. X    if not read_INTEGER(f,'LINECOUNT%',line_use) then begin
  677. X`009error := true;
  678. X`009goto loppu;
  679. X    end;
  680. X    if not read_INTEGER(f,'ROOMCOUNT%',room_use) then begin
  681. X`009error := true;
  682. X`009goto loppu;
  683. X    end;
  684. X    if not read_INTEGER(f,'OBJECTCOUNT%',object_use) then begin
  685. X`009error := true;
  686. X`009goto loppu;
  687. X    end;
  688. X    if not read_INTEGER(f,'HEADERCOUNT%',header_use) then begin
  689. X`009error := true;
  690. X`009goto loppu;
  691. X    end;
  692. X    writeln('Block descriptions: ',block_use:3);
  693. X    writeln('Line descriptions:  ',line_use:3);
  694. X    writeln('Rooms:              ',room_use:3);
  695. X    writeln('Objects:            ',object_use:3);
  696. X    writeln('MDL codes:          ',header_use:3);
  697. X
  698. X    mylog := 0;
  699. X    writeln('Creating index file 1-10');
  700. X    for i := 1 to 10 do begin
  701. X`009`009`009`123 1 is blocklist
  702. X`009`009`009  2 is linelist
  703. X`009`009`009  3 is roomlist
  704. X`009`009`009  4 is playeralloc
  705. X`009`009`009  5 is player awake (playing game)
  706. X`009`009`009  6 are objects
  707. X`009`009`009  7 is intfile`032
  708. X`009`009`009  8 is headerfile
  709. X`009`009`009  9 is ???
  710. X`009`009`009  10 is spells
  711. X`009`009`009`125
  712. X
  713. X`009`009locate(indexfile,i);
  714. X`009`009for j := 1 to maxindex do
  715. X`009`009`009indexfile`094.free`091j`093 := true;
  716. X`009`009indexfile`094.indexnum := i;
  717. X`009`009indexfile`094.top := 0; `123 none of each to start `125
  718. X`009`009indexfile`094.inuse := 0;
  719. X`009`009put(indexfile);
  720. X    end;
  721. X         `032
  722. X    writeln('Initializing roomfile with ',room_use:1,' rooms');
  723. X    addrooms(room_use);
  724. X
  725. X    writeln('Initializing block file with ',block_use:1,' description blocks
  726. V');
  727. X    addblocks(block_use);
  728. X
  729. X    writeln('Initializing line file with ',line_use:1,' lines');
  730. X    addlines(line_use);
  731. X
  732. X    writeln('Initializing object file with ',object_use:1,' objects');
  733. X    addobjects(object_use);  `032
  734. X
  735. X    writeln('Initializing header file for monsters with ',header_use:1,' hea
  736. Vders');
  737. X    addheaders(header_use);
  738. X
  739. X    writeln('Initializing namfile 1-',T_MAX:1);
  740. X    for j := 1 to T_MAX do begin
  741. X`009`009locate(namfile,j);
  742. X`009`009namfile`094.validate := j;
  743. X`009`009namfile`094.loctop := 0;
  744. X`009`009for i := 1 to maxroom do begin
  745. X`009`009`009namfile`094.idents`091i`093 := '';
  746. X`009`009end;
  747. X`009`009put(namfile);
  748. X    end;
  749. X
  750. X    writeln('Initializing eventfile');
  751. X    for i := 1 to numevnts + 1 do begin
  752. X`009`009locate(eventfile,i);
  753. X`009`009eventfile`094.validat := i;
  754. X`009`009eventfile`094.point := 1;
  755. X`009`009put(eventfile);
  756. X    end;
  757. X
  758. X    writeln('Initializing intfile'); `123 minor changes by leino@finuha, `12
  759. V5
  760. X    for i := 1 to 10 do begin`009`123 hurtta@finuh `125
  761. X`009`009locate(intfile,i);
  762. X `009`009intfile`094.intnum := i;
  763. X`009`009put(intfile);
  764. X    end;
  765. X
  766. X    getindex(I_INT);
  767. X    for i := 1 to 10 do
  768. X`009`009indx.free`091i`093 := false;
  769. X    indx.top := 10;
  770. X    indx.inuse := 10;
  771. X    putindex;
  772. X
  773. X    writeln('Initializing global values.'); `123 Record #10 in intfile `125
  774. X    getglobal;
  775. X    for I := 1 to GF_MAX do global.int`091i`093 := 0;
  776. X    putglobal;
  777. X
  778. X`009`123 Player log records should have all their slots initially,
  779. X`009  they don't have to be allocated because they use namrec
  780. X`009  and intfile for their storage; they don't have their own
  781. X`009  file to allocate
  782. X`009`125
  783. X    getindex(I_PLAYER);
  784. X    indx.top := maxplayers;
  785. X    putindex;  `032
  786. X    getindex(I_ASLEEP);
  787. X    indx.top := maxplayers;
  788. X    putindex;
  789. X
  790. X    `123 spells have constant amount `125
  791. X    getindex(I_SPELL);
  792. X    indx.top := maxspells;
  793. X    putindex;
  794. X
  795. X    writeln('Reading spells');
  796. X    j := 0;
  797. X    while read_SPELL(f,i) do j := j +1;
  798. X    writeln(j:3,' spells readed.');
  799. X   `032
  800. X    writeln('Reading objects, pass 1');
  801. X    j := 0;
  802. X    while read_OBJECT(f,i) do j := j +1;
  803. X    writeln(j:3,' objects readed.');
  804. X
  805. X
  806. X    writeln('Reading rooms, pass 1');
  807. X    j := 0;
  808. X    while read_ROOM(f,i) do j := j +1;
  809. X    writeln(j:3,' rooms readed.');
  810. X
  811. X    writeln('Reading players');
  812. X    j := 0;
  813. X    while read_PLAYER(f,i) do j := j + 1;
  814. X    writeln(j:3,' players readed.');
  815. X
  816. X    writeln('Reading objects, pass 2');`032
  817. X    j := 0;
  818. X    while read_OBJECT2(f,i) do j := j +1;
  819. X    writeln(j:3,' objects readed.');
  820. X
  821. X    writeln('Reading rooms, pass 2');
  822. X    j := 0;
  823. X    while read_ROOM2(f,i) do j := j +1;
  824. X    writeln(j:3,' rooms readed.');
  825. X
  826. X    writeln('Reading global data');
  827. X    j := 0;
  828. X    while read_GVAL(f,i) do j := j +1;
  829. X    writeln(j:3,' global data readed.');
  830. X
  831. Xloppu:
  832. X    if error then writeln('Dump file is invalid.');
  833. Xend;
  834. X
  835. Xvar play,exist: indexrec;
  836. X    userid: `091global`093 veryshortstring;`009`123 userid of this player `1
  837. V25
  838. X
  839. X    public_id, disowned_id, system_id: shortstring;
  840. X
  841. X    active: boolean;`032
  842. X
  843. X    dump: text;
  844. X
  845. XBEGIN
  846. X    Get_Environment;
  847. X
  848. X    if not lookup_class(system_id,'system') then
  849. X`009writeln('%error in main program: system');
  850. X    if not lookup_class(public_id,'public') then
  851. X`009writeln('%error in main program: public');
  852. X    if not lookup_class(disowned_id,'disowned') then
  853. X`009writeln('%error in main program: disowned');
  854. X
  855. X    Setup_Guts;
  856. X    userid := lowcase(get_userid);
  857. X    wizard := userid = MM_userid;
  858. X    Params;
  859. X
  860. X    if open_database(false) then begin
  861. X`009if dump_system then begin
  862. X`009    open(dump,dump_file,new,default := '.DMP');
  863. X`009    rewrite(dump);
  864. X`009    write_DATABASE(dump);
  865. X`009    close(dump);
  866. X`009end;
  867. X
  868. X`009if build_system then begin
  869. X`009    open(dump,dump_file,readonly,default := '.DMP');
  870. X`009    reset(dump);
  871. X`009    read_DATABASE(dump);
  872. X`009    close(dump);
  873. X`009end;
  874. X
  875. X`009close_database;
  876. X    end else writeln ('Can''t open database. Maybe someone is playing Monste
  877. Vr.');
  878. X
  879. X    Finish_Guts;
  880. XEND.
  881. X
  882. $ CALL UNPACK MONSTER_DUMP.PAS;194 880298139
  883. $ create/nolog 'f'
  884. X1 MONSTER
  885. X  Monster, a multiplayer adventure game where the players create the`032
  886. X  world and make the rules.
  887. X
  888. X  Command: MONSTER/qualifiers `091dump_file`093
  889. X
  890. X2 Parameters
  891. X
  892. X dump_file
  893. X `032
  894. X  Only with /DUMP or /BUILD -qualifiers.
  895. X
  896. X  This paramter specifies text form equivalant of database.  Default`032
  897. X  extension is .DMP.  This parameter required with /DUMP and  /BUILD`032
  898. X  -qualifiers.
  899. X
  900. X2 General_Qualifiers
  901. X
  902. X/VERSION
  903. X /VERSION
  904. X  Show version text of Monster.  Version -command  shows  same  text`032
  905. X  when playing Monster.
  906. X
  907. X  Incombatible with /WHO.
  908. X
  909. X/START
  910. X /START
  911. X /NOSTART
  912. X  Prevents or enables start  of  playing  after  handling  of  other`032
  913. X  qualifiers. Usefull with /VERSION or qualifiers for management.
  914. X
  915. X  Incombatible with /WHO, /DUMP and /BUILD.
  916. X
  917. X/OUTPUT
  918. X /OUTPUT`091=output-file-spec`093
  919. X /NOOUTPUT
  920. X  Redirects Monster's output  to  file.  Usefull  with  /VERSION  or`032
  921. X  qualifiers  for management.
  922. X
  923. X  Incombatible with /FIX, /WHO, /DUMP and /BUILD.
  924. X
  925. X2 Management_Qualifiers
  926. X
  927. X  These qualifeirs is only for Monster Manager.
  928. X
  929. X/REBUILD
  930. X /REBUILD
  931. X  Build new database for  monster.  Check  before  this  entries  of`032
  932. X  MONSTER.INIT -file.
  933. X
  934. X  Incombatible with /FIX, /REAL_USERID, /USERID, /BATCH, /WHO, /DUMP
  935. X  and /BUILD.
  936. X
  937. X/FIX
  938. X /FIX
  939. X  Activate  /FIX -system  in  interactive  mode.  With  this  system`032
  940. X  Monster Manager can fixs errors of database.
  941. X
  942. X  Incombatible with /OUTPUT, /REBUILD, /REAL_USERID, /USERID, /BATCH,`032
  943. X  /WHO, /DUMP and /BUILD.
  944. X
  945. X  Look Fixing_Database.
  946. X
  947. X/DEBUG
  948. X /DEBUG
  949. X /NODEBUG (D)
  950. X  Turn debug mode on or off. Same as  debug  -command  when  playing`032
  951. X  Monster.
  952. X
  953. X  Incombatible with /WHO.
  954. X
  955. X/REAL_USERID
  956. X /REAL_USERID
  957. X  Enable playing with someone other's name.
  958. X
  959. X  Incombatible with /REBUILD, /FIX, /USERID, /BATCH, /WHO, /DUMP and`032
  960. X  /BUILD.
  961. X
  962. X/BATCH
  963. X /BATCH=command-file-spec
  964. X  Runs /FIX -system in batch mode.`032
  965. X
  966. X  Incombatible with /REBUILD, /FIX,  /REAL_USERID,  /USERID, /BATCH,`032
  967. X  /WHO, /DUMP and /BUILD.
  968. X
  969. X/BUILD
  970. X /BUILD
  971. X  Same as /REBUILD, except that this read database from special text`032
  972. X  file. Parameter dump_file is required with this qualifier.
  973. X
  974. X  Look also /DUMP.
  975. X
  976. X  Incombatible with /REBUILD, /FIX, /REAL_USERID,  /USERID,  /BATCH,`032
  977. X  /BUILD, /OUTPUT and /START.
  978. X
  979. X/DUMP
  980. X  /DUMP
  981. X   Make text form copy of database for /BUILDing. Parameter dump_file
  982. X   is required with this qualifier.
  983. X
  984. X  Incombatible with /REBUILD, /FIX, /REAL_USERID,  /USERID,  /BATCH,`032
  985. X  /DUMP, /OUTPUT and /START.
  986. X
  987. X2 Playing_Qualifiers
  988. X
  989. X/USERID
  990. X /USERID=virtual_userid
  991. X  Enable playing with virtual userid. Virtual userids is indebendent`032
  992. X  of real userids. Virtual userids is protected with password.`032
  993. X
  994. X  Incombatible with   /REBUILD,  /FIX,  /REAL_USERID,  /BATCH,  /WHO,`032
  995. X  /DUMP and /BUILD.
  996. X
  997. X/WHO
  998. X /WHO
  999. X  Shows players what is currently  playing Monster,  but  not  start`032
  1000. X  Monster. Good for LOGIN.COM.
  1001. X
  1002. X  Incombatible with all other qualifiers.
  1003. X
  1004. X2 Initialization_file
  1005. X
  1006. X  Monster read file MONSTER.INIT from directory where is  executable`032
  1007. X  monster program. Monster gets directory from  process'  image_name`032
  1008. X  entry. There is follow entries:
  1009. X
  1010. X3 MM_userid
  1011. X
  1012. X  This entry include userid  of  Monster  Manager.  Userid  must  be`032
  1013. X  written by lowercase. The Monster Manager has the most power. This`032
  1014. X  should be the game administrator.`032
  1015. X
  1016. X4 Example
  1017. XMM_userid: leino
  1018. X
  1019. X3 gen_debug
  1020. X  This tells whether everyone may use the debug command.  It must be`032
  1021. X  able to be disabled  because  it  tells  players  too  much  about`032
  1022. X  monsters.  On the other hand, it must also be able to be  enabled,`032
  1023. X  if we want to do test runs under an unprivileged userid.
  1024. X
  1025. X4 Example
  1026. Xgen_debug:   false
  1027. X
  1028. X3 REBUILD_OK
  1029. X  If this is true,  the Monster Manager can blow away  and  reformat`032
  1030. X  the entire universe.  It's a good idea to set this to false.  This`032
  1031. X  must be true when Monster Manager want use /REBUILD option.
  1032. X
  1033. X4 Example
  1034. XREBUILD_OK: false
  1035. X
  1036. X3 root
  1037. X  This is where the Monster database goes. The root directory must be `032
  1038. X  world:e and the datafiles Monster creates in it world:rw for people`032
  1039. X  to be able to play.
  1040. X
  1041. X4 Example
  1042. Xroot:    games_disk:monster.database.db>`009`009`032
  1043. X
  1044. X3 coderoot
  1045. X  The  coderoot  directory  is  where  the codefiles for monsters  go.`032
  1046. X  The directory must additionally have  an  ACL  default world:rw  for `032
  1047. X  files  and ACL rw for the managers.
  1048. X
  1049. X4 Example
  1050. Xcoderoot:games_disk:<monster.database.c>  `032
  1051. X
  1052. X3 LEVELTABLE
  1053. X  Leveltable tells levels of  Monster.  There  is  certain  privileges`032
  1054. X  associateden to levels.  Higger level there is Monster Manager  (not`032
  1055. X  in leveltable).
  1056. X
  1057. X4 Privileges
  1058. X  Value    Name      Meaning`032
  1059. X  32       Monster   Can create Mosters what can modify player's contex.
  1060. X  16       Special   Can make special items
  1061. X  256      Spell     Can create spells what can modify player's contex.
  1062. X  4        Global    Can modify global describtions and flags.
  1063. X  8        Owner     Can customize other's stuff as owner of stuff.
  1064. X  64       Experince Can make MDL code, what give score to players.
  1065. X  1        Manager   Can execute system -command.
  1066. X
  1067. X4 Example
  1068. XLEVELTABLE:
  1069. X!  name`009`009    exp`009         priv`009 health`009   h.fac    pow    hid
  1070. Vden`032
  1071. XBeginner,           0,           0,      10,       40,      0,     nohidden
  1072. XNovice,             1,           0,      10,       40,      2,     nohidden
  1073. XRanger,             500,         0,      15,       50,      3,     nohidden
  1074. XAdventurer,         1000,        0,      20,       60,      5,     nohidden
  1075. XHero,               2000,        32,     30,       60,      10,    nohidden
  1076. XChampion,           6000,        0,      40,       70,      10,    nohidden
  1077. XConjurer,           12000,       16,     50,       70,      12,    nohidden
  1078. XMagician,           20000,       0,      60,       70,      15,    nohidden
  1079. XEnchanter,          40000,       2,      80,       75,      20,    nohidden
  1080. XSorcerer,           70000,       256,      100,      80,      20,    nohidde
  1081. Vn
  1082. XWarlock,            120000,      4,      120,      85,      35,    nohidden
  1083. XApprentice wizard,  300000,      8,      150,      85,      50,    nohidden
  1084. XWizard,             700000,      64,     300,      90,      80,    nohidden
  1085. XAlmost Dead,        1000100,     0,      10,       40,      2,     hidden
  1086. XManager,            2000000,     1,      500,      100,     500,   hidden
  1087. XDruid,              2001000,     0,      500,      100,     500,   hidden
  1088. XCharlatan,          2008000,     0,      500,      100,     500,   hidden
  1089. XWanderer,           2009000,     0,      500,      100,     500,   hidden
  1090. XChief Architect,    3000000,     0,      500,      100,     500,   hidden
  1091. XBug Hunter,         5000000,     0,      500,      100,     500,   hidden
  1092. XEND OF LEVELTABLE
  1093. X
  1094. X3 Archpriv
  1095. X  Experience entry for Monster Manager. Level of Monster manager isn't`032
  1096. X  in leveltable.
  1097. X
  1098. X4 Example
  1099. XArchpriv:   0
  1100. X
  1101. X3 Archhealth
  1102. X  Health entry for Monster Manager.
  1103. X
  1104. X4 Example
  1105. XArchhealth: 800
  1106. X
  1107. X3 Archfactor
  1108. X  Hit factor for Monster Manager.
  1109. X
  1110. X4 Example
  1111. XArchfactor: 100
  1112. X
  1113. X3 Archpower
  1114. X  Power entry for Monster Manager.
  1115. X
  1116. X4 Example
  1117. XArchpower:  1000
  1118. X
  1119. X3 maxexperience
  1120. X  Maximun experience what player can reach.  Notice that experience of`032
  1121. X  Monster manager is MAXINT.
  1122. X
  1123. X4 Example
  1124. Xmaxexperience: 1000000
  1125. X
  1126. X3 protect_exp
  1127. X  When player reach this experince, player is deadless.
  1128. X
  1129. X4 Example
  1130. Xprotect_exp: 700000
  1131. X
  1132. X3 Playtime
  1133. X  Tells time when Monster is playable in workdays.  Mark +  mean  that
  1134. X  monster is playable and mark - mean that monster isn't. First mark is
  1135. X  time from 00 to 01 and last mark is time from 23 to 24.
  1136. X
  1137. X4 Example
  1138. XPlaytime: +++++++++--------+++++++
  1139. X
  1140. X3 default_allow
  1141. X  How many rooms players made at default.
  1142. X
  1143. X4 Example
  1144. Xdefault_allow: 20
  1145. X
  1146. X3 min_room
  1147. X  How many rooms players can made without exit request.
  1148. X
  1149. X4 Example
  1150. Xmin_room:      5
  1151. X
  1152. X3 min_accept
  1153. X  How many accepts must players made.
  1154. X
  1155. X4 Example
  1156. Xmin_accept:    5
  1157. X
  1158. X2 Installation
  1159. X  For installing Monster your must make several  directories,  compile`032
  1160. X  Monster, put files to right directories,  edit configurion files and`032
  1161. X  build database for Monster.`032
  1162. X
  1163. X3 Directories
  1164. X  Make four directories:
  1165. X    Directory for sources, lets CALL it SOURCES directory.
  1166. X    Directory for MONSTER.EXE and MONSTER_WHO.EXE, lets call it  IMAGE`032
  1167. X      directory.
  1168. X    Directory for *.MON files, lets call it DATABASE_MON directory.
  1169. X    Directory for CODE*.MON files, lets call it DATABASE_CODE directory.
  1170. X
  1171. X4 SOURCE
  1172. X  Files: CLI.PAS, CONVERT.BATCH, CUSTOM.PAS, DATABASE.PAS,  FIX.BATCH,`032
  1173. X  GLOBAL.PAS, GUTS.PAS, INTERPRETER.PAS, KEYS.PAS, MAKEFILE.  MON.PAS,
  1174. X  MONSTER_WHO.PAS, PARSER.PAS, PRIVUSERS.PAS, QUEUE.PAS, MONSTER_E.HLP,
  1175. X  MONSTER_DUMP.PAS.
  1176. X
  1177. X4 IMAGE
  1178. X  Files: MONSTER.CLD, MONSTER.INIT.
  1179. X
  1180. X  Compiled Files: MON.EXE, MONSTER_WHO.EXE, MONSTER_E.HLB,`032
  1181. X  MONSTER_DUMP.EXE.
  1182. X
  1183. X4 DATABASE_MON
  1184. X  Files: COMMANDS.PAPER, ILMOITUS.TXT, MONSTER.HELP.
  1185. X
  1186. X  Files created by /REBUILD: DESC.MON, EVENTS.MON, HEADER.MON, INDEX.MON,
  1187. X  INTFILE.MON, LINE.MON, NAMS.MON, OBJECTS.MON, ROOMS.MON, SPELLS.MON.
  1188. X
  1189. X4 DATABASE_CODE
  1190. X  Files created by /REBUILD: CODE1.MON, CODE2.MON, CODE3.MON, CODE4.MON,
  1191. X  CODE5.MON.
  1192. X
  1193. X  Command H (Add header blocks) in System menu adds number of files in
  1194. X  this directory!
  1195. X
  1196. X3 Compilation
  1197. X  First: Edit KEYS.PAS (change gryp-keys !!)
  1198. X
  1199. X  Commands for compilation:
  1200. X$ LIBRARIAN/CREATE/HELP MONSTER_E MONSTER_E
  1201. X$ PASCAL /CHECK=ALL GLOBAL`009`009
  1202. X$ PASCAL GUTS/CHECK=ALL
  1203. X$ PASCAL /CHECK=ALL DATABASE`009`009
  1204. X$ PASCAL  CLI
  1205. X$ PASCAL  PRIVUSERS / CHECK = ALL
  1206. X$ PASCAL /CHECK=ALL PARSER `009`009
  1207. X$ PASCAL /CHECK=ALL QUEUE `009`009
  1208. X$ PASCAL /CHECK=ALL INTERPRETER `009`009
  1209. X$ PASCAL  KEYS /CHECK = ALL`009
  1210. X$ PASCAL /CHECK=ALL MON`009`009`009
  1211. X$ LINK MON,GUTS,INTERPRETER,KEYS,PRIVUSERS,QUEUE,PARSER,CLI,GLOBAL,DATABASE,
  1212. VCUSTOM`009! Linkkaus
  1213. X$ PASCAL /CHECK=ALL MONSTER_WHO
  1214. X$ LINK MONSTER_WHO, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER
  1215. X$ PASCAL /CHECK=ALL MONSTER_DUMP
  1216. X$ LINK MONSTER_DUMP, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER
  1217. X
  1218. X  Put MON.EXE, MONSTER_WHO.EXE, MONSTER_DUMP.EXE and MONSTER_E.HLB`032
  1219. X  to IMAGE directory.
  1220. X
  1221. X3 Editing
  1222. X
  1223. X  Edit follow files: KEYS.PAS, MONSTER.CLD, MONSTER.INIT and ILMOITUS.TXT.
  1224. X  Edit KEYS.PAS before compilating Monster !
  1225. X
  1226. X4 KEYS.PAS
  1227. X
  1228. X  Edit keys array.  You can chage number of lines of keys -array,  but`032
  1229. X  you can't change length of lines of keys -array. Put number of lines
  1230. X  to maxkeys -const.
  1231. X
  1232. X4 MONSTER.CLD
  1233. X   Put right full specification of IMAGE directory to follow places:
  1234. X
  1235. Xdefine syntax MONSTER_WHO
  1236. X   image <IMAGE -directory>monster_who
  1237. X   noqualifiers
  1238. Xdefine verb MONSTER
  1239. X   image <IMAGE -directory>mon
  1240. X   qualifier WHO
  1241. X      nonnegatable
  1242. X      syntax = MONSTER_WHO
  1243. X4 MONSTER.INIT
  1244. X  Edit places marked with <> -marks:
  1245. X
  1246. XMM_userid: <your userid in lowcase>
  1247. X
  1248. Xgen_debug:   false
  1249. X
  1250. XREBUILD_OK: <put this true before /REBUILD and then false>
  1251. X
  1252. Xroot:     <full specificaton of DATABASE_MON -directory>
  1253. Xcoderoot: <full specification of DATABASE_CODE -direcory>
  1254. X      `032
  1255. XLEVELTABLE:
  1256. X* Leveltable removed: looke example from initialization_file -part of`032
  1257. X  this help *
  1258. XEND OF LEVELTABLE
  1259. XArchpriv:   0
  1260. XArchhealth: 800
  1261. XArchfactor: 100
  1262. XArchpower:  1000
  1263. X
  1264. Xmaxexperience: 1000000
  1265. X
  1266. Xprotect_exp: 700000
  1267. X
  1268. XPlaytime: <put right time to this: look example from initilization_file`032
  1269. X           -part of this help>
  1270. X
  1271. Xdefault_allow: 20   `032
  1272. Xmin_room:      5    `032
  1273. Xmin_accept:    5   `032
  1274. X4 ILMOITUS.TXT
  1275. X  Monster print this file,  when Monster isn't playable in work  hours.
  1276. X  Work hours are in Playtime -line in MONSTER.INIT.
  1277. X
  1278. X3 Protection
  1279. X  Put follows ACls to DATABASE_MON and DATABASE_CODE directories`032
  1280. X  (to *.DIR file).
  1281. X          (IDENTIFIER=<your name>,ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
  1282. X          (IDENTIFIER=<your name>,OPTIONS=DEFAULT,ACCESS=READ+WRITE+EXECUTE+
  1283. VDELETE+CONTROL)
  1284. X          (DEFAULT_PROTECTION,SYSTEM:RWED,OWNER:RWED,GROUP,WORLD:RW)
  1285. X
  1286. X  Put same kind ACL for all other managers (of monster) to DATABASE_CODE`032
  1287. X  directory.
  1288. X
  1289. X  Put protection (world:execute) or (world:read+execute) to`032
  1290. X                IMAGE, DATABASE_MON and DATABASE_CODE directory
  1291. X
  1292. X  Put protection (world:read) to`032
  1293. X        ILMOITUS.TXT, MONSTER.CLD, MONSTER.INIT, MONSTER_E.HLB,
  1294. X        and MONSTER.HELP files.
  1295. X       `032
  1296. X  Put protection (world:execute) to`032
  1297. X        MON.EXE and MONSTER_WHO.EXE files`032
  1298. X
  1299. X  MONSTER_DUMP.EXE don't need to be executable by world.
  1300. X
  1301. X  After building database put protection (world:read+write) to
  1302. X        *.MON files
  1303. X  in DATABASE_MON and DATABASE_CODE direcories.
  1304. X
  1305. X3 Database
  1306. X  Define monster command with command
  1307. X      SET COMMAND MONSTER (in IMAGE directory)
  1308. X
  1309. X  Make monster universe with command MONSTER/REBUILD
  1310. X
  1311. X  or
  1312. X
  1313. X  copy your old (Skrenta's) monster database to DATABASE_MON directory
  1314. X  and try MONSTER/BATCH=CONVERT (No warranty!)
  1315. X
  1316. X  or
  1317. X
  1318. X  MONSTER/BUILD CASTLE.DMP
  1319. X  (where in file CASTLE.DMP have distributed starter's castle)
  1320. X
  1321. X  Put protection (world:read+write) to
  1322. X        *.MON files
  1323. X  in DATABASE_MON and DATABASE_CODE direcories.
  1324. X3 Publishing
  1325. X  Tell anybody that he can play monster
  1326. X     after command
  1327. X     SET COMMAND Your_Disk:<Your IMAGE directory>MONSTER
  1328. X  with MONSTER command
  1329. X3 Questions
  1330. X  Questions to Kristallipallo@com.cc.Helsinki.FI
  1331. X               Kari.Hurtta@Helsinki.FI        hurtta@cc.Helsinki.FI
  1332. X               HURTTA@FINUH.BITNET
  1333. X               Antti.Leino@Helsinki.FI        leino@cc.Helsinki.FI
  1334. X               LEINO@FINUH.BITNET
  1335. X               Juha.Laiho@Helsinki.FI         jlaiho@cc.Helsinki.FI
  1336. X               JLAIHO@FINUH.BITNET
  1337. X2 Original
  1338. X  This text is from release of original Skrenta's Monster. I only
  1339. X  put this to Help structure.
  1340. X
  1341. X3 Files`032
  1342. X  Monster was written in VMS Pascal under VMS 4.6.  It uses file`032
  1343. X  sharing and record locking for communication.  Outside of that,`032
  1344. X  it doesn't do anything tricky.  However, after playing around with`032
  1345. X  a VMS 4.2 system, I have doubts if it will work on a system that`032
  1346. X  old.  If you've got a reasonably recent version of VMS and a Pascal`032
  1347. X  compiler, you shouldn't have any problems.
  1348. X`032
  1349. X  The Monster source is in two files:  a short one, approx 300 lines,`032
  1350. X  called guts.pas, and a big one, mon.pas, approx 13,000 lines.  The`032
  1351. X  compiled program contains everything necessary to create and`032
  1352. X  maintain  the Monster universe. There is no separate maintenance`032
  1353. X  program.  Instead,  specific people in the game have priviledges,`032
  1354. X  and are known as the  "Monster Managers".  The MMs can do system`032
  1355. X  maintenance while playing, and  other players can even observe their`032
  1356. X  work.
  1357. X`032
  1358. X  After reading the document, if you would still like to obtain Monster,
  1359. X  send me a letter reaffirming your interest.  Thanks!
  1360. X`032
  1361. X3 Game
  1362. X`032
  1363. X  Monster is a text-oriented computer adventure game.  Like other`032
  1364. X  traditional adventure games such as Zork and Adventure, Monster`032
  1365. X  players issue simple commands to direct a "puppet" through an`032
  1366. X  artificial world.  Players can explore the world, pick up and`032
  1367. X  make use of objects, and solve puzzles.
  1368. X`032
  1369. X  However, Monster is quite different from other computer adventures`032
  1370. X  in two respects:  first, Monster is a multiplayer game.  In addition`032
  1371. X  to the normal actions a player can effect on the simulated environment,`03
  1372. V2
  1373. X  players can also interact with one another.  Player characters can`032
  1374. X  fight, talk, trade items and explore territory together.  Monster`032
  1375. X  is similar in this respect to some multiplayer games available on`032
  1376. X  computer networks such as the Source and Compuserve.
  1377. X`032
  1378. X  However, Monster allows players to do something that very few, if any,`032
  1379. X  other games allow:  the players themselves create the fantasy world as`032
  1380. X  part of the game.  Players can create objects, make locations, and set`032
  1381. X  up puzzles for other players to solve.  Game mechanisms allow players to:
  1382. X`032
  1383. X        o Create and describe new objects and locations
  1384. +-+-+-+-+-+-+-+-  END  OF PART 27 +-+-+-+-+-+-+-+-
  1385.