2024-12-11 11:28:08 +01:00

223 lines
8.6 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\agents\_agent_utility;
#include maps\mp\alien\_utility;
#include maps\mp\alien\_perkfunctions;
init_perks()
{
init_perks_callback();
init_perks_from_table();
}
PERK_TABLE = "mp/alien/perks_tree.csv";
init_perks_from_table()
{
// level.alien_perks_table can be used to override default table, should be set before _alien::main()
if ( !isdefined( level.alien_perks_table ) )
level.alien_perks_table = PERK_TABLE;
level.alien_perks = [];
update_perks_from_table( 0, "perk_0" );
update_perks_from_table( 100, "perk_1" );
}
init_perks_callback()
{
level.alien_perk_callbacks = [];
register_perk_callback( "perk_health", ::set_perk_health_level_0, ::unset_perk_health_level_0 );
register_perk_callback( "perk_health_1", ::set_perk_health_level_1, ::unset_perk_health_level_1 );
register_perk_callback( "perk_health_2", ::set_perk_health_level_2, ::unset_perk_health_level_2 );
register_perk_callback( "perk_health_3", ::set_perk_health_level_3, ::unset_perk_health_level_3 );
register_perk_callback( "perk_health_4", ::set_perk_health_level_4, ::unset_perk_health_level_4 );
register_perk_callback( "perk_pistol_p226", ::set_perk_pistol_p226_0, ::unset_perk_pistol_p226_0 );
register_perk_callback( "perk_pistol_p226_1", ::set_perk_pistol_p226_1, ::unset_perk_pistol_p226_1 );
register_perk_callback( "perk_pistol_p226_2", ::set_perk_pistol_p226_2, ::unset_perk_pistol_p226_2 );
register_perk_callback( "perk_pistol_p226_3", ::set_perk_pistol_p226_3, ::unset_perk_pistol_p226_3 );
register_perk_callback( "perk_pistol_p226_4", ::set_perk_pistol_p226_4, ::unset_perk_pistol_p226_4 );
register_perk_callback( "perk_pistol_magnum", ::set_perk_pistol_magnum_0, ::unset_perk_pistol_magnum_0 );
register_perk_callback( "perk_pistol_magnum_1", ::set_perk_pistol_magnum_1, ::unset_perk_pistol_magnum_1 );
register_perk_callback( "perk_pistol_magnum_2", ::set_perk_pistol_magnum_2, ::unset_perk_pistol_magnum_2 );
register_perk_callback( "perk_pistol_magnum_3", ::set_perk_pistol_magnum_3, ::unset_perk_pistol_magnum_3 );
register_perk_callback( "perk_pistol_magnum_4", ::set_perk_pistol_magnum_4, ::unset_perk_pistol_magnum_4 );
register_perk_callback( "perk_pistol_m9a1", ::set_perk_pistol_m9a1_0, ::unset_perk_pistol_m9a1_0 );
register_perk_callback( "perk_pistol_m9a1_1", ::set_perk_pistol_m9a1_1, ::unset_perk_pistol_m9a1_1 );
register_perk_callback( "perk_pistol_m9a1_2", ::set_perk_pistol_m9a1_2, ::unset_perk_pistol_m9a1_2 );
register_perk_callback( "perk_pistol_m9a1_3", ::set_perk_pistol_m9a1_3, ::unset_perk_pistol_m9a1_3 );
register_perk_callback( "perk_pistol_m9a1_4", ::set_perk_pistol_m9a1_4, ::unset_perk_pistol_m9a1_4 );
register_perk_callback( "perk_pistol_mp443", ::set_perk_pistol_mp443_0, ::unset_perk_pistol_mp443_0 );
register_perk_callback( "perk_pistol_mp443_1", ::set_perk_pistol_mp443_1, ::unset_perk_pistol_mp443_1 );
register_perk_callback( "perk_pistol_mp443_2", ::set_perk_pistol_mp443_2, ::unset_perk_pistol_mp443_2 );
register_perk_callback( "perk_pistol_mp443_3", ::set_perk_pistol_mp443_3, ::unset_perk_pistol_mp443_3 );
register_perk_callback( "perk_pistol_mp443_4", ::set_perk_pistol_mp443_4, ::unset_perk_pistol_mp443_4 );
register_perk_callback( "perk_bullet_damage", ::set_perk_bullet_damage_0, ::unset_perk_bullet_damage_0 );
register_perk_callback( "perk_bullet_damage_1", ::set_perk_bullet_damage_1, ::unset_perk_bullet_damage_1 );
register_perk_callback( "perk_bullet_damage_2", ::set_perk_bullet_damage_2, ::unset_perk_bullet_damage_2 );
register_perk_callback( "perk_bullet_damage_3", ::set_perk_bullet_damage_3, ::unset_perk_bullet_damage_3 );
register_perk_callback( "perk_bullet_damage_4", ::set_perk_bullet_damage_4, ::unset_perk_bullet_damage_4 );
register_perk_callback( "perk_medic", ::set_perk_medic_0, ::unset_perk_medic_0 );
register_perk_callback( "perk_medic_1", ::set_perk_medic_1, ::unset_perk_medic_1 );
register_perk_callback( "perk_medic_2", ::set_perk_medic_2, ::unset_perk_medic_2 );
register_perk_callback( "perk_medic_3", ::set_perk_medic_3, ::unset_perk_medic_3 );
register_perk_callback( "perk_medic_4", ::set_perk_medic_4, ::unset_perk_medic_4 );
register_perk_callback( "perk_rigger", ::set_perk_rigger_0, ::unset_perk_rigger_0 );
register_perk_callback( "perk_rigger_1", ::set_perk_rigger_1, ::unset_perk_rigger_1 );
register_perk_callback( "perk_rigger_2", ::set_perk_rigger_2, ::unset_perk_rigger_2 );
register_perk_callback( "perk_rigger_3", ::set_perk_rigger_3, ::unset_perk_rigger_3 );
register_perk_callback( "perk_rigger_4", ::set_perk_rigger_4, ::unset_perk_rigger_4 );
register_perk_callback( "perk_none", ::set_perk_none, ::unset_perk_none );
register_perk_callback( "perk_none_1", ::set_perk_none, ::unset_perk_none );
register_perk_callback( "perk_none_2", ::set_perk_none, ::unset_perk_none );
register_perk_callback( "perk_none_3", ::set_perk_none, ::unset_perk_none );
register_perk_callback( "perk_none_4", ::set_perk_none, ::unset_perk_none );
}
register_perk_callback( perk_name, set_func, unSet_func )
{
perk_callback = spawnstruct();
perk_callback.Set = set_func;
perk_callback.unSet = unSet_func;
level.alien_perk_callbacks[ perk_name ] = perk_callback;
}
// ================================================================
// Perks Table
// ================================================================
TABLE_INDEX = 0; // [int] Indexing
TABLE_REF = 1; // [string] Reference
TABLE_UNLOCK = 2; // [int] Unlocked at rank number
TABLE_POINT_COST = 3; // [int] Combat point cost to enable this perk(upgrades)
TABLE_NAME = 4; // [string] Name localized
TABLE_DESC = 5; // [string] Description localized
TABLE_ICON = 6; // [string] Reference string of icon for perk
TABLE_IS_UPGRADE = 7; // [int] 1 if this is an upgrade, 0 if not
TABLE_PERK_MAX_INDEX = 100;
// Populates data table entries into level array
update_perks_from_table( start_idx, perk_type )
{
level.alien_perks[ perk_type ] = [];
for ( i = start_idx; i <= start_idx + TABLE_PERK_MAX_INDEX; i++ )
{
// break on end of line
perk_ref = get_perk_ref_by_index( i );
if ( perk_ref == "" ) { break; }
if ( !isdefined( level.alien_perks[ perk_ref ] ) )
{
perk = spawnstruct();
perk.upgrades = [];
perk.unlock = get_unlock_by_ref( perk_ref );
perk.name = get_name_by_ref( perk_ref );
perk.icon = get_icon_by_ref( perk_ref );
perk.ref = perk_ref;
perk.type = perk_type;
perk.callbacks = level.alien_perk_callbacks[ perk_ref ];
perk.baseIdx = i;
level.alien_perks[ perk_type ][ perk_ref ] = perk;
}
// grab all upgrades for this perk
for ( j = i; j <= start_idx + TABLE_PERK_MAX_INDEX; j++ )
{
upgrade_ref = get_perk_ref_by_index( j );
if ( upgrade_ref == "" ) { break; }
if ( upgrade_ref == perk_ref || is_perk_set( perk_ref, upgrade_ref ) )
{
upgrade = spawnstruct();
upgrade.ref = upgrade_ref;
upgrade.desc = get_desc_by_ref( upgrade_ref );
upgrade.point_cost = get_point_cost_by_ref( upgrade_ref );
level.alien_perks[ perk_type ][ perk_ref ].upgrades[ j - i ] = upgrade;
}
else
{
break;
}
}
// point index to next perk set
i = j - 1;
}
}
// returns true if upgrade_ref is/or an upgrade of perk_ref
is_perk_set( perk_ref, upgrade_ref )
{
// ex: "perk_blah" is perk ref
// all upgrade refs should be in form of "perk_blah_#"
assert( isdefined( perk_ref ) && isdefined( upgrade_ref ) );
if ( perk_ref == upgrade_ref )
return false;
if ( !issubstr( upgrade_ref, perk_ref ) )
return false;
perk_toks = StrTok( perk_ref, "_" );
upgrade_toks = StrTok( upgrade_ref, "_" );
if ( upgrade_toks.size - perk_toks.size != 1 )
return false;
for ( i = 0; i < upgrade_toks.size - 1; i++ )
{
if ( upgrade_toks[ i ] != perk_toks[ i ] )
return false;
}
return true;
}
get_perk_ref_by_index( index )
{
return tablelookup( level.alien_perks_table, TABLE_INDEX, index, TABLE_REF );
}
get_name_by_ref( ref )
{
return tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_NAME );
}
get_icon_by_ref( ref )
{
return tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_ICON );
}
get_desc_by_ref( ref )
{
return tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_DESC );
}
get_point_cost_by_ref( ref )
{
return int( tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_POINT_COST ) );
}
get_unlock_by_ref( ref )
{
return int( tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_UNLOCK ) );
}
get_is_upgrade_by_ref( ref )
{
return int( tablelookup( level.alien_perks_table, TABLE_REF, ref, TABLE_IS_UPGRADE ) );
}