57 procedure SetAllToActive; |
57 procedure SetAllToActive; |
58 procedure SetAllHHToActive; |
58 procedure SetAllHHToActive; |
59 procedure DrawGears(Surface: PSDL_Surface); |
59 procedure DrawGears(Surface: PSDL_Surface); |
60 procedure FreeGearsList; |
60 procedure FreeGearsList; |
61 procedure AddMiscGears; |
61 procedure AddMiscGears; |
62 procedure AddClouds; |
|
63 procedure AssignHHCoords; |
62 procedure AssignHHCoords; |
64 procedure InsertGearToList(Gear: PGear); |
63 procedure InsertGearToList(Gear: PGear); |
65 procedure RemoveGearFromList(Gear: PGear); |
64 procedure RemoveGearFromList(Gear: PGear); |
66 |
65 |
67 var CurAmmoGear: PGear = nil; |
66 var CurAmmoGear: PGear = nil; |
136 @doStepSwitcher, |
134 @doStepSwitcher, |
137 @doStepCase |
135 @doStepCase |
138 ); |
136 ); |
139 |
137 |
140 procedure InsertGearToList(Gear: PGear); |
138 procedure InsertGearToList(Gear: PGear); |
141 var tmp: PGear; |
139 var tmp, ptmp: PGear; |
142 begin |
140 begin |
143 if GearsList = nil then |
141 if GearsList = nil then |
144 GearsList:= Gear |
142 GearsList:= Gear |
145 else begin |
143 else begin |
146 // WARNING: this code assumes that the first gears added to the list are clouds (have maximal Z) |
|
147 tmp:= GearsList; |
144 tmp:= GearsList; |
148 while (tmp <> nil) and (tmp^.Z < Gear^.Z) do |
145 ptmp:= GearsList; |
149 tmp:= tmp^.NextGear; |
146 while (tmp <> nil) and (tmp^.Z <= Gear^.Z) do |
150 |
147 begin |
151 if tmp^.PrevGear <> nil then tmp^.PrevGear^.NextGear:= Gear; |
148 ptmp:= tmp; |
152 Gear^.PrevGear:= tmp^.PrevGear; |
149 tmp:= tmp^.NextGear |
153 tmp^.PrevGear:= Gear; |
150 end; |
154 Gear^.NextGear:= tmp; |
151 |
155 if GearsList = tmp then GearsList:= Gear |
152 if ptmp <> nil then |
|
153 begin |
|
154 Gear^.NextGear:= ptmp^.NextGear; |
|
155 Gear^.PrevGear:= ptmp; |
|
156 if ptmp^.NextGear <> nil then ptmp^.NextGear^.PrevGear:= Gear; |
|
157 ptmp^.NextGear:= Gear |
|
158 end |
|
159 else GearsList:= Gear |
156 end |
160 end |
157 end; |
161 end; |
158 |
162 |
159 procedure RemoveGearFromList(Gear: PGear); |
163 procedure RemoveGearFromList(Gear: PGear); |
160 begin |
164 begin |
577 begin |
580 begin |
578 Gear:= GearsList; |
581 Gear:= GearsList; |
579 while Gear<>nil do |
582 while Gear<>nil do |
580 begin |
583 begin |
581 case Gear^.Kind of |
584 case Gear^.Kind of |
582 gtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); |
|
583 gtAmmo_Bomb: DrawRotated(sprBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.DirAngle); |
585 gtAmmo_Bomb: DrawRotated(sprBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.DirAngle); |
584 gtHedgehog: DrawHH(Gear, Surface); |
586 gtHedgehog: DrawHH(Gear, Surface); |
585 gtAmmo_Grenade: DrawRotated(sprGrenade, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, DxDy2Angle(Gear^.dY, Gear^.dX)); |
587 gtAmmo_Grenade: DrawRotated(sprGrenade, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, DxDy2Angle(Gear^.dY, Gear^.dX)); |
586 gtHealthTag, |
588 gtHealthTag, |
587 gtSmallDamage: if Gear^.Tex <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Tex); |
589 gtSmallDamage: if Gear^.Tex <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Tex); |
654 if (GameFlags and gfForts) = 0 then |
656 if (GameFlags and gfForts) = 0 then |
655 for i:= 0 to Pred(cLandAdditions) do |
657 for i:= 0 to Pred(cLandAdditions) do |
656 FindPlace(AddGear(0, 0, gtMine, 0, _0, _0, 0), false, 0, 2048); |
658 FindPlace(AddGear(0, 0, gtMine, 0, _0, _0, 0), false, 0, 2048); |
657 end; |
659 end; |
658 |
660 |
659 procedure AddClouds; |
|
660 var i: LongInt; |
|
661 dx, dy: hwFloat; |
|
662 begin |
|
663 for i:= 0 to cCloudsNumber do |
|
664 begin |
|
665 dx.isNegative:= random(2) = 1; |
|
666 dx.QWordValue:= random(214748364); |
|
667 dy.isNegative:= (i and 1) = 1; |
|
668 dy.QWordValue:= 21474836 + random(64424509); |
|
669 AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, |
|
670 gtCloud, random(4), dx, dy, 0) |
|
671 end |
|
672 end; |
|
673 |
|
674 procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); |
661 procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); |
675 var Gear: PGear; |
662 var Gear: PGear; |
676 dmg, dmgRadius: LongInt; |
663 dmg, dmgRadius: LongInt; |
677 begin |
664 begin |
678 TargetPoint.X:= NoPointX; |
665 TargetPoint.X:= NoPointX; |