busInit() { level.activeBusState = ""; level.nextBusState = ""; level.busStates = []; registerDefaults(); thread updateBus(true); thread busSaveWait(); clientscripts\_utility::registerSystem("busCmd", ::busCmdHandler); } busSaveWait() { for(;;) { level waittill("save_restore"); if(level.nextBusState == "") level.nextBusState = level.activeBusState; level.activeBusState = ""; if(level.nextBusState == "") { busStateDeactivate(); busStateActivate("slow_on"); } println("resetting bus state to "+level.nextBusState); thread updateBus(false); } } busCmdHandler(clientNum, state, oldState) { if(clientNum != 0) { return; } level.nextBusState = state; println("bussing debug: got state '"+state+"'"); level notify("new_bus"); } setBusState(state) { level.nextBusState = state; println("bussing debug: set state '"+state+"'"); level notify("new_bus"); } updateBus(forcefade) { level endon("save_restore"); if(forcefade) { busStateDeactivate(); busStateActivate("immediate_off"); wait(1.0); busStateDeactivate(); busStateActivate("slow_on"); } while(1) { if(level.activeBusState == level.nextBusState) { level waittill("new_bus"); } println("got bus change current'"+level.activeBusState+"' next '"+level.nextBusState+"'"); if(level.activeBusState == level.nextBusState) { continue; } assert(isdefined(level.nextBusState)); assert(isdefined(level.activeBusState)); busStateDeactivate(); next = level.nextBusState; if(next != "") { busStateActivate(next); } level.activeBusState = next; } } busStateActivate(name) { println("activating bus '"+name+"'"); state = level.busStates[name]; if(!isdefined(state)) { println("invalid bus state '"+name+"'"); return; } assert(isdefined(state.time)); keys = getArrayKeys( state.levels ); assert(isdefined(keys)); } busStateDeactivate() { println("deactivating bus "); } declareBusState(name) { if ( !isdefined( level.busStates ) ) { return; } level.busDeclareName = name; if ( isdefined( level.busStates[name] ) ) { return; } level.busStates[name] = spawnStruct(); level.busStates[name].time = 0.5; level.busStates[name].levels = []; } busVolume(busname, value) { level.busStates[level.busDeclareName].levels[busname] = value; } busFadeTime(time) { level.busStates[level.busDeclareName].time = time; } busIsIn(bus, names) { for(j=0; j