hedgewars/GSHandlers.inc
changeset 4647 20b982afbe6e
parent 4642 d9e7d173e6a7
child 4655 b75bb4307b0f
equal deleted inserted replaced
4588:5ef5415c4ee1 4647:20b982afbe6e
   318     if Gear^.AdvBounce > 1 then dec(Gear^.AdvBounce);
   318     if Gear^.AdvBounce > 1 then dec(Gear^.AdvBounce);
   319 
   319 
   320     if isFalling then 
   320     if isFalling then 
   321         begin
   321         begin
   322         Gear^.dY := Gear^.dY + cGravity;
   322         Gear^.dY := Gear^.dY + cGravity;
   323         if (GameFlags and gfMoreWind) <> 0 then Gear^.dX := Gear^.dX + cWindSpeed * _16 / max(12,sqr(Gear^.Radius))
   323         if (GameFlags and gfMoreWind) <> 0 then Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density
   324         end;
   324         end;
   325 
   325 
   326     Gear^.X := Gear^.X + Gear^.dX;
   326     Gear^.X := Gear^.X + Gear^.dX;
   327     Gear^.Y := Gear^.Y + Gear^.dY;
   327     Gear^.Y := Gear^.Y + Gear^.dY;
   328     CheckGearDrowning(Gear);
   328     CheckGearDrowning(Gear);
   556         particle:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust);
   556         particle:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust);
   557         if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480)
   557         if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480)
   558         end
   558         end
   559 end;
   559 end;
   560 
   560 
       
   561 procedure doStepSnowflake(Gear: PGear);
       
   562 var xx, yy, px, py, i: LongInt;
       
   563     move, allpx: Boolean;
       
   564     s: PSDL_Surface;
       
   565     p: PLongwordArray;
       
   566 begin
       
   567 if GameTicks and $7 = 0 then
       
   568     begin
       
   569     with Gear^ do
       
   570         begin
       
   571         X:= X + cWindSpeed * 1600 + dX;
       
   572         Y:= Y + dY + cGravity * vobFallSpeed * 8;  // using same value as flakes to try and get similar results
       
   573         xx:= hwRound(X);
       
   574         yy:= hwRound(Y);
       
   575         if vobVelocity <> 0 then
       
   576             begin
       
   577             DirAngle := DirAngle + (Angle / 1250000000);
       
   578             if DirAngle < 0 then DirAngle := DirAngle + 360
       
   579             else if 360 < DirAngle then DirAngle := DirAngle - 360;
       
   580             end;
       
   581 
       
   582         inc(Health, 8);
       
   583         if Health > vobFrameTicks then
       
   584             begin
       
   585             dec(Health, vobFrameTicks);
       
   586             inc(Timer);
       
   587             if Timer = vobFramesCount then Timer:= 0
       
   588             end;
       
   589 
       
   590         move:= false;
       
   591     // move back to cloud layer
       
   592         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             begin
       
   595             // we've collided with land. draw some stuff and get back into the clouds
       
   596             move:= true;
       
   597 ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
       
   598             if cWindSpeed * 1600 + dX < _0 then i:= -1
       
   599             else i:= 1;
       
   600             if (yy > 0) and ((Land[yy-1, xx] and $FF00) = 0) then dec(yy)
       
   601             else dec(xx, i);
       
   602             dec(yy,2);
       
   603             dec(xx,i);
       
   604             s:= SpritesData[sprSnow].Surface;
       
   605             p:= s^.pixels;
       
   606             allpx:= true;
       
   607             for py:= 0 to Pred(s^.h) do
       
   608                 begin
       
   609                 for px:= 0 to Pred(s^.w) do
       
   610                     if ((yy + py and LAND_HEIGHT_MASK) = 0) and ((xx + px and LAND_WIDTH_MASK) = 0) and 
       
   611                        ((Land[yy + py, xx + px] and $FF00) = 0) then
       
   612                         begin
       
   613                         if (cReducedQuality and rqBlurryLand) = 0 then
       
   614                             LandPixels[yy + py, xx + px]:= p^[px]
       
   615                         else
       
   616                             LandPixels[(yy + py) div 2, (xx + px) div 2]:= p^[px]
       
   617                         end
       
   618                     else allpx:= false;
       
   619                 p:= @(p^[s^.pitch shr 2])
       
   620                 end;
       
   621             if allpx then UpdateLandTexture(xx, 4, yy, 4)
       
   622             else UpdateLandTexture(xx, 1, yy, 1);
       
   623             inc(yy,2);
       
   624             inc(xx,i);
       
   625             if ((xx and LAND_WIDTH_MASK) = 0) and ((yy and LAND_HEIGHT_MASK) = 0) then Land[yy, xx]:= Land[yy, xx] or lfObject;
       
   626             if yy > 0 then
       
   627                 begin 
       
   628                 Land[yy-1, xx]:= Land[yy-1, xx] or lfObject;
       
   629                 if ((xx-i and LAND_WIDTH_MASK) = 0) then Land[yy-1, xx-i]:= Land[yy-1, xx-i] or lfObject;
       
   630                 end;
       
   631             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
       
   632 ////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
       
   633             end;
       
   634         if move then
       
   635             begin
       
   636             X:= int2hwFloat(GetRandom(LAND_WIDTH+1024)-512);
       
   637             Y:= int2hwFloat(750+(GetRandom(50)-25))
       
   638             end
       
   639         end
       
   640     end
       
   641 end;
       
   642 
   561 ////////////////////////////////////////////////////////////////////////////////
   643 ////////////////////////////////////////////////////////////////////////////////
   562 procedure doStepGrave(Gear: PGear);
   644 procedure doStepGrave(Gear: PGear);
   563 begin
   645 begin
   564     AllInactive := false;
   646     AllInactive := false;
   565     if Gear^.dY.isNegative then
   647     if Gear^.dY.isNegative then
  1154 
  1236 
  1155     if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY := _0;
  1237     if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY := _0;
  1156     HHGear^.X := HHGear^.X + HHGear^.dX;
  1238     HHGear^.X := HHGear^.X + HHGear^.dX;
  1157     HHGear^.Y := HHGear^.Y + HHGear^.dY;
  1239     HHGear^.Y := HHGear^.Y + HHGear^.dY;
  1158     HHGear^.dY := HHGear^.dY + cGravity;
  1240     HHGear^.dY := HHGear^.dY + cGravity;
  1159     if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2;
  1241     if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
  1160 
  1242 
  1161     if (Gear^.Message and gmAttack) <> 0 then
  1243     if (Gear^.Message and gmAttack) <> 0 then
  1162     begin
  1244     begin
  1163         Gear^.X := HHGear^.X;
  1245         Gear^.X := HHGear^.X;
  1164         Gear^.Y := HHGear^.Y;
  1246         Gear^.Y := HHGear^.Y;
  1220         if (Gear^.Message and gmRight <> 0) then HHGear^.dX := HHGear^.dX + _0_0002;
  1302         if (Gear^.Message and gmRight <> 0) then HHGear^.dX := HHGear^.dX + _0_0002;
  1221 
  1303 
  1222     if not TestCollisionYwithGear(HHGear, 1) then
  1304     if not TestCollisionYwithGear(HHGear, 1) then
  1223         begin
  1305         begin
  1224         HHGear^.dY := HHGear^.dY + cGravity;
  1306         HHGear^.dY := HHGear^.dY + cGravity;
  1225         if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2
  1307         if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
  1226         end;
  1308         end;
  1227 
  1309 
  1228     ropeDx := HHGear^.X - Gear^.X;
  1310     ropeDx := HHGear^.X - Gear^.X;
  1229     // vector between hedgehog and rope attaching point
  1311     // vector between hedgehog and rope attaching point
  1230     ropeDy := HHGear^.Y - Gear^.Y;
  1312     ropeDy := HHGear^.Y - Gear^.Y;
  1449         else
  1531         else
  1450             begin
  1532             begin
  1451             HHGear^.Y := HHGear^.Y + HHGear^.dY;
  1533             HHGear^.Y := HHGear^.Y + HHGear^.dY;
  1452             Gear^.Y := Gear^.Y + HHGear^.dY;
  1534             Gear^.Y := Gear^.Y + HHGear^.dY;
  1453             HHGear^.dY := HHGear^.dY + cGravity;
  1535             HHGear^.dY := HHGear^.dY + cGravity;
  1454             if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2
  1536             if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density
  1455             end;
  1537             end;
  1456 
  1538 
  1457         tt := Gear^.Elasticity;
  1539         tt := Gear^.Elasticity;
  1458         tx := _0;
  1540         tx := _0;
  1459         ty := _0;
  1541         ty := _0;
  3696         if not hasdxy and not (conPortal^.dY.isNegative) then
  3778         if not hasdxy and not (conPortal^.dY.isNegative) then
  3697         begin
  3779         begin
  3698             iterator^.dY:= iterator^.dY + hwAbs(cGravity * (iterator^.Y - conPortal^.Y))
  3780             iterator^.dY:= iterator^.dY + hwAbs(cGravity * (iterator^.Y - conPortal^.Y))
  3699         end;
  3781         end;
  3700 
  3782 
  3701         if not isbullet then
  3783         if not isbullet and (iterator^.Kind <> gtFlake) then
  3702             FollowGear := iterator;
  3784             FollowGear := iterator;
  3703 //AddFileLog('portal''d');
  3785 //AddFileLog('portal''d');
  3704 
  3786 
  3705 {
  3787 {
  3706         s := _0_2 + _0_008 * Gear^.Health;
  3788         s := _0_2 + _0_008 * Gear^.Health;