hedgewars/GSHandlers.inc
changeset 4791 458d9854c679
parent 4790 4cb3f7890fbd
child 4792 68f9b331014a
equal deleted inserted replaced
4790:4cb3f7890fbd 4791:458d9854c679
   561 procedure doStepSnowflake(Gear: PGear);
   561 procedure doStepSnowflake(Gear: PGear);
   562 var xx, yy, px, py, i: LongInt;
   562 var xx, yy, px, py, i: LongInt;
   563     move, allpx: Boolean;
   563     move, allpx: Boolean;
   564     s: PSDL_Surface;
   564     s: PSDL_Surface;
   565     p: PLongwordArray;
   565     p: PLongwordArray;
       
   566     oAlpha, nAlpha: byte;
   566 begin
   567 begin
   567 if GameTicks and $7 = 0 then
   568 if GameTicks and $7 = 0 then
   568     begin
   569     begin
   569     with Gear^ do
   570     with Gear^ do
   570         begin
   571         begin
   588             end;
   589             end;
   589 
   590 
   590         move:= false;
   591         move:= false;
   591     // move back to cloud layer
   592     // move back to cloud layer
   592         if yy > cWaterLine then move:= true
   593         if yy > cWaterLine then move:= true
   593         else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] > 255) then
   594         else if ((yy and LAND_HEIGHT_MASK) <> 0) or ((xx and LAND_WIDTH_MASK) <> 0) then move:=true
   594             begin
   595         // Solid pixel encountered
   595             // we've collided with land. draw some stuff and get back into the clouds
   596         else if (Land[yy, xx] > 255) then
   596             move:= true;
   597             begin
   597             if (CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtRope) then
   598             // If there's room below keep falling
       
   599             if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (Land[yy-1, xx] = 0) then
   598                 begin
   600                 begin
   599 ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
   601                 X:= X - cWindSpeed * 1600 - dX;
   600                 if cWindSpeed * 1600 + dX < _0 then i:= -1
   602                 end
   601                 else i:= 1;
   603             // If there's room below, on the sides, fill the gaps
   602                 if (yy > 0) and ((Land[yy-1, xx] and $FF00) = 0) then dec(yy)
   604             else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx-(1*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx-(1*hwSign(cWindSpeed)))] = 0) then
   603                 else dec(xx, i);
   605                 begin
   604                 dec(yy,2);
   606                 X:= X - _0_8 * hwSign(cWindSpeed);
   605                 dec(xx,i);
   607                 Y:= Y - dY - cGravity * vobFallSpeed * 8;
   606                 s:= SpritesData[sprSnow].Surface;
   608                 end
   607                 p:= s^.pixels;
   609             else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx-(2*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx-(2*hwSign(cWindSpeed)))] = 0) then
   608                 allpx:= true;
   610                 begin
   609                 for py:= 0 to Pred(s^.h) do
   611                 X:= X - _0_8 * 2 * hwSign(cWindSpeed);
       
   612                 Y:= Y - dY - cGravity * vobFallSpeed * 8;
       
   613                 end
       
   614             else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx+(1*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx+(1*hwSign(cWindSpeed)))] = 0) then
       
   615                 begin
       
   616                 X:= X + _0_8 * hwSign(cWindSpeed);
       
   617                 Y:= Y - dY - cGravity * vobFallSpeed * 8;
       
   618                 end
       
   619             else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx+(2*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx+(2*hwSign(cWindSpeed)))] = 0) then
       
   620                 begin
       
   621                 X:= X + _0_8 * 2 * hwSign(cWindSpeed);
       
   622                 Y:= Y - dY - cGravity * vobFallSpeed * 8;
       
   623                 end
       
   624             else
       
   625                 begin
       
   626                 // we've collided with land. draw some stuff and get back into the clouds
       
   627                 move:= true;
       
   628                 if (CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtRope) then
   610                     begin
   629                     begin
   611                     for px:= 0 to Pred(s^.w) do
   630     ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
   612                         if (((yy + py) and LAND_HEIGHT_MASK) = 0) and (((xx + px) and LAND_WIDTH_MASK) = 0) and 
   631                     dec(yy,3);
   613                            ((Land[yy + py, xx + px] and $FF00) = 0) then
   632                     dec(xx,2);
       
   633                     s:= SpritesData[sprSnow].Surface;
       
   634                     p:= s^.pixels;
       
   635                     allpx:= true;
       
   636                     for py:= 0 to Pred(s^.h) do
       
   637                         begin
       
   638                         for px:= 0 to Pred(s^.w) do
       
   639                             if (((yy + py) and LAND_HEIGHT_MASK) = 0) and (((xx + px) and LAND_WIDTH_MASK) = 0) then
       
   640                                 begin
       
   641                                 if (cReducedQuality and rqBlurryLand) = 0 then
       
   642                                     begin
       
   643                                     LandPixels[yy + py, xx + px]:= addBgColor(LandPixels[yy + py, xx + px], p^[px]);
       
   644                                     Land[yy + py, xx + px]:= Land[yy + py, xx + px] or lfObject;
       
   645                                     end
       
   646                                 else
       
   647                                     begin
       
   648                                     LandPixels[(yy + py) div 2, (xx + px) div 2]:= addBgColor(LandPixels[(yy + py) div 2, (xx + px) div 2], p^[px]);
       
   649                                     Land[(yy + py) div 2, (xx + px) div 2]:= Land[(yy + py) div 2, (xx + px) div 2] or lfObject;
       
   650                                     end;
       
   651                                 end
       
   652                             else allpx:= false;
       
   653                         p:= @(p^[s^.pitch shr 2])
       
   654                         end;
       
   655                     
       
   656                     for py:= (yy) to (yy+1) do
       
   657                         begin
       
   658                         for px:= (xx+2) to (xx+3) do
   614                             begin
   659                             begin
   615                             if (cReducedQuality and rqBlurryLand) = 0 then
   660                             Land[py, px]:= lfBasic;
   616                                 LandPixels[yy + py, xx + px]:= p^[px]
   661                             end;
   617                             else
   662                         end;
   618                                 LandPixels[(yy + py) div 2, (xx + px) div 2]:= p^[px]
   663                     
   619                             end
   664                     if allpx then UpdateLandTexture(xx, Pred(s^.h), yy, Pred(s^.w))
   620                         else allpx:= false;
   665                     else
   621                     p:= @(p^[s^.pitch shr 2])
   666                         begin
   622                     end;
   667                         UpdateLandTexture(
   623                 if allpx then UpdateLandTexture(xx, 4, yy, 4)
   668                             max(0, min(LAND_WIDTH, xx)),
   624                 else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) then UpdateLandTexture(xx, 1, yy, 1);
   669                             min(LAND_WIDTH - xx, Pred(s^.w)),
   625                 inc(yy,2);
   670                             max(0, min(LAND_WIDTH, yy)),
   626                 inc(xx,i);
   671                             min(LAND_HEIGHT - yy, Pred(s^.h))
   627                 if ((xx and LAND_WIDTH_MASK) = 0) and ((yy and LAND_HEIGHT_MASK) = 0) then Land[yy, xx]:= Land[yy, xx] or lfObject;
   672                         );
   628                 if yy > 0 then
   673                         end;
   629                     begin 
   674     ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
   630                     Land[yy-1, xx]:= Land[yy-1, xx] or lfObject;
   675                     end
   631                     if ((xx-i and LAND_WIDTH_MASK) = 0) then Land[yy-1, xx-i]:= Land[yy-1, xx-i] or lfObject;
   676                 end;
   632                     end;
       
   633                 if ((xx-i and LAND_WIDTH_MASK) = 0) and ((yy and LAND_HEIGHT_MASK) = 0) then Land[yy, xx-i]:= Land[yy, xx-i] or lfObject
       
   634 ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
       
   635                 end
       
   636             end;
   677             end;
   637         if move then
   678         if move then
   638             begin
   679             begin
   639             X:= int2hwFloat(GetRandom(LAND_WIDTH+1024)-512);
   680             X:= int2hwFloat(GetRandom(LAND_WIDTH+1024)-512);
   640             Y:= int2hwFloat(750+(GetRandom(50)-25))
   681             Y:= int2hwFloat(750+(GetRandom(50)-25))