samegame.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. {
  2. $Id$
  3. This program is both available in XTDFPC as in the FPC demoes.
  4. Copyright (C) 1999 by Marco van de Voort
  5. SameGame is a standard game in GNOME and KDE. I liked it, and I
  6. automatically brainstormed how I would implement it.
  7. It turned out to be really easy, and is basically only 100 lines or so,
  8. the rest is scorekeeping, helptext, menu etc.
  9. The game demonstrates some features of the MSMOUSE unit, and some of
  10. the Crt and Graph units. (depending whether it is compiled with
  11. UseGraphics or not)
  12. See the file COPYING.FPC, included in this distribution,
  13. for details about the copyright.
  14. This program is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. **********************************************************************}
  18. PROGRAM SameGame;
  19. {$ifdef UseGraphics}
  20. {$ifdef Win32}
  21. {$define Win32Graph}
  22. {$apptype GUI}
  23. {$endif}
  24. {$endif}
  25. Uses
  26. {$ifdef Win32}
  27. Windows,
  28. {$endif}
  29. {$ifdef Win32Graph}
  30. WinCrt,
  31. {$else}
  32. Crt,
  33. {$endif}
  34. Dos,
  35. {$IFDEF UseGraphics}
  36. Graph,
  37. {$INFO GRAPH}
  38. {$ENDIF}
  39. GameUnit;
  40. CONST
  41. {$IFDEF UseGraphics}
  42. GrFieldX = 10; {X topleft of playfield}
  43. GrFieldY = 70; {Y topleft of playfield}
  44. ScalerX = 22; {ScalerX x Scaler y dots
  45. must be approx a square}
  46. ScalerY = 20;
  47. {$ENDIF}
  48. FieldX = 10; {Top left playfield
  49. coordinates in squares(textmode)}
  50. FieldY = 3; {Top left playfield coordinates}
  51. PlayFieldXDimension = 20; {Dimensions of playfield}
  52. PlayFieldYDimension = 15;
  53. {$IFDEF UseGraphics}
  54. RowDispl = 15;
  55. MenuX = 480;
  56. MenuY = 120;
  57. grNewGameLine = 'NEW GAME';
  58. grHelpLine = 'HELP';
  59. grEndGame = 'END GAME';
  60. {$ENDIF}
  61. {Used colors. Colors[0..2] are the colors used on the playfield, Colors[3]
  62. is the background and Colors[4] is the color used to mark the pieces}
  63. Colors : ARRAY [0..4] OF LONGINT = (White,Blue,Red,Black,LightMagenta);
  64. TYPE PlayFieldType=ARRAY[0..PlayFieldXDimension-1,0..PlayFieldYDimension-1] OF BYTE;
  65. {$IFDEF UseGraphics}
  66. PROCEDURE DisplayPlayField(CONST PlayField:PlayFieldType);
  67. {Screen routine, simply puts the array Playfield on screen.
  68. Both used for displaying the normal grid as the grid with a certain area marked}
  69. VAR X,Y : LONGINT;
  70. LastOne,
  71. NumbLast : LONGINT;
  72. BEGIN
  73. HideMouse;
  74. FOR Y:=0 TO PlayFieldYDimension-1 DO
  75. BEGIN
  76. X:=0;
  77. REPEAT
  78. LastOne:=PlayField[X,Y];
  79. NumbLast:=X;
  80. WHILE (PlayField[X,Y]=LastOne) AND (X<(PlayFieldXDimension-1))DO
  81. INC(X);
  82. SetFillStyle(SolidFill,Colors[LastOne]);
  83. Bar(GrFieldX+NumbLast*ScalerX,GrFieldY+Y*ScalerY,GrFieldX+X*ScalerX-1,GrFieldY+(Y+1)*ScalerY-1);
  84. UNTIL X>=(PlayFieldXDimension-1);
  85. END;
  86. ShowMouse;
  87. END;
  88. {$ELSE}
  89. PROCEDURE DisplayPlayField(CONST PlayField:PlayFieldType);
  90. {Screen routine, simply puts the array Playfield on screen.
  91. Both used for displaying the normal grid as the grid with a certain area marked}
  92. VAR X,Y : LONGINT;
  93. BEGIN
  94. FOR Y:=0 TO PlayFieldYDimension-1 DO
  95. BEGIN
  96. GotoXY(FieldX,Y+FieldY);
  97. FOR X:=0 TO PlayFieldXDimension-1 DO
  98. BEGIN
  99. TextColor(Colors[PlayField[X,Y]]);
  100. Write(#219#219);
  101. END;
  102. END;
  103. END;
  104. {$ENDIF}
  105. PROCEDURE ShowHelp;
  106. {Shows some explanation of the game and waits for a key}
  107. {$ifndef UseGraphics}
  108. VAR I : LONGINT;
  109. {$endif}
  110. BEGIN
  111. {$IFDEF UseGraphics}
  112. HideMouse;
  113. SetbkColor(black);
  114. SetViewPort(0,0,getmaxx,getmaxy,clipoff);
  115. ClearViewPort;
  116. SetTextStyle(0,Horizdir,2);
  117. OutTextXY(220,10,'SAMEGAME');
  118. SetTextStyle(0,Horizdir,1);
  119. OutTextXY(5,40+1*LineDistY,' is a small game, with a principle copied from some KDE game');
  120. OutTextXY(5,40+3*LineDistY,'I tried to implement it under Go32V2 to demonstrate the MsMouse unit');
  121. OutTextXY(5,40+4*LineDistY,'When it worked, I tried to get it running under Linux. I succeeded,');
  122. OutTextXY(5,40+5*LineDistY,'but the mouse unit of the API doesn'#39't work with GPM 1.17');
  123. OutTextXY(5,40+7*LineDistY,'If you move over the playfield, aggregates of one color will be marked');
  124. OutTextXY(5,40+8*LineDistY,'in purple. If you then press the left mouse button, that aggregate will');
  125. OutTextXY(5,40+9*LineDistY,'disappear, and the playfield will collapse to the bottom-left. Please');
  126. OutTextXY(5,40+10*LineDistY,'keep in mind that only an aggregate of two blocks or more will disappear.');
  127. OutTextXY(5,40+12*LineDistY,'For every aggregate you let disappear you get points, but the score is');
  128. OutTextXY(5,40+13*LineDistY,'quadratic proportional to the number of blocks killed. So 4 times killing');
  129. OutTextXY(5,40+14*LineDistY,' a 4 block aggregate scores 4 points, and one time 16 blocks will score 64');
  130. OutTextXY(5,40+15*LineDistY,'blocks. The purpose of the game is obtaining the highscore');
  131. OutTextXY(5,40+17*LineDistY,'If you manage to empty the entire playfield, you'#39'll get a bonus');
  132. OutTextXY(5,40+19*LineDistY,'Press any key to get back to the game');
  133. ShowMouse;
  134. {$ELSE}
  135. FOR I:=2 TO 24 DO
  136. BEGIN
  137. GotoXY(1,I);
  138. ClrEol;
  139. END;
  140. GotoXY(1,3); TextColor(White);
  141. Write('SAMEGAME');
  142. SetDefaultColor;
  143. WriteLn(' is a small game, with a principle copied from some KDE game');
  144. WriteLn;
  145. WriteLn('I tried to implement it under Go32V2 to demonstrate the MsMouse unit');
  146. Writeln('When it worked, I tried to get it running under Linux. I succeeded,');
  147. Writeln('but the mouse unit of the API doesn'#39't work with GPM 1.17');
  148. Writeln;
  149. WriteLn('If you move over the playfield, aggregates of one color will be marked');
  150. Writeln('in purple. If you then press the left mouse button, that aggregate will');
  151. Writeln('disappear, and the playfield will collapse to the bottom-left. Please');
  152. Writeln('keep in mind that only an aggregate of two blocks or more will disappear.');
  153. Writeln;
  154. Writeln('For every aggregate you let disappear you get points, but the score is');
  155. Writeln('quadratic proportional to the number of blocks killed. So 4 times killing');
  156. Writeln(' a 4 block aggregate scores 4 points, and one time 16 blocks will score 64');
  157. Writeln('blocks. The purpose of the game is obtaining the highscore');
  158. Writeln;
  159. Writeln('If you manage to empty the entire playfield, you'#39'll get a bonus');
  160. Writeln;
  161. WriteLn('Press any key to get back to the game');
  162. {$ENDIF}
  163. GetKey;
  164. END;
  165. VAR MarkField,PlayField : PlayFieldType; {The playfield, and the marked form}
  166. CubesMarked : LONGINT; {Cubes currently marked}
  167. Score : LONGINT; {The current score}
  168. LastScore : LONGINT;
  169. PROCEDURE ShowButtons;
  170. {Shows the clickable buttons}
  171. BEGIN
  172. {$IFNDEF UseGraphics}
  173. TextColor(Yellow); TextBackGround(Blue);
  174. GotoXY(60,5); Write('NEW game');
  175. GotoXY(60,6); Write('HELP');
  176. GotoXY(60,7); Write('END game');
  177. {$IFDEF Unix}
  178. GotoXY(60,8); Write('Force IBM charset');
  179. {$ENDIF}
  180. SetDefaultColor;
  181. {$ELSE}
  182. SetTextStyle(0,Horizdir,1);
  183. OutTextXY(MenuX,MenuY,grNewGameLine);
  184. OutTextXY(MenuX,MenuY+RowDispl,grHelpLine);
  185. OutTextXY(MenuX,MenuY+2*RowDispl,grEndGame);
  186. {$ENDIF}
  187. END;
  188. FUNCTION PlayFieldPiecesLeft:LONGINT;
  189. {Counts pieces/cubes/blocks left on the playfield}
  190. VAR I,J,K : LONGINT;
  191. BEGIN
  192. K:=0;
  193. FOR I:=0 TO PlayFieldXDimension-1 DO
  194. FOR J:=0 TO PlayFieldYDimension-1 DO
  195. IF PlayField[I,J]<>3 THEN
  196. INC(K);
  197. PlayFieldPiecesLeft:=K;
  198. END;
  199. PROCEDURE ShowScore;
  200. {Simply procedure to update the score}
  201. {$IFDEF UseGraphics}
  202. VAR S : String;
  203. {$ENDIF}
  204. BEGIN
  205. {$IFDEF UseGraphics}
  206. Str(Score:5,S);
  207. SetFillStyle(SolidFill,0);
  208. Bar(300,440,450,458);
  209. OutTextXY(300,440,'Score :'+S);
  210. {$ELSE}
  211. TextColor(White);
  212. GotoXY(20,23); Write(' ':20);
  213. GotoXY(20,23); Write('Score : ',Score);
  214. SetDefaultColor;
  215. {$ENDIF}
  216. END;
  217. FUNCTION CubesToScore : LONGINT;
  218. {Function to calculate score from the number of cubes. Should have a higher
  219. order than linear, or the purpose of the game disappears}
  220. BEGIN
  221. CubesToScore:=(CubesMarked*CubesMarked) DIV 4;
  222. END;
  223. PROCEDURE MarkAfield(X,Y:LONGINT);
  224. {Recursively marks the area adjacent to (X,Y);}
  225. VAR TargetColor : LONGINT;
  226. PROCEDURE MarkRecur(X1,Y1:LONGINT);
  227. {Marks X1,Y1, checks if neighbours (horizontally or vertically) are the
  228. same color}
  229. BEGIN
  230. IF (PlayField[X1,Y1]=TargetColor) AND (MarkField[X1,Y1]<>4) THEN
  231. BEGIN
  232. MarkField[X1,Y1]:=4;
  233. INC(CubesMarked);
  234. IF X1>0 THEN
  235. MarkRecur(X1-1,Y1);
  236. IF Y1>0 THEN
  237. MarkRecur(X1,Y1-1);
  238. IF X1<(PlayFieldXDimension-1) THEN
  239. MarkRecur(X1+1,Y1);
  240. IF Y1<(PlayFieldYDimension-1) THEN
  241. MarkRecur(X1,Y1+1);
  242. END;
  243. END;
  244. BEGIN
  245. CubesMarked:=0;
  246. TargetColor:=PlayField[X,Y];
  247. IF TargetColor<>3 THEN {Can't mark black space}
  248. MarkRecur(X,Y);
  249. END;
  250. PROCEDURE FillPlayfield;
  251. {Initial version, probably not nice to play with.
  252. Some Life'ish algoritm would be better I think. (so that more aggregates exist)}
  253. VAR X,Y,Last,Now : LONGINT;
  254. BEGIN
  255. Last:=0;
  256. FOR X:=0 TO PlayFieldXDimension-1 DO
  257. FOR Y:=0 TO PlayFieldYDimension-1 DO
  258. BEGIN
  259. Now:=RANDOM(4);
  260. IF Now=3 THEN
  261. Now:=Last;
  262. PlayField[X,Y]:=Now;
  263. Last:=Now;
  264. END;
  265. MarkField:=PlayField;
  266. END;
  267. PROCEDURE Colapse;
  268. {Processes the playfield if the mouse button is used.
  269. First the procedure deletes the marked area, and let gravity do its work
  270. Second the procedure uses as if some gravity existed on the left of the
  271. playfield }
  272. VAR X, Y,J :LONGINT;
  273. BEGIN
  274. {Vertical colapse: All marked pieces are deleted, and let gravity do it's work}
  275. IF CubesMarked>1 THEN
  276. BEGIN
  277. FOR X:=0 TO PlayFieldXDimension-1 DO
  278. BEGIN
  279. Y:=PlayFieldYDimension-1; J:=Y;
  280. REPEAT
  281. IF MarkField[X,Y]<>4 THEN
  282. BEGIN
  283. PlayField[X,J]:=PlayField[X,Y];
  284. DEC(J);
  285. END;
  286. DEC(Y);
  287. UNTIL Y<0;
  288. FOR Y:=0 TO J DO
  289. PlayField[X,Y]:=3;
  290. END;
  291. J:=0;
  292. FOR X:=PlayFieldXDimension-2 DOWNTO 0 DO
  293. BEGIN
  294. IF PlayfIeld[X,PlayFieldYDimension-1]=3 THEN
  295. BEGIN
  296. Move(PlayfIeld[X+1,0],PlayField[X,0],PlayFieldYDimension*(PlayFieldXDimension-X-1));
  297. INC(J);
  298. END;
  299. END;
  300. IF J<>0 THEN
  301. FillChar(PlayField[PlayFieldXDimension-J,0],J*PlayFieldYDimension,#3);
  302. INC(Score,CubesToScore);
  303. ShowScore;
  304. END;
  305. END;
  306. PROCEDURE BuildScreen;
  307. {Some procedures that build the screen}
  308. BEGIN
  309. {$IFDEF UseGraphics}
  310. setbkcolor(black);
  311. setviewport(0,0,getmaxx,getmaxy,clipoff);
  312. clearviewport;
  313. {$ELSE}
  314. ClrScr;
  315. {$ENDIF}
  316. Score:=0;
  317. ShowScore;
  318. ShowButtons;
  319. ShowHighScore;
  320. ShowMouse;
  321. {$IFDEF UseGraphics}
  322. SetTextStyle(0,Horizdir,2);
  323. OuttextXY(10,10,'SameGame v0.03, (C) by Marco v/d Voort. ');
  324. SetTextStyle(0,Horizdir,1);
  325. OuttextXY(50,40,'A demo for the FPC RTL and API units Crt,(MS)Mouse and Graph');
  326. {$ELSE}
  327. GotoXY(1,1);
  328. TextColor(Yellow);
  329. Write('SameGame v0.02');
  330. TextColor(White);
  331. Write(' A demo for the ');
  332. TextColor(Yellow); Write('FPC');
  333. TextColor(White); Write(' API or MsMouse unit. By Marco van de Voort');
  334. SetDefaultColor;
  335. {$ENDIF}
  336. IF LastScore<>0 THEN
  337. BEGIN
  338. {$Ifdef UseGraphics}
  339. SetTextStyle(0,Horizdir,1);
  340. Str(LastScore,S);
  341. OuttextXY(50,40,'The Score in the last game was :'+S);
  342. {$else}
  343. GotoXY(10,20);
  344. Write('The score in the last game was :',LastScore);
  345. {$endif}
  346. END;
  347. DisplayPlayField(PlayField);
  348. MarkField:=PlayField;
  349. END;
  350. PROCEDURE DoMainLoopMouse;
  351. {The main game loop. The entire game runs in this procedure, the rest is
  352. initialisation/finalisation (like loading and saving highscores etc etc)}
  353. VAR X,Y,
  354. MX,MY,MState,Dummy : LONGINT;
  355. EndOfGame : LONGINT;
  356. S : String;
  357. BEGIN
  358. RANDOMIZE;
  359. REPEAT
  360. FillPlayField;
  361. BuildScreen;
  362. EndOfGame:=0;
  363. REPEAT
  364. GetMouseState(MX,MY,MState);
  365. {$IFDEF UseGraphics}
  366. X:=2*((MX-GrFieldX) DIV ScalerX) +FieldX;
  367. Y:=((MY-GrFieldY) DIV ScalerY) +FieldY-1;
  368. {$ELSE}
  369. X:=MX SHR 3;
  370. Y:=MY SHR 3;
  371. {$ENDIF}
  372. IF PlayFieldPiecesLeft=0 THEN
  373. BEGIN
  374. INC(Score,1000);
  375. EndOfGame:=1;
  376. END
  377. ELSE
  378. BEGIN
  379. {$IFDEF UseGraphics}
  380. IF (MX>=MenuX) AND (MX<(MenuX+16*Length(GrNewGameLine))) THEN
  381. BEGIN {X in clickable area}
  382. IF (MY>=MenuY) AND (MY<(MenuY+RowDispl*3+2)) THEN
  383. BEGIN
  384. X:=65; {X doesn't matter as long as it is 60..69}
  385. Y:=((MY-MenuY) DIV RowDispl)+4;
  386. END;
  387. END;
  388. {$ENDIF}
  389. IF (X>=60) AND (X<=69) THEN
  390. BEGIN
  391. IF (MState AND LButton) <>0 THEN {If leftbutton pressed,}
  392. BEGIN
  393. IF Y=4 THEN
  394. EndOfGame:=1;
  395. IF Y=6 THEN
  396. EndOfGame:=2;
  397. IF (EndOfGame>0) AND (PlayFieldPiecesLeft=0) THEN
  398. INC(Score,1000);
  399. IF Y=5 THEN
  400. BEGIN
  401. ShowHelp;
  402. BuildScreen;
  403. END;
  404. {$IFDEF Unix}
  405. IF Y=7 THEN
  406. BEGIN
  407. write(#27+'(K');
  408. BuildScreen;
  409. END;
  410. {$ENDIF}
  411. END;
  412. END;
  413. IF (X>=(FieldX-2)) AND (Y>=(FieldY-2)) THEN
  414. BEGIN
  415. DEC(X,FieldX-1);
  416. DEC(Y,FieldY-1);
  417. X:=X SHR 1;
  418. IF (X<PlayFieldXDimension) AND (Y<PlayFieldYDimension) THEN
  419. BEGIN
  420. IF MarkField[X,Y]<>4 THEN
  421. BEGIN
  422. MarkField:=PlayField;
  423. MarkAfield(X,Y);
  424. DisplayPlayField(MarkField);
  425. {$ifdef UseGraphics}
  426. SetFillStyle(SolidFill,black);
  427. Bar(420,440,540,460);
  428. SetTextStyle(0,Horizdir,1);
  429. Str(CubesToScore,S);
  430. OuttextXY(420,440,'Marked : '+S);
  431. {$else}
  432. TextColor(White);
  433. GotoXY(20,22);
  434. Write(' ':20);
  435. GotoXY(20,22);
  436. Write('Marked :',CubesToScore);
  437. {$endif}
  438. END;
  439. IF (MarkField[X,Y]=4) AND ((MState AND LButton) <>0) THEN
  440. {If leftbutton pressed,}
  441. BEGIN
  442. REPEAT {wait untill it's released.
  443. The moment of pressing counts}
  444. GetMouseState(X,Y,Dummy);
  445. UNTIL (Dummy AND LButton)=0;
  446. Colapse;
  447. MarkField:=PlayField;
  448. DisplayPlayField(MarkField);
  449. END
  450. END
  451. END;
  452. IF KeyPressed THEN
  453. BEGIN
  454. X:=GetKey;
  455. IF (CHR(X) IN ['X','x','Q','q']) OR (X=27) THEN
  456. EndOfGame:=2;
  457. END;
  458. END;
  459. UNTIL EndOfGame>0;
  460. ShowScore;
  461. X:=SlipInScore(Score);
  462. IF X<>0 THEN
  463. BEGIN
  464. HideMouse;
  465. ShowHighScore;
  466. {$IFDEF UseGraphics}
  467. Str(Score:5,S);
  468. OutTextXY(HighX+150,HighY+LineDistY*(10-X),S);
  469. GrInputStr(S,HighX,HighY+LineDistY*(10-X),16,12,10,FALSE,AlfaBeta);
  470. {$ELSE}
  471. InputStr(S,HighX,HighY+12-X,10,FALSE,AlfaBeta);
  472. {$ENDIF}
  473. HighScore[X-1].Name:=S;
  474. ShowMouse;
  475. END;
  476. LastScore:=Score;
  477. UNTIL EndOFGame=2;
  478. END;
  479. CONST FileName='samegame.scr';
  480. VAR I : LONGINT;
  481. {$IFDEF UseGraphics}
  482. gd,gm : INTEGER;
  483. Pal : PaletteType;
  484. {$ENDIF}
  485. BEGIN
  486. {$IFDEF UseGraphics}
  487. {$ifdef Win32}
  488. ShowWindow(GetActiveWindow,0);
  489. {$endif}
  490. gm:=vgahi;
  491. gd:=vga;
  492. InitGraph(gd,gm,'');
  493. if GraphResult <> grOk then
  494. begin
  495. Writeln('Graph driver ',gd,' graph mode ',gm,' not supported');
  496. Halt(1);
  497. end;
  498. SetFillStyle(SolidFill,1);
  499. GetDefaultPalette(Pal);
  500. SetAllPalette(Pal);
  501. {$ENDIF}
  502. IF NOT MousePresent THEN
  503. BEGIN
  504. Writeln('No mouse found. A mouse is required!');
  505. HALT;
  506. END;
  507. FOR I:=0 TO 9 DO
  508. HighScore[I].Score:=I*1500;
  509. LoadHighScore(FileName);
  510. InitMouse;
  511. {$ifndef Win32Graph}
  512. CursorOff;
  513. {$endif}
  514. {$IFDEF UseGraphics}
  515. HighX:=450; HighY:=220; {the position of the highscore table}
  516. {$else}
  517. HighX:=52; HighY:=10; {the position of the highscore table}
  518. {$endif}
  519. DoMainLoopMouse;
  520. HideMouse;
  521. DoneMouse;
  522. {$ifndef Win32Graph}
  523. CursorOn;
  524. {$endif}
  525. SaveHighScore;
  526. {$IFDEF UseGraphics}
  527. CloseGraph;
  528. {$ENDIF}
  529. {$ifndef Win32Graph}
  530. ClrScr;
  531. Writeln;
  532. Writeln('Last games'#39' score was : ',Score);
  533. {$endif}
  534. END.
  535. {
  536. $Log$
  537. Revision 1.6 2003-09-06 14:14:12 marco
  538. * removed unused var reported in bug 2170
  539. Revision 1.5 2002/09/07 15:06:35 peter
  540. * old logs removed and tabs fixed
  541. Revision 1.4 2002/06/02 09:49:17 marco
  542. * Renamefest
  543. Revision 1.3 2002/02/22 21:41:22 carl
  544. * range check error fix
  545. }