Added Rankings functionality like in D2X-Rebirth while still utilizing eff file from original D1X source; Decrease personal score when killing multi buddy and don't increment towards kill goal

This commit is contained in:
zico 2013-04-08 12:46:05 +02:00
parent 7d5833007d
commit 3553ea3cf7
8 changed files with 327 additions and 136 deletions

View file

@ -10,6 +10,11 @@ d1x-rebirth.xcodeproj/project.pbxproj, editor/ehostage.c, main/custom.c: Updated
SConstruct: For the assembler build, make sure platform_settings is accessed from self, likely preventing a compiling error
SConstruct: Changes towards building using SCons on Mac OS X
20130119
--------
main/gamerend.c, main/menu.c, main/multi.c, main/multi.h, main/net_udp.c, main/playsave.c, main/playsave.h: Added Rankings functionality like in D2X-Rebirth while still utilizing eff file from original D1X source
main/multi.c, main/multi.h: Decrease personal score when killing multi buddy and don't increment towards kill goal
20130117
--------
main/render.c: Fix click-selection in the editor for OpenGL implementations that insist on point blending

View file

@ -117,7 +117,8 @@ void show_framerate()
#ifdef NETWORK
void show_netplayerinfo()
{
int x=0, y=0, i=0, color=0;
int x=0, y=0, i=0, color=0, eff=0;
char *eff_strings[]={"trashing","really hurting","seriously effecting","hurting","effecting","tarnishing"};
gr_set_current_canvas(NULL);
gr_set_curfont(GAME_FONT);
@ -210,6 +211,27 @@ void show_netplayerinfo()
gr_printf(x+FSPACX(8)*8,y,"%i",team_kills[1]);
y+=LINE_SPACING*2;
}
else
y+=LINE_SPACING*4;
gr_set_fontcolor(255,-1);
// additional information about game - ranking
eff=(int)((float)((float)PlayerCfg.NetlifeKills/((float)PlayerCfg.NetlifeKilled+(float)PlayerCfg.NetlifeKills))*100.0);
if (eff<0)
eff=0;
if (!PlayerCfg.NoRankings)
{
gr_printf(0x8000,y,"Your lifetime efficiency of %d%% (%d/%d)",eff,PlayerCfg.NetlifeKills,PlayerCfg.NetlifeKilled);
y+=LINE_SPACING;
if (eff<60)
gr_printf(0x8000,y,"is %s your ranking.",eff_strings[eff/10]);
else
gr_printf(0x8000,y,"is serving you well.");
y+=LINE_SPACING;
gr_printf(0x8000,y,"your rank is: %s",RankStrings[GetMyNetRanking()]);
}
}
#endif

View file

