diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 9086da6e4..1616e75f9 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D2X-Rebirth Changelog +20100623 +-------- +main/menu.c, main/newmenu.c, main/newmenu.h, main/net_ipx.c: Making menus recreated on the fly in case resolution or font-size changes; Removing arguments to pass width and height to menu which was not used except on one IPX menu; Fixing measurement of menu strings of type NM_TYPE_INPUT_MENU; Fixing slight bug in freeing IPX netlist + 20100622 -------- main/titles.c: Make sure GAME_FONT is set when reading out briefing text so char dimensions will always be stored correctly diff --git a/main/menu.c b/main/menu.c index bbd1daa31..30c620980 100644 --- a/main/menu.c +++ b/main/menu.c @@ -543,7 +543,7 @@ int DoMenu() create_main_menu(m, menu_choice, &num_options); // may have to change, eg, maybe selected pilot and no save games. - newmenu_do3( "", NULL, num_options, m, (int (*)(newmenu *, d_event *, void *))main_menu_handler, menu_choice, 0, Menu_pcx_name, -1, -1); + newmenu_do3( "", NULL, num_options, m, (int (*)(newmenu *, d_event *, void *))main_menu_handler, menu_choice, 0, Menu_pcx_name); return 0; } @@ -1061,8 +1061,6 @@ void change_res() gr_set_mode(Game_screen_mode); init_cockpit(); game_init_render_buffers(SM_W(screen_mode), SM_H(screen_mode), VR_NONE); - window_close(window_get_front()); // close options dialog - it will be messy with a different resolution - do_options_menu(); // reopen it } int input_menuset(newmenu *menu, d_event *event, void *userdata) @@ -1503,7 +1501,7 @@ void do_multi_player_menu() #endif #endif - newmenu_do3( NULL, TXT_MULTIPLAYER, num_options, m, (int (*)(newmenu *, d_event *, void *))multi_player_menu_handler, menu_choice, 0, NULL, -1, -1 ); + newmenu_do3( NULL, TXT_MULTIPLAYER, num_options, m, (int (*)(newmenu *, d_event *, void *))multi_player_menu_handler, menu_choice, 0, NULL ); } #endif @@ -1540,5 +1538,5 @@ void do_options_menu() // Fall back to main event loop // Allows clean closing and re-opening when resolution changes - newmenu_do3( NULL, TXT_OPTIONS, 11, m, options_menuset, NULL, 0, NULL, -1, -1 ); + newmenu_do3( NULL, TXT_OPTIONS, 11, m, options_menuset, NULL, 0, NULL ); } diff --git a/main/net_ipx.c b/main/net_ipx.c index 1b713f71d..582eb67ed 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -12,9 +12,9 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ /* - * + * * Routines for managing IPX-protocol network play. - * + * */ #ifdef HAVE_CONFIG_H @@ -185,7 +185,7 @@ int ipxdrv_general_packet_ready(int fd) { fd_set set; struct timeval tv; - + FD_ZERO(&set); FD_SET(fd, &set); tv.tv_sec = tv.tv_usec = 0; @@ -221,7 +221,7 @@ void ipxdrv_close() } //--------------------------------------------------------------- -// Initializes all driver internals. +// Initializes all driver internals. // If socket_number==0, then opens next available socket. // Returns: 0 if successful. // -1 if socket already open. @@ -394,7 +394,7 @@ void ipxdrv_get_local_target( ubyte * server, ubyte * node, ubyte * local_target memcpy( local_target, node, 6 ); } -void ipxdrv_send_broadcast_packet_data( ubyte * data, int datasize ) +void ipxdrv_send_broadcast_packet_data( ubyte * data, int datasize ) { int i, j; ubyte local_address[6]; @@ -502,7 +502,7 @@ void net_ipx_send_sequence_packet(IPX_sequence_packet seq, ubyte *server, ubyte tmps = INTEL_SHORT(seq.player.protocol.ipx.socket); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; out_buffer[loc] = seq.player.rank; loc++; - + if (net_address != NULL) ipxdrv_send_packet_data(out_buffer, loc, server, node, net_address); else if ((server == NULL) && (node == NULL)) @@ -534,7 +534,7 @@ void send_netgame_packet(ubyte *server, ubyte *node, ubyte *net_address, int lit if (lite_flag) { IPX_lite_info netpkt; - + netpkt.type = Netgame.protocol.ipx.Game_pkt_type; netpkt.Security = Netgame.protocol.ipx.Game_Security; memcpy(&netpkt.game_name, &Netgame.game_name, sizeof(char)*(NETGAME_NAME_LEN+1)); @@ -553,7 +553,7 @@ void send_netgame_packet(ubyte *server, ubyte *node, ubyte *net_address, int lit netpkt.version_major = Netgame.version_major; netpkt.version_minor = Netgame.version_minor; netpkt.team_vector = Netgame.team_vector; - + if (net_address != NULL) ipxdrv_send_packet_data((ubyte *)&netpkt, sizeof(IPX_lite_info), server, node, net_address); else if ((server == NULL) && (node == NULL)) @@ -565,7 +565,7 @@ void send_netgame_packet(ubyte *server, ubyte *node, ubyte *net_address, int lit { IPX_netgame_info netpkt; int i, j; - + netpkt.type = Netgame.protocol.ipx.Game_pkt_type; netpkt.Security = Netgame.protocol.ipx.Game_Security; memcpy(&netpkt.game_name, &Netgame.game_name, sizeof(char)*(NETGAME_NAME_LEN+1)); @@ -641,7 +641,7 @@ void send_netgame_packet(ubyte *server, ubyte *node, ubyte *net_address, int lit } netpkt.PacketsPerSec = Netgame.PacketsPerSec; netpkt.ShortPackets = Netgame.protocol.ipx.ShortPackets; - + if (net_address != NULL) ipxdrv_send_packet_data((ubyte *)&netpkt, sizeof(IPX_netgame_info), server, node, net_address); else if ((server == NULL) && (node == NULL)) @@ -658,7 +658,7 @@ void receive_netgame_packet(ubyte *data, netgame_info *netgame, int lite_flag) IPX_lite_info netpkt; memcpy(&netpkt, data, sizeof(IPX_lite_info)); - + netgame->protocol.ipx.Game_pkt_type = netpkt.type; netgame->protocol.ipx.Game_Security = netpkt.Security; memcpy(netgame->game_name, &netpkt.game_name, sizeof(char)*(NETGAME_NAME_LEN+1)); @@ -682,9 +682,9 @@ void receive_netgame_packet(ubyte *data, netgame_info *netgame, int lite_flag) { IPX_netgame_info netpkt; int i, j; - + memcpy(&netpkt, data, sizeof(IPX_netgame_info)); - + netgame->protocol.ipx.Game_pkt_type = netpkt.type; netgame->protocol.ipx.Game_Security = netpkt.Security; memcpy(netgame->game_name, &netpkt.game_name, sizeof(char)*(NETGAME_NAME_LEN+1)); @@ -768,7 +768,7 @@ void send_netplayers_packet(ubyte *server, ubyte *node) { IPX_AllNetPlayers_info netplrs; int i; - + netplrs.type = Netgame.protocol.ipx.Player_pkt_type; netplrs.Security = Netgame.protocol.ipx.Player_Security; for (i = 0; i < MAX_PLAYERS+4; i++) @@ -783,7 +783,7 @@ void send_netplayers_packet(ubyte *server, ubyte *node) netplrs.players[i].socket = Netgame.players[i].protocol.ipx.socket; netplrs.players[i].rank = Netgame.players[i].rank; } - + if ((server == NULL) && (node == NULL)) ipxdrv_send_broadcast_packet_data((ubyte *)&netplrs, sizeof(IPX_AllNetPlayers_info)); else @@ -794,9 +794,9 @@ void receive_netplayers_packet(ubyte *data, netgame_info *pinfo) { IPX_AllNetPlayers_info netplrs; int i; - + memcpy(&netplrs, data, sizeof(IPX_AllNetPlayers_info)); - + pinfo->protocol.ipx.Player_pkt_type = netplrs.type; pinfo->protocol.ipx.Player_Security = netplrs.Security; for (i = 0; i < MAX_PLAYERS+4; i++) @@ -828,9 +828,9 @@ net_ipx_init(void) #ifdef NETPROFILING OpenSendLog(); - OpenRecieveLog(); + OpenRecieveLog(); #endif - + for (t=0;ttype != EVENT_IDLE) return 0; @@ -919,7 +919,7 @@ int net_ipx_kmatrix_poll1( newmenu *menu, d_event *event, void *userdata ) else return -2; } - + return 0; } @@ -931,13 +931,13 @@ int net_ipx_kmatrix_poll2( newmenu *menu, d_event *event, void *userdata ) // Polling loop for End-of-level menu int num_ready=0, i, rval = 0; - + menu = menu; userdata = userdata; - + if (event->type != EVENT_IDLE) return 0; - + if (timer_get_fixed_seconds() > (StartAbortMenuTime+(F1_0 * 8))) rval = -2; @@ -973,11 +973,11 @@ net_ipx_endlevel(int *secret) net_ipx_send_endlevel_packet(); - for (i=0; igame_flags & NETGAME_FLAG_CLOSED)) { // Look for player that is not connected - + if (game->numconnected==game->max_numplayers) return (2); - + if (game->RefusePlayers) return (3); - + if (game->numplayers < game->max_numplayers) return 1; if (game->numconnected= 0); Assert(pnum < MaxNumNetPlayers); - + objnum = Players[pnum].objnum; if (Newdemo_state == ND_STATE_RECORDING) { @@ -1098,7 +1098,7 @@ net_ipx_new_player(IPX_sequence_packet *their) memcpy(Players[pnum].callsign, their->player.callsign, CALLSIGN_LEN+1); memcpy(Netgame.players[pnum].callsign, their->player.callsign, CALLSIGN_LEN+1); - + ClipRank (&their->player.rank); Netgame.players[pnum].rank=their->player.rank; @@ -1118,7 +1118,7 @@ net_ipx_new_player(IPX_sequence_packet *their) Players[pnum].connected = CONNECT_PLAYING; Players[pnum].net_kills_total = 0; Players[pnum].net_killed_total = 0; - memset(kill_matrix[pnum], 0, MAX_PLAYERS*sizeof(short)); + memset(kill_matrix[pnum], 0, MAX_PLAYERS*sizeof(short)); Players[pnum].score = 0; Players[pnum].flags = 0; Players[pnum].KillGoalCount=0; @@ -1137,7 +1137,7 @@ net_ipx_new_player(IPX_sequence_packet *their) HUD_init_message("'%s' %s\n",their->player.callsign, TXT_JOINING); else HUD_init_message("%s'%s' %s\n",RankStrings[their->player.rank],their->player.callsign, TXT_JOINING); - + multi_make_ghost_player(pnum); multi_send_score(); @@ -1169,7 +1169,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) if ((Endlevel_sequence) || (Control_center_destroyed)) { net_ipx_dump_player(their->player.protocol.ipx.server,their->player.protocol.ipx.node, DUMP_ENDLEVEL); - return; + return; } if (Network_send_objects || Network_sending_extras) @@ -1197,7 +1197,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) for (i = 0; i < N_players; i++) { - if ( (!stricmp(Players[i].callsign, their->player.callsign )) && (!memcmp(Players[i].net_address,local_address, 6)) ) + if ( (!stricmp(Players[i].callsign, their->player.callsign )) && (!memcmp(Players[i].net_address,local_address, 6)) ) { player_num = i; break; @@ -1225,7 +1225,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) { // Slots are full but game is open, see if anyone is // disconnected and replace the oldest player with this new one - + int oldest_player = -1; fix oldest_time = timer_get_fixed_seconds(); int activeplayers = 0; @@ -1254,7 +1254,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) if (oldest_player == -1) { - // Everyone is still connected + // Everyone is still connected net_ipx_dump_player(their->player.protocol.ipx.server, their->player.protocol.ipx.node, DUMP_FULL); return; } @@ -1270,7 +1270,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) else { // Player is reconnecting - + if (Players[player_num].connected) { return; @@ -1282,7 +1282,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) Network_player_added = 0; digi_play_sample(SOUND_HUD_MESSAGE, F1_0); - + if (GameArg.MplNoRankings) HUD_init_message("'%s' %s", Players[player_num].callsign, TXT_REJOIN); else @@ -1293,7 +1293,7 @@ void net_ipx_welcome_player(IPX_sequence_packet *their) // Send updated Objects data to the new/returning player - + IPX_sync_player = *their; IPX_sync_player.player.connected = player_num; Network_send_objects = 1; @@ -1306,7 +1306,7 @@ int net_ipx_objnum_is_past(int objnum) { // determine whether or not a given object number has already been sent // to a re-joining player. - + int player_num = IPX_sync_player.player.connected; int obj_mode = !((object_owner[objnum] == -1) || (object_owner[objnum] == player_num)); @@ -1331,9 +1331,9 @@ extern void multi_send_door_open_specific(int,int,int,ubyte); void net_ipx_send_door_updates(int pnum) { // Send door status when new player joins - + int i; - + pnum=pnum; // Assert (pnum>-1 && pnumsides[j].tmap_num2) != 0) + if ((tm = seg->sides[j].tmap_num2) != 0) { if ( ((ec = TmapInfo[tm&0x3fff].eclip_num) != -1) && (Effects[ec].dest_bm_num != -1) ) @@ -1639,7 +1639,7 @@ void net_ipx_send_objects(void) // have to stop and try again after the level. net_ipx_dump_player(IPX_sync_player.player.protocol.ipx.server,IPX_sync_player.player.protocol.ipx.node, DUMP_ENDLEVEL); - Network_send_objects = 0; + Network_send_objects = 0; return; } @@ -1649,7 +1649,7 @@ void net_ipx_send_objects(void) memset(object_buffer, 0, MAX_DATA_SIZE); object_buffer[0] = PID_OBJECT_DATA; loc = 3; - + if (Network_send_objnum == -1) { obj_count = 0; @@ -1661,7 +1661,7 @@ void net_ipx_send_objects(void) obj_count_frame = 1; frame_num = 0; } - + for (i = Network_send_objnum; i <= Highest_object_index; i++) { if ((Objects[i].type != OBJ_POWERUP) && (Objects[i].type != OBJ_PLAYER) && @@ -1679,7 +1679,7 @@ void net_ipx_send_objects(void) obj_count_frame++; obj_count++; - + remote_objnum = objnum_local_to_remote((short)i, &owner); Assert(owner == object_owner[i]); @@ -1694,7 +1694,7 @@ void net_ipx_send_objects(void) if (obj_count_frame) // Send any objects we've buffered { frame_num++; - + Network_send_objnum = i; object_buffer[1] = obj_count_frame; object_buffer[2] = frame_num; @@ -1710,9 +1710,9 @@ void net_ipx_send_objects(void) Network_send_objnum = 0; Network_send_object_mode = 1; // go to next mode } - else + else { - Assert(Network_send_object_mode == 1); + Assert(Network_send_object_mode == 1); frame_num++; // Send count so other side can make sure he got them all @@ -1760,7 +1760,7 @@ void net_ipx_send_rejoin_sync(int player_num) net_ipx_dump_player(IPX_sync_player.player.protocol.ipx.server,IPX_sync_player.player.protocol.ipx.node, DUMP_ENDLEVEL); - Network_send_objects = 0; + Network_send_objects = 0; Network_sending_extras=0; return; } @@ -1804,7 +1804,7 @@ void net_ipx_send_rejoin_sync(int player_num) void resend_sync_due_to_packet_loss_for_allender () { int i,j; - + net_ipx_update_netgame(); // Fill in the kill list @@ -1826,20 +1826,20 @@ void resend_sync_due_to_packet_loss_for_allender () char * net_ipx_get_player_name( int objnum ) { - if ( objnum < 0 ) return NULL; + if ( objnum < 0 ) return NULL; if ( Objects[objnum].type != OBJ_PLAYER ) return NULL; if ( Objects[objnum].id >= MAX_PLAYERS ) return NULL; if ( Objects[objnum].id >= N_players ) return NULL; - + return Players[Objects[objnum].id].callsign; } void net_ipx_add_player(IPX_sequence_packet *p) { int i; - + for (i=0; iplayer.protocol.ipx.node, 6) && !memcmp(Netgame.players[i].protocol.ipx.server, p->player.protocol.ipx.server, 4)) + if ( !memcmp( Netgame.players[i].protocol.ipx.node, p->player.protocol.ipx.node, 6) && !memcmp(Netgame.players[i].protocol.ipx.server, p->player.protocol.ipx.server, 4)) return; // already got them } @@ -1871,7 +1871,7 @@ void net_ipx_add_player(IPX_sequence_packet *p) void net_ipx_remove_player(IPX_sequence_packet *p) { int i,pn; - + pn = -1; for (i=0; iplayer.protocol.ipx.node, 6) && !memcmp(Netgame.players[i].protocol.ipx.server, p->player.protocol.ipx.server, 4)) { @@ -1879,7 +1879,7 @@ void net_ipx_remove_player(IPX_sequence_packet *p) break; } } - + if (pn < 0 ) return; for (i=pn; iprotocol.ipx.Game_Security !=TempPlayersInfo->protocol.ipx.Game_Security) { Int3(); // Get Jason @@ -2261,7 +2261,7 @@ void net_ipx_process_gameinfo(ubyte *data) { return; } - + memcpy(&Active_ipx_games[i], (ubyte *)new, sizeof(netgame_info)); memcpy (&Active_ipx_games[i].players,TempPlayersInfo->players,sizeof(netplayer_info)*(MAX_PLAYERS+4)); @@ -2305,7 +2305,7 @@ void net_ipx_process_lite_info(ubyte *data) { return; } - + memcpy(&Active_ipx_games[i], (ubyte *)new, sizeof(netgame_info)); // See if this is really a Hoard game @@ -2316,7 +2316,7 @@ void net_ipx_process_lite_info(ubyte *data) { Active_ipx_games[i].gamemode=NETGAME_HOARD; Active_ipx_games[i].game_status=NETSTAT_PLAYING; - + if (Active_ipx_games[i].game_flags & NETGAME_FLAG_TEAM_HOARD) Active_ipx_games[i].gamemode=NETGAME_TEAM_HOARD; if (Active_ipx_games[i].game_flags & NETGAME_FLAG_REALLY_ENDLEVEL) @@ -2375,7 +2375,7 @@ void net_ipx_process_dump(IPX_sequence_packet *their) nm_messagebox(NULL, 1, TXT_OK, NET_DUMP_STRINGS(their->player.connected)); Network_status = NETSTAT_MENU; } -} +} void net_ipx_process_request(IPX_sequence_packet *their) { // Player is ready to receieve a sync packet @@ -2405,7 +2405,7 @@ void net_ipx_process_packet(ubyte *data, int length ) switch( data[0] ) { - + case PID_GAME_INFO: // Jason L. says we can safely ignore this type. break; @@ -2413,18 +2413,18 @@ void net_ipx_process_packet(ubyte *data, int length ) if (Network_status==NETSTAT_WAITING) { receive_netplayers_packet(data, &TempPlayersBase); - + if (TempPlayersBase.protocol.ipx.Player_Security!=Netgame.protocol.ipx.Game_Security) { break; - } - + } + TempPlayersInfo=&TempPlayersBase; WaitingForPlayerInfo=0; NetSecurityNum=TempPlayersInfo->protocol.ipx.Player_Security; NetSecurityFlag=NETSECURITY_WAIT_FOR_SYNC; } - + break; case PID_LITE_INFO: @@ -2443,7 +2443,7 @@ void net_ipx_process_packet(ubyte *data, int length ) if ((Network_status == NETSTAT_PLAYING) || (Network_status == NETSTAT_STARTING) || (Network_status == NETSTAT_ENDLEVEL)) if (multi_i_am_master()) net_ipx_send_lite_info(their); - + break; case PID_SEND_ALL_GAMEINFO: @@ -2451,12 +2451,12 @@ void net_ipx_process_packet(ubyte *data, int length ) { return; } - + if ((Network_status == NETSTAT_PLAYING) || (Network_status == NETSTAT_STARTING) || (Network_status == NETSTAT_ENDLEVEL)) if (multi_i_am_master() && their->Security==Netgame.protocol.ipx.Game_Security) net_ipx_send_game_info(their); break; - + case PID_ADDPLAYER: if (length != SEQUENCE_PACKET_SIZE) { @@ -2472,7 +2472,7 @@ void net_ipx_process_packet(ubyte *data, int length ) return; } - if (Network_status == NETSTAT_STARTING) + if (Network_status == NETSTAT_STARTING) { // Someone wants to join our game! net_ipx_add_player(their); @@ -2494,18 +2494,18 @@ void net_ipx_process_packet(ubyte *data, int length ) break; case PID_DUMP: - + if (length != SEQUENCE_PACKET_SIZE) { return; } - + if (Network_status == NETSTAT_WAITING || Network_status==NETSTAT_PLAYING ) net_ipx_process_dump(their); break; case PID_QUIT_JOINING: - + if (length != SEQUENCE_PACKET_SIZE) { return; @@ -2518,16 +2518,16 @@ void net_ipx_process_packet(ubyte *data, int length ) break; case PID_SYNC: - + if (Network_status == NETSTAT_WAITING) { receive_netgame_packet(data, &TempNetInfo, 0); - + if (TempNetInfo.protocol.ipx.Game_Security!=Netgame.protocol.ipx.Game_Security) { break; } - + if (NetSecurityFlag==NETSECURITY_WAIT_FOR_SYNC) { if (TempNetInfo.protocol.ipx.Game_Security==TempPlayersInfo->protocol.ipx.Player_Security) @@ -2541,32 +2541,32 @@ void net_ipx_process_packet(ubyte *data, int length ) { NetSecurityFlag=NETSECURITY_WAIT_FOR_PLAYERS; NetSecurityNum=TempNetInfo.protocol.ipx.Game_Security; - + if ( net_ipx_wait_for_playerinfo()) net_ipx_read_sync_packet((netgame_info *)data,0); - + NetSecurityFlag=0; NetSecurityNum=0; } } break; - + case PID_PDATA: - if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) || Network_status==NETSTAT_WAITING)) { + if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) || Network_status==NETSTAT_WAITING)) { net_ipx_process_pdata((char *)data); } break; case PID_NAKED_PDATA: - if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) || Network_status==NETSTAT_WAITING)) + if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) || Network_status==NETSTAT_WAITING)) net_ipx_process_naked_pdata((char *)data,length); break; - + case PID_OBJECT_DATA: - if (Network_status == NETSTAT_WAITING) + if (Network_status == NETSTAT_WAITING) net_ipx_read_object_packet(data); break; - + case PID_ENDLEVEL: if ((Network_status == NETSTAT_ENDLEVEL) || (Network_status == NETSTAT_PLAYING)) net_ipx_read_endlevel_packet(data); @@ -2576,7 +2576,7 @@ void net_ipx_process_packet(ubyte *data, int length ) if ((Network_status == NETSTAT_ENDLEVEL) || (Network_status == NETSTAT_PLAYING)) net_ipx_read_endlevel_short_packet(data); break; - + case PID_GAME_UPDATE: if (Network_status==NETSTAT_PLAYING) { @@ -2590,7 +2590,7 @@ void net_ipx_process_packet(ubyte *data, int length ) if (Game_mode & GM_TEAM) { int i; - + for (i=0;iSecurity==Netgame.protocol.ipx.Game_Security) net_ipx_send_player_names(their); break; - + default: Int3(); // Invalid network packet type, see ROB break; @@ -2659,11 +2659,11 @@ net_ipx_read_endlevel_packet( ubyte *data ) #endif playernum = end->player_num; - + Assert(playernum != Player_num); - + if (playernum>=N_players) - { + { Int3(); // weird, but it an happen in a coop restore game return; // if it happens in a coop restore, don't worry about it } @@ -2688,16 +2688,16 @@ net_ipx_read_endlevel_short_packet( ubyte *data ) // Special packet for end of level syncing int playernum; - IPX_endlevel_info_short *end; + IPX_endlevel_info_short *end; end = (IPX_endlevel_info_short *)data; playernum = end->player_num; - + Assert(playernum != Player_num); - + if (playernum>=N_players) - { + { Int3(); // weird, but it can happen in a coop restore game return; // if it happens in a coop restore, don't worry about it } @@ -2722,7 +2722,7 @@ net_ipx_pack_objects(void) // Switching modes, pack the object array special_reset_objects(); -} +} int net_ipx_verify_objects(int remote, int local) @@ -2769,7 +2769,7 @@ net_ipx_read_object_packet( ubyte *data ) int nobj = data[1]; int loc = 3; int remote_frame_num = data[2]; - + frame_num++; for (i = 0; i < nobj; i++) @@ -2778,7 +2778,7 @@ net_ipx_read_object_packet( ubyte *data ) obj_owner = data[loc]; loc += 1; remote_objnum = INTEL_SHORT( *(short *)(data+loc) ); loc += 2; - if (objnum == -1) + if (objnum == -1) { // Clear object array init_objects(); @@ -2802,19 +2802,19 @@ net_ipx_read_object_packet( ubyte *data ) } if (net_ipx_verify_objects(remote_objnum, object_count)) { - // Failed to sync up + // Failed to sync up nm_messagebox(NULL, 1, TXT_OK, TXT_NET_SYNC_FAILED); - Network_status = NETSTAT_MENU; + Network_status = NETSTAT_MENU; return; } frame_num = 0; } - else + else { if (frame_num != remote_frame_num) Int3(); object_count++; - if ((obj_owner == my_pnum) || (obj_owner == -1)) + if ((obj_owner == my_pnum) || (obj_owner == -1)) { if (mode != 1) Int3(); // SEE ROB @@ -2847,7 +2847,7 @@ net_ipx_read_object_packet( ubyte *data ) obj->attached_obj = -1; if (segnum > -1) obj_link(obj-Objects,segnum); - if (obj_owner == my_pnum) + if (obj_owner == my_pnum) map_objnum_local_to_local(objnum); else if (obj_owner != -1) map_objnum_local_to_remote(objnum, remote_objnum, obj_owner); @@ -2857,7 +2857,7 @@ net_ipx_read_object_packet( ubyte *data ) } // For a standard onbject } // For each object in packet } - + /* Polling loop waiting for sync packet to start game * after having sent request */ @@ -2865,13 +2865,13 @@ int net_ipx_sync_poll( newmenu *menu, d_event *event, void *userdata ) { static fix t1 = 0; int rval = 0; - + menu = menu; userdata = userdata; - + if (event->type != EVENT_IDLE) return 0; - + net_ipx_listen(); if (Network_status != NETSTAT_WAITING) // Status changed to playing, exit the menu @@ -2882,14 +2882,14 @@ int net_ipx_sync_poll( newmenu *menu, d_event *event, void *userdata ) int i; // Poll time expired, re-send request - + t1 = timer_get_fixed_seconds(); i = net_ipx_send_request(); if (i < 0) rval = -2; } - + return rval; } @@ -2898,12 +2898,12 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) newmenu_item *menus = newmenu_get_items(menu); int nitems = newmenu_get_nitems(menu); int i,n,nm; - + if (event->type != EVENT_IDLE) return 0; - + userdata = userdata; - + Assert(Network_status == NETSTAT_STARTING); if (!menus[0].value) { @@ -2930,7 +2930,7 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) nm_messagebox( TXT_ERROR, 1, TXT_OK, "%s %d %s", TXT_SORRY_ONLY, MaxNumNetPlayers, TXT_NETPLAYERS_IN ); // Turn off the last player highlighted for (i = N_players; i > 0; i--) - if (menus[i].value == 1) + if (menus[i].value == 1) { menus[i].value = 0; break; @@ -2941,7 +2941,7 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) //since nitems should not be changing, anyway // if (nitems > MAX_PLAYERS ) return; //end this section kill - VR - + n = Netgame.numplayers; net_ipx_listen(); @@ -2958,7 +2958,7 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) { menus[N_players-1].value = 1; } - } + } else if ( n > Netgame.numplayers ) { // One got removed... @@ -2967,7 +2967,7 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) for (i=0; itype) { case EVENT_NEWMENU_CHANGED: - if (((HoardEquipped() && (citem == opt->team_hoard)) || ((citem == opt->team_anarchy) || (citem == opt->capture))) && !menus[opt->closed].value && !menus[opt->refuse].value) + if (((HoardEquipped() && (citem == opt->team_hoard)) || ((citem == opt->team_anarchy) || (citem == opt->capture))) && !menus[opt->closed].value && !menus[opt->refuse].value) { menus[opt->refuse].value = 1; menus[opt->refuse-1].value = 0; menus[opt->refuse-2].value = 0; } - + if (menus[opt->coop].value) { oldmaxnet=1; - - if (menus[opt->maxnet].value>2) + + if (menus[opt->maxnet].value>2) { menus[opt->maxnet].value=2; } - + if (menus[opt->maxnet].max_value>2) { menus[opt->maxnet].max_value=2; } - + if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP)) Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; @@ -3047,13 +3047,13 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) menus[opt->maxnet].max_value=6; } } - + if (citem == opt->level) { char *slevel = menus[opt->level].text; Netgame.levelnum = atoi(slevel); - + if ((Netgame.levelnum < 1) || (Netgame.levelnum > Last_level)) { nm_messagebox(TXT_ERROR, 1, TXT_OK, TXT_LEVEL_OUT_RANGE ); @@ -3061,7 +3061,7 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) return 0; } } - + if (citem == opt->refuse) Netgame.RefusePlayers=menus[opt->refuse].value; @@ -3076,7 +3076,7 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) { if ( menus[opt->mode].value ) Netgame.gamemode = NETGAME_ANARCHY; - + else if (menus[opt->mode+1].value) { Netgame.gamemode = NETGAME_TEAM_ANARCHY; } @@ -3087,9 +3087,9 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) menus[opt->mode].value = 1; return 0; } - else if ( menus[opt->mode+2].value ) + else if ( menus[opt->mode+2].value ) Netgame.gamemode = NETGAME_ROBOT_ANARCHY; - else if ( menus[opt->mode+3].value ) + else if ( menus[opt->mode+3].value ) Netgame.gamemode = NETGAME_COOPERATIVE; else if (menus[opt->capture].value) Netgame.gamemode = NETGAME_CAPTURE_FLAG; @@ -3108,7 +3108,7 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) Netgame.game_flags &= ~NETGAME_FLAG_CLOSED; } break; - + case EVENT_NEWMENU_SELECTED: if (citem==opt->moreopts) { @@ -3121,22 +3121,22 @@ int net_ipx_game_param_handler( newmenu *menu, d_event *event, param_opt *opt ) { int j; - + for (j = 0; j < num_active_ipx_games; j++) if (!stricmp(Active_ipx_games[j].game_name, Netgame.game_name)) { nm_messagebox(TXT_ERROR, 1, TXT_OK, TXT_DUPLICATE_NAME); return 1; } - + } - + return !net_ipx_start_game(); - + default: break; } - + return 0; } @@ -3151,7 +3151,7 @@ int net_ipx_setup_game() char srmaxnet[50]; net_ipx_init(); - + change_playernum_to(0); NamesInfoSecurity=-1; @@ -3215,9 +3215,9 @@ int net_ipx_setup_game() opt.maxnet = optnum; sprintf( srmaxnet, "Maximum players: %d", MaxNumNetPlayers); - m[optnum].type = NM_TYPE_SLIDER; m[optnum].value=Netgame.max_numplayers-2; m[optnum].text= srmaxnet; m[optnum].min_value=0; + m[optnum].type = NM_TYPE_SLIDER; m[optnum].value=Netgame.max_numplayers-2; m[optnum].text= srmaxnet; m[optnum].min_value=0; m[optnum].max_value=MaxNumNetPlayers-2; optnum++; - + opt.moreopts=optnum; m[optnum].type = NM_TYPE_MENU; m[optnum].text = "Advanced Options"; optnum++; @@ -3237,7 +3237,7 @@ net_ipx_set_game_mode(int gamemode) Game_mode = GM_NETWORK; else if ( gamemode == NETGAME_ROBOT_ANARCHY ) Game_mode = GM_NETWORK | GM_MULTI_ROBOTS; - else if ( gamemode == NETGAME_COOPERATIVE ) + else if ( gamemode == NETGAME_COOPERATIVE ) Game_mode = GM_NETWORK | GM_MULTI_COOP | GM_MULTI_ROBOTS; else if (gamemode == NETGAME_CAPTURE_FLAG) { @@ -3299,7 +3299,7 @@ void net_ipx_read_sync_packet( netgame_info * sp, int rsinit) if (rsinit) TempPlayersInfo=&Netgame; - + // This function is now called by all people entering the netgame. if (sp != &Netgame) @@ -3324,7 +3324,7 @@ void net_ipx_read_sync_packet( netgame_info * sp, int rsinit) // Discover my player number memcpy(temp_callsign, Players[Player_num].callsign, CALLSIGN_LEN+1); - + Player_num = -1; for (i=0; ikilled[i]; @@ -3383,7 +3383,7 @@ void net_ipx_read_sync_packet( netgame_info * sp, int rsinit) team_kills[0] = sp->team_kills[0]; team_kills[1] = sp->team_kills[1]; - + Players[Player_num].connected = CONNECT_PLAYING; Netgame.players[Player_num].connected = CONNECT_PLAYING; Netgame.players[Player_num].rank=GetMyNetRanking(); @@ -3410,7 +3410,7 @@ net_ipx_send_sync(void) // Randomize their starting locations... d_srand( timer_get_fixed_seconds() ); - for (i=0; i Netgame.max_numplayers) { nm_messagebox( TXT_ERROR, 1, TXT_OK, "%s %d %s", TXT_SORRY_ONLY, MaxNumNetPlayers, TXT_NETPLAYERS_IN ); N_players = save_nplayers; @@ -3611,7 +3611,7 @@ abort: N_players = 0; for (i=0; i N_players) { @@ -3651,7 +3651,7 @@ abort: return(1); } -int net_ipx_start_game(void) +int net_ipx_start_game(void) { Assert( FRAME_INFO_SIZE < MAX_DATA_SIZE ); if ( !IPX_active ) @@ -3683,7 +3683,7 @@ int net_ipx_start_game(void) d_srand( timer_get_fixed_seconds() ); Netgame.protocol.ipx.Game_Security=d_rand(); // For syncing Netgames with player packets - + if(net_ipx_select_players()) { StartNewLevel(Netgame.levelnum, 0); @@ -3693,7 +3693,7 @@ int net_ipx_start_game(void) Game_mode = GM_GAME_OVER; return 0; // see if we want to tweak the game we setup } - + return 1; // don't keep params menu or mission listbox (may want to join a game next time) } @@ -3711,7 +3711,7 @@ void restart_net_searching(newmenu_item * m) } NamesInfoSecurity=-1; - num_active_ipx_changed = 1; + num_active_ipx_changed = 1; } char *ModeLetters[]={"ANRCHY","TEAM","ROBO","COOP","FLAG","HOARD","TMHOARD"}; @@ -3727,19 +3727,19 @@ void net_ipx_join_listen(newmenu *menu) t1 = timer_get_fixed_seconds(); net_ipx_send_game_list_request(); } - + temp=num_active_ipx_games; - + net_ipx_listen(); - + if (!num_active_ipx_changed) return; - + if (temp!=num_active_ipx_games) digi_play_sample (SOUND_HUD_MESSAGE,F1_0); - + num_active_ipx_changed = 0; - + // Copy the active games data into the menu options for (i = 0; i < num_active_ipx_games; i++) { @@ -3747,35 +3747,35 @@ void net_ipx_join_listen(newmenu *menu) int j,x, k,tx,ty,ta,nplayers = 0; char levelname[8],MissName[25],GameName[25],thold[2]; thold[1]=0; - + // These next two loops protect against menu skewing // if missiontitle or gamename contain a tab - + for (x=0,tx=0,k=0,j=0;j<15;j++) { if (Active_ipx_games[i].mission_title[j]=='\t') continue; thold[0]=Active_ipx_games[i].mission_title[j]; gr_get_string_size (thold,&tx,&ty,&ta); - + if ((x+=tx)>=FSPACX(55)) { MissName[k]=MissName[k+1]=MissName[k+2]='.'; k+=3; break; } - + MissName[k++]=Active_ipx_games[i].mission_title[j]; } MissName[k]=0; - + for (x=0,tx=0,k=0,j=0;j<15;j++) { if (Active_ipx_games[i].game_name[j]=='\t') continue; thold[0]=Active_ipx_games[i].game_name[j]; gr_get_string_size (thold,&tx,&ty,&ta); - + if ((x+=tx)>=FSPACX(55)) { GameName[k]=GameName[k+1]=GameName[k+2]='.'; @@ -3785,15 +3785,15 @@ void net_ipx_join_listen(newmenu *menu) GameName[k++]=Active_ipx_games[i].game_name[j]; } GameName[k]=0; - - + + nplayers=Active_ipx_games[i].numconnected; - + if (Active_ipx_games[i].levelnum < 0) sprintf(levelname, "S%d", -Active_ipx_games[i].levelnum); else sprintf(levelname, "%d", Active_ipx_games[i].levelnum); - + if (game_status == NETSTAT_STARTING) { sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", @@ -3803,7 +3803,7 @@ void net_ipx_join_listen(newmenu *menu) else if (game_status == NETSTAT_PLAYING) { join_status=net_ipx_can_join_netgame(&Active_ipx_games[i]); - + if (join_status==1) sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, @@ -3820,17 +3820,17 @@ void net_ipx_join_listen(newmenu *menu) sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, Active_ipx_games[i].max_numplayers,MissName,levelname,"Closed"); - + } else sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, Active_ipx_games[i].max_numplayers,MissName,levelname,"Between"); - - + + Assert(strlen(menus[i+2].text) < 100); } - + for (i = num_active_ipx_games; i < IPX_MAX_NETGAMES; i++) { sprintf(menus[i+2].text, "%d. ",i+1); @@ -3850,7 +3850,7 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *menu_text ) { case EVENT_KEY_COMMAND: key = ((d_event_keycommand *)event)->keycode; - + if ( IPX_allow_socket_changes ) { int osocket; int rval = 0; @@ -3881,34 +3881,34 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *menu_text ) } } break; - + case EVENT_IDLE: net_ipx_join_listen(menu); break; - + case EVENT_NEWMENU_SELECTED: citem-=2; - + if (citem >=num_active_ipx_games) { nm_messagebox(TXT_SORRY, 1, TXT_OK, TXT_INVALID_CHOICE); return 1; } - + if (net_ipx_show_game_stats(citem)==0) return 1; - + // Choice has been made and looks legit if (net_ipx_do_join_game(citem)==0) return 1; // look ma, we're in a game!!! break; - + case EVENT_WINDOW_CLOSE: SurfingNet=0; d_free(menu_text); - d_free(menu); + d_free(menus); if (!Game_wind) Network_status = NETSTAT_MENU; // they cancelled @@ -3927,12 +3927,12 @@ net_ipx_wait_for_sync(void) char text[60]; newmenu_item m[2]; int i, choice=0; - + Network_status = NETSTAT_WAITING; m[0].type=NM_TYPE_TEXT; m[0].text = text; m[1].type=NM_TYPE_TEXT; m[1].text = TXT_NET_LEAVE; - + i = net_ipx_send_request(); if (i < 0) @@ -3943,7 +3943,7 @@ net_ipx_wait_for_sync(void) while (choice > -1) choice=newmenu_do( NULL, TXT_WAIT, 2, m, net_ipx_sync_poll, NULL ); - if (Network_status != NETSTAT_PLAYING) + if (Network_status != NETSTAT_PLAYING) { IPX_sequence_packet me; @@ -3969,7 +3969,7 @@ int net_ipx_request_poll( newmenu *menu, d_event *event, void *userdata ) if (event->type != EVENT_IDLE) return 0; - + menu = menu; userdata = userdata; @@ -3993,7 +3993,7 @@ int net_ipx_request_poll( newmenu *menu, d_event *event, void *userdata ) { return -2; } - + return 0; } @@ -4003,7 +4003,7 @@ net_ipx_wait_for_requests(void) // Wait for other players to load the level before we send the sync int choice, i; newmenu_item m[1]; - + Network_status = NETSTAT_WAITING; m[0].type=NM_TYPE_TEXT; m[0].text = TXT_NET_LEAVE; @@ -4015,7 +4015,7 @@ net_ipx_wait_for_requests(void) Players[Player_num].connected = CONNECT_PLAYING; menu: - choice = newmenu_do(NULL, TXT_WAIT, 1, m, net_ipx_request_poll, NULL); + choice = newmenu_do(NULL, TXT_WAIT, 1, m, net_ipx_request_poll, NULL); if (choice == -1) { @@ -4027,9 +4027,9 @@ menu: } if (choice != 0) goto menu; - + // User confirmed abort - + for (i=0; i < N_players; i++) { if ((Players[i].connected != CONNECT_DISCONNECTED) && (i != Player_num)) { net_ipx_dump_player(Netgame.players[i].protocol.ipx.server, Netgame.players[i].protocol.ipx.node, DUMP_ABORTED); @@ -4081,8 +4081,8 @@ void net_ipx_count_powerups_in_mine(void) for (i=0;itype != EVENT_IDLE) return 0; - + if (timer_get_fixed_seconds() > t1+ALL_INFO_REQUEST_INTERVAL) { net_ipx_send_all_info_request(PID_SEND_ALL_GAMEINFO,SecurityCheck); t1 = timer_get_fixed_seconds(); } - net_ipx_do_big_wait(WaitAllChoice); - + net_ipx_do_big_wait(WaitAllChoice); + if(SecurityCheck==-1) return -2; - + return 0; } - + int net_ipx_wait_for_all_info (int choice) { int pick; - + newmenu_item m[2]; m[0].type=NM_TYPE_TEXT; m[0].text = "Press Escape to cancel"; @@ -4285,11 +4285,11 @@ int net_ipx_wait_for_all_info (int choice) goto GetMenu; if (SecurityCheck==-1) - { - SecurityCheck=0; + { + SecurityCheck=0; return (1); } - SecurityCheck=0; + SecurityCheck=0; return (0); } @@ -4301,7 +4301,7 @@ void net_ipx_do_big_wait(int choice) netgame_info info_struct; size=ipxdrv_get_packet_data( packet ); - + if (size>0) { data = packet; @@ -4315,7 +4315,7 @@ void net_ipx_do_big_wait(int choice) { break; } - + if (NetSecurityFlag==NETSECURITY_WAIT_FOR_GAMEINFO) { if (TempPlayersInfo->protocol.ipx.Player_Security==TempNetInfo.protocol.ipx.Game_Security) @@ -4332,14 +4332,14 @@ void net_ipx_do_big_wait(int choice) { NetSecurityFlag=NETSECURITY_WAIT_FOR_PLAYERS; NetSecurityNum=TempNetInfo.protocol.ipx.Game_Security; - + if (net_ipx_wait_for_playerinfo()) { memcpy (&Active_ipx_games[choice],(ubyte *)&TempNetInfo,sizeof(netgame_info)); memcpy (&Active_ipx_games[choice].players, TempPlayersInfo->players, sizeof(netplayer_info)*(MAX_PLAYERS+4)); SecurityCheck=-1; } - + NetSecurityFlag=0; NetSecurityNum=0; } @@ -4349,9 +4349,9 @@ void net_ipx_do_big_wait(int choice) receive_netplayers_packet(data, &info_struct); temp_info = &info_struct; - if (temp_info->protocol.ipx.Player_Security!=SecurityCheck) + if (temp_info->protocol.ipx.Player_Security!=SecurityCheck) break; // If this isn't the guy we're looking for, move on - + memcpy (&TempPlayersBase,(ubyte *)&temp_info,sizeof(netgame_info)); TempPlayersInfo=&TempPlayersBase; WaitingForPlayerInfo=0; @@ -4383,10 +4383,10 @@ void net_ipx_leave_game() N_players=0; net_ipx_send_game_info(NULL); N_players=nsave; - + } - Players[Player_num].connected = CONNECT_DISCONNECTED; + Players[Player_num].connected = CONNECT_DISCONNECTED; net_ipx_send_endlevel_packet(); change_playernum_to(0); Game_mode = GM_GAME_OVER; @@ -4414,7 +4414,7 @@ void net_ipx_listen() { loopmax=N_players*Netgame.PacketsPerSec; } - + if (!IPX_active) return; WaitingForPlayerInfo=1; @@ -4459,7 +4459,7 @@ int net_ipx_wait_for_playerinfo() receive_netplayers_packet(packet, &info_struct); TempInfo = &info_struct; retries++; - + if (NetSecurityFlag==NETSECURITY_WAIT_FOR_PLAYERS) { if (NetSecurityNum==TempInfo->protocol.ipx.Player_Security) @@ -4478,7 +4478,7 @@ int net_ipx_wait_for_playerinfo() { NetSecurityNum=TempInfo->protocol.ipx.Player_Security; NetSecurityFlag=NETSECURITY_WAIT_FOR_GAMEINFO; - + memcpy (&TempPlayersBase,(ubyte *)TempInfo,sizeof(netgame_info)); TempPlayersInfo=&TempPlayersBase; WaitingForPlayerInfo=0; @@ -4496,11 +4496,11 @@ void net_ipx_send_data( ubyte * ptr, int len, int urgent ) char check; #ifdef NETPROFILING - TTSent[ptr[0]]++; + TTSent[ptr[0]]++; fprintf (SendLogFile,"Packet type: %d Len:%d Urgent:%d TT=%d\n",ptr[0],len,urgent,TTSent[ptr[0]]); fflush (SendLogFile); #endif - + if (Endlevel_sequence) return; @@ -4508,7 +4508,7 @@ void net_ipx_send_data( ubyte * ptr, int len, int urgent ) MySyncPackInitialized = 1; memset( &MySyncPack, 0, sizeof(IPX_frame_info) ); } - + if (urgent) PacketUrgent = 1; @@ -4529,7 +4529,7 @@ void net_ipx_send_data( ubyte * ptr, int len, int urgent ) void net_ipx_timeout_player(int playernum) { - // Remove a player from the game if we haven't heard from them in + // Remove a player from the game if we haven't heard from them in // a long time. int i, n = 0; @@ -4543,7 +4543,7 @@ void net_ipx_timeout_player(int playernum) HUD_init_message("%s %s", Players[playernum].callsign, TXT_DISCONNECTING); for (i = 0; i < N_players; i++) - if (Players[i].connected) + if (Players[i].connected) n++; if (n == 1) @@ -4559,7 +4559,7 @@ void squish_short_frame_info(IPX_short_frame_info old_info, ubyte *data) int loc = 0; int tmpi; short tmps; - + data[0] = old_info.type; loc++; /* skip three for pad byte */ loc += 3; tmpi = INTEL_INT(old_info.numpackets); @@ -4674,7 +4674,7 @@ void net_ipx_do_frame(int force, int listen) else // If long packets { int send_data_size, i; - + MySyncPack.numpackets = Players[0].n_packets_sent++; MySyncPack.type = PID_PDATA; MySyncPack.playernum = Player_num; @@ -4685,7 +4685,7 @@ void net_ipx_do_frame(int force, int listen) MySyncPack.obj_orient = Objects[objnum].orient; MySyncPack.phys_velocity = Objects[objnum].mtype.phys_info.velocity; MySyncPack.phys_rotvel = Objects[objnum].mtype.phys_info.rotvel; - + send_data_size = MySyncPack.data_size; // do this so correct size data is sent // ipxdrvSendGamePacket((ubyte*)&MySyncPack, sizeof(IPX_frame_info) - MaxXDataSize + send_data_size); @@ -4697,10 +4697,10 @@ void net_ipx_do_frame(int force, int listen) } } } - + PacketUrgent = 0; MySyncPack.data_size = 0; // Start data over at 0 length. - + if (Control_center_destroyed) { if (Player_is_dead) @@ -4752,7 +4752,7 @@ listen: if (VerifyPlayerJoined!=-1 && !(FrameCount & 63)) resend_sync_due_to_packet_loss_for_allender(); // This will resend to IPX_sync_player - + if (Network_send_objects) net_ipx_send_objects(); @@ -4766,7 +4766,7 @@ listen: void net_ipx_process_pdata (char *data) { Assert (Game_mode & GM_NETWORK); - + if (Netgame.protocol.ipx.ShortPackets) net_ipx_read_pdata_short_packet ((IPX_short_frame_info *)data); else @@ -4781,7 +4781,7 @@ void net_ipx_read_pdata_packet(IPX_frame_info *pd) TheirPlayernum = pd->playernum; TheirObjnum = Players[pd->playernum].objnum; - + if (TheirPlayernum < 0) { Int3(); // This packet is bogus!! return; @@ -4792,7 +4792,7 @@ void net_ipx_read_pdata_packet(IPX_frame_info *pd) // Hurray! Someone really really got in the game (I think). VerifyPlayerJoined=-1; } - + if (!multi_quit_game && (TheirPlayernum >= N_players)) { if (Network_status!=NETSTAT_WAITING) @@ -4862,10 +4862,10 @@ void net_ipx_read_pdata_packet(IPX_frame_info *pd) create_player_appearance_effect(&Objects[TheirObjnum]); digi_play_sample( SOUND_HUD_MESSAGE, F1_0); - + ClipRank (&Netgame.players[TheirPlayernum].rank); - if (GameArg.MplNoRankings) + if (GameArg.MplNoRankings) HUD_init_message( "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN ); else HUD_init_message( "%s'%s' %s", RankStrings[Netgame.players[TheirPlayernum].rank],Players[TheirPlayernum].callsign, TXT_REJOIN ); @@ -4891,7 +4891,7 @@ void net_ipx_read_pdata_short_packet(IPX_short_frame_info *pd) TheirPlayernum = pd->playernum; TheirObjnum = Players[pd->playernum].objnum; - + if (TheirPlayernum < 0) { Int3(); // This packet is bogus!! return; @@ -4966,7 +4966,7 @@ void net_ipx_read_pdata_short_packet(IPX_short_frame_info *pd) digi_play_sample( SOUND_HUD_MESSAGE, F1_0); ClipRank (&Netgame.players[TheirPlayernum].rank); - + if (GameArg.MplNoRankings) HUD_init_message( "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN ); else @@ -5025,9 +5025,9 @@ void net_ipx_set_power (void) choice = newmenu_do(NULL, "Objects to allow", opt, m, NULL); - Netgame.DoLaserUpgrade=m[opt_primary].value; + Netgame.DoLaserUpgrade=m[opt_primary].value; Netgame.DoSuperLaser=m[opt_primary+1].value; - Netgame.DoQuadLasers=m[opt_primary+2].value; + Netgame.DoQuadLasers=m[opt_primary+2].value; Netgame.DoVulcan=m[opt_primary+3].value; Netgame.DoSpread=m[opt_primary+4].value; Netgame.DoPlasma=m[opt_primary+5].value; @@ -5053,7 +5053,7 @@ void net_ipx_set_power (void) Netgame.DoAmmoRack=m[opt_power+3].value; Netgame.DoConverter=m[opt_power+4].value; Netgame.DoHeadlight=m[opt_power+5].value; -*/ +*/ newmenu_item m[MULTI_ALLOW_POWERUP_MAX]; int i; @@ -5083,7 +5083,7 @@ void net_ipx_more_game_options () sprintf (socket_string,"%d",IPX_Socket); sprintf (packstring,"%d",Netgame.PacketsPerSec); - + opt_difficulty = opt; m[opt].type = NM_TYPE_SLIDER; m[opt].value=Netgame.difficulty; m[opt].text=TXT_DIFFICULTY; m[opt].min_value=0; m[opt].max_value=(NDL-1); opt++; @@ -5109,19 +5109,19 @@ void net_ipx_more_game_options () opt_bright = opt; m[opt].type = NM_TYPE_CHECK; m[opt].text = "Bright player ships"; m[opt].value=Netgame.BrightPlayers; opt++; - + opt_show_names=opt; m[opt].type = NM_TYPE_CHECK; m[opt].text = "Show player names on HUD"; m[opt].value=Netgame.ShowAllNames; opt++; - + opt_show_on_map=opt; m[opt].type = NM_TYPE_CHECK; m[opt].text = TXT_SHOW_ON_MAP; m[opt].value=(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP); opt_show_on_map=opt; opt++; - + opt_short_packets=opt; m[opt].type = NM_TYPE_CHECK; m[opt].text = "Short packets"; m[opt].value=Netgame.protocol.ipx.ShortPackets; opt++; - + opt_setpower = opt; m[opt].type = NM_TYPE_MENU; m[opt].text = "Set Objects allowed..."; opt++; - + m[opt].type = NM_TYPE_TEXT; m[opt].text = "Packets per second (2 - 20)"; opt++; opt_packets=opt; m[opt].type = NM_TYPE_INPUT; m[opt].text=packstring; m[opt].text_len=2; opt++; @@ -5129,7 +5129,7 @@ void net_ipx_more_game_options () m[opt].type = NM_TYPE_TEXT; m[opt].text = "Network socket"; opt++; opt_socket = opt; m[opt].type = NM_TYPE_INPUT; m[opt].text = socket_string; m[opt].text_len=4; opt++; - + menu: i = newmenu_do1( NULL, "Advanced netgame options", opt, m, net_ipx_more_options_handler, NULL, 0 ); @@ -5142,7 +5142,7 @@ menu: } Netgame.PacketsPerSec=atoi(packstring); - + if (Netgame.PacketsPerSec>20) { Netgame.PacketsPerSec=20; @@ -5160,14 +5160,14 @@ menu: IPX_Socket=atoi(socket_string); ipxdrv_change_default_socket( IPX_DEFAULT_SOCKET + IPX_Socket ); } - - Netgame.InvulAppear=m[opt_start_invul].value; + + Netgame.InvulAppear=m[opt_start_invul].value; Netgame.BrightPlayers=m[opt_bright].value; Netgame.protocol.ipx.ShortPackets=m[opt_short_packets].value; Netgame.ShowAllNames=m[opt_show_names].value; - - Netgame.Allow_marker_view=m[opt_marker_view].value; - Netgame.AlwaysLighting=m[opt_light].value; + + Netgame.Allow_marker_view=m[opt_marker_view].value; + Netgame.AlwaysLighting=m[opt_light].value; Netgame.difficulty=Difficulty_level = m[opt_difficulty].value; if (m[opt_show_on_map].value) Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; @@ -5179,7 +5179,7 @@ int net_ipx_more_options_handler( newmenu *menu, d_event *event, void *userdata { newmenu_item *menus = newmenu_get_items(menu); int citem = newmenu_get_citem(menu); - + switch (event->type) { case EVENT_NEWMENU_CHANGED: @@ -5193,7 +5193,7 @@ int net_ipx_more_options_handler( newmenu *menu, d_event *event, void *userdata menus[opt_playtime].value=0; return 0; } - + Netgame.PlayTimeAllowed=menus[opt_playtime].value; sprintf( menus[opt_playtime].text, "Max Time: %d %s", Netgame.PlayTimeAllowed*5, TXT_MINUTES_ABBREV ); } @@ -5205,32 +5205,32 @@ int net_ipx_more_options_handler( newmenu *menu, d_event *event, void *userdata menus[opt_killgoal].value=0; return 0; } - + Netgame.KillGoal=menus[opt_killgoal].value; sprintf( menus[opt_killgoal].text, "Kill Goal: %d kills", Netgame.KillGoal*5); } break; - + default: break; } - + userdata = userdata; - + return 0; } extern void multi_send_light (int,ubyte); extern void multi_send_light_specific (int,int,ubyte); -void net_ipx_send_smash_lights (int pnum) +void net_ipx_send_smash_lights (int pnum) { // send the lights that have been blown out int i; pnum=pnum; - + for (i=0;i<=Highest_segment_index;i++) if (Light_subtracted[i]) multi_send_light_specific(pnum,i,Light_subtracted[i]); @@ -5239,7 +5239,7 @@ void net_ipx_send_smash_lights (int pnum) extern int Num_triggers; extern void multi_send_trigger_specific (char pnum,char); -void net_ipx_send_fly_thru_triggers (int pnum) +void net_ipx_send_fly_thru_triggers (int pnum) { // send the fly thru triggers that have been disabled @@ -5281,7 +5281,7 @@ void net_ipx_handle_ping_return (ubyte pnum) Netgame.players[pnum].ping=f2i(fixmul(PingReturnTime[pnum]-PingLaunchTime[pnum],i2f(1000))); PingLaunchTime[pnum]=0; } - + // ping all connected players (except yourself) in 3sec interval and update ping_table void net_ipx_ping_all(fix time) { @@ -5307,9 +5307,9 @@ void net_ipx_ping_all(fix time) void net_ipx_do_refuse_stuff (IPX_sequence_packet *their) { int i,new_player_num; - + ClipRank (&their->player.rank); - + for (i=0;iplayer.callsign,Players[i].callsign)) @@ -5329,9 +5329,9 @@ void net_ipx_do_refuse_stuff (IPX_sequence_packet *their) return; } } - + digi_play_sample (SOUND_HUD_JOIN_REQUEST,F1_0*2); - + if (Game_mode & GM_TEAM) { if (!GameArg.MplNoRankings) @@ -5348,7 +5348,7 @@ void net_ipx_do_refuse_stuff (IPX_sequence_packet *their) { HUD_init_message ("%s wants to join (accept: F6)",their->player.callsign); } - + strcpy (RefusePlayerName,their->player.callsign); RefuseTimeLimit=timer_get_fixed_seconds(); RefuseThisPlayer=0; @@ -5364,10 +5364,10 @@ void net_ipx_do_refuse_stuff (IPX_sequence_packet *their) return; } } - + if (strcmp(their->player.callsign,RefusePlayerName)) return; - + if (RefuseThisPlayer) { RefuseTimeLimit=0; @@ -5376,15 +5376,15 @@ void net_ipx_do_refuse_stuff (IPX_sequence_packet *their) if (Game_mode & GM_TEAM) { new_player_num=net_ipx_get_new_player_num (their); - - Assert (RefuseTeam==1 || RefuseTeam==2); - - if (RefuseTeam==1) + + Assert (RefuseTeam==1 || RefuseTeam==2); + + if (RefuseTeam==1) Netgame.team_vector &=(~(1<0 && numplayersplayer.protocol.ipx.server, their->player.protocol.ipx.node); } @@ -5679,13 +5679,13 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n { int k; int w = FSPACX(280), h = FSPACY(170); - + switch (event->type) { case EVENT_WINDOW_ACTIVATED: game_flush_inputs(); break; - + case EVENT_KEY_COMMAND: k = ((d_event_keycommand *)event)->keycode; switch (k) @@ -5705,14 +5705,14 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n case EVENT_WINDOW_DRAW: gr_set_current_canvas(NULL); nm_draw_background(((SWIDTH-w)/2)-BORDERX,((SHEIGHT-h)/2)-BORDERY,((SWIDTH-w)/2)+w+BORDERX,((SHEIGHT-h)/2)+h+BORDERY); - + gr_set_current_canvas(window_get_canvas(wind)); - + grd_curcanv->cv_font = MEDIUM3_FONT; - - gr_set_fontcolor(gr_find_closest_color_current(29,29,47),-1); + + gr_set_fontcolor(gr_find_closest_color_current(29,29,47),-1); gr_string( 0x8000, FSPACY(15), "NETGAME INFO"); - + grd_curcanv->cv_font = GAME_FONT; gr_printf( FSPACX( 25),FSPACY( 35), "Reactor Life:"); gr_printf( FSPACX( 25),FSPACY( 41), "Max Time:"); @@ -5752,7 +5752,7 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n gr_printf( FSPACX(170),FSPACY(160), "Invulnerability:"); gr_printf( FSPACX(170),FSPACY(166), "Cloaking Device:"); gr_printf( FSPACX(170),FSPACY(172), "Ammo Rack:"); - + gr_set_fontcolor(BM_XRGB(255,255,255),-1); gr_printf( FSPACX(115),FSPACY( 35), "%i Min", netgame->control_invul_time/F1_0/60); gr_printf( FSPACX(115),FSPACY( 41), "%i Min", netgame->PlayTimeAllowed*5); @@ -5797,7 +5797,7 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n default: break; } - + return 0; } @@ -5805,7 +5805,7 @@ void net_ipx_show_game_rules(netgame_info *netgame) { gr_set_current_canvas(NULL); - window_create(&grd_curscreen->sc_canvas, (SWIDTH - FSPACX(320))/2, (SHEIGHT - FSPACY(200))/2, FSPACX(320), FSPACY(200), + window_create(&grd_curscreen->sc_canvas, (SWIDTH - FSPACX(320))/2, (SHEIGHT - FSPACY(200))/2, FSPACX(320), FSPACY(200), (int (*)(window *, d_event *, void *))show_game_rules_handler, netgame); } @@ -5813,12 +5813,12 @@ static int show_game_info_handler(newmenu *menu, d_event *event, netgame_info *n { if (event->type != EVENT_NEWMENU_SELECTED) return 0; - + if (newmenu_get_citem(menu) != 1) return 0; net_ipx_show_game_rules(netgame); - + return 1; } diff --git a/main/newmenu.c b/main/newmenu.c index e32421655..564581c51 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -75,6 +75,7 @@ struct newmenu { window *wind; int x,y,w,h; + int swidth, sheight, fntscalex, fntscaley; // with these we check if resolution or fonts have changed so menu structure can be recreated char *title; char *subtitle; int nitems; @@ -97,7 +98,7 @@ grs_bitmap *nm_background_sub = NULL; ubyte MenuReordering=0; ubyte SurfingNet=0; -newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ); +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode ); void newmenu_close() { if (nm_background.bm_data) @@ -131,7 +132,7 @@ void nm_draw_background1(char * filename) gr_palette_load( gr_palette ); show_fullscr(&nm_background1); } - + strcpy(last_palette_loaded,""); //force palette load next time } @@ -213,7 +214,7 @@ void nm_string( int w1,int x, int y, char * s) XTabs[i]=FSPACX(XTabs[i]); XTabs[i]+=x; } - + measure[1]=0; if (!SurfingNet) { @@ -295,7 +296,7 @@ void nm_string_black( int w1,int x, int y, char * s ) gr_rect( x - FSPACX(2), y - FSPACY(1), x, y + h ); gr_setcolor( BM_XRGB(0,0,0)); gr_rect( x - FSPACX(1), y - FSPACY(1), x+w1 - FSPACX(1), y + h); - + gr_string( x, y, s ); } @@ -311,41 +312,10 @@ void nm_rstring( int w1,int x, int y, char * s ) gr_string( x-w, y, s ); } -//for text items, constantly redraw cursor (to achieve flash) -void update_cursor( newmenu_item *item, int ScrollOffset) -{ - int w,h,aw; - fix time = timer_get_fixed_seconds(); - int x,y; - char * text = item->text; - - Assert(item->type==NM_TYPE_INPUT_MENU || item->type==NM_TYPE_INPUT); - gr_get_string_size(" ", &w, &h, &aw ); - // even with variable char widths and a box that goes over the whole screen, we maybe never get more than 75 chars on the line - if (strlen(text)>75) - text+=strlen(text)-75; - while( *text ) { - gr_get_string_size(text, &w, &h, &aw ); - if ( w > item->w-FSPACX(10) ) - text++; - else - break; - } - if (*text==0) - w = 0; - x = item->x+w; y = item->y - LINE_SPACING*ScrollOffset; - - if (time & 0x8000) - gr_string( x, y, CURSOR_STRING ); - else { - gr_setcolor( BM_XRGB(0,0,0) ); - gr_rect( x, y, x+FSPACX(7), y+h ); - } -} - void nm_string_inputbox( int w, int x, int y, char * text, int current ) { int w1,h1,aw; + fix time = timer_get_fixed_seconds(); // even with variable char widths and a box that goes over the whole screen, we maybe never get more than 75 chars on the line if (strlen(text)>75) @@ -362,9 +332,8 @@ void nm_string_inputbox( int w, int x, int y, char * text, int current ) nm_string_black( w, x, y, text ); - if ( current ) { + if ( current && time & 0x8000 ) gr_string( x+w1, y, CURSOR_STRING ); - } } void draw_item( newmenu_item *item, int is_current, int tiny ) @@ -375,7 +344,7 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) gr_set_fontcolor(gr_find_closest_color_current(57,49,20),-1); else gr_set_fontcolor(gr_find_closest_color_current(29,29,47),-1); - + if (item->text[0]=='\t') gr_set_fontcolor (gr_find_closest_color_current(63,63,63),-1); } @@ -402,9 +371,9 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) i += sprintf( item->saved_text + i, "%s", SLIDER_MIDDLE ); } sprintf( item->saved_text + i, "%s", SLIDER_RIGHT ); - + item->saved_text[item->value+1+strlen(item->text)+1] = SLIDER_MARKER[0]; - + nm_string_slider( item->w, item->x, item->y, item->saved_text ); } break; @@ -487,7 +456,7 @@ int newmenu_do( char * title, char * subtitle, int nitems, newmenu_item * item, newmenu *newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) { - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, -1, -1, 1 ); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, 1 ); } @@ -503,19 +472,19 @@ int newmenu_do2( char * title, char * subtitle, int nitems, newmenu_item * item, window *wind; int rval = -1; - menu = newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, filename, -1, -1 ); - + menu = newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, filename ); + if (!menu) return -1; menu->leave = 0; // no leaving this function until we're finished wind = menu->wind; // avoid dereferencing a freed 'menu' - + // newmenu_do2 and simpler get their own event loop // This is so the caller doesn't have to provide a callback that responds to EVENT_NEWMENU_SELECTED while (window_exists(wind)) { event_process(); - + if (menu->leave) { rval = menu->citem; @@ -523,18 +492,18 @@ int newmenu_do2( char * title, char * subtitle, int nitems, newmenu_item * item, menu->leave = 0; // user aborted close } } - + return rval; } -newmenu *newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height ) +newmenu *newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename ) { set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, width, height, 0 ); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0 ); } -newmenu *newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height){ +newmenu *newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename){ set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, width, height, 0); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0); } @@ -571,7 +540,7 @@ int newmenu_close_window(newmenu *menu) menu->leave = 1; return 1; } - + return window_close(newmenu_get_window(menu)); } @@ -583,9 +552,9 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) int changed = 0; gr_set_current_canvas(menu_canvas); - + old_choice = menu->citem; - + if ((event->type == EVENT_MOUSE_BUTTON_DOWN) && !menu->all_text) { mouse_get_pos(&mx, &my, &mz); @@ -596,18 +565,18 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) y2 = y1 + menu->items[i].h; if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { if (i+menu->scroll_offset != menu->citem) { - if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; + if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; } - + menu->citem = i + menu->scroll_offset; - + switch( menu->items[menu->citem].type ) { case NM_TYPE_CHECK: if ( menu->items[menu->citem].value ) menu->items[menu->citem].value = 0; else menu->items[menu->citem].value = 1; - + if (menu->is_scroll_box) menu->last_scroll_check=-1; changed = 1; @@ -630,17 +599,17 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) } } } - + if (menu->mouse_state && menu->all_text) { newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; } - + if ( menu->mouse_state && !menu->all_text ) { mouse_get_pos(&mx, &my, &mz); - + // check possible scrollbar stuff first if (menu->is_scroll_box) { int arrow_width, arrow_height, aw, ScrollAllow=0, time=timer_get_fixed_seconds(); @@ -650,7 +619,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) ScrollTime = time; ScrollAllow = 1; } - + if (menu->scroll_offset != 0) { gr_get_string_size(UP_ARROW_MARKER, &arrow_width, &arrow_height, &aw); x2 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->scroll_offset].x-FSPACX(13); @@ -682,24 +651,24 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) } } } - + for (i=0; imax_on_menu; i++ ) { x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13); x2 = x1 + menu->items[i].w+FSPACX(13); y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; y2 = y1 + menu->items[i].h; - + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && (menu->items[i].type != NM_TYPE_TEXT) ) { if (i+menu->scroll_offset != menu->citem) { - if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; + if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; } - + menu->citem = i + menu->scroll_offset; - + if ( menu->items[menu->citem].type == NM_TYPE_SLIDER ) { char slider_text[NM_MAX_TEXT_LEN+1], *p, *s1; int slider_width, height, aw, sleft_width, sright_width, smiddle_width; - + strcpy(slider_text, menu->items[menu->citem].saved_text); p = strchr(slider_text, '\t'); if (p) { @@ -711,7 +680,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) gr_get_string_size(SLIDER_LEFT, &sleft_width, &height, &aw); gr_get_string_size(SLIDER_RIGHT, &sright_width, &height, &aw); gr_get_string_size(SLIDER_MIDDLE, &smiddle_width, &height, &aw); - + x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->citem].x + menu->items[menu->citem].w - slider_width; x2 = x1 + slider_width + sright_width; if ( (mx > x1) && (mx < (x1 + sleft_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].min_value) ) { @@ -722,7 +691,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) changed = 1; } else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) { int num_values, value_width, new_value; - + num_values = menu->items[menu->citem].max_value - menu->items[menu->citem].min_value + 1; value_width = (slider_width - sleft_width - sright_width) / num_values; new_value = (mx - x1 - sleft_width) / value_width; @@ -747,7 +716,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) } } } - + if ((event->type == EVENT_MOUSE_BUTTON_UP) && !menu->all_text && (menu->citem != -1) && (menu->items[menu->citem].type == NM_TYPE_MENU) ) { mouse_get_pos(&mx, &my, &mz); @@ -764,7 +733,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) event->type = EVENT_NEWMENU_SELECTED; if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - + newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; @@ -777,7 +746,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) event->type = EVENT_NEWMENU_SELECTED; if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - + newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; @@ -785,7 +754,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) } } } - + if ((event->type == EVENT_MOUSE_BUTTON_UP) && (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==0)) { menu->items[menu->citem].group = 1; @@ -796,15 +765,15 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) strip_end_whitespace(menu->items[menu->citem].text); } } - + gr_set_current_canvas(save_canvas); - + if (changed && menu->subfunction) { event->type = EVENT_NEWMENU_CHANGED; (*menu->subfunction)(menu, event, menu->userdata); } - + return 0; } @@ -816,7 +785,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) char *Temp,TempVal; int changed = 0; int rval = 1; - + switch( k ) { case KEY_PAD0: k = KEY_0; break; @@ -831,9 +800,9 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) case KEY_PAD9: k = KEY_9; break; case KEY_PADPERIOD: k = KEY_PERIOD; break; } - + old_choice = menu->citem; - + switch( k ) { case KEY_TAB + KEY_SHIFTED: case KEY_UP: @@ -841,7 +810,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (menu->all_text) break; do { menu->citem--; - + if (menu->is_scroll_box) { menu->last_scroll_check=-1; @@ -851,7 +820,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) menu->scroll_offset = menu->nitems-menu->max_on_menu; break; } - + if (menu->citem-4scroll_offset && menu->scroll_offset > 0) { menu->scroll_offset--; @@ -863,8 +832,8 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (menu->citem < 0 ) menu->citem=menu->nitems-1; } } while ( menu->items[menu->citem].type==NM_TYPE_TEXT ); - - if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) + + if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) menu->items[menu->citem].value = -1; if ((old_choice>-1) && (menu->items[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=menu->citem)) { menu->items[old_choice].group=0; @@ -878,18 +847,18 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (menu->all_text) break; do { menu->citem++; - + if (menu->is_scroll_box) { menu->last_scroll_check=-1; - + if (menu->citem==menu->nitems) - { + { menu->citem=0; menu->scroll_offset=0; break; } - + if (menu->citem+4>=menu->max_on_menu+menu->scroll_offset && menu->scroll_offset < menu->nitems-menu->max_on_menu) { menu->scroll_offset++; @@ -900,14 +869,14 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (menu->citem < 0 ) menu->citem=menu->nitems-1; if (menu->citem >= menu->nitems ) menu->citem=0; } - + } while ( menu->items[menu->citem].type==NM_TYPE_TEXT ); - - if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) + + if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) menu->items[menu->citem].value = -1; if ( (old_choice>-1) && (menu->items[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=menu->citem)) { menu->items[old_choice].group=0; - strcpy(menu->items[old_choice].text, menu->items[old_choice].saved_text ); + strcpy(menu->items[old_choice].text, menu->items[old_choice].saved_text ); menu->items[old_choice].value = -1; } break; @@ -931,7 +900,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) menu->last_scroll_check=-1; } } - + changed = 1; break; case NM_TYPE_RADIO: @@ -944,10 +913,10 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) item->value = 1; changed = 1; break; - } + } } break; - + case KEY_SHIFTED+KEY_UP: if (MenuReordering && menu->citem!=0) { @@ -981,7 +950,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if ( !strnicmp( item->saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { item->text[0] = 0; item->value = -1; - } else { + } else { strip_end_whitespace(item->text); } } else @@ -993,16 +962,16 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) event->type = EVENT_NEWMENU_SELECTED; if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - + newmenu_close_window(menu); return 1; } break; - + case KEY_ESC: if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==1)) { item->group=0; - strcpy(item->text, item->saved_text ); + strcpy(item->text, item->saved_text ); item->value = -1; } else { menu->citem = -1; @@ -1010,22 +979,22 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) return 1; } break; - + #ifndef NDEBUG - case KEY_BACKSP: + case KEY_BACKSP: if ( (menu->citem>-1) && (item->type!=NM_TYPE_INPUT)&&(item->type!=NM_TYPE_INPUT_MENU)) - Int3(); + Int3(); break; #endif - + default: rval = 0; break; } - + if ( menu->citem > -1 ) { int ascii; - + // Alerting callback of every keypress for NM_TYPE_INPUT. Alternatively, just respond to EVENT_NEWMENU_SELECTED if ( ((item->type==NM_TYPE_INPUT)||((item->type==NM_TYPE_INPUT_MENU)&&(item->group==1)) )&& (old_choice==menu->citem) ) { if ( k==KEY_LEFT || k==KEY_BACKSP || k==KEY_PAD4 ) { @@ -1033,7 +1002,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (item->value > 0) item->value--; item->text[item->value] = 0; - + if (item->type==NM_TYPE_INPUT) changed = 1; rval = 1; @@ -1042,22 +1011,22 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if ((ascii < 255 ) && (item->value < item->text_len )) { int allowed; - + if (item->value==-1) { item->value = 0; } - + allowed = char_allowed(ascii); - + if (!allowed && ascii==' ' && char_allowed('_')) { ascii = '_'; allowed=1; } - + if (allowed) { item->text[item->value++] = ascii; item->text[item->value] = 0; - + if (item->type==NM_TYPE_INPUT) changed = 1; } @@ -1075,9 +1044,9 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) choice1++; if (choice1 >= menu->nitems ) choice1=0; - + for (i=0;(ch=menu->items[choice1].text[i])!=0 && ch==' ';i++); - + if ( ( (menu->items[choice1].type==NM_TYPE_MENU) || (menu->items[choice1].type==NM_TYPE_CHECK) || (menu->items[choice1].type==NM_TYPE_RADIO) || @@ -1088,7 +1057,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) k = 0; menu->citem = choice1; } - + while (menu->citem > menu->scroll_offset+menu->max_displayable-1) { menu->scroll_offset++; @@ -1097,11 +1066,11 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) { menu->scroll_offset--; } - + } while (choice1 != menu->citem ); } } - + if ( (item->type==NM_TYPE_NUMBER) || (item->type==NM_TYPE_SLIDER)) { switch( k ) { @@ -1142,222 +1111,25 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (item->value < item->min_value) item->value=item->min_value; if (item->value > item->max_value) item->value=item->max_value; } - + } - + if (changed && menu->subfunction) { event->type = EVENT_NEWMENU_CHANGED; (*menu->subfunction)(menu, event, menu->userdata); } - + return rval; } -int newmenu_draw(window *wind, newmenu *menu) +void newmenu_create_structure( newmenu *menu ) { - grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; - int tw, th = 0, ty, sx, sy; - int i; - int string_width, string_height, average_width; - - gr_set_current_canvas( NULL ); - nm_draw_background1(menu->filename); - if (menu->filename == NULL) - nm_draw_background(menu->x-(menu->is_scroll_box?FSPACX(5):0),menu->y,menu->x+menu->w,menu->y+menu->h); - - gr_set_current_canvas( menu_canvas ); - - ty = BORDERY; - - if ( menu->title ) { - gr_set_curfont(HUGE_FONT); - gr_set_fontcolor( BM_XRGB(31,31,31), -1 ); - gr_get_string_size(menu->title,&string_width,&string_height,&average_width ); - tw = string_width; - th = string_height; - gr_printf( 0x8000, ty, menu->title ); - } - - if ( menu->subtitle ) { - gr_set_curfont(MEDIUM3_FONT); - gr_set_fontcolor( BM_XRGB(21,21,21), -1 ); - gr_get_string_size(menu->subtitle,&string_width,&string_height,&average_width ); - tw = string_width; - gr_printf( 0x8000, ty+th, menu->subtitle ); - } - - if (menu->tiny_mode) - gr_set_curfont(GAME_FONT); - else - gr_set_curfont(MEDIUM1_FONT); - - // Redraw everything... - for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) - { - menu->items[i].y-=(((int)LINE_SPACING)*menu->scroll_offset); - draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode ); - menu->items[i].y+=(((int)LINE_SPACING)*menu->scroll_offset); - - } - - if (menu->is_scroll_box) - { - menu->last_scroll_check=menu->scroll_offset; - gr_set_curfont(MEDIUM2_FONT); - - sy=menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); - sx=menu->items[menu->scroll_offset].x-FSPACX(11); - - - if (menu->scroll_offset!=0) - nm_rstring( FSPACX(11), sx, sy, UP_ARROW_MARKER ); - else - nm_rstring( FSPACX(11), sx, sy, " " ); - - sy=menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); - sx=menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(11); - - if (menu->scroll_offset+menu->max_displayablenitems) - nm_rstring( FSPACX(11), sx, sy, DOWN_ARROW_MARKER ); - else - nm_rstring( FSPACX(11), sx, sy, " " ); - - } - - if (wind == window_get_front()) - for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) - if (i==menu->citem && (menu->items[i].type==NM_TYPE_INPUT || (menu->items[i].type==NM_TYPE_INPUT_MENU && menu->items[i].group))) - update_cursor( &menu->items[i],menu->scroll_offset); - - { - d_event event; - - event.type = EVENT_NEWMENU_DRAW; - if (menu->subfunction) - (*menu->subfunction)(menu, &event, menu->userdata); - } - - gr_set_current_canvas(save_canvas); - - return 1; -} - -int newmenu_handler(window *wind, d_event *event, newmenu *menu) -{ - if (event->type == EVENT_WINDOW_CLOSED) - return 0; - - if (menu->subfunction) - { - int rval = (*menu->subfunction)(menu, event, menu->userdata); - if (rval) - { - if (rval < -1) - { - menu->citem = rval; - newmenu_close_window(menu); - } - - return 1; // event handled - } - } - - switch (event->type) - { - case EVENT_WINDOW_ACTIVATED: - game_flush_inputs(); - newmenu_show_cursor(); - break; - - case EVENT_WINDOW_DEACTIVATED: - newmenu_hide_cursor(); - menu->mouse_state = 0; - break; - - case EVENT_MOUSE_BUTTON_DOWN: - case EVENT_MOUSE_BUTTON_UP: - if (mouse_get_button(event) != 0) - return 0; - - menu->mouse_state = event->type == EVENT_MOUSE_BUTTON_DOWN; - return newmenu_mouse(wind, event, menu); - - case EVENT_KEY_COMMAND: - return newmenu_key_command(wind, event, menu); - break; - - case EVENT_IDLE: - timer_delay2(50); - - return newmenu_mouse(wind, event, menu); - break; - - case EVENT_WINDOW_DRAW: - return newmenu_draw(wind, menu); - break; - - case EVENT_WINDOW_CLOSE: - if (!menu->leave) - { - menu->citem = -1; - menu->leave = 1; - return 1; // cancel close and do it in newmenu_do2 instead - } - - if (window_exists(wind)) - d_free(menu); - break; - - default: - break; - } - - return 0; -} - -newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ) -{ - window *wind = NULL; - newmenu *menu; int i,j,aw, tw, th, twidth,fm,right_offset; int nmenus, nothers; - grs_font * save_font; + grs_font *save_font; + grs_canvas *save_canvas; int string_width, string_height, average_width; - grs_canvas *menu_canvas, *save_canvas; - - MALLOC(menu, newmenu, 1); - - if (!menu) - return NULL; - - memset(menu, 0, sizeof(newmenu)); - menu->citem = citem; - menu->scroll_offset = 0; - menu->last_scroll_check = -1; - menu->all_text = 0; - menu->is_scroll_box = 0; - menu->max_on_menu = MAXDISPLAYABLEITEMS; - menu->dblclick_flag = 0; - menu->title = title; - menu->subtitle = subtitle; - menu->nitems = nitems; - menu->subfunction = subfunction; - menu->items = item; - menu->filename = filename; - menu->tiny_mode = TinyMode; - menu->leave = 1; // Default to leaving newmenu_doX function - menu->userdata = userdata; - - newmenu_close(); - - if (nitems < 1 ) - { - d_free(menu); - return NULL; - } - - menu->max_displayable=nitems; save_canvas = grd_curcanv; @@ -1367,15 +1139,15 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * tw = th = 0; - if ( title ) { + if ( menu->title ) { gr_set_curfont(HUGE_FONT); - gr_get_string_size(title,&string_width,&string_height,&average_width ); + gr_get_string_size(menu->title,&string_width,&string_height,&average_width ); tw = string_width; th = string_height; } - if ( subtitle ) { + if ( menu->subtitle ) { gr_set_curfont(MEDIUM3_FONT); - gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); + gr_get_string_size(menu->subtitle,&string_width,&string_height,&average_width ); if (string_width > tw ) tw = string_width; th += string_height; @@ -1383,9 +1155,9 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * th += FSPACY(5); //put some space between titles & body - if (TinyMode) + if (menu->tiny_mode) gr_set_curfont(GAME_FONT); - else + else gr_set_curfont(MEDIUM1_FONT); menu->w = aw = 0; @@ -1393,81 +1165,81 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * nmenus = nothers = 0; // Find menu height & width (store in w,h) - for (i=0; ih; - gr_get_string_size(item[i].text,&string_width,&string_height,&average_width ); - item[i].right_offset = 0; + for (i=0; initems; i++ ) { + menu->items[i].y = menu->h; + gr_get_string_size(menu->items[i].text,&string_width,&string_height,&average_width ); + menu->items[i].right_offset = 0; - item[i].saved_text[0] = '\0'; + menu->items[i].saved_text[0] = '\0'; - if ( item[i].type == NM_TYPE_SLIDER ) { + if ( menu->items[i].type == NM_TYPE_SLIDER ) { int index,w1,h1,aw1; nothers++; - index = sprintf( item[i].saved_text, "%s", SLIDER_LEFT ); - for (j=0; j<(item[i].max_value-item[i].min_value+1); j++ ) { - index+= sprintf( item[i].saved_text + index, "%s", SLIDER_MIDDLE ); + index = sprintf( menu->items[i].saved_text, "%s", SLIDER_LEFT ); + for (j=0; j<(menu->items[i].max_value-menu->items[i].min_value+1); j++ ) { + index+= sprintf( menu->items[i].saved_text + index, "%s", SLIDER_MIDDLE ); } - sprintf( item[i].saved_text + index, "%s", SLIDER_RIGHT ); - gr_get_string_size(item[i].saved_text,&w1,&h1,&aw1 ); + sprintf( menu->items[i].saved_text + index, "%s", SLIDER_RIGHT ); + gr_get_string_size(menu->items[i].saved_text,&w1,&h1,&aw1 ); string_width += w1 + aw; } - if ( item[i].type == NM_TYPE_MENU ) { + if ( menu->items[i].type == NM_TYPE_MENU ) { nmenus++; } - if ( item[i].type == NM_TYPE_CHECK ) { + if ( menu->items[i].type == NM_TYPE_CHECK ) { int w1,h1,aw1; nothers++; gr_get_string_size(NORMAL_CHECK_BOX, &w1, &h1, &aw1 ); - item[i].right_offset = w1; + menu->items[i].right_offset = w1; gr_get_string_size(CHECKED_CHECK_BOX, &w1, &h1, &aw1 ); - if (w1 > item[i].right_offset) - item[i].right_offset = w1; + if (w1 > menu->items[i].right_offset) + menu->items[i].right_offset = w1; } - - if (item[i].type == NM_TYPE_RADIO ) { + + if (menu->items[i].type == NM_TYPE_RADIO ) { int w1,h1,aw1; nothers++; gr_get_string_size(NORMAL_RADIO_BOX, &w1, &h1, &aw1 ); - item[i].right_offset = w1; + menu->items[i].right_offset = w1; gr_get_string_size(CHECKED_RADIO_BOX, &w1, &h1, &aw1 ); - if (w1 > item[i].right_offset) - item[i].right_offset = w1; + if (w1 > menu->items[i].right_offset) + menu->items[i].right_offset = w1; } - if (item[i].type==NM_TYPE_NUMBER ) { + if (menu->items[i].type==NM_TYPE_NUMBER ) { int w1,h1,aw1; char test_text[20]; nothers++; - sprintf( test_text, "%d", item[i].max_value ); + sprintf( test_text, "%d", menu->items[i].max_value ); gr_get_string_size( test_text, &w1, &h1, &aw1 ); - item[i].right_offset = w1; - sprintf( test_text, "%d", item[i].min_value ); + menu->items[i].right_offset = w1; + sprintf( test_text, "%d", menu->items[i].min_value ); gr_get_string_size( test_text, &w1, &h1, &aw1 ); - if ( w1 > item[i].right_offset) - item[i].right_offset = w1; + if ( w1 > menu->items[i].right_offset) + menu->items[i].right_offset = w1; } - if ((item[i].type == NM_TYPE_INPUT) || (item[i].type == NM_TYPE_INPUT_MENU)) + if ((menu->items[i].type == NM_TYPE_INPUT) || (menu->items[i].type == NM_TYPE_INPUT_MENU)) { - Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN ); - strcpy(item[i].saved_text, item[i].text ); + Assert( strlen(menu->items[i].text) < NM_MAX_TEXT_LEN ); + strcpy(menu->items[i].saved_text, menu->items[i].text ); - string_width = item[i].text_len*FSPACX(8)+item[i].text_len; - if ( string_width > MAX_TEXT_WIDTH ) + string_width = menu->items[i].text_len*FSPACX(8)+menu->items[i].text_len; + if ( menu->items[i].type == NM_TYPE_INPUT && string_width > MAX_TEXT_WIDTH ) string_width = MAX_TEXT_WIDTH; - item[i].value = -1; - item[i].group = 0; - if (item[i].type == NM_TYPE_INPUT_MENU) + menu->items[i].value = -1; + menu->items[i].group = 0; + if (menu->items[i].type == NM_TYPE_INPUT_MENU) nmenus++; else nothers++; } - item[i].w = string_width; - item[i].h = string_height; + menu->items[i].w = string_width; + menu->items[i].h = string_height; if ( string_width > menu->w ) menu->w = string_width; // Save maximum width @@ -1476,18 +1248,18 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * menu->h += string_height+FSPACY(1); // Find the height of all strings } - if (!TinyMode && i > menu->max_on_menu) + if (!menu->tiny_mode && i > menu->max_on_menu) { menu->is_scroll_box=1; - menu->h=((menu->max_on_menu+(subtitle?1:0))*LINE_SPACING); + menu->h=((menu->max_on_menu+(menu->subtitle?1:0))*LINE_SPACING); menu->max_displayable=menu->max_on_menu; - + // if our last citem was > menu->max_on_menu, make sure we re-scroll when we call this menu again - if (citem > menu->max_on_menu-4) + if (menu->citem > menu->max_on_menu-4) { - menu->scroll_offset = citem - (menu->max_on_menu-4); - if (menu->scroll_offset + menu->max_on_menu > nitems) - menu->scroll_offset = nitems - menu->max_on_menu; + menu->scroll_offset = menu->citem - (menu->max_on_menu-4); + if (menu->scroll_offset + menu->max_on_menu > menu->nitems) + menu->scroll_offset = menu->nitems - menu->max_on_menu; } } else @@ -1498,16 +1270,10 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * right_offset=0; - if ( width > -1 ) - menu->w = width; - - if ( height > -1 ) - menu->h = height; - - for (i=0; iw; - if (item[i].right_offset > right_offset ) - right_offset = item[i].right_offset; + for (i=0; initems; i++ ) { + menu->items[i].w = menu->w; + if (menu->items[i].right_offset > right_offset ) + right_offset = menu->items[i].right_offset; } menu->w += right_offset; @@ -1530,6 +1296,265 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * nm_draw_background1( menu->filename ); + // Update all item's x & y values. + for (i=0; initems; i++ ) { + menu->items[i].x = BORDERX + twidth + right_offset; + menu->items[i].y += BORDERY; + if ( menu->items[i].type==NM_TYPE_RADIO ) { + fm = -1; // find first marked one + for ( j=0; jnitems; j++ ) { + if ( menu->items[j].type==NM_TYPE_RADIO && menu->items[j].group==menu->items[i].group ) { + if (fm==-1 && menu->items[j].value) + fm = j; + menu->items[j].value = 0; + } + } + if ( fm>=0 ) + menu->items[fm].value=1; + else + menu->items[i].value=1; + } + } + + if (menu->citem != -1) + { + if (menu->citem < 0 ) menu->citem = 0; + if (menu->citem > menu->nitems-1 ) menu->citem = menu->nitems-1; + +#ifdef NEWMENU_MOUSE + menu->dblclick_flag = 1; +#endif + i = 0; + while ( menu->items[menu->citem].type==NM_TYPE_TEXT ) { + menu->citem++; + i++; + if (menu->citem >= menu->nitems ) { + menu->citem=0; + } + if (i > menu->nitems ) { + menu->citem=0; + menu->all_text=1; + break; + } + } + } + + menu->mouse_state = 0; + menu->swidth = SWIDTH; + menu->sheight = SHEIGHT; + menu->fntscalex = FNTScaleX; + menu->fntscaley = FNTScaleY; + gr_set_curfont(save_font); + gr_set_current_canvas(save_canvas); +} + +int newmenu_draw(window *wind, newmenu *menu) +{ + grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; + int tw, th = 0, ty, sx, sy; + int i; + int string_width, string_height, average_width; + + if (menu->swidth != SWIDTH || menu->sheight != SHEIGHT || menu->fntscalex != FNTScaleX || menu->fntscalex != FNTScaleY) + { + newmenu_create_structure ( menu ); + if (menu_canvas) + { + gr_init_sub_canvas(menu_canvas, &grd_curscreen->sc_canvas, menu->x, menu->y, menu->w, menu->h); + } + } + + gr_set_current_canvas( NULL ); + nm_draw_background1(menu->filename); + if (menu->filename == NULL) + nm_draw_background(menu->x-(menu->is_scroll_box?FSPACX(5):0),menu->y,menu->x+menu->w,menu->y+menu->h); + + gr_set_current_canvas( menu_canvas ); + + ty = BORDERY; + + if ( menu->title ) { + gr_set_curfont(HUGE_FONT); + gr_set_fontcolor( BM_XRGB(31,31,31), -1 ); + gr_get_string_size(menu->title,&string_width,&string_height,&average_width ); + tw = string_width; + th = string_height; + gr_printf( 0x8000, ty, menu->title ); + } + + if ( menu->subtitle ) { + gr_set_curfont(MEDIUM3_FONT); + gr_set_fontcolor( BM_XRGB(21,21,21), -1 ); + gr_get_string_size(menu->subtitle,&string_width,&string_height,&average_width ); + tw = string_width; + gr_printf( 0x8000, ty+th, menu->subtitle ); + } + + if (menu->tiny_mode) + gr_set_curfont(GAME_FONT); + else + gr_set_curfont(MEDIUM1_FONT); + + // Redraw everything... + for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) + { + menu->items[i].y-=(((int)LINE_SPACING)*menu->scroll_offset); + draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode ); + menu->items[i].y+=(((int)LINE_SPACING)*menu->scroll_offset); + + } + + if (menu->is_scroll_box) + { + menu->last_scroll_check=menu->scroll_offset; + gr_set_curfont(MEDIUM2_FONT); + + sy=menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); + sx=menu->items[menu->scroll_offset].x-FSPACX(11); + + + if (menu->scroll_offset!=0) + nm_rstring( FSPACX(11), sx, sy, UP_ARROW_MARKER ); + else + nm_rstring( FSPACX(11), sx, sy, " " ); + + sy=menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); + sx=menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(11); + + if (menu->scroll_offset+menu->max_displayablenitems) + nm_rstring( FSPACX(11), sx, sy, DOWN_ARROW_MARKER ); + else + nm_rstring( FSPACX(11), sx, sy, " " ); + + } + + { + d_event event; + + event.type = EVENT_NEWMENU_DRAW; + if (menu->subfunction) + (*menu->subfunction)(menu, &event, menu->userdata); + } + + gr_set_current_canvas(save_canvas); + + return 1; +} + +int newmenu_handler(window *wind, d_event *event, newmenu *menu) +{ + if (event->type == EVENT_WINDOW_CLOSED) + return 0; + + if (menu->subfunction) + { + int rval = (*menu->subfunction)(menu, event, menu->userdata); + if (rval) + { + if (rval < -1) + { + menu->citem = rval; + newmenu_close_window(menu); + } + + return 1; // event handled + } + } + + switch (event->type) + { + case EVENT_WINDOW_ACTIVATED: + game_flush_inputs(); + newmenu_show_cursor(); + break; + + case EVENT_WINDOW_DEACTIVATED: + newmenu_hide_cursor(); + menu->mouse_state = 0; + break; + + case EVENT_MOUSE_BUTTON_DOWN: + case EVENT_MOUSE_BUTTON_UP: + if (mouse_get_button(event) != 0) + return 0; + + menu->mouse_state = event->type == EVENT_MOUSE_BUTTON_DOWN; + return newmenu_mouse(wind, event, menu); + + case EVENT_KEY_COMMAND: + return newmenu_key_command(wind, event, menu); + break; + + case EVENT_IDLE: + timer_delay2(50); + + return newmenu_mouse(wind, event, menu); + break; + + case EVENT_WINDOW_DRAW: + return newmenu_draw(wind, menu); + break; + + case EVENT_WINDOW_CLOSE: + if (!menu->leave) + { + menu->citem = -1; + menu->leave = 1; + return 1; // cancel close and do it in newmenu_do2 instead + } + + if (window_exists(wind)) + d_free(menu); + break; + + default: + break; + } + + return 0; +} + +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode ) +{ + window *wind = NULL; + newmenu *menu; + grs_canvas *menu_canvas; + + MALLOC(menu, newmenu, 1); + + if (!menu) + return NULL; + + memset(menu, 0, sizeof(newmenu)); + menu->citem = citem; + menu->scroll_offset = 0; + menu->last_scroll_check = -1; + menu->all_text = 0; + menu->is_scroll_box = 0; + menu->max_on_menu = MAXDISPLAYABLEITEMS; + menu->dblclick_flag = 0; + menu->title = title; + menu->subtitle = subtitle; + menu->nitems = nitems; + menu->subfunction = subfunction; + menu->items = item; + menu->filename = filename; + menu->tiny_mode = TinyMode; + menu->leave = 1; // Default to leaving newmenu_doX function + menu->userdata = userdata; + + newmenu_close(); + + if (nitems < 1 ) + { + d_free(menu); + return NULL; + } + + menu->max_displayable=nitems; + + newmenu_create_structure(menu); + // Create the basic window if (menu) wind = window_create(&grd_curscreen->sc_canvas, menu->x, menu->y, menu->w, menu->h, (int (*)(window *, d_event *, void *))newmenu_handler, menu); @@ -1539,60 +1564,9 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * return NULL; } - menu->wind = wind; menu_canvas = window_get_canvas(wind); - gr_set_curfont(save_font); - gr_set_current_canvas(menu_canvas); - // Update all item's x & y values. - for (i=0; i=0 ) - item[fm].value=1; - else - item[i].value=1; - } - } - - if (citem==-1) { - menu->citem = -1; - } else { - if (citem < 0 ) citem = 0; - if (citem > nitems-1 ) citem = nitems-1; - menu->citem = citem; - -#ifdef NEWMENU_MOUSE - menu->dblclick_flag = 1; -#endif - - while ( item[menu->citem].type==NM_TYPE_TEXT ) { - menu->citem++; - if (menu->citem >= nitems ) { - menu->citem=0; - } - if (menu->citem == citem ) { - menu->citem=0; - menu->all_text=1; - break; - } - } - } - - menu->mouse_state = 0; - - gr_set_current_canvas(save_canvas); - return menu; } @@ -1655,7 +1629,7 @@ int nm_messagebox( char *title, int nchoices, ... ) // int lb_callback( int * citem, int *nitems, char * items[], int *keypress ) // { // int i; -// +// // if ( *keypress = KEY_CTRLED+KEY_D ) { // if ( *nitems > 1 ) { // PHYSFS_delete(items[*citem]); // Delete the file @@ -1668,7 +1642,7 @@ int nm_messagebox( char *title, int nchoices, ... ) // return 1; // redraw; // } // *keypress = 0; -// } +// } // return 0; // } @@ -1683,6 +1657,7 @@ struct listbox int (*listbox_callback)(listbox *lb, d_event *event, void *userdata); int citem, first_item; int box_w, height, box_x, box_y, title_height; + int swidth, sheight, fntscalex, fntscaley; // with these we check if resolution or fonts have changed so listbox structure can be recreated int mouse_state; void *userdata; }; @@ -1705,7 +1680,7 @@ int listbox_get_citem(listbox *lb) void listbox_delete_item(listbox *lb, int item) { int i; - + Assert(item >= 0); if (lb->nitems) @@ -1714,7 +1689,7 @@ void listbox_delete_item(listbox *lb, int item) lb->item[i] = lb->item[i+1]; lb->nitems--; lb->item[lb->nitems] = NULL; - + if (lb->citem >= lb->nitems) lb->citem = lb->nitems ? lb->nitems - 1 : 0; } @@ -1724,19 +1699,19 @@ void update_scroll_position(listbox *lb) { if (lb->citem<0) lb->citem=0; - + if (lb->citem>=lb->nitems) lb->citem = lb->nitems-1; - + if (lb->citem< lb->first_item) lb->first_item = lb->citem; - + if (lb->citem>=( lb->first_item+LB_ITEMS_ON_SCREEN)) lb->first_item = lb->citem-LB_ITEMS_ON_SCREEN+1; - + if (lb->nitems <= LB_ITEMS_ON_SCREEN ) lb->first_item = 0; - + if (lb->first_item>lb->nitems-LB_ITEMS_ON_SCREEN) lb->first_item = lb->nitems-LB_ITEMS_ON_SCREEN; if (lb->first_item < 0 ) lb->first_item = 0; @@ -1746,11 +1721,11 @@ int listbox_mouse(window *wind, d_event *event, listbox *lb) { int i; int mx, my, mz, x1, x2, y1, y2; //, dblclick_flag; - + if (lb->mouse_state) { int w, h, aw; - + mouse_get_pos(&mx, &my, &mz); for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { if (i >= lb->nitems) @@ -1769,7 +1744,7 @@ int listbox_mouse(window *wind, d_event *event, listbox *lb) else if (event->type == EVENT_MOUSE_BUTTON_UP) { int w, h, aw; - + if (lb->citem < 0) return 0; @@ -1785,12 +1760,12 @@ int listbox_mouse(window *wind, d_event *event, listbox *lb) event->type = EVENT_NEWMENU_SELECTED; if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) return 1; - + window_close(wind); return 1; } } - + return 0; } @@ -1798,7 +1773,7 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb) { int key = ((d_event_keycommand *)event)->keycode; int rval = 1; - + switch(key) { case KEY_HOME: case KEY_PAD7: @@ -1837,12 +1812,12 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb) event->type = EVENT_NEWMENU_SELECTED; if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) return 1; - + window_close(wind); return 1; break; - - default: + + default: { int ascii = key_ascii(); if ( ascii < 255 ) { @@ -1854,7 +1829,7 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb) if ( cc < 0 ) cc = 0; if ( cc >= lb->nitems ) cc = 0; if ( lb->citem == cc ) break; - + if ( toupper( lb->item[cc][0] ) == toupper(ascii) ) { lb->citem = cc; break; @@ -1865,21 +1840,67 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb) rval = 0; } } - + update_scroll_position(lb); - + return rval; } +void listbox_create_structure( listbox *lb) +{ + int i = 0; + + gr_set_current_canvas(NULL); + + gr_set_curfont(MEDIUM3_FONT); + + lb->box_w = 0; + for (i=0; initems; i++ ) { + int w, h, aw; + gr_get_string_size( lb->item[i], &w, &h, &aw ); + if ( w > lb->box_w ) + lb->box_w = w+FSPACX(10); + } + lb->height = LINE_SPACING * LB_ITEMS_ON_SCREEN; + + { + int w, h, aw; + gr_get_string_size( lb->title, &w, &h, &aw ); + if ( w > lb->box_w ) + lb->box_w = w; + lb->title_height = h+FSPACY(5); + } + + lb->box_x = (grd_curcanv->cv_bitmap.bm_w-lb->box_w)/2; + lb->box_y = (grd_curcanv->cv_bitmap.bm_h-(lb->height+lb->title_height))/2 + lb->title_height; + if ( lb->box_y < lb->title_height ) + lb->box_y = lb->title_height; + + if ( lb->citem < 0 ) lb->citem = 0; + if ( lb->citem >= lb->nitems ) lb->citem = 0; + + lb->first_item = 0; + update_scroll_position(lb); + + lb->mouse_state = 0; //dblclick_flag = 0; + lb->swidth = SWIDTH; + lb->sheight = SHEIGHT; + lb->fntscalex = FNTScaleX; + lb->fntscaley = FNTScaleY; +} + int listbox_draw(window *wind, listbox *lb) { int i; + if (lb->swidth != SWIDTH || lb->sheight != SHEIGHT || lb->fntscalex != FNTScaleX || lb->fntscalex != FNTScaleY) + listbox_create_structure ( lb ); + gr_set_current_canvas(NULL); nm_draw_background( lb->box_x-BORDERX,lb->box_y-lb->title_height-BORDERY,lb->box_x+lb->box_w+BORDERX,lb->box_y+lb->height+BORDERY ); gr_set_curfont(MEDIUM3_FONT); gr_string( 0x8000, lb->box_y - lb->title_height, lb->title ); - + gr_setcolor( BM_XRGB( 0,0,0) ); for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { int y = (i-lb->first_item)*LINE_SPACING+lb->box_y; @@ -1891,9 +1912,9 @@ int listbox_draw(window *wind, listbox *lb) gr_setcolor( BM_XRGB(0,0,0)); gr_rect( lb->box_x, y - FSPACY(1), lb->box_x + lb->box_w - FSPACX(1), y + LINE_SPACING); } else { - if ( i == lb->citem ) + if ( i == lb->citem ) gr_set_curfont(MEDIUM2_FONT); - else + else gr_set_curfont(MEDIUM1_FONT); gr_setcolor( BM_XRGB(5,5,5)); gr_rect( lb->box_x + lb->box_w - FSPACX(1), y-FSPACY(1), lb->box_x + lb->box_w, y + LINE_SPACING); @@ -1904,7 +1925,7 @@ int listbox_draw(window *wind, listbox *lb) gr_string( lb->box_x+FSPACX(5), y, lb->item[i] ); } } - + { d_event event; @@ -1912,7 +1933,7 @@ int listbox_draw(window *wind, listbox *lb) if ( lb->listbox_callback ) (*lb->listbox_callback)(lb, &event, lb->userdata); } - + return 1; } @@ -1927,44 +1948,44 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) if (rval) return 1; // event handled } - + switch (event->type) { case EVENT_WINDOW_ACTIVATED: game_flush_inputs(); newmenu_show_cursor(); break; - + case EVENT_WINDOW_DEACTIVATED: newmenu_hide_cursor(); break; - + case EVENT_MOUSE_BUTTON_DOWN: case EVENT_MOUSE_BUTTON_UP: if (mouse_get_button(event) != 0) return 0; - + lb->mouse_state = event->type == EVENT_MOUSE_BUTTON_DOWN; return listbox_mouse(wind, event, lb); - + case EVENT_KEY_COMMAND: return listbox_key_command(wind, event, lb); break; - + case EVENT_IDLE: timer_delay2(50); - + return listbox_mouse(wind, event, lb); break; - + case EVENT_WINDOW_DRAW: return listbox_draw(wind, lb); break; - + case EVENT_WINDOW_CLOSE: d_free(lb); break; - + default: break; } @@ -1981,66 +2002,33 @@ listbox *newmenu_listbox1( char * title, int nitems, char * items[], int allow_a { listbox *lb; window *wind; - int i; MALLOC(lb, listbox, 1); - + if (!lb) return NULL; - memset(lb, 0, sizeof(listbox)); + memset(lb, 0, sizeof(listbox)); newmenu_close(); - + lb->title = title; lb->nitems = nitems; lb->item = items; + lb->citem = default_item; lb->allow_abort_flag = allow_abort_flag; lb->listbox_callback = listbox_callback; lb->userdata = userdata; - gr_set_current_canvas(NULL); - - gr_set_curfont(MEDIUM3_FONT); - - lb->box_w = 0; - for (i=0; i lb->box_w ) - lb->box_w = w+FSPACX(10); - } - lb->height = LINE_SPACING * LB_ITEMS_ON_SCREEN; - - { - int w, h, aw; - gr_get_string_size( title, &w, &h, &aw ); - if ( w > lb->box_w ) - lb->box_w = w; - lb->title_height = h+FSPACY(5); - } - - lb->box_x = (grd_curcanv->cv_bitmap.bm_w-lb->box_w)/2; - lb->box_y = (grd_curcanv->cv_bitmap.bm_h-(lb->height+lb->title_height))/2 + lb->title_height; - if ( lb->box_y < lb->title_height ) - lb->box_y = lb->title_height; + listbox_create_structure(lb); wind = window_create(&grd_curscreen->sc_canvas, lb->box_x-BORDERX, lb->box_y-lb->title_height-BORDERY, lb->box_w+2*BORDERX, lb->height+2*BORDERY, (int (*)(window *, d_event *, void *))listbox_handler, lb); if (!wind) { d_free(lb); - + return NULL; } - lb->citem = default_item; - if ( lb->citem < 0 ) lb->citem = 0; - if ( lb->citem >= nitems ) lb->citem = 0; - - lb->first_item = 0; - update_scroll_position(lb); - - lb->mouse_state = 0; //dblclick_flag = 0; - return lb; } @@ -2069,6 +2057,6 @@ newmenu *nm_messagebox_fixedfont( char *title, int nchoices, ... ) Assert(strlen(nm_text) < MESSAGEBOX_TEXT_SIZE ); - return newmenu_do_fixedfont( title, nm_text, nchoices, nm_message_items, NULL, NULL, 0, NULL, -1, -1 ); + return newmenu_do_fixedfont( title, nm_text, nchoices, nm_message_items, NULL, NULL, 0, NULL ); } //end this section addition - Victor Rachels diff --git a/main/newmenu.h b/main/newmenu.h index 07346fc9b..50f198d23 100644 --- a/main/newmenu.h +++ b/main/newmenu.h @@ -68,8 +68,8 @@ extern int newmenu_do1(char *title, char *subtitle, int nitems, newmenu_item *it // Same as above, only you can pass through what background bitmap to use. extern int newmenu_do2(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename); -// Same as above, only you can pass through the width and height -extern newmenu *newmenu_do3(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename, int width, int height); +// Same as above, but returns menu instead of citem +extern newmenu *newmenu_do3(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename); // Tiny menu with GAME_FONT extern newmenu *newmenu_dotiny(char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata);