Subversion Repositories Kolibri OS

Rev

Rev 775 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. unit LRLEditor;
  2.  
  3. {$mode objfpc}
  4. {$asmmode intel}
  5.  
  6.  
  7. interface
  8.  
  9.  
  10. uses
  11.   LRLRoutines, LRLSprites, LRLLevels;
  12.  
  13.  
  14. procedure LRLEditLevels;
  15.  
  16.  
  17. implementation
  18.  
  19.  
  20. const
  21.   RefreshDelay = 5;  { 1 = 1/100 sec }
  22.  
  23. var
  24.   CurrentLevel: Word;
  25.   CurrentTool: Word;
  26.   TotalLevels: Word;
  27.   MouseX, MouseY: Integer;
  28.  
  29.   TimeToRefresh  : Boolean;
  30.   LastRefreshTime: DWord;
  31.  
  32.  
  33. procedure LRLRedrawLevel;
  34. var
  35.   i, j: Integer;
  36. begin
  37.   ImageClear(LRLScreen^);
  38.  
  39.   for i := 1 to 16 do for j := 1 to 30 do
  40.   with LRLLevel.Field[j, i] do
  41.     ImagePut(LRLScreen^, LRLEnvironment[Image].Image[Count].Data^, j * 10, i * 10, 0, 0, 319, 199);
  42.  
  43.   for i := 1 to 10 do
  44.   with LRLLevel.Player[i] do
  45.   if Controller <> 0 then
  46.     ImagePutTransparent(LRLScreen^, LRLFigure[Colour, SpriteData].Image[Sprite].Data^, Position.x * 10 + Position.xoffs, Position.y * 10 + Position.yoffs, 0, 0, 319, 199);
  47.  
  48.   ImageFill(LRLFontBuffer^, 12, 12, 252);
  49.   ImagePut(LRLScreen^, LRLFontBuffer^, 10, 184, 0, 0, 319, 199);
  50.  
  51.   for i := 1 to 13 do
  52.   if i > 9 then
  53.     ImagePut(LRLScreen^, LRLFigure[i - 9, 1].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199) else
  54.     ImagePut(LRLScreen^, LRLEnvironment[i].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199);
  55.  
  56.   for i := 1 to 6 do
  57.   if LRLEditorButton[i].Lit then
  58.     ImagePut(LRLScreen^, LRLEditorButton[i].LightIcon^, LRLEditorButton[i].x1, LRLEditorButton[i].y1, 0, 0, 319, 199) else
  59.     ImagePut(LRLScreen^, LRLEditorButton[i].DarkIcon^, LRLEditorButton[i].x1, LRLEditorButton[i].y1, 0, 0, 319, 199);
  60.  
  61.   LRLDrawOrnamental(0, 0, 31, 17, 1);
  62. end;
  63.  
  64.  
  65. procedure LRLMoveMouse;
  66. var
  67.   s, s2: String[20];
  68. begin
  69.   MSMouseGetXY(MouseX, MouseY);
  70.  
  71.   if not MSMouseInArea(200, 180, 325, 205) then
  72.     if CurrentTool < 10 then
  73.       ImagePut(LRLScreen^, LRLEnvironment[CurrentTool].Image[1].Data^, MouseX - 5, MouseY - 5, 0, 0, 319, 199) else
  74.       ImagePut(LRLScreen^, LRLFigure[CurrentTool - 9, 1].Image[1].Data^, MouseX - 5, MouseY - 5, 0, 0, 319, 199);
  75.  
  76.   if not MSMouseInArea(-2, -2, 55, 20) then
  77.   begin
  78.     ImageFill(LRLFontBuffer^, 50, 15, 0);
  79.     ImagePut(LRLScreen^, LRLFontBuffer^, 0, 0, 0, 0, 319, 199);
  80.     Str(CurrentLevel, s);
  81.     Str(TotalLevels, s2);
  82.     ImageStringGet(s + '/' + s2, LRLFont^, LRLFontBuffer^, 251);
  83.     ImagePut(LRLScreen^, LRLFontBuffer^, 25 - ImageSizex(LRLFontBuffer^) div 2, 0, 0, 0, 319, 199);
  84.   end;
  85.  
  86.   {ImagePutTransparent(LRLScreen^, LRLMousePointer^, MouseX, MouseY, 0, 0, 319, 199);}
  87. end;
  88.  
  89.  
  90. procedure Repress;
  91. var
  92.   x, y: Integer;
  93. begin
  94.   MSMouseButtonWasPressed(0, x, y);
  95.   MSMouseButtonWasReleased(0, x, y);
  96.   MSMouseButtonWasPressed(1, x, y);
  97.   MSMouseButtonWasReleased(1, x, y);
  98. end;
  99.  
  100.  
  101. procedure LRLEditLevels;
  102. var
  103.   Keypress: Word;
  104.   DrawNow: Boolean;
  105.   i, j: Integer;
  106.   x, y: Integer;
  107.   Cmd:  Word;
  108. begin
  109.   if not MSMouseDriverExist then Exit;
  110.   Repress;
  111.   Palette256Set(LRLPalette^);
  112.  
  113.   ShowLives := False;
  114.   ShowScore := False;
  115.   Keypress  := 0;
  116.   CurrentLevel := 1;
  117.   CurrentTool  := 2;
  118.   TotalLevels  := LRLLevelCount;
  119.  
  120.   DrawNow := False;
  121.   TimeToRefresh   := True;
  122.   LastRefreshTime := 0;
  123.  
  124.   MSMouseSetXY(160, 100);
  125.   LRLLoadLevel(CurrentLevel);
  126.  
  127.   WaitForEvent(1);
  128.  
  129.   repeat
  130.     if not TimeToRefresh then
  131.       TimeToRefresh := kos_timecounter() - LastRefreshTime >= RefreshDelay;
  132.  
  133.     if TimeToRefresh then
  134.     begin
  135.       LRLRedrawLevel;
  136.       LRLMoveMouse;
  137.       ScreenApply(LRLScreen^);
  138.       TimeToRefresh   := False;
  139.       LastRefreshTime := kos_timecounter();
  140.     end;
  141.  
  142.     if Keypressed then
  143.       Keypress := Readkey;
  144.  
  145.     if MSMouseButtonWasReleased(1, x, y) then
  146.     begin
  147.       LRLScore := 0;
  148.  
  149.       FadeClear;
  150.       ImageClear(LRLScreen^);
  151.       ScreenApply(LRLScreen^);
  152.       Palette256Set(LRLPalette^);
  153.       LRLPlayLevel(CurrentLevel);
  154.  
  155.       FadeClear;
  156.       ImageClear(LRLScreen^);
  157.       ScreenApply(LRLScreen^);
  158.       Palette256Set(LRLPalette^);
  159.       LRLLoadLevel(CurrentLevel);
  160.  
  161.       Repress;
  162.     end;
  163.  
  164.     if MSMouseButtonWasPressed(0, x, y) then
  165.       DrawNow := True;
  166.  
  167.     if MSMouseButtonWasReleased(0, x, y) then
  168.     begin
  169.       DrawNow := False;
  170.  
  171.       Cmd := 0;
  172.  
  173.       for i := 1 to 6 do
  174.         LRLEditorButton[i].Lit := False;
  175.  
  176.       for i := 1 to 6 do
  177.       if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, LRLEditorButton[i].x2, LRLEditorButton[i].y2) then
  178.       begin
  179.         Cmd := LRLEditorButton[i].Command;
  180.         Break;
  181.       end;
  182.  
  183.       if Cmd = 1 then
  184.       begin
  185.         LRLSaveLevel(CurrentLevel);
  186.  
  187.         Repress;
  188.       end;
  189.  
  190.       if Cmd = 2 then
  191.       begin
  192.         LRLInsertLevel(CurrentLevel);
  193.         Inc(CurrentLevel);
  194.         TotalLevels := LRLLevelCount;
  195.         LRLLoadLevel(CurrentLevel);
  196.  
  197.         Repress;
  198.       end;
  199.  
  200.       if (Cmd = 3) and (CurrentLevel < TotalLevels) then
  201.       begin
  202.         Inc(CurrentLevel);
  203.         LRLLoadLevel(CurrentLevel);
  204.  
  205.         Repress;
  206.       end;
  207.  
  208.       if Cmd = 4 then
  209.       begin
  210.         for i := 1 to 16 do for j := 1 to 30 do
  211.           LRLLevel.Field[j, i].Image := 1;
  212.         for i := 1 to 10 do
  213.           LRLLevel.Player[i].Controller := 0;
  214.  
  215.         Repress;
  216.       end;
  217.  
  218.       if (Cmd = 5) and (TotalLevels > 1) then
  219.       begin
  220.         LRLDeleteLevel(CurrentLevel);
  221.         TotalLevels := LRLLevelCount;
  222.         if CurrentLevel > TotalLevels then
  223.           CurrentLevel := TotalLevels;
  224.         LRLLoadLevel(CurrentLevel);
  225.  
  226.         Repress;
  227.       end;
  228.  
  229.       if (Cmd = 6) and (CurrentLevel > 1) then
  230.       begin
  231.         Dec(CurrentLevel);
  232.         LRLLoadLevel(CurrentLevel);
  233.  
  234.         Repress;
  235.       end;
  236.  
  237.       MSMouseGetXY(MouseX, MouseY);
  238.  
  239.       if MouseY > 180 then
  240.         for i := 1 to 13 do
  241.         if (MouseY > 184) and (MouseY < 195) and (MouseX > i * 15 - 5) and (MouseX < i * 15 + 6) then
  242.         begin
  243.           CurrentTool := i;
  244.           Break;
  245.         end;
  246.     end;
  247.  
  248.     if DrawNow then
  249.     begin
  250.       for i := 1 to 6 do
  251.         LRLEditorButton[i].Lit := False;
  252.  
  253.       for i := 1 to 6 do
  254.       if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, LRLEditorButton[i].x2, LRLEditorButton[i].y2) then
  255.       begin
  256.         LRLEditorButton[i].Lit := True;
  257.         Break;
  258.       end;
  259.  
  260.       MSMouseGetXY(MouseX, MouseY);
  261.  
  262.       x := MouseX div 10;
  263.       y := MouseY div 10;
  264.  
  265.       if (x > 0) and (x < 31) and (y > 0) and (y < 17) then
  266.       begin
  267.         for i := 1 to 10 do
  268.         if (LRLLevel.Player[i].Controller <> 0) and (LRLLevel.Player[i].Position.x = x) and (LRLLevel.Player[i].Position.y = y) and
  269.            (CurrentTool <> 2) and (CurrentTool <> 3) and (CurrentTool <> 4) and (CurrentTool <> 7) then
  270.           begin
  271.             LRLLevel.Player[i].Controller := 0;
  272.             Break;
  273.           end;
  274.  
  275.         if CurrentTool < 10 then
  276.           LRLLevel.Field[x, y].Image := CurrentTool else
  277.         if (LRLLevel.Field[x, y].Image = 2) or (LRLLevel.Field[x, y].Image = 3) or
  278.            (LRLLevel.Field[x, y].Image = 4) or (LRLLevel.Field[x, y].Image = 1) then
  279.         begin
  280.           if CurrentTool = 10 then
  281.           begin
  282.             LRLLevel.Player[1].Controller := 1;
  283.             LRLLevel.Player[1].Position.x := x;
  284.             LRLLevel.Player[1].Position.y := y;
  285.             LRLLevel.Player[1].Colour := 1;
  286.           end else
  287.           begin
  288.             j := 2;
  289.             for i := 2 to 10 do
  290.             if LRLLevel.Player[i].Controller = 0 then
  291.             begin
  292.               j := i;
  293.               Break;
  294.             end;
  295.             LRLLevel.Player[j].Controller := 2;
  296.             LRLLevel.Player[j].Position.x := x;
  297.             LRLLevel.Player[j].Position.y := y;
  298.             LRLLevel.Player[j].Colour := CurrentTool - 9;
  299.           end;
  300.         end;
  301.       end;
  302.     end;
  303.  
  304.     WaitForEvent(5);
  305.  
  306.   until (Keypress = KEY_ESC);
  307. end;
  308.  
  309.  
  310. end.
  311.