int gr_udisk(fix xc1,fix yc1,fix r1) { int p,x, y, xc, yc, r; r = X2I(r1); xc = X2I(xc1); yc = X2I(yc1); p=3-(r*2); x=0; y=r; while(x<y) { // Draw the first octant gr_uscanline( xc-y, xc+y, yc-x ); gr_uscanline( xc-y, xc+y, yc+x ); if (p<0) p=p+(x<<2)+6; else { // Draw the second octant gr_uscanline( xc-x, xc+x, yc-y ); gr_uscanline( xc-x, xc+x, yc+y ); p=p+((x-y)<<2)+10; y--; } x++; } if(x==y) { gr_uscanline( xc-x, xc+x, yc-y ); gr_uscanline( xc-x, xc+x, yc+y ); } return 0; }
void TransferEnergyToShield(fix time) { fix e; //how much energy gets transfered static fix last_playTime=0; if (time <= 0) return; e = min (time * CONVERTER_RATE, LOCALPLAYER.energy - INITIAL_ENERGY); e = min (e, (MAX_SHIELDS - LOCALPLAYER.shields) * CONVERTER_SCALE); if (e <= 0) { if (LOCALPLAYER.energy <= INITIAL_ENERGY) HUDInitMessage (TXT_TRANSFER_ENERGY, X2I(INITIAL_ENERGY)); else HUDInitMessage (TXT_TRANSFER_SHIELDS); return; } LOCALPLAYER.energy -= e; LOCALPLAYER.shields += e / CONVERTER_SCALE; MultiSendShields (); gameStates.app.bUsingConverter = 1; if (last_playTime > gameData.time.xGame) last_playTime = 0; if (gameData.time.xGame > last_playTime+CONVERTER_SOUND_DELAY) { audio.PlaySound(SOUND_CONVERT_ENERGY); last_playTime = gameData.time.xGame; } }
int gr_circle(fix xc1,fix yc1,fix r1) { int p,x, y, xc, yc, r; r = X2I(r1); xc = X2I(xc1); yc = X2I(yc1); p=3-(r*2); x=0; y=r; // Big clip if ( (xc+r) < 0 ) return 1; if ( (xc-r) > GWIDTH ) return 1; if ( (yc+r) < 0 ) return 1; if ( (yc-r) > GHEIGHT ) return 1; while(x<y) { // Draw the first octant gr_pixel( xc-y, yc-x ); gr_pixel( xc+y, yc-x ); gr_pixel( xc-y, yc+x ); gr_pixel( xc+y, yc+x ); if (p<0) p=p+(x<<2)+6; else { // Draw the second octant gr_pixel( xc-x, yc-y ); gr_pixel( xc+x, yc-y ); gr_pixel( xc-x, yc+y ); gr_pixel( xc+x, yc+y ); p=p+((x-y)<<2)+10; y--; } x++; } if(x==y) { gr_pixel( xc-x, yc-y ); gr_pixel( xc+x, yc-y ); gr_pixel( xc-x, yc+y ); gr_pixel( xc+x, yc+y ); } return 0; }
void SpecialReactorStuff (void) { #if TRACE console.printf (CON_DBG, "Mucking with reactor countdown time.\n"); #endif if (gameData.reactor.bDestroyed) { gameData.reactor.countdown.nTimer += I2X (gameStates.app.nBaseCtrlCenExplTime + (NDL - 1 - gameStates.app.nDifficultyLevel) * gameStates.app.nBaseCtrlCenExplTime / (NDL-1)); gameData.reactor.countdown.nTotalTime = X2I (gameData.reactor.countdown.nTimer) + 2; // Will prevent "Self destruct sequence activated" message from replaying. } }
void NetworkHandlePingReturn (ubyte nPlayer) { if ((nPlayer >= gameData.multiplayer.nPlayers) || !pingStats [nPlayer].launchTime) { #if 1 console.printf (CON_DBG, "Got invalid PING RETURN from %s!\n", gameData.multiplayer.players [nPlayer].callsign); #endif return; } xPingReturnTime = TimerGetFixedSeconds (); pingStats [nPlayer].ping = X2I (FixMul (xPingReturnTime - pingStats [nPlayer].launchTime, I2X (1000))); if (!gameStates.render.cockpit.bShowPingStats) HUDInitMessage ("Ping time for %s is %d ms!", gameData.multiplayer.players [nPlayer].callsign, pingStats [nPlayer].ping); pingStats [nPlayer].launchTime = 0; pingStats [nPlayer].received++; }
void GameDrawTimeLeft (void) { char temp_string[30]; fix timevar; int i; static int nId = 0; fontManager.SetCurrent (GAME_FONT); //GAME_FONT fontManager.SetColorRGBi (RED_RGBA, 1, 0, 0); timevar = I2X (netGame.GetPlayTimeAllowed () * 5 * 60); i = X2I (timevar - gameStates.app.xThisLevelTime) + 1; sprintf (temp_string, TXT_TIME_LEFT, i); if (i >= 0) nId = GrString (0, 32, temp_string, &nId); }
int CTrigger::DoPlaySound (short nObject) { tTextIndex *indexP = FindTextData (&gameData.sounds, X2I (m_info.value)); if (!indexP) return 0; if (m_info.time < 0) { m_info.nChannel = audio.StartSound (-1, SOUNDCLASS_GENERIC, I2X (1), 0xffff / 2, -1, -1, -1, -1, I2X (1), indexP->pszText); m_info.flags |= TF_PLAYING_SOUND; } else if (gameData.time.xGame - m_info.tOperated < m_info.time) { m_info.nChannel = audio.StartSound (-1, SOUNDCLASS_GENERIC, I2X (1), 0xffff / 2, 0, 0, m_info.time - 1, -1, I2X (1), indexP->pszText); m_info.flags |= TF_PLAYING_SOUND; } return 1; }
void CStatusBar::DrawAddedScore (void) { if (IsMultiGame && !IsCoopGame) return; int nScore, nTime; if (!(nScore = cockpit->AddedScore (gameStates.render.vr.nCurrentPage))) return; int x, w, h, aw, color; char szScore [32]; static int lastX [4] = {SB_SCORE_RIGHT_L, SB_SCORE_RIGHT_L, SB_SCORE_RIGHT_H, SB_SCORE_RIGHT_H}; static int nIdTotalScore = 0; cockpit->SetScoreTime (nTime = cockpit->ScoreTime () - gameData.time.xFrame); if (nTime > 0) { color = X2I (nTime * 20) + 10; if (color < 10) color = 10; else if (color > 31) color = 31; if (gameStates.app.cheats.bEnabled) sprintf (szScore, "%s", TXT_CHEATER); else sprintf (szScore, "%5d", nScore); fontManager.Current ()->StringSize (szScore, w, h, aw); x = SB_SCORE_ADDED_RIGHT - w - LHY (2); fontManager.SetColorRGBi (RGBA_PAL2 (0, color, 0), 1, 0, 0); CCanvas::Push (); CCanvas::SetCurrent (CurrentGameScreen ()); nIdTotalScore = PrintF (&nIdTotalScore, x, SB_SCORE_ADDED_Y, szScore); CCanvas::Pop (); lastX [(gameStates.video.nDisplayMode ? 2 : 0) + gameStates.render.vr.nCurrentPage] = x; } #if 1 else { //erase old score //CCanvas::Current ()->SetColorRGBi (RGB_PAL (0, 0, 0)); //OglDrawFilledRect (lastX [(gameStates.video.nDisplayMode?2:0)+gameStates.render.vr.nCurrentPage], SB_SCORE_ADDED_Y, SB_SCORE_ADDED_RIGHT, SB_SCORE_ADDED_Y+GAME_FONT->Height ()); cockpit->SetScoreTime (0); cockpit->SetAddedScore (gameStates.render.vr.nCurrentPage, 0); } #endif }
void scores_fill_struct (stats_info * stats) { strcpy (stats->name, LOCALPLAYER.callsign); stats->score = LOCALPLAYER.score; stats->endingLevel = LOCALPLAYER.level; if (LOCALPLAYER.numRobotsTotal > 0) stats->kill_ratio = (LOCALPLAYER.numKillsTotal*100)/LOCALPLAYER.numRobotsTotal; else stats->kill_ratio = 0; if (LOCALPLAYER.hostages.nTotal > 0) stats->hostage_ratio = (LOCALPLAYER.hostages.nRescued*100)/LOCALPLAYER.hostages.nTotal; else stats->hostage_ratio = 0; stats->seconds = X2I (LOCALPLAYER.timeTotal)+ (LOCALPLAYER.hoursTotal*3600); stats->diffLevel = gameStates.app.nDifficultyLevel; stats->startingLevel = LOCALPLAYER.startingLevel; }
void NetworkSendGameInfo (tSequencePacket *their) { // Send game info to someone who requested it char oldType, oldStatus; fix timevar; int i; NetworkUpdateNetGame (); // Update the values in the netgame struct oldType = netGame.m_info.nType; oldStatus = netGame.m_info.gameStatus; netGame.m_info.nType = PID_GAME_INFO; netPlayers.m_info.nType = PID_PLAYERSINFO; netPlayers.m_info.nSecurity = netGame.m_info.nSecurity; netGame.m_info.versionMajor = D2X_MAJOR; netGame.m_info.versionMinor = D2X_MINOR; if (gameStates.app.bEndLevelSequence || gameData.reactor.bDestroyed) netGame.m_info.gameStatus = NETSTAT_ENDLEVEL; if ((timevar = I2X (netGame.GetPlayTimeAllowed () * 5 * 60))) { i = X2I (timevar - gameStates.app.xThisLevelTime); if (i < 30) netGame.m_info.gameStatus = NETSTAT_ENDLEVEL; } if (gameStates.multi.nGameType >= IPX_GAME) { if (!their) { SendBroadcastFullNetGamePacket (); SendBroadcastNetPlayersPacket (); } else { SendInternetFullNetGamePacket (their->player.network.ipx.server, their->player.network.ipx.node); SendNetPlayersPacket (their->player.network.ipx.server, their->player.network.ipx.node); } } netGame.m_info.nType = oldType; netGame.m_info.gameStatus = oldStatus; // if ((gameData.app.nGameMode & GM_ENTROPY) || extraGameInfo [0].bEnhancedCTF) //make half-way sure the client gets this data ... NetworkSendExtraGameInfo (their); MultiSendMonsterball (1, 1); }
int PickupVulcanAmmo (tObject *objP, int nPlayer) { int bUsed = 0; int pwSave = gameData.weapons.nPrimary; // Ugh, save selected primary weapon around the picking up of the ammo. // I apologize for this code. Matthew A. Toschlog if (PickupAmmo (CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT, NULL, nPlayer)) { if (ISLOCALPLAYER (nPlayer)) PowerupBasic (7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO, nPlayer); bUsed = 1; } else { int nMaxAmmo = nMaxPrimaryAmmo [VULCAN_INDEX]; if (LOCALPLAYER.flags & PLAYER_FLAGS_AMMO_RACK) nMaxAmmo *= 2; if (ISLOCALPLAYER (nPlayer)) HUDInitMessage ("%s %d %s!", TXT_ALREADY_HAVE,X2I ((unsigned) VULCAN_AMMO_SCALE * (unsigned) nMaxAmmo), TXT_VULCAN_ROUNDS); bUsed = 0; } gameData.weapons.nPrimary = pwSave; return bUsed; }
void CHUD::DrawAddedScore (void) { if (cockpit->Hide ()) return; int color; int w, h, aw, nScore, nTime; char szScore [20]; static int nIdTotalScore = 0; if (IsMultiGame && !IsCoopGame) return; if (!(nScore = cockpit->AddedScore ())) return; cockpit->SetScoreTime (nTime = cockpit->ScoreTime () - gameData.time.xFrame); if (nTime > 0) { color = X2I (nTime * 20) + 12; if (color < 10) color = 12; else if (color > 31) color = 30; color = color - (color % 4); // Only allowing colors 12, 16, 20, 24, 28 speeds up gr_getcolor, improves caching if (gameStates.app.cheats.bEnabled) sprintf (szScore, "%s", TXT_CHEATER); else sprintf (szScore, "%5d", nScore); fontManager.Current ()->StringSize (szScore, w, h, aw); fontManager.SetColorRGBi (RGBA_PAL2 (0, color, 0), 1, 0, 0); nIdTotalScore = GrPrintF (&nIdTotalScore, CCanvas::Current ()->Width () - w - LHX (12), m_info.nLineSpacing + 4, szScore); } else { cockpit->SetScoreTime (0); cockpit->SetAddedScore (0, 0); } }
int GetCloakInfo (CObject *objP, fix xCloakStartTime, fix xCloakEndTime, tCloakInfo *ciP) { tCloakInfo ci = {0, CLOAKED_FADE_LEVEL, I2X (1), I2X (1), I2X (1), 0, 0}; int i; if (!(xCloakStartTime || xCloakEndTime)) { if (objP->info.nType == OBJ_PLAYER) { xCloakStartTime = gameData.multiplayer.players [objP->info.nId].cloakTime; xCloakEndTime = gameData.multiplayer.players [objP->info.nId].cloakTime + CLOAK_TIME_MAX; } else if (objP->info.nType == OBJ_ROBOT) { if (!ROBOTINFO (objP->info.nId).bossFlag) { xCloakStartTime = gameData.time.xGame - I2X (10); xCloakEndTime = gameData.time.xGame + I2X (10); } else if (0 <= (i = gameData.bosses.Find (objP->Index ()))) { xCloakStartTime = gameData.bosses [i].m_nCloakStartTime; xCloakEndTime = gameData.bosses [i].m_nCloakEndTime; } } } if (xCloakStartTime != 0x7fffffff) ci.xTotalTime = xCloakEndTime - xCloakStartTime; else ci.xTotalTime = gameData.time.xGame; if (objP->info.nType == OBJ_PLAYER) { ci.xFadeinDuration = CLOAK_FADEIN_DURATION_PLAYER; ci.xFadeoutDuration = CLOAK_FADEOUT_DURATION_PLAYER; } else if (objP->info.nType == OBJ_ROBOT) { ci.xFadeinDuration = CLOAK_FADEIN_DURATION_ROBOT; ci.xFadeoutDuration = CLOAK_FADEOUT_DURATION_ROBOT; } else return 0; ci.xDeltaTime = gameData.time.xGame - ((xCloakStartTime == 0x7fffffff) ? 0 : xCloakStartTime); #if 0 if (ci.xDeltaTime < ci.xFadeinDuration) { // make object transparent during second half ci.nFadeValue = X2I (FixDiv (ci.xFadeinDuration - ci.xDeltaTime, ci.xFadeinDuration) * CLOAKED_FADE_LEVEL); ci.bFading = 1; } #else // only decrease light during first half of cloak initiation time if (ci.xDeltaTime < ci.xFadeinDuration / 2) { ci.xLightScale = FixDiv (ci.xFadeinDuration / 2 - ci.xDeltaTime, ci.xFadeinDuration / 2); ci.bFading = -1; } else if (ci.xDeltaTime < ci.xFadeinDuration) { // make object transparent during second half ci.nFadeValue = X2I (FixDiv (ci.xDeltaTime - ci.xFadeinDuration / 2, ci.xFadeinDuration / 2) * CLOAKED_FADE_LEVEL); ci.bFading = 1; } #endif else if ((xCloakStartTime == 0x7fffffff) || (gameData.time.xGame < xCloakEndTime - ci.xFadeoutDuration)) { static int nCloakDelta = 0, nCloakDir = 1; static fix xCloakTimer = 0; //note, if more than one cloaked CObject is visible at once, the //pulse rate will change! xCloakTimer -= gameData.time.xFrame; while (xCloakTimer < 0) { xCloakTimer += ci.xFadeoutDuration / 12; nCloakDelta += nCloakDir; if (nCloakDelta == 0 || nCloakDelta == 4) nCloakDir = -nCloakDir; } ci.nFadeValue = CLOAKED_FADE_LEVEL - nCloakDelta; } else if (gameData.time.xGame < xCloakEndTime - ci.xFadeoutDuration / 2) { ci.nFadeValue = X2I (FixDiv (ci.xTotalTime - ci.xFadeoutDuration / 2 - ci.xDeltaTime, ci.xFadeoutDuration / 2) * CLOAKED_FADE_LEVEL); ci.bFading = -1; } else { ci.xLightScale = (fix) ((float) (ci.xFadeoutDuration / 2 - (ci.xTotalTime - ci.xDeltaTime) / (float) (ci.xFadeoutDuration / 2))); ci.bFading = 1; } if (ciP) *ciP = ci; return ci.bFading; }
//if filename passed is NULL, show Normal credits void ShowCredits(char *credits_filename) { int i, j, l, bDone; CFile cf; char buffer [NUM_LINES_HIRES][80]; grsBitmap bmBackdrop; int nPcxError; unsigned int nLine = 0; unsigned int nXlLine = 0; fix xTimeout, xDelay = X2I (2800 * 1000); int nFirstLineOffs, nExtraInc = 0; int bBinary = 0; char *pszTemp; char filename [32]; int xOffs, yOffs; box dirtyBox [NUM_LINES_HIRES]; gsrCanvas *creditsOffscreenBuf = NULL; gsrCanvas *saveCanv = grdCurCanv; // Clear out all tex buffer lines. memset (buffer, 0, sizeof (buffer)); memset (dirtyBox, 0, sizeof (dirtyBox)); sprintf(filename, "%s", CREDITS_FILE); bBinary = 0; if (credits_filename) { strcpy(filename,credits_filename); bBinary = 1; } if (!cf.Open (filename, gameFolders.szDataDir, "rb", 0)) { char nfile [32]; if (credits_filename) return; //ok to not find special filename if ((pszTemp = strchr (filename, '.'))) *pszTemp = '\0'; sprintf (nfile, "%s.txb", filename); if (!cf.Open (nfile, gameFolders.szDataDir, "rb", 0)) Error("Missing CREDITS.TEX and CREDITS.TXB &cf\n"); bBinary = 1; } SetScreenMode(SCREEN_MENU); xOffs = (grdCurCanv->cvBitmap.bmProps.w - 640) / 2; yOffs = (grdCurCanv->cvBitmap.bmProps.h - 480) / 2; if (xOffs < 0) xOffs = 0; if (yOffs < 0) yOffs = 0; creditsPalette = GrUsePaletteTable("credits.256", NULL); GrPaletteStepLoad (NULL); header_font = GrInitFont(gameStates.menus.bHires ? (char *) "font1-1h.fnt" : (char *) "font1-1.fnt"); title_font = GrInitFont(gameStates.menus.bHires ? (char *) "font2-3h.fnt" : (char *) "font2-3.fnt"); names_font = GrInitFont(gameStates.menus.bHires ? (char *) "font2-2h.fnt" : (char *) "font2-2.fnt"); bmBackdrop.bmTexBuf = NULL; bmBackdrop.bmPalette = NULL; //MWA Made bmBackdrop bitmap linear since it should always be. the current canvas may not //MWA be linear, so we can't rely on grdCurCanv->cvBitmap->bmProps.nType. nPcxError = PCXReadBitmap ((char *) CREDITS_BACKGROUND_FILENAME, &bmBackdrop, BM_LINEAR, 0); if (nPcxError != PCX_ERROR_NONE) { cf.Close(); return; } SongsPlaySong(SONG_CREDITS, 1); GrRemapBitmapGood(&bmBackdrop, NULL, -1, -1); if (!gameOpts->menus.nStyle) { GrSetCurrentCanvas(NULL); GrBitmap(xOffs,yOffs,&bmBackdrop); if ((grdCurCanv->cvBitmap.bmProps.w > 640) || (grdCurCanv->cvBitmap.bmProps.h > 480)) { GrSetColorRGBi (RGBA_PAL (0,0,32)); GrUBox(xOffs,yOffs,xOffs+bmBackdrop.bmProps.w+1,yOffs+bmBackdrop.bmProps.h+1); } } GrPaletteFadeIn(NULL, 32, 0); // Create a new offscreen buffer for the credits screen //MWA Let's be a little smarter about this and check the VR_offscreen buffer //MWA for size to determine if we can use that buffer. If the game size //MWA matches what we need, then lets save memory. if (gameStates.menus.bHires && !gameOpts->menus.nStyle && gameStates.render.vr.buffers.offscreen->cv_w == 640) creditsOffscreenBuf = gameStates.render.vr.buffers.offscreen; else if (gameStates.menus.bHires) creditsOffscreenBuf = GrCreateCanvas(640,480); else creditsOffscreenBuf = GrCreateCanvas(320,200); if (!creditsOffscreenBuf) Error("Not enough memory to allocate Credits Buffer."); creditsOffscreenBuf->cvBitmap.bmPalette = grdCurCanv->cvBitmap.bmPalette; if (gameOpts->menus.nStyle) creditsOffscreenBuf->cvBitmap.bmProps.flags |= BM_FLAG_TRANSPARENT; KeyFlush (); bDone = 0; nFirstLineOffs = 0; xTimeout = SDL_GetTicks () + xDelay; glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gameStates.menus.nInMenu = 1; while (1) { int k; do { nLine = (nLine + 1) % NUM_LINES; get_line:; if (cf.GetS (buffer [nLine], 80)) { char *p = buffer [nLine]; if (bBinary) // is this a binary tbl &cf for (i = (int) strlen (buffer [nLine]); i > 0; i--, p++) *p = EncodeRotateLeft ((char) (EncodeRotateLeft (*p) ^ BITMAP_TBL_XOR)); p = buffer [nLine]; if (*p == ';') goto get_line; if (*p == '%') { if (p [1] == ALLOWED_CHAR) strcpy (p, p + 2); else goto get_line; } if ((p = strchr (buffer [nLine], '\n'))) *p = '\0'; } else if (nXlLine < NUM_XL_LINES) { strcpy (buffer [nLine], xlCredits [nXlLine++]); } else { //fseek(&cf, 0, SEEK_SET); buffer [nLine][0] = 0; bDone++; } } while (nExtraInc--); nExtraInc = 0; //PrintLog ("%s\n", buffer [nLine]); for (i = 0; i < ROW_SPACING; i += gameStates.menus.bHires + 1) { int y; if (gameOpts->menus.nStyle) { GrSetCurrentCanvas (NULL); ShowFullscreenImage (&bmBackdrop); // GrUpdate (0); #if 0 if ((grdCurCanv->cvBitmap.bmProps.w > 640) || (grdCurCanv->cvBitmap.bmProps.h > 480)) { GrSetColorRGBi (RGBA_PAL (0,0,32)); GrUBox (xOffs, yOffs, xOffs + bmBackdrop. bmProps.w + 1, yOffs + bmBackdrop.bmProps.h + 1); } #endif } y = nFirstLineOffs - i; GrSetCurrentCanvas (creditsOffscreenBuf); if (gameOpts->menus.nStyle) GrClearCanvas (0); else GrBitmap (0, 0, &bmBackdrop); for (j = 0; j < NUM_LINES; j++) { char *s; l = (nLine + j + 1) % NUM_LINES; s = buffer [l]; if (s[0] == '!') s++; else if (s[0] == '$') { grdCurCanv->cvFont = header_font; s++; } else if (s[0] == '*') { grdCurCanv->cvFont = title_font; s++; } else grdCurCanv->cvFont = names_font; grBitBltFadeTable = (gameStates.menus.bHires ? fadeValues_hires : fadeValues); pszTemp = strchr (s, '\t'); if (pszTemp) { // Wacky Credits thing int w, h, aw, w2, x1, x2; *pszTemp = 0; GrGetStringSize(s, &w, &h, &aw); x1 = ((gameStates.menus.bHires?320:160)-w)/2; cr_gr_printf (x1 , y, s); GrGetStringSize (pszTemp + 1, &w2, &h, &aw); x2 = (gameStates.menus.bHires ? 320 : 160) + (((gameStates.menus.bHires ? 320 : 160) - w2) / 2); cr_gr_printf(x2, y, &pszTemp[1]); dirtyBox [j].left = ((gameStates.menus.bHires?320:160)-w)/2; dirtyBox [j].top = y; dirtyBox [j].width =(x2+w2)-x1; dirtyBox [j].height = h; *pszTemp = '\t'; } else { // Wacky Fast Credits thing int w, h, aw; GrGetStringSize (s, &w, &h, &aw); dirtyBox [j].width = w; dirtyBox [j].height = h; dirtyBox [j].top = y; dirtyBox [j].left = ((gameStates.menus.bHires?640:320) - w) / 2; cr_gr_printf (0x8000, y, s); } grBitBltFadeTable = NULL; if (buffer[l][0] == '!') y += ROW_SPACING / 2; else y += ROW_SPACING; } if (gameOpts->menus.nStyle) GrSetCurrentCanvas (NULL); { // Wacky Fast Credits Thing box *newBox; grsBitmap *tempBmP; for (j = 0; j < NUM_LINES; j++) { newBox = dirtyBox + j; tempBmP = &creditsOffscreenBuf->cvBitmap; GrBmBitBlt (newBox->width + 1, newBox->height +4, newBox->left + xOffs, newBox->top + yOffs, newBox->left, newBox->top, tempBmP, &grdCurScreen->scCanvas.cvBitmap); } } GrUpdate (0); #if 1 { int t = xTimeout - SDL_GetTicks (); if (t > 0) G3_SLEEP (t); xTimeout = SDL_GetTicks () + xDelay; } #endif //see if redbook song needs to be restarted SongsCheckRedbookRepeat(); k = KeyInKey (); #if DBG if (k == KEY_BACKSP) { Int3(); k = 0; } #endif if ((k == KEY_PRINT_SCREEN) || (k == KEY_ALTED+KEY_F9)) { gameStates.app.bSaveScreenshot = 1; SaveScreenShot (NULL, 0); k = 0; } else if (k == KEY_PADPLUS) xDelay /= 2; else if (k == KEY_PADMINUS) { if (xDelay) xDelay *= 2; else xDelay = 1; } else if ((k == KEY_ESC) || (bDone > NUM_LINES)) { GrCloseFont (header_font); GrCloseFont (title_font); GrCloseFont (names_font); GrPaletteFadeOut (NULL, 32, 0); GrUsePaletteTable (D2_DEFAULT_PALETTE, NULL); D2_FREE (bmBackdrop.bmTexBuf); cf.Close (); GrSetCurrentCanvas (saveCanv); SongsPlaySong (SONG_TITLE, 1); if (creditsOffscreenBuf != gameStates.render.vr.buffers.offscreen) GrFreeCanvas (creditsOffscreenBuf); glDisable (GL_BLEND); gameStates.menus.nInMenu = 0; return; } } if (buffer [(nLine + 1) % NUM_LINES][0] == '!') { nFirstLineOffs -= ROW_SPACING - ROW_SPACING / 2; if (nFirstLineOffs <= -ROW_SPACING) { nFirstLineOffs += ROW_SPACING; nExtraInc++; } } } }
//convert '1' characters to special wide ones void CHUD::DrawWeapons (void) { if (cockpit->Hide ()) return; int w, h, aw; int y; const char *pszWeapon; char szWeapon [32]; static int nIdWeapons [2] = {0, 0}; // CCanvas::SetCurrent (&gameStates.render.vr.buffers.subRender [0]); //render off-screen fontManager.SetColorRGBi (GREEN_RGBA, 1, 0, 0); y = CCanvas::Current ()->Height (); if (IsMultiGame) y -= 4 * m_info.nLineSpacing; pszWeapon = PRIMARY_WEAPON_NAMES_SHORT (gameData.weapons.nPrimary); switch (gameData.weapons.nPrimary) { case LASER_INDEX: if (LOCALPLAYER.flags & PLAYER_FLAGS_QUAD_LASERS) sprintf (szWeapon, "%s %s %i", TXT_QUAD, pszWeapon, LOCALPLAYER.laserLevel + 1); else sprintf (szWeapon, "%s %i", pszWeapon, LOCALPLAYER.laserLevel + 1); break; case SUPER_LASER_INDEX: Int3 (); break; //no such thing as super laser case VULCAN_INDEX: case GAUSS_INDEX: sprintf (szWeapon, "%s: %i", pszWeapon, X2I ((unsigned) LOCALPLAYER.primaryAmmo [VULCAN_INDEX] * (unsigned) VULCAN_AMMO_SCALE)); Convert1s (szWeapon); break; case SPREADFIRE_INDEX: case PLASMA_INDEX: case FUSION_INDEX: case HELIX_INDEX: case PHOENIX_INDEX: strcpy (szWeapon, pszWeapon); break; case OMEGA_INDEX: sprintf (szWeapon, "%s: %03i", pszWeapon, gameData.omega.xCharge [IsMultiGame] * 100 / MAX_OMEGA_CHARGE); Convert1s (szWeapon); break; default: Int3 (); szWeapon [0] = 0; break; } fontManager.Current ()->StringSize (szWeapon, w, h, aw); nIdWeapons [0] = GrPrintF (nIdWeapons + 0, CCanvas::Current ()->Width () - 5 - w, y - 2 * m_info.nLineSpacing, szWeapon); if (gameData.weapons.nPrimary == VULCAN_INDEX) { if (LOCALPLAYER.primaryAmmo [gameData.weapons.nPrimary] != m_history [gameStates.render.vr.nCurrentPage].ammo [0]) { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordPrimaryAmmo (m_history [gameStates.render.vr.nCurrentPage].ammo [0], LOCALPLAYER.primaryAmmo [gameData.weapons.nPrimary]); m_history [gameStates.render.vr.nCurrentPage].ammo [0] = LOCALPLAYER.primaryAmmo [gameData.weapons.nPrimary]; } } if (gameData.weapons.nPrimary == OMEGA_INDEX) { if (gameData.omega.xCharge [IsMultiGame] != m_history [gameStates.render.vr.nCurrentPage].xOmegaCharge) { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordPrimaryAmmo (m_history [gameStates.render.vr.nCurrentPage].xOmegaCharge, gameData.omega.xCharge [IsMultiGame]); m_history [gameStates.render.vr.nCurrentPage].xOmegaCharge = gameData.omega.xCharge [IsMultiGame]; } } pszWeapon = SECONDARY_WEAPON_NAMES_VERY_SHORT (gameData.weapons.nSecondary); sprintf (szWeapon, "%s %d", pszWeapon, LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary]); fontManager.Current ()->StringSize (szWeapon, w, h, aw); nIdWeapons [1] = GrPrintF (nIdWeapons + 1, CCanvas::Current ()->Width ()-5-w, y-m_info.nLineSpacing, szWeapon); if (LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary] != m_history [gameStates.render.vr.nCurrentPage].ammo [1]) { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordSecondaryAmmo (m_history [gameStates.render.vr.nCurrentPage].ammo [1], LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary]); m_history [gameStates.render.vr.nCurrentPage].ammo [1] = LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary]; } }
int PixelTranspType (short nTexture, short nOrient, short nFrame, fix u, fix v) { CBitmap *bmP; int bmx, bmy, w, h, offs; ubyte c; #if 0 tBitmapIndex *bmiP; bmiP = gameData.pig.tex.bmIndexP + (nTexture); LoadBitmap (*bmiP, gameStates.app.bD1Data); bmP = BmOverride (gameData.pig.tex.bitmapP + bmiP->index); #else bmP = LoadFaceBitmap (nTexture, nFrame); if (!bmP->Buffer ()) return 0; #endif if (bmP->Flags () & BM_FLAG_RLE) bmP = rle_expand_texture (bmP); w = bmP->Width (); h = ((bmP->Type () == BM_TYPE_ALT) && bmP->Frames ()) ? w : bmP->Height (); if (nOrient == 0) { bmx = ((unsigned) X2I (u * w)) % w; bmy = ((unsigned) X2I (v * h)) % h; } else if (nOrient == 1) { bmx = ((unsigned) X2I ((I2X (1) - v) * w)) % w; bmy = ((unsigned) X2I (u * h)) % h; } else if (nOrient == 2) { bmx = ((unsigned) X2I ((I2X (1) - u) * w)) % w; bmy = ((unsigned) X2I ((I2X (1) - v) * h)) % h; } else { bmx = ((unsigned) X2I (v * w)) % w; bmy = ((unsigned) X2I ((I2X (1) - u) * h)) % h; } offs = bmy * w + bmx; if (bmP->Flags () & BM_FLAG_TGA) { ubyte *p; if (bmP->BPP () == 3) //no alpha -> no transparency return 0; p = bmP->Buffer () + offs * bmP->BPP (); // check super transparency color #if 1 if ((p [0] == 120) && (p [1] == 88) && (p [2] == 128)) #else if ((gameOpts->ogl.bGlTexMerge) ? (p [3] == 1) : ((p [0] == 120) && (p [1] == 88) && (p [2] == 128))) #endif return -1; // check alpha if (!p [3]) return 1; } else { c = bmP->Buffer () [offs]; if (c == SUPER_TRANSP_COLOR) return -1; if (c == TRANSPARENCY_COLOR) return 1; } return 0; }
void DoCountdownFrame (void) { fix oldTime; int fc, h, xScale; static fix cdtFrameTime; if (!gameData.reactor.bDestroyed) { cdtFrameTime = 0; return; } cdtFrameTime += gameData.time.xRealFrame; if (gameStates.limitFPS.bCountDown && !gameStates.app.tick40fps.bTick) return; if (!IS_D2_OEM && !IS_MAC_SHARE && !IS_SHAREWARE) { // get countdown in OEM and SHAREWARE only // On last level, we don't want a countdown. if ((gameData.missions.nCurrentMission == gameData.missions.nBuiltinMission) && (gameData.missions.nCurrentLevel == gameData.missions.nLastLevel)) { if (!IsMultiGame) return; if (gameData.app.nGameMode & GM_MULTI_ROBOTS) return; } } // Control center destroyed, rock the CPlayerData's ship. fc = gameData.reactor.countdown.nSecsLeft; if (fc > 16) fc = 16; // At Trainee, decrease rocking of ship by 4x. xScale = 1; if (gameStates.app.nDifficultyLevel == 0) xScale = 4; h = I2X (3) / 16 + (I2X (16 - fc)) / 32; gameData.objs.consoleP->mType.physInfo.rotVel [X] += (FixMul (d_rand () - 16384, h)) / xScale; gameData.objs.consoleP->mType.physInfo.rotVel [Z] += (FixMul (d_rand () - 16384, h)) / xScale; // Hook in the rumble sound effect here. oldTime = gameData.reactor.countdown.nTimer; if (!TimeStopped ()) gameData.reactor.countdown.nTimer -= cdtFrameTime; if (IsMultiGame && NetworkIAmMaster ()) MultiSendCountdown (); cdtFrameTime = 0; gameData.reactor.countdown.nSecsLeft = X2I (gameData.reactor.countdown.nTimer + I2X (7) / 8); if ((oldTime > COUNTDOWN_VOICE_TIME) && (gameData.reactor.countdown.nTimer <= COUNTDOWN_VOICE_TIME)) audio.PlaySound (SOUND_COUNTDOWN_13_SECS, SOUNDCLASS_GENERIC, I2X (3)); if (X2I (oldTime + I2X (7) / 8) != gameData.reactor.countdown.nSecsLeft) { if ((gameData.reactor.countdown.nSecsLeft >= 0) && (gameData.reactor.countdown.nSecsLeft < 10)) audio.PlaySound ((short) (SOUND_COUNTDOWN_0_SECS + gameData.reactor.countdown.nSecsLeft), SOUNDCLASS_GENERIC, I2X (3)); if (gameData.reactor.countdown.nSecsLeft == gameData.reactor.countdown.nTotalTime - 1) audio.PlaySound (SOUND_COUNTDOWN_29_SECS, SOUNDCLASS_GENERIC, I2X (3)); } if (gameData.reactor.countdown.nTimer > 0) { fix size = (I2X (gameData.reactor.countdown.nTotalTime) - gameData.reactor.countdown.nTimer) / F2X (0.65); fix oldSize = (I2X (gameData.reactor.countdown.nTotalTime) - oldTime) / F2X (0.65); if ((size != oldSize) && (gameData.reactor.countdown.nSecsLeft < gameData.reactor.countdown.nTotalTime - 5)) // Every 2 seconds! audio.PlaySound (SOUND_CONTROL_CENTER_WARNING_SIREN, SOUNDCLASS_GENERIC, I2X (3)); } else { int flashValue = X2I (-gameData.reactor.countdown.nTimer * (64 / 4)); // 4 seconds to total whiteness if (oldTime > 0) audio.PlaySound (SOUND_MINE_BLEW_UP); paletteManager.SetEffect (flashValue, flashValue, flashValue); if (paletteManager.BlueEffect () >= 64) { CCanvas::SetCurrent (NULL); CCanvas::Current ()->Clear (RGBA_PAL2 (31,31,31)); //make screen all white to match palette effect paletteManager.ResetEffect (); //restore palette for death message DoPlayerDead (); //kill_player (); } } }
void HandleTestKey(int key) { switch (key) { case KEYDBGGED + KEY_0: ShowWeaponStatus (); break; #ifdef SHOW_EXIT_PATH case KEYDBGGED + KEY_1: MarkPathToExit (); break; #endif case KEYDBGGED + KEY_Y: DoReactorDestroyedStuff(NULL); break; case KEYDBGGED + KEY_ALTED + KEY_D: networkData.nNetLifeKills=4000; networkData.nNetLifeKilled=5; MultiAddLifetimeKills (); break; case KEY_BACKSPACE: case KEY_CTRLED + KEY_BACKSPACE: case KEY_ALTED + KEY_BACKSPACE: case KEY_ALTED + KEY_CTRLED + KEY_BACKSPACE: case KEY_SHIFTED + KEY_BACKSPACE: case KEY_SHIFTED + KEY_ALTED + KEY_BACKSPACE: case KEY_SHIFTED + KEY_CTRLED + KEY_BACKSPACE: case KEY_SHIFTED + KEY_CTRLED + KEY_ALTED + KEY_BACKSPACE: Int3 (); break; case KEY_CTRLED + KEY_ALTED + KEY_ENTER: exit (0); break; case KEYDBGGED + KEY_S: audio.Reset (); break; case KEYDBGGED + KEY_P: if (gameStates.app.bGameSuspended & SUSP_ROBOTS) gameStates.app.bGameSuspended &= ~SUSP_ROBOTS; //robots move else gameStates.app.bGameSuspended |= SUSP_ROBOTS; //robots don't move break; case KEYDBGGED + KEY_K: LOCALPLAYER.shields = 1; MultiSendShields (); break; // a virtual kill case KEYDBGGED + KEY_SHIFTED + KEY_K: LOCALPLAYER.shields = -1; MultiSendShields (); break; // an actual kill case KEYDBGGED + KEY_X: LOCALPLAYER.lives++; break; // Extra life cheat key. case KEYDBGGED + KEY_H: // if (!(gameData.app.nGameMode & GM_MULTI)) { LOCALPLAYER.flags ^= PLAYER_FLAGS_CLOAKED; if (LOCALPLAYER.flags & PLAYER_FLAGS_CLOAKED) { if (gameData.app.nGameMode & GM_MULTI) MultiSendCloak (); AIDoCloakStuff (); LOCALPLAYER.cloakTime = gameData.time.xGame; #if TRACE console.printf (CON_DBG, "You are cloaked!\n"); #endif } else #if TRACE console.printf (CON_DBG, "You are DE-cloaked!\n"); #endif // } break; case KEYDBGGED + KEY_R: gameStates.app.cheats.bRobotsFiring = !gameStates.app.cheats.bRobotsFiring; break; case KEYDBGGED + KEY_R + KEY_SHIFTED: KillAllRobots (1); break; //flythrough keys #if DBG case KEYDBGGED + KEY_LAPOSTRO: showViewTextTimer = 0x30000; ObjectGotoNextViewer (); break; case KEYDBGGED + KEY_CTRLED + KEY_LAPOSTRO: showViewTextTimer = 0x30000; ObjectGotoPrevViewer (); break; #endif case KEYDBGGED + KEY_SHIFTED + KEY_LAPOSTRO: gameData.objs.viewerP=gameData.objs.consoleP; break; #if DBG case KEYDBGGED + KEY_O: ToggleOutlineMode (); break; #endif case KEYDBGGED + KEY_T: *Toggle_var = !*Toggle_var; #if TRACE console.printf (CON_DBG, "Variable at %08x set to %i\n", Toggle_var, *Toggle_var); #endif break; case KEYDBGGED + KEY_L: if (++gameStates.render.nLighting >= 2) gameStates.render.nLighting = 0; break; case KEYDBGGED + KEY_SHIFTED + KEY_L: xBeamBrightness = 0x38000 - xBeamBrightness; break; case KEY_PAD5: slew_stop (); break; case KEYDBGGED + KEY_F4: { //tCollisionData hitData; //CFixVector p0 = {-0x1d99a7, -0x1b20000, 0x186ab7f}; //CFixVector p1 = {-0x217865, -0x1b20000, 0x187de3e}; //FindHitpoint(&hitData, &p0, 0x1b9, &p1, 0x40000, 0x0, NULL, -1); break; } case KEYDBGGED + KEY_M: gameStates.app.bDebugSpew = !gameStates.app.bDebugSpew; if (gameStates.app.bDebugSpew) { mopen(0, 8, 1, 78, 16, "Debug Spew"); HUDInitMessage("Debug Spew: ON"); } else { mclose(0); HUDInitMessage("Debug Spew: OFF"); } break; case KEYDBGGED + KEY_C: paletteManager.SaveEffectAndReset (); DoCheatMenu (); paletteManager.LoadEffect (); break; case KEYDBGGED + KEY_SHIFTED + KEY_A: DoMegaWowPowerup(10); break; case KEYDBGGED + KEY_A: { DoMegaWowPowerup(200); // if (gameData.app.nGameMode & GM_MULTI) { // MsgBox(NULL, 1, "Damn", "CHEATER!\nYou cannot use the\nmega-thing in network mode."); // gameData.multigame.msg.nReceiver = 100; // Send to everyone... // sprintf(gameData.multigame.msg.szMsg, "%s cheated!", LOCALPLAYER.callsign); // } else { // DoMegaWowPowerup (); // } break; } case KEYDBGGED + KEY_F: gameStates.render.bShowFrameRate = !gameStates.render.bShowFrameRate; break; case KEYDBGGED + KEY_SPACEBAR: //KEY_F7: // Toggle physics flying slew_stop (); GameFlushInputs (); if (gameData.objs.consoleP->info.controlType != CT_FLYING) { FlyInit(gameData.objs.consoleP); gameStates.app.bGameSuspended &= ~SUSP_ROBOTS; //robots move } else { slew_init(gameData.objs.consoleP); //start CPlayerData slewing gameStates.app.bGameSuspended |= SUSP_ROBOTS; //robots don't move } break; case KEYDBGGED + KEY_COMMA: gameStates.render.xZoom = FixMul(gameStates.render.xZoom, 62259); break; case KEYDBGGED + KEY_PERIOD: gameStates.render.xZoom = FixMul(gameStates.render.xZoom, 68985); break; case KEYDBGGED + KEY_P + KEY_SHIFTED: Debug_pause = 1; break; case KEYDBGGED + KEY_B: { CMenu m (1); char text [FILENAME_LEN] = ""; int item; m.AddInput (text, FILENAME_LEN); item = m.Menu (NULL, "Briefing to play?"); if (item != -1) briefing.Run (text, 1); break; } case KEYDBGGED + KEY_F5: ToggleMovieSaving (); break; case KEYDBGGED + KEY_SHIFTED + KEY_F5: { extern int Movie_fixed_frametime; Movie_fixed_frametime = !Movie_fixed_frametime; break; } case KEYDBGGED + KEY_ALTED + KEY_F5: gameData.time.xGame = I2X(0x7fff - 840); //will overflow in 14 minutes #if TRACE console.printf (CON_DBG, "gameData.time.xGame bashed to %d secs\n", X2I(gameData.time.xGame)); #endif break; case KEYDBGGED + KEY_SHIFTED + KEY_B: KillEverything (1); break; } }
int CTrigger::DoShowMessage (void) { ShowGameMessage (gameData.messages, X2I (m_info.value), m_info.time); return 1; }
CObject* CreateExplosion (CObject* parentP, short nSegment, CFixVector& vPos, fix xSize, ubyte nVClip, fix xMaxDamage, fix xMaxDistance, fix xMaxForce, short nParent) { short nObject; CObject *explObjP, *objP; fix dist, force, damage; CFixVector vHit, vForce; int nType, id; int flash = parentP ? static_cast<int> (gameData.weapons.info [parentP->info.nId].flash) : 0; nObject = CreateFireball (nVClip, nSegment, vPos, xSize, RT_FIREBALL); if (nObject < 0) { #if TRACE console.printf (1, "Can'nType create CObject in /*Object*/CreateExplosionSub.\n"); #endif return NULL; } explObjP = OBJECTS + nObject; //now set explosion-specific data explObjP->info.xLifeLeft = gameData.eff.vClips [0][nVClip].xTotalTime; explObjP->cType.explInfo.nSpawnTime = -1; explObjP->cType.explInfo.nDeleteObj = -1; explObjP->cType.explInfo.nDeleteTime = -1; if (xMaxDamage <= 0) return explObjP; // -- now legal for xBadAss explosions on a CWall. Assert (this != NULL); FORALL_OBJS (objP, i) { nType = objP->info.nType; id = objP->info.nId; // Weapons used to be affected by xBadAss explosions, but this introduces serious problems. // When a smart bomb blows up, if one of its children goes right towards a nearby CWall, it will // blow up, blowing up all the children. So I remove it. MK, 09/11/94 if (objP == parentP) continue; if (objP->info.nFlags & OF_SHOULD_BE_DEAD) continue; if (nType == OBJ_WEAPON) { if (!WeaponIsMine (objP->info.nId)) continue; } else if (nType == OBJ_ROBOT) { if (nParent < 0) continue; if ((OBJECTS [nParent].info.nType == OBJ_ROBOT) && (OBJECTS [nParent].info.nId == id)) continue; } else if ((nType != OBJ_REACTOR) && (nType != OBJ_PLAYER)) continue; dist = CFixVector::Dist (objP->info.position.vPos, explObjP->info.position.vPos); // Make damage be from 'xMaxDamage' to 0.0, where 0.0 is 'xMaxDistance' away; if (dist >= xMaxDistance) continue; if (!ObjectToObjectVisibility (explObjP, objP, FQ_TRANSWALL)) continue; damage = xMaxDamage - FixMulDiv (dist, xMaxDamage, xMaxDistance); force = xMaxForce - FixMulDiv (dist, xMaxForce, xMaxDistance); // Find the force vector on the CObject CFixVector::NormalizedDir(vForce, objP->info.position.vPos, explObjP->info.position.vPos); vForce *= force; // Find where the point of impact is... (vHit) vHit = explObjP->info.position.vPos - objP->info.position.vPos; vHit *= (FixDiv (objP->info.xSize, objP->info.xSize + dist)); if (nType == OBJ_WEAPON) { objP->ApplyForce (vForce); if (WeaponIsMine (objP->info.nId) && (FixMul (dist, force) > I2X (8000))) { //prox bombs have chance of blowing up objP->Die (); objP->ExplodeBadassWeapon (objP->info.position.vPos); } } else if (nType == OBJ_ROBOT) { CFixVector vNegForce; fix xScale = -2 * (7 - gameStates.app.nDifficultyLevel) / 8; objP->ApplyForce (vForce); // If not a boss, stun for 2 seconds at 32 force, 1 second at 16 force if (flash && !ROBOTINFO (objP->info.nId).bossFlag) { tAIStaticInfo *aip = &objP->cType.aiInfo; int nForce = X2I (FixDiv (vForce.Mag () * flash, gameData.time.xFrame) / 128) + 2; if (explObjP->cType.aiInfo.SKIP_AI_COUNT * gameData.time.xFrame >= I2X (1)) aip->SKIP_AI_COUNT--; else { aip->SKIP_AI_COUNT += nForce; objP->mType.physInfo.rotThrust [X] = ((d_rand () - 16384) * nForce) / 16; objP->mType.physInfo.rotThrust [Y] = ((d_rand () - 16384) * nForce) / 16; objP->mType.physInfo.rotThrust [Z] = ((d_rand () - 16384) * nForce) / 16; objP->mType.physInfo.flags |= PF_USES_THRUST; } } vNegForce [X] = vForce [X] * xScale; vNegForce [Y] = vForce [Y] * xScale; vNegForce [Z] = vForce [Z] * xScale; objP->ApplyRotForce (vNegForce); if (objP->info.xShields >= 0) { if (ROBOTINFO (objP->info.nId).bossFlag && bossProps [gameStates.app.bD1Mission][ROBOTINFO (objP->info.nId).bossFlag - BOSS_D2].bInvulKinetic) damage /= 4; if (objP->ApplyDamageToRobot (damage, nParent)) { if (!gameStates.gameplay.bNoBotAI && parentP && (nParent == LOCALPLAYER.nObject)) cockpit->AddPointsToScore (ROBOTINFO (objP->info.nId).scoreValue); } } if (!flash && ROBOTINFO (objP->info.nId).companion) BuddyOuchMessage (damage); } else if (nType == OBJ_REACTOR) { if (objP->info.xShields >= 0) objP->ApplyDamageToReactor (damage, nParent); } else if (nType == OBJ_PLAYER) { CObject* killerP = NULL; CFixVector vRotForce; // Hack!Warning!Test code! if (flash && (objP->info.nId == gameData.multiplayer.nLocalPlayer)) { int fe = min (I2X (4), force * flash / 32); // For four seconds or less if (parentP->cType.laserInfo.parent.nSignature == gameData.objs.consoleP->info.nSignature) { fe /= 2; force /= 2; } if (force > I2X (1)) { paletteManager.SetFlashDuration (fe); force = PK1 + X2I (PK2 * force); paletteManager.BumpEffect (force, force, force); #if TRACE console.printf (CON_DBG, "force = %7.3f, adding %i\n", X2F (force), PK1 + X2I (PK2*force)); #endif } } if (parentP && IsMultiGame && (parentP->info.nType == OBJ_PLAYER)) killerP = parentP; vRotForce = vForce; if (nParent > -1) { killerP = OBJECTS + nParent; if (killerP != gameData.objs.consoleP) // if someone else whacks you, cut force by 2x vRotForce [X] /= 2; vRotForce [Y] /= 2; vRotForce [Z] /= 2; } vRotForce [X] /= 2; vRotForce [Y] /= 2; vRotForce [Z] /= 2; objP->ApplyForce (vForce); objP->ApplyRotForce (vRotForce); if (gameStates.app.nDifficultyLevel == 0) damage /= 4; if (objP->info.xShields >= 0) objP->ApplyDamageToPlayer (killerP, damage); } }
//Process selected keys until game unpaused. returns key that left pause (p or esc) int DoGamePause (void) { int key = 0; int bScreenChanged; char msg [1000]; char totalTime [9], xLevelTime [9]; if (gameData.app.bGamePaused) { //unpause! gameData.app.bGamePaused = 0; gameStates.app.bEnterGame = 1; #if defined (TACTILE) if (TactileStick) EnableForces(); #endif return KEY_PAUSE; } if (gameData.app.nGameMode & GM_NETWORK) { DoShowNetgameHelp(); return (KEY_PAUSE); } else if (gameData.app.nGameMode & GM_MULTI) { HUDInitMessage (TXT_MODEM_PAUSE); return (KEY_PAUSE); } PauseGame (); SetPopupScreenMode (); paletteManager.LoadEffect (); formatTime (totalTime, X2I (LOCALPLAYER.timeTotal) + LOCALPLAYER.hoursTotal * 3600); formatTime (xLevelTime, X2I (LOCALPLAYER.timeLevel) + LOCALPLAYER.hoursLevel * 3600); if (gameData.demo.nState!=ND_STATE_PLAYBACK) sprintf (msg, TXT_PAUSE_MSG1, GAMETEXT (332 + gameStates.app.nDifficultyLevel), LOCALPLAYER.hostages.nOnBoard, xLevelTime, totalTime); else sprintf (msg, TXT_PAUSE_MSG2, GAMETEXT (332 + gameStates.app.nDifficultyLevel), LOCALPLAYER.hostages.nOnBoard); if (!gameOpts->menus.nStyle) { gameStates.menus.nInMenu++; GameRenderFrame (); gameStates.menus.nInMenu--; } messageBox.Show (pszPauseMsg = msg, false); GrabMouse (0, 0); while (gameData.app.bGamePaused) { if (!(gameOpts->menus.nStyle && gameStates.app.bGameRunning)) key = KeyGetChar(); else { gameStates.menus.nInMenu++; while (!(key = KeyInKey ())) { GameRenderFrame (); paletteManager.LoadEffect (NULL); messageBox.Render (); G3_SLEEP (1); } gameStates.menus.nInMenu--; } #if DBG HandleTestKey(key); #endif bScreenChanged = HandleSystemKey (key); HandleVRKey (key); if (bScreenChanged) { GameRenderFrame (); messageBox.Render (); #if 0 show_extraViews (); if ((gameStates.render.cockpit.nType == CM_FULL_COCKPIT) || (gameStates.render.cockpit.nType == CM_STATUS_BAR)) RenderGauges(); #endif } } GrabMouse (1, 0); messageBox.Clear (); ResumeGame (); return key; }