@ -1865,7 +1865,7 @@ void do_sound_menu()
void do_misc_menu()
{
newmenu_item m[8];
newmenu_item m[9];
int i = 0;
do {
@ -1874,9 +1874,10 @@ void do_misc_menu()
ADD_CHECK(2, "Screenshots w/o HUD",PlayerCfg.PRShot);
ADD_CHECK(3, "No redundant pickup messages",PlayerCfg.NoRedundancy);
ADD_CHECK(4, "Show Player chat only (Multi)",PlayerCfg.MultiMessages);
ADD_CHECK(5, "Show D2-style Prox. Bomb Gauge",PlayerCfg.BombGauge);
ADD_CHECK(6, "Free Flight controls in Automap",PlayerCfg.AutomapFreeFlight);
ADD_CHECK(7, "No Weapon Autoselect when firing",PlayerCfg.NoFireAutoselect);
ADD_CHECK(5, "No Rankings (Multi)",PlayerCfg.NoRankings);
ADD_CHECK(6, "Show D2-style Prox. Bomb Gauge",PlayerCfg.BombGauge);
ADD_CHECK(7, "Free Flight controls in Automap",PlayerCfg.AutomapFreeFlight);
ADD_CHECK(8, "No Weapon Autoselect when firing",PlayerCfg.NoFireAutoselect);
i = newmenu_do1( NULL, "Misc Options", sizeof(m)/sizeof(*m), m, NULL, NULL, i );
@ -1885,9 +1886,10 @@ void do_misc_menu()
PlayerCfg.PRShot = m[2].value;
PlayerCfg.NoRedundancy = m[3].value;
PlayerCfg.MultiMessages = m[4].value;
PlayerCfg.BombGauge = m[5].value;
PlayerCfg.AutomapFreeFlight = m[6].value;
PlayerCfg.NoFireAutoselect = m[7].value;
PlayerCfg.NoRankings = m[5].value;
PlayerCfg.BombGauge = m[6].value;
PlayerCfg.AutomapFreeFlight = m[7].value;
PlayerCfg.NoFireAutoselect = m[8].value;
} while( i>-1 );

View file

@ -80,6 +80,7 @@ void multi_send_heartbeat();
void multi_do_kill_goal_counts(const ubyte *buf);
void multi_powcap_cap_objects();
void multi_powcap_adjust_remote_cap(int pnum);
void multi_send_ranking();
void multi_new_bounty_target( int pnum );
void multi_do_bounty( const ubyte *buf );
void multi_save_game(ubyte slot, uint id, char *desc);
@ -204,6 +205,7 @@ static const int message_length[MULTI_MAX_TYPE+1] = {
3, // MULTI_GMODE_UPDATE
7, // MULTI_KILL_HOST
5, // MULTI_KILL_CLIENT
3, // MULTI_RANK
};
void multi_reset_player_object(object *objp);
@ -211,6 +213,9 @@ void multi_set_robot_ai(void);
void multi_add_lifetime_killed();
void multi_add_lifetime_kills();
char *RankStrings[]={"(unpatched) ","Cadet ","Ensign ","Lieutenant ","Lt.Commander ",
"Commander ","Captain ","Vice Admiral ","Admiral ","Demigod "};
int multi_allow_powerup_mask[MAX_POWERUP_TYPES] =
{ NETFLAG_DOINVUL, 0, 0, NETFLAG_DOLASER, 0, 0, 0, 0, 0, 0, 0, 0, NETFLAG_DOQUAD,
NETFLAG_DOVULCAN, NETFLAG_DOSPREAD, NETFLAG_DOPLASMA, NETFLAG_DOFUSION,
@ -222,6 +227,41 @@ char *multi_allow_powerup_text[MULTI_ALLOW_POWERUP_MAX] =
"Fusion cannon", "Homing missiles", "Smart missiles", "Mega missiles", "Proximity bombs",
"Cloaking", "Invulnerability" };
int GetMyNetRanking()
{
int rank, eff;
if (PlayerCfg.NetlifeKills+PlayerCfg.NetlifeKilled==0)
return (1);
rank=(int) (((float)PlayerCfg.NetlifeKills/3000.0)*8.0);
eff=(int)((float)((float)PlayerCfg.NetlifeKills/((float)PlayerCfg.NetlifeKilled+(float)PlayerCfg.NetlifeKills))*100.0);
if (rank>8)
rank=8;
if (eff<0)
eff=0;
if (eff<60)
rank-=((59-eff)/10);
if (rank<0)
rank=0;
if (rank>8)
rank=8;
return (rank+1);
}
void ClipRank (ubyte *rank)
{
// This function insures no crashes when dealing with D2 1.0
if (*rank > 9)
*rank = 0;
}
//
// Functions that replace what used to be macros
//
@ -678,14 +718,21 @@ void multi_compute_kill(int killer, int killed)
else
{
if (Game_mode & GM_TEAM)
if (Game_mode & GM_TEAM)
{
if (get_team(killed_pnum) == get_team(killer_pnum))
{
if (get_team(killed_pnum) == get_team(killer_pnum))
team_kills[get_team(killed_pnum)] -= 1;
else
team_kills[get_team(killer_pnum)] += 1;
team_kills[get_team(killed_pnum)] -= 1;
Players[killer_pnum].net_kills_total -= 1;
}
else
{
team_kills[get_team(killer_pnum)] += 1;
Players[killer_pnum].net_kills_total += 1;
Players[killer_pnum].KillGoalCount +=1;
}
}
if( Game_mode & GM_BOUNTY )
else if( Game_mode & GM_BOUNTY )
{
/* Did the target die? Did the target get a kill? */
if( killed_pnum == Bounty_target || killer_pnum == Bounty_target )
@ -2229,111 +2276,6 @@ void multi_reset_object_texture (object *objp)
}
}
void
multi_process_data(const ubyte *buf, int len)
{
// Take an entire message (that has already been checked for validity,
// if necessary) and act on it.
int type;
len = len;
type = buf[0];
if (type > MULTI_MAX_TYPE)
{
Int3();
return;
}
switch(type)
{
case MULTI_POSITION:
if (!Endlevel_sequence) multi_do_position(buf); break;
case MULTI_REAPPEAR:
if (!Endlevel_sequence) multi_do_reappear(buf); break;
case MULTI_FIRE:
if (!Endlevel_sequence) multi_do_fire(buf); break;
case MULTI_KILL:
multi_do_kill(buf); break;
case MULTI_REMOVE_OBJECT:
if (!Endlevel_sequence) multi_do_remobj(buf); break;
case MULTI_PLAYER_DROP:
case MULTI_PLAYER_EXPLODE:
if (!Endlevel_sequence) multi_do_player_explode(buf); break;
case MULTI_MESSAGE:
if (!Endlevel_sequence) multi_do_message(buf); break;
case MULTI_QUIT:
if (!Endlevel_sequence) multi_do_quit(buf); break;
case MULTI_BEGIN_SYNC:
break;
case MULTI_CONTROLCEN:
if (!Endlevel_sequence) multi_do_controlcen_destroy(buf); break;
case MULTI_ENDLEVEL_START:
if (!Endlevel_sequence) multi_do_escape(buf); break;
case MULTI_END_SYNC:
break;
case MULTI_CLOAK:
if (!Endlevel_sequence) multi_do_cloak(buf); break;
case MULTI_DECLOAK:
if (!Endlevel_sequence) multi_do_decloak(buf); break;
case MULTI_DOOR_OPEN:
if (!Endlevel_sequence) multi_do_door_open(buf); break;
case MULTI_CREATE_EXPLOSION:
if (!Endlevel_sequence) multi_do_create_explosion(buf); break;
case MULTI_CONTROLCEN_FIRE:
if (!Endlevel_sequence) multi_do_controlcen_fire(buf); break;
case MULTI_CREATE_POWERUP:
if (!Endlevel_sequence) multi_do_create_powerup(buf); break;
case MULTI_PLAY_SOUND:
if (!Endlevel_sequence) multi_do_play_sound(buf); break;
case MULTI_ROBOT_CLAIM:
if (!Endlevel_sequence) multi_do_claim_robot(buf); break;
case MULTI_ROBOT_POSITION:
if (!Endlevel_sequence) multi_do_robot_position(buf); break;
case MULTI_ROBOT_EXPLODE:
if (!Endlevel_sequence) multi_do_robot_explode(buf); break;
case MULTI_ROBOT_RELEASE:
if (!Endlevel_sequence) multi_do_release_robot(buf); break;
case MULTI_ROBOT_FIRE:
if (!Endlevel_sequence) multi_do_robot_fire(buf); break;
case MULTI_SCORE:
if (!Endlevel_sequence) multi_do_score(buf); break;
case MULTI_CREATE_ROBOT:
if (!Endlevel_sequence) multi_do_create_robot(buf); break;
case MULTI_TRIGGER:
if (!Endlevel_sequence) multi_do_trigger(buf); break;
case MULTI_BOSS_ACTIONS:
if (!Endlevel_sequence) multi_do_boss_actions(buf); break;
case MULTI_CREATE_ROBOT_POWERUPS:
if (!Endlevel_sequence) multi_do_create_robot_powerups(buf); break;
case MULTI_HOSTAGE_DOOR:
if (!Endlevel_sequence) multi_do_hostage_door_status(buf); break;
case MULTI_SAVE_GAME:
if (!Endlevel_sequence) multi_do_save_game(buf); break;
case MULTI_RESTORE_GAME:
if (!Endlevel_sequence) multi_do_restore_game(buf); break;
case MULTI_POWCAP_UPDATE:
if (!Endlevel_sequence) multi_do_powcap_update(buf); break;
case MULTI_HEARTBEAT:
if (!Endlevel_sequence) multi_do_heartbeat (buf); break;
case MULTI_KILLGOALS:
if (!Endlevel_sequence) multi_do_kill_goal_counts (buf); break;
case MULTI_DO_BOUNTY:
if( !Endlevel_sequence ) multi_do_bounty( buf ); break;
case MULTI_TYPING_STATE:
multi_do_msgsend_state( buf ); break;
case MULTI_GMODE_UPDATE:
multi_do_gmode_update( buf ); break;
case MULTI_KILL_HOST:
multi_do_kill(buf); break;
case MULTI_KILL_CLIENT:
multi_do_kill(buf); break;
default:
Int3();
}
}
void
multi_process_bigdata(const ubyte *buf, int len)
{
@ -3406,20 +3348,85 @@ void multi_check_for_killgoal_winner ()
net_destroy_controlcen (objp);
}
extern char *RankStrings[];
void multi_add_lifetime_kills ()
{
// This function adds a kill to lifetime stats of this player
// Trivial, but syncing with D2X
// This function adds a kill to lifetime stats of this player, and possibly
// gives a promotion. If so, it will tell everyone else
int oldrank;
if (!(Game_mode & GM_NETWORK))
return;
oldrank=GetMyNetRanking();
PlayerCfg.NetlifeKills++;
if (oldrank!=GetMyNetRanking())
{
multi_send_ranking();
if (!PlayerCfg.NoRankings)
{
HUD_init_message(HM_MULTI, "You have been promoted to %s!",RankStrings[GetMyNetRanking()]);
digi_play_sample (SOUND_CONTROL_CENTER_WARNING_SIREN,F1_0*2);
Netgame.players[Player_num].rank=GetMyNetRanking();
}
}
}
void multi_add_lifetime_killed ()
{
// This function adds a "killed" to lifetime stats of this player
// Trivial, but syncing with D2X
// This function adds a "killed" to lifetime stats of this player, and possibly
// gives a demotion. If so, it will tell everyone else
int oldrank;
if (!(Game_mode & GM_NETWORK))
return;
oldrank=GetMyNetRanking();
PlayerCfg.NetlifeKilled++;
if (oldrank!=GetMyNetRanking())
{
multi_send_ranking();
Netgame.players[Player_num].rank=GetMyNetRanking();
if (!PlayerCfg.NoRankings)
HUD_init_message(HM_MULTI, "You have been demoted to %s!",RankStrings[GetMyNetRanking()]);
}
}
void multi_send_ranking ()
{
multibuf[0]=(char)MULTI_RANK;
multibuf[1]=(char)Player_num;
multibuf[2]=(char)GetMyNetRanking();
multi_send_data (multibuf,3,2);
}
void multi_do_ranking (char *buf)
{
char rankstr[20];
char pnum=buf[1];
char rank=buf[2];
if (Netgame.players[(int)pnum].rank<rank)
strcpy (rankstr,"promoted");
else if (Netgame.players[(int)pnum].rank>rank)
strcpy (rankstr,"demoted");
else
return;
Netgame.players[(int)pnum].rank=rank;
if (!PlayerCfg.NoRankings)
HUD_init_message(HM_MULTI, "%s has been %s to %s!",Players[(int)pnum].callsign,rankstr,RankStrings[(int)rank]);
}
// Decide if fire from "killer" is friendly. If yes return 1 (no harm to me) otherwise 0 (damage me)
@ -3728,6 +3735,111 @@ void multi_do_gmode_update(const ubyte *buf)
}
}
void
multi_process_data(const ubyte *buf, int len)
{
// Take an entire message (that has already been checked for validity,
// if necessary) and act on it.
int type;
len = len;
type = buf[0];
if (type > MULTI_MAX_TYPE)
{
Int3();
return;
}
switch(type)
{
case MULTI_POSITION:
if (!Endlevel_sequence) multi_do_position(buf); break;
case MULTI_REAPPEAR:
if (!Endlevel_sequence) multi_do_reappear(buf); break;
case MULTI_FIRE:
if (!Endlevel_sequence) multi_do_fire(buf); break;
case MULTI_KILL:
multi_do_kill(buf); break;
case MULTI_REMOVE_OBJECT:
if (!Endlevel_sequence) multi_do_remobj(buf); break;
case MULTI_PLAYER_DROP:
case MULTI_PLAYER_EXPLODE:
if (!Endlevel_sequence) multi_do_player_explode(buf); break;
case MULTI_MESSAGE:
if (!Endlevel_sequence) multi_do_message(buf); break;
case MULTI_QUIT:
if (!Endlevel_sequence) multi_do_quit(buf); break;
case MULTI_BEGIN_SYNC:
break;
case MULTI_CONTROLCEN:
if (!Endlevel_sequence) multi_do_controlcen_destroy(buf); break;
case MULTI_ENDLEVEL_START:
if (!Endlevel_sequence) multi_do_escape(buf); break;
case MULTI_END_SYNC:
break;
case MULTI_CLOAK:
if (!Endlevel_sequence) multi_do_cloak(buf); break;
case MULTI_DECLOAK:
if (!Endlevel_sequence) multi_do_decloak(buf); break;
case MULTI_DOOR_OPEN:
if (!Endlevel_sequence) multi_do_door_open(buf); break;
case MULTI_CREATE_EXPLOSION:
if (!Endlevel_sequence) multi_do_create_explosion(buf); break;
case MULTI_CONTROLCEN_FIRE:
if (!Endlevel_sequence) multi_do_controlcen_fire(buf); break;
case MULTI_CREATE_POWERUP:
if (!Endlevel_sequence) multi_do_create_powerup(buf); break;
case MULTI_PLAY_SOUND:
if (!Endlevel_sequence) multi_do_play_sound(buf); break;
case MULTI_ROBOT_CLAIM:
if (!Endlevel_sequence) multi_do_claim_robot(buf); break;
case MULTI_ROBOT_POSITION:
if (!Endlevel_sequence) multi_do_robot_position(buf); break;
case MULTI_ROBOT_EXPLODE:
if (!Endlevel_sequence) multi_do_robot_explode(buf); break;
case MULTI_ROBOT_RELEASE:
if (!Endlevel_sequence) multi_do_release_robot(buf); break;
case MULTI_ROBOT_FIRE:
if (!Endlevel_sequence) multi_do_robot_fire(buf); break;
case MULTI_SCORE:
if (!Endlevel_sequence) multi_do_score(buf); break;
case MULTI_CREATE_ROBOT:
if (!Endlevel_sequence) multi_do_create_robot(buf); break;
case MULTI_TRIGGER:
if (!Endlevel_sequence) multi_do_trigger(buf); break;
case MULTI_BOSS_ACTIONS:
if (!Endlevel_sequence) multi_do_boss_actions(buf); break;
case MULTI_CREATE_ROBOT_POWERUPS:
if (!Endlevel_sequence) multi_do_create_robot_powerups(buf); break;
case MULTI_HOSTAGE_DOOR:
if (!Endlevel_sequence) multi_do_hostage_door_status(buf); break;
case MULTI_SAVE_GAME:
if (!Endlevel_sequence) multi_do_save_game(buf); break;
case MULTI_RESTORE_GAME:
if (!Endlevel_sequence) multi_do_restore_game(buf); break;
case MULTI_POWCAP_UPDATE:
if (!Endlevel_sequence) multi_do_powcap_update(buf); break;
case MULTI_HEARTBEAT:
if (!Endlevel_sequence) multi_do_heartbeat (buf); break;
case MULTI_KILLGOALS:
if (!Endlevel_sequence) multi_do_kill_goal_counts (buf); break;
case MULTI_DO_BOUNTY:
if( !Endlevel_sequence ) multi_do_bounty( buf ); break;
case MULTI_TYPING_STATE:
multi_do_msgsend_state( buf ); break;
case MULTI_GMODE_UPDATE:
multi_do_gmode_update( buf ); break;
case MULTI_KILL_HOST:
multi_do_kill(buf); break;
case MULTI_KILL_CLIENT:
multi_do_kill(buf); break;
default:
Int3();
}
}
// Following functions convert object to object_rw and back.
// turn object to object_rw for sending
void multi_object_to_object_rw(object *obj, object_rw *obj_rw)

