hedgewars/uGears.pas
changeset 803 3f73901a350a
parent 802 ed5450a89b96
child 809 b33c2def1576
equal deleted inserted replaced
802:ed5450a89b96 803:3f73901a350a
    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;
    99 
    98 
   100 {$INCLUDE GSHandlers.inc}
    99 {$INCLUDE GSHandlers.inc}
   101 {$INCLUDE HHHandlers.inc}
   100 {$INCLUDE HHHandlers.inc}
   102 
   101 
   103 const doStepHandlers: array[TGearType] of TGearStepProcedure = (
   102 const doStepHandlers: array[TGearType] of TGearStepProcedure = (
   104                                                                @doStepCloud,
       
   105                                                                @doStepBomb,
   103                                                                @doStepBomb,
   106                                                                @doStepHedgehog,
   104                                                                @doStepHedgehog,
   107                                                                @doStepGrenade,
   105                                                                @doStepGrenade,
   108                                                                @doStepHealthTag,
   106                                                                @doStepHealthTag,
   109                                                                @doStepGrave,
   107                                                                @doStepGrave,
   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
   191    Result^.Hedgehog:= CurrentHedgehog;
   195    Result^.Hedgehog:= CurrentHedgehog;
   192    Result^.IntersectGear:= CurrentHedgehog^.Gear
   196    Result^.IntersectGear:= CurrentHedgehog^.Gear
   193    end;
   197    end;
   194 
   198 
   195 case Kind of
   199 case Kind of
   196        gtCloud: Result^.Z:= High(Result^.Z);
       
   197    gtAmmo_Bomb: begin
   200    gtAmmo_Bomb: begin
   198                 Result^.Radius:= 4;
   201                 Result^.Radius:= 4;
   199                 Result^.Elasticity:= _0_6;
   202                 Result^.Elasticity:= _0_6;
   200                 Result^.Friction:= _0_995;
   203                 Result^.Friction:= _0_995;
   201                 end;
   204                 end;
   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;