Jump to content

baltostar

Member
  • Posts

    37
  • Joined

  • Last visited

Posts posted by baltostar

  1. What about the code about the grenade and black hole bomb/event horizon. mentions teleporting alot.

    It sets the target_teleported flag.

    When looking at this line:

    PlayFXOnTag( level._effect[ "black_hole_bomb_event_horizon" ], level.teleport_target, "tag_origin" );

    I looked up the following level._effect values. Note, I don't see the values being set like in other maps. I think that there is a file ending in _fx.gsc that sets what the effects do:

    fx_zmb_light_floodlight_bright

    switch_sparks

    black_hole_bomb_event_horizon

    gersh_spark

    This is a very few effects (5) compared to the 75 in the pentagon map (zombie_pentagon_fx.gsc) . So going to assume there is missing code still.

    I have a suspicion that this is using Function Pointers for the effects and pointers is something that i haven't used in a while and don't consider myself an expert on.

  2. Flag is something that is true or false, so if flag_set("someFlag") means that it now true and all code waiting on it will resume.

    Example: flag( "switches_synced" ) gets the value of a flag and flag_wait("someFlag") will pause the code till that flag is becomes true with the flag_set

    These are a list of the flags that I'm seeing.

    Flags:

    target_teleported

    target_teleported

    rerouted_power

    switches_synced

    pressure_sustained

    letter_acquired

    passkey_confirmed

    weapons_combined

    thundergun_hit

    Events: (With the "waittill or waittill_either " functions)

    sounddone

    between_round_over

    switches_synced

    sync_button_pressed

    trigger

    lander_launched

    damage

    weapon_fired

    death

    It is strange, I am calling them flags as that is what the code says, but it seems more like they are used to set up some kind of Observer Pattern

  3. Was looking though the perks and found out that they programed in random rare drops but its all disabled. It seems there is a lot of extra code of things they where trying to do but decided not to. For instance, there is a check for a rocket trap but it was never implemented. This just hints at some of the design process and how the requirements may of changed as they developed the code.

    Time to write a paper, so thats as much investigating I'm doing for now. Post questions and I'll look at them later.

  4. http://www.sendspace.com/file/uqk66n

    That's a lot of Zombie code. It doesn't relate to the easter egg, but its interesting. I can understand some of it, of not all of it. Can you translate some of the important stuff into English? i already know a lot of what it means (http://denkirson.proboards.com/index.cg ... hread=2555 has some important stuff that I can understand) Can you translate the rest of it?

    Thanks for the files. What specific questions do you have? Its rather hard to define what is important.

    As for the

    level clientnotify( "sia" );

    I found a lot of spots where clientnotify is being used, but no locations where it is being read. This leads me to believe that the map it self is reading it. At least its not apart of the code collection of 63 files you linked to.

    I found this interesting. Different Zombie Challenges, pry written before Ascension. : sergei, quad, german, engineer, moss_big, dog, and pig (what lol) . I think (guesing) this is the mini 4 player arcade game as its the zombietron_main file.

  5. I'm a software engineer and will answer questions about different aspects of the code. From what I can gather, the source for the scripts (code) is stored unencrypted and that is why it has been found and not the encrypted game code.

    Note: I have not copied the code from the game as I don't have the resources or legal ability to do so. For this reason, I can only review code that is posted on this site.

    The only way I see the DM Easter Egg Continuing:

    I've stated in the past that the Easter Egg is complete as all the events in the script I have access to are compete.

    Yet, if your holding out hope that you can do something with the DMs, the only possible chance for that is this line of code:

    level clientnotify( "sia" );

    No where else in the code is the function clientnotify used. This could mean there is some other code that listens for "sia" and does something. This is speculation, but its the only possible way that i see the DM Easter egg continuing.

    So far I've only seen the code for the Main Easter egg:

    Note: I formatted it from the code posted on the: viewtopic.php?f=60&t=7079 thread


    {
    include animscripts\zombie_utility;
    #include common_scripts\utility;
    #include maps\_utility;
    #include maps\_zombiemode_utility;
    #include maps\_ambientpackage;
    #include maps\_music;
    #include maps\_busing;
    #include maps\_zombiemode_audio;
    init()
    {
    PreCacheModel( "p_glo_electrical_transformer" );
    PreCacheModel( "p_zom_monitor_csm_screen_on" );
    PreCacheModel( "p_zom_monitor_csm_screen_logo" );
    PreCacheModel( "p_rus_electric_switch_stop" );
    PreCacheModel( "p_rus_clock_lrg" );
    flag_init( "target_teleported" );
    flag_init( "rerouted_power" );
    flag_init( "switches_synced" );
    flag_init( "pressure_sustained" );
    flag_init( "passkey_confirmed" );
    flag_init( "weapons_combined" );
    level.casimir_lights = [];
    level.lander_letters[ "a" ] = GetEnt( "letter_a", "targetname" );
    level.lander_letters[ "e" ] = GetEnt( "letter_e", "targetname" );
    level.lander_letters[ "h" ] = GetEnt( "letter_h", "targetname" );
    level.lander_letters[ "i" ] = GetEnt( "letter_i", "targetname" );
    level.lander_letters[ "l" ] = GetEnt( "letter_l", "targetname" );
    level.lander_letters[ "m" ] = GetEnt( "letter_m", "targetname" );
    level.lander_letters[ "n" ] = GetEnt( "letter_n", "targetname" );
    level.lander_letters[ "r" ] = GetEnt( "letter_r", "targetname" );
    level.lander_letters[ "s" ] = GetEnt( "letter_s", "targetname" );
    level.lander_letters[ "t" ] = GetEnt( "letter_t", "targetname" );
    level.lander_letters[ "u" ] = GetEnt( "letter_u", "targetname" );
    level.lander_letters[ "y" ] = GetEnt( "letter_y", "targetname" );
    keys = GetArrayKeys( level.lander_letters );

    for ( i=0; i level.lander_letters[ keys[i] ] Hide();
    }
    teleport_target_event();
    reroute_power_event();
    sync_switch_event();
    pressure_plate_event();
    lander_passkey_event();
    weapon_combo_event();
    level notify( "help_found" );
    monitor = GetEnt( "casimir_monitor", "targetname" );
    monitor SetModel( "p_zom_monitor_csm_screen_off" );
    }

    play_easter_egg_audio( alias, sound_ent, text ){
    if( alias == undefined ) {
    return;
    }
    sound_ent PlaySound( alias, "sounddone" );
    sound_ent waittill( "sounddone" );
    }

    activate_casimir_light( num ){
    spot = GetStruct( "casimir_light_"+num, "targetname" );
    if ( IsDefined( spot ) )
    {
    light = Spawn( "script_model", spot.origin );
    light SetModel( "tag_origin" );
    light.angles = spot.angles;
    fx = PlayFXOnTag( level._effect["fx_zmb_light_floodlight_bright"], light, "tag_origin" );
    level.casimir_lights[ level.casimir_lights.size ] = light;
    }
    }

    teleport_target_event() {
    teleport_target_start = getstruct( "teleport_target_start", "targetname" );
    teleport_target_spark = getstruct( "teleport_target_spark", "targetname" );
    level.teleport_target = Spawn( "script_model", teleport_target_start.origin );
    level.teleport_target SetModel( "p_glo_electrical_transformer" );
    level.teleport_target.angles = teleport_target_start.angles;
    level.teleport_target PlayLoopSound( "zmb_egg_notifier", 1 );
    teleport_target_spark = Spawn( "script_model", teleport_target_spark.origin );
    teleport_target_spark SetModel( "tag_origin" );
    PlayFXOnTag( level._effect["switch_sparks"], teleport_target_spark, "tag_origin" );
    level.teleport_target_trigger = Spawn( "trigger_radius", teleport_target_start.origin + (0,0,-70), 0, 125, 100 );
    level.black_hole_bomb_loc_check_func = ::bhb_teleport_loc_check;
    flag_wait( "target_teleported" );
    teleport_target_spark Delete();
    level.black_hole_bomb_loc_check_func = undefined;
    level thread play_egg_vox( "vox_ann_egg1_success", "vox_gersh_egg1", 1 );
    }


    bhb_teleport_loc_check( grenade, model, info )
    {
    if( IsDefined( level.teleport_target_trigger ) && grenade IsTouching( level.teleport_target_trigger ) )
    {
    model SetClientFlag( level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE );
    grenade thread maps\_zombiemode_weap_black_hole_bomb::do_black_hole_bomb_sound( model, info );
    level thread teleport_target( grenade, model );
    return true;
    }
    return false;
    }

    teleport_target( grenade, model )
    {
    level.teleport_target_trigger Delete();
    level.teleport_target_trigger = undefined;
    wait( 1.0 );
    time = 3.0;
    level.teleport_target MoveTo( grenade.origin + (0,0,50), time, time - 0.05 );
    wait( time );
    teleport_target_end = getstruct( "teleport_target_end", "targetname" );
    level.teleport_target Hide();
    playsoundatposition( "zmb_gersh_teleporter_out", grenade.origin + (0,0,50) );
    wait( 0.5 );
    level.teleport_target.angles = teleport_target_end.angles;
    level.teleport_target MoveTo( teleport_target_end.origin, 0.05 );
    level.teleport_target StopLoopSound( 1 );
    wait( 0.5 );
    level.teleport_target Show();
    PlayFXOnTag( level._effect[ "black_hole_bomb_event_horizon" ], level.teleport_target, "tag_origin" );
    level.teleport_target PlaySound( "zmb_gersh_teleporter_go" );
    wait( 2.0 );
    model Delete();
    flag_set( "target_teleported" );
    }

    reroute_power_event() {
    monitor = GetEnt( "casimir_monitor", "targetname" );
    location = GetStruct( "casimir_monitor_struct", "targetname" );
    monitor PlayLoopSound( "zmb_egg_notifier", 1 );
    monitor SetModel( "p_zom_monitor_csm_screen_on" );
    trig = Spawn( "trigger_radius", location.origin, 0, 32, 60 );
    trig wait_for_use( monitor );
    trig delete();
    flag_set( "rerouted_power" );
    monitor SetModel( "p_zom_monitor_csm_screen_logo" );
    monitor StopLoopSound( 1 );
    level thread play_egg_vox( "vox_ann_egg2_success", "vox_gersh_egg2", 2 );
    level thread activate_casimir_light( 1 );
    }
    wait_for_use( monitor )
    {
    while(1)
    {
    self waittill( "trigger", who );
    while( IsPlayer(who) && who IsTouching( self ) )
    {
    if( who UseButtonPressed() )
    {
    flag_set( "rerouted_power" );
    monitor PlaySound( "zmb_comp_activate" );
    return;
    }
    wait(.05);
    }
    }
    }
    sync_switch_event() {
    switches = GetStructArray( "sync_switch_start", "targetname" );
    success = false;
    while ( !flag( "switches_synced" ) )
    {
    flag_wait( "monkey_round" );
    array_thread( switches, ::reveal_switch );
    self thread switch_watcher();
    level waittill_either( "between_round_over", "switches_synced" );
    }
    level thread play_egg_vox( "vox_ann_egg3_success", "vox_gersh_egg3", 3 );
    level thread activate_casimir_light( 2 );
    }


    reveal_switch()
    {
    button = Spawn( "script_model", self.origin );
    button SetModel( "p_rus_electric_switch_stop" );
    button.angles = self.angles + (0,90,0);
    button PlayLoopSound( "zmb_egg_notifier", 1 );
    offset = AnglesToForward(self.angles) * 8;
    time = 1;
    button MoveTo( button.origin + offset, 1 );
    wait( 1 );
    if ( flag( "monkey_round" ) ) {
    trig = Spawn( "trigger_radius", button.origin, 0, 32, 72 );
    trig thread wait_for_sync_use( self );
    level waittill_either( "between_round_over", "switches_synced" );
    trig delete();
    }
    button StopLoopSound( 1 );
    button MoveTo( self.origin, time );
    wait( time );
    button delete();
    }

    wait_for_sync_use( ss )
    {
    level endon( "between_round_over" );
    level endon( "switches_synced" );
    ss.pressed = 0;
    while(1)
    {
    self waittill( "trigger", who );
    while( IsPlayer(who) && who IsTouching( self ) )
    {
    if( who UseButtonPressed() )
    {
    level notify( "sync_button_pressed" );
    playsoundatposition( "zmb_push_button", ss.origin );
    ss.pressed = 1;
    }
    wait(.05);
    }
    }
    }

    switch_watcher()
    {
    level endon( "between_round_over" );
    pressed = 0;
    switches = GetStructArray( "sync_switch_start", "targetname" );
    while (1)
    {
    level waittill( "sync_button_pressed" );
    timeout = GetTime() + 500;
    while ( GetTime() {
    pressed = 0;
    for ( i=0; i {
    if ( IsDefined( switches[i].pressed ) && switches[i].pressed )
    {
    pressed++;
    }
    }
    if ( pressed == 4 )
    {
    flag_set( "switches_synced" );
    for ( i=0; i {
    playsoundatposition( "zmb_misc_activate", switches[i].origin );
    }
    return;
    }
    wait( 0.05 );
    }
    switch( pressed )
    {
    case 1:
    case 2:
    case 3:
    for ( i=0; i {
    playsoundatposition( "zmb_deny", switches[i].origin );
    }
    break;
    }
    for ( i=0; i {
    switches[i].pressed = 0;
    }
    }
    }

    pressure_plate_event() {
    area = GetStruct( "pressure_pad", "targetname" );
    trig = Spawn( "trigger_radius", area.origin, 0, 300, 100 );
    trig area_timer( 120 );
    trig Delete();
    level thread play_egg_vox( "vox_ann_egg4_success", "vox_gersh_egg4", 4 );
    level thread activate_casimir_light( 3 );
    }

    area_timer( time ) {
    clock_loc = GetStruct( "pressure_timer", "targetname" );
    clock = Spawn( "script_model", clock_loc.origin );
    clock SetModel( "p_rus_clock_lrg" );
    clock.angles = clock_loc.angles;
    clock PlayLoopSound( "zmb_egg_notifier", 1 );
    timer_hand_angles_init = ( 270, 90, 0 );
    timer_hand = Spawn( "script_model", clock_loc.origin + ( -1, 0, 12 ) );
    timer_hand SetModel( "t5_weapon_ballistic_knife_blade" );
    timer_hand.angles = timer_hand_angles_init;
    step = 1.0;
    while ( !flag( "pressure_sustained" ) )
    {
    self waittill( "trigger" );
    stop_timer = false;
    players = get_players();
    for ( i=0; i {
    if ( !players[i] IsTouching( self ) )
    {
    wait( step );
    stop_timer = true;
    }
    }
    if ( stop_timer )
    {
    continue;
    }
    self PlaySound( "zmb_pressure_plate_trigger" );
    time_remaining = time;
    timer_hand RotatePitch( 360, time );
    while ( time_remaining )
    {
    players = get_players();
    for ( i=0; i {
    if ( !players[i] IsTouching( self ) )
    {
    wait( step );
    time_remaining = time;
    stop_timer = true;
    timer_hand RotateTo( timer_hand_angles_init, 0.5 );
    timer_hand PlaySound( "zmb_deny" );
    wait( 0.5 );
    break;
    }
    }
    if ( stop_timer )
    {
    break;
    }
    wait( step );
    time_remaining -= step;
    timer_hand PlaySound( "zmb_egg_timer_oneshot" );
    }
    if ( time_remaining {
    flag_set( "pressure_sustained" );
    players = get_players();
    temp_fx = undefined;
    if ( IsDefined( players[0].fx ) )
    {
    temp_fx = players[0].fx;
    }
    timer_hand playsound( "zmb_perks_packa_ready" );
    players[0].fx = level.zombie_powerups[ "nuke" ].fx;
    level thread maps\_zombiemode_powerups::nuke_powerup( players[0] );
    clock StopLoopSound( 1 );
    wait( 1.0 );
    if ( IsDefined( temp_fx ) )
    {
    players[0].fx = temp_fx;
    }
    else
    {
    players[0].fx = undefined;
    }
    clock Delete();
    timer_hand Delete();
    return;
    }
    }
    }

    lander_passkey_event() {
    flag_init( "letter_acquired" );
    level.lander_key = [];
    level.lander_key[ "lander_station1" ][ "lander_station3" ] = "s";
    level.lander_key[ "lander_station1" ][ "lander_station4" ] = "r";
    level.lander_key[ "lander_station1" ][ "lander_station5" ] = "e";
    level.lander_key[ "lander_station3" ][ "lander_station1" ] = "y";
    level.lander_key[ "lander_station3" ][ "lander_station4" ] = "a";
    level.lander_key[ "lander_station3" ][ "lander_station5" ] = "i";
    level.lander_key[ "lander_station4" ][ "lander_station1" ] = "m";
    level.lander_key[ "lander_station4" ][ "lander_station3" ] = "h";
    level.lander_key[ "lander_station4" ][ "lander_station5" ] = "u";
    level.lander_key[ "lander_station5" ][ "lander_station1" ] = "t";
    level.lander_key[ "lander_station5" ][ "lander_station3" ] = "n";
    level.lander_key[ "lander_station5" ][ "lander_station4" ] = "l";
    level.passkey = array( "l", "u", "n", "a" );
    level.passkey_progress = 0;
    level.secret1 = array( "h", "i", "t", "s", "a", "m" );
    level.secret1_progress = 0;
    level.secret2 = array( "h", "y", "e", "n", "a" );
    level.secret2_progress = 0;
    thread lander_monitor();
    flag_wait( "passkey_confirmed" );
    level.lander_audio_ent StopLoopSound( 1 );
    level thread play_egg_vox( "vox_ann_egg5_success", "vox_gersh_egg5", 5 );
    level thread activate_casimir_light( 4 );
    wait(1);
    level.lander_audio_ent Delete();
    }

    lander_monitor(){
    lander = getent( "lander", "targetname" );
    level.lander_audio_ent = Spawn( "script_origin", lander.origin );
    level.lander_audio_ent LinkTo( lander );
    level.lander_audio_ent PlayLoopSound( "zmb_egg_notifier", 1 );
    while ( !flag( "passkey_confirmed" ) ) {
    level waittill("lander_launched");
    if ( lander.called ) {
    start = lander.depart_station;
    dest = lander.station;
    letter = level.lander_key[ start ][ dest ];
    model = level.lander_letters[ letter ];
    model Show();
    model PlaySound( "zmb_spawn_powerup" );
    model thread spin_letter();
    model PlayLoopSound( "zmb_spawn_powerup_loop", .5 );
    trig = Spawn( "trigger_radius", model.origin, 0, 200, 150 );
    trig thread letter_grab( letter, model );
    flag_wait("lander_grounded");
    if ( !flag( "letter_acquired" ) ) {
    level.passkey_progress = 0;
    level.secret1_progress = 0;
    level.secret2_progress = 0;
    } else {
    flag_clear( "letter_acquired" );
    }
    trig delete();
    model Hide();
    model StopLoopSound( .5 );
    } else {
    level.passkey_progress = 0;
    level.secret1_progress = 0;
    level.secret2_progress = 0;
    }
    }
    }


    spin_letter() {
    level endon( "lander_grounded" );
    level endon( "letter_acquired" );
    while (1)
    {
    self RotateYaw( 90, 5 );
    wait( 5 );
    }
    }

    letter_grab( letter, model ) {
    level endon("lander_grounded");
    self waittill( "trigger" );
    flag_set( "letter_acquired" );
    playsoundatposition("zmb_powerup_grabbed", model.origin);
    model Hide();
    if ( letter == level.passkey[ level.passkey_progress ] ){
    level.passkey_progress++;
    if ( level.passkey_progress == level.passkey.size ) {
    flag_set( "passkey_confirmed" );
    }
    } else {
    level.passkey_progress = 0;
    }

    if ( letter == level.secret1[ level.secret1_progress ] ) {
    level.secret1_progress++;
    if ( level.secret1_progress == level.secret1.size )
    {
    }
    } else {
    level.secret1_progress = 0;
    }
    if ( letter == level.secret2[ level.secret2_progress ] ) {
    level.secret2_progress++;
    if ( level.secret2_progress == level.secret2.size )
    {
    }
    } else {
    level.secret2_progress = 0;
    }
    }

    weapon_combo_event() {
    flag_init( "thundergun_hit" );
    weapon_combo_spot = GetStruct( "weapon_combo_spot", "targetname" );
    focal_point = Spawn( "script_model", weapon_combo_spot.origin );
    focal_point SetModel( "tag_origin" );
    focal_point PlayLoopSound( "zmb_egg_notifier", 1 );
    fx = PlayFXOnTag( level._effect["gersh_spark"], focal_point, "tag_origin" );
    level.black_hold_bomb_target_trig = Spawn( "trigger_radius", weapon_combo_spot.origin, 0, 50, 72 );
    level.black_hole_bomb_loc_check_func = ::bhb_combo_loc_check;
    flag_wait( "weapons_combined" );
    level.black_hold_bomb_target_trig Delete();
    level.black_hole_bomb_loc_check_func = undefined;
    focal_point Delete();
    for ( i=0; i {
    level.casimir_lights[i] Delete();
    }
    }

    bhb_combo_loc_check( grenade, model, info )
    {
    if ( IsDefined( level.black_hold_bomb_target_trig ) &&
    grenade IsTouching( level.black_hold_bomb_target_trig ) )
    {
    trig = Spawn( "trigger_damage", grenade.origin, 0, 15, 72 );
    grenade thread wait_for_combo( trig );
    }
    return false;
    }

    wait_for_combo( trig )
    {
    self endon( "death" );
    self thread kill_trig_on_death( trig );
    weapon_combo_spot = GetStruct( "weapon_combo_spot", "targetname" );
    ray_gun_hit = false;
    doll_hit = false;
    crossbow_hit = false;
    players = get_players();
    array_thread( players, ::thundergun_check, self, trig, weapon_combo_spot );
    while ( 1 ) {
    trig waittill( "damage", amount, attacker, dir, org, mod );
    if ( isDefined( attacker ) ) {
    if ( mod == "MOD_PROJECTILE_SPLASH" && (attacker GetCurrentWeapon() == "ray_gun_upgraded_zm" ) ) {
    ray_gun_hit = true;
    } else if ( mod == "MOD_GRENADE_SPLASH" ) {
    if ( amount >= 90000 ) {
    doll_hit = true;
    } else if ( attacker GetCurrentWeapon() == "crossbow_explosive_upgraded_zm" ){
    crossbow_hit = true;
    }
    }
    if ( ray_gun_hit && doll_hit && flag( "thundergun_hit" ) ) {
    flag_set( "weapons_combined" );
    level thread soul_release( self, trig.origin );
    return;
    }
    }
    }
    }

    thundergun_check( model, trig, weapon_combo_spot )
    {
    model endon( "death" );
    while (1) {
    self waittill( "weapon_fired" );
    if ( self GetCurrentWeapon() == "thundergun_upgraded_zm" ) {
    if ( DistanceSquared( self.origin, weapon_combo_spot.origin ) vector_to_spot = VectorNormalize( weapon_combo_spot.origin - self GetWeaponMuzzlePoint() );
    vector_player_facing = self GetWeaponForwardDir();
    angle_diff = acos( VectorDot( vector_to_spot, vector_player_facing ) );
    if ( angle_diff flag_set( "thundergun_hit" );
    RadiusDamage( trig.origin, 5, 1, 1, self );
    }
    }
    }
    }
    }

    kill_trig_on_death( trig )
    {
    self waittill( "death" );
    trig delete();
    if( flag( "thundergun_hit" ) && !flag( "weapons_combined" ) )
    {
    level thread play_egg_vox( "vox_ann_egg6p1_success", "vox_gersh_egg6_fail2", 7 );
    } else if( !flag( "weapons_combined" ) ){
    level thread play_egg_vox( undefined, "vox_gersh_egg6_fail1", 6 );
    }
    flag_clear( "thundergun_hit" );
    }

    soul_release( model, origin )
    {
    soul = Spawn( "script_model", origin );
    soul SetModel( "tag_origin" );
    soul PlayLoopSound( "zmb_egg_soul" );
    fx = PlayFXOnTag( level._effect["gersh_spark"], soul, "tag_origin" );
    time = 20;
    model waittill( "death" );
    level thread play_egg_vox( "vox_ann_egg6_success", "vox_gersh_egg6_success", 9 );
    level thread wait_for_gersh_vox();
    soul MoveZ( 2500, time, time - 1 );
    wait( time );
    soul Delete();
    wait(2);
    level thread samantha_is_angry();
    }

    wait_for_gersh_vox()
    {
    wait(12.5);
    players = GetPlayers();
    for ( i=0; i {
    players[i] thread reward_wait();
    }
    }

    reward_wait()
    {
    while ( !is_player_valid( self ) ||
    ( self UseButtonPressed() && self in_revive_trigger() ) )
    {
    wait( 1.0 );
    }
    level thread maps\_zombiemode_powerups::minigun_weapon_powerup( self, 90 );
    }

    play_egg_vox( ann_alias, gersh_alias, plr_num )
    {
    if( IsDefined( ann_alias ) )
    {
    level maps\zombie_cosmodrome_amb::play_cosmo_announcer_vox( ann_alias );
    }
    if( IsDefined( gersh_alias ) )
    {
    level maps\zombie_cosmodrome_amb::play_gersh_vox( gersh_alias );
    }
    if( IsDefined( plr_num ) )
    {
    players = get_players();
    rand = RandomIntRange( 0, players.size );
    players[rand] maps\_zombiemode_audio::create_and_play_dialog( "eggs", "gersh_response", undefined, plr_num );
    }
    }

    samantha_is_angry()
    {
    playsoundatposition( "zmb_samantha_earthquake", (0,0,0) );
    playsoundatposition( "zmb_samantha_whispers", (0,0,0) );
    wait(6);
    level clientnotify( "sia" );
    playsoundatposition( "zmb_samantha_scream", (0,0,0) );
    }

    The above code doesn't cover any of the radios or centrifuge, so there must be more scripts that I haven't seen.

    ** Edit: See next post for download link.

  6. mallen23, I see that you referenced wonderboy's theroy on your Operation Ω thread. I too another look at the code. The number 90000 only appears twice in the code. Once in the wait_for_combo function to determine if grenade splash damage is above 90000 to indicate that the dolls have been used.

    The other use of 90000 is in the thundergun_check function to determine if your using the thunder gun and aiming toward the gurse device with a 10 degree angle tolerance. There are three origin values being used for this check:

    self.origin: Where you are standing

    weapon_combo_spot.origin: where the weapon combo spot is.

    trig.origin: Value that is created in bhb_combo_loc_check and trig = Spawn( "trigger_damage", grenade.origin, 0, 15, 72 ); It is passed to wait_for_combo and wait_for_combo passes it to the thundergun_check function.

    The only thing that is not known is what function RadiusDamage( trig.origin, 5, 1, 1, self ); does.

  7. As i previously stated, I believe from what I am seeing that the Easter Egg is done. However this may not be the case as I don't see any scripting referencing the radios and how they spawn. This could mean that there is more code or that the radios are apart of the map file itself and not visible to us. To follow with good practice of code organization, it would be reasonable to believe that this is all the code regarding the Easter egg and that the Easter egg is complete.

    I can't verify that this is the only section of code in the game as I didn't obtain it. This means that there are most likely more Easter eggs that haven't been discovered so I hold hope that more exist, however the DMs seems to be the end of the main Easter egg.

  8. Already i want to point out a few things in the init:

    teleport_target_event(); // This is the event for sucking the generator into the gurse device

    reroute_power_event(); // The terminal you click on for power node activation

    sync_switch_event(); // Monkey round switch event

    pressure_plate_event(); // This is where you stand for the clock

    lander_passkey_event(); // Sets up the passkey for the lander, such as luna

    weapon_combo_event(); // The weapons hitting the gurse device by the four nodes

    All the events that are being monitored have been found for the Easter egg, so i have to say it is completed. I didn't see any number that would explain how nextgentactics got stuck with only one set of weapons and reduced DM time.

    Notes:

    the wait_for_combo function seems to only requires each weapon to hit once: ray_gun_upgraded_zm, MOD_GRENADE_SPLASH >= 90000 for the dolls, crossbow_explosive_upgraded_zm. A flag "weapons_combined" is then set causing weapon_combo_event() to delete the casimir lights. The flag is only there to clean up the map objects such as the lights.

    The flag "weapons_combined" isn't important, the fact that "level thread soul_release( self, trig.origin );" is called after the flag is set is.

    So, Here is the ending of the Easter egg then:

    soul_release( model, origin )

    {

    soul = Spawn( "script_model", origin );

    soul SetModel( "tag_origin" );

    soul PlayLoopSound( "zmb_egg_soul" );

    fx = PlayFXOnTag( level._effect["gersh_spark"], soul, "tag_origin" );

    time = 20;

    model waittill( "death" );

    level thread play_egg_vox( "vox_ann_egg6_success", "vox_gersh_egg6_success", 9 );

    level thread wait_for_gersh_vox();

    soul MoveZ( 2500, time, time - 1 );

    wait( time );

    soul Delete();

    wait(2);

    level thread samantha_is_angry();

    }

    soul_release -> wait_for_gersh_vox() -> reward_wait() -> DMs

    In the lander_passkey_event():

    No evidence that HITSAM & HYENA does anything at this time

    The lander must be called, if the lander itself is activated, all progress is lost:

    if ( lander.called ) {

    ....

    }else{

    level.passkey_progress = 0;

    level.secret1_progress = 0;

    level.secret2_progress = 0;

    }

    I confirm that there doesn't seem to be any use of the secret1_progress or secret2_progress at this time. (in the letter_grab function)

    Functions:

    init

    play_easter_egg_audio( , )

    activate_casimir_light(int number)

    teleport_target_event() //Transformer teleport into gursh device

    bhb_teleport_loc_check()

    teleport_target(, )

    reroute_power_event()

    wait_for_use( monitor )

    sync_switch_event()

    reveal_switch();

    wait_for_sync_use( ss )

    switch_watcher()

    pressure_plate_event

    area_timer( time )

    lander_passkey_event()

    lander_monitor()

    spin_letter()

    letter_grab( letter, model )

    weapon_combo_event()

    bhb_combo_loc_check( grenade, model, info )

    wait_for_combo( trig )

    thundergun_check( model, trig, weapon_combo_spot )

    kill_trig_on_death( trig )

    soul_release( model, origin )

    wait_for_gersh_vox()

    reward_wait() // 90 seconds DMs

    play_egg_vox( ann_alias, gersh_alias, plr_num )

    samantha_is_angry()

  9. I'm a software engineering student (close to graduating) and i decided to take a look at one part of this and give my two cents

    I don't have access to the code so I'm assuming the above posted is correct. I added indenting to make it easier to read. As i don't know this language, I'm going to make some assumptions. See my comments in code as "//"


    wait_for_combo( trig ) { // variable 'trig' is used as some kind of reference to store information in
    // 'self' could be a way of storing information in 'trig' or to change behavior of this method/function/block of code
    // 'self' could be a way of accessing other scripts like 'this' in object orientated languages
    self thread kill_trig_on_death( trig ); //This looks as if it could spawn a new thread and run the 'kill_trig_on_death' block of code that can make changes to the 'trig' container
    self endon( "death" ); //some function 'endon' is being called. It is unclear on what it modifies
    //weapon_combo_spot is getting set, don't know what GetStruct does but I'm assuming its the gurse device location
    weapon_combo_spot = GetStruct( "weapon_combo_spot", "targetname" );

    /** This looks to be initialization of variables that will be set inside of a loop **/
    ray_gun_hit = false;
    doll_hit = false;
    crossbow_hit = false;
    players = get_players();
    /** End of initialization of variables **/

    array_thread( players, ::thundergun_check, self, trig, weapon_combo_spot ); //This can be some kind of thread sync for the trigger to run for all players.

    while ( 1 ) //A never ending loop, rather interesting as there must be some way to end the loop. I'm assuming that this tread is terminated some how or the loop is broken out of.

    //Does the current player have the upgraded thundergun?
    if ( self GetCurrentWeapon() == "thundergun_upgraded_zm" ) {
    /** Note self.origin pry is where your standing and weapon_combo_spot.origin is pry where the gurse device is. This means that you need to stand within 90000 units of the gurse device when your firing at it for the Easter egg to work. **/
    if ( DistanceSquared( self.origin, weapon_combo_spot.origin )
    /** This section just determines if your weapons , in this case being the thunder gun, hit the target that is the gurse deivice with a 10 degree tolerance to the point where you need to aim **/

    vector_to_spot = VectorNormalize( weapon_combo_spot.origin - self GetWeaponMuzzlePoint() );
    vector_player_facing = self GetWeaponForwardDir();
    angle_diff = acos( VectorDot( vector_to_spot, vector_player_facing ) );
    if ( angle_diff flag_set( "thundergun_hit" ); //The thunder gun has hit the gurse device. This implies that you only need to hit the gurse device once with the thunder gun.

    RadiusDamage( trig.origin, 5, 1, 1, self ); //Add damage to gurse device total

    //The rest of the code isn't available so I can't do more analysis.

    Interesting to notes;

    This is implying that you only need to hit the gurse device once with the thunder gun, but each hit of the thunder gun does add damage to the gurse device. I suspect that ray_gun_hit , doll_hit, crossbow_hit are set true later down in the loop.

    The 10 degree tolerance and 90000 distance just determines if your close enough to hit the gurse device in this Easter egg (doesn't count weapon range) and that your aiming at it with the a tolerance of 10 degrees.

    As the loop of code here isn't fully given, I can't conclude that the Easter egg is over.

  10. this could be done below round 30. Reaching the 30's is complete in my eyes because your just wishing for all your zombies to be dead so you can add a round to your bragging rights, and gets so fucking repetitative/boring.

    You do have a point, instead of being survive as long as you can, should it be survive to at least level 30?

  11. I've been reading what has been found and thought it would be fun to issue a completion challenge. I'll try to keep the list up to date, but post if I leave something out.

    The goal is to complete everything on the list in one game sitting. Post the round the challenge was completed, how long it took you and the order that the items where completed in.

    1. Listen to all radios

    2. Get the dolls

    3. Turn power on

    4. Launch Rocket

    5. Blow up Rocket

    6. Get nodes 1-4

    7. Have everyone with all the perks

    8. Spell HITSAM & HYENA as they could become something with a later patch

    9. Play epic music (cause who doesn't like music when releasing someone from another realm)

    10. While having everyone with all perks, complete final Easter egg to get DMs

    (For toughs who want more bragging rights)

    11. Get and upgrade every gun. (Just you, total of the group, or everyone in group completed)

    12. Complete a perfect monkey round with everyone already having full perks.

    13. Revive someone with the upgraded ballistic knife

    14. Survive as long as you can

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use, Privacy Policy, Code of Conduct, We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. .