hedgewars/uTriggers.pas
changeset 594 221ffeb92f30
parent 593 1f5e66379a43
child 595 5ee863f2f568
equal deleted inserted replaced
593:1f5e66379a43 594:221ffeb92f30
    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 procedure AddTrigger(id, Ticks: Longword);
    26 procedure AddTrigger(id, Ticks, Lives: Longword);
    27 procedure TickTrigger(id: Longword);
    27 procedure TickTrigger(id: Longword);
    28 
    28 
    29 implementation
    29 implementation
    30 uses uGears, uFloat, uMisc;
    30 uses uGears, uFloat, uMisc;
    31 type PTrigger = ^TTrigger;
    31 type PTrigger = ^TTrigger;
    32      TTrigger = record
    32      TTrigger = record
    33                 id: Longword;
    33                 id: Longword;
    34                 Ticks: Longword;
    34                 Ticks: Longword;
       
    35                 Lives: Longword;
       
    36                 TicksPerLife: LongWord;
    35                 Next: PTrigger;
    37                 Next: PTrigger;
    36                 end;
    38                 end;
    37 var TriggerList: PTrigger = nil;
    39 var TriggerList: PTrigger = nil;
    38 
    40 
    39 procedure AddTrigger(id, Ticks: Longword);
    41 procedure AddTrigger(id, Ticks, Lives: Longword);
    40 var tmp: PTrigger;
    42 var tmp: PTrigger;
    41 begin
    43 begin
    42 if (Ticks = 0) then exit;
    44 if (Ticks = 0) or (Lives = 0) then exit;
    43 {$IFDEF DEBUGFILE}AddFileLog('Add trigger: ' + inttostr(id));{$ENDIF}
    45 {$IFDEF DEBUGFILE}AddFileLog('Add trigger: ' + inttostr(id));{$ENDIF}
    44 new(tmp);
    46 new(tmp);
    45 FillChar(tmp^, sizeof(TGear), 0);
    47 FillChar(tmp^, sizeof(TGear), 0);
    46 
    48 
    47 tmp^.id:= id;
    49 tmp^.id:= id;
    48 tmp^.Ticks:= Ticks;
    50 tmp^.Ticks:= Ticks;
       
    51 tmp^.TicksPerLife:= Ticks;
       
    52 tmp^.Lives:= Lives;
    49 if TriggerList <> nil then tmp^.Next:= TriggerList;
    53 if TriggerList <> nil then tmp^.Next:= TriggerList;
    50 TriggerList:= tmp
    54 TriggerList:= tmp
    51 end;
    55 end;
    52 
    56 
    53 procedure TickTriggerT(Trigger: PTrigger);
    57 procedure TickTriggerT(Trigger: PTrigger);
    54 begin
    58 begin
    55 AddGear(1024, -140, gtTarget, 0, _0, _0, 0)
    59 AddGear(1024, -140, gtTarget, 0, _0, _0, 0)
    56 end;
    60 end;
    57 
    61 
    58 procedure TickTrigger(id: Longword);
    62 procedure TickTrigger(id: Longword);
    59 var t, tt: PTrigger;
    63 var t, pt, nt: PTrigger;
    60 begin
    64 begin
    61 t:= TriggerList;
    65 t:= TriggerList;
       
    66 pt:= nil;
    62 
    67 
    63 while (t <> nil) do
    68 while (t <> nil) do
    64   begin
    69   begin
    65   if t^.id = id then
    70   nt:= t^.Next;
       
    71   if (t^.id = id) then
    66     begin
    72     begin
    67     tt:= t;
       
    68     dec(t^.Ticks);
    73     dec(t^.Ticks);
    69     if (t^.Ticks = 0) then
    74     if (t^.Ticks = 0) then
    70        begin
    75        begin
    71        TickTriggerT(t);
    76        TickTriggerT(t);
    72        if t = TriggerList then TriggerList:= t^.Next
    77        dec(t^.Lives);
    73                           else tt^.Next:= t^.Next;
    78        t^.Ticks:= t^.TicksPerLife;
    74        Dispose(t)
    79        if (t^.Lives = 0) then
       
    80           begin
       
    81           if t = TriggerList then TriggerList:= nt
       
    82                              else pt^.Next:= nt;
       
    83           Dispose(t)
       
    84           end
    75        end
    85        end
    76        else t:= t^.Next
    86     end;
    77     end else t:= t^.Next
    87   pt:= t;
       
    88   t:= nt
    78   end
    89   end
    79 end;
    90 end;
    80 
    91 
    81 end.
    92 end.