burc_2004

zombie_moon_wasteland.gsc

Jul 21st, 2015
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include common_scripts\utility;
  3. #include maps\_utility;
  4. #include maps\_zombiemode_utility;
  5.  
  6. #include maps\zombie_moon_teleporter;
  7.  
  8.  
  9. //*****************************************************************************
  10. // Misc initializations for "No Mans Land"
  11. //*****************************************************************************
  12.  
  13.  
  14. #using_animtree( "generic_human" );
  15.  
  16. //----------------------------------------------------------------------------------------------
  17. // setup low gravity anims
  18. //----------------------------------------------------------------------------------------------
  19. init_supersprint_anims()
  20. {
  21.     // added for zombie speed buff
  22.     level.scr_anim["zombie"]["sprint5"] = %ai_zombie_fast_sprint_01;
  23.     level.scr_anim["zombie"]["sprint6"] = %ai_zombie_fast_sprint_02;
  24. }
  25.  
  26. init_no_mans_land()
  27. {
  28.     flag_init("enter_nml");
  29.     flag_init("teleporter_used");
  30.     flag_init("start_supersprint");
  31.  
  32.     level.on_the_moon = false;
  33.     level.ever_been_on_the_moon = false;
  34.     level.initial_spawn = true;
  35.     level.nml_didteleport = false;
  36.  
  37.     level.nml_dog_health = 100;
  38.    
  39.     //level._effect[ "lightning_dog_spawn" ]    = Loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" );
  40.  
  41.     /*******************************************************/
  42.     /* Teleporter Message - Shared text by all teleporters */
  43.     /*******************************************************/
  44.    
  45.     init_teleporter_message();
  46.     level thread init_supersprint_anims();
  47.    
  48.     maps\_zombiemode_zone_manager::zone_init( "nml_zone" );
  49.  
  50.     //set for earth sky at start
  51.     SetSavedDvar( "r_skyTransition", 1 );
  52.  
  53.     // Power Gate
  54.     teleporter_to_nml_init();
  55.    
  56.    
  57.     /*******************************************/
  58.     /* Init the player in NML detection volume */
  59.     /*******************************************/
  60.    
  61.     ent = getent( "nml_dogs_volume", "targetname" );
  62.     ent thread check_players_in_nml_dogs_volume();
  63.     level.num_nml_dog_targets = 0;
  64.    
  65.    
  66.     /************************************************************/
  67.     /* Get Perk Machine Entities                                */
  68.     /* This is a little long winded but how else can you do it? */
  69.     /************************************************************/
  70.    
  71.     get_perk_machine_ents();
  72.     level.last_perk_index = -1;
  73.    
  74.     // DCS 050911: starting in nml.
  75.     level thread zombie_moon_start_init();
  76.  
  77.     level.NML_REACTION_INTERVAL       = 2000;     // time interval between reactions       
  78.     level.NML_MIN_REACTION_DIST_SQ    = 32*32;    // minimum distance from the player to be able to react
  79.     level.NML_MAX_REACTION_DIST_SQ    = 2400*2400;// maximum distance from the player to be able to react
  80. }
  81.  
  82. //******************************************************************************
  83. zombie_moon_start_init()
  84. {
  85.     flag_wait( "begin_spawning" );
  86.  
  87.     level thread nml_dogs_init();
  88.  
  89.     teleporter = getent( "generator_teleporter", "targetname" );
  90.     teleporter_ending( teleporter, 0 );
  91. }  
  92.  
  93. nml_dogs_init()
  94. {
  95.     level.nml_dogs_enabled = false;
  96.     wait(30);
  97.     level.nml_dogs_enabled = true;
  98. }  
  99. //******************************************************************************
  100. nml_setup_round_spawner()
  101. {
  102.    
  103.     // Remember the last round number for when we return
  104.     if(IsDefined(level.round_number))
  105.     {
  106.         if(flag("between_rounds"))
  107.         {
  108.             level.nml_last_round = level.round_number + 1;
  109.             level.prev_round_zombies = [[ level.max_zombie_func ]]( level.zombie_vars["zombie_max_ai"] );
  110.         }  
  111.         else
  112.         {
  113.             level.nml_last_round = level.round_number;
  114.         }  
  115.     }
  116.     else
  117.     {
  118.         level.nml_last_round = 1; // start of level.
  119.     }
  120.  
  121.     level.round_spawn_func = ::nml_round_manager;
  122.                
  123.     // Kill current round and prepare a NML Style round spawngin system
  124.     Init_Moon_NML_Round( level.nml_last_round );
  125. }
  126.  
  127. //*****************************************************************************
  128. // How many players inside the volume ent?
  129. //*****************************************************************************
  130. num_players_touching_volume( volume )
  131. {
  132.     players = get_players();
  133.     num_players_inside = 0;
  134.    
  135.     for( i=0; i<players.size; i++ )
  136.     {
  137.         ent = players[i];
  138.         if(!isAlive(ent) || !isPlayer(ent) || ent.sessionstate == "spectator")
  139.         {
  140.             continue;
  141.         }
  142.         if( ent istouching( volume ) )
  143.         {
  144.             num_players_inside++;
  145.         }
  146.     }
  147.  
  148.     return( num_players_inside );
  149. }
  150.  
  151.  
  152. //*****************************************************************************
  153. // Check if any players are inside the deadly dog volume in NML
  154. //*****************************************************************************
  155. check_players_in_nml_dogs_volume()
  156. {
  157.     while( 1 )
  158.     {
  159.         level.num_nml_dog_targets = num_players_touching_volume( self );
  160.         wait( 1.3 );
  161.     }
  162. }
  163.  
  164.  
  165. //*****************************************************************************
  166. // Level specific Text
  167. //
  168. // Teleporter: "Players in Teleporter"
  169. //           : "Teleporter Activated"
  170. // N M L     : "Zombie Wasteland"
  171. //           : "Time Remaining"
  172. //*****************************************************************************
  173. init_hint_hudelem( x, y, alignX, alignY, fontscale, alpha )
  174. {
  175.     self.x = x;
  176.     self.y = y;
  177.     self.alignX = alignX;
  178.     self.alignY = alignY;
  179.     self.fontScale = fontScale;
  180.     self.alpha = alpha;
  181.     self.sort = 20;
  182. }
  183.  
  184. init_teleporter_message()
  185. {
  186.     players = get_players();
  187.     for( i=0; i<players.size; i++ )
  188.     {
  189.         player = players[i];
  190.         player.teleporter_message = newClientHudElem( player );
  191.         player.teleporter_message init_hint_hudelem( 320, 140, "center", "bottom", 1.6, 1.0 );
  192.         player.teleporter_message SetText( &"NULL_EMPTY" );
  193.     }
  194.     level.lastMessageTime = 0;
  195. }
  196.  
  197. set_teleporter_message( message )
  198. {
  199.     /**************************************************************/
  200.     /* Make sure text isn't replaced with "" for a period of time */
  201.     /**************************************************************/
  202.  
  203.     if( message != &"NULL_EMPTY" )
  204.     {
  205.         level.lastMessageTime = gettime();
  206.     }
  207.    
  208.     time = gettime() - level.lastMessageTime;
  209.     if( (time < (1000 * 1)) && (message == &"NULL_EMPTY") )
  210.     {
  211.         return;
  212.     }
  213.  
  214.  
  215.     /******************************************/
  216.     /* Set the message string for all players */
  217.     /******************************************/
  218.  
  219.     players = get_players();
  220.     for( i=0; i<players.size; i++ )
  221.     {
  222.         player = players[i];
  223.         if ( IsDefined( player.teleporter_message ) )
  224.         {
  225.             player.teleporter_message SetText( message );
  226.         }
  227.     }
  228. }
  229.  
  230.  
  231. //*****************************************************************************
  232. //
  233. //*****************************************************************************
  234. Init_Moon_NML_Round( target_round )
  235. {
  236.  
  237.     // delete all active zombies/force next round, then reset.
  238.     zombies = GetAIArray( "axis" );
  239.  
  240.     if ( IsDefined( zombies ) )
  241.     {
  242.         for (i = 0; i < zombies.size; i++)
  243.         {
  244.             if ( is_true( zombies[i].ignore_nml_delete ) )
  245.             {
  246.                 continue;
  247.             }
  248.  
  249.             if(IsDefined(zombies[i].fx_quad_trail))
  250.             {
  251.                 zombies[i].fx_quad_trail Delete();
  252.             }
  253.             zombies[i] maps\_zombiemode_spawner::reset_attack_spot();
  254.             zombies[i] notify("zombie_delete");
  255.             zombies[i] Delete();
  256.         }
  257.     }
  258.     level.zombie_health = level.zombie_vars["zombie_health_start"];
  259.     maps\_zombiemode::ai_calculate_health(level.nml_last_round);   
  260.     level.zombie_total = 0;
  261.     level.round_number = level.nml_last_round; 
  262.  
  263.     level.chalk_override = " ";
  264.    
  265.    
  266.     level thread clear_nml_rounds();
  267.        
  268.     // failsafe to clear hud.
  269.     level waittill("between_round_over");
  270.     if ( IsDefined( level.chalk_override ) )
  271.     {
  272.         level.chalk_hud1 SetText( level.chalk_override );
  273.         level.chalk_hud2 SetText( " " );
  274.     }      
  275.    
  276.    
  277. }
  278.  
  279. clear_nml_rounds()
  280. {
  281.     level endon("restart_round");
  282.    
  283.     while(IsDefined(level.chalk_override))
  284.     {
  285.         if ( IsDefined( level.chalk_override ) )
  286.         {
  287.             if(IsDefined(level.chalk_hud1))
  288.             {
  289.                 level.chalk_hud1 SetText( level.chalk_override );
  290.             }
  291.            
  292.             if(IsDefined(level.chalk_hud2))
  293.             {
  294.                 level.chalk_hud2 SetText( " " );
  295.             }
  296.         }      
  297.        
  298.         wait(1.0);
  299.     }
  300. }
  301.  
  302. //*****************************************************************************
  303. //
  304. //*****************************************************************************
  305. resume_moon_rounds( target_round )
  306. {
  307.     if ( target_round < 1 )
  308.     {
  309.         target_round = 1;
  310.     }
  311.     level.chalk_override = undefined;
  312.  
  313.     level.zombie_health = level.zombie_vars["zombie_health_start"];
  314.     level.zombie_total = 0;
  315.  
  316.     maps\_zombiemode::ai_calculate_health(target_round);
  317.  
  318.     level notify( "restart_round" );
  319.  
  320.     level._from_nml = true;
  321.  
  322.     // kill all active zombies
  323.     zombies = GetAiSpeciesArray( "axis", "all" );
  324.  
  325.     if ( IsDefined( zombies ) )
  326.     {
  327.         for (i = 0; i < zombies.size; i++)
  328.         {
  329.             if ( is_true( zombies[i].ignore_nml_delete ) )
  330.             {
  331.                 continue;
  332.             }
  333.  
  334.             if ( zombies[i].isdog )
  335.             {
  336.                 zombies[i] DoDamage( zombies[i].health + 10, zombies[i].origin );
  337.                
  338.                 continue;
  339.             }          
  340.            
  341.             if ( IsDefined( zombies[i].fx_quad_trail ) )
  342.             {
  343.                 zombies[i].fx_quad_trail Delete();
  344.             }
  345.            
  346.             zombies[i] maps\_zombiemode_spawner::reset_attack_spot();
  347.             zombies[i] notify("zombie_delete");
  348.             zombies[i] Delete();
  349.         }
  350.     }
  351. }
  352.  
  353.  
  354. //*****************************************************************************
  355. //*****************************************************************************
  356. nml_round_manager()
  357. {
  358.     level endon("restart_round");
  359.  
  360.     // *** WHAT IS THIS? ***
  361.     level.dog_targets = getplayers();
  362.     for( i=0; i<level.dog_targets.size; i++ )
  363.     {
  364.         level.dog_targets[i].hunted_by = 0;
  365.     }
  366.    
  367.     level.nml_start_time = GetTime();
  368.    
  369.     // Time when dog spawns start in NML
  370.     dog_round_start_time = 2000;
  371.     dog_can_spawn_time = -1000*10;
  372.     dog_difficulty_min_time = 3000;
  373.     dog_difficulty_max_time = 9500;
  374.    
  375.     // Attack Waves setup
  376.     wave_1st_attack_time = (1000 * 25);//(1000 * 40);
  377.     prepare_attack_time = (1000 * 2.1);
  378.     wave_attack_time = (1000 * 35);     // 40
  379.     cooldown_time = (1000 * 16);        // 25
  380.     next_attack_time = (1000 * 26);     // 32
  381.  
  382.     max_zombies = 20;
  383.    
  384.     next_round_time = level.nml_start_time + wave_1st_attack_time;
  385.     mode = "normal_spawning";
  386.    
  387.     area = 1;
  388.    
  389.     // Once some AI appear, make sure the round never ends
  390.     level thread nml_round_never_ends();
  391.  
  392.     while( 1 )
  393.     {
  394.         current_time = GetTime();
  395.        
  396.         wait_override = 0.0;
  397.  
  398.  
  399.         /**************************************************************/
  400.         /* There is a limit of 24 AI entities, wait to hit this limit */
  401.         /**************************************************************/
  402.  
  403.         zombies = GetAiSpeciesArray( "axis", "all" );
  404.        
  405.         while( zombies.size >= max_zombies )
  406.         {
  407.             zombies = GetAiSpeciesArray( "axis", "all" );
  408.             wait( 0.5 );
  409.         }
  410.  
  411.  
  412.         /***************************/
  413.         /* Update the Spawner Mode */
  414.         /***************************/
  415.  
  416.         switch( mode )
  417.         {
  418.             // Default Ambient Zombies
  419.             case "normal_spawning":
  420.                
  421.                 if(level.initial_spawn == true)
  422.                 {
  423.                     spawn_a_zombie( 10, "nml_zone_spawners", 0.01 );
  424.                 }
  425.                 else
  426.                 {  
  427.                     ai = spawn_a_zombie( max_zombies, "nml_zone_spawners", 0.01 );
  428.                     if( isdefined (ai) )
  429.                     {
  430.                         ai.zombie_move_speed = "sprint";
  431.                        
  432.                         //Normal sprint (1,4)
  433.                         //Super-sprint (5,6)
  434.                        
  435.                         if(flag("start_supersprint"))
  436.                         {
  437.                             theanim = "sprint" + randomintrange(1, 6);
  438.                         }  
  439.                         else
  440.                         {
  441.                             theanim = "sprint" + randomintrange(1, 4);
  442.                         }    
  443.                        
  444.                         if( IsDefined( ai.pre_black_hole_bomb_run_combatanim ) )
  445.                         {
  446.                             ai.pre_black_hole_bomb_run_combatanim = theanim;
  447.                         }
  448.                         else
  449.                         {
  450.                             ai set_run_anim( theanim );                        
  451.                             ai.run_combatanim = level.scr_anim[ai.animname][theanim];
  452.                             ai.walk_combatanim = level.scr_anim[ai.animname][theanim];
  453.                             ai.crouchRunAnim = level.scr_anim[ai.animname][theanim];
  454.                             ai.crouchrun_combatanim = level.scr_anim[ai.animname][theanim];
  455.                             ai.needs_run_update = true;        
  456.                         }
  457.  
  458.                     }
  459.                 }
  460.                
  461.                 // Check for Spawner Wave to Start
  462.                 if( current_time > next_round_time )
  463.                 {
  464.                     next_round_time = current_time + prepare_attack_time;
  465.                     mode = "preparing_spawn_wave";
  466.                     level thread screen_shake_manager( next_round_time );
  467.                 }
  468.             break;
  469.  
  470.  
  471.             // Shake screen, start existing zombies running, then start a wave
  472.             case "preparing_spawn_wave":
  473.                 zombies = GetAiSpeciesArray( "axis" );
  474.                 for( i=0; i < zombies.size; i++ )
  475.                 {
  476.                     if( zombies[i].has_legs && zombies[i].animname == "zombie") // make sure not a dog.
  477.                     {
  478.                         zombies[i].zombie_move_speed = "sprint";
  479.                        
  480.                         //Normal sprint (1,4)
  481.                         //Super-sprint (5,6)
  482.                         if(flag("start_supersprint"))
  483.                         {
  484.                             theanim = "sprint" + randomintrange(1, 6);
  485.                         }  
  486.                         else
  487.                         {
  488.                             theanim = "sprint" + randomintrange(1, 4);
  489.                         }    
  490.                                                
  491.                         level.initial_spawn = false;
  492.                         level notify( "start_nml_ramp" );
  493.                        
  494.                         if( IsDefined( zombies[i].pre_black_hole_bomb_run_combatanim ) )
  495.                         {
  496.                             zombies[i].pre_black_hole_bomb_run_combatanim = theanim;
  497.                         }
  498.                         else
  499.                         {
  500.                             zombies[i] set_run_anim( theanim );                        
  501.                             zombies[i].run_combatanim = level.scr_anim[zombies[i].animname][theanim];
  502.                             zombies[i].walk_combatanim = level.scr_anim[zombies[i].animname][theanim];
  503.                             zombies[i].crouchRunAnim = level.scr_anim[zombies[i].animname][theanim];
  504.                             zombies[i].crouchrun_combatanim = level.scr_anim[zombies[i].animname][theanim];
  505.                             zombies[i].needs_run_update = true;
  506.                         }
  507.                                
  508.  
  509.                     }
  510.                 }
  511.                
  512.                 if( current_time > next_round_time )
  513.                 {
  514.                     level notify( "nml_attack_wave" );
  515.                     mode = "spawn_wave_active";
  516.                    
  517.                     if( area == 1 )
  518.                     {
  519.                         area = 2;
  520.                         level thread nml_wave_attack( max_zombies, "nml_area2_spawners" );
  521.                     }
  522.                     else
  523.                     {
  524.                         area = 1;
  525.                         level thread nml_wave_attack( max_zombies, "nml_area1_spawners" );
  526.                     }
  527.                                    
  528.                     next_round_time = current_time + wave_attack_time;
  529.                 }
  530.                 wait_override = 0.1;
  531.             break;
  532.  
  533.  
  534.             // Attack wave in progress
  535.             // Occasionally spawn a zombie
  536.             case "spawn_wave_active":
  537.                 if( current_time < next_round_time )
  538.                 {
  539.                     if( randomfloatrange(0, 1) < 0.05 )
  540.                     {
  541.                         ai = spawn_a_zombie( max_zombies, "nml_zone_spawners", 0.01 );
  542.                         if( isdefined (ai) )
  543.                         {
  544.                             ai.ignore_gravity = true;
  545.                             ai.zombie_move_speed = "sprint";
  546.                            
  547.                             //Normal sprint (1,4)
  548.                             //Super-sprint (5,6)
  549.                             if(flag("start_supersprint"))
  550.                             {
  551.                                 theanim = "sprint" + randomintrange(1, 6);
  552.                             }  
  553.                             else
  554.                             {
  555.                                 theanim = "sprint" + randomintrange(1, 4);
  556.                             }    
  557.                            
  558.                             if( IsDefined( ai.pre_black_hole_bomb_run_combatanim ) )
  559.                             {
  560.                                 ai.pre_black_hole_bomb_run_combatanim = theanim;
  561.                             }
  562.                             else
  563.                             {
  564.                                 ai set_run_anim( theanim );                        
  565.                                 ai.run_combatanim = level.scr_anim[ai.animname][theanim];
  566.                                 ai.walk_combatanim = level.scr_anim[ai.animname][theanim];
  567.                                 ai.crouchRunAnim = level.scr_anim[ai.animname][theanim];
  568.                                 ai.crouchrun_combatanim = level.scr_anim[ai.animname][theanim];
  569.                                 ai.needs_run_update = true;        
  570.                             }
  571.                                                            
  572.                         }          
  573.                     }
  574.                 }
  575.                 else
  576.                 {
  577.                     level notify("wave_attack_finished");
  578.                     mode = "wave_finished_cooldown";
  579.                     next_round_time = current_time + cooldown_time;
  580.                 }
  581.             break;
  582.            
  583.  
  584.             // Round over, cooldown period
  585.             case "wave_finished_cooldown":
  586.            
  587.                 if( current_time > next_round_time )
  588.                 {
  589.                     next_round_time = current_time + next_attack_time;
  590.                     mode = "normal_spawning";
  591.                 }
  592.                
  593.                 wait_override = 0.01;
  594.             break;
  595.         }
  596.  
  597.  
  598.         /***************************************************************************************/
  599.         /* If there are any dog targets (players running about in NML (away from the platform) */
  600.         /* Send dogs after them                                                                */
  601.         /***************************************************************************************/
  602.  
  603.         num_dog_targets = 0;
  604.         if( (current_time - level.nml_start_time) > dog_round_start_time )
  605.         {
  606.             skip_dogs = 0;
  607.            
  608.             // *** DIFFICULTY FOR 1 Player ***
  609.             players = get_players();
  610.             if( players.size <= 1 )
  611.             {
  612.                 dt = current_time - dog_can_spawn_time;
  613.                 if( dt < 0 )
  614.                 {
  615.                     //iPrintLn( "DOG SKIP" );
  616.                     skip_dogs = 1;
  617.                 }
  618.                 else
  619.                 {
  620.                     dog_can_spawn_time = current_time + randomfloatrange(dog_difficulty_min_time, dog_difficulty_max_time);
  621.                 }
  622.             }
  623.            
  624.             if( mode == "preparing_spawn_wave" )
  625.             {
  626.                 skip_dogs = 1;
  627.             }
  628.  
  629.             if( !skip_dogs && level.nml_dogs_enabled == true)
  630.             {
  631.                 num_dog_targets = level.num_nml_dog_targets;
  632.                 //iPrintLn( "Num Dog Targets: " + num_dog_targets );
  633.        
  634.                 if( num_dog_targets )
  635.                 {
  636.                     // Send 2 dogs after each player
  637.                     dogs = getaispeciesarray( "axis", "dog" );
  638.                     num_dog_targets *= 2;
  639.                        
  640.                     if( dogs.size < num_dog_targets )
  641.                     {
  642.                         //IPrintLnBold("Spawn a dog");
  643.                         ai = maps\_zombiemode_ai_dogs::special_dog_spawn();
  644.                        
  645.                         //set their health to current level immediately.
  646.                         zombie_dogs = GetAISpeciesArray("axis","zombie_dog");
  647.                         if(IsDefined(zombie_dogs))
  648.                         {
  649.                             for( i=0; i<zombie_dogs.size; i++ )
  650.                             {
  651.                                 zombie_dogs[i].maxhealth = int( level.nml_dog_health);
  652.                                 zombie_dogs[i].health = int( level.nml_dog_health );
  653.                             }  
  654.                         }
  655.                     }
  656.                 }
  657.             }
  658.         }
  659.    
  660.         if( wait_override != 0.0 )
  661.         {
  662.             wait( wait_override );
  663.         }
  664.         else
  665.         {
  666.             wait randomfloatrange( 0.1, 0.8 );
  667.         }
  668.     }
  669. }
  670.  
  671.  
  672. //*****************************************************************************
  673. //
  674. //*****************************************************************************
  675. nml_wave_attack( num_in_wave, spawner_name )
  676. {
  677.     level endon("wave_attack_finished");
  678.     level endon("restart_round");
  679.  
  680.     while( 1 )
  681.     {
  682.         zombies = GetAiSpeciesArray( "axis", "all" );
  683.         if( zombies.size < num_in_wave )
  684.         {
  685.             ai = spawn_a_zombie( num_in_wave, spawner_name, 0.01 );
  686.             if( isdefined (ai) )
  687.             {
  688.                 ai.ignore_gravity = true;
  689.                 ai.zombie_move_speed = "sprint";
  690.                
  691.                 //Normal sprint (1,4)
  692.                 //Super-sprint (5,6)
  693.                 if(flag("start_supersprint"))
  694.                 {
  695.                     theanim = "sprint" + randomintrange(1, 6);
  696.                 }  
  697.                 else
  698.                 {
  699.                     theanim = "sprint" + randomintrange(1, 4);
  700.                 }
  701.                                            
  702.                 if( IsDefined( ai.pre_black_hole_bomb_run_combatanim ) )
  703.                 {
  704.                     ai.pre_black_hole_bomb_run_combatanim = theanim;
  705.                 }
  706.                 else
  707.                 {
  708.                     ai set_run_anim( theanim );                        
  709.                     ai.run_combatanim = level.scr_anim[ai.animname][theanim];
  710.                     ai.walk_combatanim = level.scr_anim[ai.animname][theanim];
  711.                     ai.crouchRunAnim = level.scr_anim[ai.animname][theanim];
  712.                     ai.crouchrun_combatanim = level.scr_anim[ai.animname][theanim];
  713.                     ai.needs_run_update = true;    
  714.                 }
  715.    
  716.             }
  717.         }
  718.  
  719.         wait randomfloatrange( 0.3, 1.0 );
  720.     }
  721. }
  722.  
  723.  
  724. //*****************************************************************************
  725. //*****************************************************************************
  726. spawn_a_zombie( max_zombies, spawner_zone_name, wait_delay )
  727. {
  728.     // Don't spawn a new zombie if we are at the limit
  729.     zombies = getaispeciesarray( "axis" );
  730.     if( zombies.size >= max_zombies )
  731.     {
  732.         return( undefined );
  733.     }
  734.  
  735.     zombie_spawners = getentarray( spawner_zone_name, "targetname" );
  736.  
  737.     spawn_point = zombie_spawners[RandomInt( zombie_spawners.size )];
  738.  
  739.     ai = spawn_zombie( spawn_point );
  740.     if( IsDefined( ai ) )
  741.     {  
  742.         ai thread maps\_zombiemode::round_spawn_failsafe();
  743.         ai.zone_name = spawner_zone_name;
  744.  
  745.         if ( is_true( level.mp_side_step ) )
  746.         {
  747.             ai.shouldSideStepFunc = ::nml_shouldSideStep;
  748.             ai.sideStepAnims = [];
  749.            
  750.             ai.sideStepAnims["step_left"]   = array( %ai_zombie_MP_sidestep_left_a, %ai_zombie_MP_sidestep_left_b );
  751.             ai.sideStepAnims["step_right"]  = array( %ai_zombie_MP_sidestep_right_a, %ai_zombie_MP_sidestep_right_b );
  752.         }
  753.     }
  754.    
  755.     wait( wait_delay );
  756.     wait_network_frame();
  757.    
  758.     return( ai );
  759. }
  760.  
  761. //*****************************************************************************
  762. //*****************************************************************************
  763. screen_shake_manager( next_round_time )
  764. {
  765.     level endon( "nml_attack_wave" );
  766.     level endon("restart_round");
  767.  
  768.     time = 0;
  769.     while( time < next_round_time )
  770.     {
  771.         level thread attack_wave_screen_shake();
  772.         wait_time = randomfloatrange(0.25, 0.35);
  773.         wait( wait_time );
  774.         time = gettime();
  775.     }
  776. }
  777.  
  778. attack_wave_screen_shake()
  779. {
  780.     /**********************************************************/
  781.     /* Get a position that averages all the players positions */
  782.     /**********************************************************/
  783.  
  784.     num_valid = 0;
  785.     players = get_players();
  786.     pos = ( 0, 0, 0 );
  787.    
  788.     for( i=0; i<players.size; i++ )
  789.     {
  790.         player = players[i];
  791.         if( is_player_valid(player) )
  792.         {
  793.             pos += player.origin;
  794.             num_valid ++;
  795.         }
  796.     }
  797.    
  798.     if( !num_valid )
  799.     {
  800.         return;
  801.     }
  802.    
  803.     shake_position = ( (pos[0]/num_valid), (pos[1]/num_valid), (pos[2]/num_valid) );
  804.  
  805.  
  806.     /**********/
  807.     /* Rumble */
  808.     /**********/
  809.  
  810.     thread rumble_all_players( "damage_heavy" );
  811.    
  812.    
  813.     /****************/
  814.     /* Shake Screen */
  815.     /****************/
  816.    
  817.     scale = 0.4;
  818.     duration = 1.0;
  819.     radius = 42 * 400;
  820.    
  821.     //earthquake( scale, duration, shake_position, radius );
  822. }
  823.  
  824.  
  825. rumble_all_players(high_rumble_string, low_rumble_string, rumble_org, high_rumble_range, low_rumble_range)
  826. {
  827.     players = get_players();
  828.    
  829.     for (i = 0; i < players.size; i++)
  830.     {
  831.         if (isdefined (high_rumble_range) && isdefined (low_rumble_range) && isdefined(rumble_org))
  832.         {
  833.             if (distance (players[i].origin, rumble_org) < high_rumble_range)
  834.             {
  835.                 players[i] playrumbleonentity(high_rumble_string);
  836.             }
  837.             else if (distance (players[i].origin, rumble_org) < low_rumble_range)
  838.             {
  839.                 players[i] playrumbleonentity(low_rumble_string);
  840.             }
  841.         }
  842.         else
  843.         {
  844.             players[i] playrumbleonentity(high_rumble_string);
  845.         }
  846.     }
  847. }
  848.  
  849. //*****************************************************************************
  850. //*****************************************************************************
  851. get_perk_machine_ents()
  852. {
  853.     nml_position_helper = getstruct( "nml_perk_location_helper", "script_noteworthy" );
  854.     nml_dist = 42 * 100;
  855.  
  856.     level.speed_cola_ents = get_vending_ents( "vending_sleight", "speedcola_perk", nml_position_helper.origin, nml_dist );
  857. //  iPrintLn( "COLA ENT: " + level.speed_cola_ents.size );
  858.  
  859.     level.jugg_ents = get_vending_ents( "vending_jugg", "jugg_perk", nml_position_helper.origin, nml_dist );
  860. //  iPrintLn( "JUGG ENT: " + level.jugg_ents.size );
  861. }
  862.  
  863. get_vending_ents( vending_name, perk_script_string, nml_pos, nml_radius )
  864. {
  865.     names = [];
  866.     names[0] = vending_name;
  867.     //names[1] = "audio_bump_trigger";
  868.     names[1] = "zombie_vending";
  869.        
  870.     ent_array = [];
  871.     for( i=0; i<names.size; i++ )
  872.     {
  873.         ents = getentarray( names[i], "targetname" );
  874.         for( j=0; j<ents.size; j++ )
  875.         {
  876.             ent = ents[j];
  877.             if( isdefined(ent.script_string) && (ent.script_string == perk_script_string) )
  878.             {
  879.                 if( (abs(nml_pos[0] - ent.origin[0]) < nml_radius) &&
  880.                     (abs(nml_pos[1] - ent.origin[1]) < nml_radius) &&
  881.                     (abs(nml_pos[2] - ent.origin[2]) < nml_radius) )
  882.                 {
  883.                     ent_array[ ent_array.size ] = ent;
  884.                 }
  885.             }
  886.         }
  887.     }
  888.    
  889.     return( ent_array );
  890. }
  891.  
  892.  
  893. move_perk( dist, time, accel )
  894. {
  895.     //***********
  896.     // Speed Cola
  897.     //***********
  898.  
  899.     ent = level.speed_cola_ents[0];
  900.     pos = (ent.origin[0], ent.origin[1], ent.origin[2]+dist);
  901.     ent moveto ( pos, time, accel, accel );
  902.    
  903.     level.speed_cola_ents[1] trigger_off();
  904.  
  905.    
  906.     //***********
  907.     // Jugg
  908.     //***********
  909.  
  910.     ent = level.jugg_ents[0];
  911.     pos = (ent.origin[0], ent.origin[1], ent.origin[2]+dist);
  912.     ent moveto ( pos, time, accel, accel );
  913.    
  914.     level.jugg_ents[1] trigger_off();
  915.    
  916. }
  917.  
  918.  
  919. perk_machines_hide( cola, jug, moving )
  920. {
  921.     if(!IsDefined(moving))
  922.     {
  923.         moving = false;
  924.     }
  925.     if( cola )
  926.     {
  927.         level.speed_cola_ents[0] hide();
  928.     }
  929.     else
  930.     {
  931.         level.speed_cola_ents[0] show();
  932.     }
  933.    
  934.     if( jug )
  935.     {
  936.         level.jugg_ents[0] hide();
  937.     }
  938.     else
  939.     {
  940.         level.jugg_ents[0] show();
  941.     }
  942.    
  943.     if(moving)
  944.     {
  945.         level.speed_cola_ents[1] trigger_off();
  946.         level.jugg_ents[1] trigger_off();
  947.        
  948.         if(IsDefined(level.speed_cola_ents[1].hackable))
  949.         {
  950.             maps\_zombiemode_equip_hacker::deregister_hackable_struct(level.speed_cola_ents[1].hackable);
  951.         }
  952.        
  953.         if(IsDefined(level.jugg_ents[1].hackable))
  954.         {
  955.             maps\_zombiemode_equip_hacker::deregister_hackable_struct(level.jugg_ents[1].hackable);
  956.         }
  957.     }
  958.     else
  959.     {
  960.         hackable = undefined;
  961.        
  962.         if(cola)
  963.         {
  964.             level.jugg_ents[1] trigger_on();
  965.             if(IsDefined(level.jugg_ents[1].hackable))
  966.             {
  967.                 hackable = level.jugg_ents[1].hackable;
  968.             }
  969.         }
  970.         else
  971.         {
  972.             level.speed_cola_ents[1] trigger_on();
  973.            
  974.             if(IsDefined(level.speed_cola_ents[1].hackable))
  975.             {
  976.                 hackable = level.speed_cola_ents[1].hackable;
  977.             }
  978.         }      
  979.        
  980.         maps\_zombiemode_equip_hacker::register_pooled_hackable_struct(hackable, maps\_zombiemode_hackables_perks::perk_hack, maps\_zombiemode_hackables_perks::perk_hack_qualifier);      
  981.     }          
  982. }
  983.  
  984.  
  985. perk_machine_show_selected( perk_index, moving )
  986. {
  987.     switch( perk_index )
  988.     {
  989.         case 0:
  990.             perk_machines_hide( 0, 1, moving );
  991.         break;
  992.        
  993.         case 1:
  994.             perk_machines_hide( 1, 0, moving );
  995.         break;
  996.     }
  997. }
  998.  
  999.  
  1000. //*****************************************************************************
  1001. //*****************************************************************************
  1002. perk_machine_arrival_update()
  1003. {
  1004.     top_height = 1200;      // 700
  1005.     fall_time = 4;
  1006.     num_model_swaps = 20;
  1007.  
  1008.     perk_index = randomintrange( 0, 2 );
  1009.  
  1010.     // Flash an effect to the perk machines destination
  1011.     ent = level.speed_cola_ents[0];
  1012.     level thread perk_arrive_fx( ent.origin );
  1013.  
  1014.     //while( 1 )
  1015.     {
  1016.         // Move the perk machines high in the sky
  1017.         move_perk( top_height, 0.01, 0.001 );
  1018.         wait( 0.3 );
  1019.         perk_machines_hide( 0, 0, true );
  1020.         wait( 1 );
  1021.  
  1022.         // Start the machines falling
  1023.         move_perk( top_height*-1, fall_time, 1.5 );
  1024.  
  1025.         // Swap visible Perk as we fall
  1026.         wait_step = fall_time / num_model_swaps;
  1027.         for( i=0; i<num_model_swaps; i++ )
  1028.         {
  1029.             perk_machine_show_selected( perk_index, true );
  1030.             wait( wait_step );
  1031.            
  1032.             perk_index++;
  1033.             if( perk_index > 1 )
  1034.             {
  1035.                 perk_index = 0;
  1036.             }
  1037.         }
  1038.  
  1039.         // Make sure we don't get a perk machine duplicate next time we visit
  1040.         while( perk_index == level.last_perk_index )
  1041.         {
  1042.             perk_index = randomintrange( 0, 2 );
  1043.         }
  1044.        
  1045.         level.last_perk_index = perk_index;
  1046.         perk_machine_show_selected( perk_index, false );
  1047.    
  1048.     }
  1049. }
  1050.  
  1051.  
  1052. //*****************************************************************************
  1053. //*****************************************************************************
  1054. perk_arrive_fx( pos )
  1055. {
  1056.     wait( 0.15 );
  1057.  
  1058.     Playfx( level._effect["lightning_dog_spawn"], pos );
  1059.     playsoundatposition( "zmb_hellhound_spawn", pos );
  1060.     playsoundatposition( "zmb_hellhound_bolt", pos );
  1061.        
  1062.     wait( 1.1 );
  1063.     Playfx( level._effect["lightning_dog_spawn"], pos );
  1064.     playsoundatposition( "zmb_hellhound_spawn", pos );
  1065.     playsoundatposition( "zmb_hellhound_bolt", pos );
  1066. }
  1067.  
  1068. //*****************************************************************************
  1069. //*****************************************************************************
  1070. nml_round_never_ends()
  1071. {
  1072.     wait( 2 );
  1073.    
  1074.     level endon( "restart_round" );
  1075.  
  1076.     while( flag("enter_nml") )
  1077.     {
  1078.         zombies = GetAiSpeciesArray( "axis", "all" );
  1079.         if( zombies.size >= 2 )
  1080.         {
  1081.             // This ensures the round will never end
  1082.             level.zombie_total = 100;
  1083.             return;
  1084.         }
  1085.         wait( 1 );
  1086.     }
  1087. }
  1088.  
  1089. nml_side_stepping_zombies()
  1090. {
  1091.     level.mp_side_step = false;
  1092.     level waittill( "nml_attack_wave" );
  1093.     level.mp_side_step = true;
  1094. }
  1095.  
  1096. nml_ramp_up_zombies()
  1097. {
  1098.     self endon( "stop_ramp" );
  1099.  
  1100.     level waittill( "start_nml_ramp" );
  1101.  
  1102.     // start at round level entered no mans land
  1103.     level.nml_timer = level.nml_last_round;
  1104.    
  1105.     while(flag("enter_nml"))
  1106.     {
  1107.         //Check for health bump.
  1108.  
  1109.         if ( !level.on_the_moon )
  1110.         {
  1111.             level.nml_timer++;
  1112.  
  1113.         // DCS: ramping up zombies, play round change sound (# 88706)
  1114.       thread play_sound_2d( "evt_nomans_warning" );
  1115.  
  1116.             zombies = GetAISpeciesArray("axis", "zombie");
  1117.             for( i=0; i<zombies.size; i++ )
  1118.             {
  1119.                 //remove zombies from this array that have already taken damage or had thier head gibbed
  1120.                 if( (zombies[i].health != level.zombie_health) || is_true(zombies[i].gibbed) || is_true(zombies[i].head_gibbed) )
  1121.                 {
  1122.                     zombies = array_remove(zombies, zombies[i]);
  1123.                 }
  1124.             }
  1125.  
  1126.             maps\_zombiemode::ai_calculate_health(level.nml_timer);
  1127.            
  1128.             // all zombies full health ramp up.
  1129.             for( i=0; i<zombies.size; i++ )
  1130.             {
  1131.                 if( is_true(zombies[i].gibbed) || is_true(zombies[i].head_gibbed))
  1132.                 {
  1133.                     continue;
  1134.                 }              
  1135.                
  1136.                 zombies[i].health = level.zombie_health;
  1137.  
  1138.                 if ( is_true( level.mp_side_step ) )
  1139.                 {
  1140.                     zombies[i].shouldSideStepFunc = ::nml_shouldSideStep;
  1141.                     zombies[i].sideStepAnims = [];
  1142.                    
  1143.                     zombies[i].sideStepAnims["step_left"]   = array( %ai_zombie_MP_sidestep_left_a, %ai_zombie_MP_sidestep_left_b );
  1144.                     zombies[i].sideStepAnims["step_right"]  = array( %ai_zombie_MP_sidestep_right_a, %ai_zombie_MP_sidestep_right_b );
  1145.                 }
  1146.             }
  1147.            
  1148.             level thread nml_dog_health_increase();
  1149.             zombie_dogs = GetAISpeciesArray("axis","zombie_dog");
  1150.             if(IsDefined(zombie_dogs))
  1151.             {
  1152.                 for( i=0; i<zombie_dogs.size; i++ )
  1153.                 {
  1154.                     zombie_dogs[i].maxhealth = int( level.nml_dog_health);
  1155.                     zombie_dogs[i].health = int( level.nml_dog_health );
  1156.                 }  
  1157.             }
  1158.             //iprintln( "RAMP UP: " + level.nml_timer + " - " + level.zombie_health );
  1159.         }
  1160.  
  1161.         if( level.nml_timer == 6)
  1162.         {
  1163.             flag_set("start_supersprint");
  1164.         }      
  1165.        
  1166.         wait(20.0);
  1167.     }
  1168. }
  1169.  
  1170. nml_dog_health_increase()
  1171. {
  1172.     if( level.nml_timer < 4)
  1173.     {
  1174.         level.nml_dog_health = 100;
  1175.     }  
  1176.     else if( level.nml_timer >= 4 && level.nml_timer < 6) //80 seconds.
  1177.     {
  1178.         level.nml_dog_health = 400;
  1179.     }
  1180.     else if( level.nml_timer >= 6 && level.nml_timer < 15 ) //2 minutes
  1181.     {
  1182.         level.nml_dog_health = 800;
  1183.     }
  1184.     else if( level.nml_timer >= 15 && level.nml_timer < 30 ) // 5 minutes
  1185.     {
  1186.         level.nml_dog_health = 1200;
  1187.     }
  1188.     else if(level.nml_timer >= 30)//10 minutes or more
  1189.     {
  1190.         level.nml_dog_health = 1600;
  1191.     }
  1192. }  
  1193.  
  1194. nml_shouldSideStep()
  1195. {
  1196.     if ( self nml_canSideStep() )
  1197.     {
  1198.         return "step";
  1199.     }
  1200.  
  1201.     return "none";
  1202. }
  1203.  
  1204. nml_canSideStep()
  1205. {
  1206.     if( GetTime() - self.a.lastSideStepTime < level.NML_REACTION_INTERVAL )
  1207.         return false;
  1208.    
  1209.     if( !IsDefined(self.enemy) )
  1210.         return false;
  1211.    
  1212.     if( self.a.pose != "stand" )
  1213.         return false;
  1214.    
  1215.     distSqFromEnemy = DistanceSquared(self.origin, self.enemy.origin);
  1216.  
  1217.     // don't do it too close to the enemy
  1218.     if( distSqFromEnemy < level.NML_MIN_REACTION_DIST_SQ )
  1219.     {
  1220.         return false;
  1221.     }
  1222.  
  1223.     // don't do it too far from the enemy
  1224.     if( distSqFromEnemy > level.NML_MAX_REACTION_DIST_SQ )
  1225.     {
  1226.         return false;
  1227.     }
  1228.  
  1229.     // don't do it if not path or too close to destination
  1230.     if( !IsDefined(self.pathgoalpos) || DistanceSquared(self.origin, self.pathgoalpos) < level.NML_MIN_REACTION_DIST_SQ )
  1231.     {
  1232.         return false;
  1233.     }
  1234.  
  1235.     // make sure the AI's running straight
  1236.     if( abs(self GetMotionAngle()) > 15 )
  1237.     {
  1238.         return false;
  1239.     }
  1240.  
  1241.     return true;
  1242. }
Advertisement
Add Comment
Please, Sign In to add comment