]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/bgmscript.qc
as always, forgot some files
[divverent/nexuiz.git] / data / qcsrc / client / bgmscript.qc
1 float bgmscriptbuf;
2 float bgmscriptbufsize;
3 float bgmscriptbufloaded;
4
5 .float bgmscriptline;
6 .float bgmscriptline0;
7 .float bgmscriptvelocity;
8 .float bgmscripttime;
9 .float bgmscriptstate;
10 .float bgmscriptstatetime;
11 .float bgmscriptdelta;
12
13 float GetAttackDecaySustainAmplitude(float a, float d, float s, float t)
14 {
15         // phase:
16         //   attack: from 0 to 1, in time a for a full length
17         //   decay: from 1 to s, in time d
18         //   sustain: s
19         
20         if(a)
21                 if(t <= a)
22                         return max(0, t / a);
23
24         if(d)
25                 if(t <= a + d)
26                         return max(0, ((t - a) / d)) * (s - 1) + 1;
27
28         return s;
29 }
30
31 float GetReleaseAmplitude(float s, float r, float t)
32 {
33         if(r)
34                 return s * (1 - min(1, t / r));
35         
36         return 0;
37 }
38
39 float GetAttackTime(float a, float amp)
40 {
41         return amp * a;
42 }
43
44 float GetReleaseTime(float s, float r, float amp)
45 {
46         if(s)
47                 return (1 - amp / s) * r;
48
49         return 0;
50 }
51
52 void BGMScript_Init()
53 {
54         string s;
55         float fh;
56         bgmscriptbuf = bgmscriptbufsize = 0;
57         bgmscriptbufloaded = 1;
58         s = strcat("maps/", mi_shortname, ".bgs");
59         fh = fopen(s, FILE_READ);
60         if(fh < 0)
61                 return;
62         bgmscriptbuf = buf_create();
63         while((s = fgets(fh)))
64         {
65                 bufstr_set(bgmscriptbuf, bgmscriptbufsize, s);
66                 ++bgmscriptbufsize;
67         }
68         fclose(fh);
69 }
70
71 void BGMScript_InitEntity(entity e)
72 {
73         if(e.bgmscript != "")
74         {
75                 if(!bgmscriptbufloaded)
76                         BGMScript_Init();
77
78                 string mychar;
79                 float i;
80
81                 e.bgmscriptline0 = -1;
82                 for(i = 0; i < bgmscriptbufsize; ++i)
83                 {
84                         tokenize_sane(bufstr_get(bgmscriptbuf, i));
85                         if(argv(0) == e.bgmscript)
86                                 break;
87                 }
88                 e.bgmscriptline = e.bgmscriptline0 = i;
89                 if(i >= bgmscriptbufsize)
90                 {
91                         print("func_pointparticles: bgmscript does not define ", mychar, "\n");
92                         e.bgmscript = "";
93                 }
94         }
95 }
96
97 float BGMScript(entity e)
98 {
99         float t;
100         float amp;
101
102         if(e.bgmscript == "")
103                 return 1;
104         
105         if(cvar("bgmvolume") <= 0)
106                 return -1;
107
108         e.just_toggled = FALSE;
109
110         t = gettime(GETTIME_CDTRACK);
111         if(t < e.bgmscripttime)
112         {
113                 e.bgmscriptline = e.bgmscriptline0;
114                 e.bgmscripttime = 0;
115                 e.bgmscriptstatetime = t - drawframetime - e.bgmscriptdelta; // FIXME this causes a tiny hitch
116         }
117
118         // find the CURRENT line
119         for(;;)
120         {
121                 tokenize_sane(bufstr_get(bgmscriptbuf, e.bgmscriptline));
122                 if(stof(argv(1)) >= t)
123                         break;
124                 if(argv(0) != e.bgmscript)
125                 {
126                         // end of bgmscript, will revert to beginning later
127                         break;
128                 }
129                 else if(t >= stof(argv(1)))
130                 {
131                         e.bgmscriptline += 1;
132                         e.bgmscripttime = stof(argv(1));
133
134                         if(e.bgmscriptstate)
135                                 amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity;
136                         else
137                                 amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
138
139                         // time code reached!
140                         e.bgmscriptvelocity = stof(argv(2));
141                         if(e.bgmscriptvelocity > 0)
142                                 e.just_toggled = e.bgmscriptstate = TRUE;
143                         else
144                                 e.just_toggled = e.bgmscriptstate = FALSE;
145
146                         if(e.bgmscriptstate)
147                                 e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity);
148                         else
149                         {
150                                 e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptsustain, e.bgmscriptrelease, amp);
151                                 amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
152                         }
153                 }
154         }
155
156         if(e.bgmscriptstate)
157         {
158                 // attack, decay or sustain
159                 e.bgmscriptdelta = t - e.bgmscriptstatetime;
160                 return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptdelta) * e.bgmscriptvelocity;
161         }
162         else
163         {
164                 // release
165                 e.bgmscriptdelta = t - e.bgmscriptstatetime;
166                 return GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);
167         }
168 }
169