hedgewars/GSHandlers.inc
changeset 38 c1ec4b15d70e
parent 37 2b7f2a43b999
child 39 b78e7185ed13
equal deleted inserted replaced
37:2b7f2a43b999 38:c1ec4b15d70e
    51    else Gear.State:= Gear.State and not gstCollision
    51    else Gear.State:= Gear.State and not gstCollision
    52 end;
    52 end;
    53 
    53 
    54 procedure CheckHHDamage(Gear: PGear);
    54 procedure CheckHHDamage(Gear: PGear);
    55 begin
    55 begin
    56 if Gear.dY > 0.35 then Gear.Damage:= Gear.Damage + round(25 * (abs(Gear.dY) - 0.35));
    56 if Gear.dY > 0.35 then Gear.Damage:= Gear.Damage + round(75 * (abs(Gear.dY) - 0.35));
    57 end;
    57 end;
    58 
    58 
    59 ////////////////////////////////////////////////////////////////////////////////
    59 ////////////////////////////////////////////////////////////////////////////////
    60 ////////////////////////////////////////////////////////////////////////////////
    60 ////////////////////////////////////////////////////////////////////////////////
    61 procedure CalcRotationDirAngle(Gear: PGear);
    61 procedure CalcRotationDirAngle(Gear: PGear);
   129 dec(Gear.Timer);
   129 dec(Gear.Timer);
   130 if Gear.Timer = 0 then
   130 if Gear.Timer = 0 then
   131    begin
   131    begin
   132    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   132    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   133    DeleteGear(Gear);
   133    DeleteGear(Gear);
   134    SetAllToActive;
       
   135    exit
   134    exit
   136    end;
   135    end;
   137 CalcRotationDirAngle(Gear);
   136 CalcRotationDirAngle(Gear);
   138 if (Gear.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact)
   137 if (Gear.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact)
   139 end;
   138 end;
   146 doStepFallingGear(Gear);
   145 doStepFallingGear(Gear);
   147 if (Gear.State and gstCollision) <> 0 then
   146 if (Gear.State and gstCollision) <> 0 then
   148    begin
   147    begin
   149    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   148    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   150    DeleteGear(Gear);
   149    DeleteGear(Gear);
   151    SetAllToActive;
       
   152    exit
   150    exit
   153    end;
   151    end;
   154 if (GameTicks and $3F) = 0 then
   152 if (GameTicks and $3F) = 0 then
   155    AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0)
   153    AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0)
   156 end;
   154 end;
   207 dec(Gear.Timer);
   205 dec(Gear.Timer);
   208 if ((Gear.State and gstCollision) <> 0) or (Gear.Timer = 0) then
   206 if ((Gear.State and gstCollision) <> 0) or (Gear.Timer = 0) then
   209    begin
   207    begin
   210    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   208    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   211    DeleteGear(Gear);
   209    DeleteGear(Gear);
   212    SetAllToActive
       
   213    end;
   210    end;
   214 end;
   211 end;
   215 
   212 
   216 procedure doStepUFO(Gear: PGear);
   213 procedure doStepUFO(Gear: PGear);
   217 begin
   214 begin
   222 CheckCollision(Gear);
   219 CheckCollision(Gear);
   223 if (Gear.State and gstCollision) <> 0 then
   220 if (Gear.State and gstCollision) <> 0 then
   224    begin
   221    begin
   225    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   222    doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   226    DeleteGear(Gear);
   223    DeleteGear(Gear);
   227    SetAllToActive;
       
   228    exit
   224    exit
   229    end;
   225    end;
   230 dec(Gear.Timer);
   226 dec(Gear.Timer);
   231 if Gear.Timer = 0 then
   227 if Gear.Timer = 0 then
   232    begin
   228    begin
   236 end;
   232 end;
   237 
   233 
   238 ////////////////////////////////////////////////////////////////////////////////
   234 ////////////////////////////////////////////////////////////////////////////////
   239 procedure doStepShotgunShot(Gear: PGear);
   235 procedure doStepShotgunShot(Gear: PGear);
   240 var i: LongWord;
   236 var i: LongWord;
       
   237     t: PGear;
   241 begin
   238 begin
   242 AllInactive:= false;
   239 AllInactive:= false;
   243 if Gear.Timer > 0 then
   240 if Gear.Timer > 0 then
   244    begin
   241    begin
   245    dec(Gear.Timer);
   242    dec(Gear.Timer);
   251 Gear.X:= Gear.X + Gear.dX;
   248 Gear.X:= Gear.X + Gear.dX;
   252 Gear.Y:= Gear.Y + Gear.dY;
   249 Gear.Y:= Gear.Y + Gear.dY;
   253 CheckCollision(Gear);
   250 CheckCollision(Gear);
   254 if (Gear.State and gstCollision) <> 0 then
   251 if (Gear.State and gstCollision) <> 0 then
   255    begin
   252    begin
   256    doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLAllDamageInRadius);
   253    t:= CheckGearsCollision(Gear, Sign(Gear.dX), true);
   257    DeleteGear(Gear);
   254    if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false);
   258    SetAllToActive;
   255    if t <> nil then
       
   256       AmmoShove(Gear, t, 25);
       
   257    doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage);
       
   258    DeleteGear(Gear);
   259    exit
   259    exit
   260    end;
   260    end;
   261 dec(i)
   261 dec(i)
   262 until i = 0;
   262 until i = 0;
   263 if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
   263 if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
   264    DeleteGear(Gear)
   264    DeleteGear(Gear)
   265 end;
   265 end;
   266 
   266 
   267 ////////////////////////////////////////////////////////////////////////////////
   267 ////////////////////////////////////////////////////////////////////////////////
   268 procedure doStepDEagleShot(Gear: PGear);    // сама идея такова, что должна как то образовываться выбоина от выстрела :)
   268 procedure doStepDEagleShot(Gear: PGear);
   269 var i: LongWord;                            // пуля и в африке пуля.. и демаж совсем другой.. и эксплоза никакого, можно даже
   269 var i, x, y: LongWord;
   270 begin                                       // навылет сделать, типа через одного пролетела и в другого попала... опять же
   270     oX, oY: real;
   271 AllInactive:= false;                        // дальше летишь меньше урон.. ой скока сразу мыслей то :))
   271     t: PGear;
       
   272 begin
       
   273 AllInactive:= false;
   272 i:= 80;
   274 i:= 80;
       
   275 oX:= Gear.X;
       
   276 oY:= Gear.Y;
   273 repeat
   277 repeat
   274 Gear.X:= Gear.X + Gear.dX;
   278   Gear.X:= Gear.X + Gear.dX;
   275 Gear.Y:= Gear.Y + Gear.dY;
   279   Gear.Y:= Gear.Y + Gear.dY;
   276 CheckCollision(Gear);
   280   x:= round(Gear.X);
   277 if (Gear.State and gstCollision) <> 0 then
   281   y:= round(Gear.Y);
   278    begin
   282   if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0)
   279    inc(Gear.Damage);
   283      and (Land[y, x] <> 0) then inc(Gear.Damage);
   280    doMakeExplosion(round(Gear.X), round(Gear.Y), 2, EXPLAllDamageInRadius);
   284   t:= CheckGearsCollision(Gear, Sign(Gear.dX), true);
   281    end;
   285   if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false);
   282 dec(i)
   286   if t <> nil then
   283 until i = 0;
   287      begin
   284 if (Gear.Damage > 20) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
   288      AmmoShove(Gear, t, 12);
       
   289      if t.CollIndex < High(Longword) then DeleteCR(t)
       
   290      end;
       
   291   dec(i)
       
   292 until (i = 0) or (Gear.Damage > Gear.Health);
       
   293 if Gear.Damage > 0 then
       
   294    begin
       
   295    DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1);
       
   296    dec(Gear.Health, Gear.Damage);
       
   297    Gear.Damage:= 0
       
   298    end;
       
   299 if (Gear.Health <= 0) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
   285    DeleteGear(Gear)
   300    DeleteGear(Gear)
   286 end;
   301 end;
   287 
   302 
   288 ////////////////////////////////////////////////////////////////////////////////
   303 ////////////////////////////////////////////////////////////////////////////////
   289 procedure doStepActionTimer(Gear: PGear);
   304 procedure doStepActionTimer(Gear: PGear);
   317 dec(Gear.Timer);
   332 dec(Gear.Timer);
   318 if (Gear.Timer = 0)or((Gear.Message and gm_Destroy) <> 0) then
   333 if (Gear.Timer = 0)or((Gear.Message and gm_Destroy) <> 0) then
   319    begin
   334    begin
   320    DeleteGear(Gear);
   335    DeleteGear(Gear);
   321    AfterAttack;
   336    AfterAttack;
   322    SetAllToActive;
       
   323    exit
   337    exit
   324    end;
   338    end;
   325 HHGear:= PHedgehog(Gear.Hedgehog).Gear;
   339 HHGear:= PHedgehog(Gear.Hedgehog).Gear;
   326 if (Gear.Timer and $3F) = 0 then
   340 if (Gear.Timer and $3F) = 0 then
   327    begin
   341    begin
   330    while i <= ei do
   344    while i <= ei do
   331          begin
   345          begin
   332          doMakeExplosion(i, round(Gear.Y) + 3, 3, 0);
   346          doMakeExplosion(i, round(Gear.Y) + 3, 3, 0);
   333          inc(i, 1)
   347          inc(i, 1)
   334          end;
   348          end;
   335    SetAllToActive;
       
   336    Gear.X:= Gear.X + Gear.dX;
   349    Gear.X:= Gear.X + Gear.dX;
   337    Gear.Y:= Gear.Y + 1.9
   350    Gear.Y:= Gear.Y + 1.9
   338    end;
   351    end;
   339 if TestCollisionYwithGear(Gear, 1) then
   352 if TestCollisionYwithGear(Gear, 1) then
   340    begin
   353    begin
   371    ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2);
   384    ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2);
   372    ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2);
   385    ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2);
   373    inc(y, 2);
   386    inc(y, 2);
   374    inc(i)
   387    inc(i)
   375    end;
   388    end;
   376 DrawLineExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i));
   389 DrawHLineExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i));
   377 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY;
   390 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY;
   378 doStepPickHammerWork(Gear);
   391 doStepPickHammerWork(Gear);
   379 Gear.doStep:= doStepPickHammerWork
   392 Gear.doStep:= doStepPickHammerWork
   380 end;
   393 end;
   381 
   394 
   616       AllInactive:= false;
   629       AllInactive:= false;
   617       if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick);
   630       if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick);
   618       if Gear.Timer = 0 then
   631       if Gear.Timer = 0 then
   619          begin
   632          begin
   620          doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   633          doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
   621          SetAllToActive;
       
   622          DeleteGear(Gear)
   634          DeleteGear(Gear)
   623          end;
   635          end;
   624       dec(Gear.Timer);
   636       dec(Gear.Timer);
   625       end else // gsttmpFlag = 0
   637       end else // gsttmpFlag = 0
   626    if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag;
   638    if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag;