IW4-Dump-Files/maps/_intelligence.gsc

297 lines
7.1 KiB
Plaintext

#include common_scripts\utility;
#include maps\_utility;
#include maps\_hud_util;
//need to be able to save select dvar in menu (spending points while in the menu)
//need to be able to save select dvar from script (dvars track which items are found)
main()
{
// &&1/30 pieces of enemy intel found.
precachestring( &"SCRIPT_INTELLIGENCE_OF_FOURTYFIVE" );
precachestring( &"SCRIPT_INTELLIGENCE_PREV_FOUND" );
level.intel_items = create_array_of_intel_items();
println( "intelligence.gsc: intelligence items:", level.intel_items.size );
setDvar( "ui_level_cheatpoints", level.intel_items.size );
level.intel_counter = 0; // intel counter for collected intel points for this mission
setDvar( "ui_level_player_cheatpoints", level.intel_counter );
level.table_origins = create_array_of_origins_from_table();
initialize_intel();
if( is_specialop() )
{
remove_all_intel();
return;
}
intel_think();
wait .05;
}
remove_all_intel()
{
foreach ( index, trigger in level.intel_items )
{
if ( !isdefined( trigger.removed ) )
trigger remove_intel_item();
}
}
remove_intel_item()
{
self.removed = true;
self.item hide();
self.item notsolid();
self trigger_off();
level.intel_counter++;
setDvar( "ui_level_player_cheatpoints", level.intel_counter );
self notify( "end_trigger_thread" );
/#
println( "^3Removed Intel: " + self.num );
#/
}
initialize_intel()
{
foreach ( index, trigger in level.intel_items )
{
origin = trigger.origin;
trigger.num = get_nums_from_origins( origin );
}
}
intel_think()
{
foreach ( index, trigger in level.intel_items )
{
if ( trigger check_item_found() )
{
trigger remove_intel_item();
}
else
{
trigger thread wait_for_pickup();
trigger thread poll_for_found();
}
}
}
//we poll constantly to see if the item's been picked up...this is because script only checks at the
//beginning if the item was found or not...after that, it doesn't check anymore, however a player can
//pick up intel, die, reload an earlier part of script and then pick up intel again...this polling
//insures things like that dont happen.
poll_for_found()
{
self endon( "end_loop_thread" );
while( !self check_item_found() )
wait .1;
self remove_intel_item();
}
check_item_found()
{
foreach( player in level.players )
{
if( !player GetPlayerIntelIsFound( self.num ) )
return false;
}
return true;
}
create_array_of_intel_items()
{
intelligence_items = getentarray( "intelligence_item", "targetname" );
for ( i = 0;i < intelligence_items.size;i++ )
{
println( intelligence_items[ i ].origin );
intelligence_items[ i ].item = getent( intelligence_items[ i ].target, "targetname" );
intelligence_items[ i ].found = false;
}
return intelligence_items;
}
create_array_of_origins_from_table()
{
origins = [];
for ( num = 1; num <= 64; num++ )
{
location = tablelookup( "maps/_intel_items.csv", 0, num, 4 );
if ( isdefined( location ) && ( location != "undefined" ) )
{
locArray = strTok( location, "," );
assert( locArray.size == 3 );
for ( i = 0;i < locArray.size;i++ )
locArray[ i ] = int( locArray[ i ] );
origins [ num ] = ( locArray[ 0 ], locArray[ 1 ], locArray[ 2 ] );
}
else
{
origins [ num ] = undefined;
}
}
return origins;
}
wait_for_pickup()
{
self endon( "end_trigger_thread" );
if( self.classname == "trigger_use" )
{
// Press and hold^3 &&1 ^7to secure the enemy intelligence.
self setHintString( &"SCRIPT_INTELLIGENCE_PICKUP" );
self usetriggerrequirelookat();
}
self waittill( "trigger", player );
self notify( "end_loop_thread" );
self intel_feedback( player );
self save_intel_for_all_players();
UpdateGamerProfileAll();
waittillframeend;
self remove_intel_item();
}
save_intel_for_all_players()
{
assert( ! self check_item_found() );
foreach( player in level.players )
{
if( player GetPlayerIntelIsFound( self.num ) )
continue;
player SetPlayerIntelFound( self.num );
}
logString( "found intel item " + self.num );
// updates percent complete
/#
PrintLn( ">> SP PERCENT UPDATE - save_intel_for_all_players()" );
#/
maps\_endmission::updateSpPercent();
}
give_point()
{
//give_points
curValue = ( self GetLocalPlayerProfileData( "cheatPoints" ));
self SetLocalPlayerProfileData( "cheatPoints", curValue + 1 );
}
intel_feedback( found_by_player )
{
self.item hide();
self.item notsolid();
level thread play_sound_in_space( "intelligence_pickup", self.item.origin );
display_time = 3000;
fade_time = 700;
delete_time = display_time + fade_time / 1000;
foreach( player in level.players )
{
//if i did NOT find it, but I already had it, print nothing
if( found_by_player != player && player GetPlayerIntelIsFound( self.num ) )
continue;
remaining_print = player createClientFontString( "objective", 1.5 );
remaining_print.glowColor = ( 0.7, 0.7, 0.3 );
remaining_print.glowAlpha = 1;
remaining_print setup_hud_elem();
remaining_print.y = -60;
remaining_print SetPulseFX( 60, display_time, fade_time );
intel_found = 0;
//if I found it and I already had it
if( found_by_player == player && player GetPlayerIntelIsFound( self.num ) )
remaining_print.label = &"SCRIPT_INTELLIGENCE_PREV_FOUND";
else
{
// &&1/30 pieces of enemy intel found.
remaining_print.label = &"SCRIPT_INTELLIGENCE_OF_FOURTYFIVE";
player give_point();
intel_found = ( player GetLocalPlayerProfileData( "cheatPoints" ));
remaining_print setValue( intel_found );
}
if ( intel_found == 22 )
player maps\_utility::player_giveachievement_wrapper( "THE_ROAD_LESS_TRAVELED" );
if ( intel_found == 45 )
player maps\_utility::player_giveachievement_wrapper( "LEAVE_NO_STONE_UNTURNED" );
remaining_print delaycall( delete_time, ::Destroy );
}
}
setup_hud_elem()
{
self.color = ( 1, 1, 1 );
self.alpha = 1;
self.x = 0;
self.alignx = "center";
self.aligny = "middle";
self.horzAlign = "center";
self.vertAlign = "middle";
self.foreground = true;
}
assert_if_identical_origins()
{
origins = [];
for ( i = 1;i < 65;i++ )
{
location = tablelookup( "maps/_intel_items.csv", 0, i, 4 );
locArray = strTok( location, "," );
//assert( locArray.size == 3 );
for ( i = 0;i < locArray.size;i++ )
locArray[ i ] = int( locArray[ i ] );
origins [ i ] = ( locArray[ 0 ], locArray[ 1 ], locArray[ 2 ] );
//if ( distancesquared( first.origin, second.origin ) < 4 );
}
for ( i = 0;i < origins.size;i++ )
{
if ( ! isdefined( origins [ i ] ) )
continue;
if ( origins [ i ] == "undefined" )
continue;
for ( j = 0;j < origins.size;j++ )
{
if ( ! isdefined( origins [ j ] ) )
continue;
if ( origins [ j ] == "undefined" )
continue;
if ( i == j )
continue;
if ( origins [ i ] == origins[ j ] )
assertmsg( "intel items in maps/_intel_items.csv with identical origins (" + origins[ i ] + ") " );
}
}
}
get_nums_from_origins( origin )
{
for ( i = 1;i < level.table_origins.size + 1;i++ )
{
if ( !isdefined( level.table_origins [ i ] ) )
continue;
if ( distancesquared( origin, level.table_origins[ i ] ) < squared( 75 ) )
return i;
}
assertmsg( "Add the origin of this intel item ( " + origin + " ) to maps/_intel_items.csv file" );
}