View file

@ -64,7 +64,7 @@ extern int multi_protocol; // set and determinate used protocol
#define MULTI_PROTO_UDP 1 // UDP protocol
// What version of the multiplayer protocol is this? Increment each time something drastic changes in Multiplayer without the version number changes. Can be reset to 0 each time the version of the game changes
#define MULTI_PROTO_VERSION 3
#define MULTI_PROTO_VERSION 5
// PROTOCOL VARIABLES AND DEFINES - END
@ -113,8 +113,9 @@ extern int multi_protocol; // set and determinate used protocol
#define MULTI_GMODE_UPDATE 42
#define MULTI_KILL_HOST 43
#define MULTI_KILL_CLIENT 44
#define MULTI_RANK 45
#define MULTI_MAX_TYPE 44
#define MULTI_MAX_TYPE 45
#define MAX_MULTI_MESSAGE_LEN 90 //didn't change it, just moved it up
@ -175,6 +176,8 @@ extern char *multi_allow_powerup_text[MULTI_ALLOW_POWERUP_MAX];
// Exported functions
extern int GetMyNetRanking();
extern void ClipRank (ubyte *rank);
int objnum_remote_to_local(int remote_obj, int owner);
int objnum_local_to_remote(int local_obj, sbyte *owner);
void map_objnum_local_to_remote(int local, int remote, int owner);
@ -301,6 +304,8 @@ extern int Bounty_target;
extern bitmap_index multi_player_textures[MAX_PLAYERS][N_PLAYER_SHIP_TEXTURES];
extern char *RankStrings[];
#define NETGAME_FLAG_CLOSED 1
#define NETGAME_FLAG_SHOW_ID 2
#define NETGAME_FLAG_SHOW_MAP 4

