2 float bgmscriptbufsize;
3 float bgmscriptbufloaded;
7 .float bgmscriptvelocity;
10 .float bgmscriptstatetime;
11 .float bgmscriptdelta;
13 float GetAttackDecaySustainAmplitude(float a, float d, float s, float t)
16 // attack: from 0 to 1, in time a for a full length
17 // decay: from 1 to s, in time d
26 return max(0, ((t - a) / d)) * (s - 1) + 1;
31 float GetReleaseAmplitude(float s, float r, float t)
34 return s * (1 - min(1, t / r));
39 float GetAttackTime(float a, float amp)
44 float GetReleaseTime(float s, float r, float amp)
47 return (1 - amp / s) * r;
56 bgmscriptbuf = bgmscriptbufsize = 0;
57 bgmscriptbufloaded = 1;
58 s = strcat("maps/", mi_shortname, ".bgs");
59 fh = fopen(s, FILE_READ);
62 bgmscriptbuf = buf_create();
63 while((s = fgets(fh)))
65 bufstr_set(bgmscriptbuf, bgmscriptbufsize, s);
71 void BGMScript_InitEntity(entity e)
77 if(!bgmscriptbufloaded)
83 m = strcat(e.bgmscript, " ");
86 e.bgmscriptline0 = -1;
87 for(i = 0; i < bgmscriptbufsize; ++i)
89 if(substring(bufstr_get(bgmscriptbuf, i), 0, l) == m)
92 e.bgmscriptline = e.bgmscriptline0 = i;
93 if(i >= bgmscriptbufsize)
95 print("func_pointparticles: bgmscript does not define ", mychar, "\n");
101 float BGMScript(entity e)
106 if(e.bgmscript == "")
109 if(cvar("bgmvolume") <= 0)
112 e.just_toggled = FALSE;
114 t = gettime(GETTIME_CDTRACK);
115 if(t < e.bgmscripttime)
117 e.bgmscriptline = e.bgmscriptline0;
119 e.bgmscriptstatetime = t - drawframetime - e.bgmscriptdelta; // FIXME this causes a tiny hitch
122 // find the CURRENT line
125 tokenize_sane(bufstr_get(bgmscriptbuf, e.bgmscriptline));
126 if(stof(argv(1)) >= t)
128 if(argv(0) != e.bgmscript)
130 // end of bgmscript, will revert to beginning later
133 else if(t >= stof(argv(1)))
135 e.bgmscriptline += 1;
136 e.bgmscripttime = stof(argv(1));
139 amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity;
141 amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
143 // time code reached!
144 e.bgmscriptvelocity = stof(argv(2));
145 if(e.bgmscriptvelocity > 0)
146 e.just_toggled = e.bgmscriptstate = TRUE;
148 e.just_toggled = e.bgmscriptstate = FALSE;
151 e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity);
154 e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptsustain, e.bgmscriptrelease, amp);
155 amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
162 // attack, decay or sustain
163 e.bgmscriptdelta = t - e.bgmscriptstatetime;
164 return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptdelta) * e.bgmscriptvelocity;
169 e.bgmscriptdelta = t - e.bgmscriptstatetime;
170 return GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);