From 3553ea3cf7f58c6366ea8514114807d118beaf73 Mon Sep 17 00:00:00 2001 From: zico Date: Mon, 8 Apr 2013 12:46:05 +0200 Subject: [PATCH] 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 --- CHANGELOG.txt | 5 + main/gamerend.c | 24 +++- main/menu.c | 16 ++- main/multi.c | 342 ++++++++++++++++++++++++++++++++---------------- main/multi.h | 9 +- main/net_udp.c | 62 +++++++-- main/playsave.c | 4 + main/playsave.h | 1 + 8 files changed, 327 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 8fa708a5b..cf722ced8 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -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 diff --git a/main/gamerend.c b/main/gamerend.c index bb93327db..53d96b47c 100644 --- a/main/gamerend.c +++ b/main/gamerend.c @@ -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 diff --git a/main/menu.c b/main/menu.c index 1b8c3a1b2..7e86bdba4 100644 --- a/main/menu.c +++ b/main/menu.c @@ -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 ); diff --git a/main/multi.c b/main/multi.c index 3c66fc841..80da53cbe 100644 --- a/main/multi.c +++ b/main/multi.c @@ -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].rankrank) + 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) diff --git a/main/multi.h b/main/multi.h index c2c68f7a0..abcd6fd10 100644 --- a/main/multi.h +++ b/main/multi.h @@ -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 diff --git a/main/net_udp.c b/main/net_udp.c index 8cda9159a..9254c9d6b 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -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) { 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;iplayer.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 diff --git a/main/playsave.c b/main/playsave.c index cc426725d..b00a95286 100644 --- a/main/playsave.c +++ b/main/playsave.c @@ -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); diff --git a/main/playsave.h b/main/playsave.h index 812242d98..47e1920a7 100644 --- a/main/playsave.h +++ b/main/playsave.h @@ -78,6 +78,7 @@ typedef struct player_config int PRShot; ubyte NoRedundancy; ubyte MultiMessages; + ubyte NoRankings; ubyte BombGauge; ubyte AutomapFreeFlight; ubyte NoFireAutoselect;