655 lines
31 KiB
C++
655 lines
31 KiB
C++
#include "cbase.h"
|
|
|
|
#ifdef CLIENT_DLL
|
|
#include "c_asw_marine.h"
|
|
#include "c_asw_marine_resource.h"
|
|
#include "c_asw_game_resource.h"
|
|
#define CASW_Marine C_ASW_Marine
|
|
#define CASW_Marine_Resource C_ASW_Marine_Resource
|
|
#define CASW_Game_Resource C_ASW_Game_Resource
|
|
#else
|
|
#include "asw_marine.h"
|
|
#include "asw_marine_resource.h"
|
|
#include "asw_game_resource.h"
|
|
#endif
|
|
#include "asw_marine_skills.h"
|
|
#include "asw_marine_profile.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
// base convars
|
|
ConVar asw_skill_leadership_accuracy_chance_base("asw_skill_leadership_accuracy_chance_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_leadership_damage_resist_base("asw_skill_leadership_damage_resist_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_vindicator_dmg_base("asw_skill_vindicator_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_vindicator_pellets_base("asw_skill_vindicator_pellets_base", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_autogun_base("asw_skill_autogun_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_piercing_base("asw_skill_piercing_base", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_healing_charges_base("asw_skill_healing_charges_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_self_healing_charges_base("asw_skill_self_healing_charges_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_medkit_hps_base("asw_skill_healing_medkit_hps_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_hps_base("asw_skill_healing_hps_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_grenade_base("asw_skill_healing_grenade_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_gun_charges_base("asw_skill_healing_gun_charges_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_gun_base("asw_skill_healing_gun_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_xenowounds_base("asw_skill_xenowounds_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_drugs_base("asw_skill_drugs_base", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_hacking_speed_base("asw_skill_hacking_speed_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_scanner_base("asw_skill_scanner_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_engineering_welding_base("asw_skill_engineering_welding_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_engineering_sentry_base("asw_skill_engineering_sentry_base", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_grenades_radius_base("asw_skill_grenades_radius_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_dmg_base("asw_skill_grenades_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_incendiary_dmg_base("asw_skill_grenades_incendiary_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_cluster_dmg_base("asw_skill_grenades_cluster_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_clusters_base("asw_skill_grenades_clusters_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_flechette_dmg_base("asw_skill_grenades_flechette_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_dmg_base("asw_skill_grenades_hornet_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_count_base("asw_skill_grenades_hornet_count_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_interval_base("asw_skill_grenades_hornet_interval_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_freeze_radius_base("asw_skill_grenades_freeze_radius_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_freeze_duration_base("asw_skill_grenades_freeze_duration_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_smart_count_base("asw_skill_grenades_smart_count_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_smart_interval_base("asw_skill_grenades_smart_interval_base", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_health_base("asw_skill_health_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_dmg_base("asw_skill_melee_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_force_base("asw_skill_melee_force_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_speed_base("asw_skill_melee_speed_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_reloading_base("asw_skill_reloading_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_reloading_fast_base( "asw_skill_reloading_fast_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_agility_movespeed_base("asw_skill_agility_movespeed_base", "0", FCVAR_REPLICATED );
|
|
|
|
// step convars
|
|
ConVar asw_skill_leadership_accuracy_chance_step("asw_skill_leadership_accuracy_chance_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_leadership_damage_resist_step("asw_skill_leadership_damage_resist_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_vindicator_dmg_step("asw_skill_vindicator_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_vindicator_pellets_step("asw_skill_vindicator_pellets_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_autogun_step("asw_skill_autogun_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_piercing_step("asw_skill_piercing_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_healing_charges_step("asw_skill_healing_charges_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_self_healing_charges_step("asw_skill_self_healing_charges_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_hps_step("asw_skill_healing_hps_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_grenade_step("asw_skill_healing_grenade_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_gun_charges_step("asw_skill_healing_gun_charges_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_gun_step("asw_skill_healing_gun_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_healing_medkit_hps_step("asw_skill_healing_medkit_hps_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_xenowounds_step("asw_skill_xenowounds_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_drugs_step("asw_skill_drugs_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_hacking_speed_step("asw_skill_hacking_speed_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_scanner_step("asw_skill_scanner_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_engineering_welding_step("asw_skill_engineering_welding_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_engineering_sentry_step("asw_skill_engineering_sentry_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_grenades_radius_step("asw_skill_grenades_radius_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_dmg_step("asw_skill_grenades_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_incendiary_dmg_step("asw_skill_grenades_incendiary_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_cluster_dmg_step("asw_skill_grenades_cluster_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_clusters_step("asw_skill_grenades_clusters_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_flechette_dmg_step("asw_skill_grenades_flechette_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_dmg_step("asw_skill_grenades_hornet_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_count_step("asw_skill_grenades_hornet_count_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_hornet_interval_step("asw_skill_grenades_hornet_interval_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_freeze_radius_step("asw_skill_grenades_freeze_radius_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_freeze_duration_step("asw_skill_grenades_freeze_duration_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_smart_count_step("asw_skill_grenades_smart_count_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_grenades_smart_interval_step("asw_skill_grenades_smart_interval_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_health_step("asw_skill_health_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_dmg_step("asw_skill_melee_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_force_step("asw_skill_melee_force_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_melee_speed_step("asw_skill_melee_speed_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_reloading_step("asw_skill_reloading_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_reloading_fast_step( "asw_skill_reloading_fast_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_agility_movespeed_step("asw_skill_agility_movespeed_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_agility_reload_step("asw_skill_agility_reload_step", "0", FCVAR_REPLICATED );
|
|
|
|
ConVar asw_skill_mines_fires_base("asw_skill_mines_fires_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_mines_fires_step("asw_skill_mines_fires_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_mines_duration_base("asw_skill_mines_duration_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_mines_duration_step("asw_skill_mines_duration_step", "0", FCVAR_REPLICATED );
|
|
|
|
// accuracy convars
|
|
ConVar asw_skill_accuracy_rifle_dmg_base("asw_skill_accuracy_rifle_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_rifle_dmg_step("asw_skill_accuracy_rifle_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_prifle_dmg_base("asw_skill_accuracy_prifle_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_prifle_dmg_step("asw_skill_accuracy_prifle_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_shotgun_dmg_base("asw_skill_accuracy_shotgun_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_shotgun_dmg_step("asw_skill_accuracy_shotgun_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_railgun_dmg_base("asw_skill_accuracy_railgun_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_railgun_dmg_step("asw_skill_accuracy_railgun_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_flamer_dmg_base("asw_skill_accuracy_flamer_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_flamer_dmg_step("asw_skill_accuracy_flamer_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_pistol_dmg_base("asw_skill_accuracy_pistol_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_pistol_dmg_step("asw_skill_accuracy_pistol_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_pdw_dmg_base("asw_skill_accuracy_pdw_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_pdw_dmg_step("asw_skill_accuracy_pdw_dmg_step", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_muzzle_flash_base("asw_skill_muzzle_flash_base", "1.0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_muzzle_flash_step("asw_skill_muzzle_flash_step", "0.2", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_sniper_rifle_dmg_base("asw_skill_accuracy_sniper_rifle_dmg_base", "0", FCVAR_REPLICATED );
|
|
ConVar asw_skill_accuracy_sniper_rifle_dmg_step("asw_skill_accuracy_sniper_rifle_dmg_step", "0", FCVAR_REPLICATED );
|
|
|
|
namespace
|
|
{
|
|
float MuzzleFlashScale(int iSkillPoints)
|
|
{
|
|
return asw_skill_muzzle_flash_base.GetFloat() + (asw_skill_muzzle_flash_step.GetFloat() * (float)iSkillPoints);
|
|
}
|
|
};
|
|
|
|
CASW_Marine_Skills::CASW_Marine_Skills()
|
|
{
|
|
#ifndef CLIENT_DLL
|
|
m_hLastSkillMarine = NULL;
|
|
#endif
|
|
}
|
|
|
|
// accessor functions to get at any game variables that are based on a skill
|
|
float CASW_Marine_Skills::GetSkillBasedValueByMarine(CASW_Marine *pMarine, ASW_Skill iSkillIndex, int iSubSkill)
|
|
{
|
|
if (!pMarine || !pMarine->GetMarineProfile())
|
|
return 0;
|
|
return GetSkillBasedValue(pMarine->GetMarineProfile(), iSkillIndex, iSubSkill);
|
|
}
|
|
|
|
float CASW_Marine_Skills::GetSkillBasedValueByMarineResource(CASW_Marine_Resource *pMarineResource, ASW_Skill iSkillIndex, int iSubSkill)
|
|
{
|
|
if (!pMarineResource)
|
|
return 0;
|
|
|
|
return GetSkillBasedValue(pMarineResource->GetProfile(), iSkillIndex, iSubSkill);
|
|
}
|
|
|
|
float CASW_Marine_Skills::GetSkillBasedValue( CASW_Marine_Profile *pProfile, ASW_Skill iSkillIndex, int iSubSkill, int iSkillPoints )
|
|
{
|
|
if ( !ASWGameResource() || !MarineProfileList() || !pProfile )
|
|
return 0;
|
|
|
|
int iProfileIndex = pProfile->m_ProfileIndex;
|
|
if (iProfileIndex < 0 || iProfileIndex >=MarineProfileList()->m_NumProfiles)
|
|
return 0;
|
|
|
|
int nSkillSlot = ASWGameResource()->GetSlotForSkill( iProfileIndex, iSkillIndex );
|
|
if ( nSkillSlot == -1 )
|
|
{
|
|
iSkillPoints = 0; // assume zero skill points if the marine doesn't have this skill
|
|
}
|
|
else if (iSkillPoints == -1)
|
|
{
|
|
// get the skill points from the ASWGameResource
|
|
iSkillPoints = ASWGameResource()->GetMarineSkill(iProfileIndex, nSkillSlot);
|
|
}
|
|
|
|
switch (iSkillIndex)
|
|
{
|
|
case ASW_MARINE_SKILL_LEADERSHIP:
|
|
if ( iSkillPoints <= 0 )
|
|
return 0.0f;
|
|
if (iSubSkill == ASW_MARINE_SUBSKILL_LEADERSHIP_ACCURACY_CHANCE)
|
|
return asw_skill_leadership_accuracy_chance_base.GetFloat() + asw_skill_leadership_accuracy_chance_step.GetFloat() * iSkillPoints;
|
|
else // ASW_MARINE_SUBSKILL_LEADERSHIP_DAMAGE_RESIST
|
|
return asw_skill_leadership_damage_resist_base.GetFloat() + asw_skill_leadership_damage_resist_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_VINDICATOR:
|
|
if (iSubSkill == ASW_MARINE_SUBSKILL_VINDICATOR_DAMAGE)
|
|
return asw_skill_vindicator_dmg_base.GetFloat() + asw_skill_vindicator_dmg_step.GetFloat() * iSkillPoints;
|
|
else if (iSubSkill == ASW_MARINE_SUBSKILL_VINDICATOR_PELLETS)
|
|
return asw_skill_vindicator_pellets_base.GetFloat() + asw_skill_vindicator_pellets_step.GetFloat() * iSkillPoints;
|
|
else // ASW_MARINE_SUBSKILL_VINDICATOR_MUZZLE
|
|
return MuzzleFlashScale(iSkillPoints);
|
|
break;
|
|
case ASW_MARINE_SKILL_AUTOGUN:
|
|
if (iSubSkill == ASW_MARINE_SUBSKILL_AUTOGUN_DMG)
|
|
return asw_skill_autogun_base.GetFloat() + asw_skill_autogun_step.GetFloat() * iSkillPoints;
|
|
else // ASW_MARINE_SUBSKILL_AUTOGUN_MUZZLE
|
|
return MuzzleFlashScale(iSkillPoints);
|
|
break;
|
|
case ASW_MARINE_SKILL_STOPPING_POWER:
|
|
return iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_PIERCING:
|
|
return asw_skill_piercing_base.GetFloat() + asw_skill_piercing_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_HEALING:
|
|
switch( iSubSkill )
|
|
{
|
|
case ASW_MARINE_SUBSKILL_HEALING_CHARGES: return asw_skill_healing_charges_base.GetFloat() + asw_skill_healing_charges_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_SELF_HEALING_CHARGES: return asw_skill_self_healing_charges_base.GetFloat() + asw_skill_self_healing_charges_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_HEALING_HPS: return asw_skill_healing_hps_base.GetFloat() + asw_skill_healing_hps_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_HEAL_GRENADE_HEAL_AMOUNT: return asw_skill_healing_grenade_base.GetFloat() + asw_skill_healing_grenade_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_HEAL_GUN_CHARGES: return asw_skill_healing_gun_charges_base.GetFloat() + asw_skill_healing_gun_charges_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_HEAL_GUN_HEAL_AMOUNT: return asw_skill_healing_gun_base.GetFloat() + asw_skill_healing_gun_step.GetFloat() * iSkillPoints; break;
|
|
default: return asw_skill_healing_medkit_hps_base.GetFloat() + asw_skill_healing_medkit_hps_step.GetFloat() * iSkillPoints; break;
|
|
}
|
|
break;
|
|
case ASW_MARINE_SKILL_XENOWOUNDS:
|
|
return asw_skill_xenowounds_base.GetFloat() + asw_skill_xenowounds_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_DRUGS:
|
|
return asw_skill_drugs_base.GetFloat() + asw_skill_drugs_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_HACKING:
|
|
if (iSubSkill == ASW_MARINE_SUBSKILL_HACKING_TUMBLER_COUNT_REDUCTION)
|
|
{
|
|
if (iSkillPoints >= 3)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
else if (iSubSkill == ASW_MARINE_SUBSKILL_HACKING_ENTRIES_PER_TUMBLER_REDUCTION)
|
|
{
|
|
if (iSkillPoints >= 2)
|
|
return 2;
|
|
else if (iSkillPoints >= 4)
|
|
return 4;
|
|
return 0;
|
|
}
|
|
//else if (iSubSkill == ASW_MARINE_SUBSKILL_HACKING_SPEED_SCALE)
|
|
return asw_skill_hacking_speed_base.GetFloat() + asw_skill_hacking_speed_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_SCANNER:
|
|
return asw_skill_scanner_base.GetFloat() + asw_skill_scanner_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_ENGINEERING:
|
|
if ( iSkillPoints <= 0 )
|
|
return 0.0f;
|
|
if (iSubSkill == ASW_MARINE_SUBSKILL_ENGINEERING_WELDING)
|
|
return asw_skill_engineering_welding_base.GetFloat() + asw_skill_engineering_welding_step.GetFloat() * iSkillPoints;
|
|
else
|
|
return asw_skill_engineering_sentry_base.GetFloat() + asw_skill_engineering_sentry_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_ACCURACY:
|
|
switch (iSubSkill)
|
|
{
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_MUZZLE: return MuzzleFlashScale(iSkillPoints); break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_PRIFLE_DMG: return asw_skill_accuracy_prifle_dmg_base.GetFloat() + asw_skill_accuracy_prifle_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_SHOTGUN_DMG: return asw_skill_accuracy_shotgun_dmg_base.GetFloat() + asw_skill_accuracy_shotgun_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_RAILGUN_DMG: return asw_skill_accuracy_railgun_dmg_base.GetFloat() + asw_skill_accuracy_railgun_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_FLAMER_DMG: return asw_skill_accuracy_flamer_dmg_base.GetFloat() + asw_skill_accuracy_flamer_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_PISTOL_DMG: return asw_skill_accuracy_pistol_dmg_base.GetFloat() + asw_skill_accuracy_pistol_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_PDW_DMG: return asw_skill_accuracy_pdw_dmg_base.GetFloat() + asw_skill_accuracy_pdw_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_SNIPER_RIFLE_DMG: return asw_skill_accuracy_sniper_rifle_dmg_base.GetFloat() + asw_skill_accuracy_sniper_rifle_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_ACCURACY_RIFLE_DMG:
|
|
default: return asw_skill_accuracy_rifle_dmg_base.GetFloat() + asw_skill_accuracy_rifle_dmg_step.GetFloat() * iSkillPoints; break;
|
|
}
|
|
break;
|
|
case ASW_MARINE_SKILL_GRENADES:
|
|
switch ( iSubSkill )
|
|
{
|
|
case ASW_MARINE_SUBSKILL_GRENADE_RADIUS: return asw_skill_grenades_radius_base.GetFloat() + asw_skill_grenades_radius_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_CLUSTERS: return asw_skill_grenades_clusters_base.GetFloat() + asw_skill_grenades_clusters_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_INCENDIARY_DMG: return asw_skill_grenades_incendiary_dmg_base.GetFloat() + asw_skill_grenades_incendiary_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_CLUSTER_DMG: return asw_skill_grenades_cluster_dmg_base.GetFloat() + asw_skill_grenades_cluster_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_FLECHETTE_DMG: return asw_skill_grenades_flechette_dmg_base.GetFloat() + asw_skill_grenades_flechette_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_HORNET_DMG: return asw_skill_grenades_hornet_dmg_base.GetFloat() + asw_skill_grenades_hornet_dmg_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_HORNET_COUNT: return asw_skill_grenades_hornet_count_base.GetFloat() + asw_skill_grenades_hornet_count_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_HORNET_INTERVAL: return asw_skill_grenades_hornet_interval_base.GetFloat() + asw_skill_grenades_hornet_interval_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_FREEZE_RADIUS: return asw_skill_grenades_freeze_radius_base.GetFloat() + asw_skill_grenades_freeze_radius_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_FREEZE_DURATION: return asw_skill_grenades_freeze_duration_base.GetFloat() + asw_skill_grenades_freeze_duration_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_SMART_BOMB_COUNT: return asw_skill_grenades_smart_count_base.GetFloat() + asw_skill_grenades_smart_count_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_SMART_BOMB_INTERVAL: return asw_skill_grenades_smart_interval_base.GetFloat() + asw_skill_grenades_smart_interval_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_LASER_MINES: return ( iSkillPoints > 3 ? 3 : ( iSkillPoints > 0 ? 2 : 1 ) ); break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_MINES_FIRES: return asw_skill_mines_fires_base.GetFloat() + asw_skill_mines_fires_step.GetFloat() * iSkillPoints; break;
|
|
case ASW_MARINE_SUBSKILL_GRENADE_MINES_DURATION: return asw_skill_mines_duration_base.GetFloat() + asw_skill_mines_duration_step.GetFloat() * iSkillPoints; break;
|
|
default: return asw_skill_grenades_dmg_base.GetFloat() + asw_skill_grenades_dmg_step.GetFloat() * iSkillPoints; break;
|
|
}
|
|
break;
|
|
case ASW_MARINE_SKILL_HEALTH:
|
|
return asw_skill_health_base.GetFloat() + asw_skill_health_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_MELEE:
|
|
if ( iSubSkill == ASW_MARINE_SUBSKILL_MELEE_DMG )
|
|
{
|
|
return asw_skill_melee_dmg_base.GetFloat() + asw_skill_melee_dmg_step.GetFloat() * iSkillPoints;
|
|
}
|
|
else if (iSubSkill == ASW_MARINE_SUBSKILL_MELEE_FLINCH)
|
|
{
|
|
// return a different length flinch (tiny, small, large) based on our skill points
|
|
if (iSkillPoints <= 1)
|
|
return 0;
|
|
else if (iSkillPoints <= 3)
|
|
return 1;
|
|
else
|
|
return 2;
|
|
}
|
|
else if (iSubSkill == ASW_MARINE_SUBSKILL_MELEE_SPEED)
|
|
{
|
|
return asw_skill_melee_speed_base.GetFloat() + asw_skill_melee_speed_step.GetFloat() * iSkillPoints;
|
|
}
|
|
else
|
|
{
|
|
return asw_skill_melee_force_base.GetFloat() + asw_skill_melee_force_step.GetFloat() * iSkillPoints;
|
|
}
|
|
break;
|
|
case ASW_MARINE_SKILL_RELOADING:
|
|
if ( iSubSkill == ASW_MARINE_SUBSKILL_RELOADING_SPEED_SCALE )
|
|
return asw_skill_reloading_base.GetFloat() + asw_skill_reloading_step.GetFloat() * iSkillPoints;
|
|
else if ( iSubSkill == ASW_MARINE_SUBSKILL_RELOADING_FAST_WIDTH_SCALE )
|
|
return asw_skill_reloading_fast_base.GetFloat() + asw_skill_reloading_fast_step.GetFloat() * iSkillPoints;
|
|
else // ASW_MARINE_SUBSKILL_RELOADING_SOUND
|
|
return iSkillPoints;
|
|
break;
|
|
case ASW_MARINE_SKILL_AGILITY:
|
|
return asw_skill_agility_movespeed_base.GetFloat() + asw_skill_agility_movespeed_step.GetFloat() * iSkillPoints;
|
|
break;
|
|
default:
|
|
Assert( "Unknown marine skill or subskill" );
|
|
return 0;
|
|
break;
|
|
}
|
|
Assert( "Unknown marine skill or subskill" );
|
|
return 0;
|
|
}
|
|
|
|
float CASW_Marine_Skills::GetBestSkillValue(ASW_Skill iSkillIndex, int iSubSkill)
|
|
{
|
|
if ( !ASWGameResource() || !MarineProfileList() )
|
|
return 0;
|
|
|
|
float fBestSkill = -1;
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
|
|
// find the live marine with the highest value for this skill
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR && pMR->GetHealthPercent() > 0 && pMR->IsAlive() && pMR->GetProfile())
|
|
{
|
|
float skill = GetSkillBasedValueByMarineResource(pMR, iSkillIndex, iSubSkill);
|
|
if (skill > fBestSkill)
|
|
fBestSkill = skill;
|
|
}
|
|
}
|
|
return fBestSkill;
|
|
}
|
|
|
|
float CASW_Marine_Skills::GetHighestSkillValueNearby(const Vector &pos, float MaxDistance, ASW_Skill iSkillIndex, int iSubSkill)
|
|
{
|
|
#ifndef CLIENT_DLL
|
|
m_hLastSkillMarine = NULL;
|
|
#endif
|
|
if ( !ASWGameResource() || !MarineProfileList() )
|
|
return 0;
|
|
|
|
float fBestSkill = -1;
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
|
|
// find the live marine with the highest value for this skill
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR && pMR->GetHealthPercent() > 0 && pMR->IsAlive() && pMR->GetProfile() && pMR->GetMarineEntity())
|
|
{
|
|
// check he's near enough
|
|
float dist = pMR->GetMarineEntity()->GetAbsOrigin().DistTo(pos);
|
|
if (dist > MaxDistance)
|
|
continue;
|
|
|
|
float skill = GetSkillBasedValueByMarineResource(pMR, iSkillIndex, iSubSkill);
|
|
if (skill > fBestSkill)
|
|
{
|
|
fBestSkill = skill;
|
|
#ifndef CLIENT_DLL
|
|
m_hLastSkillMarine = pMR->GetMarineEntity();
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
return fBestSkill;
|
|
}
|
|
|
|
float CASW_Marine_Skills::GetLowestSkillValueNearby(const Vector &pos, float MaxDistance, ASW_Skill iSkillIndex, int iSubSkill)
|
|
{
|
|
#ifndef CLIENT_DLL
|
|
m_hLastSkillMarine = NULL;
|
|
#endif
|
|
if ( !ASWGameResource() || !MarineProfileList() )
|
|
return 0;
|
|
|
|
float fBestSkill = -1;
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
|
|
// find the live marine with the highest value for this skill
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR && pMR->GetHealthPercent() > 0 && pMR->IsAlive() && pMR->GetProfile() && pMR->GetMarineEntity())
|
|
{
|
|
// check he's near enough
|
|
float dist = pMR->GetMarineEntity()->GetAbsOrigin().DistTo(pos);
|
|
if (dist > MaxDistance)
|
|
continue;
|
|
|
|
float skill = GetSkillBasedValueByMarineResource(pMR, iSkillIndex, iSubSkill);
|
|
if (fBestSkill == -1 || skill < fBestSkill)
|
|
{
|
|
#ifndef CLIENT_DLL
|
|
m_hLastSkillMarine = pMR->GetMarineEntity();
|
|
#endif
|
|
fBestSkill = skill;
|
|
}
|
|
}
|
|
}
|
|
return fBestSkill;
|
|
}
|
|
|
|
const char* s_szSkillImageName[ ASW_NUM_MARINE_SKILLS ] =
|
|
{
|
|
"swarm/SkillButtons/Leadership", // ASW_MARINE_SKILL_LEADERSHIP = 0,
|
|
"swarm/SkillButtons/Vindicator", // ASW_MARINE_SKILL_VINDICATOR,
|
|
|
|
// special weapons
|
|
"swarm/SkillButtons/Autogun", // ASW_MARINE_SKILL_AUTOGUN,
|
|
"swarm/SkillButtons/Secondary", // ASW_MARINE_SKILL_STOPPING_POWER,
|
|
"swarm/SkillButtons/Piercing", // ASW_MARINE_SKILL_PIERCING,
|
|
|
|
// medic
|
|
"swarm/SkillButtons/Healing", // ASW_MARINE_SKILL_HEALING,
|
|
"swarm/SkillButtons/Xenowound", // ASW_MARINE_SKILL_XENOWOUNDS,
|
|
"swarm/SkillButtons/Drugs", // ASW_MARINE_SKILL_DRUGS,
|
|
|
|
// tech
|
|
"swarm/SkillButtons/Hacking", //ASW_MARINE_SKILL_HACKING,
|
|
"swarm/SkillButtons/Scanner", // 3ASW_MARINE_SKILL_SCANNER,
|
|
"swarm/SkillButtons/Engineering", // 3ASW_MARINE_SKILL_ENGINEERING,
|
|
|
|
"swarm/SkillButtons/Accuracy", // ASW_MARINE_SKILL_ACCURACY,
|
|
"swarm/SkillButtons/Grenade", // ASW_MARINE_SKILL_GRENADES,
|
|
"swarm/SkillButtons/Health", // ASW_MARINE_SKILL_HEALTH,
|
|
"swarm/SkillButtons/Melee", // ASW_MARINE_SKILL_MELEE,
|
|
"swarm/SkillButtons/SkillReload", // ASW_MARINE_SKILL_RELOADING,
|
|
"swarm/SkillButtons/Agility", // ASW_MARINE_SKILL_AGILITY
|
|
|
|
"swarm/SkillButtons/Spare", // ASW_MARINE_SKILL_SPARE
|
|
};
|
|
|
|
const char* s_szSkillName[ ASW_NUM_MARINE_SKILLS ] =
|
|
{
|
|
"#asw_leadership", // ASW_MARINE_SKILL_LEADERSHIP = 0,
|
|
"#asw_vindicator", // ASW_MARINE_SKILL_VINDICATOR,
|
|
|
|
// special weapons
|
|
"#asw_autogunsk", // ASW_MARINE_SKILL_AUTOGUN,
|
|
"#asw_stopping", // ASW_MARINE_SKILL_STOPPING_POWER,
|
|
"#asw_piercingbullets", // ASW_MARINE_SKILL_PIERCING,
|
|
|
|
// medic
|
|
"#asw_healing", // ASW_MARINE_SKILL_HEALING,
|
|
"#asw_xenowound", // ASW_MARINE_SKILL_XENOWOUNDS,
|
|
"#asw_combatdrugs", // ASW_MARINE_SKILL_DRUGS,
|
|
|
|
// tech
|
|
"#asw_hacking", //ASW_MARINE_SKILL_HACKING,
|
|
"#asw_scanner", // 3ASW_MARINE_SKILL_SCANNER,
|
|
"#asw_engineering", // 3ASW_MARINE_SKILL_ENGINEERING,
|
|
|
|
"#asw_accuracy_skill", // ASW_MARINE_SKILL_ACCURACY,
|
|
"#asw_grenades", // ASW_MARINE_SKILL_GRENADES,
|
|
"#asw_health", // ASW_MARINE_SKILL_HEALTH,
|
|
"#asw_melee", // ASW_MARINE_SKILL_MELEE,
|
|
"#asw_reloading", // ASW_MARINE_SKILL_RELOADING,
|
|
"#asw_agility", // ASW_MARINE_SKILL_AGILITY
|
|
|
|
"#asw_points", // ASW_MARINE_SKILL_SPARE
|
|
};
|
|
|
|
const char* s_szSkillDescription[ ASW_NUM_MARINE_SKILLS ] =
|
|
{
|
|
"#asw_leadership_desc", // ASW_MARINE_SKILL_LEADERSHIP = 0,
|
|
"#asw_vindicator_desc", // ASW_MARINE_SKILL_VINDICATOR,
|
|
|
|
// special weapons
|
|
"#asw_autogunsk_desc", // ASW_MARINE_SKILL_AUTOGUN,
|
|
"#asw_stopping_desc", // ASW_MARINE_SKILL_STOPPING_POWER,
|
|
"#asw_piercingbullets_desc", // ASW_MARINE_SKILL_PIERCING,
|
|
|
|
// medic
|
|
"#asw_healing_desc", // ASW_MARINE_SKILL_HEALING,
|
|
"#asw_xenowound_desc", // ASW_MARINE_SKILL_XENOWOUNDS,
|
|
"#asw_combatdrugs_desc", // ASW_MARINE_SKILL_DRUGS,
|
|
|
|
// tech
|
|
"#asw_hacking_desc", //ASW_MARINE_SKILL_HACKING,
|
|
"#asw_scanner_desc", // 3ASW_MARINE_SKILL_SCANNER,
|
|
"#asw_engineering_desc", // 3ASW_MARINE_SKILL_ENGINEERING,
|
|
|
|
"#asw_accuracy_skill_desc", // ASW_MARINE_SKILL_ACCURACY,
|
|
"#asw_grenades_desc", // ASW_MARINE_SKILL_GRENADES,
|
|
"#asw_health_desc", // ASW_MARINE_SKILL_HEALTH,
|
|
"#asw_melee_desc", // ASW_MARINE_SKILL_MELEE,
|
|
"#asw_reloading_desc", // ASW_MARINE_SKILL_RELOADING,
|
|
"#asw_agility_desc", // ASW_MARINE_SKILL_AGILITY
|
|
|
|
"#asw_points_desc", // ASW_MARINE_SKILL_SPARE
|
|
};
|
|
|
|
int s_nMaxSkillPoints[ ASW_NUM_MARINE_SKILLS ] =
|
|
{
|
|
5, // ASW_MARINE_SKILL_LEADERSHIP = 0,
|
|
5, // ASW_MARINE_SKILL_VINDICATOR,
|
|
|
|
// special weapons
|
|
5, // ASW_MARINE_SKILL_AUTOGUN,
|
|
5, // ASW_MARINE_SKILL_STOPPING_POWER,
|
|
5, // ASW_MARINE_SKILL_PIERCING,
|
|
|
|
// medic
|
|
5, // ASW_MARINE_SKILL_HEALING,
|
|
3, // ASW_MARINE_SKILL_XENOWOUNDS,
|
|
5, // ASW_MARINE_SKILL_DRUGS,
|
|
|
|
// tech
|
|
5, //ASW_MARINE_SKILL_HACKING,
|
|
3, // 3ASW_MARINE_SKILL_SCANNER,
|
|
3, // 3ASW_MARINE_SKILL_ENGINEERING,
|
|
|
|
5, // ASW_MARINE_SKILL_ACCURACY,
|
|
5, // ASW_MARINE_SKILL_GRENADES,
|
|
5, // ASW_MARINE_SKILL_HEALTH,
|
|
5, // ASW_MARINE_SKILL_MELEE,
|
|
5, // ASW_MARINE_SKILL_RELOADING,
|
|
5, // ASW_MARINE_SKILL_AGILITY
|
|
|
|
99, // ASW_MARINE_SKILL_SPARE
|
|
};
|
|
|
|
#ifdef CLIENT_DLL
|
|
const char* CASW_Marine_Skills::GetSkillImage( ASW_Skill nSkillIndex )
|
|
{
|
|
if ( nSkillIndex < 0 || nSkillIndex >= ASW_NUM_MARINE_SKILLS )
|
|
return "";
|
|
|
|
return s_szSkillImageName[ nSkillIndex ];
|
|
}
|
|
|
|
const char* CASW_Marine_Skills::GetSkillName( ASW_Skill nSkillIndex )
|
|
{
|
|
if ( nSkillIndex < 0 || nSkillIndex >= ASW_NUM_MARINE_SKILLS )
|
|
return "";
|
|
|
|
return s_szSkillName[ nSkillIndex ];
|
|
}
|
|
|
|
const char* CASW_Marine_Skills::GetSkillDescription( ASW_Skill nSkillIndex )
|
|
{
|
|
if ( nSkillIndex < 0 || nSkillIndex >= ASW_NUM_MARINE_SKILLS )
|
|
return "";
|
|
|
|
return s_szSkillDescription[ nSkillIndex ];
|
|
}
|
|
#endif
|
|
|
|
int CASW_Marine_Skills::GetMaxSkillPoints( ASW_Skill nSkillIndex )
|
|
{
|
|
if ( nSkillIndex < 0 || nSkillIndex >= ASW_NUM_MARINE_SKILLS )
|
|
return 0;
|
|
|
|
return s_nMaxSkillPoints[ nSkillIndex ];
|
|
}
|
|
|
|
const char* g_szSkillNames[ ASW_NUM_MARINE_SKILLS ] =
|
|
{
|
|
"ASW_MARINE_SKILL_LEADERSHIP",
|
|
"ASW_MARINE_SKILL_VINDICATOR",
|
|
|
|
// special weapons
|
|
"ASW_MARINE_SKILL_AUTOGUN",
|
|
"ASW_MARINE_SKILL_STOPPING_POWER",
|
|
"ASW_MARINE_SKILL_PIERCING",
|
|
|
|
// medic
|
|
"ASW_MARINE_SKILL_HEALING",
|
|
"ASW_MARINE_SKILL_XENOWOUNDS",
|
|
"ASW_MARINE_SKILL_DRUGS",
|
|
|
|
// tech
|
|
"ASW_MARINE_SKILL_HACKING",
|
|
"ASW_MARINE_SKILL_SCANNER",
|
|
"ASW_MARINE_SKILL_ENGINEERING",
|
|
|
|
"ASW_MARINE_SKILL_ACCURACY",
|
|
"ASW_MARINE_SKILL_GRENADES",
|
|
"ASW_MARINE_SKILL_HEALTH",
|
|
"ASW_MARINE_SKILL_MELEE",
|
|
"ASW_MARINE_SKILL_RELOADING",
|
|
"ASW_MARINE_SKILL_AGILITY",
|
|
|
|
"ASW_MARINE_SKILL_SPARE",
|
|
};
|
|
|
|
ASW_Skill SkillFromString( const char *szSkill )
|
|
{
|
|
int nSkills = NELEMS( g_szSkillNames );
|
|
for ( int i = 0; i < nSkills; i++ )
|
|
{
|
|
if ( !Q_stricmp( szSkill, g_szSkillNames[i] ) )
|
|
{
|
|
return (ASW_Skill) i;
|
|
}
|
|
}
|
|
|
|
return ASW_MARINE_SKILL_INVALID;
|
|
}
|
|
|
|
const char * SkillToString( ASW_Skill nSkill )
|
|
{
|
|
if ( nSkill < 0 || nSkill >= NELEMS( g_szSkillNames ) )
|
|
{
|
|
return "ASW_MARINE_SKILL_INVALID";
|
|
}
|
|
return g_szSkillNames[ nSkill ];
|
|
}
|
|
|
|
|
|
// global instance
|
|
CASW_Marine_Skills g_MarineSkills;
|
|
CASW_Marine_Skills* MarineSkills()
|
|
{
|
|
return &g_MarineSkills;
|
|
} |