void get_N_dispatch_outfit_event(int *team, int *s_type, int *lastplayercount) { W_Event event; int validshipletter = 0; static int resetting = 0; int oldresetting; int i; oldresetting = resetting; W_NextEvent(&event); switch ((int) event.type) { case W_EV_KEY: { struct shiplist *shipscan; validshipletter = 0; shipscan = shiptypes; while (shipscan) { if (shipscan->ship->s_letter == event.key) { *s_type = shipscan->ship->s_type; validshipletter = 1; break; } shipscan = shipscan->next; } } if (me->p_status == PTQUEUE) { for (i = 0; i < WNUM; i++) { if (event.Window == messWin[i].window) { messageWinEvent(&event); break; } } if (i != WNUM) break; if (event.Window == messagew || event.Window == tstatw || event.Window == warnw) smessage(event.key); } if (event.Window == motdWin) { motdWinEvent(&event); break; } else if (event.Window == playerw || event.Window == infow) { /* allow 'i' 'I' and '^i' in playerw [BDyess] */ playerwEvent(&event); break; } else if (event.Window == w || event.Window == mapw) { switch (event.key) { #ifdef Q_OUTFITTING case 'q': *team = number_of_teams; me->p_status = PFREE; break; #endif /* Q_OUTFITTING */ case 'R': warning("Are you sure you want to reset your stats?"); resetting = 1; break; case 'y': if (resetting) { sendResetStatsReq('Y'); warning("OK, your stats have been reset."); resetting = 0; } break; case 'n': if (resetting) { warning("I didn't think so."); resetting = 0; } break; case 'f': /* Scroll motd forward */ if (currpage == NULL) currpage = motddata; if (currpage == NULL || currpage->next == NULL) break; currpage->next->prev = currpage; currpage = currpage->next; showMotd(w); resetting = 0; break; case 'b': /* Scroll motd backward */ if (currpage == NULL || currpage->prev == NULL) break; currpage = currpage->prev; showMotd(w); resetting = 0; break; /* ok, let's have some info windows available on the TQ */ default: /* hmm, something that doesn't have to do with the MOTD, maybe it's an info window request */ switch (doKeymap(&event)) { case 'U': /* U = Rank list */ if (W_IsMapped(rankw)) { W_UnmapWindow(rankw); } else { W_MapWindow(rankw); } break; case 'P': /* P = Planet list */ if (W_IsMapped(planetw)) { W_UnmapWindow(planetw); W_UnmapWindow(planetw2); } else { W_MapWindow(planetw); W_MapWindow(planetw2); } break; case 'h': /* h = Map help window */ if (W_IsMapped(helpWin)) { W_UnmapWindow(helpWin); } else { W_MapWindow(helpWin); } if (optionWin) optionredrawtarget(helpWin); break; case 'O': /* O = options Window */ if (optionWin != NULL && W_IsMapped(optionWin)) optiondone(); else optionwindow(); break; case 'w': /* w = map war stuff */ if (W_IsMapped(war)) W_UnmapWindow(war); else warwindow(); break; case '&': if (defaultsFile) { char buf[150]; sprintf(buf, "Reading defaults from %s", defaultsFile); warning(buf); freeDefaults(); defaultsFile = initDefaults(defaultsFile); resetDefaults(); } else { warning("No defaults file to read from!"); } } break; } break; /* switch event type */ } if (event.Window == qwin) return; /* normal keypresses can't make you quit */ if (event.Window == optionWin) { optionaction(&event); return; } if (!validshipletter) break; /* it wasn't the main window, see if they hit the key in a team window to choose their ship... falling through */ case W_EV_BUTTON: for (i = 0; i < number_of_teams; i++) if (event.Window == teamWin[i]) { *team = i; break; } if (event.Window == qwin) { *team = number_of_teams; me->p_status = PFREE; break; } /* allow message scrollback [BDyess] */ for (i = 0; i < WNUM; i++) { if (event.Window == messWin[i].window) { messageWinEvent(&event); break; } } /* allow bozo selection in playerw [BDyess] */ if (event.Window == playerw) { playerwEvent(&event); break; } else if (event.Window == war) waraction(&event); else if (event.Window == optionWin) optionaction(&event); else if (event.Window == motdWin) motdWinEvent(&event); else if (event.Window == w) { W_Window tmp = motdWin; motdWin = w; motdWinEvent(&event); motdWin = tmp; } if (*team != -1 && !teamRequest(*team, *s_type)) { *team = -1; } break; case W_EV_EXPOSE: for (i = 0; i < number_of_teams; i++) if (event.Window == teamWin[i]) { lastplayercount[i] = -1; /* force update */ redrawTeam(teamWin[i], i, &lastplayercount[i]); break; } if (event.Window == qwin) redrawQuit(); else if (event.Window == w) showMotd(w); else if (event.Window == mapw) { showValues(mapw); redraw_death_messages(); } else /* let the normal expose handler figure out who to redraw */ dispatch_W_expose_event(&event); break; case W_EV_KILL_WINDOW: /* WM_DESTROY_WINDOW support [BDyess] */ if(event.Window == baseWin) exit(0); else W_UnmapWindow(event.Window); break; } if (oldresetting && resetting) { resetting = 0; warning("Resetting of stats cancelled"); } }
void new_entrywindow(int *team, int *s_type) { int i; int lastplayercount[4]; /* number of players on each team */ int okayMask, lastOkayMask; /* teams you're allowed to choose */ char buf[100]; /* OUTFIT timeout stuff */ long startTime = -1; long lasttime = -1; int spareTime = 0; if (fastQuit) { *team = -1; return; } lastOkayMask = okayMask = tournMask; /* erase packet lights to make Bob happy [BDyess] */ light_erase(); /* map all team selection windows, and stripe out those that are unchoosable */ for (i = 0; i < number_of_teams; i++) { W_MapWindow(teamWin[i]); lastplayercount[i] = -1; } W_MapWindow(qwin); /* no team selected yet */ *team = -1; /* set to team index (0..n-1) to choose a team. set to n if you want to quit */ /* I don't know why this restriction is in place - RF */ if (me->p_whydead != KWINNER && me->p_whydead != KGENOCIDE) { showMotd(w); W_ClearWindow(mapw); showValues(mapw); redraw_death_messages(); } do { /* set team to n if you want to quit */ while (!W_EventsPending() && (me->p_status == POUTFIT || me->p_status == PTQUEUE)) { /* no window events, just process socket stuff */ fd_set mask; light_erase(); readFromServer(); if (me->p_status == POUTFIT || me->p_status == PTQUEUE) { /* wait up to a half-second for input from the window system */ struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 500000; FD_ZERO(&mask); FD_SET(W_Socket(), &mask); select(W_Socket() + 1, &mask, 0, 0, &tv); } #if SHOW_MAP_AT_MOTD_DATA_ITEM_IMPLEMENTED if(showMapAtMotd) { map(); } #endif redraw_death_messages(); if (me->p_status == PTQUEUE) startTime = -1; if (me->p_status == POUTFIT) { /* time only elapses in OUTFIT mode */ if (startTime == -1) { /* we were on the tqueue */ /* I hate this [BDyess] */ W_Deiconify(baseWin); /* we changed status. alert the user */ startTime = time(0); spareTime = 480; /* Allow them extra time, as long */ /* as they are active */ } elapsed = time(0) - startTime; if (elapsed > autoQuit) { printf("Auto-Quit.\n"); *team = number_of_teams; break; } } if (lasttime != time(0)) { if (W_IsMapped(playerw)) playerlist2(); if (newMotdStuff) { showMotd(w); showValues(mapw); redraw_death_messages(); } if (me->p_status == POUTFIT) { showTimeLeft(elapsed, autoQuit); } lasttime = time(0); } okayMask = tournMask; /* redraw those windows whose choosable status has changed */ for (i = 0; i < number_of_teams; i++) { if ((okayMask ^ lastOkayMask) & (1 << i)) { lastplayercount[i] = -1; /* force update */ } redrawTeam(teamWin[i], i, &lastplayercount[i]); } lastOkayMask = okayMask; } if (playback) /* silly. Shouldn't even be mapping team windows. */ break; /* they quit or ran out of time */ if (*team == number_of_teams) { me->p_status = PFREE; /* exit outer while loop */ break; } /* this makes them eventually run out of time no matter how awake they are. Only affects the OUTFIT screen. */ if (me->p_status == POUTFIT && startTime != -1) { if (time(0) - startTime <= spareTime) { spareTime -= time(0) - startTime; startTime = time(0); } else { startTime += spareTime; spareTime = 0; } } if (!W_EventsPending()) continue; /* ok, there's a window event pending */ /* thiswill set p_status to PFREE if they decide to quit */ get_N_dispatch_outfit_event(team, s_type, lastplayercount); } while ((me->p_status == POUTFIT || me->p_status == PTQUEUE) && (!pb_update) ); if (*team >= 0) { strcpy(buf, "Welcome aboard "); if (paradise) strcat(buf, ranks2[me->p_stats2.st_rank].name); else strcat(buf, ranks[me->p_stats.st_rank].name); sprintf(buf, "Welcome aboard %s!", get_players_rank_name(me)); warning(buf); } if (playback) { extern int lastTeamReq; *team = me->p_teami = lastTeamReq; } else /* if they quit or ran out of time */ if (me->p_status == PFREE) *team = -1; else if (me->p_status == PALIVE || me->p_status == POBSERVE) if (*team == -1) *team = me->p_teami; else me->p_teami = *team; for (i = 0; i < number_of_teams; i++) W_UnmapWindow(teamWin[i]); W_UnmapWindow(qwin); }
findslot(void) { int oldcount = -1; W_Window waitWin, qwin, countWin, motdButtonWin; W_Window motdWin; extern int MaxMotdLine; int WaitMotdLine = 0; int mapMotd = booleanDefault("showMotd", 1); W_Event event; /* Wait for some kind of indication about in/not in */ while (queuePos == -1) { socketPause(); if (isServerDead()) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("Shit! Ghostbusted!\n"); terminate(0); } readFromServer(NULL); if (me != NULL) { /* We are in! */ ANNOUNCESOCKET; return (me->p_no); } } /* We have to wait. Make appropriate windows, etc... */ waitWin = W_MakeWindow("wait", 0, 0, WAITWIDTH, WAITHEIGHT, NULL, 2, foreColor); countWin = W_MakeWindow("count", WAITWIDTH / 3, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); qwin = W_MakeWindow("waitquit", 0, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); motdButtonWin = W_MakeWindow("motdbutton", 2 * WAITWIDTH / 3, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); W_MapWindow(waitWin); W_MapWindow(countWin); W_MapWindow(motdButtonWin); W_MapWindow(qwin); if (mapMotd) { motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(motdWin); showMotd(motdWin, WaitMotdLine); } for (;;) { socketPause(); readFromServer(NULL); if (isServerDead()) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("Damn, We've been ghostbusted!\n"); terminate(0); } while (W_EventsPending()) { W_NextEvent(&event); switch ((int) event.type) { case W_EV_BUTTON: case W_EV_KEY: if (mapMotd && event.Window == motdWin) { if (event.key == ' ' || event.key == 'q') { W_DestroyWindow(motdWin); mapMotd = !mapMotd; } else { if (event.key == 'b') { WaitMotdLine -= 28; WaitMotdLine = MAX(WaitMotdLine, 0); } else { WaitMotdLine += 28; /* scroll to start if it goes over */ if (WaitMotdLine > MaxMotdLine) WaitMotdLine = 0; } W_ClearWindow(motdWin); showMotd(motdWin, WaitMotdLine); break; } } else if (event.Window == motdButtonWin) { if (mapMotd) { W_DestroyWindow(motdWin); } else { motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(motdWin); showMotd(motdWin, WaitMotdLine); } mapMotd = !mapMotd; } else if (event.Window == qwin) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("OK, bye!\n"); terminate(0); } break; case W_EV_EXPOSE: if (event.Window == waitWin) { mapWaitWin(waitWin); } else if (event.Window == motdWin) { showMotd(motdWin, WaitMotdLine); } else if (event.Window == qwin) { mapWaitQuit(qwin); } else if (event.Window == countWin) { mapWaitCount(waitWin, countWin, queuePos); } else if (event.Window == motdButtonWin) { mapWaitMotdButton(motdButtonWin); } break; default: break; } } if (queuePos != oldcount) { mapWaitCount(waitWin, countWin, queuePos); oldcount = queuePos; } if (me != NULL) { W_DestroyWindow(waitWin); if (mapMotd) { W_DestroyWindow(motdWin); } ANNOUNCESOCKET; W_Beep(); W_Beep(); return (me->p_no); } } }