1 #define TUBA_STARTNOTE(n) strcat("weapons/tuba_loopnote", ftos(n), ".wav")
3 .float attenuate; // if set, attenuate it
4 .float cnt; // current volume
5 .float count; // initial volume
7 void Ent_TubaNote_Think()
10 f = autocvar_g_balance_tuba_fadetime;
12 self.cnt -= frametime * self.count / f;
15 self.nextthink = time;
18 sound(self, CH_TUBA, "misc/null.wav", 0, 0);
24 sound7(self, CH_TUBA, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation, 100 * pow(2.0, self.note / 12.0), 0);
26 sound(self, CH_TUBA, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
31 void Ent_TubaNote_UpdateSound()
33 self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
34 self.enemy.count = self.enemy.cnt;
35 self.enemy.note = self.note;
37 sound7(self.enemy, CH_TUBA, TUBA_STARTNOTE(0), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation, 100 * pow(2.0, self.note / 12.0), 0);
39 sound(self.enemy, CH_TUBA, TUBA_STARTNOTE(self.note), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
43 void Ent_TubaNote_StopSound()
45 self.enemy.nextthink = time;
49 void Ent_TubaNote(float bIsNew)
53 n = floor(f / 2) - 42;
54 if(n != self.note || bIsNew)
56 Ent_TubaNote_StopSound();
60 self.enemy.classname = "tuba_note";
65 self.enemy.origin_x = ReadCoord();
66 self.enemy.origin_y = ReadCoord();
67 self.enemy.origin_z = ReadCoord();
68 setorigin(self.enemy, self.enemy.origin);
69 self.enemy.attenuate = ReadByte();
71 self.think = Ent_TubaNote_StopSound;
72 self.entremove = Ent_TubaNote_StopSound;
73 self.enemy.think = Ent_TubaNote_Think;
74 self.enemy.nextthink = time + 10;
78 Ent_TubaNote_UpdateSound();
86 precache_sound(TUBA_STARTNOTE(0));
88 for(i = -18; i <= +27; ++i)
90 precache_sound(TUBA_STARTNOTE(i));
93 //precache_sound(""); // we want to change volume of existing sounds