// ATE: This function deals with MERC MERC and NPC's leaving because of not getting paid... // NOT AIM renewals.... void MercsContractIsFinished( UINT8 ubID ) { SOLDIERTYPE *pSoldier; #ifndef JA2DEMO pSoldier = &Menptr[ ubID ]; //if the soldier was removed before getting into this function, return if( !pSoldier->bActive ) return; if( fShowContractMenu ) { fShowContractMenu = FALSE; } // go to mapscreen SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_ENTER_MAPSCREEN,0,0,0,0,0 ); if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) { //if the players account status is invalid if( LaptopSaveInfo.gubPlayersMercAccountStatus == MERC_ACCOUNT_INVALID ) { //Send the merc home InterruptTime( ); PauseGame(); LockPauseState( 9 ); // Say quote for wishing to leave TacticalCharacterDialogue( pSoldier, QUOTE_NOT_GETTING_PAID ); TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING_NO_ASK_EQUIP, 0, 0 ); pSoldier->ubLeaveHistoryCode = HISTORY_MERC_QUIT; } } else if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) { InterruptTime( ); PauseGame(); LockPauseState( 10 ); TacticalCharacterDialogue( pSoldier, QUOTE_AIM_SEEN_MIKE ); TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING_NO_ASK_EQUIP, 0, 0 ); pSoldier->ubLeaveHistoryCode = HISTORY_MERC_QUIT; } #endif }
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 HandleDeidrannaDeath( 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_DEIDRANNA ); 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_WitnessDeidrannaDeath[ 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_DEIDRANNA ); } } } } } // Set fact that she is dead! SetFactTrue( FACT_QUEEN_DEAD ); ExecuteStrategicAIAction( STRATEGIC_AI_ACTION_QUEEN_DEAD, 0, 0 ); // AFTER LAST ONE IS DONE - PUT SPECIAL EVENT ON QUEUE TO BEGIN FADE< ETC SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_MULTIPURPOSE, MULTIPURPOSE_SPECIAL_EVENT_DONE_KILLING_DEIDRANNA, 0,0,0,0 ); }
void EndQueenDeathEndgameBeginEndCimenatic( ) { INT32 cnt; SOLDIERTYPE *pSoldier; // Start end cimimatic.... gTacticalStatus.uiFlags |= IN_ENDGAME_SEQUENCE; // first thing is to loop through team and say end quote... cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; // look for all mercs on the same team, for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pSoldier++) { // Are we in this sector, On the current squad? if ( pSoldier->bActive && pSoldier->bLife >= OKLIFE && !AM_AN_EPC( pSoldier ) ) { TacticalCharacterDialogue( pSoldier, QUOTE_END_GAME_COMMENT ); } } // Add queue event to proceed w/ smacker cimimatic SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_MULTIPURPOSE, MULTIPURPOSE_SPECIAL_EVENT_TEAM_MEMBERS_DONE_TALKING, 0,0,0,0 ); }
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 ); } } } }
// ATE: Called for RPCs who should now complain about no pay... void RPCWhineAboutNoPay( UINT8 ubID ) { SOLDIERTYPE *pSoldier; #ifndef JA2DEMO pSoldier = &Menptr[ ubID ]; //if the soldier was removed before getting into this function, return if( !pSoldier->bActive ) return; if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) { // Say quote for needing pay! TacticalCharacterDialogue( pSoldier, QUOTE_NOT_GETTING_PAID ); } #endif }
INT32 SkillCheck( SOLDIERTYPE * pSoldier, INT8 bReason, INT8 bChanceMod ) { INT32 iSkill; INT32 iChance, iReportChance; INT32 iRoll, iMadeItBy; INT8 bSlot; INT32 iLoop; SOLDIERTYPE * pTeamSoldier; INT8 bBuddyIndex; BOOLEAN fForceDamnSound = FALSE; iReportChance = -1; switch (bReason) { case LOCKPICKING_CHECK: case ELECTRONIC_LOCKPICKING_CHECK: fForceDamnSound = TRUE; iSkill = EffectiveMechanical( pSoldier ); if (iSkill == 0) { break; } // adjust skill based on wisdom (knowledge) iSkill = iSkill * (EffectiveWisdom( pSoldier ) + 100) / 200; // and dexterity (clumsy?) iSkill = iSkill * (EffectiveDexterity( pSoldier ) + 100) / 200; // factor in experience iSkill = iSkill + EffectiveExpLevel( pSoldier ) * 3; if (HAS_SKILL_TRAIT( pSoldier, LOCKPICKING ) ) { // if we specialize in picking locks... iSkill += gbSkillTraitBonus[LOCKPICKING] * NUM_SKILL_TRAITS( pSoldier, LOCKPICKING ); } if (bReason == ELECTRONIC_LOCKPICKING_CHECK && !(HAS_SKILL_TRAIT( pSoldier, ELECTRONICS)) ) { // if we are unfamiliar with electronics... iSkill /= 2; } // adjust chance based on status of kit bSlot = FindObj( pSoldier, LOCKSMITHKIT ); if (bSlot == NO_SLOT) { // this should never happen, but might as well check... iSkill = 0; } iSkill = iSkill * pSoldier->inv[bSlot].bStatus[0] / 100; break; case ATTACHING_DETONATOR_CHECK: case ATTACHING_REMOTE_DETONATOR_CHECK: iSkill = EffectiveExplosive( pSoldier ); if (iSkill == 0) { break; } iSkill = (iSkill * 3 + EffectiveDexterity( pSoldier ) ) / 4; if ( bReason == ATTACHING_REMOTE_DETONATOR_CHECK && !(HAS_SKILL_TRAIT( pSoldier, ELECTRONICS )) ) { iSkill /= 2; } break; case PLANTING_BOMB_CHECK: case PLANTING_REMOTE_BOMB_CHECK: iSkill = EffectiveExplosive( pSoldier ) * 7; iSkill += EffectiveWisdom( pSoldier ) * 2; iSkill += EffectiveExpLevel( pSoldier ) * 10; iSkill = iSkill / 10; // bring the value down to a percentage if ( bReason == PLANTING_REMOTE_BOMB_CHECK && !(HAS_SKILL_TRAIT( pSoldier, ELECTRONICS)) ) { // deduct only a bit... iSkill = (iSkill * 3) / 4; } // Ok, this is really damn easy, so skew the values... // e.g. if calculated skill is 84, skewed up to 96 // 51 to 84 // 22 stays as is iSkill = (iSkill + 100 * (iSkill / 25) ) / (iSkill / 25 + 1); break; case DISARM_TRAP_CHECK: fForceDamnSound = TRUE; iSkill = EffectiveExplosive( pSoldier ) * 7; if ( iSkill == 0 ) { break; } iSkill += EffectiveDexterity( pSoldier ) * 2; iSkill += EffectiveExpLevel( pSoldier ) * 10; iSkill = iSkill / 10; // bring the value down to a percentage // penalty based on poor wisdom iSkill -= (100 - EffectiveWisdom( pSoldier ) ) / 5; break; case DISARM_ELECTRONIC_TRAP_CHECK: fForceDamnSound = TRUE; iSkill = __max( EffectiveMechanical( pSoldier ) , EffectiveExplosive( pSoldier ) ) * 7; if ( iSkill == 0 ) { break; } iSkill += EffectiveDexterity( pSoldier ) * 2; iSkill += EffectiveExpLevel( pSoldier ) * 10; iSkill = iSkill / 10; // bring the value down to a percentage // penalty based on poor wisdom iSkill -= (100 - EffectiveWisdom( pSoldier ) ) / 5; if ( !(HAS_SKILL_TRAIT( pSoldier, ELECTRONICS )) ) { iSkill = (iSkill * 3) / 4; } break; case OPEN_WITH_CROWBAR: // Add for crowbar... iSkill = EffectiveStrength( pSoldier ) + 20; fForceDamnSound = TRUE; break; case SMASH_DOOR_CHECK: iSkill = EffectiveStrength( pSoldier ); break; case UNJAM_GUN_CHECK: iSkill = 30 + EffectiveMechanical( pSoldier ) / 2; break; case NOTICE_DART_CHECK: // only a max of ~20% chance iSkill = EffectiveWisdom( pSoldier ) / 10 + EffectiveExpLevel( pSoldier ); break; case LIE_TO_QUEEN_CHECK: // competitive check vs the queen's wisdom and leadership... poor guy! iSkill = 50 * ( EffectiveWisdom( pSoldier ) + EffectiveLeadership( pSoldier ) ) / ( gMercProfiles[ QUEEN ].bWisdom + gMercProfiles[ QUEEN ].bLeadership ); break; case ATTACHING_SPECIAL_ITEM_CHECK: case ATTACHING_SPECIAL_ELECTRONIC_ITEM_CHECK: iSkill = EffectiveMechanical( pSoldier ); if (iSkill == 0) { break; } // adjust skill based on wisdom (knowledge) iSkill = iSkill * (EffectiveWisdom( pSoldier ) + 100) / 200; // and dexterity (clumsy?) iSkill = iSkill * (EffectiveDexterity( pSoldier ) + 100) / 200; // factor in experience iSkill = iSkill + EffectiveExpLevel( pSoldier ) * 3; if (bReason == ATTACHING_SPECIAL_ELECTRONIC_ITEM_CHECK && !(HAS_SKILL_TRAIT( pSoldier, ELECTRONICS)) ) { // if we are unfamiliar with electronics... iSkill /= 2; } break; default: iSkill = 0; break; } iSkill -= GetSkillCheckPenaltyForFatigue( pSoldier, iSkill ); iChance = iSkill + bChanceMod; switch (bReason) { case LOCKPICKING_CHECK: case ELECTRONIC_LOCKPICKING_CHECK: case DISARM_TRAP_CHECK: case DISARM_ELECTRONIC_TRAP_CHECK: case OPEN_WITH_CROWBAR: case SMASH_DOOR_CHECK: case ATTACHING_SPECIAL_ITEM_CHECK: case ATTACHING_SPECIAL_ELECTRONIC_ITEM_CHECK: // for lockpicking and smashing locks, if the chance isn't reasonable // we set it to 0 so they can never get through the door if they aren't // good enough if (iChance < 30) { iChance = 0; break; } // else fall through default: iChance += GetMoraleModifier( pSoldier ); break; } if (iChance > 99) { iChance = 99; } else if (iChance < 0) { iChance = 0; } iRoll = PreRandom( 100 ); iMadeItBy = iChance - iRoll; if (iMadeItBy < 0) { if ( (pSoldier->bLastSkillCheck == bReason) && (pSoldier->sGridNo == pSoldier->sSkillCheckGridNo) ) { pSoldier->ubSkillCheckAttempts++; if (pSoldier->ubSkillCheckAttempts > 2) { if (iChance == 0) { // do we realize that we just can't do this? if ( (100 - (pSoldier->ubSkillCheckAttempts - 2) * 20) < EffectiveWisdom( pSoldier ) ) { // say "I can't do this" quote TacticalCharacterDialogue( pSoldier, QUOTE_DEFINITE_CANT_DO ); return( iMadeItBy ); } } } } else { pSoldier->bLastSkillCheck = bReason; pSoldier->ubSkillCheckAttempts = 1; pSoldier->sSkillCheckGridNo = pSoldier->sGridNo; } if ( fForceDamnSound || Random( 100 ) < 40 ) { switch( bReason ) { case UNJAM_GUN_CHECK: case NOTICE_DART_CHECK: case LIE_TO_QUEEN_CHECK: // silent check break; default: DoMercBattleSound( pSoldier, BATTLE_SOUND_CURSE1 ); break; } } } else { // A buddy might make a positive comment based on our success; // Increase the chance for people with higher skill and for more difficult tasks iChance = 15 + iSkill / 20 + (-bChanceMod) / 20; if (iRoll < iChance) { // If a buddy of this merc is standing around nearby, they'll make a positive comment. iLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; for ( pTeamSoldier = MercPtrs[ iLoop ]; iLoop <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; iLoop++,pTeamSoldier++ ) { if ( OK_INSECTOR_MERC( pTeamSoldier ) ) { bBuddyIndex = WhichBuddy( pTeamSoldier->ubProfile, pSoldier->ubProfile ); if (bBuddyIndex >= 0 && SpacesAway( pSoldier->sGridNo, pTeamSoldier->sGridNo ) < 15) { switch( bBuddyIndex ) { case 0: // buddy #1 did something good! TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_1_GOOD ); break; case 1: // buddy #2 did something good! TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_2_GOOD ); break; case 2: // learn to like buddy did something good! TacticalCharacterDialogue( pTeamSoldier, QUOTE_LEARNED_TO_LIKE_WITNESSED ); break; default: break; } } } } } } return( iMadeItBy ); }
void UpdateBuddyAndHatedCounters( void ) { INT8 bMercID; INT32 iLoop; INT8 bOtherID; INT8 bLastTeamID; UINT8 ubOtherProfileID; SOLDIERTYPE *pSoldier; SOLDIERTYPE *pOtherSoldier; MERCPROFILESTRUCT *pProfile; BOOLEAN fSameGroupOnly; BOOLEAN fUpdatedTimeTillNextHatedComplaint = FALSE; bMercID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID; //loop though all the mercs for ( pSoldier = MercPtrs[ bMercID ]; bMercID <= bLastTeamID; bMercID++,pSoldier++) { fSameGroupOnly = FALSE; //if the merc is active and on a combat assignment if ( pSoldier->bActive && pSoldier->bAssignment < ON_DUTY ) { pProfile = &(gMercProfiles[ pSoldier->ubProfile ]); // if we're moving, we only check vs other people in our squad if (pSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pSoldier->ubGroupID )) { fSameGroupOnly = TRUE; } fUpdatedTimeTillNextHatedComplaint = FALSE; bOtherID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; for ( pOtherSoldier = MercPtrs[ bOtherID ]; bOtherID <= bLastTeamID; bOtherID++, pOtherSoldier++) { // is this guy in the same sector and on active duty (or in the same moving group) if (bOtherID != bMercID && pOtherSoldier->bActive && pOtherSoldier->bAssignment < ON_DUTY ) { if (fSameGroupOnly) { // all we have to check is the group ID if (pSoldier->ubGroupID != pOtherSoldier->ubGroupID) { continue; } } else { // check to see if the location is the same if (pOtherSoldier->sSectorX != pSoldier->sSectorX || pOtherSoldier->sSectorY != pSoldier->sSectorY || pOtherSoldier->bSectorZ != pSoldier->bSectorZ) { continue; } // if the OTHER soldier is in motion then we don't do anything! if (pOtherSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pOtherSoldier->ubGroupID )) { continue; } } ubOtherProfileID = pOtherSoldier->ubProfile; for ( iLoop = 0; iLoop < 4; iLoop++ ) { switch( iLoop ) { case 0: case 1: if (pProfile->bHated[iLoop] == ubOtherProfileID) { // arrgs, we're on assignment with the person we loathe! if ( pProfile->bHatedCount[iLoop] > 0 ) { pProfile->bHatedCount[iLoop]--; if ( pProfile->bHatedCount[iLoop] == 0 && pSoldier->bInSector && gTacticalStatus.fEnemyInSector ) { // just reduced count to 0 but we have enemy in sector... pProfile->bHatedCount[iLoop] = 1; } else if (pProfile->bHatedCount[iLoop] > 0 && (pProfile->bHatedCount[iLoop] == pProfile->bHatedTime[iLoop] / 2 || ( pProfile->bHatedCount[iLoop] < pProfile->bHatedTime[iLoop] / 2 && pProfile->bHatedCount[iLoop] % TIME_BETWEEN_HATED_COMPLAINTS == 0 ) ) ) { // complain! if (iLoop == 0) { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_ONE ); } else { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_TWO ); } StopTimeCompression(); } else if ( pProfile->bHatedCount[iLoop] == 0 ) { // zero count! if (pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC || pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) { // MERC mercs leave now! if (iLoop == 0) { TacticalCharacterDialogue( pSoldier, QUOTE_MERC_QUIT_HATED1 ); } else { TacticalCharacterDialogue( pSoldier, QUOTE_MERC_QUIT_HATED2 ); } // Leave now! ( handle equipment too ).... TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 0,0 ); pSoldier->ubLeaveHistoryCode = HISTORY_MERC_QUIT; } else { // complain! if (iLoop == 0) { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_ONE ); } else { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_TWO ); } pProfile->ubTimeTillNextHatedComplaint = TIME_BETWEEN_HATED_COMPLAINTS - 1; } } } else { // if we haven't updated the time till our next complaint, do so // if it's 0, gripe. if ( !fUpdatedTimeTillNextHatedComplaint ) { if ( pProfile->ubTimeTillNextHatedComplaint == 0 ) { pProfile->ubTimeTillNextHatedComplaint = TIME_BETWEEN_HATED_COMPLAINTS - 1; } else { pProfile->ubTimeTillNextHatedComplaint--; } fUpdatedTimeTillNextHatedComplaint = TRUE; } if ( pProfile->ubTimeTillNextHatedComplaint == 0 ) { // complain! if (iLoop == 0) { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_ONE ); } else { TacticalCharacterDialogue( pSoldier, QUOTE_HATED_MERC_TWO ); } } } } break; case 2: if (pProfile->bLearnToHate == ubOtherProfileID) { if ( pProfile->bLearnToHateCount > 0 ) { pProfile->bLearnToHateCount--; if ( pProfile->bLearnToHateCount == 0 && pSoldier->bInSector && gTacticalStatus.fEnemyInSector ) { // just reduced count to 0 but we have enemy in sector... pProfile->bLearnToHateCount = 1; } else if (pProfile->bLearnToHateCount > 0 && (pProfile->bLearnToHateCount == pProfile->bLearnToHateTime / 2 || pProfile->bLearnToHateCount < pProfile->bLearnToHateTime / 2 && pProfile->bLearnToHateCount % TIME_BETWEEN_HATED_COMPLAINTS == 0 ) ) { // complain! TacticalCharacterDialogue( pSoldier, QUOTE_LEARNED_TO_HATE_MERC ); StopTimeCompression(); } else if (pProfile->bLearnToHateCount == 0) { // set as bHated[2]; pProfile->bHated[2] = pProfile->bLearnToHate; pProfile->bMercOpinion[ubOtherProfileID] = HATED_OPINION; if (pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC || (pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC && (pSoldier->ubProfile == DEVIN || pSoldier->ubProfile == SLAY || pSoldier->ubProfile == IGGY || pSoldier->ubProfile == CONRAD ) ) ) { // Leave now! ( handle equipment too ).... TacticalCharacterDialogue( pSoldier, QUOTE_MERC_QUIT_LEARN_TO_HATE ); TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 0,0 ); pSoldier->ubLeaveHistoryCode = HISTORY_MERC_QUIT; } else if (pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC) { // whine again TacticalCharacterDialogue( pSoldier, QUOTE_LEARNED_TO_HATE_MERC ); } } if (pProfile->bLearnToHateCount < pProfile->bLearnToHateTime / 2) { // gradual opinion drop pProfile->bMercOpinion[ubOtherProfileID] += (HATED_OPINION - pProfile->bMercOpinion[ubOtherProfileID]) / (pProfile->bLearnToHateCount + 1); } } else { if ( !fUpdatedTimeTillNextHatedComplaint ) { if ( pProfile->ubTimeTillNextHatedComplaint == 0 ) { pProfile->ubTimeTillNextHatedComplaint = TIME_BETWEEN_HATED_COMPLAINTS - 1; } else { pProfile->ubTimeTillNextHatedComplaint--; } fUpdatedTimeTillNextHatedComplaint = TRUE; } if ( pProfile->ubTimeTillNextHatedComplaint == 0 ) { // complain! TacticalCharacterDialogue( pSoldier, QUOTE_LEARNED_TO_HATE_MERC ); } } } break; case 3: if (pProfile->bLearnToLikeCount > 0 && pProfile->bLearnToLike == ubOtherProfileID) { pProfile->bLearnToLikeCount--; if (pProfile->bLearnToLikeCount == 0) { // add to liked! pProfile->bBuddy[2] = pProfile->bLearnToLike; pProfile->bMercOpinion[ubOtherProfileID] = BUDDY_OPINION; } else if (pProfile->bLearnToLikeCount < pProfile->bLearnToLikeTime / 2) { // increase opinion of them! pProfile->bMercOpinion[ubOtherProfileID] += (BUDDY_OPINION - pProfile->bMercOpinion[ubOtherProfileID]) / (pProfile->bLearnToLikeCount + 1); break; } } break; } } } } } } }
//DBrot: More Rooms void RemoveRoomRoof( INT32 sGridNo, UINT16 usRoomNum, SOLDIERTYPE *pSoldier ) { INT32 cnt; ITEM_POOL *pItemPool; INT16 sX, sY; BOOLEAN fSaidItemSeenQuote = FALSE; // STRUCTURE *pStructure;//, *pBase; // LOOP THORUGH WORLD AND CHECK ROOM INFO for ( cnt = 0; cnt < WORLD_MAX; cnt++ ) { if ( gusWorldRoomInfo[ cnt ] == usRoomNum ) { SetGridNoRevealedFlag( cnt );//dnl ch56 141009 RemoveRoofIndexFlagsFromTypeRange( cnt, FIRSTROOF, SECONDSLANTROOF, LEVELNODE_REVEAL ); // Reveal any items if here! if ( GetItemPoolFromGround( cnt, &pItemPool ) ) { // Set visible! ( only if invisible... ) if ( SetItemPoolVisibilityOn( pItemPool, INVISIBLE, TRUE ) ) { if ( !fSaidItemSeenQuote ) { fSaidItemSeenQuote = TRUE; if ( pSoldier != NULL ) { //ddd //TacticalCharacterDialogue( pSoldier, (UINT16)( QUOTE_SPOTTED_SOMETHING_ONE + Random( 2 ) ) ); if(Chance(gGameExternalOptions.iChanceSayAnnoyingPhrase) ) TacticalCharacterDialogue( pSoldier, (UINT16)( QUOTE_SPOTTED_SOMETHING_ONE + Random( 2 ) ) ); //ddd } } } } // OK, re-set writeframes ( in a radius ) // Get XY ConvertGridNoToXY( cnt, &sX, &sY ); SetRecalculateWireFrameFlagRadius( sX, sY, 2 ); } } //for ( cnt = 0; cnt < WORLD_MAX; cnt++ ) //{ // if ( gubWorldRoomInfo[ cnt ] == bRoomNum ) // { // ExamineGridNoForSlantRoofExtraGraphic( (INT16)cnt ); // } //} // DIRTY THE WORLD! InvalidateWorldRedundency(); SetRenderFlags(RENDER_FLAG_FULL ); CalculateWorldWireFrameTiles( FALSE ); }
void HandleSoldierDeadComments( SOLDIERTYPE *pSoldier ) { INT32 cnt = 0; SOLDIERTYPE *pTeamSoldier; INT8 bBuddyIndex; // IF IT'S THE SELECTED GUY, MAKE ANOTHER SELECTED! cnt = gTacticalStatus.Team[ pSoldier->bTeam ].bFirstID; // see if this was the friend of a living merc for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID; cnt++,pTeamSoldier++) { if ( pTeamSoldier->stats.bLife >= OKLIFE && pTeamSoldier->bActive ) { bBuddyIndex = WhichBuddy( pTeamSoldier->ubProfile, pSoldier->ubProfile ); switch( bBuddyIndex ) { case 0: // buddy #1 died! TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_ONE_KILLED ); break; case 1: // buddy #2 died! TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_TWO_KILLED ); break; case 2: // buddy #3 died! if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_THREE_KILLED ); else TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_THREE_KILLED ); break; case 3: // buddy #4 died! if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_FOUR_KILLED ); else TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_FOUR_KILLED ); break; case 4: // buddy #5 died! if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_FIVE_KILLED ); else TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_FIVE_KILLED ); break; case 5: // learn to like buddy died! TacticalCharacterDialogue( pTeamSoldier, QUOTE_LEARNED_TO_LIKE_MERC_KILLED ); break; default: break; } } #ifdef JA2UB #else // anv: handle Speck witnessing his employee death if( pTeamSoldier->ubProfile == SPECK_PLAYABLE && pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) HandleSpeckWitnessingEmployeeDeath( pSoldier ); #endif } return; }