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. |