void MercComplainAboutEquipment( UINT8 ubProfile ) { SOLDIERTYPE *pSoldier; if ( ubProfile == LARRY_NORMAL ) { if ( CheckFact( FACT_LARRY_CHANGED, 0 ) ) { ubProfile = LARRY_DRUNK; } } else if ( ubProfile == LARRY_DRUNK ) { if ( CheckFact( FACT_LARRY_CHANGED, 0 ) == FALSE ) { ubProfile = LARRY_NORMAL; } } // Are we dead/ does merc still exist? pSoldier = FindSoldierByProfileID( ubProfile, FALSE ); if ( pSoldier != NULL ) { if ( pSoldier->bLife >= OKLIFE && pSoldier->fMercAsleep != TRUE && pSoldier->bAssignment < ON_DUTY ) { //ATE: Double check that this problem still exists! if ( SoldierHasWorseEquipmentThanUsedTo( pSoldier ) ) { // Say quote! TacticalCharacterDialogue( pSoldier, QUOTE_WHINE_EQUIPMENT ); } } } }
void HandleQueenBitchDeath( SOLDIERTYPE *pKillerSoldier, INT16 sGridNo, INT8 bLevel ) { SOLDIERTYPE *pTeamSoldier; INT32 cnt; INT16 sDistVisible = FALSE; UINT8 ubKillerSoldierID = NOBODY; // Start victory music here... SetMusicMode( MUSIC_TACTICAL_VICTORY ); if ( pKillerSoldier ) { TacticalCharacterDialogue( pKillerSoldier, QUOTE_KILLING_QUEEN ); ubKillerSoldierID = pKillerSoldier->ubID; } // STEP 1 ) START ALL QUOTES GOING! // OK - loop through all witnesses and see if they want to say something abou this... cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; // run through list for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pTeamSoldier++ ) { if ( cnt != ubKillerSoldierID ) { if ( OK_INSECTOR_MERC( pTeamSoldier ) && !( pTeamSoldier->uiStatusFlags & SOLDIER_GASSED ) && !AM_AN_EPC( pTeamSoldier ) ) { if ( QuoteExp_WitnessQueenBugDeath[ pTeamSoldier->ubProfile ] ) { // Can we see location? sDistVisible = DistanceVisible( pTeamSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sGridNo, bLevel ); if ( SoldierTo3DLocationLineOfSightTest( pTeamSoldier, sGridNo, bLevel, 3, (UINT8) sDistVisible, TRUE ) ) { TacticalCharacterDialogue( pTeamSoldier, QUOTE_KILLING_QUEEN ); } } } } } // Set fact that she is dead! if ( CheckFact( FACT_QUEEN_DEAD, 0 ) ) { EndQueenDeathEndgameBeginEndCimenatic( ); } else { // Unset flags... gTacticalStatus.uiFlags &= (~ENGAGED_IN_CONV ); // Increment refrence count... giNPCReferenceCount = 0; } }
void CallEldinTo( INT16 sGridNo ) { // like call all enemies, but only affects Eldin SOLDIERTYPE * pSoldier; // Eldin becomes aware of a very important "noise" coming from here! // So long as he hasn't already heard a noise a sec ago... if (gTacticalStatus.Team[CIV_TEAM].bTeamActive) { // new situation for Eldin pSoldier = FindSoldierByProfileID( ELDIN, FALSE ); if ( pSoldier && pSoldier->bActive && pSoldier->bInSector && pSoldier->bLife >= OKLIFE && (pSoldier->bAlertStatus == STATUS_GREEN || pSoldier->ubNoiseVolume < (MAX_MISC_NOISE_DURATION / 2) ) ) { if ( SoldierToLocationLineOfSightTest( pSoldier, sGridNo, (UINT8) MaxDistanceVisible(), TRUE ) ) { // sees the player now! TriggerNPCWithIHateYouQuote( ELDIN ); SetNewSituation( pSoldier ); } else { pSoldier->sNoiseGridno = sGridNo; pSoldier->ubNoiseVolume = MAX_MISC_NOISE_DURATION; pSoldier->bAlertStatus = STATUS_RED; if ( (pSoldier->bAction != AI_ACTION_GET_CLOSER) || CheckFact( FACT_MUSEUM_ALARM_WENT_OFF, 0 ) == FALSE ) { CancelAIAction( pSoldier, TRUE ); pSoldier->bNextAction = AI_ACTION_GET_CLOSER; pSoldier->usNextActionData = sGridNo; RESETTIMECOUNTER( pSoldier->AICounter, 100 ); } // otherwise let AI handle this normally // SetNewSituation( pSoldier ); // reduce any delay to minimal } SetFactTrue( FACT_MUSEUM_ALARM_WENT_OFF ); } } }
void IssueHeadMinerQuote( INT8 bMineIndex, UINT8 ubQuoteType ) { UINT8 ubHeadMinerIndex = 0; UINT16 usHeadMinerProfileId = 0; INT8 bQuoteNum = 0; UINT8 ubFaceIndex = 0; BOOLEAN fForceMapscreen = FALSE; INT16 sXPos, sYPos; Assert( ( bMineIndex >= 0 ) && ( bMineIndex < MAX_NUMBER_OF_MINES ) ); Assert( ubQuoteType < NUM_HEAD_MINER_STRATEGIC_QUOTES ); Assert( CheckFact( FACT_MINERS_PLACED, 0 ) ); ubHeadMinerIndex = GetHeadMinerIndexForMine( bMineIndex ); usHeadMinerProfileId = gHeadMinerData[ ubHeadMinerIndex ].usProfileId; // make sure the miner ain't dead if (gMercProfiles[ usHeadMinerProfileId ].bLife < OKLIFE) { // debug message ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"Head Miner #%s can't talk (quote #%d)", gMercProfiles[ usHeadMinerProfileId ].zNickname, ubQuoteType); return; } bQuoteNum = gHeadMinerData[ ubHeadMinerIndex ].bQuoteNum[ ubQuoteType ]; Assert( bQuoteNum != -1 ); ubFaceIndex = ( UINT8 ) uiExternalStaticNPCFaces[ gHeadMinerData[ ubHeadMinerIndex ].ubExternalFace ]; // transition to mapscreen is not necessary for "creatures gone" quote - player is IN that mine, so he'll know if ( ubQuoteType != HEAD_MINER_STRATEGIC_QUOTE_CREATURES_GONE ) { fForceMapscreen = TRUE; } // decide where the miner's face and text box should be positioned in order to not obscure the mine he's in as it flashes switch ( bMineIndex ) { case MINE_GRUMM: sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = DEFAULT_EXTERN_PANEL_Y_POS; break; case MINE_CAMBRIA: sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = DEFAULT_EXTERN_PANEL_Y_POS; break; case MINE_ALMA: sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = DEFAULT_EXTERN_PANEL_Y_POS; break; case MINE_DRASSEN: sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = 135; break; case MINE_CHITZENA: sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = 117; break; // there's no head miner in San Mona, this is an error! case MINE_SAN_MONA: default: Assert( FALSE ); sXPos = DEFAULT_EXTERN_PANEL_X_POS, sYPos = DEFAULT_EXTERN_PANEL_Y_POS; break; } SetExternMapscreenSpeechPanelXY( sXPos, sYPos ); // cause this quote to come up for this profile id and an indicator to flash over the mine sector HandleMinerEvent( gHeadMinerData[ ubHeadMinerIndex ].ubExternalFace, gMineLocation[ bMineIndex ].sSectorX, gMineLocation[ bMineIndex ].sSectorY, (INT16) bQuoteNum, fForceMapscreen ); // stop time compression with any miner quote - these are important events. StopTimeCompression(); }