297 lines
7.1 KiB
Plaintext
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" );
|
||
|
}
|