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)) |