From 017774e2d494b830150f1c4f5228e30acf6eac20 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 17 Apr 2009 09:21:25 +0000 Subject: [PATCH] as always, forgot some files git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6517 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/bgmscript.qc | 169 +++++++++++++++++++++++++++++++++ data/qcsrc/client/bgmscript.qh | 10 ++ data/qcsrc/client/wall.qc | 109 +++++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 data/qcsrc/client/bgmscript.qc create mode 100644 data/qcsrc/client/bgmscript.qh create mode 100644 data/qcsrc/client/wall.qc diff --git a/data/qcsrc/client/bgmscript.qc b/data/qcsrc/client/bgmscript.qc new file mode 100644 index 000000000..8272e7343 --- /dev/null +++ b/data/qcsrc/client/bgmscript.qc @@ -0,0 +1,169 @@ +float bgmscriptbuf; +float bgmscriptbufsize; +float bgmscriptbufloaded; + +.float bgmscriptline; +.float bgmscriptline0; +.float bgmscriptvelocity; +.float bgmscripttime; +.float bgmscriptstate; +.float bgmscriptstatetime; +.float bgmscriptdelta; + +float GetAttackDecaySustainAmplitude(float a, float d, float s, float t) +{ + // phase: + // attack: from 0 to 1, in time a for a full length + // decay: from 1 to s, in time d + // sustain: s + + if(a) + if(t <= a) + return max(0, t / a); + + if(d) + if(t <= a + d) + return max(0, ((t - a) / d)) * (s - 1) + 1; + + return s; +} + +float GetReleaseAmplitude(float s, float r, float t) +{ + if(r) + return s * (1 - min(1, t / r)); + + return 0; +} + +float GetAttackTime(float a, float amp) +{ + return amp * a; +} + +float GetReleaseTime(float s, float r, float amp) +{ + if(s) + return (1 - amp / s) * r; + + return 0; +} + +void BGMScript_Init() +{ + string s; + float fh; + bgmscriptbuf = bgmscriptbufsize = 0; + bgmscriptbufloaded = 1; + s = strcat("maps/", mi_shortname, ".bgs"); + fh = fopen(s, FILE_READ); + if(fh < 0) + return; + bgmscriptbuf = buf_create(); + while((s = fgets(fh))) + { + bufstr_set(bgmscriptbuf, bgmscriptbufsize, s); + ++bgmscriptbufsize; + } + fclose(fh); +} + +void BGMScript_InitEntity(entity e) +{ + if(e.bgmscript != "") + { + if(!bgmscriptbufloaded) + BGMScript_Init(); + + string mychar; + float i; + + e.bgmscriptline0 = -1; + for(i = 0; i < bgmscriptbufsize; ++i) + { + tokenize_sane(bufstr_get(bgmscriptbuf, i)); + if(argv(0) == e.bgmscript) + break; + } + e.bgmscriptline = e.bgmscriptline0 = i; + if(i >= bgmscriptbufsize) + { + print("func_pointparticles: bgmscript does not define ", mychar, "\n"); + e.bgmscript = ""; + } + } +} + +float BGMScript(entity e) +{ + float t; + float amp; + + if(e.bgmscript == "") + return 1; + + if(cvar("bgmvolume") <= 0) + return -1; + + e.just_toggled = FALSE; + + t = gettime(GETTIME_CDTRACK); + if(t < e.bgmscripttime) + { + e.bgmscriptline = e.bgmscriptline0; + e.bgmscripttime = 0; + e.bgmscriptstatetime = t - drawframetime - e.bgmscriptdelta; // FIXME this causes a tiny hitch + } + + // find the CURRENT line + for(;;) + { + tokenize_sane(bufstr_get(bgmscriptbuf, e.bgmscriptline)); + if(stof(argv(1)) >= t) + break; + if(argv(0) != e.bgmscript) + { + // end of bgmscript, will revert to beginning later + break; + } + else if(t >= stof(argv(1))) + { + e.bgmscriptline += 1; + e.bgmscripttime = stof(argv(1)); + + if(e.bgmscriptstate) + amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity; + else + amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime); + + // time code reached! + e.bgmscriptvelocity = stof(argv(2)); + if(e.bgmscriptvelocity > 0) + e.just_toggled = e.bgmscriptstate = TRUE; + else + e.just_toggled = e.bgmscriptstate = FALSE; + + if(e.bgmscriptstate) + e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity); + else + { + e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptsustain, e.bgmscriptrelease, amp); + amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime); + } + } + } + + if(e.bgmscriptstate) + { + // attack, decay or sustain + e.bgmscriptdelta = t - e.bgmscriptstatetime; + return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptdelta) * e.bgmscriptvelocity; + } + else + { + // release + e.bgmscriptdelta = t - e.bgmscriptstatetime; + return GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta); + } +} + diff --git a/data/qcsrc/client/bgmscript.qh b/data/qcsrc/client/bgmscript.qh new file mode 100644 index 000000000..713cf5798 --- /dev/null +++ b/data/qcsrc/client/bgmscript.qh @@ -0,0 +1,10 @@ +.string bgmscript; +.float bgmscriptattack; +.float bgmscriptdecay; +.float bgmscriptsustain; +.float bgmscriptrelease; + +.float just_toggled; + +void BGMScript_InitEntity(entity e); +float BGMScript(entity e); diff --git a/data/qcsrc/client/wall.qc b/data/qcsrc/client/wall.qc new file mode 100644 index 000000000..d17d07f50 --- /dev/null +++ b/data/qcsrc/client/wall.qc @@ -0,0 +1,109 @@ +.float lip; + +void Ent_Wall_Draw() +{ + float f; + vector save; + + InterpolateOrigin_Do(); + + save = self.origin; + f = BGMScript(self); + if(f >= 0) + { + if(self.lip < 0) // < 0: alpha goes from 1 to 1-|lip| when toggled (toggling subtracts lip) + self.alpha = 1 + self.lip * f; + else // > 0: alpha goes from 1-|lip| to 1 when toggled (toggling adds lip) + self.alpha = 1 - self.lip * (1 - f); + self.origin = self.origin + self.movedir * f; + } + else + { + self.alpha = 1; + } + + R_AddEntity(self); + + self.origin = save; +} + +void Ent_Wall_Remove() +{ + if(self.bgmscript) + strunzone(self.bgmscript); + self.bgmscript = string_null; +} + +void Ent_Wall() +{ + float f; + InterpolateOrigin_Undo(); + self.iflags = IFLAG_ANGLES; + + f = ReadByte(); + + if(f & 1) + { + if(f & 0x40) + self.colormap = ReadShort(); + else + self.colormap = 0; + } + + if(f & 2) + { + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + } + + if(f & 4) + { + if(f & 0x10) + { + self.angles_x = ReadAngle(); + self.angles_y = ReadAngle(); + self.angles_z = ReadAngle(); + } + else + self.angles = '0 0 0'; + } + + if(f & 8) + { + self.modelindex = ReadShort(); + self.solid = ReadByte(); + self.scale = ReadByte() / 16.0; + if(f & 0x20) + { + self.mins_x = ReadCoord(); + self.mins_y = ReadCoord(); + self.mins_z = ReadCoord(); + self.maxs_x = ReadCoord(); + self.maxs_y = ReadCoord(); + self.maxs_z = ReadCoord(); + } + else + self.mins = self.maxs = '0 0 0'; + if(self.bgmscript) + strunzone(self.bgmscript); + self.bgmscript = strzone(ReadString()); + if(self.bgmscript != "") + { + self.bgmscriptattack = ReadByte() / 64.0; + self.bgmscriptdecay = ReadByte() / 64.0; + self.bgmscriptsustain = ReadByte() / 255.0; + self.bgmscriptrelease = ReadByte() / 64.0; + self.movedir_x = ReadCoord(); + self.movedir_y = ReadCoord(); + self.movedir_z = ReadCoord(); + self.lip = ReadByte() / 255.0; + } + BGMScript_InitEntity(self); + } + + InterpolateOrigin_Note(); + + self.entremove = Ent_Wall_Remove; + self.draw = Ent_Wall_Draw; +} -- 2.39.2