hedgewars/GSHandlers.inc
changeset 53 0e27949850e3
parent 49 3afe33c1cf06
child 57 e1a77ae57065
equal deleted inserted replaced
52:ae2950c5465c 53:0e27949850e3
    33 
    33 
    34 procedure doStepDrowningGear(Gear: PGear); forward;
    34 procedure doStepDrowningGear(Gear: PGear); forward;
    35 
    35 
    36 function CheckGearDrowning(Gear: PGear): boolean;
    36 function CheckGearDrowning(Gear: PGear): boolean;
    37 begin
    37 begin
    38 Result:= Gear.Y + Gear.HalfHeight >= cWaterLine;
    38 Result:= Gear.Y + Gear.Radius >= cWaterLine;
    39 if Result then
    39 if Result then
    40    begin
    40    begin
    41    Gear.State:= gstDrowning;
    41    Gear.State:= gstDrowning;
    42    Gear.doStep:= doStepDrowningGear;
    42    Gear.doStep:= doStepDrowningGear;
    43    PlaySound(sndSplash)
    43    PlaySound(sndSplash)
    71 ////////////////////////////////////////////////////////////////////////////////
    71 ////////////////////////////////////////////////////////////////////////////////
    72 procedure doStepDrowningGear(Gear: PGear);
    72 procedure doStepDrowningGear(Gear: PGear);
    73 begin
    73 begin
    74 AllInactive:= false;
    74 AllInactive:= false;
    75 Gear.Y:= Gear.Y + cDrownSpeed;
    75 Gear.Y:= Gear.Y + cDrownSpeed;
    76 if round(Gear.Y) > Gear.HalfHeight + cWaterLine + 48 + cVisibleWater then DeleteGear(Gear)
    76 if round(Gear.Y) > Gear.Radius + cWaterLine + 48 + cVisibleWater then DeleteGear(Gear)
    77 end;
    77 end;
    78 
    78 
    79 ////////////////////////////////////////////////////////////////////////////////
    79 ////////////////////////////////////////////////////////////////////////////////
    80 procedure doStepFallingGear(Gear: PGear);
    80 procedure doStepFallingGear(Gear: PGear);
    81 var b: boolean;
    81 var b: boolean;
   169 ////////////////////////////////////////////////////////////////////////////////
   169 ////////////////////////////////////////////////////////////////////////////////
   170 procedure doStepGrave(Gear: PGear);
   170 procedure doStepGrave(Gear: PGear);
   171 begin
   171 begin
   172 AllInactive:= false;
   172 AllInactive:= false;
   173 if Gear.dY < 0 then
   173 if Gear.dY < 0 then
   174    if TestCollisionY(Gear, -1) then Gear.dY:= 0;
   174    if TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   175 
   175 
   176 if Gear.dY >=0 then
   176 if Gear.dY >=0 then
   177    if TestCollisionY(Gear, 1) then
   177    if TestCollisionYwithGear(Gear, 1) then
   178       begin
   178       begin
   179       Gear.dY:= - Gear.dY * Gear.Elasticity;
   179       Gear.dY:= - Gear.dY * Gear.Elasticity;
   180       if Gear.dY > - 0.001 then
   180       if Gear.dY > - 0.001 then
   181          begin
   181          begin
   182          Gear.Active:= false;
   182          Gear.Active:= false;
   232 end;
   232 end;
   233 
   233 
   234 ////////////////////////////////////////////////////////////////////////////////
   234 ////////////////////////////////////////////////////////////////////////////////
   235 procedure doStepShotgunShot(Gear: PGear);
   235 procedure doStepShotgunShot(Gear: PGear);
   236 var i: LongWord;
   236 var i: LongWord;
   237     t: PGear;
       
   238 begin
   237 begin
   239 AllInactive:= false;
   238 AllInactive:= false;
   240 if Gear.Timer > 0 then
   239 if Gear.Timer > 0 then
   241    begin
   240    begin
   242    dec(Gear.Timer);
   241    dec(Gear.Timer);
   248 Gear.X:= Gear.X + Gear.dX;
   247 Gear.X:= Gear.X + Gear.dX;
   249 Gear.Y:= Gear.Y + Gear.dY;
   248 Gear.Y:= Gear.Y + Gear.dY;
   250 CheckCollision(Gear);
   249 CheckCollision(Gear);
   251 if (Gear.State and gstCollision) <> 0 then
   250 if (Gear.State and gstCollision) <> 0 then
   252    begin
   251    begin
   253    t:= CheckGearsCollision(Gear, Sign(Gear.dX), true);
   252    AmmoShove(Gear, 25);
   254    if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false);
       
   255    if t <> nil then
       
   256       AmmoShove(Gear, t, 25);
       
   257    doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH);
   253    doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH);
   258    DeleteGear(Gear);
   254    DeleteGear(Gear);
   259    exit
   255    exit
   260    end;
   256    end;
   261 dec(i)
   257 dec(i)
   266 
   262 
   267 ////////////////////////////////////////////////////////////////////////////////
   263 ////////////////////////////////////////////////////////////////////////////////
   268 procedure doStepDEagleShot(Gear: PGear);
   264 procedure doStepDEagleShot(Gear: PGear);
   269 var i, x, y: LongWord;
   265 var i, x, y: LongWord;
   270     oX, oY: real;
   266     oX, oY: real;
   271     t: PGear;
       
   272 begin
   267 begin
   273 AllInactive:= false;
   268 AllInactive:= false;
   274 i:= 80;
   269 i:= 80;
   275 oX:= Gear.X;
   270 oX:= Gear.X;
   276 oY:= Gear.Y;
   271 oY:= Gear.Y;
   279   Gear.Y:= Gear.Y + Gear.dY;
   274   Gear.Y:= Gear.Y + Gear.dY;
   280   x:= round(Gear.X);
   275   x:= round(Gear.X);
   281   y:= round(Gear.Y);
   276   y:= round(Gear.Y);
   282   if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0)
   277   if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0)
   283      and (Land[y, x] <> 0) then inc(Gear.Damage);
   278      and (Land[y, x] <> 0) then inc(Gear.Damage);
   284   t:= CheckGearsCollision(Gear, Sign(Gear.dX), true);
   279   AmmoShove(Gear, 12);
   285   if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false);
       
   286   if t <> nil then
       
   287      begin
       
   288      AmmoShove(Gear, t, 12);
       
   289      inc(Gear.Damage, 10);
       
   290      if t.CollIndex < High(Longword) then DeleteCR(t)
       
   291      end;
       
   292   dec(i)
   280   dec(i)
   293 until (i = 0) or (Gear.Damage > Gear.Health);
   281 until (i = 0) or (Gear.Damage > Gear.Health);
   294 if Gear.Damage > 0 then
   282 if Gear.Damage > 0 then
   295    begin
   283    begin
   296    DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1);
   284    DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1);
   338    exit
   326    exit
   339    end;
   327    end;
   340 HHGear:= PHedgehog(Gear.Hedgehog).Gear;
   328 HHGear:= PHedgehog(Gear.Hedgehog).Gear;
   341 if (Gear.Timer and $3F) = 0 then
   329 if (Gear.Timer and $3F) = 0 then
   342    begin
   330    begin
   343    i:= round(Gear.X) - Gear.HalfWidth  - GetRandom(2);
   331    i:= round(Gear.X) - Gear.Radius  - GetRandom(2);
   344    ei:= round(Gear.X) + Gear.HalfWidth + GetRandom(2);
   332    ei:= round(Gear.X) + Gear.Radius + GetRandom(2);
   345    while i <= ei do
   333    while i <= ei do
   346          begin
   334          begin
   347          doMakeExplosion(i, round(Gear.Y) + 3, 3, 0);
   335          doMakeExplosion(i, round(Gear.Y) + 3, 3, 0);
   348          inc(i, 1)
   336          inc(i, 1)
   349          end;
   337          end;
   363    if Gear.Y > 1024 then Gear.Timer:= 1
   351    if Gear.Y > 1024 then Gear.Timer:= 1
   364    end;
   352    end;
   365 
   353 
   366 Gear.X:= Gear.X + HHGear.dX;
   354 Gear.X:= Gear.X + HHGear.dX;
   367 HHGear.X:= Gear.X;
   355 HHGear.X:= Gear.X;
   368 HHGear.Y:= Gear.Y - cHHHalfHeight;
   356 HHGear.Y:= Gear.Y - cHHRadius;
   369 
   357 
   370 if (Gear.Message and gm_Attack) <> 0 then
   358 if (Gear.Message and gm_Attack) <> 0 then
   371    if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else
   359    if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else
   372    if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag;
   360    if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag;
   373 if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else
   361 if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else
   378 procedure doStepPickHammer(Gear: PGear);
   366 procedure doStepPickHammer(Gear: PGear);
   379 var i, y: integer;
   367 var i, y: integer;
   380     ar: TRangeArray;
   368     ar: TRangeArray;
   381 begin
   369 begin
   382 i:= 0;
   370 i:= 0;
   383 y:= round(Gear.Y) - cHHHalfHeight*2;
   371 y:= round(Gear.Y) - cHHRadius*2;
   384 while y < round(Gear.Y) do
   372 while y < round(Gear.Y) do
   385    begin
   373    begin
   386    ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2);
   374    ar[i].Left := round(Gear.X) - Gear.Radius - GetRandom(2);
   387    ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2);
   375    ar[i].Right:= round(Gear.X) + Gear.Radius + GetRandom(2);
   388    inc(y, 2);
   376    inc(y, 2);
   389    inc(i)
   377    inc(i)
   390    end;
   378    end;
   391 DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i));
   379 DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHRadius*2, 2, Pred(i));
   392 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY;
   380 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY;
   393 doStepPickHammerWork(Gear);
   381 doStepPickHammerWork(Gear);
   394 Gear.doStep:= doStepPickHammerWork
   382 Gear.doStep:= doStepPickHammerWork
   395 end;
   383 end;
   396 
   384 
   607 ////////////////////////////////////////////////////////////////////////////////
   595 ////////////////////////////////////////////////////////////////////////////////
   608 procedure doStepMine(Gear: PGear);
   596 procedure doStepMine(Gear: PGear);
   609 begin
   597 begin
   610 if (Gear.dX <> 0) or (Gear.dY <> 0) then
   598 if (Gear.dX <> 0) or (Gear.dY <> 0) then
   611    begin
   599    begin
   612    if Gear.CollIndex < High(Longword) then DeleteCR(Gear);
   600    if Gear.CollIndex < High(Longword) then DeleteCI(Gear);
   613    doStepFallingGear(Gear);
   601    doStepFallingGear(Gear);
   614    if Gear.Active = false then
   602    if Gear.Active = false then
   615       begin
   603       begin
   616       if Gear.CollIndex = High(Longword) then AddGearCR(Gear);
   604       if Gear.CollIndex = High(Longword) then AddGearCI(Gear);
   617       Gear.dX:= 0;
   605       Gear.dX:= 0;
   618       Gear.dY:= 0
   606       Gear.dY:= 0
   619       end;
   607       end;
   620    CalcRotationDirAngle(Gear);
   608    CalcRotationDirAngle(Gear);
   621    AllInactive:= false
   609    AllInactive:= false
   661    begin
   649    begin
   662    DeleteGear(Gear);
   650    DeleteGear(Gear);
   663    exit
   651    exit
   664    end;
   652    end;
   665 
   653 
   666 if (Gear.dY <> 0) or (not TestCollisionY(Gear, 1)) then
   654 if (Gear.dY <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
   667    begin
   655    begin
   668    AllInactive:= false;
   656    AllInactive:= false;
   669    Gear.dY:= Gear.dY + cGravity;
   657    Gear.dY:= Gear.dY + cGravity;
   670    Gear.Y:= Gear.Y + Gear.dY;
   658    Gear.Y:= Gear.Y + Gear.dY;
   671    if (Gear.dY < 0) and TestCollisionY(Gear, -1) then Gear.dY:= 0 else
   659    if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0 else
   672    if (Gear.dY >= 0) and TestCollisionY(Gear, 1) then
   660    if (Gear.dY >= 0) and TestCollisionYwithGear(Gear, 1) then
   673       begin
   661       begin
   674       Gear.dY:= - Gear.dY * Gear.Elasticity;
   662       Gear.dY:= - Gear.dY * Gear.Elasticity;
   675       if Gear.dY > - 0.001 then Gear.dY:= 0
   663       if Gear.dY > - 0.001 then Gear.dY:= 0
   676          else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact);
   664          else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact);
   677       end;
   665       end;
   678    CheckGearDrowning(Gear);
   666    CheckGearDrowning(Gear);
   679    end;
   667    end;
   680 
   668 
   681 if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCR(Gear)
   669 if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCI(Gear)
   682    else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCR(Gear);
   670    else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCI(Gear);
   683 
   671 
   684 if Gear.Damage > 0 then
   672 if Gear.Damage > 0 then
   685    begin
   673    begin
   686    DeleteGear(Gear);
   674    DeleteGear(Gear);
   687    doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound)
   675    doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound)