/** * @brief Pops a window from the window stack * @param[in] all If true pop all windows from stack * @sa UI_PopWindow_f */ void UI_PopWindow (bool all) { uiNode_t *oldfirst = ui_global.windowStack[0]; if (all) { UI_CloseAllWindow(); } else { uiNode_t *mainWindow = ui_global.windowStack[ui_global.windowStackPos - 1]; if (!ui_global.windowStackPos) return; if (WINDOWEXTRADATA(mainWindow).parent) mainWindow = WINDOWEXTRADATA(mainWindow).parent; UI_CloseWindowByRef(mainWindow); if (ui_global.windowStackPos == 0) { /* ui_sys_main contains the window that is the very first window and should be * pushed back onto the stack (otherwise there would be no window at all * right now) */ if (Q_streq(oldfirst->name, ui_sys_main->string)) { if (ui_sys_active->string[0] != '\0') UI_PushWindow(ui_sys_active->string); if (!ui_global.windowStackPos) UI_PushWindow(ui_sys_main->string); } else { if (ui_sys_main->string[0] != '\0') UI_PushWindow(ui_sys_main->string); if (!ui_global.windowStackPos) UI_PushWindow(ui_sys_active->string); } } } /* change from e.g. console mode to game input mode (fetch input) */ Key_SetDest(key_game); }
/* ===================== Host_Connect_f User command to connect to server ===================== */ static void Host_Connect_f (void) { char name[MAX_QPATH]; cls.demonum = -1; // stop demo loop in case this fails Key_SetDest (key_game); // remove console or menu if (cls.demoplayback) { CL_StopPlayback (); CL_Disconnect (); } q_strlcpy (name, Cmd_Argv(1), sizeof(name)); CL_EstablishConnection (name); Host_Reconnect_f (); }
/** * @brief Push a window onto the window stack * @param[in] name Name of the window to push onto window stack * @param[in] parentName Window name to link as parent-child (else NULL) * @param[in] params List of string parameters to send to the onWindowOpened method. * It can be NULL when there is no parameters, else this object must be freed by the caller. * @return A pointer to @c uiNode_t */ uiNode_t* UI_PushWindow (const char *name, const char *parentName, linkedList_t *params) { uiNode_t *window; UI_ReleaseInput(); window = UI_GetWindow(name); if (window == NULL) { Com_Printf("Window \"%s\" not found.\n", name); return NULL; } UI_DeleteWindowFromStack(window); if (ui_global.windowStackPos < UI_MAX_WINDOWSTACK) if (parentName) { const int parentPos = UI_GetWindowPositionFromStackByName(parentName); if (parentPos == -1) { Com_Printf("Didn't find parent window \"%s\" for window push of \"%s\"\n", parentName, name); return NULL; } UI_InsertWindowIntoStack(window, parentPos + 1); WINDOWEXTRADATA(window).parent = ui_global.windowStack[parentPos]; } else ui_global.windowStack[ui_global.windowStackPos++] = window; else Com_Printf("Window stack overflow\n"); UI_Node_WindowOpened(window, params); /* change from e.g. console mode to game input mode (fetch input) */ Key_SetDest(key_game); UI_InvalidateMouse(); return window; }
/* =============== Host_Loadgame_f =============== */ static void Host_Loadgame_f (void) { FILE *f; char mapname[MAX_QPATH]; float playtime; char str[32768]; int version; int i, error_state; int tempi; float tempf; edict_t *ent; float spawn_parms[NUM_SPAWN_PARMS]; if (cmd_source != src_command) return; if (Cmd_Argc() != 2) { Con_Printf ("load <savename> : load a game\n"); return; } cls.demonum = -1; // stop demo loop in case this fails CL_Disconnect(); Host_RemoveGIPFiles(NULL); Key_SetDest (key_game); // remove console or menu FS_MakePath_BUF (FS_USERDIR, &error_state, savename, sizeof(savename), Cmd_Argv(1)); if (error_state) { Con_Printf ("%s: save directory name too long\n", __thisfunc__); return; } Con_Printf ("Loading game from %s...\n", savename); if (q_snprintf(savedest, sizeof(savedest), "%s/info.dat", savename) >= (int)sizeof(savedest)) { Host_Error("%s: %d: string buffer overflow!", __thisfunc__, __LINE__); return; } f = fopen (savedest, "r"); if (!f) { Con_Printf ("%s: ERROR: couldn't open savefile\n", __thisfunc__); return; } fscanf (f, "%i\n", &version); if (version != SAVEGAME_VERSION) { fclose (f); Con_Printf ("Savegame is version %i, not %i\n", version, SAVEGAME_VERSION); return; } fscanf (f, "%s\n", str); for (i = 0; i < NUM_SPAWN_PARMS; i++) fscanf (f, "%f\n", &spawn_parms[i]); // this silliness is so we can load 1.06 save files, which have float skill values fscanf (f, "%f\n", &tempf); current_skill = (int)(tempf + 0.1); Cvar_SetValue ("skill", current_skill); Cvar_Set ("deathmatch", "0"); Cvar_Set ("coop", "0"); Cvar_Set ("teamplay", "0"); Cvar_Set ("randomclass", "0"); fscanf (f, "%s\n", mapname); fscanf (f, "%f\n", &playtime); tempi = -1; fscanf (f, "%d\n", &tempi); if (tempi >= 1) svs.maxclients = tempi; tempf = -1; fscanf (f, "%f\n", &tempf); if (tempf >= 0) Cvar_SetValue ("deathmatch", tempf); tempf = -1; fscanf (f, "%f\n", &tempf); if (tempf >= 0) Cvar_SetValue ("coop", tempf); tempf = -1; fscanf (f, "%f\n", &tempf); if (tempf >= 0) Cvar_SetValue ("teamplay", tempf); tempf = -1; fscanf (f, "%f\n", &tempf); if (tempf >= 0) Cvar_SetValue ("randomclass", tempf); tempf = -1; fscanf (f, "%f\n", &tempf); if (tempf >= 0) Cvar_SetValue ("_cl_playerclass", tempf); // mission pack, objectives strings fscanf (f, "%u\n", &info_mask); fscanf (f, "%u\n", &info_mask2); fclose (f); Host_RemoveGIPFiles(FS_GetUserdir()); FS_MakePath_BUF (FS_USERDIR, NULL, savedest, sizeof(savedest), Cmd_Argv(1)); error_state = Host_CopyFiles(savedest, "*.gip", FS_GetUserdir()); if (error_state) { Host_Error ("%s: The game could not be loaded properly!", __thisfunc__); return; } if (LoadGamestate(mapname, NULL, 2) != 0) return; SV_SaveSpawnparms (); ent = EDICT_NUM(1); Cvar_SetValue ("_cl_playerclass", ent->v.playerclass);//this better be the same as above... // this may be rudundant with the setting in PR_LoadProgs, but not sure so its here too if (sv_globals.cl_playerclass) *sv_globals.cl_playerclass = ent->v.playerclass; svs.clients->playerclass = ent->v.playerclass; sv.paused = true; // pause until all clients connect sv.loadgame = true; if (cls.state != ca_dedicated) { CL_EstablishConnection ("local"); Host_Reconnect_f (); } }
/* ====================== Host_Map_f handle a map <servername> command from the console. Active clients are kicked off. ====================== */ static void Host_Map_f (void) { int i; char name[MAX_QPATH]; if (Cmd_Argc() < 2) //no map name given { Con_Printf ("map <levelname>: start a new server\n"); if (cls.state == ca_disconnected) return; if (cls.state == ca_connected) { Con_Printf ("Current level: %s [ %s ]\n", cl.levelname, cl.mapname); return; } // (cls.state == ca_dedicated) if (sv.active) { Con_Printf ("Current level: %s [ %s ]\n", SV_GetLevelname(), sv.name); } return; } if (cmd_source != src_command) return; cls.demonum = -1; // stop demo loop in case this fails CL_Disconnect (); Host_ShutdownServer(false); Key_SetDest (key_game); // remove console or menu SCR_BeginLoadingPlaque (); info_mask = 0; if (!coop.integer && deathmatch.integer) info_mask2 = 0x80000000; else info_mask2 = 0; svs.serverflags = 0; // haven't completed an episode yet q_strlcpy (name, Cmd_Argv(1), sizeof(name)); SV_SpawnServer (name, NULL); if (!sv.active) return; if (cls.state != ca_dedicated) { loading_stage = 2; memset (cls.spawnparms, 0, MAX_MAPSTRING); for (i = 2; i < Cmd_Argc(); i++) { q_strlcat (cls.spawnparms, Cmd_Argv(i), MAX_MAPSTRING); q_strlcat (cls.spawnparms, " ", MAX_MAPSTRING); } Cmd_ExecuteString ("connect local", src_command); } }
void Key_EndChat (void) { Key_SetDest (key_game); chat_bufferlen = 0; chat_buffer[0] = 0; }