summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-rw-r--r--src/game/g_client.c2
-rw-r--r--src/game/g_combat.c62
-rw-r--r--src/game/g_local.h9
-rw-r--r--src/game/g_main.c8
-rw-r--r--src/game/tremulous.h1
5 files changed, 67 insertions, 15 deletions
diff --git a/src/game/g_client.c b/src/game/g_client.c
index 56e074f..fc797e5 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -1460,7 +1460,7 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles
// clear entity values
if( ent->client->pers.classSelection == PCL_HUMAN )
{
- //BG_AddUpgradeToInventory( UP_MEDKIT, client->ps.stats );
+ if (SPAWN_WITH_MEDKIT) BG_AddUpgradeToInventory( UP_MEDKIT, client->ps.stats );
weapon = client->pers.humanItemSelection;
}
else if( client->sess.spectatorState == SPECTATOR_NOT )
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index b6de2f4..e616c5a 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -247,6 +247,30 @@ float G_CamperRewardBonus( gentity_t *self )
return 1.0f;
}
+float G_TeamRewardScaleFactor( gentity_t *target )
+{
+ if (level.humanRewardKills <= 0.0f || level.alienRewardKills <= 0.0f) return 1.0f;
+ if( target->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS) {
+ return level.alienRewardKills/level.humanRewardKills;
+ } else if( target->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
+ return level.humanRewardKills/level.alienRewardKills;
+ } else return 0;
+}
+
+float G_RewardScaleFactor( gentity_t *self, gentity_t *target, float teamFactor )
+{
+ float result;
+
+ if (self->client->pers.kills <= 0 || target->client->pers.kills <= 0) return 1.0f;
+
+ result = g_ConstantRewardFactor.value;
+ result += g_TeamRewardFactor.value*teamFactor;
+ result += g_PlayerRewardFactor.value*target->client->pers.kills/self->client->pers.kills;
+
+ if (result > 1.0f) result = 1.0f;
+ return result;
+}
+
/* Instantly reward the current attacker */
float G_InstantRewardAttacker( gentity_t *self, gentity_t *target, float damage )
{
@@ -268,13 +292,15 @@ float G_InstantRewardAttacker( gentity_t *self, gentity_t *target, float damage
value *= BG_GetValueOfPlayer( &target->client->ps );
if( target->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS) {
- value *= g_InstantRewardMultiplierA.value;
+ value *= g_InstantRewardMultiplierA.value;
} else if( target->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
- value *= g_InstantRewardMultiplierH.value;
+ value *= g_InstantRewardMultiplierH.value;
} else value = 0;
+ value *= G_RewardScaleFactor( self, target, G_TeamRewardScaleFactor( target ) );
+
if( value > 0 )
- G_AddCreditToClient( self->client, value, qtrue );
+ G_AddCreditToClient( self->client, value, qtrue );
return value;
}
@@ -292,7 +318,7 @@ float G_RewardAttackers( gentity_t *self )
float value, totalDamage = 0;
int team, i, maxHealth = 0;
int alienCredits = 0, humanCredits = 0;
-
+ float teamFactor;
gentity_t *player;
@@ -313,10 +339,10 @@ float G_RewardAttackers( gentity_t *self )
if( self->client )
{
value = BG_GetValueOfPlayer( &self->client->ps );
- value *= G_CamperRewardBonus( self );
+ value *= G_CamperRewardBonus( self );
team = self->client->pers.teamSelection;
maxHealth = self->client->ps.stats[ STAT_MAX_HEALTH ];
- // trap_SendServerCommand( -1, va( "print \"^5You recieved%3i extra evos/credits.\n\"", value ) );
+ // trap_SendServerCommand( -1, va( "print \"^5You recieved%3i extra evos/credits.\n\"", value ) );
}
else if( self->s.eType == ET_BUILDABLE )
@@ -336,10 +362,13 @@ float G_RewardAttackers( gentity_t *self )
else
return totalDamage;
+
// Give credits and empty the array
+ teamFactor = G_TeamRewardScaleFactor( self );
for( i = 0; i < level.maxclients; i++ )
{
int stageValue = value * self->credits[ i ] / totalDamage;
+ float killValue = self->credits[ i ] / maxHealth;
player = g_entities + i;
if( player->client->pers.teamSelection != team )
@@ -351,25 +380,32 @@ float G_RewardAttackers( gentity_t *self )
continue;
AddScore( player, stageValue );
-
+
// killing buildables earns score, but not credits
if( self->s.eType != ET_BUILDABLE )
{
+ 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, teamFactor );
+ player->client->pers.kills += killValue;
// add to stage counters
if( player->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) {
- G_AddCreditToClient( player->client, g_KillRewardMultiplierH.value*stageValue, qtrue );
+ level.alienRewardKills += killValue;
+ G_AddCreditToClient( player->client, g_KillRewardMultiplierH.value*stageValue, qtrue );
alienCredits += stageValue;
- } else if( player->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
- G_AddCreditToClient( player->client, g_KillRewardMultiplierA.value*stageValue, qtrue );
+ } else if( player->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) {
+ level.humanRewardKills += killValue;
+ G_AddCreditToClient( player->client, g_KillRewardMultiplierA.value*stageValue, qtrue );
humanCredits += stageValue;
- }
+ }
}
}
self->credits[ i ] = 0;
-
-
}
+ ++self->client->pers.deaths;
+ Com_Printf(S_COLOR_YELLOW "Killed: kills = %f deaths = %d\n",self->client->pers.kills,self->client->pers.deaths);
+ Com_Printf(S_COLOR_YELLOW "Team: kills = %f deaths = %f\n",level.alienRewardKills,level.humanRewardKills);
+
if( alienCredits )
{
trap_Cvar_Set( "g_alienCredits",
diff --git a/src/game/g_local.h b/src/game/g_local.h
index 52bf097..183985b 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -344,6 +344,9 @@ typedef struct
int floodDemerits;
int floodTime;
+ float kills;
+ int deaths;
+
vec3_t lastDeathLocation;
char guid[ 33 ];
addr_t ip;
@@ -650,6 +653,9 @@ typedef struct
int alienKills;
int humanKills;
+ float alienRewardKills;
+ float humanRewardKills;
+
qboolean overmindMuted;
int humanBaseAttackTimer;
@@ -1253,6 +1259,9 @@ extern vmCvar_t g_InstantRewardMultiplierA;
extern vmCvar_t g_InstantRewardMultiplierH;
extern vmCvar_t g_KillRewardMultiplierA;
extern vmCvar_t g_KillRewardMultiplierH;
+extern vmCvar_t g_ConstantRewardFactor;
+extern vmCvar_t g_TeamRewardFactor;
+extern vmCvar_t g_PlayerRewardFactor;
void trap_Print( const char *fmt );
void trap_Error( const char *fmt );
diff --git a/src/game/g_main.c b/src/game/g_main.c
index ab799e5..53f36ce 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -182,6 +182,9 @@ vmCvar_t g_InstantRewardMultiplierA;
vmCvar_t g_InstantRewardMultiplierH;
vmCvar_t g_KillRewardMultiplierA;
vmCvar_t g_KillRewardMultiplierH;
+vmCvar_t g_ConstantRewardFactor;
+vmCvar_t g_TeamRewardFactor;
+vmCvar_t g_PlayerRewardFactor;
// copy cvars that can be set in worldspawn so they can be restored later
static char cv_gravity[ MAX_CVAR_VALUE_STRING ];
@@ -261,7 +264,6 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_humanStage, "g_humanStage", "0", 0, 0, qfalse },
{ &g_humanCredits, "g_humanCredits", "0", 0, 0, qfalse },
{ &g_humanStage, "g_humanStage", "0", 0, 0, qfalse },
- { &g_humanCredits, "g_humanCredits", "0", 0, 0, qfalse },
{ &g_humanMaxStage, "g_humanMaxStage", DEFAULT_HUMAN_MAX_STAGE, 0, 0, qfalse, cv_humanMaxStage },
{ &g_humanStage2Threshold, "g_humanStage2Threshold", DEFAULT_HUMAN_STAGE2_THRESH, 0, 0, qfalse },
{ &g_humanStage3Threshold, "g_humanStage3Threshold", DEFAULT_HUMAN_STAGE3_THRESH, 0, 0, qfalse },
@@ -336,6 +338,9 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_InstantRewardMultiplierH, "g_InstantRewardMultiplierH", "1", CVAR_ARCHIVE, 0, qfalse },
{ &g_KillRewardMultiplierA, "g_KillRewardMultiplierA", "1", CVAR_ARCHIVE, 0, qfalse },
{ &g_KillRewardMultiplierH, "g_KillRewardMultiplierH", "1", CVAR_ARCHIVE, 0, qfalse },
+ { &g_ConstantRewardFactor, "g_ConstantRewardFactor", "0.25", CVAR_ARCHIVE, 0, qfalse },
+ { &g_TeamRewardFactor, "g_TeamRewardFactor", "0.5", CVAR_ARCHIVE, 0, qfalse },
+ { &g_PlayerRewardFactor, "g_PlayerRewardFactor", "0.25", CVAR_ARCHIVE, 0, qfalse }
};
static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[ 0 ] );
void G_InitGame( int levelTime, int randomSeed, int restart );
@@ -610,6 +615,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart )
level.alienStage2Time = level.alienStage3Time =
level.humanStage2Time = level.humanStage3Time = level.startTime;
level.snd_fry = G_SoundIndex( "sound/misc/fry.wav" ); // FIXME standing in lava / slime
+ level.humanRewardKills = level.alienRewardKills = 0.0f;
trap_Cvar_Set( "g_version", G_MOD_VERSION );
trap_Cvar_Set( "edge_version", EDGE_MOD_VERSION );
if( g_logFile.string[ 0 ] )
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 0a82f1f..b6dad3f 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -544,6 +544,7 @@ TREMULOUS EDGE MOD SRC FILE
#define HELMET_INFECTION_PROTECTION 1
#define HELMET_PCLOUD_PROTECTION 1000
+#define SPAWN_WITH_MEDKIT 0
#define MEDKIT_PRICE 50
#define BATTPACK_PRICE 75