void Interface::ShowMessage( Fixed longitude, Fixed latitude, int teamId, char *msg, bool showLarge ) { WorldMessage *themsg = new WorldMessage(); themsg->m_longitude = longitude; themsg->m_latitude = latitude; themsg->m_teamId = teamId; themsg->SetMessage( msg ); m_messages.PutDataAtStart( themsg ); int maxMessages = (g_windowManager->WindowH() / 4.0f) / (g_windowManager->WindowW() / 80.0f); while( m_messages.ValidIndex(maxMessages) ) { WorldMessage *thisMsg = m_messages[maxMessages]; m_messages.RemoveData(maxMessages); delete thisMsg; } if( showLarge ) { if( m_message ) delete m_message; m_message = strdup( msg ); m_messageTimer = GetHighResTime(); } }
bool City::NuclearStrike( int causedBy, Fixed intensity, Fixed range, bool directHitPossible ) { if( range <= intensity/50 ) { Fixed intensityEffect = (intensity/100) / 2; Fixed rangeEffect = 1 - range / (intensity/50); int deaths = ( m_population * intensityEffect * rangeEffect ).IntValue(); m_dead += deaths; m_population -= deaths; m_numStrikes ++; Team *owner = g_app->GetWorld()->GetTeam(m_teamId); Team *guilty = g_app->GetWorld()->GetTeam(causedBy); bool trackedStat = false; if( causedBy == g_app->GetWorld()->m_myTeamId || m_teamId == g_app->GetWorld()->m_myTeamId ) { // We shot this nuke, or it was shot at us, so record the deaths trackedStat = true; } if( owner ) owner->m_friendlyDeaths += deaths; if( !owner && guilty ) guilty->m_collatoralDamage += deaths; if( guilty ) { if( g_app->GetWorld()->IsFriend(m_teamId,causedBy) ) { guilty->m_collatoralDamage += deaths; } else { guilty->m_enemyKills += deaths; } } bool directHit = false; char caption[256]; if( rangeEffect >= Fixed::Hundredths(75) && directHitPossible ) { if( deaths > 1000000 ) { bool messageFound = false; for( int i = 0; i < g_app->GetWorld()->m_messages.Size(); ++i ) { WorldMessage *wm = g_app->GetWorld()->m_messages[i]; if( wm->m_messageType == WorldMessage::TypeDirectHit && wm->m_longitude == m_longitude && wm->m_latitude == m_latitude ) { char dead[16]; sprintf( dead, "%.1f", (deaths + wm->m_deaths) / 1000000.0f ); sprintf( caption, "%s", LANGUAGEPHRASE("message_directhit") ); LPREPLACESTRINGFLAG( 'D', dead, caption ); LPREPLACESTRINGFLAG( 'C', LANGUAGEPHRASEADDITIONAL(m_name), caption ); wm->SetMessage( caption ); wm->m_deaths += deaths; wm->m_renderFull = true; wm->m_timer += 5; if( wm->m_timer > 15 ) { wm->m_timer = 15; } messageFound = true; break; } } if( !messageFound ) { char dead[16]; sprintf( dead, "%.1f", deaths / 1000000.0f ); sprintf( caption, "%s", LANGUAGEPHRASE("message_directhit") ); LPREPLACESTRINGFLAG( 'D', dead, caption ); LPREPLACESTRINGFLAG( 'C', LANGUAGEPHRASEADDITIONAL(m_name), caption ); g_app->GetWorld()->AddWorldMessage( m_longitude, m_latitude, m_teamId, caption, WorldMessage::TypeDirectHit ); g_app->GetWorld()->m_messages[ g_app->GetWorld()->m_messages.Size() -1 ]->m_deaths = deaths; } } directHit = true; } if( !directHit && deaths > 1000000 ) { char dead[16]; sprintf( dead, "%.1f", deaths / 1000000.0f ); sprintf( caption, "%s", LANGUAGEPHRASE("message_fallout") ); LPREPLACESTRINGFLAG( 'D', dead, caption ); LPREPLACESTRINGFLAG( 'C', LANGUAGEPHRASEADDITIONAL(m_name), caption ); g_app->GetInterface()->ShowMessage( m_longitude, m_latitude, m_teamId, caption ); } return directHit; } return false; }