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