View file

@ -1057,6 +1057,8 @@ void net_udp_init()
UDP_Seq.type = UPID_REQUEST;
memcpy(UDP_Seq.player.callsign, Players[Player_num].callsign, CALLSIGN_LEN+1);
UDP_Seq.player.rank=GetMyNetRanking();
multi_new_game();
net_udp_flush();
@ -1236,6 +1238,9 @@ net_udp_new_player(UDP_sequence_packet *their)
memcpy(Netgame.players[pnum].callsign, their->player.callsign, CALLSIGN_LEN+1);
memcpy(&Netgame.players[pnum].protocol.udp.addr, &their->player.protocol.udp.addr, sizeof(struct _sockaddr));
ClipRank (&their->player.rank);
Netgame.players[pnum].rank=their->player.rank;
Players[pnum].connected = CONNECT_PLAYING;
Players[pnum].net_kills_total = 0;
Players[pnum].net_killed_total = 0;
@ -1252,7 +1257,12 @@ net_udp_new_player(UDP_sequence_packet *their)
digi_play_sample(SOUND_HUD_MESSAGE, F1_0);
HUD_init_message(HM_MULTI, "'%s' %s",their->player.callsign, TXT_JOINING);
ClipRank (&their->player.rank);
if (PlayerCfg.NoRankings)
HUD_init_message(HM_MULTI, "'%s' %s\n",their->player.callsign, TXT_JOINING);
else
HUD_init_message(HM_MULTI, "%s'%s' %s\n",RankStrings[their->player.rank],their->player.callsign, TXT_JOINING);
multi_make_ghost_player(pnum);
@ -1384,7 +1394,10 @@ void net_udp_welcome_player(UDP_sequence_packet *their)
digi_play_sample(SOUND_HUD_MESSAGE, F1_0);
HUD_init_message(HM_MULTI, "'%s' %s", Players[player_num].callsign, TXT_REJOIN);
if (PlayerCfg.NoRankings)
HUD_init_message(HM_MULTI, "'%s' %s", Players[player_num].callsign, TXT_REJOIN);
else
HUD_init_message(HM_MULTI, "%s'%s' %s", RankStrings[Netgame.players[player_num].rank],Players[player_num].callsign, TXT_REJOIN);
multi_send_score();
@ -1875,6 +1888,7 @@ void net_udp_add_player(UDP_sequence_packet *p)
return; // too many of em
}
ClipRank (&p->player.rank);
memcpy( Netgame.players[N_players].callsign, p->player.callsign, CALLSIGN_LEN+1 );
memcpy( (struct _sockaddr *)&Netgame.players[N_players].protocol.udp.addr, (struct _sockaddr *)&p->player.protocol.udp.addr, sizeof(struct _sockaddr) );
Netgame.players[N_players].rank=p->player.rank;
@ -1912,6 +1926,7 @@ void net_udp_remove_player(UDP_sequence_packet *p)
memcpy( Netgame.players[i].callsign, Netgame.players[i+1].callsign, CALLSIGN_LEN+1 );
memcpy( (struct _sockaddr *)&Netgame.players[i].protocol.udp.addr, (struct _sockaddr *)&Netgame.players[i+1].protocol.udp.addr, sizeof(struct _sockaddr) );
Netgame.players[i].rank=Netgame.players[i+1].rank;
ClipRank (&Netgame.players[i].rank);
}
N_players--;
@ -2766,8 +2781,10 @@ int net_udp_start_poll( newmenu *menu, d_event *event, void *userdata )
if (n < Netgame.numplayers )
{
sprintf( menus[N_players-1].text, "%d. %-16s", N_players, Netgame.players[N_players-1].callsign );
if (PlayerCfg.NoRankings)
sprintf( menus[N_players-1].text, "%d. %-20s", N_players,Netgame.players[N_players-1].callsign );
else
sprintf( menus[N_players-1].text, "%d. %s%-20s", N_players, RankStrings[Netgame.players[N_players-1].rank],Netgame.players[N_players-1].callsign );
//Begin addition by GF
digi_play_sample(SOUND_HUD_MESSAGE, F1_0); //A noise to alert you when someone joins a starting game...
//End addition by GF
@ -2787,7 +2804,10 @@ int net_udp_start_poll( newmenu *menu, d_event *event, void *userdata )
for (i=0; i<N_players; i++ )
{
sprintf( menus[i].text, "%d. %-16s", i+1, Netgame.players[i].callsign );
if (PlayerCfg.NoRankings)
sprintf( menus[i].text, "%d. %-20s", i+1, Netgame.players[i].callsign );
else
sprintf( menus[i].text, "%d. %s%-20s", i+1, RankStrings[Netgame.players[i].rank],Netgame.players[i].callsign );
if (i < Netgame.max_numplayers)
menus[i].value = 1;
else
@ -3337,6 +3357,7 @@ void net_udp_read_sync_packet( ubyte * data, int data_len, struct _sockaddr send
Players[Player_num].connected = CONNECT_PLAYING;
Netgame.players[Player_num].connected = CONNECT_PLAYING;
Netgame.players[Player_num].rank=GetMyNetRanking();
if (!Network_rejoined)
{
@ -3501,14 +3522,14 @@ net_udp_select_players(void)
{
int i, j, opts, opt_msg;
newmenu_item m[MAX_PLAYERS+1];
char text[MAX_PLAYERS][25];
char text[MAX_PLAYERS][45];
char title[50];
int save_nplayers;
net_udp_add_player( &UDP_Seq );
for (i=0; i< MAX_PLAYERS; i++ ) {
sprintf( text[i], "%d. %-16s", i+1, "" );
sprintf( text[i], "%d. %-20s", i+1, "" );
m[i].type = NM_TYPE_CHECK; m[i].text = text[i]; m[i].value = 0;
}
//added/edited on 11/7/98 by Victor Rachels in an attempt to get msgs going.
@ -3519,7 +3540,10 @@ net_udp_select_players(void)
m[0].value = 1; // Assume server will play...
sprintf( text[0], "%d. %-16s", 1, Players[Player_num].callsign );
if (PlayerCfg.NoRankings)
sprintf( text[0], "%d. %-20s", 1, Players[Player_num].callsign );
else
sprintf( text[0], "%d. %s%-20s", 1, RankStrings[Netgame.players[Player_num].rank],Players[Player_num].callsign );
sprintf( title, "%s %d %s", TXT_TEAM_SELECT, Netgame.max_numplayers, TXT_TEAM_PRESS_ENTER );
GetPlayersAgain:
@ -3609,6 +3633,8 @@ abort:
if (i > N_players)
{
memcpy(Netgame.players[N_players].callsign, Netgame.players[i].callsign, CALLSIGN_LEN+1);
Netgame.players[N_players].rank=Netgame.players[i].rank;
ClipRank (&Netgame.players[N_players].rank);
}
Players[N_players].connected = CONNECT_PLAYING;
N_players++;
@ -3621,6 +3647,7 @@ abort:
for (i = N_players; i < MAX_PLAYERS; i++) {
memset(Netgame.players[i].callsign, 0, CALLSIGN_LEN+1);
Netgame.players[i].rank=0;
}
if (Netgame.gamemode == NETGAME_TEAM_ANARCHY)
@ -4670,8 +4697,12 @@ void net_udp_read_pdata_packet(UDP_frame_info *pd)
newdemo_record_multi_reconnect(TheirPlayernum);
digi_play_sample( SOUND_HUD_MESSAGE, F1_0);
HUD_init_message(HM_MULTI, "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN );
ClipRank (&Netgame.players[TheirPlayernum].rank);
if (PlayerCfg.NoRankings)
HUD_init_message(HM_MULTI, "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN );
else
HUD_init_message(HM_MULTI, "%s'%s' %s", RankStrings[Netgame.players[TheirPlayernum].rank],Players[TheirPlayernum].callsign, TXT_REJOIN );
multi_send_score();
@ -4787,6 +4818,8 @@ void net_udp_process_pong(ubyte *data, int data_len, struct _sockaddr sender_add
void net_udp_do_refuse_stuff (UDP_sequence_packet *their)
{
int i,new_player_num;
ClipRank (&their->player.rank);
for (i=0;i<MAX_PLAYERS;i++)
{
@ -4812,7 +4845,14 @@ void net_udp_do_refuse_stuff (UDP_sequence_packet *their)
if (Game_mode & GM_TEAM)
{
HUD_init_message(HM_MULTI, "%s wants to join",their->player.callsign);
if (!PlayerCfg.NoRankings)
{
HUD_init_message(HM_MULTI, "%s %s wants to join",RankStrings[their->player.rank],their->player.callsign);
}
else
{
HUD_init_message(HM_MULTI, "%s wants to join",their->player.callsign);
}
HUD_init_message(HM_MULTI, "Alt-1 assigns to team %s. Alt-2 to team %s",Netgame.team_name[0],Netgame.team_name[1]);
}
else

View file

@ -94,6 +94,7 @@ int new_player_config()
PlayerCfg.PRShot = 0;
PlayerCfg.NoRedundancy = 0;
PlayerCfg.MultiMessages = 0;
PlayerCfg.NoRankings = 0;
PlayerCfg.BombGauge = 1;
PlayerCfg.AutomapFreeFlight = 0;
PlayerCfg.NoFireAutoselect = 0;
@ -319,6 +320,8 @@ int read_player_d1x(char *filename)
PlayerCfg.NoRedundancy = atoi(line);
if(!strcmp(word,"MULTIMESSAGES"))
PlayerCfg.MultiMessages = atoi(line);
if(!strcmp(word,"NORANKINGS"))
PlayerCfg.NoRankings = atoi(line);
if(!strcmp(word,"BOMBGAUGE"))
PlayerCfg.BombGauge = atoi(line);
if(!strcmp(word,"AUTOMAPFREEFLIGHT"))
@ -653,6 +656,7 @@ int write_player_d1x(char *filename)
PHYSFSX_printf(fout,"prshot=%i\n",PlayerCfg.PRShot);
PHYSFSX_printf(fout,"noredundancy=%i\n",PlayerCfg.NoRedundancy);
PHYSFSX_printf(fout,"multimessages=%i\n",PlayerCfg.MultiMessages);
PHYSFSX_printf(fout,"norankings=%i\n",PlayerCfg.NoRankings);
PHYSFSX_printf(fout,"bombgauge=%i\n",PlayerCfg.BombGauge);
PHYSFSX_printf(fout,"automapfreeflight=%i\n",PlayerCfg.AutomapFreeFlight);
PHYSFSX_printf(fout,"nofireautoselect=%i\n",PlayerCfg.NoFireAutoselect);

View file

@ -78,6 +78,7 @@ typedef struct player_config
int PRShot;
ubyte NoRedundancy;
ubyte MultiMessages;
ubyte NoRankings;
ubyte BombGauge;
ubyte AutomapFreeFlight;
ubyte NoFireAutoselect;