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 |