]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/tuba.qc
Merge remote-tracking branch 'origin/TimePath/experiments/csqc_prediction' into TimeP...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / tuba.qc
1 #include "tuba.qh"
2
3 void tubasound(entity e, float restart)
4 {
5         string snd1;
6
7         snd1 = string_null;
8
9         if(Tuba_PitchStep)
10         {
11                 string snd2;
12                 float f1, f2;
13                 float p1, p2;
14                 float m;
15
16                 f1 = 1;
17                 p1 = 1;
18                 snd2 = string_null;
19                 f2 = 0;
20                 p2 = 1;
21
22                 m = e.note % Tuba_PitchStep;
23                 if(m)
24                 {
25                         if(e.note - m < TUBA_MIN)
26                         {
27                                 if(restart)
28                                         snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
29                                 p1 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
30                         }
31                         else if(e.note - m + Tuba_PitchStep > TUBA_MAX)
32                         {
33                                 if(restart)
34                                         snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
35                                 p1 = pow(2.0, m / 12.0);
36                         }
37                         else
38                         {
39                                 if(restart)
40                                         snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
41                                 f1 = cos(M_PI_2 * m / Tuba_PitchStep);
42                                 p1 = pow(2.0, m / 12.0);
43                                 if(restart)
44                                         snd2 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
45                                 f2 = sin(M_PI_2 * m / Tuba_PitchStep);
46                                 p2 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
47                         }
48                 }
49                 else
50                 {
51                         if(restart)
52                                 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
53                 }
54
55                 sound7(e, CH_TUBA_SINGLE, snd1, e.cnt * f1, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p1, 0);
56                 if(f2)
57                         sound7(e.enemy, CH_TUBA_SINGLE, snd2, e.cnt * f2, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p2, 0);
58         }
59         else
60         {
61                 if(restart)
62                         snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
63                 sound(e, CH_TUBA_SINGLE, snd1, e.cnt, e.attenuate * autocvar_g_balance_tuba_attenuation);
64         }
65 }
66
67 void Ent_TubaNote_Think()
68 {
69         float f;
70         f = autocvar_g_balance_tuba_fadetime;
71         if(f > 0)
72                 self.cnt -= frametime * self.count / f;
73         else
74                 self.cnt = 0;
75         self.nextthink = time;
76         if(self.cnt <= 0)
77         {
78                 sound(self, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
79                 if(self.enemy)
80                 {
81                         sound(self.enemy, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
82                         remove(self.enemy);
83                 }
84                 remove(self);
85         }
86         else
87         {
88                 tubasound(self, 0);
89         }
90 }
91
92 void Ent_TubaNote_UpdateSound()
93 {
94         self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
95         self.enemy.count = self.enemy.cnt;
96         self.enemy.note = self.note;
97         self.enemy.tuba_instrument = self.tuba_instrument;
98         tubasound(self.enemy, 1);
99 }
100
101 void Ent_TubaNote_StopSound()
102 {
103         self.enemy.nextthink = time;
104         self.enemy = world;
105 }
106
107 void Ent_TubaNote(float bIsNew)
108 {
109     int f, n, i;
110         float att, upd;
111         f = ReadByte();
112
113         upd = 0;
114
115         if(f & 1)
116         {
117                 n = ReadChar();
118                 i = ReadByte();
119                 att = (i & 1);
120                 i = floor(i / 2);
121
122                 if(n != self.note || i != self.tuba_instrument || bIsNew)
123                 {
124                         if(self.enemy)
125                                 Ent_TubaNote_StopSound();
126                 }
127
128                 if(!self.enemy)
129                 {
130                         self.enemy = spawn();
131                         self.enemy.classname = "tuba_note";
132                         if(Tuba_PitchStep)
133                         {
134                                 self.enemy.enemy = spawn();
135                                 self.enemy.enemy.classname = "tuba_note_2";
136                         }
137                         bIsNew = true;
138                 }
139
140                 self.enemy.attenuate = att;
141
142                 if(bIsNew)
143                 {
144                         self.note = n;
145                         self.tuba_instrument = i;
146                         upd = 1;
147                 }
148         }
149
150         if(f & 2)
151         {
152                 self.enemy.origin_x = ReadCoord();
153                 self.enemy.origin_y = ReadCoord();
154                 self.enemy.origin_z = ReadCoord();
155                 setorigin(self.enemy, self.enemy.origin);
156                 if(self.enemy.enemy)
157                         setorigin(self.enemy.enemy, self.enemy.origin);
158         }
159
160         self.think = Ent_TubaNote_StopSound;
161         self.entremove = Ent_TubaNote_StopSound;
162         self.enemy.think = Ent_TubaNote_Think;
163         self.enemy.nextthink = time + 10;
164
165         if(upd)
166                 Ent_TubaNote_UpdateSound();
167 }
168
169 void Tuba_Precache()
170 {
171         float i;
172     int n;
173         Tuba_PitchStep = autocvar_g_balance_tuba_pitchstep;
174         if(Tuba_PitchStep)
175         {
176                 if(!checkextension("DP_SND_SOUND7_WIP2") && !checkextension("DP_SND_SOUND7"))
177                 {
178                         print("^1NOTE:^7 requested pitch shifting, but not supported by this engine build\n");
179                         Tuba_PitchStep = 0;
180                 }
181         }
182         for(n = TUBA_MIN; n <= TUBA_MAX; ++n)
183         {
184                 if(!Tuba_PitchStep || ((n % Tuba_PitchStep) == 0))
185                 {
186                         for(i = 0; i < TUBA_INSTRUMENTS; ++i)
187                                 precache_sound(TUBA_STARTNOTE(i, n));
188                 }
189         }
190 }