1
1
function Create (self )
2
+ local var = {};
3
+
2
4
-- Range of the shot.
3
- self .range = 600 ;
5
+ var .range = 600 ;
4
6
5
7
-- Amplitude of the wave.
6
- self .maxAmplitude = math.floor (1 + math.sqrt (self .Vel .Magnitude ) + 0.5 );
8
+ var .maxAmplitude = math.floor (1 + math.sqrt (self .Vel .Magnitude ) + 0.5 );
7
9
8
10
-- Wavelength of the wave.
9
- self .flaceLength = math.floor (3 + math.sqrt (self .Vel .Magnitude ) + 0.5 );
11
+ var .flaceLength = math.floor (3 + math.sqrt (self .Vel .Magnitude ) + 0.5 );
10
12
11
13
-- Track intersecting beams
12
- self .lastAmplitude = 1 ;
14
+ var .lastAmplitude = 1 ;
13
15
14
16
-- Speed of the wave (pixels per second).
15
- self .speed = self .Vel .Magnitude * 10 ;
17
+ var .speed = self .Vel .Magnitude * 10 ;
16
18
17
19
-- Speed of damage particles.
18
- self .damageSpeed = 50 + self .Vel .Magnitude * 0.1 ;
20
+ var .damageSpeed = 50 + self .Vel .Magnitude * 0.1 ;
19
21
20
22
-- Maximum strength for material penetration (both MOs and terrain).
21
- self .strengthThreshold = 50 + self .Vel .Magnitude * 0.3 ;
23
+ var .strengthThreshold = 50 + self .Vel .Magnitude * 0.3 ;
22
24
23
25
-- Direction of the wave.
24
- self .direction = Vector (self .Vel .X , self .Vel .Y );
25
- self .direction :SetMagnitude (1 );
26
- self .up = Vector (self .direction .X , self .direction .Y );
27
- self .up :RadRotate (math.pi * 0.5 );
26
+ var .direction = Vector (self .Vel .X , self .Vel .Y );
27
+ var .direction :SetMagnitude (1 );
28
+ var .up = Vector (var .direction .X , var .direction .Y );
29
+ var .up :RadRotate (math.pi * 0.5 );
28
30
29
31
-- Interval at which to create damage particles.
30
- self .damageInterval = 3 ;
32
+ var .damageInterval = 3 ;
31
33
32
34
-- Timer for the wave.
33
- self .timer = Timer ();
35
+ var .timer = Timer ();
34
36
35
37
-- The last starting position along the line.
36
- self .lastI = 0 ;
38
+ var .lastI = 0 ;
37
39
38
40
-- Count MO and terrain hits.
39
- self .hits = 0 ;
41
+ var .hits = 0 ;
40
42
41
43
-- Disintegration strength.
42
- self .disintegrationStrength = 500 ;
44
+ var .disintegrationStrength = 500 ;
43
45
44
- self .melter = CreateMOPixel (" Disintegrator" , " Techion.rte" );
46
+ var .melter = CreateMOPixel (" Disintegrator" , " Techion.rte" );
47
+
48
+ var .Pos = self .Pos ;
49
+ self .var = var ;
45
50
end
46
51
47
52
function Update (self )
48
- local endPoint = self .timer .ElapsedSimTimeS * self .speed ;
49
- if endPoint > self .range then
50
- endPoint = self .range ;
53
+ local var = self .var ;
54
+ local endPoint = var .timer .ElapsedSimTimeS * var .speed ;
55
+ if endPoint > var .range then
56
+ endPoint = var .range ;
51
57
self .ToDelete = true ;
52
58
else
53
59
self .ToDelete = false ;
@@ -57,21 +63,21 @@ function Update(self)
57
63
endPoint = math.floor (endPoint );
58
64
59
65
-- Draw out the path.
60
- for i = self .lastI , endPoint , 1 do
61
- local amplitude = math.sin ((i / self .flaceLength ) * 2 * math.pi ) * self .maxAmplitude ;
62
- local waveOffset = Vector (self .up .X , self .up .Y );
66
+ for i = var .lastI , endPoint , 1 do
67
+ local amplitude = math.sin ((i / var .flaceLength ) * 2 * math.pi ) * var .maxAmplitude ;
68
+ local waveOffset = Vector (var .up .X , var .up .Y );
63
69
waveOffset :SetMagnitude (amplitude );
64
70
65
- local linePos = self .Pos + Vector (self .direction .X , self .direction .Y ):SetMagnitude (i * 2 );
66
- local fireVector = Vector (self .direction .X , self .direction .Y ):SetMagnitude (self .damageSpeed );
71
+ local linePos = var .Pos + Vector (var .direction .X , var .direction .Y ):SetMagnitude (i * 2 );
72
+ local fireVector = Vector (var .direction .X , var .direction .Y ):SetMagnitude (var .damageSpeed );
67
73
local upPos = linePos + waveOffset ;
68
74
local downPos = linePos - waveOffset * 0.2 ;
69
75
70
76
-- Cancel the beam if there's a terrain collision.
71
- local trace = Vector (fireVector .X , fireVector .Y ):SetMagnitude (self .damageSpeed * 0.1 );
77
+ local trace = Vector (fireVector .X , fireVector .Y ):SetMagnitude (var .damageSpeed * 0.1 );
72
78
73
79
local strSumRay = SceneMan :CastStrengthSumRay (downPos , downPos + trace , 3 , 160 );
74
- self .hits = self .hits + math.sqrt (strSumRay );
80
+ var .hits = var .hits + math.sqrt (strSumRay );
75
81
76
82
if SceneMan :GetTerrMatter (upPos .X , upPos .Y ) == rte .airID then
77
83
-- Add the blue wave effect.
@@ -99,7 +105,7 @@ function Update(self)
99
105
frontB .Vel = (fireVector + waveOffset ) * 0.04 ;
100
106
MovableMan :AddParticle (frontB );
101
107
102
- if i % self .damageInterval == 0 then
108
+ if i % var .damageInterval == 0 then
103
109
local pos = {upPos , downPos };
104
110
local hitID = rte .NoMOID ;
105
111
for i = 1 , # pos do
@@ -126,15 +132,15 @@ function Update(self)
126
132
127
133
local rootMO = mo :GetRootParent ();
128
134
if i == 2 and IsActor (rootMO ) then
129
- local melter = self .melter :Clone ();
135
+ local melter = var .melter :Clone ();
130
136
melter .Pos = hitPos ;
131
137
melter .Team = self .Team ;
132
138
melter .Sharpness = rootMO .ID ;
133
- melter .PinStrength = self .disintegrationStrength ;
139
+ melter .PinStrength = var .disintegrationStrength ;
134
140
MovableMan :AddMO (melter );
135
141
end
136
142
137
- self .hits = self .hits + (i == 2 and math.sqrt (mo .Material .StructuralIntegrity ) + math.sqrt (mo .Radius + mo .Mass ) * 0.1 or 1 );
143
+ var .hits = var .hits + (i == 2 and math.sqrt (mo .Material .StructuralIntegrity ) + math.sqrt (mo .Radius + mo .Mass ) * 0.1 or 1 );
138
144
139
145
-- Add the dissipate effect.
140
146
local effect = CreateAEmitter (" Techion.rte/Laser Dissipate Effect" );
@@ -145,31 +151,31 @@ function Update(self)
145
151
end
146
152
end
147
153
148
- if (self .lastAmplitude > 0 and amplitude < 0 ) or (self .lastAmplitude < 0 and amplitude > 0 ) then
154
+ if (var .lastAmplitude > 0 and amplitude < 0 ) or (var .lastAmplitude < 0 and amplitude > 0 ) then
149
155
local part = CreateMOPixel (" Techion.rte/Dihelical Cannon Large Effect Particle" );
150
- part .Pos = linePos - Vector (self .direction .X , self .direction .Y ):SetMagnitude (2 );
156
+ part .Pos = linePos - Vector (var .direction .X , var .direction .Y ):SetMagnitude (2 );
151
157
part .Vel = fireVector * 0.1 ;
152
158
MovableMan :AddParticle (part );
153
159
end
154
160
155
- self .lastAmplitude = amplitude ;
156
- if self .hits > self .strengthThreshold then
161
+ var .lastAmplitude = amplitude ;
162
+ if var .hits > var .strengthThreshold then
157
163
158
164
local effect = CreateAEmitter (" Techion.rte/Dihelical Cannon Impact Particle" );
159
- effect .Pos = linePos - Vector (self .direction .X , self .direction .Y ):SetMagnitude (2 );
165
+ effect .Pos = linePos - Vector (var .direction .X , var .direction .Y ):SetMagnitude (2 );
160
166
effect .Team = self .Team ;
161
167
effect .IgnoresTeamHits = true ;
162
168
MovableMan :AddParticle (effect );
163
169
164
170
self .ToDelete = true ;
165
171
break ;
166
172
else
167
- self .hits = self .hits * 0.9 ;
173
+ var .hits = var .hits * 0.9 ;
168
174
end
169
175
170
- self .flaceLength = self .flaceLength * (1 + 0.05 / self .flaceLength );
171
- self .maxAmplitude = self .flaceLength * 0.5 ;
176
+ var .flaceLength = var .flaceLength * (1 + 0.05 / var .flaceLength );
177
+ var .maxAmplitude = var .flaceLength * 0.5 ;
172
178
end
173
179
174
- self .lastI = endPoint ;
180
+ var .lastI = endPoint ;
175
181
end
0 commit comments