summaryrefslogtreecommitdiff
path: root/src/game/g_combat.c
diff options
context:
space:
mode:
authorMikko Tiusanen <ams@daug.net>2015-02-21 16:14:19 +0200
committerMikko Tiusanen <ams@daug.net>2015-02-21 16:14:19 +0200
commitce866de2e0814fbc73797aac333d8d51ed1d17b8 (patch)
tree4ff72c3aa0bd15afd8c34a19dadec5fbfc2bf811 /src/game/g_combat.c
parent8222c5a05274a77b3f4873738565e0ca4bc94295 (diff)
Enable credit/evo gain from killing buildables.
Allow building within own om/rc radius even if enemy creeps/refineries nearby. Renamed the mod files from edge to new edge.
Diffstat (limited to 'src/game/g_combat.c')
-rw-r--r--src/game/g_combat.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index b0e33e4..966e595 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -194,20 +194,21 @@ float G_CamperRewardBonus( gentity_t *self )
float G_RewardScaleFactor( gentity_t *self, gentity_t *target )
{
float targetScore;
- if( !target->client ) return 1.0f;
if( level.humanRewardScore <= 0.0f || level.alienRewardScore <= 0.0f ) return 1.0f;
- if( self->client->ps.persistant[ PERS_SCORE ] <= 0 || target->client->ps.persistant[ PERS_SCORE ] <= 0) return 1.0f;
- targetScore = target->client->ps.persistant[ PERS_SCORE ]/self->client->ps.persistant[ PERS_SCORE ];
- switch( target->client->ps.stats[ STAT_TEAM ] ) {
+ switch( self->client->ps.stats[ STAT_TEAM ] ) {
case TEAM_ALIENS:
- targetScore *= level.alienRewardScore/level.humanRewardScore;
+ targetScore = level.humanRewardScore/level.alienRewardScore;
break;
case TEAM_HUMANS:
- targetScore *= level.humanRewardScore/level.alienRewardScore;
+ targetScore = level.alienRewardScore/level.humanRewardScore;
break;
default:
return 0;
}
+ if ( target->client != NULL ) {
+ if( self->client->ps.persistant[ PERS_SCORE ] <= 0 || target->client->ps.persistant[ PERS_SCORE ] <= 0) return targetScore;
+ targetScore *= target->client->ps.persistant[ PERS_SCORE ]/self->client->ps.persistant[ PERS_SCORE ];
+ }
targetScore *= 1.0f-g_ConstantRewardFactor.value;
targetScore += g_ConstantRewardFactor.value;
if (targetScore < g_MinRewardFactor.value) targetScore = g_MinRewardFactor.value;
@@ -219,31 +220,40 @@ float G_RewardScaleFactor( gentity_t *self, gentity_t *target )
float G_InstantRewardAttacker( gentity_t *self, gentity_t *target, float damage )
{
float value;
- int maxHealth;
+ int maxHealth,targetTeam;
if( damage <= 0.f ) return 0.0f;
if( !self->client ) return 0.0f;
- if( !target->client ) return 0.0f;
- if( OnSameTeam( self, target ) ) return 0.0f;
- if( target->s.eType == ET_BUILDABLE ) return 0.0f;
- maxHealth = target->client->ps.stats[ STAT_MAX_HEALTH ];
+ if( target->client != NULL ) {
+ maxHealth = target->client->ps.stats[ STAT_MAX_HEALTH ];
+ targetTeam = target->client->ps.stats[ STAT_TEAM ];
+ } else {
+ maxHealth = BG_Buildable( target->s.modelindex )->health;
+ targetTeam = target->buildableTeam;
+ }
+ if( targetTeam == self->client->ps.stats[ STAT_TEAM ] ) return 0.0f;
- // Only give credits for attacking players for now
value = damage / maxHealth;
if (value > 1.0f) value = 1.0f;
- value *= G_CamperRewardBonus( target );
- value *= BG_GetValueOfPlayer( &target->client->ps );
- if( target->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS) {
+ if( target->client != NULL ) {
+ value *= G_CamperRewardBonus( target );
+ value *= BG_GetValueOfPlayer( &target->client->ps );
+ } else {
+ value *= BG_Buildable( target->s.modelindex )->value;
+ value *= g_BuildingCreditsFactor.value;
+ }
+
+ if( targetTeam == TEAM_ALIENS) {
value *= g_InstantRewardMultiplierA.value;
- } else if( target->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
+ } else if( targetTeam == TEAM_HUMANS ) {
value *= g_InstantRewardMultiplierH.value;
- } else value = 0;
+ } else value = 0.f;
value *= G_RewardScaleFactor( self, target );
- if( value > 0 ) {
+ if( value > 0.f ) {
G_AddCreditToClient( self->client, value, qtrue );
if( self->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) {
trap_Cvar_Set( "g_alienCredits",
@@ -334,12 +344,12 @@ float G_RewardAttackers( gentity_t *self )
AddScore( player, stageValue );
- // killing buildables earns score, but not credits
- if( self->s.eType != ET_BUILDABLE )
- {
+ // killing buildables earns score, but not credits unless g_BuildingCreditsFactor > 0
+ if( self->s.eType == ET_BUILDABLE ) stageValue *= g_BuildingCreditsFactor.value;
+ if( stageValue > 0 ) {
// Com_Printf(S_COLOR_YELLOW "Killer: kills = %f deaths = %f percent_of_damage = %f -> factor = %f\n",player->client->pers.kills,player->client->pers.deaths,killValue,G_RewardScaleFactor( player, self, teamFactor) );
stageValue *= G_RewardScaleFactor( player, self );
- player->client->pers.kills += killValue;
+ player->client->pers.kills += killValue; // NOTE: Building kills will increase this too if g_BuildingCreditsFactor > 0
// add to stage counters
if( player->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) {
G_AddCreditToClient( player->client, g_KillRewardMultiplierH.value*stageValue, qtrue );