SOLDIERTYPE *ChangeSoldierTeam( SOLDIERTYPE *pSoldier, UINT8 ubTeam ) { UINT8 ubID; SOLDIERTYPE *pNewSoldier = NULL; SOLDIERCREATE_STRUCT MercCreateStruct; UINT32 cnt; INT16 sOldGridNo; UINT8 ubOldID; UINT32 uiOldUniqueId; UINT32 uiSlot; SOLDIERTYPE *pGroupMember; if (gfInTalkPanel) { DeleteTalkingMenu(); } // Save merc id for this guy... ubID = pSoldier->ubID; ubOldID = ubID; uiOldUniqueId = pSoldier->uiUniqueSoldierIdValue; sOldGridNo = pSoldier->sGridNo; // Remove him from the game! InternalTacticalRemoveSoldier( ubID, FALSE ); // Create a new one! memset( &MercCreateStruct, 0, sizeof( MercCreateStruct ) ); MercCreateStruct.bTeam = ubTeam; MercCreateStruct.ubProfile = pSoldier->ubProfile; MercCreateStruct.bBodyType = pSoldier->ubBodyType; MercCreateStruct.sSectorX = pSoldier->sSectorX; MercCreateStruct.sSectorY = pSoldier->sSectorY; MercCreateStruct.bSectorZ = pSoldier->bSectorZ; MercCreateStruct.sInsertionGridNo = pSoldier->sGridNo; MercCreateStruct.bDirection = pSoldier->bDirection; if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) { MercCreateStruct.ubProfile = NO_PROFILE; MercCreateStruct.fUseGivenVehicle = TRUE; MercCreateStruct.bUseGivenVehicleID = pSoldier->bVehicleID; } if ( ubTeam == gbPlayerNum ) { MercCreateStruct.fPlayerMerc = TRUE; } if ( TacticalCreateSoldier( &MercCreateStruct, &ubID ) ) { pNewSoldier = MercPtrs[ ubID ]; // Copy vital stats back! pNewSoldier->bLife = pSoldier->bLife; pNewSoldier->bLifeMax = pSoldier->bLifeMax; pNewSoldier->bAgility = pSoldier->bAgility; pNewSoldier->bLeadership = pSoldier->bLeadership; pNewSoldier->bDexterity = pSoldier->bDexterity; pNewSoldier->bStrength = pSoldier->bStrength; pNewSoldier->bWisdom = pSoldier->bWisdom; pNewSoldier->bExpLevel = pSoldier->bExpLevel; pNewSoldier->bMarksmanship = pSoldier->bMarksmanship; pNewSoldier->bMedical = pSoldier->bMedical; pNewSoldier->bMechanical = pSoldier->bMechanical; pNewSoldier->bExplosive = pSoldier->bExplosive; pNewSoldier->bScientific = pSoldier->bScientific; pNewSoldier->bLastRenderVisibleValue = pSoldier->bLastRenderVisibleValue; pNewSoldier->bVisible = pSoldier->bVisible; if ( ubTeam == gbPlayerNum ) { pNewSoldier->bVisible = 1; } // Copy over any items.... for ( cnt = 0; cnt < NUM_INV_SLOTS; cnt++ ) { pNewSoldier->inv[ cnt ] = pSoldier->inv[ cnt ]; } // OK, loop through all active merc slots, change // Change ANY attacker's target if they were once on this guy..... for ( uiSlot = 0; uiSlot < guiNumMercSlots; uiSlot++ ) { pGroupMember = MercSlots[ uiSlot ]; if ( pGroupMember != NULL ) { if ( pGroupMember->ubTargetID == pSoldier->ubID ) { pGroupMember->ubTargetID = pNewSoldier->ubID; } } } // Set insertion gridNo pNewSoldier->sInsertionGridNo = sOldGridNo; if ( gfPotentialTeamChangeDuringDeath ) { HandleCheckForDeathCommonCode( pSoldier ); } if ( gfWorldLoaded && pSoldier->bInSector //pSoldier->sSectorX == gWorldSectorX && pSoldier->sSectorY == gWorldSectorY && pSoldier->bSectorZ == gbWorldSectorZ ) { AddSoldierToSectorNoCalculateDirectionUseAnimation( ubID, pSoldier->usAnimState, pSoldier->usAniCode ); HandleSight(pNewSoldier, SIGHT_LOOK | SIGHT_RADIO); } // fix up the event queue... // ChangeSoldierIDInQueuedEvents( ubOldID, uiOldUniqueId, pNewSoldier->ubID, pNewSoldier->uiUniqueSoldierIdValue ); if ( pNewSoldier->ubProfile != NO_PROFILE ) { if ( ubTeam == gbPlayerNum ) { gMercProfiles[ pNewSoldier->ubProfile ].ubMiscFlags |= PROFILE_MISC_FLAG_RECRUITED; } else { gMercProfiles[ pNewSoldier->ubProfile ].ubMiscFlags &= (~PROFILE_MISC_FLAG_RECRUITED); } } } // AT the low level check if this poor guy is in inv panel, else // remove.... if ( gsCurInterfacePanel == SM_PANEL && gpSMCurrentMerc == pSoldier ) { // Switch.... SetCurrentInterfacePanel( TEAM_PANEL ); } return( pNewSoldier ); }
void ExitBoxing( void ) { //DBrot: More Rooms //UINT8 ubRoom; UINT16 usRoom; SOLDIERTYPE* pSoldier; UINT32 uiLoop; UINT8 ubPass; // find boxers and turn them neutral again // first time through loop, look for AI guy, then for PC guy.... for stupid // oppcnt/alert status reasons for( ubPass = 0; ubPass < 2; ++ubPass ) { // because boxer could die, loop through all soldier ptrs for ( uiLoop = 0; uiLoop < gTacticalStatus.Team[ CIV_TEAM ].bLastID; ++uiLoop ) { pSoldier = MercPtrs[ uiLoop ]; if ( pSoldier != NULL ) { if ( ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) && InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING ) { if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC ) { if ( ubPass == 0 ) // pass 0, only handle AI { continue; } // put guy under AI control temporarily pSoldier->flags.uiStatusFlags |= SOLDIER_PCUNDERAICONTROL; //SB: this flag don't allow merc leave the ring pSoldier->flags.uiStatusFlags &= ~SOLDIER_ENGAGEDINACTION; } else { if ( ubPass == 1 ) // pass 1, only handle PCs { continue; } // reset AI boxer to neutral SetSoldierNeutral( pSoldier ); RecalculateOppCntsDueToBecomingNeutral( pSoldier ); } CancelAIAction( pSoldier, TRUE ); pSoldier->aiData.bAlertStatus = STATUS_GREEN; pSoldier->aiData.bUnderFire = 0; // HEADROCK HAM 3.6: Make sure all boxers' APs have been reset to a reasonable number. Otherwise, // the AI combatant may fail several conditions in subsequent functions, and fail to leave the ring // as a result. if (pSoldier->bActionPoints < (APBPConstants[AP_MAXIMUM]*6)/10) { pSoldier->bActionPoints = (APBPConstants[AP_MAXIMUM]*6)/10; } // if necessary, revive boxer so he can leave ring if (pSoldier->stats.bLife > 0 && (pSoldier->stats.bLife < OKLIFE || pSoldier->bBreath < OKBREATH ) ) { pSoldier->stats.bLife = __max( OKLIFE * 2, pSoldier->stats.bLife ); if (pSoldier->bBreath < 100) { // deduct -ve BPs to grant some BPs back (properly) DeductPoints( pSoldier, 0, (INT16) - ( (100 - pSoldier->bBreath) * 100 ) ); } pSoldier->BeginSoldierGetup( ); } } } } } DeleteTalkingMenu(); EndAllAITurns(); if ( CheckForEndOfCombatMode( FALSE ) ) { EndTopMessage(); #ifdef NEWMUSIC GlobalSoundID = MusicSoundValues[ SECTOR( gWorldSectorX, gWorldSectorY ) ].SoundTacticalNothing[gbWorldSectorZ]; if ( MusicSoundValues[ SECTOR( gWorldSectorX, gWorldSectorY ) ].SoundTacticalNothing[gbWorldSectorZ] != -1 ) SetMusicModeID( MUSIC_TACTICAL_NOTHING, MusicSoundValues[ SECTOR( gWorldSectorX, gWorldSectorY ) ].SoundTacticalNothing[gbWorldSectorZ] ); else #endif SetMusicMode( MUSIC_TACTICAL_NOTHING ); // Lock UI until we get out of the ring guiPendingOverrideEvent = LU_BEGINUILOCK; } }