Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. unit LRLHighScores;
  2.  
  3.  
  4. interface
  5.  
  6.  
  7. uses
  8.   LRLRoutines, LRLSprites, StrUnit;
  9.  
  10.  
  11. procedure LRLLoadHighScores;
  12. procedure LRLShowHighScores;
  13. function LRLBestScore(Score: longint): boolean;
  14. procedure LRLInsertScore(Name: string; Score: longint);
  15. procedure LRLSaveHighScores;
  16. function LRLEnterName: string;
  17.  
  18.  
  19. implementation
  20.  
  21.  
  22. const
  23.   HighsFileName = 'LRL.HSR';
  24.   HighsFileHeader: string[29] = 'Lode Runner Live High Scores'#26;
  25.  
  26. type
  27.   TSupers = packed record
  28.     Name:  string[20];
  29.     Score: longint;
  30.   end;
  31.  
  32. var
  33.   MainScreen: POINTER;
  34.   HighFrame:  POINTER;
  35.   HighTable:  array[1..5] of TSupers;
  36.  
  37. procedure LoadData;
  38. var
  39.   j: word;
  40. begin
  41.   GETMEM(MainScreen, 64004);
  42.   GETMEM(HighFrame, 45000);
  43.   DFAFilePositionSet(ImageFile, LRLImagesFilePosition, DFASeekFromStart);
  44.   DFAFileRead(ImageFile, MainScreen^, 7940, j);
  45.   DecompressRepByte(MainScreen^, HighFrame^, 7940, j);
  46.   DFAFileRead(ImageFile, MainScreen^, 64004, j);
  47. end;
  48.  
  49. procedure DisposeData;
  50. begin
  51.   FREEMEM(MainScreen, 64004);
  52.   FREEMEM(HighFrame, 45000);
  53. end;
  54.  
  55. procedure LRLShowHighScores;
  56. var
  57.   p: POINTER;
  58.   i: integer;
  59.   s: string;
  60. begin
  61.   LRLLoadHighScores;
  62.   GETMEM(p, 768);
  63.   DataFill(p^, 768, 0, 0);
  64.   Palette256Set(p^);
  65.   FREEMEM(p, 768);
  66.   LoadData;
  67.   ImagePut(LRLScreen^, MainScreen^, 0, 0, 0, 0, 319, 199);
  68.   ImagePut(LRLScreen^, HighFrame^, 6, 50, 0, 0, 319, 199);
  69.   for i := 1 to 5 do
  70.   begin
  71.     ImageStringGet(CHR(i + 48) + '. ' + HighTable[i].Name, LRLFont^, LRLFontBuffer^, 110);
  72.     ImagePut(LRLScreen^, LRLFontBuffer^, 55, 85 + i * 17, 8, 0, 319, 199);
  73.     STR(HighTable[i].Score, s);
  74.     ImageStringGet(s, LRLFont^, LRLFontBuffer^, 46);
  75.     ImagePut(LRLScreen^, LRLFontBuffer^, 260 - ImageSizex(LRLFontBuffer^), 85 + i * 17, 8, 0, 319, 199);
  76.   end;
  77.   ScreenApply(LRLScreen^);
  78.   FadeTo(LRLMenuPalette);
  79.   READKEY;
  80.   FadeClear;
  81.   ImageClear(LRLScreen^);
  82.   ScreenApply(LRLScreen^);
  83.   DisposeData;
  84. end;
  85.  
  86. procedure LRLLoadHighScores;
  87. var
  88.   InFile: TDFAFileHandle;
  89.   i, j:  word;
  90.   high:  TSupers;
  91.   dummy: string[30];
  92. begin
  93.   high.Name := 'Lode Runner';
  94.   DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
  95.   if DFALastResult(InFile) <> 0 then
  96.   begin
  97.     DFAFileCreate(InFile, HighsFileName, DFAAttributeArchive);
  98.     DFAFileWrite(InFile, HighsFileHeader[1], 29, i);
  99.     for i := 1 to 5 do
  100.     begin
  101.       high.score := 60000 - i * 10000;
  102.       DFAFileWrite(InFile, high, SIZEOF(high), j);
  103.     end;
  104.   end;
  105.   DFAFilePositionSet(InFile, 0, DFASeekFromStart);
  106.   DFAFileRead(InFile, dummy[1], 29, j);
  107.   if (DFALastResult(InFile) <> 0) or
  108.     (not DataIdentical(dummy[1], HighsFileHeader[1], 29, 0, 0)) then
  109.   begin
  110.     WRITELN('Error: Invalid file with high scores! (try to remove LRL.HSR file)');
  111.     WRITELN('Žè¨¡ª : ¥¢¥à­ë© ä ©« á ४®à¤ ¬¨! (¯®¯à®¡ã©â¥ 㤠«¨âì ä ©« LRL.HSR)');
  112.     Halt(1);
  113.   end;
  114.   DFAFileRead(InFile, HighTable, SIZEOF(TSupers) * 5, j);
  115.   DFAFileClose(InFile);
  116. end;
  117.  
  118. procedure LRLSaveHighScores;
  119. var
  120.   InFile: TDFAFileHandle;
  121.   i, j: word;
  122. begin
  123.   DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
  124.   DFAFilePositionSet(InFile, 29, DFASeekFromStart);
  125.   DFAFileWrite(InFile, HighTable, SIZEOF(TSupers) * 5, j);
  126.   DFAFileClose(InFile);
  127. end;
  128.  
  129. function LRLBestScore(Score: longint): boolean;
  130. var
  131.   i: integer;
  132. begin
  133.   LRLBestScore := True;
  134.   LRLLoadHighScores;
  135.   i := 1;
  136.   while True do
  137.   begin
  138.     if Score >= HighTable[i].Score then
  139.       EXIT;
  140.     Inc(i);
  141.     if i > 5 then
  142.     begin
  143.       LRLBestScore := False;
  144.       EXIT;
  145.     end;
  146.   end;
  147. end;
  148.  
  149. procedure LRLInsertScore(Name: string; Score: longint);
  150. var
  151.   i, j: word;
  152. begin
  153.   LRLLoadHighScores;
  154.   i := 1;
  155.   while True do
  156.   begin
  157.     if Score >= HighTable[i].Score then
  158.     begin
  159.       for j := 4 downto i do
  160.       begin
  161.         HighTable[j + 1].Name  := HighTable[j].Name;
  162.         HighTable[j + 1].Score := HighTable[j].Score;
  163.       end;
  164.       HighTable[i].Name  := Name;
  165.       HighTable[i].Score := Score;
  166.       LRLSaveHighScores;
  167.       EXIT;
  168.     end;
  169.     Inc(i);
  170.     if i > 5 then
  171.     begin
  172.       EXIT;
  173.     end;
  174.   end;
  175. end;
  176.  
  177. function LRLEnterName: string;
  178. var
  179.   p: POINTER;
  180.   i: integer;
  181.   RedrawName: boolean;
  182.   Keypress: word;
  183.   Name: string;
  184. begin
  185.   Name := '';
  186.   GETMEM(p, 768);
  187.   DataFill(p^, 768, 0, 0);
  188.   Palette256Set(p^);
  189.   FREEMEM(p, 768);
  190.   ImageClear(LRLScreen^);
  191.   ImagePut(LRLScreen^, LRLLogo^, 3, 3, 0, 0, 319, 199);
  192.   ImageStringGet('Congratulations! You are in Top-Five!', LRLFont^, LRLFontBuffer^, 110);
  193.   ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr 1, 85, 0, 0, 319, 199);
  194.   ImageStringGet('Enter your name below, Champ', LRLFont^, LRLFontBuffer^, 111);
  195.   ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
  196.     1, 110, 0, 0, 319, 199);
  197.   ImageStringGet('---------------------------', LRLFont^, LRLFontBuffer^, 100);
  198.   ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
  199.     1, 155, 0, 0, 319, 199);
  200.   ScreenApply(LRLScreen^);
  201.   FadeTo(LRLMenuPalette);
  202.   RedrawName := True;
  203.   repeat
  204.     if RedrawName = True then
  205.     begin
  206.       ImageFill(LRLFontBuffer^, 320, 20, 0);
  207.       ImagePut(LRLScreen^, LRLFontBuffer^, 0, 140, 0, 0, 319, 199);
  208.       ImageStringGet(Name, LRLFont^, LRLFontBuffer^, 100);
  209.       ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
  210.         1, 140, 0, 0, 319, 199);
  211.       ScreenApply(LRLScreen^);
  212.       RedrawName := False;
  213.     end;
  214.     Keypress := READKEY;
  215.     if (LO(Keypress) = 8) and (LENGTH(Name) > 0) then
  216.     begin
  217.       Name[0] := char(Ord(Name[0]) - 1);
  218.       RedrawName := True;
  219.     end;
  220.     if (LO(Keypress) > 31) and (LENGTH(Name) < 20) then
  221.     begin
  222.       Name := Name + char(LO(Keypress));
  223.       RedrawName := True;
  224.     end;
  225.   until LO(Keypress) = 13;
  226.   FadeClear;
  227.   Name := StringTrimAll(Name, ' ');
  228.   if LENGTH(Name) = 0 then
  229.     Name := 'Anonymous';
  230.   LRLEnterName := Name;
  231. end;
  232.  
  233.  
  234. end.
  235.