/*------------------------------------------------------------------------- * CaptureStation *------------------------------------------------------------------------- * Purpose: * Handle a station being captured by a ship */ void CFSShip::CaptureStation(IstationIGC * pstation) { { //Fudge the hitpoints of the station //All those guns inside damage the hull pstation->SetFraction(pstation->GetFraction() * 0.5f); //But the heroic engineer's get the shields up. pstation->SetShieldFraction(0.8f); //pstation->GetShieldFraction() + 0.5f); } { GetPlayerScoreObject()->CaptureBase(true); for (ShipLinkIGC* psl = GetIGCShip()->GetChildShips()->first(); (psl != NULL); psl = psl->next()) { CFSShip* ps = (CFSShip*)(psl->data()->GetPrivateData()); ps->GetPlayerScoreObject()->CaptureBase(false); } } IsideIGC * pside = GetSide(); pside->AddBaseCapture(); SideID iSide = pside->GetObjectID(); IsideIGC* psideOld = pstation->GetSide(); StationID stationID = pstation->GetObjectID(); BEGIN_PFM_CREATE(g.fm, pfmStationCapture, S, STATION_CAPTURE) END_PFM_CREATE pfmStationCapture->stationID = stationID; pfmStationCapture->sidOld = psideOld->GetObjectID(); pfmStationCapture->sidNew = iSide; pfmStationCapture->shipIDCredit = GetIGCShip()->GetObjectID(); g.fm.SendMessages(GetMission()->GetGroupRealSides(), FM_GUARANTEED, FM_FLUSH); pstation->SetSide(pside); // TE: Fire AGCEvent when base is captured CFSMission * pfsMission = this->GetMission(); LPCSTR pszContext = pfsMission->GetIGCMission() ? pfsMission->GetIGCMission()->GetContextName() : NULL; _AGCModule.TriggerContextEvent(NULL, EventID_StationChangesSides, pszContext, GetName(), GetShipID(), pside->GetUniqueID(), -1, 4, "GameID" , VT_I4 , pfsMission->GetMissionID(), "OldTeam" , VT_I4 , psideOld->GetUniqueID(), "OldTeamName", VT_LPSTR, psideOld->GetName(), "StationName", VT_LPSTR, pstation->GetName()); // TE end // yp: Add event for players who were involved in the capture of an enemy base. // mmf commented this out for now pending additional testing #if 0 ZString pszPlayerList = ""; // this creates a new ZString object and set its value to "", it's not a pointer to "" if(m_pfsMission->GetIGCMission() && m_pfsMission->GetIGCMission()->GetShips()) { ShipLinkIGC * pShiplink = m_pfsMission->GetIGCMission()->GetShips()->first(); while (pShiplink) { CFSShip * pfsShip = (CFSShip *) pShiplink->data()->GetPrivateData(); if (pfsShip && pfsShip->IsPlayer()) { // this logic might need to be tweeked to include the ship that did the capture if its if(pfsShip->GetSide() && pfsShip->GetSide()->GetObjectID() == iSide && // if they are on the side that did the Capture. and.. pfsShip->GetPlayer()->GetIGCShip()->GetObjectID() == GetIGCShip()->GetObjectID() || // they are the ship that did the caputure. or pfsShip->GetCluster() && pstation->GetCluster() && pfsShip->GetCluster()->GetObjectID() == pstation->GetCluster()->GetObjectID()) // they are in this sector { pszPlayerList = pszPlayerList + ";" + ZString(pfsShip->GetPlayer()->GetName()); // players name // The distance the player is from the station that was destroyed. if(pfsShip->GetPlayer()->GetIGCShip() ) { pszPlayerList = pszPlayerList + ":" + ZString( (pstation->GetPosition() - pfsShip->GetPlayer()->GetIGCShip()->GetPosition()).Length()); // the distance } } } pShiplink = pShiplink->next(); } } // Fire AGCEvent listing players in the sector // TODO: Might want to add into the event weither or not this was a VICTORY capture.. should we track that as well? _AGCModule.TriggerContextEvent(NULL, EventID_StationChangesSides, pszContext, GetName(), GetShipID(), pside->GetUniqueID(), -1, 4, "GameID" , VT_I4 , pfsMission->GetMissionID(), "OldTeam" , VT_I4 , psideOld->GetUniqueID(), "OldTeamName", VT_LPSTR, psideOld->GetName(), "zPlayerList", VT_LPSTR, pszPlayerList); // pszPlayerList should look like ";player@squad:1500;player2@squad:500" // yp:end #endif //Possibly the built themselves to a victory IsideIGC* psideWin = m_pfsMission->CheckForVictoryByStationCapture(pside, psideOld); if (psideWin) { static char szReason[100]; //Make this static so we only need to keep a pointer to it around sprintf(szReason, "%s won because %s captured %s", psideWin->GetName(), GetIGCShip()->GetName(), pstation->GetName()); m_pfsMission->GameOver(psideWin, szReason); } else if (psideOld->GetActiveF()) //RESET OUR EYE HERE? IMAGO CAPTURE EYE BUG FIX? REVIEW 7/23/09 m_pfsMission->VacateStation(pstation); }