Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Q3Rally-Team/q3rally
Browse files Browse the repository at this point in the history
  • Loading branch information
perle committed Jul 31, 2024
2 parents 397106f + 4347bd4 commit 84dc097
Show file tree
Hide file tree
Showing 19 changed files with 249 additions and 71 deletions.
24 changes: 20 additions & 4 deletions engine/code/cgame/cg_draw.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,10 @@ void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean fo
handle = cgs.media.redFlagModel;
} else if( team == TEAM_BLUE ) {
handle = cgs.media.blueFlagModel;
} else if( team == TEAM_GREEN) {
handle = cgs.media.greenFlagModel;
} else if( team == TEAM_YELLOW ) {
handle = cgs.media.yellowFlagModel;
} else if( team == TEAM_FREE ) {
handle = cgs.media.neutralFlagModel;
} else {
Expand All @@ -404,6 +408,10 @@ void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean fo
item = BG_FindItemForPowerup( PW_REDFLAG );
} else if( team == TEAM_BLUE ) {
item = BG_FindItemForPowerup( PW_BLUEFLAG );
} else if( team == TEAM_GREEN ) {
item = BG_FindItemForPowerup( PW_GREENFLAG );
} else if( team == TEAM_YELLOW ) {
item = BG_FindItemForPowerup( PW_YELLOWFLAG );
} else if( team == TEAM_FREE ) {
item = BG_FindItemForPowerup( PW_NEUTRALFLAG );
} else {
Expand Down Expand Up @@ -640,6 +648,10 @@ static void CG_DrawStatusBar( void ) {
CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_RED );
} else if( cg.predictedPlayerState.powerups[PW_BLUEFLAG] ) {
CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_BLUE );
} else if( cg.predictedPlayerState.powerups[PW_GREENFLAG] ) {
CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_GREEN );
} else if( cg.predictedPlayerState.powerups[PW_YELLOWFLAG] ) {
CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_YELLOW );
} else if( cg.predictedPlayerState.powerups[PW_NEUTRALFLAG] ) {
CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_FREE );
}
Expand Down Expand Up @@ -847,6 +859,10 @@ static void CG_DrawRallyStatusBar( void ) {
CG_DrawStatusBarFlag( 495, TEAM_RED);
else if (cg.predictedPlayerState.powerups[PW_BLUEFLAG])
CG_DrawStatusBarFlag( 495, TEAM_BLUE);
else if (cg.predictedPlayerState.powerups[PW_GREENFLAG])
CG_DrawStatusBarFlag( 495, TEAM_GREEN);
else if (cg.predictedPlayerState.powerups[PW_YELLOWFLAG])
CG_DrawStatusBarFlag( 495, TEAM_YELLOW);
else if (cg_entities[cg.snap->ps.clientNum].finishRaceTime &&
cg_entities[cg.snap->ps.clientNum].currentPosition == 1){

Expand Down Expand Up @@ -1179,17 +1195,17 @@ static void CG_DrawRallyPowerups( void ) {
active++;
}

// draw the icons and timers
// draw the icons and timers TRYOUT: bug #71

for ( i = 0 ; i < active ; i++ ) {
item = BG_FindItemForPowerup( sorted[i] );

color = 1;

CG_FillRect( 402, 476 - 30, 90, 24, bg_color );
CG_FillRect( 495, 476 - 30, 90, 24, bg_color );

trap_R_SetColor( colors[color] );
CG_DrawField( 424 + CHAR_WIDTH, 476 - 28, 2, sortedTime[ i ] / 1000 );
CG_DrawField( 517 + CHAR_WIDTH, 476 - 28, 2, sortedTime[ i ] / 1000 );

t = ps->powerups[ sorted[i] ];
if ( t - cg.time >= POWERUP_BLINKS * POWERUP_BLINK_TIME ) {
Expand All @@ -1216,7 +1232,7 @@ static void CG_DrawRallyPowerups( void ) {
size = 19;
}

CG_DrawPic( 408, 476 - 27, size, size, trap_R_RegisterShader( item->icon ) );
CG_DrawPic( 503, 476 - 27, size, size, trap_R_RegisterShader( item->icon ) );
}
trap_R_SetColor( NULL );
}
Expand Down
2 changes: 2 additions & 0 deletions engine/code/cgame/cg_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,8 @@ typedef struct {

qhandle_t redFlagFlapSkin;
qhandle_t blueFlagFlapSkin;
qhandle_t greenFlagFlapSkin;
qhandle_t yellowFlagFlapSkin;
qhandle_t neutralFlagFlapSkin;

qhandle_t redFlagBaseModel;
Expand Down
10 changes: 10 additions & 0 deletions engine/code/cgame/cg_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1130,6 +1130,8 @@ static void CG_RegisterGraphics( void ) {

cgs.media.redFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/red.skin" );
cgs.media.blueFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/blue.skin" );
cgs.media.greenFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/green.skin" );
cgs.media.yellowFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/yellow.skin" );
cgs.media.neutralFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/white.skin" );

cgs.media.redFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/red_base.md3" );
Expand Down Expand Up @@ -1910,6 +1912,10 @@ static const char *CG_FeederItemText(float feederID, int index, int column, qhan
team = TEAM_RED;
} else if (feederID == FEEDER_BLUETEAM_LIST) {
team = TEAM_BLUE;
} else if (feederID == FEEDER_GREENTEAM_LIST) {
team = TEAM_GREEN;
} else if (feederID == FEEDER_YELLOWTEAM_LIST) {
team = TEAM_YELLOW;
}

info = CG_InfoFromScoreIndex(index, team, &scoreIndex);
Expand All @@ -1926,6 +1932,10 @@ static const char *CG_FeederItemText(float feederID, int index, int column, qhan
*handle = cg_items[ ITEM_INDEX(item) ].icon;
} else if ( info->powerups & ( 1 << PW_BLUEFLAG ) ) {
item = BG_FindItemForPowerup( PW_BLUEFLAG );
} else if ( info->powerups & ( 1 << PW_GREENFLAG ) ) {
item = BG_FindItemForPowerup( PW_GREENFLAG );
} else if ( info->powerups & ( 1 << PW_YELLOWFLAG ) ) {
item = BG_FindItemForPowerup( PW_YELLOWFLAG );
*handle = cg_items[ ITEM_INDEX(item) ].icon;
} else {
if ( info->botSkill > 0 && info->botSkill <= 5 ) {
Expand Down
3 changes: 0 additions & 3 deletions engine/code/cgame/cg_players.c
Original file line number Diff line number Diff line change
Expand Up @@ -2416,7 +2416,6 @@ static void CG_PlayerPowerups( centity_t *cent, refEntity_t *torso ) {
trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2f, 0.2f, 1.0 );
}

/* finish in 0.5

// greenflag
if ( powerups & ( 1 << PW_GREENFLAG ) ) {
Expand All @@ -2440,8 +2439,6 @@ static void CG_PlayerPowerups( centity_t *cent, refEntity_t *torso ) {
trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 1.0, 1.0, 0.2f );
}

// end finish in 0.5
*/

// neutralflag
if ( powerups & ( 1 << PW_NEUTRALFLAG ) ) {
Expand Down
2 changes: 2 additions & 0 deletions engine/code/cgame/cg_playerstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,8 @@ void CG_CheckLocalSounds( playerState_t *ps, playerState_t *ops ) {
if ( cgs.gametype > GT_TEAM ) {
if ((ps->powerups[PW_REDFLAG] != ops->powerups[PW_REDFLAG] && ps->powerups[PW_REDFLAG]) ||
(ps->powerups[PW_BLUEFLAG] != ops->powerups[PW_BLUEFLAG] && ps->powerups[PW_BLUEFLAG]) ||
(ps->powerups[PW_GREENFLAG] != ops->powerups[PW_GREENFLAG] && ps->powerups[PW_GREENFLAG]) ||
(ps->powerups[PW_YELLOWFLAG] != ops->powerups[PW_YELLOWFLAG] && ps->powerups[PW_YELLOWFLAG]) ||
(ps->powerups[PW_NEUTRALFLAG] != ops->powerups[PW_NEUTRALFLAG] && ps->powerups[PW_NEUTRALFLAG]) )
{
trap_S_StartLocalSound( cgs.media.youHaveFlagSound, CHAN_ANNOUNCER );
Expand Down
6 changes: 6 additions & 0 deletions engine/code/cgame/cg_predict.c
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,12 @@ static void CG_TouchItem( centity_t *cent ) {
if (cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_BLUE &&
item->giType == IT_TEAM && item->giTag == PW_BLUEFLAG)
return;
if (cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_GREEN &&
item->giType == IT_TEAM && item->giTag == PW_GREENFLAG)
return;
if (cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_YELLOW &&
item->giType == IT_TEAM && item->giTag == PW_YELLOWFLAG)
return;
}

// grab it
Expand Down
14 changes: 14 additions & 0 deletions engine/code/cgame/cg_scoreboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,20 @@ static void CG_DrawClientScore( int y, score_t *score, float *color, float fade,
else {
CG_DrawFlagModel( iconx, y, 16, 16, TEAM_BLUE, qfalse );
}
} else if ( ci->powerups & ( 1 << PW_GREENFLAG ) ) {
if( largeFormat ) {
CG_DrawFlagModel( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, TEAM_GREEN, qfalse );
}
else {
CG_DrawFlagModel( iconx, y, 16, 16, TEAM_GREEN, qfalse );
}
} else if ( ci->powerups & ( 1 << PW_YELLOWFLAG ) ) {
if( largeFormat ) {
CG_DrawFlagModel( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, TEAM_YELLOW, qfalse );
}
else {
CG_DrawFlagModel( iconx, y, 16, 16, TEAM_YELLOW, qfalse );
}
}
// STONELANCE - draw flag beside winner
else if (cg_entities[score->client].finishRaceTime &&
Expand Down
8 changes: 8 additions & 0 deletions engine/code/game/ai_dmq3.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ int BotCTFCarryingFlag(bot_state_t *bs) {

if (bs->inventory[INVENTORY_REDFLAG] > 0) return CTF_FLAG_RED;
else if (bs->inventory[INVENTORY_BLUEFLAG] > 0) return CTF_FLAG_BLUE;
else if (bs->inventory[INVENTORY_GREENFLAG] > 0) return CTF_FLAG_GREEN;
else if (bs->inventory[INVENTORY_YELLOWFLAG] > 0) return CTF_FLAG_YELLOW;
return CTF_FLAG_NONE;
}

Expand Down Expand Up @@ -229,6 +231,10 @@ qboolean EntityCarriesFlag(aas_entityinfo_t *entinfo) {
return qtrue;
if ( entinfo->powerups & ( 1 << PW_BLUEFLAG ) )
return qtrue;
if ( entinfo->powerups & ( 1 << PW_GREENFLAG ) )
return qtrue;
if ( entinfo->powerups & ( 1 << PW_YELLOWFLAG ) )
return qtrue;
#ifdef MISSIONPACK
if ( entinfo->powerups & ( 1 << PW_NEUTRALFLAG ) )
return qtrue;
Expand Down Expand Up @@ -1799,6 +1805,8 @@ void BotUpdateInventory(bot_state_t *bs) {
#endif
bs->inventory[INVENTORY_REDFLAG] = bs->cur_ps.powerups[PW_REDFLAG] != 0;
bs->inventory[INVENTORY_BLUEFLAG] = bs->cur_ps.powerups[PW_BLUEFLAG] != 0;
bs->inventory[INVENTORY_GREENFLAG] = bs->cur_ps.powerups[PW_GREENFLAG] != 0;
bs->inventory[INVENTORY_YELLOWFLAG] = bs->cur_ps.powerups[PW_YELLOWFLAG] != 0;
#ifdef MISSIONPACK
bs->inventory[INVENTORY_NEUTRALFLAG] = bs->cur_ps.powerups[PW_NEUTRALFLAG] != 0;
if (BotTeam(bs) == TEAM_RED) {
Expand Down
4 changes: 4 additions & 0 deletions engine/code/game/ai_dmq3.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,13 @@ void BotMapScripts(bot_state_t *bs);
#define CTF_FLAG_NONE 0
#define CTF_FLAG_RED 1
#define CTF_FLAG_BLUE 2
#define CTF_FLAG_GREEN 3
#define CTF_FLAG_YELLOW 4
//CTF skins
#define CTF_SKIN_REDTEAM "red"
#define CTF_SKIN_BLUETEAM "blue"
#define CTF_SKIN_GREENTEAM "green"
#define CTF_SKIN_YELLOWTEAM "yellow"

extern int gametype; //game type
extern int maxclients; //maximum number of clients
Expand Down
51 changes: 50 additions & 1 deletion engine/code/game/bg_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -881,7 +881,40 @@ Only in CTF games
/* precache */ "",
/* sounds */ ""
},

/*QUAKED team_CTF_greenflag (0 1 0) (-16 -16 -16) (16 16 16)
Only in CTF games
*/
{
"team_CTF_greenflag",
NULL,
{ "models/flags/b_flag.md3",
NULL, NULL, NULL },
/* icon */ "icons/iconf_green1",
/* pickup */ "Green Flag",
0,
IT_TEAM,
PW_GREENFLAG,
/* precache */ "",
/* sounds */ ""
},

/*QUAKED team_CTF_yellowflag (1 1 0) (-16 -16 -16) (16 16 16)
Only in CTF games
*/
{
"team_CTF_yellowflag",
NULL,
{ "models/flags/b_flag.md3",
NULL, NULL, NULL },
/* icon */ "icons/iconf_yell1",
/* pickup */ "Yellow Flag",
0,
IT_TEAM,
PW_YELLOWFLAG,
/* precache */ "",
/* sounds */ ""
},
// Q3Rally Code Start

/*QUAKED team_DOMINATION_sigil_red
Expand Down Expand Up @@ -1505,12 +1538,28 @@ qboolean BG_CanItemBeGrabbed( int gametype, const entityState_t *ent, const play
(item->giTag == PW_REDFLAG && ent->modelindex2) ||
(item->giTag == PW_REDFLAG && ps->powerups[PW_BLUEFLAG]) )
return qtrue;
} else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) {
}

else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) {
if (item->giTag == PW_REDFLAG ||
(item->giTag == PW_BLUEFLAG && ent->modelindex2) ||
(item->giTag == PW_BLUEFLAG && ps->powerups[PW_REDFLAG]) )
return qtrue;
}

else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) {
if (item->giTag == PW_REDFLAG ||
(item->giTag == PW_BLUEFLAG && ent->modelindex2) ||
(item->giTag == PW_BLUEFLAG && ps->powerups[PW_REDFLAG]) )
return qtrue;
}

else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) {
if (item->giTag == PW_REDFLAG ||
(item->giTag == PW_BLUEFLAG && ent->modelindex2) ||
(item->giTag == PW_BLUEFLAG && ps->powerups[PW_REDFLAG]) )
return qtrue;
}
}

#ifdef MISSIONPACK
Expand Down
4 changes: 2 additions & 2 deletions engine/code/game/bg_public.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,8 +405,8 @@ typedef enum {

PW_REDFLAG,
PW_BLUEFLAG,
// PW_GREENFLAG,
// PW_YELLOWFLAG,
PW_GREENFLAG,
PW_YELLOWFLAG,
PW_NEUTRALFLAG,

#ifdef MISSIONPACK
Expand Down
6 changes: 6 additions & 0 deletions engine/code/game/g_active.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,12 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) {
} else if ( ent->client->ps.powerups[ PW_BLUEFLAG ] ) {
item = BG_FindItemForPowerup( PW_BLUEFLAG );
j = PW_BLUEFLAG;
} else if ( ent->client->ps.powerups[ PW_GREENFLAG ] ) {
item = BG_FindItemForPowerup( PW_GREENFLAG );
j = PW_GREENFLAG;
} else if ( ent->client->ps.powerups[ PW_YELLOWFLAG ] ) {
item = BG_FindItemForPowerup( PW_YELLOWFLAG );
j = PW_YELLOWFLAG;
} else if ( ent->client->ps.powerups[ PW_NEUTRALFLAG ] ) {
item = BG_FindItemForPowerup( PW_NEUTRALFLAG );
j = PW_NEUTRALFLAG;
Expand Down
10 changes: 10 additions & 0 deletions engine/code/game/g_combat.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,8 @@ void CheckAlmostCapture( gentity_t *self, gentity_t *attacker ) {
// if this player was carrying a flag
if ( self->client->ps.powerups[PW_REDFLAG] ||
self->client->ps.powerups[PW_BLUEFLAG] ||
self->client->ps.powerups[PW_GREENFLAG] ||
self->client->ps.powerups[PW_YELLOWFLAG] ||
self->client->ps.powerups[PW_NEUTRALFLAG] ) {
// get the goal flag this player should have been going for
if ( g_gametype.integer == GT_CTF ) {
Expand Down Expand Up @@ -631,6 +633,14 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int
Team_ReturnFlag( TEAM_BLUE );
self->client->ps.powerups[PW_BLUEFLAG] = 0;
}
else if ( self->client->ps.powerups[PW_GREENFLAG] ) { // only happens in standard CTF
Team_ReturnFlag( TEAM_GREEN );
self->client->ps.powerups[PW_GREENFLAG] = 0;
}
else if ( self->client->ps.powerups[PW_YELLOWFLAG] ) { // only happens in standard CTF
Team_ReturnFlag( TEAM_YELLOW );
self->client->ps.powerups[PW_YELLOWFLAG] = 0;
}
}

TossClientItems( self );
Expand Down
8 changes: 8 additions & 0 deletions engine/code/game/g_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,14 @@ static void PortalTouch( gentity_t *self, gentity_t *other, trace_t *trace) {
Drop_Item( other, BG_FindItemForPowerup( PW_BLUEFLAG ), 0 );
other->client->ps.powerups[PW_BLUEFLAG] = 0;
}
else if ( other->client->ps.powerups[PW_GREENFLAG] ) { // only happens in standard CTF
Drop_Item( other, BG_FindItemForPowerup( PW_GREENFLAG ), 0 );
other->client->ps.powerups[PW_GREENFLAG] = 0;
}
else if ( other->client->ps.powerups[PW_YELLOWFLAG] ) { // only happens in standard CTF
Drop_Item( other, BG_FindItemForPowerup( PW_YELLOWFLAG ), 0 );
other->client->ps.powerups[PW_YELLOWFLAG] = 0;
}

// find the destination
destination = NULL;
Expand Down
2 changes: 1 addition & 1 deletion engine/code/game/g_rankings.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ void G_RankPickupPowerup( int self, int powerup )
}

// ctf flags are treated as powerups
if( (powerup == PW_REDFLAG) || (powerup == PW_BLUEFLAG) )
if( (powerup == PW_REDFLAG) || (powerup == PW_BLUEFLAG) || (powerup == PW_GREENFLAG) || (powerup == PW_YELLOWFLAG) )
{
trap_RankReportInt( self, -1, QGR_KEY_FLAG_PICKUP, 1, 1 );
return;
Expand Down
4 changes: 4 additions & 0 deletions engine/code/game/g_target.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ void Use_target_remove_powerups( gentity_t *ent, gentity_t *other, gentity_t *ac
Team_ReturnFlag( TEAM_RED );
} else if( activator->client->ps.powerups[PW_BLUEFLAG] ) {
Team_ReturnFlag( TEAM_BLUE );
} else if( activator->client->ps.powerups[PW_GREENFLAG] ) {
Team_ReturnFlag( TEAM_GREEN );
} else if( activator->client->ps.powerups[PW_YELLOWFLAG] ) {
Team_ReturnFlag( TEAM_YELLOW );
} else if( activator->client->ps.powerups[PW_NEUTRALFLAG] ) {
Team_ReturnFlag( TEAM_FREE );
}
Expand Down
Loading

0 comments on commit 84dc097

Please sign in to comment.