hedgewars/uLandGraphics.pas
changeset 7270 93e92e82d5c8
parent 7268 3a61c53346a8
child 7492 3188794b9d87
equal deleted inserted replaced
7268:3a61c53346a8 7270:93e92e82d5c8
    34 function  CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
    34 function  CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
    35 function  DrawExplosion(X, Y, Radius: LongInt): Longword;
    35 function  DrawExplosion(X, Y, Radius: LongInt): Longword;
    36 procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte);
    36 procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte);
    37 procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt);
    37 procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt);
    38 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
    38 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
    39 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean);
    39 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean);
    40 function  LandBackPixel(x, y: LongInt): LongWord;
    40 function  LandBackPixel(x, y: LongInt): LongWord;
    41 procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword);
    41 procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword);
    42 procedure DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword);
    42 procedure DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword);
    43 procedure DumpLandToLog(x, y, r: LongInt);
    43 procedure DumpLandToLog(x, y, r: LongInt);
    44 
    44 
    97     for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
    97     for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
    98         if (Land[y - dx, i] and lfIndestructible) = 0 then
    98         if (Land[y - dx, i] and lfIndestructible) = 0 then
    99             Land[y - dx, i]:= Value;
    99             Land[y - dx, i]:= Value;
   100 end;
   100 end;
   101 
   101 
   102 procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet: boolean);
   102 procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet, isCurrent: boolean);
   103 var i: LongInt;
   103 var i: LongInt;
   104 begin
   104 begin
   105 if not doSet then
   105 if not doSet then
   106     begin
   106     begin
   107     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
   107     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
   108         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   108         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   109             if (Land[y + dy, i] > 0) and (Land[y + dy, i] < 256) then
   109             if isCurrent then 
   110                 dec(Land[y + dy, i]); // check > 0 because explosion can erase collision data
   110                 Land[y + dy, i]:= Land[y + dy, i] and $FF7F
       
   111             else if Land[y + dy, i] and $007F > 0 then
       
   112                 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) - 1);
   111     if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
   113     if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
   112         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   114         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   113             if (Land[y - dy, i] > 0) and (Land[y - dy, i] < 256) then
   115             if isCurrent then 
   114                 dec(Land[y - dy, i]);
   116                 Land[y - dy, i]:= Land[y - dy, i] and $FF7F
       
   117             else if Land[y - dy, i] and $007F > 0 then
       
   118                 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) - 1);
   115     if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
   119     if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
   116         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   120         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   117             if (Land[y + dx, i] > 0) and (Land[y + dx, i] < 256) then
   121             if isCurrent then 
   118                 dec(Land[y + dx, i]);
   122                 Land[y + dx, i]:= Land[y + dx, i] and $FF7F
       
   123             else if Land[y + dx, i] and $007F > 0 then
       
   124                 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) - 1);
   119     if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
   125     if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
   120         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   126         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   121             if (Land[y - dx, i] > 0) and (Land[y - dx, i] < 256) then
   127             if isCurrent then 
   122                 dec(Land[y - dx, i]);
   128                 Land[y - dx, i]:= Land[y - dx, i] and $FF7F
       
   129             else if Land[y - dx, i] and $007F > 0 then
       
   130                 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) - 1)
   123     end
   131     end
   124 else
   132 else
   125     begin
   133     begin
   126     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
   134     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
   127         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   135         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   128             if (Land[y + dy, i] < 256) then
   136             if isCurrent then 
   129                 inc(Land[y + dy, i]);
   137                 Land[y + dy, i]:= Land[y + dy, i] or $80
   130     if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
   138             else if Land[y + dy, i] and $007F < 127 then
   131         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
   139                 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) + 1);
   132             if (Land[y - dy, i] < 256) then
   140     if ((y - dy) and LAND_HEIGHT_MASK) = 0 then                                                   
   133                 inc(Land[y - dy, i]);
   141         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do                                  
   134     if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
   142             if isCurrent then                                                                     
   135         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   143                 Land[y - dy, i]:= Land[y - dy, i] or $80                                          
   136             if (Land[y + dx, i] < 256) then
   144             else if Land[y - dy, i] and $007F < 127 then                                          
   137                 inc(Land[y + dx, i]);
   145                 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) + 1);
   138     if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
   146     if ((y + dx) and LAND_HEIGHT_MASK) = 0 then                                                   
   139         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
   147         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do                                  
   140             if (Land[y - dx, i] < 256) then
   148             if isCurrent then                                                                     
   141                 inc(Land[y - dx, i]);
   149                 Land[y + dx, i]:= Land[y + dx, i] or $80                                          
       
   150             else if Land[y + dx, i] and $007F < 127 then                                          
       
   151                 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) + 1);
       
   152     if ((y - dx) and LAND_HEIGHT_MASK) = 0 then                                                   
       
   153         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do                                  
       
   154             if isCurrent then                                                                     
       
   155                 Land[y - dx, i]:= Land[y - dx, i] or $80                                          
       
   156             else if Land[y - dx, i] and $007F < 127 then                                          
       
   157                 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) + 1)
   142     end
   158     end
   143 end;
   159 end;
   144 
   160 
   145 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
   161 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
   146 var dx, dy, d: LongInt;
   162 var dx, dy, d: LongInt;
   162     end;
   178     end;
   163 if (dx = dy) then
   179 if (dx = dy) then
   164     FillCircleLines(x, y, dx, dy, Value);
   180     FillCircleLines(x, y, dx, dy, Value);
   165 end;
   181 end;
   166 
   182 
   167 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean);
   183 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean);
   168 var dx, dy, d: LongInt;
   184 var dx, dy, d: LongInt;
   169 begin
   185 begin
   170 dx:= 0;
   186 dx:= 0;
   171 dy:= Radius;
   187 dy:= Radius;
   172 d:= 3 - 2 * Radius;
   188 d:= 3 - 2 * Radius;
   173 while (dx < dy) do
   189 while (dx < dy) do
   174     begin
   190     begin
   175     ChangeCircleLines(x, y, dx, dy, doSet);
   191     ChangeCircleLines(x, y, dx, dy, doSet, isCurrent);
   176     if (d < 0) then
   192     if (d < 0) then
   177         d:= d + 4 * dx + 6
   193         d:= d + 4 * dx + 6
   178     else
   194     else
   179         begin
   195         begin
   180         d:= d + 4 * (dx - dy) + 10;
   196         d:= d + 4 * (dx - dy) + 10;
   181         dec(dy)
   197         dec(dy)
   182         end;
   198         end;
   183     inc(dx)
   199     inc(dx)
   184     end;
   200     end;
   185 if (dx = dy) then
   201 if (dx = dy) then
   186     ChangeCircleLines(x, y, dx, dy, doSet)
   202     ChangeCircleLines(x, y, dx, dy, doSet, isCurrent)
   187 end;
   203 end;
   188 
   204 
   189 procedure FillLandCircleLines0(x, y, dx, dy: LongInt);
   205 procedure FillLandCircleLines0(x, y, dx, dy: LongInt);
   190 var i, t: LongInt;
   206 var i, t: LongInt;
   191 begin
   207 begin