const char *cht_Morph (player_t *player, PClassPlayerPawn *morphclass, bool quickundo) { if (player->mo == NULL) { return ""; } PClassPlayerPawn *oldclass = player->mo->GetClass(); // Set the standard morph style for the current game int style = MORPH_UNDOBYTOMEOFPOWER; if (gameinfo.gametype == GAME_Hexen) style |= MORPH_UNDOBYCHAOSDEVICE; if (player->morphTics) { if (P_UndoPlayerMorph (player, player)) { if (!quickundo && oldclass != morphclass && P_MorphPlayer (player, player, morphclass, 0, style)) { return GStrings("TXT_STRANGER"); } return GStrings("TXT_NOTSTRANGE"); } } else if (P_MorphPlayer (player, player, morphclass, 0, style)) { return GStrings("TXT_STRANGE"); } return ""; }
// // M_ReadSaveStrings // read the strings from the savegame files // void M_ReadSaveStrings(void) { FILE *handle; int count; int i; for (i = 0; i < load_end; i++) { std::string name; G_BuildSaveName (name, i); handle = fopen (name.c_str(), "rb"); if (handle == NULL) { strcpy (&savegamestrings[i][0], GStrings(EMPTYSTRING)); LoadMenu[i].status = 0; } else { count = fread (&savegamestrings[i], SAVESTRINGSIZE, 1, handle); fclose (handle); LoadMenu[i].status = 1; } } }
void M_QuickSave(void) { if (multiplayer) { S_Sound (CHAN_INTERFACE, "player/male/grunt1", 1, ATTN_NONE); M_ClearMenus (); return; } if (!usergame) { S_Sound (CHAN_INTERFACE, "player/male/grunt1", 1, ATTN_NONE); M_ClearMenus (); return; } if (gamestate != GS_LEVEL) return; if (quickSaveSlot < 0) { M_StartControlPanel(); M_ReadSaveStrings(); M_SetupNextMenu(&SaveDef); quickSaveSlot = -2; // means to pick a slot now return; } sprintf (tempstring, GStrings(QSPROMPT), savegamestrings[quickSaveSlot]); M_StartMessage (tempstring, M_QuickSaveResponse, true); }
int FOptionMenuItem::GetIndent() { if (mCentered) { return 0; } const char *label = mLabel; if (*label == '$') label = GStrings(label+1); return SmallFont->StringWidth(label); }
void M_ChooseSkill(int choice) { if (choice == nightmare) { M_StartMessage(GStrings(NIGHTMARE),M_VerifyNightmare,true); return; } M_StartGame(choice); }
static void PrintMessage (const char *str) { if (str != NULL) { if (str[0]=='$') { str = GStrings(str+1); } C_MidPrint (SmallFont, str); } }
static void PrintPickupMessage (const char *str) { if (str != NULL) { if (str[0]=='$') { str=GStrings(str+1); } if (str[0] != 0) Printf (PRINT_LOW, "%s\n", str); } }
void M_EndGame(int choice) { choice = 0; if (!usergame) { S_Sound (CHAN_INTERFACE, "player/male/grunt1", 1, ATTN_NONE); return; } M_StartMessage(GStrings(multiplayer ? NETEND : ENDGAME), M_EndGameResponse, true); }
bool AScanner::Use (bool pickup) { if (!(level.flags2 & LEVEL2_ALLMAP)) { if (Owner->CheckLocalView (consoleplayer)) { C_MidPrint(SmallFont, GStrings("TXT_NEEDMAP")); } return false; } return Super::Use (pickup); }
void P_UpdateSpecials () { // LEVEL TIMER if (deathmatch && timelimit) { if (level.maptime >= (int)(timelimit * TICRATE * 60)) { Printf ("%s\n", GStrings("TXT_TIMELIMIT")); G_ExitLevel(0, false); } } }
void M_Episode (int choice) { if ((gameinfo.flags & GI_SHAREWARE) && choice) { M_StartMessage(GStrings(SWSTRING),NULL,false); //M_SetupNextMenu(&ReadDef1); M_ClearMenus (); return; } epi = choice; M_SetupNextMenu(&NewDef); }
void FOptionMenuItem::drawLabel(int indent, int y, EColorRange color, bool grayed) { const char *label = mLabel; if (*label == '$') label = GStrings(label+1); int overlay = grayed? MAKEARGB(96,48,0,0) : 0; int x; int w = SmallFont->StringWidth(label) * CleanXfac_1; if (!mCentered) x = indent - w; else x = (screen->GetWidth() - w) / 2; screen->DrawText (SmallFont, color, x, y, label, DTA_CleanNoMove_1, true, DTA_ColorOverlay, overlay, TAG_DONE); }
const char *ACoin::PickupMessage () { if (Amount == 1) { return Super::PickupMessage(); } else { static char msg[64]; mysnprintf (msg, countof(msg), GStrings("TXT_XGOLD"), Amount); return msg; } }
void DIntermissionScreenCast::Drawer () { spriteframe_t* sprframe; FTexture* pic; Super::Drawer(); const char *name = mName; if (name != NULL) { if (*name == '$') name = GStrings(name+1); screen->DrawText (SmallFont, CR_UNTRANSLATED, (SCREENWIDTH - SmallFont->StringWidth (name) * CleanXfac)/2, (SCREENHEIGHT * 180) / 200, name, DTA_CleanNoMove, true, TAG_DONE); } // draw the current frame in the middle of the screen if (caststate != NULL) { int castsprite = caststate->sprite; if (!(mDefaults->flags4 & MF4_NOSKIN) && mDefaults->SpawnState != NULL && caststate->sprite == mDefaults->SpawnState->sprite && mClass->IsDescendantOf(RUNTIME_CLASS(APlayerPawn)) && skins != NULL) { // Only use the skin sprite if this class has not been removed from the // PlayerClasses list. for (unsigned i = 0; i < PlayerClasses.Size(); ++i) { if (PlayerClasses[i].Type == mClass) { castsprite = skins[players[consoleplayer].userinfo.GetSkin()].sprite; } } } sprframe = &SpriteFrames[sprites[castsprite].spriteframes + caststate->GetFrame()]; pic = TexMan(sprframe->Texture[0]); screen->DrawTexture (pic, 160, 170, DTA_320x200, true, DTA_FlipX, sprframe->Flip & 1, DTA_Translation, casttranslation, TAG_DONE); } }
const char * G_SkillName() { const char *name = AllSkills[gameskill].MenuName; player_t *player = &players[consoleplayer]; const char *playerclass = player->mo->GetClass()->Meta.GetMetaString(APMETA_DisplayName); if (playerclass != NULL) { FString * pmnm = AllSkills[gameskill].MenuNamesForPlayerClass.CheckKey(playerclass); if (pmnm != NULL) name = *pmnm; } if (*name == '$') name = GStrings(name+1); return name; }
END_DEFAULTS const char *ACoin::PickupMessage () { if (Amount == 1) { return Super::PickupMessage(); } else { static char msg[64]; sprintf (msg, GStrings("TXT_XGOLD"), Amount); return msg; } }
void DIntermissionScreenText::Init(FIntermissionAction *desc, bool first) { Super::Init(desc, first); mText = static_cast<FIntermissionActionTextscreen*>(desc)->mText; if (mText[0] == '$') mText = GStrings(&mText[1]); mTextSpeed = static_cast<FIntermissionActionTextscreen*>(desc)->mTextSpeed; mTextX = static_cast<FIntermissionActionTextscreen*>(desc)->mTextX; if (mTextX < 0) mTextX =gameinfo.TextScreenX; mTextY = static_cast<FIntermissionActionTextscreen*>(desc)->mTextY; if (mTextY < 0) mTextY =gameinfo.TextScreenY; mTextLen = (int)strlen(mText); mTextDelay = static_cast<FIntermissionActionTextscreen*>(desc)->mTextDelay; mTextColor = static_cast<FIntermissionActionTextscreen*>(desc)->mTextColor; // For text screens, the duration only counts when the text is complete. if (mDuration > 0) mDuration += mTextDelay + mTextSpeed * mTextLen; }
bool APuzzleItem::Use (bool pickup) { if (P_UsePuzzleItem (Owner, PuzzleItemNumber)) { return true; } // [RH] Always play the sound if the use fails. S_Sound (Owner, CHAN_VOICE, "*puzzfail", 1, ATTN_IDLE); if (Owner != NULL && Owner->CheckLocalView (consoleplayer)) { const char *message = GetClass()->Meta.GetMetaString (AIMETA_PuzzFailMessage); if (message != NULL && *message=='$') message = GStrings[message + 1]; if (message == NULL) message = GStrings("TXT_USEPUZZLEFAILED"); C_MidPrintBold (SmallFont, message); } return false; }
void M_QuickLoad(void) { /*if (netgame) { M_StartMessage(QLOADNET,NULL,false); return; }*/ if (quickSaveSlot < 0) { M_StartControlPanel(); M_LoadGame (0); return; } sprintf(tempstring,GStrings(QLPROMPT),savegamestrings[quickSaveSlot]); M_StartMessage(tempstring,M_QuickLoadResponse,true); }
bool APuzzleItem::Use (bool pickup) { if (P_UsePuzzleItem (Owner, PuzzleItemNumber)) { return true; } // [RH] Always play the sound if the use fails. S_Sound (Owner, CHAN_VOICE, "*puzzfail", 1, ATTN_IDLE); if (Owner != NULL && Owner->CheckLocalView (consoleplayer)) { FString message = GetClass()->PuzzFailMessage; if (message.IsNotEmpty() && message[0] == '$') message = GStrings[&message[1]]; if (message.IsEmpty()) message = GStrings("TXT_USEPUZZLEFAILED"); C_MidPrintBold (SmallFont, message); } return false; }
void M_Episode (int choice) { if ((gameinfo.flags & GI_SHAREWARE) && choice) { M_StartMessage(GStrings(SWSTRING),NULL,false); //M_SetupNextMenu(&ReadDef1); M_ClearMenus (); return; } epi = choice; if (gameinfo.gametype & GAME_Heretic) { NewDef.menuitems = HereticNewGameMenu; NewDef.routine = NULL; NewDef.x = 38; NewDef.y = 30; } M_SetupNextMenu(&NewDef); }
// // Selected from DOOM menu // [ML] 7 Sept 08: Bringing game saving/loading in from // zdoom 1.22 source, see MAINTAINERS // void M_SaveGame (int choice) { if (multiplayer && !demoplayback) { M_StartMessage("you can't save while in a net game!\n\npress a key.", NULL,false); M_ClearMenus (); return; } if (!usergame) { M_StartMessage(GStrings(SAVEDEAD),NULL,false); M_ClearMenus (); return; } if (gamestate != GS_LEVEL) return; M_SetupNextMenu(&SaveDef); M_ReadSaveStrings(); }
static bool Cht_Sound (cheatseq_t *cheat) { noisedebug = !noisedebug; Printf ("%s\n", GStrings(noisedebug ? "TXT_CHEATSOUNDON" : "TXT_CHEATSOUNDOFF")); return true; }
void G_LeavingHub(int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) { unsigned int i, j; if (cluster->flags & CLUSTER_HUB) { for (i = 0; i < hubdata.Size(); i++) { if (hubdata[i].levelnum == level.levelnum) { hubdata[i] = *wbs; break; } } if (i == hubdata.Size()) { hubdata[hubdata.Reserve(1)] = *wbs; } hubdata[i].levelnum = level.levelnum; if (!multiplayer && !deathmatch) { // The player counters don't work in hubs hubdata[i].plyr[0].skills = level.killed_monsters; hubdata[i].plyr[0].sitems = level.found_items; hubdata[i].plyr[0].ssecret = level.found_secrets; } if (mode != FINISH_SameHub) { wbs->maxkills = wbs->maxitems = wbs->maxsecret = 0; for (i = 0; i < MAXPLAYERS; i++) { wbs->plyr[i].sitems = wbs->plyr[i].skills = wbs->plyr[i].ssecret = 0; } for (i = 0; i < hubdata.Size(); i++) { wbs->maxkills += hubdata[i].maxkills; wbs->maxitems += hubdata[i].maxitems; wbs->maxsecret += hubdata[i].maxsecret; for (j = 0; j < MAXPLAYERS; j++) { wbs->plyr[j].sitems += hubdata[i].plyr[j].sitems; wbs->plyr[j].skills += hubdata[i].plyr[j].skills; wbs->plyr[j].ssecret += hubdata[i].plyr[j].ssecret; } } if (cluster->ClusterName.IsNotEmpty()) { if (cluster->flags & CLUSTER_LOOKUPNAME) { level.LevelName = GStrings(cluster->ClusterName); } else { level.LevelName = cluster->ClusterName; } } } } if (mode != FINISH_SameHub) hubdata.Clear(); }
void F_StartCast (void) { // [RH] Set the names for the cast castorder[0].name = GStrings(CC_ZOMBIE); castorder[1].name = GStrings(CC_SHOTGUN); castorder[2].name = GStrings(CC_HEAVY); castorder[3].name = GStrings(CC_IMP); castorder[4].name = GStrings(CC_DEMON); castorder[5].name = GStrings(CC_LOST); castorder[6].name = GStrings(CC_CACO); castorder[7].name = GStrings(CC_HELL); castorder[8].name = GStrings(CC_BARON); castorder[9].name = GStrings(CC_ARACH); castorder[10].name = GStrings(CC_PAIN); castorder[11].name = GStrings(CC_REVEN); castorder[12].name = GStrings(CC_MANCU); castorder[13].name = GStrings(CC_ARCH); castorder[14].name = GStrings(CC_SPIDER); castorder[15].name = GStrings(CC_CYBER); castorder[16].name = GStrings(CC_HERO); wipegamestate = GS_FORCEWIPE; castnum = 0; caststate = &states[mobjinfo[castorder[castnum].type].seestate]; castsprite = caststate->sprite; casttics = caststate->tics; castdeath = false; finalestage = 2; castframes = 0; castonmelee = 0; castattacking = false; S_ChangeMusic("d_evil", true); }
// // D_DoomMain // void D_DoomMain (void) { unsigned p; extern std::string defdemoname; gamestate = GS_STARTUP; M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); M_LoadDefaults (); // load before initing other systems C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line const char* iwad = Args.CheckValue("-iwad"); if (!iwad) iwad = ""; std::vector<std::string> newwadfiles, newpatchfiles; newwadfiles.push_back(iwad); D_AddWadCommandLineFiles(newwadfiles); D_AddDehCommandLineFiles(newpatchfiles); D_LoadResourceFiles(newwadfiles, newpatchfiles); I_Init(); V_Init(); atterm(V_Close); #ifdef _WIN32 const char *sdlv = getenv("SDL_VIDEODRIVER"); Printf (PRINT_HIGH, "Using %s video driver.\n",sdlv); #endif C_InitConsole(screen->width, screen->height, true); atterm(C_ShutdownConsole); // SDL needs video mode set up first before input code can be used I_InitInput(); D_Init(); atterm(D_Shutdown); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks(); // [RH] User-configurable startup strings. Because BOOM does. if (GStrings(STARTUP1)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP1)); if (GStrings(STARTUP2)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP2)); if (GStrings(STARTUP3)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP3)); if (GStrings(STARTUP4)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP4)); if (GStrings(STARTUP5)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP5)); // Nomonsters sv_nomonsters = Args.CheckParm("-nomonsters"); // Respawn sv_monstersrespawn = Args.CheckParm("-respawn"); // Fast sv_fastmonsters = Args.CheckParm("-fast"); // developer mode devparm = Args.CheckParm ("-devparm"); // Record a vanilla demo p = Args.CheckParm ("-record"); if (p) { autorecord = true; autostart = true; demorecordfile = Args.GetArg (p+1); } // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); // Check for -playdemo, play a single demo then quit. p = Args.CheckParm ("-playdemo"); // Hack to check for +playdemo command, since if you just add it normally // it won't run because it's attempting to run a demo and still set up the // first map as normal. if (!p) p = Args.CheckParm ("+playdemo"); if (p && p < Args.NumArgs()-1) { Printf (PRINT_HIGH, "Playdemo parameter found on command line.\n"); singledemo = true; defdemoname = Args.GetArg (p+1); } // [SL] check for -timedemo (was removed at some point) p = Args.CheckParm("-timedemo"); if (p && p < Args.NumArgs() - 1) { singledemo = true; G_TimeDemo(Args.GetArg(p + 1)); } const char *val = Args.CheckValue ("-skill"); if (val) { sv_skill.Set (val[0]-'0'); } p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } if (devparm) Printf (PRINT_HIGH, "%s", GStrings(D_DEVSTR)); // D_DEVSTR // [RH] Now that all text strings are set up, // insert them into the level and cluster data. G_SetLevelStrings(); // [RH] Parse through all loaded mapinfo lumps G_ParseMapInfo(); // [ML] Parse musinfo lump G_ParseMusInfo(); // [RH] Parse any SNDINFO lumps S_ParseSndInfo(); // NOTE(jsd): Set up local player color EXTERN_CVAR(cl_color); R_BuildPlayerTranslation (0, V_GetColorFromString (NULL, cl_color.cstring())); I_FinishClockCalibration (); Printf (PRINT_HIGH, "D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); Printf_Bold("\n\35\36\36\36\36 Odamex Client Initialized \36\36\36\36\37\n"); if(gamestate != GS_CONNECTING) Printf(PRINT_HIGH, "Type connect <address> or use the Odamex Launcher to connect to a game.\n"); Printf(PRINT_HIGH, "\n"); setmodeneeded = false; // [Fly] we don't need to set a video mode here! //gamestate = GS_FULLCONSOLE; // [SL] allow the user to pass the name of a netdemo as the first argument. // This allows easy launching of netdemos from Windows Explorer or other GUIs. // [Xyltol] if (Args.GetArg(1)) { std::string demoarg = Args.GetArg(1); if (demoarg.find(".odd") != std::string::npos) CL_NetDemoPlay(demoarg); } p = Args.CheckParm("-netplay"); if (p) { if (Args.GetArg(p + 1)) { std::string filename = Args.GetArg(p + 1); CL_NetDemoPlay(filename); } else { Printf(PRINT_HIGH, "No netdemo filename specified.\n"); } } // denis - bring back the demos if ( gameaction != ga_loadgame ) { if (autostart || netgame || singledemo) { if (singledemo) G_DoPlayDemo(); else { if(autostart) { // single player warp (like in g_level) serverside = true; sv_allowexit = "1"; sv_freelook = "1"; sv_allowjump = "1"; sv_allowredscreen = "1"; sv_gametype = GM_COOP; players.clear(); players.push_back(player_t()); players.back().playerstate = PST_REBORN; consoleplayer_id = displayplayer_id = players.back().id = 1; } G_InitNew (startmap); if (autorecord) if (G_RecordDemo(demorecordfile.c_str())) G_BeginRecording(); } } else { if (gamestate != GS_CONNECTING) gamestate = GS_HIDECONSOLE; C_HideConsole(); if (gamemode == commercial_bfg) // DOOM 2 BFG Edtion AddCommandString("menu_main"); D_StartTitle (); // start up intro loop } } // denis - this will run a demo and quit p = Args.CheckParm ("+demotest"); if (p && p < Args.NumArgs()-1) { demotest = 1; defdemoname = Args.GetArg (p+1); G_DoPlayDemo(); while(demoplayback) { DObject::BeginFrame (); G_Ticker(); DObject::EndFrame (); gametic++; } } else { demotest = 0; D_DoomLoop (); // never returns } }
static bool Cht_BeholdMenu (cheatseq_t *cheat) { Printf ("%s\n", GStrings("STSTR_BEHOLD")); return false; }
DEFINE_ACTION_FUNCTION(AActor, A_AlienSpectreDeath) { AActor *player; char voc[32]; int log; int i; CALL_ACTION(A_NoBlocking, self); // [RH] Need this for Sigil rewarding if (!CheckBossDeath (self)) { return; } for (i = 0, player = NULL; i < MAXPLAYERS; ++i) { if (playeringame[i] && players[i].health > 0) { player = players[i].mo; break; } } if (player == NULL) { return; } switch (self->GetClass()->TypeName) { case NAME_AlienSpectre1: EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false); log = 95; break; case NAME_AlienSpectre2: C_MidPrint(SmallFont, GStrings("TXT_KILLED_BISHOP")); log = 74; player->GiveInventoryType (QuestItemClasses[20]); break; case NAME_AlienSpectre3: { C_MidPrint(SmallFont, GStrings("TXT_KILLED_ORACLE")); // If there are any Oracles still alive, kill them. TThinkerIterator<AActor> it(NAME_Oracle); AActor *oracle; while ( (oracle = it.Next()) != NULL) { if (oracle->health > 0) { oracle->health = 0; oracle->Die (self, self); } } player->GiveInventoryType (QuestItemClasses[22]); if (player->FindInventory (QuestItemClasses[20])) { // If the Bishop is dead, set quest item 22 player->GiveInventoryType (QuestItemClasses[21]); } if (player->FindInventory (QuestItemClasses[23]) == NULL) { // Macil is calling us back... log = 87; } else { // You wield the power of the complete Sigil. log = 85; } EV_DoDoor (DDoor::doorOpen, NULL, NULL, 222, 8*FRACUNIT, 0, 0, 0); break; } case NAME_AlienSpectre4: C_MidPrint(SmallFont, GStrings("TXT_KILLED_MACIL")); player->GiveInventoryType (QuestItemClasses[23]); if (player->FindInventory (QuestItemClasses[24]) == NULL) { // Richter has taken over. Macil is a snake. log = 79; } else { // Back to the factory for another Sigil! log = 106; } break; case NAME_AlienSpectre5: C_MidPrint(SmallFont, GStrings("TXT_KILLED_LOREMASTER")); ASigil *sigil; player->GiveInventoryType (QuestItemClasses[25]); if ( NETWORK_GetState( ) == NETSTATE_SINGLE ) { player->GiveInventoryType (RUNTIME_CLASS(AUpgradeStamina)); player->GiveInventoryType (RUNTIME_CLASS(AUpgradeAccuracy)); } sigil = player->FindInventory<ASigil>(); if (sigil != NULL && sigil->NumPieces == 5) { // You wield the power of the complete Sigil. log = 85; } else { // Another Sigil piece. Woohoo! log = 83; } EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false); break; default: return; } mysnprintf (voc, countof(voc), "svox/voc%d", log); S_Sound (CHAN_VOICE, voc, 1, ATTN_NORM); player->player->SetLogNumber (log); }
static bool Cht_Ticker (cheatseq_t *cheat) { ticker = !ticker; Printf ("%s\n", GStrings(ticker ? "TXT_CHEATTICKERON" : "TXT_CHEATTICKEROFF")); return true; }
//***************************************************************************** // void LASTMANSTANDING_TimeExpired( void ) { LONG lHighestHealth = 0; bool bTie = false; bool bFoundPlayer = false; LONG lWinner = -1; DHUDMessageFadeOut *pMsg; char szString[64]; // Don't end the level if we're not in a game. if ( LASTMANSTANDING_GetState( ) != LMSS_INPROGRESS ) return; // Try to find the player with the highest health. if ( lastmanstanding ) { TArray<ULONG> possibleWinners; for ( unsigned int i = 0; i < MAXPLAYERS; ++i ) possibleWinners.Push ( i ); // [BB] Find the player with the most lives left. PLAYER_SelectPlayersWithHighestValue ( PLAYER_GetLivesLeft, possibleWinners ); // [BB] If more than one player has the most lives left, select the player with the highest lives. if ( possibleWinners.Size() != 1 ) PLAYER_SelectPlayersWithHighestValue ( PLAYER_GetHealth, possibleWinners ); // [BB] If more then one player have the most lives and also the same health, then the game it a tie. if ( possibleWinners.Size() == 1 ) lWinner = possibleWinners[0]; else { lWinner = MAXPLAYERS; bTie = true; } } else if ( teamlms ) { if ( LASTMANSTANDING_TeamsWithAlivePlayersOn( ) == 1 ) { for ( ULONG i = 0; i < teams.Size( ); i++ ) { if ( TEAM_CountLivingAndRespawnablePlayers( i ) ) lWinner = i; } } else { lWinner = teams.Size( ); bTie = true; } } // If for some reason we don't have any players, just end the map like normal. if ( lWinner == -1 ) { if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVER_Printf( PRINT_HIGH, "%s\n", GStrings( "TXT_TIMELIMIT" )); else Printf( "%s\n", GStrings( "TXT_TIMELIMIT" )); GAME_SetEndLevelDelay( 5 * TICRATE ); return; } // If there was a tie, then go into sudden death! if ( bTie ) { // Only print the message the instant we reach sudden death. if ( level.time == (int)( timelimit * TICRATE * 60 )) { sprintf( szString, "\\cdSUDDEN DEATH!" ); V_ColorizeString( szString ); if ( NETWORK_GetState( ) != NETSTATE_SERVER ) { // Display the HUD message. pMsg = new DHUDMessageFadeOut( BigFont, szString, 160.4f, 75.0f, 320, 200, CR_RED, 3.0f, 2.0f ); StatusBar->AttachMessage( pMsg, MAKE_ID('C','N','T','R') ); } else { SERVERCOMMANDS_PrintHUDMessageFadeOut( szString, 160.4f, 75.0f, 320, 200, CR_RED, 3.0f, 2.0f, "BigFont", false, MAKE_ID('C','N','T','R') ); } } return; } // Also, do the win sequence for the player. LASTMANSTANDING_DoWinSequence( lWinner ); // Give the winner a win. if ( lastmanstanding ) PLAYER_SetWins( &players[lWinner], players[lWinner].ulWins + 1 ); // [BB] In a team game of course give the win to the winning team. if ( teamlms ) TEAM_SetWinCount( lWinner, TEAM_GetWinCount( lWinner ) + 1, false ); if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVER_Printf( PRINT_HIGH, "%s\n", GStrings( "TXT_TIMELIMIT" )); else Printf( "%s\n", GStrings( "TXT_TIMELIMIT" )); GAME_SetEndLevelDelay( 5 * TICRATE ); }