]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_tessla.qc
fix stddev of gaussian dist
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / units / unit_tessla.qc
1 void spawnfunc_turret_tesla();
2 void turret_tesla_dinit();
3 void turret_tesla_fire();
4
5 .float toasted;
6 entity toast(entity from, float range, float damage)
7 {
8     entity e;
9     entity etarget;
10     float d,dd;
11     float r;
12
13     dd = range + 1;
14
15     e = findradius(from.origin,range);
16     while (e)
17     {
18         if ((e.toasted != 1) && (e != from))
19         {
20             r = turret_validate_target(self,e,self.target_validate_flags);
21             if (r > 0)
22             {
23                 traceline(from.origin,0.5 * (e.absmin + e.absmax),MOVE_WORLDONLY,from);
24                 if (trace_fraction == 1.0)
25                 {
26                     d = vlen(e.origin - from.origin);
27                     if (d < dd)
28                     {
29                         dd = d;
30                         etarget = e;
31                     }
32                 }
33             }
34         }
35
36         e = e.chain;
37     }
38
39     if (etarget)
40     {
41         te_smallflash(etarget.origin);
42         te_csqc_lightningarc(from.origin,etarget.origin);
43         Damage(etarget,self,self,damage,DEATH_TURRET,etarget.origin,'0 0 0');
44         etarget.toasted = 1;
45     }
46
47     return etarget;
48 }
49
50 float turret_tesla_firecheck()
51 {
52     if not (turret_stdproc_firecheck())
53         return 0;
54
55     self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
56                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
57
58     self.enemy = turret_select_target();
59
60     if(self.enemy)
61         return 1;
62
63     return 0;
64
65 }
66
67 void turret_tesla_fire()
68 {
69     entity e,t;
70     float d,r,i;
71
72     //w_deathtypestring = "discoverd how a tesla coil works";
73
74     d = self.shot_dmg;
75     r = self.target_range;
76     e = spawn();
77     setorigin(e,self.tur_shotorg);
78
79
80     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
81                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
82
83     t = toast(e,r,d);
84     remove(e);
85
86     if (t == world) return;
87
88     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
89                                  TFL_TARGETSELECT_TEAMCHECK;
90
91
92
93     self.attack_finished_single = time + self.shot_refire;
94     for (i = 0; i < 10; ++i)
95     {
96         d *= 0.5;
97         r *= 0.85;
98         t = toast(t,r,d);
99         if (t == world) break;
100     }
101
102     e = findchainfloat(toasted, 1);
103     while (e)
104     {
105         e.toasted = 0;
106         e = e.chain;
107     }
108 }
109
110 void turret_tesla_postthink()
111 {
112     if not (self.tur_active)
113     {
114         self.tur_head.avelocity = '0 0 0';
115         return;
116     }
117
118     if(self.ammo < self.shot_dmg)
119     {
120         self.tur_head.avelocity = '0 9 0' * (self.ammo / self.shot_dmg);
121     }
122     else
123     {
124         self.tur_head.avelocity = '0 90 0' * (self.ammo / self.shot_dmg);
125
126         if(self.attack_finished_single > time)
127             return;
128
129         float f;
130         f = (self.ammo / self.ammo_max);
131         f = f*f;
132         if(f > random())
133             if(random() < 0.1)
134                 te_csqc_lightningarc(self.tur_shotorg,self.tur_shotorg + (randomvec() * 350));
135     }
136 }
137
138
139 void turret_tesla_dinit()
140 {
141     if (self.netname == "")      self.netname     = "Tesla Coil";
142
143     self.turrcaps_flags      = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
144
145     self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
146                                TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
147
148     self.firecheck_flags     = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_OWM_AMMO;
149     self.shoot_flags         = TFL_SHOOT_CUSTOM;
150     self.ammo_flags          = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
151     self.aim_flags           = TFL_AIM_NO;
152     self.track_flags         = TFL_TRACK_NO;
153
154     if (turret_stdproc_init("tesla_std",0,"models/turrets/tesla_base.md3","models/turrets/tesla_head.md3") == 0)
155     {
156         remove(self);
157         return;
158     }
159     setsize(self,'-48 -48 0','48 48 96');
160
161     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
162                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
163
164     if (!turret_tag_setup())
165         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
166
167     self.turret_firefunc      = turret_tesla_fire;
168     self.turret_postthink     = turret_tesla_postthink;
169     self.turret_firecheckfunc = turret_tesla_firecheck;
170 }
171
172 /*QUAKED turret_tesla (0 .5 .8) ?
173 */
174 void spawnfunc_turret_tesla()
175 {
176     precache_model ("models/turrets/tesla_head.md3");
177     precache_model ("models/turrets/tesla_base.md3");
178
179
180     self.think = turret_tesla_dinit;
181     self.nextthink = time + 0.5;
182 }
183