Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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