Files
IL-GSC/BO1/PC/ZM/clientscripts/_music.csc
2024-02-18 17:32:07 -05:00

269 lines
6.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include clientscripts\_utility;
music_init()
{
level.activeMusicState = "";
level.nextMusicState = "";
level.musicStates = [];
level.musicEnt = spawnfakeent(0);
level.stingerEnt = spawnfakeent(0);
thread updateMusic();
thread musicSaveWait();
registerSystem("musicCmd", ::musicCmdHandler);
}
musicSaveWait()
{
for(;;)
{
level waittill("save_restore");
if(level.nextMusicState == "")
level.nextMusicState = level.activeMusicState;
level.activeMusicState = "";
println("resetting music state to "+level.nextMusicState);
states = getArrayKeys( level.musicStates );
for ( i = 0; i < states.size; i++ )
{
stopLoopSound( 0, level.musicStates[states[i]].aliasEnt, 0 );
}
thread updateMusic();
}
}
musicCmdHandler(clientNum, state, oldState)
{
if(clientNum != 0)
return;
level.nextMusicState = state;
println("music debug: got state '"+state+"'");
level notify("new_music");
}
updateMusic()
{
level endon("save_restore");
while(1)
{
if(level.activeMusicState == level.nextMusicState)
level waittill("new_music");
if(level.activeMusicState == level.nextMusicState)
continue;
active = level.activeMusicState;
next = level.nextMusicState;
if(next != "" && !isdefined(level.musicStates[next]))
{
assertmsg("unknown music state '"+next+"'");
level.nextMusicState = level.activeMusicState;
continue;
}
if(active != "")
transitionOut(active, next);
if(next != "")
transitionIn(active, next);
level.activeMusicState = next;
}
}
fadeOutAndStopSound(id, time)
{
rate = 0;
if(isdefined(time) && time != 0)
rate = 1.0 / time;
setSoundVolumeRate(id, rate);
setSoundVolume(id, 0.0);
wait(time);
stopSound(id);
}
transitionOut(previous, next)
{
if(previous == "")
return;
println("music transition out state "+next);
if(!isdefined(level.musicStates[previous]))
{
assertmsg("unknown music state '"+previous+"'");
return;
}
ent = level.musicStates[previous].aliasEnt;
loopalias = level.musicStates[previous].loopalias;
oneshotalias = level.musicStates[previous].oneshotalias;
fadeout = level.musicStates[previous].fadeout;
waittilldone = level.musicStates[previous].waittilldone;
waittillstingerdone = level.musicStates[previous].waittillstingerdone;
stinger = level.musicStates[previous].stinger;
id = level.musicStates[previous].id;
startDelay = level.musicStates[previous].startDelay;
forceStinger = level.musicStates[previous].forceStinger;
if(next == "")
{
nextloopalias = "";
nextoneshotalias = "";
}
else
{
nextloopalias = level.musicStates[next].loopalias;
nextoneshotalias = level.musicStates[next].oneshotalias;
}
stingerid = -1;
loopMatches = loopalias == nextloopalias;
haveOneShot = nextoneshotalias != "";
if(stinger != "" && (!loopMatches || haveOneShot || forceStinger))
{
stingerid = playSound(0, stinger, (0,0,0));
}
if(loopalias != "")
{
if(loopalias != nextloopalias || nextoneshotalias != "")
{
stopLoopSound( 0, ent, fadeout );
if(waittilldone)
{
wait(fadeout);
}
}
else
{
}
}
else
{
if(waittilldone)
{
while(SoundPlaying(id))
{
wait(.01);
}
}
else
{
thread fadeOutAndStopSound(id,fadeout);
}
}
while(startDelay > 0 && SoundPlaying(stingerid) && GetPlaybackTime(stingerid) < startDelay * 1000)
wait(.01);
if(waittillstingerdone)
{
while(SoundPlaying(stingerid))
wait(.01);
}
if(loopalias != nextloopalias)
level.musicStates[previous].id = -1;
}
transitionIn(previous, next)
{
ent = level.musicStates[next].aliasEnt;
loopalias = level.musicStates[next].loopalias;
oneshotalias = level.musicStates[next].oneshotalias;
fadein = level.musicStates[next].fadein;
loop = level.musicStates[next].loop;
println("music transition in state "+next);
if(previous == "")
{
oldloopalias = "";
oldoneshotalias = "";
oldid = -1;
oldstartDelay = 0;
startDelay = 0;
}
else
{
oldloopalias = level.musicStates[previous].loopalias;
oldoneshotalias = level.musicStates[previous].oneshotalias;
oldid = level.musicStates[previous].id;
}
if(oneshotalias != "")
{
level.musicStates[next].id = playSound( 0, oneshotalias, (0,0,0) );
if(loopalias != "")
{
while(SoundPlaying(level.musicStates[next].id) )
{
length = GetKnownLength(level.musicStates[next].id);
time = 0;
if(length != 0)
{
time = GetPlaybackTime(level.musicStates[next].id);
if(length-time <= fadein*1000 )
break;
}
wait(.01);
}
}
}
if(oldloopalias == loopalias && oldid != -1 && oneshotalias == "")
{
level.musicStates[next].id = level.musicStates[previous].id;
level.musicStates[previous].id = -1;
oldent = level.musicStates[previous].aliasEnt;
level.musicStates[previous].aliasEnt = level.musicStates[next].aliasEnt;
level.musicStates[next].aliasEnt = oldent;
}
else if(loopalias != "")
{
level.musicStates[next].id = playLoopSound( 0, ent, loopalias, fadein );
}
}
declareMusicState(name)
{
if ( isdefined( level.musicStates[name] ) )
return;
level.musicDeclareName = name;
level.musicStates[name] = spawnStruct();
level.musicStates[name].aliasEnt = spawnfakeent(0);
level.musicStates[name].loopalias = "";
level.musicStates[name].oneshotalias = "";
level.musicStates[name].fadein = 0;
level.musicStates[name].fadeout = 0;
level.musicStates[name].id = -1;
level.musicStates[name].waittilldone = false;
level.musicStates[name].stinger = "";
level.musicStates[name].waittillstingerdone = false;
level.musicStates[name].startDelay = 0;
level.musicStates[name].forceStinger = false;
}
musicWaitTillDone()
{
assert(isdefined(level.musicDeclareName));
name = level.musicDeclareName;
level.musicStates[name].waittilldone = true;
}
musicWaitTillStingerDone()
{
assert(isdefined(level.musicDeclareName));
name = level.musicDeclareName;
level.musicStates[name].waittillstingerdone = true;
}
musicStinger(stinger, delay, force)
{
assert(isdefined(level.musicDeclareName));
if(!isdefined(delay))
delay = 0;
name = level.musicDeclareName;
level.musicStates[name].stinger = stinger;
level.musicStates[name].startDelay = delay;
if(isdefined(force))
{
level.musicStates[name].forceStinger = force;
}
}
_musicAlias(alias, fadein, fadeout, loop)
{
assert(isdefined(level.musicDeclareName));
name = level.musicDeclareName;
if(loop)
level.musicStates[name].loopalias = alias;
else
level.musicStates[name].oneshotalias = alias;
level.musicStates[name].fadein = fadein;
level.musicStates[name].fadeout = fadeout;
}
musicAliasLoop(alias, fadein, fadeout)
{
_musicAlias(alias, fadein, fadeout, true);
}
musicAlias(alias, fadeout)
{
_musicAlias(alias, 0, fadeout, false);
}