BOOLEAN AnyUsableRealMercenariesOnTeam( void ) { SOLDIERTYPE *pSoldier = NULL; INT32 iCounter = 0, iNumberOnTeam = 0; // this is for speed, this runs once/frame iNumberOnTeam = gTacticalStatus.Team[ OUR_TEAM ].bLastID; // get number of mercs on team who are not vehicles or robot, POWs or EPCs for( iCounter = 0; iCounter < iNumberOnTeam; iCounter++ ) { pSoldier = &Menptr[ iCounter ]; if( ( pSoldier->bActive ) && ( pSoldier->bLife > 0 ) && !( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) && !AM_A_ROBOT( pSoldier ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) && ( pSoldier->ubWhatKindOfMercAmI != MERC_TYPE__EPC ) ) { return( TRUE ); } } return( FALSE ); }
void HandleTacticalEndTurn( ) { UINT32 cnt; SOLDIERTYPE *pSoldier; UINT32 uiTime; static UINT32 uiTimeSinceLastStrategicUpdate = 0; // OK, Do a number of things here.... // Every few turns...... SetFastForwardMode(FALSE); // Cancel FF at end of battle SetClockSpeedPercent(gGameExternalOptions.fClockSpeedPercent); // sevenfm: set default clock speed // Get time elasped uiTime = GetWorldTotalSeconds( ); if ( ( uiTimeSinceLastStrategicUpdate - uiTime ) > 1200 ) { HandleRottingCorpses( ); //DecayTacticalMoraleModifiers(); uiTimeSinceLastStrategicUpdate = uiTime; } DecayBombTimers( ); DecaySmokeEffects( uiTime ); DecayLightEffects( uiTime ); // Decay smells //DecaySmells(); // Decay blood DecayBloodAndSmells( uiTime ); // decay AI warning values from corpses DecayRottingCorpseAIWarnings(); if(gGameExternalOptions.gfAllowReinforcements)//dnl ch68 100913 { ((gTacticalStatus.Team[ENEMY_TEAM].bTeamActive || gTacticalStatus.Team[MILITIA_TEAM].bTeamActive) ? (guiTurnCnt++) : (guiTurnCnt = 0)); //Check for enemy pooling (add enemies if there happens to be more than the max in the //current battle. If one or more slots have freed up, we can add them now. AddPossiblePendingEnemiesToBattle(); AddPossiblePendingMilitiaToBattle(); } // Loop through each active team and decay public opplist... // May want this done every few times too NonCombatDecayPublicOpplist( uiTime ); /* for( cnt = 0; cnt < MAXTEAMS; cnt++ ) { if ( gTacticalStatus.Team[ cnt ].bMenInSector > 0 ) { // decay team's public opplist DecayPublicOpplist( (INT8)cnt ); } } */ // First pass: // Loop through our own mercs: // Check things like ( even if not in our sector ) // 1 ) All updates of breath, shock, bleeding, etc // 2 ) Updating First AID, etc // ( If in our sector: ) // 3 ) Update things like decayed opplist, etc // Second pass: // Loop through all mercs in tactical engine // If not a player merc ( ubTeam ) , do things like 1 , 2 , 3 above // First exit if we are not in realtime combat or realtime noncombat if (!(gTacticalStatus.uiFlags & TURNBASED) || !(gTacticalStatus.uiFlags & INCOMBAT ) ) { BeginLoggingForBleedMeToos( TRUE ); cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pSoldier++) { if ( pSoldier->bActive && pSoldier->stats.bLife > 0 && !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !( AM_A_ROBOT( pSoldier ) ) ) { // Handle everything from getting breath back, to bleeding, etc pSoldier->EVENT_BeginMercTurn( TRUE, 0 ); // Handle Player services HandlePlayerServices( pSoldier ); // if time is up, turn off xray if ( pSoldier->uiXRayActivatedTime && uiTime > pSoldier->uiXRayActivatedTime + XRAY_TIME ) { TurnOffXRayEffects( pSoldier ); } // Handle stat changes if ness. //if ( fCheckStats ) //{ //// UpdateStats( pSoldier ); //} // Flugente: update multi-turn actions pSoldier->UpdateMultiTurnAction(); } } BeginLoggingForBleedMeToos( FALSE ); // OK, loop through the mercs to perform 'end turn' events on each... // We're looping through only mercs in tactical engine, ignoring our mercs // because they were done earilier... for ( cnt = 0; cnt < guiNumMercSlots; cnt++ ) { pSoldier = MercSlots[ cnt ]; if ( pSoldier != NULL ) { if ( pSoldier->bTeam != gbPlayerNum ) { // Handle everything from getting breath back, to bleeding, etc pSoldier->EVENT_BeginMercTurn( TRUE, 0 ); // Handle Player services HandlePlayerServices( pSoldier ); } } } } #ifdef JA2UB // HandleRPCDescription( ); #else HandleRPCDescription( ); #endif // Flugente: Cool down/decay all items not in a soldier's inventory CoolDownWorldItems(); #ifdef ENABLE_ZOMBIES // Flugente: raise zombies if in gamescreen and option set if ( guiCurrentScreen == GAME_SCREEN ) { RaiseZombies(); } #endif }
void StrategicHandlePlayerTeamMercDeath( SOLDIERTYPE *pSoldier ) { SOLDIERTYPE *pKiller = NULL; INT16 sSectorX, sSectorY; //if the soldier HAS a profile if( pSoldier->ubProfile != NO_PROFILE ) { //add to the history log the fact that the merc died and the circumstances if( pSoldier->ubAttackerID != NOBODY ) { pKiller = MercPtrs[ pSoldier->ubAttackerID ]; } // CJC Nov 11, 2002 // Use the soldier's sector location unless impossible if (pSoldier->sSectorX != 0 && pSoldier->sSectorY != 0) { sSectorX = pSoldier->sSectorX; sSectorY = pSoldier->sSectorY; } else { sSectorX = gWorldSectorX; sSectorY = gWorldSectorY; } if( pKiller && pKiller->bTeam == OUR_TEAM ) { AddHistoryToPlayersLog( HISTORY_MERC_KILLED_CHARACTER, pSoldier->ubProfile, GetWorldTotalMin(), sSectorX, sSectorY ); } else { AddHistoryToPlayersLog( HISTORY_MERC_KILLED, pSoldier->ubProfile, GetWorldTotalMin(), sSectorX, sSectorY ); } } if ( guiCurrentScreen != GAME_SCREEN ) { ScreenMsg( FONT_RED, MSG_INTERFACE, pMercDeadString[ 0 ], pSoldier->name ); } // robot and EPCs don't count against death rate - the mercs back home don't particularly give a damn about locals & machines! if ( !AM_AN_EPC( pSoldier ) && !AM_A_ROBOT( pSoldier ) ) { // keep track of how many mercs have died under player's command (for death rate, can't wait until removed from team) gStrategicStatus.ubMercDeaths++; } pSoldier->uiStatusFlags |= SOLDIER_DEAD; // Set breath to 0! pSoldier->bBreathMax = pSoldier->bBreath = 0; // not asleep, DEAD! pSoldier->fMercAsleep = FALSE; //if the merc had life insurance if( pSoldier->usLifeInsurance ) { // if he didn't die during auto-resolve if( guiCurrentScreen != AUTORESOLVE_SCREEN ) { // check whether this was obviously a suspicious death // if killed within an hour of being insured if ( pSoldier->uiStartTimeOfInsuranceContract <= GetWorldTotalMin() && GetWorldTotalMin() - pSoldier->uiStartTimeOfInsuranceContract < 60 ) { gMercProfiles[ pSoldier->ubProfile ].ubSuspiciousDeath = VERY_SUSPICIOUS_DEATH; } // if killed by someone on our team, or while there weren't any opponents around else if (Menptr[ pSoldier->ubAttackerID ].bTeam == OUR_TEAM || !gTacticalStatus.fEnemyInSector ) { // cause insurance company to suspect fraud and investigate this claim gMercProfiles[ pSoldier->ubProfile ].ubSuspiciousDeath = SUSPICIOUS_DEATH; } } AddLifeInsurancePayout( pSoldier ); } // robot and EPCs don't penalize morale - merc don't care about fighting machines and the lives of locals much if ( !AM_AN_EPC( pSoldier ) && !AM_A_ROBOT( pSoldier ) ) { // Change morale of others based on this HandleMoraleEvent( pSoldier, MORALE_TEAMMATE_DIED, pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); } //if its a MERC merc, record the time of his death if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) { pSoldier->iEndofContractTime = GetWorldTotalMin(); //set is so Speck can say that a merc is dead LaptopSaveInfo.ubSpeckCanSayPlayersLostQuote = 1; } //Set the fact that the merc is DEAD!! gMercProfiles[ pSoldier->ubProfile ].bMercStatus = MERC_IS_DEAD; if( pSoldier->bAssignment != ASSIGNMENT_DEAD ) { SetTimeOfAssignmentChangeForMerc( pSoldier ); } // handle strategic level death HandleStrategicDeath( pSoldier ); }