hedgewars/uGearsHandlersMess.pas
changeset 12192 de9144250c37
parent 12174 4a9e2ece6667
child 12194 ac9cf0cf40ee
equal deleted inserted replaced
12191:5c6e7fd5af29 12192:de9144250c37
   136 procedure doStepIceGun(Gear: PGear);
   136 procedure doStepIceGun(Gear: PGear);
   137 procedure doStepAddAmmo(Gear: PGear);
   137 procedure doStepAddAmmo(Gear: PGear);
   138 procedure doStepGenericFaller(Gear: PGear);
   138 procedure doStepGenericFaller(Gear: PGear);
   139 //procedure doStepCreeper(Gear: PGear);
   139 //procedure doStepCreeper(Gear: PGear);
   140 procedure doStepKnife(Gear: PGear);
   140 procedure doStepKnife(Gear: PGear);
       
   141 procedure doStepDuck(Gear: PGear);
   141 
   142 
   142 var
   143 var
   143     upd: Longword;
   144     upd: Longword;
   144     snowLeft,snowRight: LongInt;
   145     snowLeft,snowRight: LongInt;
   145 
   146 
  6343         and (TestCollisionXwithGear(Gear, 1) = 0)
  6344         and (TestCollisionXwithGear(Gear, 1) = 0)
  6344         and (TestCollisionXwithGear(Gear,-1) = 0)
  6345         and (TestCollisionXwithGear(Gear,-1) = 0)
  6345         and (TestCollisionYwithGear(Gear, 1) = 0) then Gear^.State:= Gear^.State and (not gstCollision) or gstMoving;
  6346         and (TestCollisionYwithGear(Gear, 1) = 0) then Gear^.State:= Gear^.State and (not gstCollision) or gstMoving;
  6346         end
  6347         end
  6347 end;
  6348 end;
       
  6349 
       
  6350 ////////////////////////////////////////////////////////////////////////////////
       
  6351 procedure doStepDuck(Gear: PGear);
       
  6352 begin
       
  6353     // Mirror duck on bounce world edge, even turn around later
       
  6354     if WorldWrap(Gear) and (WorldEdge = weBounce) then
       
  6355         begin
       
  6356         Gear^.Tag:= Gear^.Tag * -1;
       
  6357         if Gear^.Pos = 2 then
       
  6358             Gear^.Pos:= 1
       
  6359         else if Gear^.Pos = 1 then
       
  6360             Gear^.Pos:= 2;
       
  6361         end;
       
  6362 
       
  6363     AllInactive := false;
       
  6364 
       
  6365     // Duck falls (Pos = 0)
       
  6366     if Gear^.Pos = 0 then
       
  6367         begin
       
  6368         doStepFallingGear(Gear);
       
  6369         // Karma is distance from water
       
  6370         if cWaterLine <= hwRound(Gear^.Y) + Gear^.Karma then
       
  6371             begin
       
  6372             Gear^.Pos:= 1;
       
  6373             Gear^.Timer:= Gear^.WDTimer;
       
  6374             Gear^.dY:= _0;
       
  6375             Gear^.State:= Gear^.State or gstNoGravity;
       
  6376             end;
       
  6377         end
       
  6378 
       
  6379     // Manual speed handling when duck is on water (Pos <> 0)
       
  6380     else
       
  6381         begin
       
  6382         Gear^.X:= Gear^.X + Gear^.dX;
       
  6383         Gear^.Y:= Gear^.Y + Gear^.dY;
       
  6384         end;
       
  6385 
       
  6386     // Mirrored duck
       
  6387     // Pos 1 or 2: Duck is on water (not Sea world edge)
       
  6388     if Gear^.Pos = 1 then
       
  6389         Gear^.dX:= cWindSpeed * 500
       
  6390     else if Gear^.Pos = 2 then
       
  6391         Gear^.dX:= -cWindSpeed * 500;
       
  6392     
       
  6393     // Rotate duck and change direction when reaching Sea world edge (Pos 3 or 4)
       
  6394     if WorldEdge = weSea then
       
  6395         begin
       
  6396         // Left edge
       
  6397         if (LeftX >= hwRound(Gear^.X) - Gear^.Karma) and (Gear^.Pos < 3) then
       
  6398             begin
       
  6399             Gear^.Pos:= 3;
       
  6400             if Gear^.Tag = 1 then
       
  6401                 Gear^.Angle:= 90 
       
  6402             else
       
  6403                 Gear^.Angle:= 270;
       
  6404             Gear^.dY:= Gear^.dX;
       
  6405             Gear^.dX:= _0;
       
  6406             end
       
  6407         // Right edge
       
  6408         else if (RightX <= hwRound(Gear^.X) + Gear^.Karma) and (Gear^.Pos < 3) then
       
  6409             begin
       
  6410             Gear^.Pos:= 4;
       
  6411         if Gear^.Tag = 1 then
       
  6412                 Gear^.Angle:= 270
       
  6413             else
       
  6414                 Gear^.Angle:= 90;
       
  6415             Gear^.dY:= -Gear^.dX;
       
  6416             Gear^.dX:= _0;
       
  6417             end;
       
  6418         end;
       
  6419 
       
  6420     // Explode duck
       
  6421     CheckCollision(Gear);
       
  6422     if (Gear^.Timer = 0) or ((Gear^.State and gstCollision) <> 0) then
       
  6423         begin
       
  6424         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
       
  6425         DeleteGear(Gear);
       
  6426         exit;
       
  6427         end;
       
  6428 
       
  6429     dec(Gear^.Timer);
       
  6430 end;
       
  6431 
  6348 (*
  6432 (*
  6349  This didn't end up getting used, but, who knows, might be reasonable for javellin or something
  6433  This didn't end up getting used, but, who knows, might be reasonable for javellin or something
  6350 // Make the knife initial angle based on the hog attack angle, or is that too hard?
  6434 // Make the knife initial angle based on the hog attack angle, or is that too hard?
  6351 procedure doStepKnife(Gear: PGear);
  6435 procedure doStepKnife(Gear: PGear);
  6352 var t,
  6436 var t,