hedgewars/uTriggers.pas
changeset 615 b646b3c43369
parent 613 e8cf72d0e0f7
child 1066 1f1b3686a2b0
equal deleted inserted replaced
614:0e04504bc140 615:b646b3c43369
    21 interface
    21 interface
    22 uses SDLh, uConsts;
    22 uses SDLh, uConsts;
    23 {$INCLUDE options.inc}
    23 {$INCLUDE options.inc}
    24 const trigTurns = $80000001;
    24 const trigTurns = $80000001;
    25 
    25 
    26 type TTrigAction = (taSpawnGear, taSuccessFinish);
    26 type TTrigAction = (taSpawnGear, taSuccessFinish, taFailFinish);
    27 
    27 
    28 procedure AddTriggerSpawner(id, Ticks, Lives: Longword; X, Y: LongInt; GearType: TGearType; GearTriggerId: Longword);
    28 procedure AddTriggerSpawner(id, Ticks, Lives: Longword; GearType: TGearType; X, Y: LongInt; GearTriggerId: Longword);
    29 procedure AddTriggerSuccess(tId: Longword);
    29 procedure AddTriggerSuccess(id, Ticks, Lives: Longword);
       
    30 procedure AddTriggerFail(id, Ticks, Lives: Longword);
    30 procedure TickTrigger(id: Longword);
    31 procedure TickTrigger(id: Longword);
    31 
    32 
    32 implementation
    33 implementation
    33 uses uGears, uFloat, uMisc, uWorld;
    34 uses uGears, uFloat, uMisc, uWorld;
    34 type PTrigger = ^TTrigger;
    35 type PTrigger = ^TTrigger;
    43                 SpawnGearTriggerId: Longword;
    44                 SpawnGearTriggerId: Longword;
    44                 Next: PTrigger;
    45                 Next: PTrigger;
    45                 end;
    46                 end;
    46 var TriggerList: PTrigger = nil;
    47 var TriggerList: PTrigger = nil;
    47 
    48 
    48 function AddTrigger: PTrigger;
    49 function AddTrigger(id, Ticks, Lives: Longword): PTrigger;
    49 var tmp: PTrigger;
    50 var tmp: PTrigger;
    50 begin
    51 begin
    51 new(tmp);
    52 new(tmp);
    52 FillChar(tmp^, sizeof(TTrigger), 0);
    53 FillChar(tmp^, sizeof(TTrigger), 0);
       
    54 
       
    55 tmp^.id:= id;
       
    56 tmp^.Ticks:= Ticks;
       
    57 tmp^.TicksPerLife:= Ticks;
       
    58 tmp^.Lives:= Lives;
       
    59 
    53 if TriggerList <> nil then tmp^.Next:= TriggerList;
    60 if TriggerList <> nil then tmp^.Next:= TriggerList;
    54 TriggerList:= tmp;
    61 TriggerList:= tmp;
    55 AddTrigger:= tmp
    62 AddTrigger:= tmp
    56 end;
    63 end;
    57 
    64 
    58 procedure AddTriggerSpawner(id, Ticks, Lives: Longword; X, Y: LongInt; GearType: TGearType; GearTriggerId: Longword);
    65 procedure AddTriggerSpawner(id, Ticks, Lives: Longword; GearType: TGearType; X, Y: LongInt; GearTriggerId: Longword);
    59 var tmp: PTrigger;
    66 var tmp: PTrigger;
    60 begin
    67 begin
    61 if (Ticks = 0) or (Lives = 0) then exit;
    68 if (Ticks = 0) or (Lives = 0) then exit;
    62 {$IFDEF DEBUGFILE}AddFileLog('Add spawner trigger: ' + inttostr(id) + ', gear triggers  ' + inttostr(GearTriggerId));{$ENDIF}
       
    63 
    69 
    64 tmp:= AddTrigger;
    70 tmp:= AddTrigger(id, Ticks, Lives);
    65 tmp^.id:= id;
       
    66 tmp^.Ticks:= Ticks;
       
    67 tmp^.TicksPerLife:= Ticks;
       
    68 tmp^.Lives:= Lives;
       
    69 tmp^.Action:= taSpawnGear;
    71 tmp^.Action:= taSpawnGear;
    70 tmp^.X:= X;
    72 tmp^.X:= X;
    71 tmp^.Y:= Y;
    73 tmp^.Y:= Y;
    72 tmp^.SpawnGearType:= GearType;
    74 tmp^.SpawnGearType:= GearType;
    73 tmp^.SpawnGearTriggerId:= GearTriggerId
    75 tmp^.SpawnGearTriggerId:= GearTriggerId
    74 end;
    76 end;
    75 
    77 
    76 procedure AddTriggerSuccess(tId: Longword);
    78 procedure AddTriggerSuccess(id, Ticks, Lives: Longword);
    77 begin
    79 begin
    78 with AddTrigger^ do
    80 with AddTrigger(id, Ticks, Lives)^ do
    79      begin
       
    80      id:= tId;
       
    81      Ticks:= 1;
       
    82      TicksPerLife:= 1;
       
    83      Action:= taSuccessFinish
    81      Action:= taSuccessFinish
    84      end
    82 end;
       
    83 
       
    84 procedure AddTriggerFail(id, Ticks, Lives: Longword);
       
    85 begin
       
    86 with AddTrigger(id, Ticks, Lives)^ do
       
    87      Action:= taFailFinish
    85 end;
    88 end;
    86 
    89 
    87 procedure TickTriggerT(Trigger: PTrigger);
    90 procedure TickTriggerT(Trigger: PTrigger);
    88 begin
    91 begin
       
    92 {$IFDEF DEBUGFILE}AddFileLog('Tick trigger (type: ' + inttostr(LongWord(Trigger^.Action)) + ')');{$ENDIF}
    89 with Trigger^ do
    93 with Trigger^ do
    90   case Action of
    94   case Action of
    91      taSpawnGear: begin
    95      taSpawnGear: begin
    92                   FollowGear:= AddGear(X, Y, SpawnGearType, 0, _0, _0, 0);
    96                   FollowGear:= AddGear(X, Y, SpawnGearType, 0, _0, _0, 0);
    93                   FollowGear^.TriggerId:= SpawnGearTriggerId
    97                   FollowGear^.TriggerId:= SpawnGearTriggerId
    94                   end;
    98                   end;
    95  taSuccessFinish: begin
    99  taSuccessFinish: begin
       
   100                   GameState:= gsExit
       
   101                   end;
       
   102     taFailFinish: begin
    96                   GameState:= gsExit
   103                   GameState:= gsExit
    97                   end
   104                   end
    98   end
   105   end
    99 end;
   106 end;
   100 
   107 
   115        TickTriggerT(t);
   122        TickTriggerT(t);
   116        dec(t^.Lives);
   123        dec(t^.Lives);
   117        t^.Ticks:= t^.TicksPerLife;
   124        t^.Ticks:= t^.TicksPerLife;
   118        if (t^.Lives = 0) then
   125        if (t^.Lives = 0) then
   119           begin
   126           begin
   120           if t = TriggerList then TriggerList:= nt
   127           if t = TriggerList then
   121                              else pt^.Next:= nt;
   128              begin
   122           Dispose(t)
   129              TriggerList:= nt;
       
   130              Dispose(t)
       
   131              end
       
   132           else
       
   133              begin
       
   134              pt^.Next:= nt;
       
   135              Dispose(t);
       
   136              t:= pt
       
   137              end
   123           end
   138           end
   124        end
   139        end
   125     end;
   140     end;
   126   pt:= t;
   141   pt:= t;
   127   t:= nt
   142   t:= nt