nx1-gsc-dump/maps/mp/_intel.gsc
2024-09-04 23:46:54 +10:00

792 lines
22 KiB
Plaintext

#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
INTEL_OFFSET = (0, 0, 24);
INTEL_OFFSET_TOP = (0, 0, 36);
INTEL_ICON_PULSE_SCALE = 1.2;
INTEL_ICON_PULSE_WAIT_SEC = 5;
INTEL_ICON_COLOR = (1,1,1);
//*******************************************************************
// *
// *
//*******************************************************************
init()
{
if( getDvarInt( "prototype_intel_enabled" ) == 1 )
{
println( "Intel enabled" );
intelGamePercentage = getDvarInt( "prototype_intel_percentage" );
if( intelGamePercentage >= randomInt( 100 ))
{
println( "Intel: This will be an intel game" );
initIntel();
level thread onPlayerConnect();
level thread addIntelToGame();
//tempGetStarted();
}
else
{
println( "Intel: This is not going to be an intel game" );
}
}
else
{
println( "Intel not inited ", getDvarInt( "prototype_intel_enabled" ));
}
}
tempGetStarted()
{
level waittill("connected", player);
player thread tempGetStartedSpawned();
}
tempGetStartedSpawned()
{
wait 3;
// setup the team, close the menu, then set our class and wait for our player to spawn
self [[level._onTeamSelection]]( "allies" );
self closepopupMenu();
self closeInGameMenu();
self.selectedClass = true;
self [[level._class]]("class0");
players = getentarray("player", "classname");
while( players.size == 0 )
{
wait 1;
players = getentarray("player", "classname");
}
}
intelDebugging()
{
return false;
}
//*******************************************************************
// *
// *
//*******************************************************************
initIntel()
{
// setup the models and stuff we need for intel
//precacheShader("waypoint_bomb");
precacheModel( "prop_suitcase_intel" );
precacheString(&"MP_AQUIRING_INTEL");
precacheString(&"MP_INTEL_HEADER");
level._intelHUDIcon = "hud_suitcase_bomb";
precacheShader( level._intelHUDIcon );
level._intel = undefined;
// we need to setup our array of intel types
intelInitData = [];
intelInitData["replenish"] = "ammo_primary";
intelKillsEvalData = [];
intelKillsEvalData["kills"]["count"] = 3;
intelKillsEvalData["kills"]["string"] = &"MP_INTEL_KILLS_DESC";
intelKillsAwardData = [];
intelKillsAwardData["experience"] = 1000;
addIntelType( "intel_kills", 0, 15, ::initLifeStats, intelInitData, ::evalLifeStats, intelKillsEvalData, ::intelAward, intelKillsAwardData );
intelInitData = [];
intelInitData["replenish"] = "ammo_primary";
intelKillsEvalData = [];
intelKillsEvalData["headshots"]["count"] = 1;
intelKillsEvalData["headshots"]["string"] = &"MP_INTEL_HEADSHOT_DESC";
intelKillsAwardData = [];
intelKillsAwardData["experience"] = 1000;
addIntelType( "intel_headshot", 0, 15, ::initLifeStats, intelInitData, ::evalLifeStats, intelKillsEvalData, ::intelAward, intelKillsAwardData );
intelInitData = [];
intelInitData["replenish"] = "ammo_primary";
intelKillsEvalData = [];
intelKillsEvalData["mostmultikills"]["count"] = 1;
intelKillsEvalData["mostmultikills"]["string"] = &"MP_INTEL_MULTIKILL_DESC";
intelKillsAwardData = [];
intelKillsAwardData["experience"] = 1000;
addIntelType( "intel_multikills", 0, 15, ::initLifeStats, intelInitData, ::evalLifeStats, intelKillsEvalData, ::intelAward, intelKillsAwardData );
intelInitData = [];
intelInitData["replenish"] = "equipment";
intelKillsEvalData = [];
intelKillsEvalData["equipmentkills"]["count"] = 1;
intelKillsEvalData["equipmentkills"]["string"] = &"MP_INTEL_EQUIPMENT_DESC";
intelKillsAwardData = [];
intelKillsAwardData["experience"] = 1000;
addIntelType( "intel_equipmentkills", 0, 15, ::initLifeStats, intelInitData, ::evalLifeStats, intelKillsEvalData, ::intelAward, intelKillsAwardData );
// generate the max weighted value
level._intelMaxWeight = 0;
foreach ( intelName, intelDef in level._intelDefs )
{
if ( intelDef["weight"] > 0 )
{
level._intelMaxWeight += intelDef["weight"];
level._intelDefs[intelName]["weight"] = level._intelMaxWeight;
// println( "Adding intel " + intelName + " with weight value " + intelDef["weight"] + " max weight is " + level._intelMaxWeight );
}
else
{
println( "Warning: Intel def with 0 weight! name = ", intelName );
}
}
}
//*******************************************************************
// *
// *
//*******************************************************************
addIntelType( name, intelLevel, weight, initFunc, initData, evalFunc, evalData, awardFunc, awardData )
{
evalData["name"] = name;
awardData["name"] = name;
level._intelDefs[name]["weight"] = weight;
level._intelDefs[name]["intelLevel"] = intelLevel;
level._intelDefs[name]["initFunc"] = initFunc;
level._intelDefs[name]["initData"] = initData;
level._intelDefs[name]["evalFunc"] = evalFunc;
level._intelDefs[name]["evalData"] = evalData;
level._intelDefs[name]["awardFunc"] = awardFunc;
level._intelDefs[name]["awardData"] = awardData;
foreach( evalPiece, evalDataList in evalData )
{
println( evalPiece );
if( evalPiece != "name" && isDefined( evalDataList["string"] ))
{
PreCacheString( evalDataList["string"] );
}
}
}
//*******************************************************************
// *
// *
//*******************************************************************
getRandomIntel()
{
value = randomInt( level._intelMaxWeight );
selectedIntelName = undefined;
foreach ( intelName, intelDef in level._intelDefs )
{
if( intelDef["weight"] > 0 )
{
selectedIntelName = intelName;
if ( intelDef["weight"] > value )
{
break;
}
}
}
return( selectedIntelName );
}
//*******************************************************************
// *
// *
//*******************************************************************
initIntelOnPlayer( player )
{
process = level._intelDefs[ level._intel ][ "initFunc" ];
processInitData = level._intelDefs[ level._intel ][ "initData" ];
processEvalData = level._intelDefs[ level._intel ][ "evalData" ];
return [[ process ]]( player, processInitData, processEvalData );
}
//*******************************************************************
// *
// *
//*******************************************************************
evalIntelOnPlayer( player )
{
process = level._intelDefs[ level._intel ][ "evalFunc" ];
processData = level._intelDefs[ level._intel ][ "evalData" ];
return [[ process ]]( player, processData );
}
//*******************************************************************
// *
// *
//*******************************************************************
awardIntelOnPlayer( player )
{
process = level._intelDefs[ level._intel ][ "awardFunc" ];
processData = level._intelDefs[ level._intel ][ "awardData" ];
[[ process ]]( player, processData );
}
//*******************************************************************
// *
// *
//*******************************************************************
addIntelToGame()
{
level._intel = getRandomIntel();
println( "Intel added to the game ", level._intel );
// wait till we have some player connected
level waittill( "connected", player );
while( level._players.size == 0 )
{
wait 0.05;
}
// find a intel spawn location
spawnPoint = findIntelSpawnLocation();
assert( isDefined( spawnPoint ));
// create the use objects
level._intelEnt = createIntelBreifcase( spawnPoint );
}
//*******************************************************************
// *
// *
//*******************************************************************
findIntelSpawnLocation()
{
// for now, just grab a random dom point
// randomPlayer = level._players[ randomInt( level._players.size ) ];
// randomPlayer waittill( "spawned_player" );
// return randomPlayer [[ level._getSpawnPoint ]]();
while( 1 )
{
wait 0.5;
if( isDefined( level._spawnpoints ))
{
if( level._spawnpoints.size > 0 )
{
break;
}
}
}
return level._spawnpoints[ randomInt( level._spawnpoints.size ) ];
}
//*******************************************************************
// *
// *
//*******************************************************************
createIntelBreifcase( entity )
{
visuals[0] = spawn( "script_model", entity.origin );
visuals[0].angles = entity.angles;
visuals[0] setModel( "prop_suitcase_intel" );
cloneTrigger = spawn( "trigger_radius", entity.origin, 0, 96, 60 );
intelEnt = cloneTrigger;
intelZone = maps\mp\gametypes\_gameobjects::createCarryObject( "friendly", intelEnt, visuals, INTEL_OFFSET );
intelZone maps\mp\gametypes\_gameobjects::setUseTime( 0.5 );
intelZone maps\mp\gametypes\_gameobjects::setUseText( &"MP_AQUIRING_INTEL" );
intelZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
// intelZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_bomb" );
// intelZone maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
// intelZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_bomb" );
// intelZone maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
intelZone maps\mp\gametypes\_gameobjects::allowCarry( "any" );
intelZone maps\mp\gametypes\_gameobjects::setCarrierVisible( false );
intelZone thread intelSpinAnimate();
intelZone.onPickup = ::onPickupIntel;
intelZone.onDrop = ::onDropIntel;
intelZone.allowWeapons = true;
intelZone.oldRadius = intelEnt.radius;
return intelZone;
}
//*******************************************************************
// *
// *
//*******************************************************************
intelSpinAnimate()
{
level endon( "game_ended" );
self endon( "reset" );
self endon( "pickup_object" );
bottomPos = self.curOrigin + INTEL_OFFSET;
topPos = self.curOrigin + INTEL_OFFSET_TOP;
while( true )
{
self.visuals[0] moveTo( topPos, 0.5, 0.15, 0.15 );
self.visuals[0] rotateYaw( 180, 0.5 );
wait( 0.5 );
self.visuals[0] moveTo( bottomPos, 0.5, 0.15, 0.15 );
self.visuals[0] rotateYaw( 180, 0.5 );
wait( 0.5 );
}
}
//*******************************************************************
// *
// *
//*******************************************************************
onPickupIntel( player )
{
// level._intelEnt maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined );
// level._intelEnt maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined );
// level._intelEnt maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined );
// level._intelEnt maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined );
player thread onIntelAquired();
}
//*******************************************************************
// *
// *
//*******************************************************************
onDropIntel( player )
{
// level._intelEnt maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_bomb" );
// level._intelEnt maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
// level._intelEnt maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_bomb" );
// level._intelEnt maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
level._intelEnt thread intelSpinAnimate();
intelCardSplashEveryone( "intel_dropped_callout", player );
}
//*******************************************************************
// *
// *
//*******************************************************************
onPlayerConnect()
{
for(;;)
{
level waittill( "connected", player );
player thread notifyIntelGame();
player thread onPlayerSpawned();
}
}
//*******************************************************************
// *
// *
//*******************************************************************
onPlayerSpawned()
{
self endon( "disconnect" );
if( intelDebugging())
println( "Intel: onPlayerSpawned" );
for(;;)
{
self waittill( "spawned_player" );
if( intelDebugging())
println( "Intel: Player spawned" );
self._intelHasIntel = 0;
// self thread intelWaitDeath();
}
}
//*******************************************************************
// *
// *
//*******************************************************************
intelWaitDeath()
{
self endon( "intel_cleanup" );
self waittill( "death" );
self notify( "intel_cleanup" );
}
//*******************************************************************
// *
// *
//*******************************************************************
intelWaitCleanup()
{
self waittill( "intel_cleanup" );
wait 1;
self destroyIntelHud();
}
//*******************************************************************
// *
// *
//*******************************************************************
onIntelAquired()
{
self endon( "disconnect" );
self endon( "death" );
//intelCardSplashEveryone( "intel_pickup_callout", self );
self._intelHasIntel = 1;
self createIntelHud();
self thread intelWaitDeath();
self thread intelWaitCleanup();
println( "Intel: intel aquired by ", self.name );
initIntelOnPlayer( self );
while( 1 )
{
if( evalIntelOnPlayer( self ) == 1 )
{
println( "Intel: Awarding intel to player" );
intelCardSplashEveryone( "intel_completed_callout", self );
self incPlayerStat( "intelCompleted", 1 );
awardIntelOnPlayer( self );
// get rid of the intel, it's served it's purpose
//level._intelEnt thread maps\mp\gametypes\_gameobjects::deleteUseObject();
level._intelEnt maps\mp\gametypes\_gameobjects::disableObject();
break;
}
wait 0.05;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
// Evaluation and Award funcs
//*******************************************************************
// *
// *
//*******************************************************************
initLifeStats( player, initData, evalData )
{
if( intelDebugging())
println( "Initing Intel on ", player.name );
i = 0;
foreach( intelStat, intelStatValue in evalData )
{
if( intelStat != "name" )
{
player._intelInitValues[intelStat] = getPlayerStat( intelStat );
player._intelHud["lines"][i]["item"] SetText( intelStatValue["string"] );
i += 1;
}
}
if( isDefined( initData["replenish"] ))
{
weaponList = player GetWeaponsListAll();
switch( initData["replenish"] )
{
case "ammo_primary":
foreach ( weaponName in weaponList )
{
if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( weaponName ) )
{
player giveMaxAmmo( weaponName );
}
}
break;
case "equipment":
foreach ( weaponName in weaponList )
{
if ( maps\mp\gametypes\_weapons::isEquipment( weaponName ) )
{
player giveMaxAmmo( weaponName );
}
}
break;
}
}
}
//*******************************************************************
// *
// *
//*******************************************************************
evalLifeStats( player, evalData )
{
ret = 0;
allStatsSatisfied = 1;
if( intelDebugging())
println( "Evaluating Intel on ", player.name );
if( isDefined( evalData ))
{
i = 0;
foreach( intelStat, intelDef in evalData )
{
if( intelStat != "name" )
{
intelStatValue = intelDef["count"];
currStatValue = ( getPlayerStat( intelStat ) - player._intelInitValues[intelStat] );
if( intelDebugging())
println( "Checking ", intelStat, " value ", intelStatValue );
if( currStatValue < intelStatValue )
{
allStatsSatisfied = 0;
}
else
{
currStatValue = intelStatValue;
}
// hud text
hudText = currStatValue + "/" + intelStatValue;
if( player._intelHud["lines"][i]["text"] != hudText )
{
player._intelHud["lines"][i]["text"] = hudText;
player._intelHud["lines"][i]["status"] SetText( hudText );
}
i = i + 1;
}
}
if( allStatsSatisfied == 1 )
{
ret = 1;
}
}
else
{
println( "Could not find evaluation data!\n" );
}
return ret;
}
//*******************************************************************
// *
// *
//*******************************************************************
intelAward( player, awardData )
{
println( "Giving Intel Award to ", player.name );
if( isDefined( awardData ))
{
player thread maps\mp\gametypes\_hud_message::SplashNotify( "intel_completed", awardData["experience"] );
foreach( award, value in awardData )
{
if( award != "name" )
{
println( award, " ", value );
switch( award )
{
case "experience":
self thread awardIntelXp( value, awardData );
break;
default:
println( "Didn't understand how to deal with award type ", award );
}
}
}
}
else
{
println( "No awards found!" );
}
player notify( "intel_cleanup" );
}
//*******************************************************************
// *
// *
//*******************************************************************
// Hud Notificaiton Scripts
//*******************************************************************
// *
// *
//*******************************************************************
awardIntelXp( value, awardData )
{
self endon ( "disconnect" );
wait( 0.25 );
self maps\mp\gametypes\_rank::giveRankXP( "challenge", value );
}
//*******************************************************************
// *
// *
//*******************************************************************
notifyIntelGame()
{
self waittill( "spawned_player" );
if( intelDebugging())
println( "We are playing a game with Intel!" );
self thread maps\mp\gametypes\_hud_message::SplashNotify( "intel_ingame", 0 );
}
//*******************************************************************
// *
// *
//*******************************************************************
intelCardSplashEveryone( splash, owner )
{
if ( level._hardCoreMode )
return;
foreach ( player in level._players )
{
player thread maps\mp\gametypes\_hud_message::playerCardSplashNotify( splash, owner );
}
}
//*******************************************************************
// *
// *
//*******************************************************************
hudIconPulse()
{
self endon( "intel_cleanup" );
origWidth = self._intelHud["icon"].width;
origHeight = self._intelHud["icon"].height;
for(;;)
{
self._intelHud["icon"] scaleOverTime( 0.05, int( origWidth * INTEL_ICON_PULSE_SCALE ), int( origHeight * INTEL_ICON_PULSE_SCALE ) );
wait 0.05;
self._intelHud["icon"] scaleOverTime( 0.3, origWidth, origHeight );
wait 0.3;
wait INTEL_ICON_PULSE_WAIT_SEC;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
createIntelHud()
{
self._intelHud["icon"] = createIcon( level._intelHUDIcon, 40, 40 );
self._intelHud["icon"].horzAlign = "left";
self._intelHud["icon"].alignX = "left";
self._intelHud["icon"].y = 110;
self._intelHud["icon"].sort = -10;
self._intelHud["icon"].color = INTEL_ICON_COLOR;
self thread hudIconPulse();
currY = 130;
self._intelHud["header"] = CreateFontString( "objective", 1.3 );
self._intelHud["header"].horzAlign = "left";
self._intelHud["header"].alignX = "left";
self._intelHud["header"] SetText( &"MP_INTEL_HEADER" );
self._intelHud["header"].y = currY;
self._intelHud["header"].x = 42;
currY += 20;
xIndent = 20;
xOffset = 40;
self._intelHud["lines"][0]["item"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][0]["item"].horizAlign = "left";
self._intelHud["lines"][0]["item"].alignX = "left";
self._intelHud["lines"][0]["item"].y = currY;
self._intelHud["lines"][0]["item"].x = xIndent + xOffset;
self._intelHud["lines"][0]["status"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][0]["status"].horizAlign = "left";
self._intelHud["lines"][0]["status"].alignX = "left";
self._intelHud["lines"][0]["status"].y = currY;
self._intelHud["lines"][0]["status"].x = xIndent;
self._intelHud["lines"][0]["text"] = "";
currY += 20;
self._intelHud["lines"][1]["item"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][1]["item"].horizAlign = "left";
self._intelHud["lines"][1]["item"].alignX = "left";
self._intelHud["lines"][1]["item"].y = currY;
self._intelHud["lines"][1]["item"].x = xIndent + xOffset;
self._intelHud["lines"][1]["status"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][1]["status"].horizAlign = "left";
self._intelHud["lines"][1]["status"].alignX = "left";
self._intelHud["lines"][1]["status"].y = currY;
self._intelHud["lines"][1]["status"].x = xIndent;
self._intelHud["lines"][1]["text"] = "";
currY += 20;
self._intelHud["lines"][2]["item"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][2]["item"].horizAlign = "left";
self._intelHud["lines"][2]["item"].alignX = "left";
self._intelHud["lines"][2]["item"].y = currY;
self._intelHud["lines"][2]["item"].x = xIndent + xOffset;
self._intelHud["lines"][2]["status"] = CreateFontString( "objective", 1.25 );
self._intelHud["lines"][2]["status"].horizAlign = "left";
self._intelHud["lines"][2]["status"].alignX = "left";
self._intelHud["lines"][2]["status"].y = currY;
self._intelHud["lines"][2]["status"].x = xIndent;
self._intelHud["lines"][2]["text"] = "";
}
//*******************************************************************
// *
// *
//*******************************************************************
destroyIntelHud()
{
self._intelHud["icon"] destroy();
self._intelHud["header"] destroy();
self._intelHud["lines"][0]["item"] destroy();
self._intelHud["lines"][0]["status"] destroy();
self._intelHud["lines"][1]["item"] destroy();
self._intelHud["lines"][1]["status"] destroy();
self._intelHud["lines"][2]["item"] destroy();
self._intelHud["lines"][2]["status"] destroy();
}