Make all windows except game and editor use EVENT_KEY_COMMAND, returning 1 if handled; pass NULL instead of userdata for the PCX filename, for newmenu_do1
This commit is contained in:
parent
69e3954d20
commit
574bc21e06
|
@ -3,6 +3,7 @@ D1X-Rebirth Changelog
|
|||
20100326
|
||||
--------
|
||||
main/endlevel.c, main/gameseq.c, main/mission.c, main/mission.h, main/titles.c, main/titles.h: In Endlevel sequence, re-align big explosion to draw in front of exit model, relative to viewer; Re-organized tex files for Briefings and Endings and created more general code to play them; Re-aligned Dravis' head
|
||||
main/automap.c, main/gamecntl.c, main/kconfig.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/scores.c: Make all windows except game and editor use EVENT_KEY_COMMAND, returning 1 if handled; pass NULL instead of userdata for the PCX filename, for newmenu_do1
|
||||
|
||||
20100324
|
||||
--------
|
||||
|
|
136
main/automap.c
136
main/automap.c
|
@ -354,10 +354,78 @@ extern int set_segment_depths(int start_seg, ubyte *segbuf);
|
|||
|
||||
#define MAP_BACKGROUND_FILENAME "MAP.PCX"
|
||||
|
||||
int automap_key_command(window *wind, d_event *event, automap *am)
|
||||
{
|
||||
int c = ((d_event_keycommand *)event)->keycode;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
case KEY_BACKSP: Int3(); return 1;
|
||||
#endif
|
||||
|
||||
case KEY_PRINT_SCREEN: {
|
||||
gr_set_current_canvas(NULL);
|
||||
save_screen_shot(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
case KEY_ESC:
|
||||
if (am->leave_mode==0)
|
||||
{
|
||||
window_close(wind);
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
|
||||
case KEY_ALTED+KEY_F: // Alt+F shows full map, if cheats enabled
|
||||
if (Cheats_enabled)
|
||||
{
|
||||
uint t;
|
||||
t = Players[Player_num].flags;
|
||||
Players[Player_num].flags |= PLAYER_FLAGS_MAP_ALL_CHEAT;
|
||||
automap_build_edge_list(am);
|
||||
Players[Player_num].flags=t;
|
||||
}
|
||||
return 1;
|
||||
#ifndef NDEBUG
|
||||
case KEY_DEBUGGED+KEY_F: {
|
||||
int i;
|
||||
|
||||
for (i=0; i<=Highest_segment_index; i++ )
|
||||
Automap_visited[i] = 1;
|
||||
automap_build_edge_list(am);
|
||||
am->max_segments_away = set_segment_depths(Objects[Players[Player_num].objnum].segnum, Automap_visited);
|
||||
am->segment_limit = am->max_segments_away;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
case KEY_F9:
|
||||
if (am->segment_limit > 1) {
|
||||
am->segment_limit--;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
return 1;
|
||||
case KEY_F10:
|
||||
if (am->segment_limit < am->max_segments_away) {
|
||||
am->segment_limit++;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
return 1;
|
||||
case KEY_ALTED+KEY_ENTER:
|
||||
case KEY_ALTED+KEY_PADENTER:
|
||||
gr_toggle_fullscreen();
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int automap_idle(window *wind, d_event *event, automap *am)
|
||||
{
|
||||
vms_matrix tempm;
|
||||
int c;
|
||||
|
||||
if (!am->pause_game) {
|
||||
ConsoleObject->mtype.phys_info.flags |= am->old_wiggle; // Restore wiggle
|
||||
|
@ -386,69 +454,6 @@ int automap_idle(window *wind, d_event *event, automap *am)
|
|||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
while( (c=key_inkey()) ) {
|
||||
switch( c ) {
|
||||
#ifndef NDEBUG
|
||||
case KEY_BACKSP: Int3(); break;
|
||||
#endif
|
||||
|
||||
case KEY_PRINT_SCREEN: {
|
||||
gr_set_current_canvas(NULL);
|
||||
save_screen_shot(1);
|
||||
break;
|
||||
}
|
||||
|
||||
case KEY_ESC:
|
||||
if (am->leave_mode==0)
|
||||
{
|
||||
window_close(wind);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_ALTED+KEY_F: // Alt+F shows full map, if cheats enabled
|
||||
if (Cheats_enabled)
|
||||
{
|
||||
uint t;
|
||||
t = Players[Player_num].flags;
|
||||
Players[Player_num].flags |= PLAYER_FLAGS_MAP_ALL_CHEAT;
|
||||
automap_build_edge_list(am);
|
||||
Players[Player_num].flags=t;
|
||||
}
|
||||
break;
|
||||
#ifndef NDEBUG
|
||||
case KEY_DEBUGGED+KEY_F: {
|
||||
int i;
|
||||
|
||||
for (i=0; i<=Highest_segment_index; i++ )
|
||||
Automap_visited[i] = 1;
|
||||
automap_build_edge_list(am);
|
||||
am->max_segments_away = set_segment_depths(Objects[Players[Player_num].objnum].segnum, Automap_visited);
|
||||
am->segment_limit = am->max_segments_away;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case KEY_F9:
|
||||
if (am->segment_limit > 1) {
|
||||
am->segment_limit--;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
break;
|
||||
case KEY_F10:
|
||||
if (am->segment_limit < am->max_segments_away) {
|
||||
am->segment_limit++;
|
||||
adjust_segment_limit(am, am->segment_limit);
|
||||
}
|
||||
break;
|
||||
case KEY_ALTED+KEY_ENTER:
|
||||
case KEY_ALTED+KEY_PADENTER:
|
||||
gr_toggle_fullscreen();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( Controls.fire_primary_down_count ) {
|
||||
// Reset orientation
|
||||
am->viewDist = ZOOM_DEFAULT;
|
||||
|
@ -516,6 +521,9 @@ int automap_handler(window *wind, d_event *event, automap *am)
|
|||
game_flush_inputs();
|
||||
break;
|
||||
|
||||
case EVENT_KEY_COMMAND:
|
||||
return automap_key_command(wind, event, am);
|
||||
|
||||
case EVENT_IDLE:
|
||||
return automap_idle(wind, event, am);
|
||||
break;
|
||||
|
|
|
@ -234,33 +234,34 @@ int pause_handler(window *wind, d_event *event, char *msg)
|
|||
game_flush_inputs();
|
||||
break;
|
||||
|
||||
case EVENT_IDLE:
|
||||
timer_delay2(50);
|
||||
case EVENT_KEY_COMMAND:
|
||||
key = ((d_event_keycommand *)event)->keycode;
|
||||
|
||||
key = key_inkey();
|
||||
|
||||
switch (key) {
|
||||
switch (key)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case KEY_ESC:
|
||||
//Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx)
|
||||
window_close(wind);
|
||||
break;
|
||||
return 1;
|
||||
case KEY_F1:
|
||||
show_help();
|
||||
break;
|
||||
return 1;
|
||||
case KEY_PAUSE:
|
||||
window_close(wind);
|
||||
break;
|
||||
return 1;
|
||||
case KEY_ALTED+KEY_ENTER:
|
||||
case KEY_ALTED+KEY_PADENTER:
|
||||
gr_toggle_fullscreen();
|
||||
break;
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case EVENT_IDLE:
|
||||
timer_delay2(50);
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_DRAW:
|
||||
|
@ -273,15 +274,13 @@ int pause_handler(window *wind, d_event *event, char *msg)
|
|||
ext_music_resume();
|
||||
digi_resume_midi(); // sound pausing handled by game_handler
|
||||
d_free(msg);
|
||||
return 0; // continue closing
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int do_game_pause()
|
||||
|
|
|
@ -623,54 +623,26 @@ int kconfig_mouse(window *wind, d_event *event, kc_menu *menu)
|
|||
return rval;
|
||||
}
|
||||
|
||||
int kconfig_idle(window *wind, kc_menu *menu)
|
||||
int kconfig_key_command(window *wind, d_event *event, kc_menu *menu)
|
||||
{
|
||||
int i,k;
|
||||
|
||||
if (menu->changing)
|
||||
timer_delay(f0_1/10);
|
||||
else
|
||||
timer_delay2(50);
|
||||
k = ((d_event_keycommand *)event)->keycode;
|
||||
|
||||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
k = key_inkey();
|
||||
|
||||
if (menu->changing)
|
||||
{
|
||||
if (k == KEY_ESC)
|
||||
menu->changing = 0;
|
||||
else
|
||||
switch( menu->items[menu->citem].type )
|
||||
{
|
||||
case BT_KEY: kc_change_key( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_MOUSE_AXIS: kc_change_mouseaxis( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_JOY_BUTTON: kc_change_joybutton( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_JOY_AXIS: kc_change_joyaxis( menu, &menu->items[menu->citem] ); break;
|
||||
}
|
||||
|
||||
if (!menu->changing)
|
||||
{
|
||||
game_flush_inputs();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
switch( k )
|
||||
switch (k)
|
||||
{
|
||||
case KEY_BACKSP:
|
||||
Int3();
|
||||
break;
|
||||
return 1;
|
||||
#ifdef macintosh
|
||||
case KEY_COMMAND+KEY_SHIFTED+KEY_3:
|
||||
#endif
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0);
|
||||
break;
|
||||
return 1;
|
||||
case KEY_CTRLED+KEY_D:
|
||||
menu->items[menu->citem].value = 255;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_CTRLED+KEY_R:
|
||||
if ( menu->items==kc_keyboard )
|
||||
for (i=0; i<NUM_KEY_CONTROLS; i++ )
|
||||
|
@ -687,47 +659,49 @@ int kconfig_idle(window *wind, kc_menu *menu)
|
|||
if ( menu->items==kc_d1x )
|
||||
for(i=0;i<NUM_D1X_CONTROLS;i++)
|
||||
menu->items[i].value=DefaultKeySettingsD1X[i];
|
||||
break;
|
||||
return 1;
|
||||
case KEY_DELETE:
|
||||
menu->items[menu->citem].value=255;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_UP:
|
||||
case KEY_PAD8:
|
||||
#ifdef TABLE_CREATION
|
||||
if (menu->items[menu->citem].u==-1) menu->items[menu->citem].u=find_next_item_up( menu->items,menu->nitems, menu->citem);
|
||||
#endif
|
||||
menu->citem = menu->items[menu->citem].u;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_DOWN:
|
||||
case KEY_PAD2:
|
||||
#ifdef TABLE_CREATION
|
||||
if (menu->items[menu->citem].d==-1) menu->items[menu->citem].d=find_next_item_down( menu->items,menu->nitems, menu->citem);
|
||||
#endif
|
||||
menu->citem = menu->items[menu->citem].d;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_LEFT:
|
||||
case KEY_PAD4:
|
||||
#ifdef TABLE_CREATION
|
||||
if (menu->items[menu->citem].l==-1) menu->items[menu->citem].l=find_next_item_left( menu->items,menu->nitems, menu->citem);
|
||||
#endif
|
||||
menu->citem = menu->items[menu->citem].l;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_RIGHT:
|
||||
case KEY_PAD6:
|
||||
#ifdef TABLE_CREATION
|
||||
if (menu->items[menu->citem].r==-1) menu->items[menu->citem].r=find_next_item_right( menu->items,menu->nitems, menu->citem);
|
||||
#endif
|
||||
menu->citem = menu->items[menu->citem].r;
|
||||
break;
|
||||
return 1;
|
||||
case KEY_ENTER:
|
||||
case KEY_PADENTER:
|
||||
kconfig_start_changing(menu);
|
||||
break;
|
||||
return 1;
|
||||
case -2:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
if (menu->changing)
|
||||
menu->changing = 0;
|
||||
else
|
||||
window_close(wind);
|
||||
return 1;
|
||||
break;
|
||||
#ifdef TABLE_CREATION
|
||||
case KEY_F12: {
|
||||
FILE * fp;
|
||||
|
@ -806,13 +780,12 @@ int kconfig_idle(window *wind, kc_menu *menu)
|
|||
fclose(fp);
|
||||
|
||||
}
|
||||
break;
|
||||
return 1;
|
||||
#endif
|
||||
case 0: // some other event
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -849,9 +822,33 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
|
|||
menu->mouse_state = (event->type == EVENT_MOUSE_BUTTON_DOWN);
|
||||
return kconfig_mouse(wind, event, menu);
|
||||
|
||||
case EVENT_KEY_COMMAND:
|
||||
return kconfig_key_command(wind, event, menu);
|
||||
|
||||
case EVENT_IDLE:
|
||||
kconfig_mouse(wind, event, menu);
|
||||
return kconfig_idle(wind, menu);
|
||||
|
||||
if (menu->changing)
|
||||
timer_delay(f0_1/10);
|
||||
else
|
||||
timer_delay2(50);
|
||||
|
||||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
if (menu->changing)
|
||||
{
|
||||
switch( menu->items[menu->citem].type )
|
||||
{
|
||||
case BT_KEY: kc_change_key( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_MOUSE_AXIS: kc_change_mouseaxis( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_JOY_BUTTON: kc_change_joybutton( menu, &menu->items[menu->citem] ); break;
|
||||
case BT_JOY_AXIS: kc_change_joyaxis( menu, &menu->items[menu->citem] ); break;
|
||||
}
|
||||
|
||||
if (!menu->changing)
|
||||
game_flush_inputs();
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_DRAW:
|
||||
|
|
|
@ -3948,24 +3948,26 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
|
|||
game_flush_inputs();
|
||||
break;
|
||||
|
||||
case EVENT_KEY_COMMAND:
|
||||
k = ((d_event_keycommand *)event)->keycode;
|
||||
switch (k)
|
||||
{
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0); k = 0;
|
||||
return 1;
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACEBAR:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_IDLE:
|
||||
timer_delay2(50);
|
||||
|
||||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
k = key_inkey();
|
||||
switch( k ) {
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0); k = 0;
|
||||
break;
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACEBAR:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_DRAW:
|
||||
|
@ -4024,16 +4026,11 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
|
|||
gr_set_current_canvas(NULL);
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_CLOSE:
|
||||
return 0; // continue closing
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void net_ipx_show_game_rules(netgame_info *netgame)
|
||||
|
|
314
main/net_udp.c
314
main/net_udp.c
|
@ -312,160 +312,199 @@ int udp_receive_packet(int socknum, ubyte *text, int len, struct _sockaddr *send
|
|||
/* General UDP functions - END */
|
||||
|
||||
|
||||
// Connect to a game host and get full info. Eventually we join!
|
||||
void net_udp_game_connect(struct _sockaddr HostAddr)
|
||||
typedef struct manual_join
|
||||
{
|
||||
fix start_time = 0, time = 0, last_time = 0;
|
||||
struct _sockaddr host_addr;
|
||||
int connecting;
|
||||
fix start_time, last_time;
|
||||
char addrbuf[128];
|
||||
char portbuf[6];
|
||||
} manual_join;
|
||||
|
||||
N_players = 0;
|
||||
change_playernum_to(1);
|
||||
start_time = timer_get_fixed_seconds();
|
||||
|
||||
memcpy((struct _sockaddr *)&Netgame.players[0].protocol.udp.addr, (struct _sockaddr *)&HostAddr, sizeof(struct _sockaddr));
|
||||
// Connect to a game host and get full info. Eventually we join!
|
||||
int net_udp_game_connect(manual_join *mj)
|
||||
{
|
||||
fix time = 0;
|
||||
|
||||
// Get full game info so we can show it.
|
||||
while (Netgame.protocol.udp.valid != 1)
|
||||
{
|
||||
time = timer_get_fixed_seconds();
|
||||
|
||||
// Cancel this with ESC
|
||||
if (key_inkey()==KEY_ESC)
|
||||
return;
|
||||
|
||||
// Timeout after 10 seconds
|
||||
if (timer_get_fixed_seconds() >= start_time + (F1_0*10) || timer_get_fixed_seconds() < start_time)
|
||||
{
|
||||
nm_messagebox(TXT_ERROR,1,TXT_OK,"No response by host.\n\nPossible reasons:\n* No game on this IP (anymore)\n* Port of Host not open\n or different\n* Host uses a game version\n I do not understand");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Netgame.protocol.udp.valid == -1)
|
||||
{
|
||||
nm_messagebox(TXT_ERROR,1,TXT_OK,"Version mismatch! Cannot join Game.\nHost game version: %i.%i.%i\nYour game version: %s",Netgame.protocol.udp.program_iver[0],Netgame.protocol.udp.program_iver[1],Netgame.protocol.udp.program_iver[2],VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
if (time >= last_time + F1_0)
|
||||
{
|
||||
net_udp_request_game_info(HostAddr, 0);
|
||||
last_time = time;
|
||||
}
|
||||
timer_delay2(5);
|
||||
net_udp_listen();
|
||||
time = timer_get_fixed_seconds();
|
||||
|
||||
// Timeout after 10 seconds
|
||||
if (timer_get_fixed_seconds() >= mj->start_time + (F1_0*10) || timer_get_fixed_seconds() < mj->start_time)
|
||||
{
|
||||
nm_messagebox(TXT_ERROR,1,TXT_OK,"No response by host.\n\nPossible reasons:\n* No game on this IP (anymore)\n* Port of Host not open\n or different\n* Host uses a game version\n I do not understand");
|
||||
mj->connecting = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!net_udp_show_game_info()) // show info menu and check if we join
|
||||
return;
|
||||
|
||||
Netgame.protocol.udp.valid = 0;
|
||||
start_time = timer_get_fixed_seconds();
|
||||
|
||||
// Get full game info again as it could have changed since we entered the info menu.
|
||||
while (Netgame.protocol.udp.valid != 1)
|
||||
|
||||
if (Netgame.protocol.udp.valid == -1)
|
||||
{
|
||||
time = timer_get_fixed_seconds();
|
||||
nm_messagebox(TXT_ERROR,1,TXT_OK,"Version mismatch! Cannot join Game.\nHost game version: %i.%i.%i\nYour game version: %s",Netgame.protocol.udp.program_iver[0],Netgame.protocol.udp.program_iver[1],Netgame.protocol.udp.program_iver[2],VERSION);
|
||||
mj->connecting = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (time >= mj->last_time + F1_0)
|
||||
{
|
||||
net_udp_request_game_info(mj->host_addr, 0);
|
||||
mj->last_time = time;
|
||||
}
|
||||
timer_delay2(5);
|
||||
net_udp_listen();
|
||||
|
||||
// Cancel this with ESC
|
||||
if (key_inkey()==KEY_ESC)
|
||||
return;
|
||||
if (Netgame.protocol.udp.valid != 1)
|
||||
return 0; // still trying to connect
|
||||
|
||||
// Timeout after 10 seconds
|
||||
if (timer_get_fixed_seconds() >= start_time + (F1_0*10) || timer_get_fixed_seconds() < start_time)
|
||||
if (mj->connecting == 1)
|
||||
{
|
||||
if (!net_udp_show_game_info()) // show info menu and check if we join
|
||||
{
|
||||
nm_messagebox(TXT_ERROR,1,TXT_OK,"No response by host.\n\nPossible reasons:\n* No game on this IP (anymore)\n* Port of Host not open\n or different\n* Host uses a game version\n I do not understand");
|
||||
return;
|
||||
mj->connecting = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (time >= last_time + F1_0)
|
||||
else
|
||||
{
|
||||
net_udp_request_game_info(HostAddr, 0);
|
||||
last_time = time;
|
||||
// Get full game info again as it could have changed since we entered the info menu.
|
||||
mj->connecting = 2;
|
||||
Netgame.protocol.udp.valid = 0;
|
||||
mj->start_time = timer_get_fixed_seconds();
|
||||
|
||||
return 0;
|
||||
}
|
||||
timer_delay2(5);
|
||||
net_udp_listen();
|
||||
}
|
||||
|
||||
net_udp_do_join_game();
|
||||
if (net_udp_do_join_game())
|
||||
{
|
||||
mj->connecting = 0;
|
||||
return 1; // Success!
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *connecting_txt = "Connecting...";
|
||||
static char *blank = "";
|
||||
|
||||
static int manual_join_game_handler(newmenu *menu, d_event *event, manual_join *mj)
|
||||
{
|
||||
newmenu_item *items = newmenu_get_items(menu);
|
||||
|
||||
switch (event->type)
|
||||
{
|
||||
case EVENT_KEY_COMMAND:
|
||||
if (mj->connecting && ((d_event_keycommand *)event)->keycode == KEY_ESC)
|
||||
{
|
||||
mj->connecting = 0;
|
||||
items[6].text = blank;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_IDLE:
|
||||
if (mj->connecting)
|
||||
{
|
||||
if (net_udp_game_connect(mj))
|
||||
return -2; // Success! (Keep this menu in future)
|
||||
else if (!mj->connecting)
|
||||
items[6].text = blank;
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_NEWMENU_SELECTED:
|
||||
{
|
||||
int sockres = -1;
|
||||
|
||||
if ((atoi(UDP_MyPort)) < 0 ||(atoi(UDP_MyPort)) > 65535)
|
||||
{
|
||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT);
|
||||
nm_messagebox(TXT_ERROR, 1, TXT_OK, "Illegal port");
|
||||
return 1;
|
||||
}
|
||||
|
||||
sockres = udp_open_socket(0, atoi(UDP_MyPort));
|
||||
|
||||
if (sockres != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Resolve address
|
||||
if (udp_dns_filladdr(mj->addrbuf, atoi(mj->portbuf), &mj->host_addr) < 0)
|
||||
{
|
||||
nm_messagebox(TXT_ERROR, 1, TXT_OK, "Could not resolve Address!");
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
N_players = 0;
|
||||
change_playernum_to(1);
|
||||
mj->start_time = timer_get_fixed_seconds();
|
||||
mj->last_time = 0;
|
||||
|
||||
memcpy((struct _sockaddr *)&Netgame.players[0].protocol.udp.addr, (struct _sockaddr *)&mj->host_addr, sizeof(struct _sockaddr));
|
||||
|
||||
mj->connecting = 1;
|
||||
items[6].text = connecting_txt;
|
||||
return 1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_WINDOW_CLOSE:
|
||||
d_free(mj);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void net_udp_manual_join_game()
|
||||
{
|
||||
struct _sockaddr HostAddr;
|
||||
newmenu_item m[6];
|
||||
int choice = 0, nitems = 0;
|
||||
int old_game_mode;
|
||||
char addrbuf[128]="";
|
||||
char portbuf[6]="";
|
||||
manual_join *mj;
|
||||
newmenu_item m[7];
|
||||
int nitems = 0;
|
||||
|
||||
// FIXME: Keep IP window to go back to
|
||||
MALLOC(mj, manual_join, 1);
|
||||
if (!mj)
|
||||
return;
|
||||
mj->connecting = 0;
|
||||
mj->addrbuf[0] = '\0';
|
||||
mj->portbuf[0] = '\0';
|
||||
|
||||
// FIXME: Keep manual join window to go back to
|
||||
//setjmp(LeaveGame);
|
||||
|
||||
net_udp_init();
|
||||
|
||||
memset(&addrbuf,'\0', sizeof(char)*128);
|
||||
snprintf(addrbuf, sizeof(char)*(strlen(GameArg.MplUdpHostAddr)+1), "%s", GameArg.MplUdpHostAddr);
|
||||
memset(&mj->addrbuf,'\0', sizeof(char)*128);
|
||||
snprintf(mj->addrbuf, sizeof(char)*(strlen(GameArg.MplUdpHostAddr)+1), "%s", GameArg.MplUdpHostAddr);
|
||||
|
||||
if (GameArg.MplUdpHostPort != 0)
|
||||
snprintf(portbuf, sizeof(portbuf), "%d", GameArg.MplUdpHostPort);
|
||||
snprintf(mj->portbuf, sizeof(mj->portbuf), "%d", GameArg.MplUdpHostPort);
|
||||
else
|
||||
snprintf(portbuf, sizeof(portbuf), "%d", UDP_PORT_DEFAULT);
|
||||
snprintf(mj->portbuf, sizeof(mj->portbuf), "%d", UDP_PORT_DEFAULT);
|
||||
|
||||
if (GameArg.MplUdpMyPort != 0)
|
||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", GameArg.MplUdpMyPort);
|
||||
else
|
||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT);
|
||||
|
||||
do {
|
||||
old_game_mode = Game_mode;
|
||||
nitems = 0;
|
||||
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="GAME ADDRESS OR HOSTNAME:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=addrbuf; m[nitems].text_len=128; nitems++;
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="GAME PORT:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=portbuf; m[nitems].text_len=5; nitems++;
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="MY PORT:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=UDP_MyPort; m[nitems].text_len=5; nitems++;
|
||||
nitems = 0;
|
||||
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="GAME ADDRESS OR HOSTNAME:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=mj->addrbuf; m[nitems].text_len=128; nitems++;
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="GAME PORT:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=mj->portbuf; m[nitems].text_len=5; nitems++;
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text="MY PORT:"; nitems++;
|
||||
m[nitems].type = NM_TYPE_INPUT; m[nitems].text=UDP_MyPort; m[nitems].text_len=5; nitems++;
|
||||
m[nitems].type = NM_TYPE_TEXT; m[nitems].text=blank; nitems++; // for connecting_txt
|
||||
|
||||
choice = newmenu_do1( NULL, "ENTER GAME ADDRESS", nitems, m, NULL, NULL, choice );
|
||||
|
||||
if ( choice > -1 )
|
||||
{
|
||||
int sockres = -1;
|
||||
|
||||
if ((atoi(UDP_MyPort)) < 0 ||(atoi(UDP_MyPort)) > 65535)
|
||||
{
|
||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT);
|
||||
nm_messagebox(TXT_ERROR, 1, TXT_OK, "Illegal port");
|
||||
choice = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
sockres = udp_open_socket(0, atoi(UDP_MyPort));
|
||||
|
||||
if (sockres != 0)
|
||||
{
|
||||
choice = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Resolve address
|
||||
if (udp_dns_filladdr(addrbuf, atoi(portbuf), &HostAddr) < 0)
|
||||
{
|
||||
nm_messagebox(TXT_ERROR, 1, TXT_OK, "Could not resolve Address!");
|
||||
choice = 0;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
net_udp_game_connect(HostAddr);
|
||||
}
|
||||
}
|
||||
|
||||
if (old_game_mode != Game_mode)
|
||||
{
|
||||
break; // leave menu
|
||||
}
|
||||
} while( choice > -1 );
|
||||
newmenu_do1( NULL, "ENTER GAME ADDRESS", nitems, m, (int (*)(newmenu *, d_event *, void *))manual_join_game_handler, mj, 0 );
|
||||
}
|
||||
|
||||
void net_udp_send_sequence_packet(UDP_sequence_packet seq, struct _sockaddr recv_addr)
|
||||
|
@ -4252,24 +4291,26 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
|
|||
game_flush_inputs();
|
||||
break;
|
||||
|
||||
case EVENT_KEY_COMMAND:
|
||||
k = ((d_event_keycommand *)event)->keycode;
|
||||
switch (k)
|
||||
{
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0); k = 0;
|
||||
return 1;
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACEBAR:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_IDLE:
|
||||
timer_delay2(50);
|
||||
|
||||
//see if redbook song needs to be restarted
|
||||
RBACheckFinishedHook();
|
||||
|
||||
k = key_inkey();
|
||||
switch( k ) {
|
||||
case KEY_PRINT_SCREEN:
|
||||
save_screen_shot(0); k = 0;
|
||||
break;
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACEBAR:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_DRAW:
|
||||
|
@ -4328,16 +4369,11 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
|
|||
gr_set_current_canvas(NULL);
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_CLOSE:
|
||||
return 0; // continue closing
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void net_udp_show_game_rules(netgame_info *netgame)
|
||||
|
|
|
@ -512,7 +512,7 @@ int newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * it
|
|||
|
||||
int newmenu_do1( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem )
|
||||
{
|
||||
return newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, userdata, -1, -1 );
|
||||
return newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, NULL, -1, -1 );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -343,15 +343,15 @@ int scores_handler(window *wind, d_event *event, scores_menu *menu)
|
|||
window_close(wind); // then remove the old one
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_BACKSP: Int3(); k = 0; break;
|
||||
case KEY_PRINT_SCREEN: save_screen_shot(0); k = 0; break;
|
||||
return 1;
|
||||
case KEY_BACKSP: Int3(); k = 0; return 1;
|
||||
case KEY_PRINT_SCREEN: save_screen_shot(0); k = 0; return 1;
|
||||
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACEBAR:
|
||||
case KEY_ESC:
|
||||
window_close(wind);
|
||||
break;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in a new issue