hedgewars/uGearsHandlersMess.pas
changeset 12203 668ee6e388bd
parent 12202 fb2dea5c98f1
child 12205 d52af905437b
equal deleted inserted replaced
12202:fb2dea5c98f1 12203:668ee6e388bd
  6359         begin
  6359         begin
  6360         Gear^.Tag:= Gear^.Tag * -1;
  6360         Gear^.Tag:= Gear^.Tag * -1;
  6361         if Gear^.Pos = 2 then
  6361         if Gear^.Pos = 2 then
  6362             Gear^.Pos:= 1
  6362             Gear^.Pos:= 1
  6363         else if Gear^.Pos = 1 then
  6363         else if Gear^.Pos = 1 then
  6364             Gear^.Pos:= 2;
  6364             Gear^.Pos:= 2
       
  6365         else if Gear^.Pos = 5 then
       
  6366             Gear^.Pos:= 6
       
  6367         else if Gear^.Pos = 5 then
       
  6368             Gear^.Pos:= 5;
  6365         end;
  6369         end;
  6366 
  6370 
  6367     AllInactive := false;
  6371     AllInactive := false;
  6368 
  6372 
  6369     // Duck falls (Pos = 0)
  6373     // Duck falls (Pos = 0)
  6370     if Gear^.Pos = 0 then
  6374     if Gear^.Pos = 0 then
  6371         begin
       
  6372         doStepFallingGear(Gear);
  6375         doStepFallingGear(Gear);
  6373         (* Check if duck is near water surface
  6376 
       
  6377     (* Check if duck is near water surface
  6374            (Karma is distance from water) *)
  6378            (Karma is distance from water) *)
  6375         if cWaterLine <= hwRound(Gear^.Y) + Gear^.Karma then
  6379     if (Gear^.Pos in [0, 5, 6]) and (cWaterLine <= hwRound(Gear^.Y) + Gear^.Karma) then
       
  6380         begin
       
  6381         if cWaterLine = hwRound(Gear^.Y) + Gear^.Karma then
  6376             begin
  6382             begin
  6377             PlaySound(sndDroplet2);
  6383             PlaySound(sndDroplet2);
  6378             if Gear^.dY > _0_4 then
  6384             if Gear^.dY > _0_4 then
  6379                 PlaySound(sndDuckWater);
  6385                 PlaySound(sndDuckWater);
  6380             Gear^.Pos:= 1;
  6386             Gear^.Pos:= 1;
  6381             Gear^.dY:= _0;
  6387             Gear^.dY:= _0;
  6382             end;
  6388             end
  6383         end
  6389         else if Gear^.Pos = 0 then
  6384 
  6390             Gear^.Pos:= 5;
  6385     // Manual speed handling when duck is on water (Pos <> 0)
  6391         end;
  6386     else
  6392 
       
  6393     // Manual speed handling when duck is on water
       
  6394     if Gear^.Pos <> 0 then
  6387         begin
  6395         begin
  6388         Gear^.X:= Gear^.X + Gear^.dX;
  6396         Gear^.X:= Gear^.X + Gear^.dX;
  6389         Gear^.Y:= Gear^.Y + Gear^.dY;
  6397         Gear^.Y:= Gear^.Y + Gear^.dY;
  6390         end;
  6398         end;
  6391 
  6399 
  6392     // Handle speed
  6400     // Handle speed
       
  6401     // 1-4: On water: Let's swim!
  6393     if Gear^.Pos = 1 then
  6402     if Gear^.Pos = 1 then
       
  6403         // On water (normal)
  6394         Gear^.dX:= cWindSpeed * Gear^.Damage
  6404         Gear^.dX:= cWindSpeed * Gear^.Damage
  6395     else if Gear^.Pos = 2 then
  6405     else if Gear^.Pos = 2 then
  6396         // Mirrored duck (after bounce edge bounce)
  6406         // On water, mirrored (after bounce edge bounce)
  6397         Gear^.dX:= -cWindSpeed * Gear^.Damage
  6407         Gear^.dX:= -cWindSpeed * Gear^.Damage
  6398     else if Gear^.Pos = 3 then
  6408     else if Gear^.Pos = 3 then
       
  6409         // On left Sea edge
  6399         Gear^.dY:= cWindSpeed * Gear^.Damage
  6410         Gear^.dY:= cWindSpeed * Gear^.Damage
  6400     else if Gear^.Pos = 4 then
  6411     else if Gear^.Pos = 4 then
  6401         Gear^.dY:= -cWindSpeed * Gear^.Damage;
  6412         // On right Sea edge
       
  6413         Gear^.dY:= -cWindSpeed * Gear^.Damage
       
  6414     // 5-8: Underwater: Slowly rise to the surface and slightly follow wind
       
  6415     else if Gear^.Pos = 5 then
       
  6416         // Underwater (normal)
       
  6417         begin
       
  6418         Gear^.dX:= (cWindSpeed / 4) * Gear^.Damage;
       
  6419         Gear^.dY:= -_0_07;
       
  6420         end
       
  6421     else if Gear^.Pos = 6 then
       
  6422         // Underwater, mirrored duck (after bounce edge bounce)
       
  6423         begin
       
  6424         Gear^.dX:= -(cWindSpeed / 4) * Gear^.Damage;
       
  6425         Gear^.dY:= -_0_07;
       
  6426         end
       
  6427     else if Gear^.Pos = 7 then
       
  6428         // Inside left Sea edge
       
  6429         begin
       
  6430         Gear^.dX:= _0_07;
       
  6431         Gear^.dY:= (cWindSpeed / 4) * Gear^.Damage;
       
  6432         end
       
  6433     else if Gear^.Pos = 8 then
       
  6434         // Inside right Sea edge
       
  6435         begin
       
  6436         Gear^.dX:= -_0_07;
       
  6437         Gear^.dY:= -(cWindSpeed / 4) * Gear^.Damage;
       
  6438         end;
       
  6439  
  6402     
  6440     
  6403     // Rotate duck and change direction when reaching Sea world edge (Pos 3 or 4)
  6441     // Rotate duck and change direction when reaching Sea world edge (Pos 3 or 4)
  6404     if WorldEdge = weSea then
  6442     if (WorldEdge = weSea) and (not (Gear^.Pos in [3,4])) then
  6405         begin
       
  6406         // Left edge
  6443         // Left edge
  6407         if (LeftX >= hwRound(Gear^.X) - Gear^.Karma) and (Gear^.Pos < 3) then
  6444         if (LeftX >= hwRound(Gear^.X) - Gear^.Karma) then
  6408             begin
  6445             begin
  6409             PlaySound(sndDuckWater);
  6446             // Turn duck when reaching edge the first time
  6410             Gear^.Pos:= 3;
  6447             if not (Gear^.Pos in [3,7]) then
  6411             if Gear^.Tag = 1 then
  6448                 begin
  6412                 Gear^.Angle:= 90 
  6449                 if Gear^.Tag = 1 then
  6413             else
  6450                     Gear^.Angle:= 90 
  6414                 Gear^.Angle:= 270;
  6451                 else
  6415             Gear^.dY:= cWindSpeed * Gear^.Damage;
  6452                     Gear^.Angle:= 270;
  6416             Gear^.dX:= _0;
  6453                 end;
       
  6454 
       
  6455             // Reaching the edge surface
       
  6456             if (LeftX = hwRound(Gear^.X) - Gear^.Karma) and (Gear^.Pos <> 3) then
       
  6457                 // We are coming from the horizontal side
       
  6458                 begin
       
  6459                 PlaySound(sndDuckWater);
       
  6460                 Gear^.dX:= _0;
       
  6461                 Gear^.Pos:= 3;
       
  6462                 end
       
  6463             else 
       
  6464                 // We are coming from inside the Sea, go into “surfacing” mode
       
  6465                 Gear^.Pos:= 7;
       
  6466 
  6417             end
  6467             end
  6418         // Right edge
  6468 
  6419         else if (RightX <= hwRound(Gear^.X) + Gear^.Karma) and (Gear^.Pos < 3) then
  6469         // Right edge (similar to left edge)
  6420             begin
  6470         else if (RightX <= hwRound(Gear^.X) + Gear^.Karma) then
  6421             PlaySound(sndDuckWater);
  6471             begin
  6422             Gear^.Pos:= 4;
  6472             if not (Gear^.Pos in [4,8]) then
  6423             if Gear^.Tag = 1 then
  6473                 begin
  6424                 Gear^.Angle:= 270
  6474                 if Gear^.Tag = 1 then
  6425             else
  6475                     Gear^.Angle:= 270 
  6426                 Gear^.Angle:= 90;
  6476                 else
  6427             Gear^.dY:= -cWindspeed * Gear^.Damage;
  6477                     Gear^.Angle:= 90;
  6428             Gear^.dX:= _0;
  6478                 end;
  6429             end;
  6479 
  6430         end;
  6480             if (RightX = hwRound(Gear^.X) + Gear^.Karma) and (Gear^.Pos <> 4) then
       
  6481                 begin
       
  6482                 PlaySound(sndDuckWater);
       
  6483                 Gear^.dX:= _0;
       
  6484                 Gear^.Pos:= 4;
       
  6485                 end
       
  6486             else 
       
  6487                 Gear^.Pos:= 8;
       
  6488 
       
  6489             end;
       
  6490 
  6431 
  6491 
  6432     if Gear^.Pos <> 0 then
  6492     if Gear^.Pos <> 0 then
  6433         // Manual collision check required because we don't use onStepFallingGear in this case
  6493         // Manual collision check required because we don't use onStepFallingGear in this case
  6434         CheckCollision(Gear);
  6494         CheckCollision(Gear);
  6435     if (Gear^.Timer = 0) or ((Gear^.State and gstCollision) <> 0) then
  6495     if (Gear^.Timer = 0) or ((Gear^.State and gstCollision) <> 0) then