// Utility rain functions: #include maps\_utility; #include common_scripts\utility; /* ============= ///ScriptDocBegin "Name: rainHard( )" "Summary: " "Module: Entity" "CallOn: An entity" "MandatoryArg: : " "OptionalArg: : " "Example: " "SPMP: singleplayer" ///ScriptDocEnd ============= */ rainHard( transition ) { println( "Rain becomes Hard over " + transition + " seconds" ); level notify( "rain_change", "hard", transition ); level thread rainEffectChange( 10, transition ); wait( transition * 0.5 ); level.ambient_modifier[ "rain" ] = ""; // This is commented out until ambient weather sounds are added to the tree //maps\_ambient::activateAmbient( level.ambient ); wait( transition * 0.5 ); } /* ============= ///ScriptDocBegin "Name: rainMedium()" "Summary: " "Module: Entity" "CallOn: An entity" "MandatoryArg: : " "OptionalArg: : " "Example: " "SPMP: singleplayer" ///ScriptDocEnd ============= */ rainMedium( transition ) { println( "Rain becomes Medium over " + transition + " seconds" ); level notify( "rain_change", "hard", transition ); level thread rainEffectChange( 8, transition ); wait( transition * 0.5 ); level.ambient_modifier[ "rain" ] = ""; // This is commented out until ambient weather sounds are added to the tree //maps\_ambient::activateAmbient( level.ambient ); wait( transition * 0.5 ); } /* ============= ///ScriptDocBegin "Name: rainLight( )" "Summary: " "Module: Entity" "CallOn: An entity" "MandatoryArg: : " "OptionalArg: : " "Example: " "SPMP: singleplayer" ///ScriptDocEnd ============= */ rainLight( transition ) { println( "Rain becomes Light over " + transition + " seconds" ); level notify( "rain_change", "light", transition ); level thread rainEffectChange( 5, transition ); wait( transition * 0.5 ); level.ambient_modifier[ "rain" ] = "light"; // This is commented out until ambient weather sounds are added to the tree //maps\_ambient::activateAmbient( level.ambient ); wait( transition * 0.5 ); } /* ============= ///ScriptDocBegin "Name: rainNone( )" "Summary: " "Module: Entity" "CallOn: An entity" "MandatoryArg: : " "OptionalArg: : " "Example: " "SPMP: singleplayer" ///ScriptDocEnd ============= */ rainNone( transition ) { println( "Rain fades out over " + transition + " seconds" ); level notify( "rain_change", "none", transition ); level thread rainEffectChange( 0, transition ); wait( transition * 0.5 ); level.ambient_modifier[ "rain" ] = "norain"; // This is commented out until ambient weather sounds are added to the tree //maps\_ambient::activateAmbient( level.ambient ); wait( transition * 0.5 ); } /* ============= ///ScriptDocBegin "Name: rainInit( )" "Summary: " "Module: Entity" "CallOn: An entity" "MandatoryArg: : " "OptionalArg: : " "Example: " "SPMP: singleplayer" ///ScriptDocEnd ============= */ rainInit( lvl ) { flag_init( "_weather_lightning_enabled" ); flag_set( "_weather_lightning_enabled" ); if ( lvl == "none" ) { level.rainLevel = 0;// starting rain level level._effect[ "rain_drops" ] = level._effect[ "rain_" + level.rainLevel ]; rainNone( 0.1 ); } else if ( lvl == "light" ) { level.rainLevel = 5;// starting rain level level._effect[ "rain_drops" ] = level._effect[ "rain_" + level.rainLevel ]; rainLight( 0.1 ); } else { level.rainLevel = 10;// starting rain level level._effect[ "rain_drops" ] = level._effect[ "rain_" + level.rainLevel ]; rainHard( 0.1 ); } } lightning( normal, flash ) { [[ normal ]](); waittillframeend;// so exploders get setup for ( ;; ) lightningThink( normal, flash ); } ////// /* BELOW THIS LINE IS INTERNAL RAIN FUNCTIONS */ ////// rainEffectChange( change, transition ) { level notify( "rain_level_change" ); level endon( "rain_level_change" ); if ( level.rainLevel > change ) { dif = level.rainLevel - change; transition /= dif; for ( i = 0;i < dif;i++ ) { wait( transition ); level.rainLevel -- ; level._effect[ "rain_drops" ] = level._effect[ "rain_" + level.rainLevel ]; } assert( level.rainLevel == change ); } if ( level.rainLevel < change ) { dif = change - level.rainLevel; transition /= dif; for ( i = 0;i < dif;i++ ) { wait( transition ); level.rainLevel++ ; level._effect[ "rain_drops" ] = level._effect[ "rain_" + level.rainLevel ]; } assert( level.rainLevel == change ); } } addLightningExploder( num ) { if ( !isdefined( level.lightningExploder ) ) { level.lightningExploder = []; level.lightningExploderIndex = 0; } level.lightningExploder[ level.lightningExploder.size ] = num; } playerWeather() { player = getentarray( "player", "classname" )[ 0 ]; for ( ;; ) { playfx( level._effect[ "rain_drops" ], player.origin + ( 0, 0, 650 ), player.origin + ( 0, 0, 680 ) ); wait( 0.3 ); } } rainlevelRandomwait() { if ( level.rainLevel == 0 ) return( randomfloat( 30 ) ); else if ( level.rainLevel == 1 ) return( randomfloat( 24 ) ); else if ( level.rainLevel == 2 ) return( randomfloat( 20 ) ); else if ( level.rainLevel == 3 ) return( randomfloat( 15 ) ); else if ( level.rainLevel == 4 ) return( randomfloat( 12 ) ); else if ( level.rainLevel == 5 ) return( randomfloat( 9 ) ); else if ( level.rainLevel == 6 ) return( randomfloat( 8 ) ); else if ( level.rainLevel == 7 ) return( randomfloat( 8 ) ); else if ( level.rainLevel == 8 ) return( randomfloat( 7 ) ); else if ( level.rainLevel == 9 ) return( randomfloat( 6 ) ); else if ( level.rainLevel == 10 ) return( randomfloat( 5 ) ); } rainlevelwait() { if ( level.rainLevel == 0 ) return( 20 ); else if ( level.rainLevel == 1 ) return( 18 ); else if ( level.rainLevel == 2 ) return( 16 ); else if ( level.rainLevel == 3 ) return( 14 ); else if ( level.rainLevel == 4 ) return( 12 ); else if ( level.rainLevel == 5 ) return( 10 ); else if ( level.rainLevel == 6 ) return( 9 ); else if ( level.rainLevel == 7 ) return( 8 ); else if ( level.rainLevel == 8 ) return( 7 ); else if ( level.rainLevel == 9 ) return( 6 ); else if ( level.rainLevel == 10 ) return( 5 ); } lightningThink( normal, flash ) { level endon( "rain_change" ); // in case we get broken out, we may have lightning sooner than planned if we're getting rainier nextStrike = gettime() + ( ( rainlevelwait() + rainlevelRandomwait() ) * 1000 ); if ( nextStrike < level.nextLightning ) level.nextLightning = nextStrike; for ( ;; ) { flag_wait( "_weather_lightning_enabled" ); timer = ( level.nextLightning - gettime() ) * 0.001; if ( timer > 0 ) wait( timer ); if( !flag( "_weather_lightning_enabled" ) ) continue; lightningFlash( normal, flash ); level.nextLightning = gettime() + ( ( rainlevelwait() + rainlevelRandomwait() ) * 1000 ); } } fogflash( flashfunc ) { if ( isdefined( level.lightningExploderIndex ) ) exploder( level.lightningExploder[ level.lightningExploderIndex ] ); [[ flashfunc ]](); } lightningFlash( normal, flashfunc, flashType ) { flash[ 0 ] = "quick"; flash[ 1 ] = "double"; flash[ 2 ] = "triple"; //this is where the sound happens thread thunder(); if( !isdefined( flashType ) ) flashType = randomint( flash.size ); lit_num = 0; if ( isdefined( level.lightningExploderIndex ) ) { while ( lit_num == level.lightningExploderIndex ) lit_num = randomint( level.lightningExploder.size ); level.lightningExploderIndex = lit_num; } //this is where the visuals happen switch( flash[ flashType ] ) { case "quick": { fogflash( flashfunc ); break; } case "double": { fogflash( flashfunc ); wait( 0.05 ); fogflash( flashfunc ); break; } case "triple": { fogflash( flashfunc ); wait( 0.05 ); fogflash( flashfunc ); wait( 0.5 ); fogflash( flashfunc ); break; } } } thunder() { if ( level.rainLevel == 0 ) wait( 6 + randomfloat( 2 ) ); else if ( level.rainLevel == 1 ) wait( 5 + randomfloat( 1.8 ) ); else if ( level.rainLevel == 2 ) wait( 4.5 + randomfloat( 1.6 ) ); else if ( level.rainLevel == 3 ) wait( 4 + randomfloat( 1.6 ) ); else if ( level.rainLevel == 4 ) wait( 3.5 + randomfloat( 1.5 ) ); else if ( level.rainLevel == 5 ) wait( 3 + randomfloat( 1.5 ) ); else if ( level.rainLevel == 6 ) wait( 2.5 + randomfloat( 1.2 ) ); else if ( level.rainLevel == 7 ) wait( 2 + randomfloat( 1 ) ); else if ( level.rainLevel == 8 ) wait( 1.9 + randomfloat( 0.5 ) ); else if ( level.rainLevel == 9 ) wait( 1.5 ); else if ( level.rainLevel == 10 ) wait( 1 ); ent = spawn( "script_origin", ( 0, 0, 0 ) ); ent.origin = level.player.origin + ( 0, 0, 60 ); ent linkto( level.player ); if ( level.rainlevel <= 8 ) ent playsound( "elm_thunder_distant", "sounddone" ); else { ent playsound( "elm_thunder_distant", "sounddone" ); ent thread play_sound_on_entity( "elm_thunder_strike" ); } // iprintlnbold ("thunder!"); ent waittill( "sounddone" ); ent delete(); }