untyped global function Passives_Init global function InitPassives global function GivePassive global function GivePassiveLifeLong global function GiveTitanPassiveLifeLong global function TakePassive global function TakeAllPassives global function ScanMinimap global function MinimapPlayerConnected global function SoulHasPassive global function ScanMinimapUntilDeath global function GivePlayerPassivesFromSoul global function PrintAllPassives global function IsConscript global function UpdateMinimapStatusToOtherPlayers global function UpdateTitanMinimapStatusToOtherPlayers global function UpdateAIMinimapStatusToOtherPlayers global function UpdateMinimapStatus // moves to minimap script eventually? global function ApplyTitanWeaponPassives global function UpdateScorchHotStreakCoreMeter #if MP global function ApplyFDUpgradeWeaponPassives global function ApplyFDDerviedUpgrades #endif const FD_HOT_STREAK_DAMAGE_MAX = 10000 const FD_HOT_STREAK_DECAY_TIME = 30.0 //1/2 this value until it the hotstreak falls off. 1/2 the value until it goes from full to empty. //const FD_HOT_STREAK_CORE_MULTIPLIER_MAX = 0.5 function Passives_Init() { RegisterSignal( "EndCloakedWallHangs" ) RegisterSignal( "EndCloakedWallruns" ) AddSpawnCallback( "npc_spectre", MinimapNPCSpawned ) AddSpawnCallback( "npc_soldier", MinimapNPCSpawned ) AddDeathCallback( "player", PassiveDeathCallback ) AddCallback_OnTitanGetsNewTitanLoadout( ApplyTitanWeaponPassives ) #if MP if ( GetCurrentPlaylistVarInt( "aegis_upgrades", 0 ) == 1 ) AddCallback_OnUpdateDerivedPlayerTitanLoadout( ApplyFDDerviedUpgrades ) //Half of the meta functions, the other half lives in passives.gnut This is used for class mods. #endif level.wifiLeachInterval <- 2.5 } function InitPassives( entity player ) { player.s.removePassiveOnDeath <- {} } #if MP void function ApplyFDDerviedUpgrades( entity player, TitanLoadoutDef loadout ) { array fdUpgrades = GetAllItemsOfType( eItemTypes.TITAN_FD_UPGRADE ) array upgradeRefs foreach ( ItemData upgrade in fdUpgrades ) { if ( loadout.titanClass == upgrade.parentRef && !IsSubItemLocked( player, upgrade.ref, upgrade.parentRef ) ) { upgradeRefs.append( upgrade.ref ) } } if ( loadout.titanClass == "ronin" ) ApplyDerivedRoninFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "northstar" ) ApplyDerivedNorthstarFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "vanguard" ) ApplyDerivedVanguardFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "ion" ) ApplyDerivedIonFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "tone" ) ApplyDerivedToneFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "scorch" ) ApplyDerivedScorchFDUpgrades( upgradeRefs, loadout ) else if ( loadout.titanClass == "legion" ) ApplyDerivedLegionFDUpgrades( upgradeRefs, loadout ) } void function ApplyFDUpgradeWeaponPassives( entity titan, TitanLoadoutDef loadout ) { entity player if ( titan.IsPlayer() ) player = titan else if ( IsValid( titan.mySpawnOptions_ownerPlayer ) ) player = expect entity( titan.mySpawnOptions_ownerPlayer ) else player = titan.GetBossPlayer() if ( !IsValid( player ) ) return array fdUpgrades = GetAllItemsOfType( eItemTypes.TITAN_FD_UPGRADE ) array upgradeRefs foreach ( ItemData upgrade in fdUpgrades ) { if ( loadout.titanClass == upgrade.parentRef && !IsSubItemLocked( player, upgrade.ref, upgrade.parentRef ) ) upgradeRefs.append( upgrade.ref ) } if ( loadout.titanClass == "ronin" ) ApplyRoninFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "northstar" ) ApplyNorthstarFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "vanguard" ) ApplyVanguardFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "ion" ) ApplyIonFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "tone" ) ApplyToneFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "scorch" ) ApplyScorchFDUpgrades( upgradeRefs, titan, loadout ) else if ( loadout.titanClass == "legion" ) ApplyLegionFDUpgrades( upgradeRefs, titan, loadout ) } void function ApplyDerivedRoninFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_ronin_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyRoninFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_ronin_utility_tier_1": entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "fd_phase_charges" ) weapon.SetMods( mods ) break case "fd_upgrade_ronin_utility_tier_2": entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "fd_phase_distance" ) weapon.SetMods( mods ) break case "fd_upgrade_ronin_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_ronin_weapon_tier_1": entity weapon = titan.GetOffhandWeapon( OFFHAND_MELEE ) array mods = weapon.GetMods() mods.append( "fd_sword_upgrade" ) weapon.SetMods( mods ) break case "fd_upgrade_ronin_weapon_tier_2": entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "fd_sword_block" ) weapon.SetMods( mods ) break case "fd_upgrade_ronin_ultimate": entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "fd_duration" ) weapon.SetMods( mods ) break } } } void function ApplyDerivedNorthstarFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_northstar_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyNorthstarFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_northstar_utility_tier_1": entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "fd_explosive_trap" ) weapon.SetMods( mods ) break case "fd_upgrade_northstar_utility_tier_2": entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "fd_trap_charges" ) weapon.SetMods( mods ) break case "fd_upgrade_northstar_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_northstar_weapon_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_upgrade_charge" ) weapon.SetMods( mods ) break case "fd_upgrade_northstar_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_upgrade_crit" ) weapon.SetMods( mods ) break case "fd_upgrade_northstar_ultimate": entity weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array mods = weapon.GetMods() mods.append( "fd_twin_cluster" ) weapon.SetMods( mods ) break } } } void function ApplyDerivedVanguardFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_vanguard_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyVanguardFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return entity primaryWeapon = titan.GetMainWeapons()[0] array primaryMods = primaryWeapon.GetMods() primaryMods.append( "fd_balance" ) primaryWeapon.SetMods( primaryMods ) entity ordanance = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array ordananceMods = ordanance.GetMods() ordananceMods.append( "fd_balance" ) ordanance.SetMods( ordananceMods ) foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_vanguard_utility_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_vanguard_utility_1" ) weapon.SetMods( mods ) break case "fd_upgrade_vanguard_utility_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_vanguard_utility_2" ) weapon.SetMods( mods ) break case "fd_upgrade_vanguard_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_vanguard_weapon_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_vanguard_weapon_1" ) weapon.SetMods( mods ) break case "fd_upgrade_vanguard_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_vanguard_weapon_2" ) weapon.SetMods( mods ) break case "fd_upgrade_vanguard_ultimate": if ( SoulHasPassive( soul, ePassives.PAS_VANGUARD_CORE1 ) ) //Has Arc Rounds, Choose Energy Transfer or Missile Racks { if ( RandomIntRange( 1, 100 ) <= 50 ) { entity offhandWeapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) if ( IsValid( offhandWeapon ) ) { array mods = offhandWeapon.GetMods() mods.append( "missile_racks" ) offhandWeapon.SetMods( mods ) } } else { entity offhandWeapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) if ( IsValid( offhandWeapon ) ) { array mods = offhandWeapon.GetMods() mods.append( "energy_transfer" ) offhandWeapon.SetMods( mods ) } } } else if ( SoulHasPassive( soul, ePassives.PAS_VANGUARD_CORE2 ) ) //Has Missile Racks, Choose Energy Transfer or Arc Rounds { if ( RandomIntRange( 1, 100 ) <= 50 ) { array weapons = GetPrimaryWeapons( titan ) if ( weapons.len() > 0 ) { entity primaryWeapon = weapons[0] if ( IsValid( primaryWeapon ) ) { array mods = primaryWeapon.GetMods() mods.append( "arc_rounds" ) primaryWeapon.SetMods( mods ) primaryWeapon.SetWeaponPrimaryClipCount( primaryWeapon.GetWeaponPrimaryClipCountMax() ) } } } else { entity offhandWeapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) if ( IsValid( offhandWeapon ) ) { array mods = offhandWeapon.GetMods() mods.append( "energy_transfer" ) offhandWeapon.SetMods( mods ) } } } else if ( SoulHasPassive( soul, ePassives.PAS_VANGUARD_CORE3 ) ) //Has Energy Transfer, Choose Arc Rounds or Missile Racks { if ( RandomIntRange( 1, 100 ) <= 50 ) { array weapons = GetPrimaryWeapons( titan ) if ( weapons.len() > 0 ) { entity primaryWeapon = weapons[0] if ( IsValid( primaryWeapon ) ) { array mods = primaryWeapon.GetMods() mods.append( "arc_rounds" ) primaryWeapon.SetMods( mods ) primaryWeapon.SetWeaponPrimaryClipCount( primaryWeapon.GetWeaponPrimaryClipCountMax() ) } } } else { entity offhandWeapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) if ( IsValid( offhandWeapon ) ) { array mods = offhandWeapon.GetMods() mods.append( "missile_racks" ) offhandWeapon.SetMods( mods ) } } } break } } } void function ApplyDerivedIonFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_ion_utility_tier_1": loadout.setFileMods.append( "fd_energy_regen" ) break case "fd_upgrade_ion_utility_tier_2": loadout.setFileMods.append( "fd_energy_max" ) break case "fd_upgrade_ion_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyIonFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return entity primaryWeapon = titan.GetMainWeapons()[0] array primaryMods = primaryWeapon.GetMods() primaryMods.append( "fd_balance" ) primaryWeapon.SetMods( primaryMods ) entity ordanance = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array ordananceMods = ordanance.GetMods() ordananceMods.append( "fd_balance" ) ordanance.SetMods( ordananceMods ) //entity utilityWeapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) //array utilityMods = utilityWeapon.GetMods() //utilityMods.append( "fd_balance" ) //utilityWeapon.SetMods( utilityMods ) entity coreWeapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array coreMods = coreWeapon.GetMods() coreMods.append( "fd_balance" ) coreWeapon.SetMods( coreMods ) foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_ion_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_ion_weapon_tier_1": entity ordanance = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array ordananceMods = ordanance.GetMods() ordananceMods.append( "fd_laser_upgrade" ) ordanance.SetMods( ordananceMods ) break case "fd_upgrade_ion_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_split_shot_cost" ) weapon.SetMods( mods ) break case "fd_upgrade_ion_ultimate": entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "fd_laser_cannon" ) weapon.SetMods( mods ) break } } } void function ApplyDerivedToneFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_tone_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyToneFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_tone_utility_tier_1": entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "fd_sonar_duration" ) weapon.SetMods( mods ) break case "fd_upgrade_tone_utility_tier_2": entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "fd_sonar_damage_amp" ) weapon.SetMods( mods ) break case "fd_upgrade_tone_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_tone_weapon_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_splasher_rounds" ) weapon.SetMods( mods ) break case "fd_upgrade_tone_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_tone_weapon_2" ) weapon.SetMods( mods ) weapon.SetWeaponPrimaryClipCount( weapon.GetWeaponPrimaryClipCountMax() ) break case "fd_upgrade_tone_ultimate": entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "fd_salvo_core" ) weapon.SetMods( mods ) break } } } void function ApplyDerivedScorchFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_scorch_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyScorchFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_scorch_utility_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_hot_streak" ) weapon.SetMods( mods ) break case "fd_upgrade_scorch_utility_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_fire_damage_upgrade" ) weapon.SetMods( mods ) break case "fd_upgrade_scorch_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_scorch_weapon_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() if ( !mods.contains( "fd_wpn_upgrade_2" ) ) { mods.append( "fd_wpn_upgrade_1" ) weapon.SetMods( mods ) weapon.SetWeaponPrimaryClipCount( weapon.GetWeaponPrimaryClipCountMax() ) } break case "fd_upgrade_scorch_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.fastremovebyvalue( "fd_wpn_upgrade_1" ) mods.append( "fd_wpn_upgrade_2" ) weapon.SetMods( mods ) weapon.SetWeaponPrimaryClipCount( weapon.GetWeaponPrimaryClipCountMax() ) break case "fd_upgrade_scorch_ultimate": entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "fd_explosive_barrel" ) weapon.SetMods( mods ) break } } } void function ApplyDerivedLegionFDUpgrades( array upgradeRefs, TitanLoadoutDef loadout ) { foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_legion_defense_tier_1": loadout.setFileMods.append( "fd_health_upgrade" ) break } } } void function ApplyLegionFDUpgrades( array upgradeRefs, entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return foreach ( upgrade in upgradeRefs ) { switch ( upgrade ) { case "fd_upgrade_legion_utility_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_closerange_helper" ) weapon.SetMods( mods ) break case "fd_upgrade_legion_utility_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_longrange_helper" ) weapon.SetMods( mods ) break case "fd_upgrade_legion_defense_tier_2": float titanShieldHealth = GetTitanSoulShieldHealth( soul ) soul.SetShieldHealthMax( int( titanShieldHealth * 1.5 ) ) break case "fd_upgrade_legion_weapon_tier_1": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_piercing_shots" ) weapon.SetMods( mods ) break case "fd_upgrade_legion_weapon_tier_2": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "fd_gun_shield_redirect" ) weapon.SetMods( mods ) break case "fd_upgrade_legion_ultimate": entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() if ( !mods.contains( "pas_legion_weapon" ) ) { mods.append( "pas_legion_weapon" ) weapon.SetMods( mods ) weapon.SetWeaponPrimaryClipCount( weapon.GetWeaponPrimaryClipCountMax() ) } if ( !mods.contains( "pas_legion_spinup" ) ) { mods.append( "pas_legion_spinup" ) weapon.SetMods( mods ) } weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) mods = weapon.GetMods() if ( !mods.contains( "pas_legion_smartcore" ) ) { mods.append( "pas_legion_smartcore" ) } weapon.SetMods( mods ) weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) mods = weapon.GetMods() if ( !mods.contains( "pas_legion_chargeshot" ) ) { mods.append( "pas_legion_chargeshot" ) } weapon.SetMods( mods ) weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) mods = weapon.GetMods() mods.append( "fd_gun_shield" ) weapon.SetMods( mods ) break } } } #endif void function ApplyTitanWeaponPassives( entity titan, TitanLoadoutDef loadout ) { entity soul = titan.GetTitanSoul() if ( !IsValid( soul ) ) //Ejecting return if ( loadout.titanClass == "ronin" && loadout.isPrime == "titan_is_prime" ) { array offhandSlots = [ OFFHAND_MELEE, OFFHAND_LEFT, OFFHAND_RIGHT ] foreach ( slot in offhandSlots ) { entity weapon = titan.GetOffhandWeapon( slot ) array mods = weapon.GetMods() mods.append( "modelset_prime" ) weapon.SetMods( mods ) } } foreach ( passive, value in soul.passives ) { if ( !value ) continue switch ( passive ) { case ePassives.PAS_ION_TRIPWIRE: entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "pas_ion_tripwire" ) weapon.SetMods( mods ) break case ePassives.PAS_ION_VORTEX: entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "pas_ion_vortex" ) weapon.SetMods( mods ) break case ePassives.PAS_ION_LASERCANNON: entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "pas_ion_lasercannon" ) weapon.SetMods( mods ) break case ePassives.PAS_ION_WEAPON_ADS: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_ion_weapon_ads" ) weapon.SetMods( mods ) break case ePassives.PAS_NORTHSTAR_WEAPON: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_northstar_weapon" ) weapon.SetMods( mods ) break case ePassives.PAS_NORTHSTAR_TRAP: entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "pas_northstar_trap" ) weapon.SetMods( mods ) break case ePassives.PAS_NORTHSTAR_CLUSTER: entity weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array mods = weapon.GetMods() mods.append( "pas_northstar_cluster" ) weapon.SetMods( mods ) break case ePassives.PAS_NORTHSTAR_OPTICS: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_northstar_optics" ) weapon.SetMods( mods ) break case ePassives.PAS_SCORCH_SELFDMG: soul.SetPreventCrits( true ) break case ePassives.PAS_SCORCH_WEAPON: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_scorch_weapon" ) weapon.SetMods( mods ) break case ePassives.PAS_SCORCH_SHIELD: entity weapon = titan.GetOffhandWeapon( OFFHAND_LEFT ) array mods = weapon.GetMods() mods.append( "pas_scorch_shield" ) weapon.SetMods( mods ) break case ePassives.PAS_SCORCH_FIREWALL: entity weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array mods = weapon.GetMods() mods.append( "pas_scorch_firewall" ) weapon.SetMods( mods ) break case ePassives.PAS_SCORCH_FLAMECORE: entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "pas_scorch_flamecore" ) weapon.SetMods( mods ) break case ePassives.PAS_LEGION_WEAPON: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_legion_weapon" ) weapon.SetMods( mods ) int max = weapon.GetWeaponPrimaryClipCountMax() weapon.SetWeaponPrimaryClipCount( max ) break case ePassives.PAS_LEGION_SPINUP: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_legion_spinup" ) weapon.SetMods( mods ) break case ePassives.PAS_LEGION_SMARTCORE: entity weapon = titan.GetOffhandWeapon( OFFHAND_EQUIPMENT ) array mods = weapon.GetMods() mods.append( "pas_legion_smartcore" ) weapon.SetMods( mods ) break case ePassives.PAS_LEGION_CHARGESHOT: entity weapon = titan.GetOffhandWeapon( OFFHAND_ORDNANCE ) array mods = weapon.GetMods() mods.append( "pas_legion_chargeshot" ) weapon.SetMods( mods ) break case ePassives.PAS_TONE_WEAPON: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_tone_weapon" ) weapon.SetMods( mods ) break case ePassives.PAS_TONE_BURST: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_tone_burst" ) weapon.SetMods( mods ) break case ePassives.PAS_TONE_ROCKETS: entity weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array mods = weapon.GetMods() mods.append( "pas_tone_rockets" ) weapon.SetMods( mods ) break case ePassives.PAS_TONE_SONAR: entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "pas_tone_sonar" ) weapon.SetMods( mods ) break case ePassives.PAS_RONIN_WEAPON: entity weapon = titan.GetMainWeapons()[0] array mods = weapon.GetMods() mods.append( "pas_ronin_weapon" ) weapon.SetMods( mods ) break case ePassives.PAS_RONIN_ARCWAVE: entity weapon = titan.GetOffhandWeapon( OFFHAND_RIGHT ) array mods = weapon.GetMods() mods.append( "pas_ronin_arcwave" ) weapon.SetMods( mods ) break case ePassives.PAS_RONIN_PHASE: entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "pas_ronin_phase" ) weapon.SetMods( mods ) break case ePassives.PAS_VANGUARD_REARM: entity weapon = titan.GetOffhandWeapon( OFFHAND_ANTIRODEO ) array mods = weapon.GetMods() mods.append( "pas_vanguard_rearm" ) weapon.SetMods( mods ) break } } #if MP if ( GetCurrentPlaylistVarInt( "aegis_upgrades", 0 ) == 1 ) //Necessary to occur after normal weapon mods are assigned from passives. ApplyFDUpgradeWeaponPassives( titan, loadout ) #endif } function GivePassive( entity player, int passive ) { if ( IsSoul( player ) ) { entity soul = player Assert( passive in level.titanPassives, "This is not a titan passive" ) soul.passives[ passive ] = true entity titan = soul.GetTitan() if ( IsValid( titan ) && titan.IsPlayer() ) GiveTitanPassiveLifeLong( titan, passive ) //This actually loops back around to GivePassive return } // printt( "give passive " + GetPassiveName( passive ), passive ) player.GivePassive( passive ) // enter/exit functions for specific passives switch ( passive ) { case ePassives.PAS_MINIMAP_AI: case ePassives.PAS_MINIMAP_ALL: case ePassives.PAS_MINIMAP_PLAYERS: UpdateMinimapStatus( player ) break case ePassives.PAS_CONSCRIPT: thread PlayerConscription( player ) break case ePassives.PAS_WIFI_SPECTRE: thread PlayerSpectreWifi( player ) break case ePassives.PAS_FAST_SWAP: player.GiveExtraWeaponMod( "pas_fast_swap" ) break case ePassives.PAS_POWER_CELL: player.GiveExtraWeaponMod( "pas_power_cell" ) break case ePassives.PAS_WALLHANG: player.GiveExtraWeaponMod( "pas_wallhang" ) break case ePassives.PAS_FAST_HEALTH_REGEN: player.GiveExtraWeaponMod( "pas_fast_health_regen" ) break case ePassives.PAS_DEFENSIVE_CORE: player.GiveExtraWeaponMod( "pas_defensive_core" ) break case ePassives.PAS_RUN_AND_GUN: player.GiveExtraWeaponMod( "pas_run_and_gun" ) break case ePassives.PAS_ORDNANCE_PACK: player.GiveExtraWeaponMod( "pas_ordnance_pack" ) break case ePassives.PAS_FAST_RELOAD: player.GiveExtraWeaponMod( "pas_fast_reload" ) break case ePassives.PAS_ASSAULT_REACTOR: player.GiveExtraWeaponMod( "mod_ordnance_core" ) break case ePassives.PAS_MARATHON_CORE: player.GiveExtraWeaponMod( "mod_marathon_core" ) break case ePassives.PAS_CLOAKED_WALLHANG: thread CloakedWallHangs( player ) break case ePassives.PAS_CLOAKED_WALLRUN: thread CloakedWallruns( player ) break case ePassives.PAS_SMOKE_SIGHT: Remote_CallFunction_Replay( player, "ServerCallback_BeginSmokeSight" ) break } } string function GetPassiveName( int passive ) { Assert( passive in level.passiveEnumFromPassive, "Passive bitfield: " + passive + " does not exist" ) return expect string( level.passiveEnumFromPassive[ passive ] ) } function TakePassive( entity player, int passive ) { if ( IsSoul( player ) ) { entity soul = player Assert( passive in level.titanPassives, "This is not a titan passive" ) soul.passives[ passive ] = false entity titan = soul.GetTitan() if ( IsValid( titan ) && titan.IsPlayer() ) TakePassive( titan, passive ) return } //printt( "take passive " + PassiveEnumFromBitfield( passive ) ) player.RemovePassive( passive ) // enter/exit functions for specific passives switch ( passive ) { case ePassives.PAS_MINIMAP_AI: case ePassives.PAS_MINIMAP_ALL: case ePassives.PAS_MINIMAP_PLAYERS: UpdateMinimapStatus( player ) break case ePassives.PAS_FAST_SWAP: player.TakeExtraWeaponMod( "pas_fast_swap" ) break case ePassives.PAS_POWER_CELL: player.TakeExtraWeaponMod( "pas_power_cell" ) break case ePassives.PAS_WALLHANG: player.TakeExtraWeaponMod( "pas_wallhang" ) break case ePassives.PAS_FAST_HEALTH_REGEN: player.TakeExtraWeaponMod( "pas_fast_health_regen" ) break case ePassives.PAS_DEFENSIVE_CORE: player.TakeExtraWeaponMod( "pas_defensive_core" ) break case ePassives.PAS_RUN_AND_GUN: player.TakeExtraWeaponMod( "pas_run_and_gun" ) break case ePassives.PAS_ORDNANCE_PACK: player.TakeExtraWeaponMod( "pas_ordnance_pack" ) break case ePassives.PAS_FAST_RELOAD: player.TakeExtraWeaponMod( "pas_fast_reload" ) break case ePassives.PAS_ASSAULT_REACTOR: player.TakeExtraWeaponMod( "mod_ordnance_core" ) break case ePassives.PAS_MARATHON_CORE: player.TakeExtraWeaponMod( "mod_marathon_core" ) break case ePassives.PAS_CLOAKED_WALLHANG: player.Signal( "EndCloakedWallHangs" ) break case ePassives.PAS_CLOAKED_WALLRUN: player.Signal( "EndCloakedWallruns" ) break case ePassives.PAS_SMOKE_SIGHT: Remote_CallFunction_Replay( player, "ServerCallback_EndSmokeSight" ) break } } void function PassiveDeathCallback( entity player, var damageInfo ) { foreach ( int passive in player.s.removePassiveOnDeath ) { TakePassive( player, passive ) } player.s.removePassiveOnDeath = {} } function GivePassiveLifeLong( entity player, int passive ) { //Note: Badness happens if a burn card with passive tries to give a server flag! Assert( !( passive in level.titanPassives ), "This is a titan passive" ) // give the passive for one life player.s.removePassiveOnDeath[ passive ] <- passive GivePassive( player, passive ) } function GiveTitanPassiveLifeLong( entity player, int passive ) { Assert( passive in level.titanPassives, "This is a titan passive" ) // give the passive for one life player.s.removePassiveOnDeath[ passive ] <- passive GivePassive( player, passive ) } function TakeAllPassives( entity player ) { foreach( passiveName, passive in _PassiveFromEnum ) { if ( player.HasPassive( passive ) ) TakePassive( player, passive ) } player.ClearExtraWeaponMods() player.s.removePassiveOnDeath = {} } function GivePlayerPassivesFromSoul( entity player, entity soul ) { Assert( player == soul.GetTitan() ) foreach( passiveName, passive in _PassiveFromEnum ) //Since this is just a bitmask, we could just add all the soul's passives directly instead of trying to break it down to its components first like we do here. However, while it is less efficent, it's also easier to debug. { if ( soul.passives[ passive ] ) GiveTitanPassiveLifeLong( player, passive ) } } table function GetRevealParms( entity player ) { table Table = {} if ( player.HasPassive( ePassives.PAS_MINIMAP_ALL ) ) { Table.ai <- true Table.players <- true Table.titans <- true } else { Table.titans <- false if ( player.HasPassive( ePassives.PAS_MINIMAP_PLAYERS ) ) Table.players <- true else Table.players <- false if ( player.HasPassive( ePassives.PAS_MINIMAP_AI ) ) Table.ai <- true else Table.ai <- false } return Table } function UpdateMinimapStatusToOtherPlayers( entity player ) { int team = player.GetTeam() array players = GetPlayerArray() foreach ( otherPlayer in players ) { // teammates are on minimap by default if ( team == otherPlayer.GetTeam() ) continue table reveal = GetRevealParms( expect entity( otherPlayer ) ) if ( reveal.players ) { player.Minimap_AlwaysShow( 0, otherPlayer ) } } } function UpdateTitanMinimapStatusToOtherPlayers( entity titan ) { int team = titan.GetTeam() array players = GetPlayerArray() foreach ( otherPlayer in players ) { // teammates are on minimap by default if ( team == otherPlayer.GetTeam() ) continue table reveal = GetRevealParms( expect entity( otherPlayer ) ) if ( reveal.titans ) { titan.Minimap_AlwaysShow( 0, otherPlayer ) } } } function UpdateAIMinimapStatusToOtherPlayers( entity guy ) { int team = guy.GetTeam() array players = GetPlayerArray() foreach ( otherPlayer in players ) { // teammates are on minimap by default if ( team == otherPlayer.GetTeam() ) continue table reveal = GetRevealParms( expect entity( otherPlayer ) ) if ( reveal.ai ) { guy.Minimap_AlwaysShow( 0, otherPlayer ) } } } function UpdateMinimapStatus( entity player ) { int team = player.GetTeam() table reveal = GetRevealParms( player ) array players = GetPlayerArray() if ( reveal.players ) { foreach ( target in players ) { if ( team != target.GetTeam() ) target.Minimap_AlwaysShow( 0, player ) } } else { foreach ( target in players ) { if ( team != target.GetTeam() ) target.Minimap_DisplayDefault( 0, player ) } } array titans = GetNPCArrayByClass( "npc_titan" ) if ( reveal.titans ) { foreach ( target in titans ) { if ( team != target.GetTeam() ) target.Minimap_AlwaysShow( 0, player ) } } else { foreach ( target in titans ) { if ( team != target.GetTeam() ) target.Minimap_DisplayDefault( 0, player ) } } array ai = GetNPCArrayByClass( "npc_soldier" ) ai.extend( GetNPCArrayByClass( "npc_spectre" ) ) if ( reveal.ai ) { foreach ( target in ai ) { if ( team != target.GetTeam() ) target.Minimap_AlwaysShow( 0, player ) } } else { foreach ( target in ai ) { if ( team != target.GetTeam() ) target.Minimap_DisplayDefault( 0, player ) } } // foreach ( target in ai ) // { // if ( target.GetBossPlayer() == player ) // target.Minimap_AlwaysShow( 0, player ) // } } function ScanMinimapUntilDeath( entity player ) { player.EndSignal( "OnDeath" ) for ( ;; ) { thread ScanMinimap( player, true ) wait 10.0 } } function ScanMinimap( entity player, bool playSound, float displayTime = 3.0 ) { // already has the passive? if ( PlayerHasPassive( player, ePassives.PAS_MINIMAP_ALL ) ) return player.EndSignal( "OnDeath" ) int handle = player.GetEncodedEHandle() Remote_CallFunction_Replay( player, "ServerCallback_MinimapPulse", handle ) OnThreadEnd( function () : ( player ) { if ( IsValid( player ) ) TakePassive( player, ePassives.PAS_MINIMAP_ALL ) } ) GivePassive( player, ePassives.PAS_MINIMAP_ALL ) if ( playSound ) EmitSoundOnEntityOnlyToPlayer( player, player, "Burn_Card_Map_Hack_Radar_Pulse_V1_1P" ) wait displayTime } void function MinimapNPCSpawned( entity guy ) { // show up on minimap for player that has the passive int team = guy.GetTeam() if ( IsIMCOrMilitiaTeam( team ) == false ) return array players = GetPlayerArrayOfEnemies( team ) foreach ( player in players ) { if ( !PlayerRevealsNPCs( player ) ) continue guy.Minimap_AlwaysShow( 0, player ) } } function PlayerRevealsPlayers( entity player ) { return player.HasPassive( ePassives.PAS_MINIMAP_PLAYERS ) || player.HasPassive( ePassives.PAS_MINIMAP_ALL ) } function MinimapPlayerConnected( entity guy ) { int team = guy.GetTeam() array players = GetPlayerArrayOfEnemies( team ) foreach ( player in players ) { if ( !PlayerRevealsPlayers( player ) ) continue guy.Minimap_AlwaysShow( 0, player ) } } function PlayerSpectreWifi( entity player ) { player.EndSignal( "OnDeath" ) for ( ;; ) { if ( !PlayerHasPassive( player, ePassives.PAS_WIFI_SPECTRE ) ) return LeechSurroundingSpectres( player.GetOrigin(), player ) wait level.wifiLeachInterval } } const CLEAR_CONSCRIPTED_GRUNTS_ON_DEATH = false function PlayerConscription( entity player ) { player.EndSignal( "OnDestroy" ) if ( CLEAR_CONSCRIPTED_GRUNTS_ON_DEATH ) { if ( "conscriptedGrunts" in player.s ) return table conscriptedGrunts if ( "conscriptedGrunts" in player.s ) { conscriptedGrunts = expect table( player.s.conscriptedGrunts ) } else { conscriptedGrunts = {} player.s.conscriptedGrunts <- conscriptedGrunts } OnThreadEnd( function () : ( player, conscriptedGrunts ) { ClearConscriptedGrunts( player, conscriptedGrunts ) } ) } for ( ;; ) { if ( !PlayerHasPassive( player, ePassives.PAS_CONSCRIPT ) ) return if ( IsAlive( player ) ) { ConscriptNearbyGrunts( player ) } wait 1.5 } } function ConscriptNearbyGrunts( entity player ) { int team = player.GetTeam() array grunts = GetNPCArrayEx( "npc_soldier", team, TEAM_ANY, player.GetOrigin(), 220 ) foreach ( grunt in grunts ) { if ( !IsValid( grunt ) ) continue if ( IsAlive( grunt.GetBossPlayer() ) ) continue ConscriptGruntSquad( grunt, player, team ) WaitFrame() } } function ConscriptGrunt( entity grunt, entity player, int team ) { EmitSoundOnEntity( grunt, "BurnCard_Conscription_TurnSoldier" ) grunt.Signal( "StopHardpointBehavior" ) SetTeam( grunt, team ) grunt.SetBossPlayer( player ) grunt.SetTitle( "#NPC_CONSCRIPT" ) grunt.ai.preventOwnerDamage = true #if HAS_STATS UpdatePlayerStat( player, "misc_stats", "gruntsConscripted", 1 ) #endif if ( CLEAR_CONSCRIPTED_GRUNTS_ON_DEATH ) { player.s.conscriptedGrunts[ grunt ] <- grunt // printt( player + " Conscripted " + grunt + " to squadname " + grunt.kv.squadname ) } } function MakePlayerSquad( entity player ) { string squad = "player" + player.entindex() + "gruntSquad" int index = 0 string squadName = squad + index for ( ;; ) { if ( GetNPCSquadSize( squadName ) == 0 ) return squadName index++ squadName = squad + index } } function ConscriptGruntSquad( entity grunt, entity player, int team ) { array grunts string gruntSquad = expect string( grunt.Get( "squadname" ) ) if ( gruntSquad == "" ) grunts.append( grunt ) else grunts = GetNPCArrayBySquad( gruntSquad ) foreach ( guy in grunts ) { if ( IsAlive( guy.GetBossPlayer() ) ) continue if ( guy.GetTeam() != team ) continue ConscriptGrunt( guy, player, team ) } } function ClearConscriptedGrunts( entity player, table conscriptedGrunts ) { foreach ( grunt in conscriptedGrunts ) { expect entity( grunt ) if ( !IsAlive( grunt ) ) continue entity owner = grunt.GetBossPlayer() if ( IsValid( owner ) && owner != player ) continue grunt.ClearBossPlayer() asset model = grunt.GetModelName() int team if ( model.find( "imc" ) != null ) { team = TEAM_IMC } else { team = TEAM_MILITIA } var title = grunt.GetSettingTitle() if ( title != null && title != "" ) { grunt.SetTitle( title ) FixupTitle( grunt ) } grunt.Signal( "StopHardpointBehavior" ) SetTeam( grunt, team ) } delete player.s.conscriptedGrunts } bool function IsConscript( entity guy ) { return IsAlive( guy.GetBossPlayer() ) } bool function SoulHasPassive( entity soul, int passive ) { return expect bool( soul.passives[ passive ] ) } function PrintAllPassives( entity player ) { foreach( passiveName, passive in _PassiveFromEnum ) { if ( player.HasPassive( passive ) ) printt( "Player " + player + " has passive: " + passiveName ) } } function CloakedWallHangs( entity player ) { player.Signal( "EndCloakedWallHangs" ) player.EndSignal( "EndCloakedWallHangs" ) player.EndSignal( "OnDeath" ) player.EndSignal( "OnDestroy" ) float cloakStartTime float rechargeStartTime if ( !( "wallHangCloakDuration" in player.s ) ) player.s.wallHangCloakDuration <- WALLHANG_CLOAK_DURATION OnThreadEnd( function() : ( player ) { if ( !IsValid( player ) ) return if ( IsCloaked( player ) ) DisableCloak( player, 0 ) } ) while ( true ) { while ( !player.IsWallHanging() ) { rechargeStartTime = Time() WaitFrame() player.s.wallHangCloakDuration += Time() - rechargeStartTime if ( player.s.wallHangCloakDuration > WALLHANG_CLOAK_DURATION ) player.s.wallHangCloakDuration = WALLHANG_CLOAK_DURATION } if ( !IsCloaked( player ) && player.s.wallHangCloakDuration ) EnableCloak( player, expect float( player.s.wallHangCloakDuration ), WALLHANG_CLOAK_TRANSITION_TIME ) while ( player.s.wallHangCloakDuration && player.IsWallHanging() ) { cloakStartTime = Time() WaitFrame() player.s.wallHangCloakDuration -= Time() - cloakStartTime if ( player.s.wallHangCloakDuration < 0 ) player.s.wallHangCloakDuration = 0 } if ( IsCloaked( player ) ) DisableCloak( player, WALLHANG_CLOAK_TRANSITION_TIME ) if ( player.IsWallHanging() ) WaitFrame() } } function CloakedWallruns( entity player ) { player.Signal( "EndCloakedWallruns" ) player.EndSignal( "EndCloakedWallruns" ) player.EndSignal( "OnDeath" ) float cloakStartTime float rechargeStartTime if ( !( "wallRunCloakDuration" in player.s ) ) player.s.wallRunCloakDuration <- WALLRUN_CLOAK_DURATION OnThreadEnd( function() : ( player ) { if ( !IsValid( player ) ) return if ( IsCloaked( player ) ) DisableCloak( player, 0 ) } ) while ( true ) { while ( !player.IsWallRunning() ) { rechargeStartTime = Time() WaitFrame() player.s.wallRunCloakDuration += Time() - rechargeStartTime if ( player.s.wallRunCloakDuration > WALLRUN_CLOAK_DURATION ) player.s.wallRunCloakDuration = WALLRUN_CLOAK_DURATION } if ( !IsCloaked( player ) && player.s.wallRunCloakDuration ) EnableCloak( player, expect float( player.s.wallRunCloakDuration ), WALLRUN_CLOAK_TRANSITION_TIME ) while ( player.s.wallRunCloakDuration && player.IsWallRunning() ) { cloakStartTime = Time() WaitFrame() player.s.wallRunCloakDuration -= Time() - cloakStartTime if ( player.s.wallRunCloakDuration < 0 ) player.s.wallRunCloakDuration = 0 } if ( IsCloaked( player ) ) DisableCloak( player, WALLRUN_CLOAK_TRANSITION_TIME ) if ( player.IsWallRunning() ) WaitFrame() } } //To avoid threads and callbacks, this is using any netFloat > 0.5 to mean full CoreMeter scaling. void function UpdateScorchHotStreakCoreMeter( entity attacker, float damage ) { if ( !attacker.IsPlayer() ) return float baseValue = attacker.GetPlayerNetFloat( "coreMeterModifier" ) float newValue = damage / FD_HOT_STREAK_DAMAGE_MAX * 0.5 float combinedValue = baseValue + newValue if ( baseValue + newValue >= 0.5 ) combinedValue = 1.0 attacker.SetPlayerNetFloat( "coreMeterModifier", combinedValue ) attacker.SetPlayerNetFloatOverTime( "coreMeterModifier", 0.0, FD_HOT_STREAK_DECAY_TIME ) }