summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cgame/cg_draw.c8
-rw-r--r--src/cgame/cg_event.c8
-rw-r--r--src/game/bg_public.h4
-rw-r--r--src/game/g_client.c33
-rw-r--r--src/game/g_cmds.c80
-rw-r--r--src/game/g_combat.c6
6 files changed, 116 insertions, 23 deletions
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c
index a265a329..90518a71 100644
--- a/src/cgame/cg_draw.c
+++ b/src/cgame/cg_draw.c
@@ -548,6 +548,9 @@ static void CG_DrawStatusBar( void ) {
int awidth = (int)( (float)allocated / ( total / PWR_WIDTH ) );
int pwidth = (int)( (float)powered / ( total / PWR_WIDTH ) );
vec4_t bcolor = { 0.5, 0.5, 0.5, 0.5 };
+
+ char *s;
+ int w;
trap_R_SetColor( bcolor ); // white
CG_DrawPic( PWR_X, PWR_Y, PWR_WIDTH, PWR_HEIGHT, cgs.media.whiteShader );
@@ -560,6 +563,11 @@ static void CG_DrawStatusBar( void ) {
trap_R_SetColor( colors[1] ); // red
CG_DrawPic( PWR_X + pwidth, PWR_Y, awidth - pwidth, PWR_HEIGHT, cgs.media.whiteShader );
}
+
+ //display amount of credit
+ s = va( "%dg", ps->stats[ STAT_CREDIT ] );
+ w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH;
+ CG_DrawBigString( 635 - w, 35, s, 1.0F);
}
//
diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c
index 822b8d1e..61a3abe0 100644
--- a/src/cgame/cg_event.c
+++ b/src/cgame/cg_event.c
@@ -506,6 +506,14 @@ void CG_Menu( int eventParm )
trap_SendConsoleCommand( "menu hnoslots\n" );
break;
+ case MN_H_NOFUNDS:
+ trap_SendConsoleCommand( "menu hnofunds\n" );
+ break;
+
+ case MN_H_ITEMHELD:
+ trap_SendConsoleCommand( "menu hitemheld\n" );
+ break;
+
case MN_D_INFEST:
trap_SendConsoleCommand( "menu dinfest\n" );
break;
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 74767474..f0d7398c 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -548,7 +548,9 @@ typedef enum
MN_H_RPLWARN,
MN_H_RPTWARN,
MN_H_MCUPOWER,
- MN_H_NOSLOTS
+ MN_H_NOSLOTS,
+ MN_H_NOFUNDS,
+ MN_H_ITEMHELD
} dynMenu_t;
// animations
diff --git a/src/game/g_client.c b/src/game/g_client.c
index 96fb3651..33f644d3 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -540,9 +540,11 @@ Called when a body is used
*/
void useBody( gentity_t *self, gentity_t *other, gentity_t *activator )
{
- int i, class;
- int total = 0;
- float numerator, denominator;
+ int i, class, clientNum;
+ int total = 0;
+ float numerator, denominator;
+ vec3_t up = { 0.0, 0.0, 1.0 };
+
if( activator->client->ps.stats[ STAT_PTEAM ] == PTE_DROIDS )
{
@@ -550,10 +552,12 @@ void useBody( gentity_t *self, gentity_t *other, gentity_t *activator )
}
else
{
+ clientNum = activator->client->ps.clientNum;
+
//client has already raided this corpse
- if( self->creditsHash[ activator->client->ps.clientNum ] ) return;
+ if( self->creditsHash[ clientNum ] ) return;
- numerator = self->credits[ activator->client->ps.clientNum ];
+ numerator = self->credits[ clientNum ];
class = self->s.clientNum;
//total up all the damage done by every client
@@ -571,7 +575,18 @@ void useBody( gentity_t *self, gentity_t *other, gentity_t *activator )
( numerator / denominator ) );
//prevent clients claiming credit twice
- self->creditsHash[ activator->client->ps.clientNum ] = qtrue;
+ self->creditsHash[ clientNum ] = qtrue;
+
+ //if this corpse has been 100% claimed destroy it
+ for( i = 0; i < MAX_CLIENTS; i++ )
+ {
+ if( ( self->credits[ clientNum ] == 0 || !self->creditsHash[ clientNum ] ) && total != 0 )
+ continue;
+
+ G_AddEvent( self, EV_GIB_DROID, DirToByte( up ) );
+ self->freeAfterEvent = qtrue;
+ break;
+ }
}
}
@@ -588,6 +603,7 @@ void SpawnCorpse( gentity_t *ent ) {
int contents;
vec3_t origin, dest;
trace_t tr;
+ int i;
VectorCopy( ent->r.currentOrigin, origin );
@@ -602,9 +618,14 @@ void SpawnCorpse( gentity_t *ent ) {
body = G_Spawn( );
if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+ {
body->classname = "humanCorpse";
+ }
else
+ {
body->classname = "droidCorpse";
+ for( i = 0; i < MAX_CLIENTS; body->credits[ i ] = ent->credits[ i++ ] );
+ }
body->s = ent->s;
body->r.s = body->s;
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c
index 2c42896c..5f05e554 100644
--- a/src/game/g_cmds.c
+++ b/src/game/g_cmds.c
@@ -268,6 +268,14 @@ void Cmd_Give_f (gentity_t *ent)
return;
}
+ if( give_all || Q_stricmp( name, "funds" ) == 0 )
+ {
+ ent->client->ps.stats[ STAT_CREDIT ] += 100;
+
+ if( !give_all )
+ return;
+ }
+
// spawn a specific item right on the player
if ( !give_all ) {
it = BG_FindItem (name);
@@ -1824,6 +1832,10 @@ void Cmd_Buy_f( gentity_t *ent )
int quan, clips, maxClips;
trap_Argv( 1, s, sizeof( s ) );
+
+ //droids don't buy stuff
+ if( ent->client->pers.pteam != PTE_HUMANS )
+ return;
for ( i = 1, mcuEntity = g_entities + i; i < level.num_entities; i++, mcuEntity++ )
{
@@ -1835,48 +1847,83 @@ void Cmd_Buy_f( gentity_t *ent )
}
}
+ //no MCU nearby
if( !nearMCU )
{
trap_SendServerCommand( ent-g_entities, va("print \"You must be near an MCU\n\"" ) );
return;
}
- if( ent->client->pers.pteam != PTE_HUMANS )
- return;
-
weapon = BG_FindWeaponNumForName( s );
upgrade = BG_FindUpgradeNumForName( s );
if( weapon != WP_NONE )
{
+ //already got this?
+ if( BG_gotWeapon( weapon, ent->client->ps.stats ) )
+ {
+ G_AddPredictableEvent( ent, EV_MENU, MN_H_ITEMHELD );
+ return;
+ }
+
+ //can afford this?
+ if( BG_FindPriceForWeapon( weapon ) > ent->client->ps.stats[ STAT_CREDIT ] )
+ {
+ G_AddPredictableEvent( ent, EV_MENU, MN_H_NOFUNDS );
+ return;
+ }
+
+ //have space to carry this?
if( BG_FindSlotsForWeapon( weapon ) & ent->client->ps.stats[ STAT_SLOTS ] )
{
G_AddPredictableEvent( ent, EV_MENU, MN_H_NOSLOTS );
return;
}
+ //add to inventory
BG_packWeapon( weapon, ent->client->ps.stats );
BG_FindAmmoForWeapon( weapon, &quan, &clips, &maxClips );
BG_packAmmoArray( weapon, ent->client->ps.ammo, ent->client->ps.powerups,
quan, clips, maxClips );
ent->client->ps.weapon = weapon;
+
+ //subtract from funds
+ ent->client->ps.stats[ STAT_CREDIT ] -= BG_FindPriceForWeapon( weapon );
}
else if( upgrade != UP_NONE )
{
+ //already got this?
+ if( BG_gotItem( upgrade, ent->client->ps.stats ) )
+ {
+ G_AddPredictableEvent( ent, EV_MENU, MN_H_ITEMHELD );
+ return;
+ }
+
+ //can afford this?
+ if( BG_FindPriceForUpgrade( upgrade ) > ent->client->ps.stats[ STAT_CREDIT ] )
+ {
+ G_AddPredictableEvent( ent, EV_MENU, MN_H_NOFUNDS );
+ return;
+ }
+
+ //have space to carry this?
if( BG_FindSlotsForUpgrade( upgrade ) & ent->client->ps.stats[ STAT_SLOTS ] )
{
G_AddPredictableEvent( ent, EV_MENU, MN_H_NOSLOTS );
return;
}
+ //add to inventory
BG_packItem( upgrade, ent->client->ps.stats );
+
+ //subtract from funds
+ ent->client->ps.stats[ STAT_CREDIT ] -= BG_FindPriceForUpgrade( upgrade );
}
else
{
trap_SendServerCommand( ent-g_entities, va("print \"Unknown item\n\"" ) );
}
- //subtract from funds
}
@@ -1897,6 +1944,10 @@ void Cmd_Sell_f( gentity_t *ent )
trap_Argv( 1, s, sizeof( s ) );
+ //droids don't sell stuff
+ if( ent->client->pers.pteam != PTE_HUMANS )
+ return;
+
for ( i = 1, mcuEntity = g_entities + i; i < level.num_entities; i++, mcuEntity++ )
{
if( !Q_stricmp( mcuEntity->classname, "team_human_mcu" ) )
@@ -1907,34 +1958,38 @@ void Cmd_Sell_f( gentity_t *ent )
}
}
+ //no MCU nearby
if( !nearMCU )
{
trap_SendServerCommand( ent-g_entities, va("print \"You must be near an MCU\n\"" ) );
return;
}
- if( ent->client->pers.pteam != PTE_HUMANS )
- return;
-
weapon = BG_FindWeaponNumForName( s );
upgrade = BG_FindUpgradeNumForName( s );
if( weapon != WP_NONE )
{
+ //remove weapon if carried
if( BG_gotWeapon( weapon, ent->client->ps.stats ) )
BG_removeWeapon( weapon, ent->client->ps.stats );
+
+ //add to funds
+ ent->client->ps.stats[ STAT_CREDIT ] += BG_FindPriceForWeapon( weapon );
}
else if( upgrade != UP_NONE )
{
+ //remove upgrade if carried
if( BG_gotItem( upgrade, ent->client->ps.stats ) )
BG_removeItem( upgrade, ent->client->ps.stats );
+
+ //add to funds
+ ent->client->ps.stats[ STAT_CREDIT ] += BG_FindPriceForUpgrade( upgrade );
}
else
{
trap_SendServerCommand( ent-g_entities, va("print \"Unknown item\n\"" ) );
}
-
- //add to funds
}
@@ -2072,11 +2127,6 @@ void Cmd_Boost_f( gentity_t *ent )
ent->client->ps.stats[ STAT_STATE ] |= SS_SPEEDBOOST;
}
-void Cmd_Credit_f( gentity_t *ent )
-{
- trap_SendServerCommand( ent-g_entities, va("print \"%d\n\"", ent->client->ps.stats[ STAT_CREDIT ] ) );
-}
-
/*
=================
ClientCommand
@@ -2202,8 +2252,6 @@ void ClientCommand( int clientNum ) {
Cmd_SetViewpos_f( ent );
else if (Q_stricmp (cmd, "stats") == 0)
Cmd_Stats_f( ent );
- else if (Q_stricmp (cmd, "credit") == 0)
- Cmd_Credit_f( ent );
else
trap_SendServerCommand( clientNum, va("print \"unknown cmd %s\n\"", cmd ) );
}
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index a5fd8a44..12953de0 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -1065,6 +1065,12 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
targ->client->ps.stats[STAT_HEALTH] = targ->health;
}
+ //TA: add to the attackers "account" on the target
+ if( targ->client && attacker->client &&
+ targ->client->ps.stats[ STAT_PTEAM ] == PTE_DROIDS &&
+ attacker->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+ targ->credits[ attacker->client->ps.clientNum ] += take;
+
if ( targ->health <= 0 ) {
if ( client )
targ->flags |= FL_NO_KNOCKBACK;