88 end; |
88 end; |
89 |
89 |
90 procedure DeleteGear(Gear: PGear); forward; |
90 procedure DeleteGear(Gear: PGear); forward; |
91 procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward; |
91 procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward; |
92 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); forward; |
92 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); forward; |
|
93 procedure AmmoFlameWork(Ammo: PGear); forward; |
93 function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward; |
94 function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward; |
94 procedure SpawnBoxOfSmth; forward; |
95 procedure SpawnBoxOfSmth; forward; |
95 procedure AfterAttack; forward; |
96 procedure AfterAttack; forward; |
96 procedure FindPlace(Gear: PGear; withFall: boolean; Left, Right: integer); forward; |
97 procedure FindPlace(Gear: PGear; withFall: boolean; Left, Right: integer); forward; |
97 |
98 |
116 doStepCase, |
117 doStepCase, |
117 doStepDEagleShot, |
118 doStepDEagleShot, |
118 doStepDynamite, |
119 doStepDynamite, |
119 doStepTeamHealthSorter, |
120 doStepTeamHealthSorter, |
120 doStepBomb, |
121 doStepBomb, |
121 doStepCluster |
122 doStepCluster, |
|
123 doStepShover, |
|
124 doStepFlame |
122 ); |
125 ); |
123 |
126 |
124 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear; |
127 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear; |
125 begin |
128 const Counter: Longword = 0; |
|
129 begin |
|
130 inc(Counter); |
126 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+')');{$ENDIF} |
131 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+')');{$ENDIF} |
127 New(Result); |
132 New(Result); |
128 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF} |
133 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF} |
129 FillChar(Result^, sizeof(TGear), 0); |
134 FillChar(Result^, sizeof(TGear), 0); |
130 Result.X:= X; |
135 Result.X:= X; |
215 gtClusterBomb: begin |
220 gtClusterBomb: begin |
216 Result.Radius:= 4; |
221 Result.Radius:= 4; |
217 Result.Elasticity:= 0.6; |
222 Result.Elasticity:= 0.6; |
218 Result.Friction:= 0.995; |
223 Result.Friction:= 0.995; |
219 Result.Timer:= Timer |
224 Result.Timer:= Timer |
|
225 end; |
|
226 gtFlame: begin |
|
227 Result.Angle:= Counter mod 64; |
|
228 Result.Radius:= 1; |
|
229 Result.Health:= 2; |
|
230 Result.dY:= (getrandom - 0.8) * 0.03; |
|
231 Result.dX:= (getrandom - 0.5) * 0.4 |
220 end; |
232 end; |
221 end; |
233 end; |
222 if GearsList = nil then GearsList:= Result |
234 if GearsList = nil then GearsList:= Result |
223 else begin |
235 else begin |
224 GearsList.PrevGear:= Result; |
236 GearsList.PrevGear:= Result; |
507 posCaseAmmo : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface); |
519 posCaseAmmo : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface); |
508 posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface); |
520 posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface); |
509 end; |
521 end; |
510 gtClusterBomb: DrawSprite(sprClusterBomb, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); |
522 gtClusterBomb: DrawSprite(sprClusterBomb, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); |
511 gtCluster: DrawSprite(sprClusterParticle, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, 0, Surface); |
523 gtCluster: DrawSprite(sprClusterParticle, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, 0, Surface); |
|
524 gtFlame: DrawSprite(sprFlame, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy,(GameTicks div 128 + Gear.Angle) mod 8, Surface); |
512 end; |
525 end; |
513 Gear:= Gear.NextGear |
526 Gear:= Gear.NextGear |
514 end; |
527 end; |
515 end; |
528 end; |
516 |
529 |
557 begin |
570 begin |
558 dmg:= dmg shr 1; |
571 dmg:= dmg shr 1; |
559 case Gear.Kind of |
572 case Gear.Kind of |
560 gtHedgehog, |
573 gtHedgehog, |
561 gtMine, |
574 gtMine, |
562 gtCase: begin |
575 gtCase, |
|
576 gtFlame: begin |
563 if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg); |
577 if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg); |
564 if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then |
578 if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then |
565 begin |
579 begin |
566 Gear.dX:= Gear.dX + dmg / 200 * Sign(Gear.X - X); |
580 Gear.dX:= Gear.dX + dmg / 200 * Sign(Gear.X - X); |
567 Gear.dY:= Gear.dY + dmg / 200 * Sign(Gear.Y - Y); |
581 Gear.dY:= Gear.dY + dmg / 200 * Sign(Gear.Y - Y); |
580 end; |
594 end; |
581 |
595 |
582 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); |
596 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); |
583 var t: PGearArray; |
597 var t: PGearArray; |
584 i: integer; |
598 i: integer; |
585 Gear: PGear; |
|
586 begin |
599 begin |
587 t:= CheckGearsCollision(Ammo); |
600 t:= CheckGearsCollision(Ammo); |
588 i:= t.Count; |
601 i:= t.Count; |
589 while i > 0 do |
602 while i > 0 do |
590 begin |
603 begin |
591 dec(i); |
604 dec(i); |
592 case t.ar[i].Kind of |
605 if (t.ar[i].State and gstNoDamage) = 0 then |
|
606 case t.ar[i].Kind of |
593 gtHedgehog, |
607 gtHedgehog, |
594 gtMine, |
608 gtMine, |
595 gtCase: begin |
609 gtCase: begin |
596 inc(t.ar[i].Damage, Damage); |
610 inc(t.ar[i].Damage, Damage); |
597 t.ar[i].dX:= Ammo.dX * Power * 0.01; |
611 t.ar[i].dX:= Ammo.dX * Power * 0.01; |