void TriggerEndOfBoxingRecord( SOLDIERTYPE * pSoldier ) { // unlock UI guiPendingOverrideEvent = LU_ENDUILOCK; if ( pSoldier ) { switch( gTacticalStatus.bBoxingState ) { case WON_ROUND: AddHistoryToPlayersLog( HISTORY_WON_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY ); TriggerNPCRecord( DARREN, 23 ); break; case LOST_ROUND: // log as lost AddHistoryToPlayersLog( HISTORY_LOST_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY ); TriggerNPCRecord( DARREN, 24 ); break; case DISQUALIFIED: AddHistoryToPlayersLog( HISTORY_DISQUALIFIED_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY ); break; } } SetBoxingState( NOT_BOXING ); }
// this is called once a day (daily update) for every merc working for the player void CheckIfMercGetsAnotherContract( SOLDIERTYPE *pSoldier ) { UINT32 uiFullDaysRemaining = 0; INT32 iChance = 0; // aim merc? if( pSoldier->ubWhatKindOfMercAmI != MERC_TYPE__AIM_MERC ) return; // ATE: check time we have and see if we can accept new contracts.... if ( GetWorldTotalMin() <= (UINT32) pSoldier->iTimeCanSignElsewhere ) { return; } // if he doesn't already have another contract if (!pSoldier->flags.fSignedAnotherContract) { // chance depends on how much time he has left in his contract, and his experience level (determines demand) uiFullDaysRemaining = (pSoldier->iEndofContractTime - GetWorldTotalMin()) / (24 * 60); if (uiFullDaysRemaining == 0) { // less than a full day left on contract // calc the chance merc will get another contract while working for ya (this is rolled once/day) iChance = 3; } else if (uiFullDaysRemaining == 1) { // < 2 days left iChance = 2; } else if (uiFullDaysRemaining == 2) { // < 3 days left iChance = 1; } else { // 3+ days iChance = 0; } // multiply by experience level iChance *= pSoldier->stats.bExpLevel; //tais: disabled mercs going on other assignment after being fired.. if( (INT32) Random( 100 ) < iChance && gGameExternalOptions.fMercsOnAssignment < 2 ) { // B'bye! pSoldier->flags.fSignedAnotherContract = TRUE; } } }
void CalculateMedicalDepositRefund( SOLDIERTYPE *pSoldier ) { INT32 iRefundAmount=0; //if the merc didnt have any medical deposit, exit if( !gMercProfiles[ pSoldier->ubProfile ].bMedicalDeposit ) return; //if the merc is at full health, refund the full medical deposit if( pSoldier->bLife == pSoldier->bLifeMax ) { //add an entry in the finacial page for the FULL refund of the medical deposit // use the medical deposit in pSoldier, not in profile, which goes up with leveling AddTransactionToPlayersBook(FULL_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), pSoldier->usMedicalDeposit ); //add an email AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_REFUND, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile ); } //else if the merc is a dead, refund NOTHING!! else if( pSoldier->bLife <= 0 ) { //add an entry in the finacial page for NO refund of the medical deposit //AddTransactionToPlayersBook( NO_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), 0 ); //add an email AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_NO_REFUND, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile ); } //else the player is injured, refund a partial amount else { // use the medical deposit in pSoldier, not in profile, which goes up with leveling iRefundAmount = (INT32) ( ( pSoldier->bLife / ( FLOAT ) pSoldier->bLifeMax ) * pSoldier->usMedicalDeposit + 0.5 ); //add an entry in the finacial page for a PARTIAL refund of the medical deposit AddTransactionToPlayersBook( PARTIAL_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), iRefundAmount ); //add an email AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile ); } }
void GameInitHistory() { if( ( FileExists( HISTORY_DATA_FILE ) ) ) { // unlink history file FileClearAttributes( HISTORY_DATA_FILE ); FileDelete( HISTORY_DATA_FILE ); } AddHistoryToPlayersLog(HISTORY_ACCEPTED_ASSIGNMENT_FROM_ENRICO, 0, GetWorldTotalMin( ), -1, -1); }
BOOLEAN QuickGameMemberHireMerc( UINT8 ubCurrentSoldier ) { MERC_HIRE_STRUCT HireMercStruct; memset(&HireMercStruct, 0, sizeof(MERC_HIRE_STRUCT)); HireMercStruct.ubProfileID = ubCurrentSoldier; HireMercStruct.sSectorX = gsMercArriveSectorX; HireMercStruct.sSectorY = gsMercArriveSectorY; HireMercStruct.fUseLandingZoneForArrival = TRUE; HireMercStruct.fCopyProfileItemsOver = TRUE; HireMercStruct.ubInsertionCode = INSERTION_CODE_CHOPPER; HireMercStruct.iTotalContractLength = 7; //specify when the merc should arrive HireMercStruct.uiTimeTillMercArrives = 0; //if we succesfully hired the merc if( !HireMerc( &HireMercStruct ) ) { return(FALSE); } //add an entry in the finacial page for the hiring of the merc AddTransactionToPlayersBook(HIRED_MERC, ubCurrentSoldier, GetWorldTotalMin(), -(INT32) gMercProfiles[ubCurrentSoldier].uiWeeklySalary ); if( gMercProfiles[ ubCurrentSoldier ].bMedicalDeposit ) { //add an entry in the finacial page for the medical deposit AddTransactionToPlayersBook(MEDICAL_DEPOSIT, ubCurrentSoldier, GetWorldTotalMin(), -(gMercProfiles[ubCurrentSoldier].sMedicalDepositAmount) ); } //add an entry in the history page for the hiring of the merc AddHistoryToPlayersLog( HISTORY_HIRED_MERC_FROM_AIM, ubCurrentSoldier, GetWorldTotalMin(), -1, -1 ); return(TRUE); }
void PayForTrainingInSector( UINT8 ubSector ) { Assert( SectorInfo[ ubSector ].fMilitiaTrainingPaid == FALSE ); // spend the money AddTransactionToPlayersBook( TRAIN_TOWN_MILITIA, ubSector, GetWorldTotalMin(), -( MILITIA_TRAINING_COST ) ); // mark this sector sectors as being paid up SectorInfo[ ubSector ].fMilitiaTrainingPaid = TRUE; // reset done flags ResetDoneFlagForAllMilitiaTrainersInSector( ubSector ); }
BOOLEAN HasHisMineBeenProducingForPlayerForSomeTime( UINT8 ubMinerProfileId ) { UINT8 ubMineIndex; ubMineIndex = GetHeadMinersMineIndex( ubMinerProfileId ); if ( gMineStatus[ ubMineIndex ].fMineHasProducedForPlayer && ( ( GetWorldTotalMin() - gMineStatus[ ubMineIndex ].uiTimePlayerProductionStarted ) >= ( 24 * 60 ) ) ) { return ( TRUE ); } return( FALSE ); }
void ResetHistoryFact( UINT8 ubCode, INT16 sSectorX, INT16 sSectorY ) { // run through history list INT32 iOldHistoryPage = iCurrentHistoryPage; HistoryUnitPtr pList = pHistoryListHead; BOOLEAN fFound = FALSE; // set current page to before list iCurrentHistoryPage = 0; SetLastPageInHistoryRecords( ); OpenAndReadHistoryFile( ); pList = pHistoryListHead; while( pList ) { if( ( pList -> ubSecondCode == ubCode ) && ( pList->ubCode == HISTORY_QUEST_STARTED ) ) { // reset color pList -> ubColor = 0; fFound = TRUE; // save OpenAndWriteHistoryFile( ); pList = NULL; } if( fFound != TRUE ) { pList = pList->Next; } } if( fInHistoryMode ) { iCurrentHistoryPage--; // load in first page LoadNextHistoryPage( ); } SetHistoryFact( HISTORY_QUEST_FINISHED, ubCode, GetWorldTotalMin(), sSectorX, sSectorY ); return; }
void HandleIncomeFromMines( void ) { INT32 iIncome = 0; INT8 bCounter = 0; #ifndef JA2DEMO // mine each mine, check if we own it and such for( bCounter = 0; bCounter < MAX_NUMBER_OF_MINES; bCounter++ ) { // mine this mine iIncome += MineAMine( bCounter ); } if( iIncome ) { AddTransactionToPlayersBook( DEPOSIT_FROM_SILVER_MINE, 0, GetWorldTotalMin( ), iIncome ); } #endif }
BOOLEAN HandleFiredDeadMerc( SOLDIERTYPE *pSoldier ) { AddCharacterToDeadList( pSoldier ); #if 0 //if the dead merc is in the current sector if( pSoldier->sSectorX == gWorldSectorX && pSoldier->sSectorY == gWorldSectorY && pSoldier->bSectorZ == gbWorldSectorZ ) { TurnSoldierIntoCorpse( pSoldier, FALSE, FALSE ); } else { ROTTING_CORPSE_DEFINITION Corpse; // Setup some values! Corpse.ubBodyType = pSoldier->ubBodyType; Corpse.sGridNo = pSoldier->sInsertionGridNo; Corpse.dXPos = pSoldier->dXPos; Corpse.dYPos = pSoldier->dYPos; Corpse.sHeightAdjustment = pSoldier->sHeightAdjustment; SET_PALETTEREP_ID ( Corpse.HeadPal, pSoldier->HeadPal ); SET_PALETTEREP_ID ( Corpse.VestPal, pSoldier->VestPal ); SET_PALETTEREP_ID ( Corpse.SkinPal, pSoldier->SkinPal ); SET_PALETTEREP_ID ( Corpse.PantsPal, pSoldier->PantsPal ); Corpse.bDirection = pSoldier->ubDirection; // Set time of death Corpse.uiTimeOfDeath = GetWorldTotalMin( ); // Set type Corpse.ubType = (UINT8)gubAnimSurfaceCorpseID[ pSoldier->ubBodyType][ pSoldier->usAnimState ]; //Add the rotting corpse info to the sectors unloaded rotting corpse file AddRottingCorpseToUnloadedSectorsRottingCorpseFile( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ, &Corpse); } #endif return( TRUE ); }
void BoxingMovementCheck( SOLDIERTYPE * pSoldier ) { //DBrot: More Rooms //UINT8 ubRoom; UINT16 usRoom; if ( InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING) { // someone moving in/into the ring CountPeopleInBoxingRingAndDoActions(); } else if ( ( gTacticalStatus.bBoxingState == BOXING ) && ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) ) { // boxer stepped out of the ring! BoxingPlayerDisqualified( pSoldier, BOXER_OUT_OF_RING ); // add the history record here. AddHistoryToPlayersLog( HISTORY_DISQUALIFIED_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY ); // make not a boxer any more pSoldier->DeleteBoxingFlag( ); pSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL); } }
void DecideOnAssassin( void ) { UINT8 ubAssassinPossibility[NUM_ASSASSINS] = { NO_PROFILE, NO_PROFILE, NO_PROFILE, NO_PROFILE, NO_PROFILE, NO_PROFILE }; UINT8 ubAssassinsPossible = 0; UINT8 ubLoop, ubLoop2; UINT8 ubTown; #ifdef CRIPPLED_VERSION return; #endif ubTown = GetTownIdForSector( gWorldSectorX, gWorldSectorY ); for ( ubLoop = 0; ubLoop < NUM_ASSASSINS; ubLoop++ ) { // make sure alive and not placed already if ( gMercProfiles[ gubAssassins[ ubLoop ] ].bMercStatus != MERC_IS_DEAD && gMercProfiles[ gubAssassins[ ubLoop ] ].sSectorX == 0 && gMercProfiles[ gubAssassins[ ubLoop ] ].sSectorY == 0 ) { // check this merc to see if the town is a possibility for ( ubLoop2 = 0; ubLoop2 < NUM_ASSASSIN_POSSIBLE_TOWNS; ubLoop2++ ) { if ( gbAssassinTown[ ubLoop ][ ubLoop2 ] == ubTown ) { ubAssassinPossibility[ ubAssassinsPossible ] = gubAssassins[ ubLoop ]; ubAssassinsPossible++; } } } } if ( ubAssassinsPossible != 0 ) { ubLoop = ubAssassinPossibility[ Random( ubAssassinsPossible ) ]; gMercProfiles[ ubLoop ].sSectorX = gWorldSectorX; gMercProfiles[ ubLoop ].sSectorY = gWorldSectorY; AddStrategicEvent( EVENT_REMOVE_ASSASSIN, GetWorldTotalMin() + 60 * ( 3 + Random( 3 ) ), ubLoop ); } }
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 ); }
void ProcessPlayerInputActivationString( void ) { // prcess string to see if it matches activation string char charPlayerActivationString[32]; wcstombs(charPlayerActivationString,pPlayerActivationString,32); BOOLEAN freeMercSlot = TRUE; // WANNE: Check total number of hired mercs if( NumberOfMercsOnPlayerTeam() >= OUR_TEAM_SIZE_NO_VEHICLE ) { freeMercSlot = FALSE; } #ifdef JA2UB if( ( ( gGameUBOptions.LaptopIMPPassJA2 == TRUE && wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( gGameUBOptions.LaptopIMPPassJA2 == TRUE && wcscmp(pPlayerActivationString, L"xep624") == 0 ) ) || ( ( gGameUBOptions.LaptopIMPPassUB == TRUE && wcscmp(pPlayerActivationString, L"GP97SL") == 0 ) || ( gGameUBOptions.LaptopIMPPassUB == TRUE && wcscmp(pPlayerActivationString, L"gp97sl") == 0 ) ) && ( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) #else //Madd multiple imps if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) )&&( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) #endif { // WANNE: Check total number of hired mercs if( freeMercSlot == FALSE ) { DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, AimPopUpText[ AIM_MEMBER_ALREADY_HAVE_MAX_MERCS ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); return; } if (CountFilledIMPSlots(-1) < gGameOptions.ubMaxIMPCharacters) { // Kaiden: Need to reset skills, attributes and personalities with the new UB Method. ResetSkillsAttributesAndPersonality( ); ClearAllSkillsList( ); iCurrentImpPage = IMP_MAIN_PAGE; } else { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 8 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } } //Madd multiple imps else if( ( wcscmp(pPlayerActivationString, L"90210") == 0 ) && ( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) ) else if( wcscmp(pPlayerActivationString, L"90210") == 0 ) { // WANNE: Check total number of hired mercs if( freeMercSlot == FALSE ) { DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, AimPopUpText[ AIM_MEMBER_ALREADY_HAVE_MAX_MERCS ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); return; } if (CountFilledIMPSlots(-1) < gGameOptions.ubMaxIMPCharacters) { if (LoadImpCharacter( IMP_MERC_FILENAME ) == TRUE) { // Reset activation text box ResetActivationStringTextBox(); //DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 11 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex, -1 , TYPE_EMAIL_EMAIL_EDT); } } else { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 8 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } } // Madd: load characters by name else if ( ImpExists( charPlayerActivationString ) ) { // WANNE: Check total number of hired mercs if( freeMercSlot == FALSE ) { DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, AimPopUpText[ AIM_MEMBER_ALREADY_HAVE_MAX_MERCS ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); return; } if (CountFilledIMPSlots(-1) < gGameOptions.ubMaxIMPCharacters) { if (LoadImpCharacter( charPlayerActivationString ) == TRUE) { // Reset activation text box ResetActivationStringTextBox(); //DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 11 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), LaptopSaveInfo.iIMPIndex, -1 , TYPE_EMAIL_EMAIL_EDT); } } else { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 8 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } } else { #ifdef JA2UB if( ( ( gGameUBOptions.LaptopIMPPassJA2 == TRUE && wcscmp(pPlayerActivationString, L"XEP624") != 0 ) && ( gGameUBOptions.LaptopIMPPassJA2 == TRUE && wcscmp(pPlayerActivationString, L"xep624") != 0 ) ) || ( ( gGameUBOptions.LaptopIMPPassUB == TRUE && wcscmp(pPlayerActivationString, L"GP97SL") != 0 ) && ( gGameUBOptions.LaptopIMPPassUB == TRUE && wcscmp(pPlayerActivationString, L"gp97sl") != 0 ) ) ) #else if( ( ( wcscmp(pPlayerActivationString, L"XEP624") != 0 ) && ( wcscmp(pPlayerActivationString, L"xep624") != 0 ) ) ) #endif { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 0 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } else if( LaptopSaveInfo.fIMPCompletedFlag == TRUE ) { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 6 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } } return; }
// ALL changes of control to player must be funneled through here! BOOLEAN SetThisSectorAsPlayerControlled( INT16 sMapX, INT16 sMapY, INT8 bMapZ, BOOLEAN fContested ) { // NOTE: MapSector must be 16-bit, cause MAX_WORLD_X is actually 18, so the sector numbers exceed 256 although we use only 16x16 UINT16 usMapSector = 0; BOOLEAN fWasEnemyControlled = FALSE; INT8 bTownId = 0; UINT8 ubSectorID; if( AreInMeanwhile( ) ) { return FALSE; } if( bMapZ == 0 ) { usMapSector = sMapX + ( sMapY * MAP_WORLD_X ); /* // if enemies formerly controlled this sector if (StrategicMap[ usMapSector ].fEnemyControlled) { // remember that the enemies have lost it StrategicMap[ usMapSector ].fLostControlAtSomeTime = TRUE; } */ if( NumHostilesInSector( sMapX, sMapY, bMapZ ) ) { //too premature: enemies still in sector. return FALSE; } // check if we ever grabbed drassen airport, if so, set fact we can go to BR's if( ( sMapX == BOBBYR_SHIPPING_DEST_SECTOR_X ) && ( sMapY == BOBBYR_SHIPPING_DEST_SECTOR_Y ) ) { LaptopSaveInfo.fBobbyRSiteCanBeAccessed = TRUE; //If the player has been to Bobbyr when it was down, and we havent already sent email, send him an email if( LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction == BOBBYR_BEEN_TO_SITE_ONCE && LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction != BOBBYR_ALREADY_SENT_EMAIL ) { AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin()); LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction = BOBBYR_ALREADY_SENT_EMAIL; } } fWasEnemyControlled = StrategicMap[ usMapSector ].fEnemyControlled; StrategicMap[ usMapSector ].fEnemyControlled = FALSE; SectorInfo[ SECTOR( sMapX, sMapY ) ].fPlayer[ bMapZ ] = TRUE; bTownId = StrategicMap[ usMapSector ].bNameId; // check if there's a town in the sector if ((bTownId >= FIRST_TOWN) && (bTownId < NUM_TOWNS)) { // yes, start tracking (& displaying) this town's loyalty if not already doing so StartTownLoyaltyIfFirstTime( bTownId ); } // if player took control away from enemy if( fWasEnemyControlled && fContested ) { // and it's a town if ((bTownId >= FIRST_TOWN) && (bTownId < NUM_TOWNS)) { // don't do these for takeovers of Omerta sectors at the beginning of the game if ((bTownId != OMERTA) || (GetWorldDay() != 1)) { ubSectorID = (UINT8)SECTOR( sMapX, sMapY ); if( !bMapZ && ubSectorID != SEC_J9 && ubSectorID != SEC_K4 ) { HandleMoraleEvent( NULL, MORALE_TOWN_LIBERATED, sMapX, sMapY, bMapZ ); HandleGlobalLoyaltyEvent( GLOBAL_LOYALTY_GAIN_TOWN_SECTOR, sMapX, sMapY, bMapZ ); // liberation by definition requires that the place was enemy controlled in the first place CheckIfEntireTownHasBeenLiberated( bTownId, sMapX, sMapY ); } } } // if it's a mine that's still worth something if ( IsThereAMineInThisSector( sMapX, sMapY ) ) { if ( GetTotalLeftInMine( GetMineIndexForSector( sMapX, sMapY ) ) > 0) { HandleMoraleEvent( NULL, MORALE_MINE_LIBERATED, sMapX, sMapY, bMapZ ); HandleGlobalLoyaltyEvent( GLOBAL_LOYALTY_GAIN_MINE, sMapX, sMapY, bMapZ ); } } // if it's a SAM site sector if( IsThisSectorASAMSector( sMapX, sMapY, bMapZ ) ) { if ( 1 /*!GetSectorFlagStatus( sMapX, sMapY, bMapZ, SF_SECTOR_HAS_BEEN_LIBERATED_ONCE ) */) { // SAM site liberated for first time, schedule meanwhile HandleMeanWhileEventPostingForSAMLiberation( GetSAMIdFromSector( sMapX, sMapY, bMapZ ) ); } HandleMoraleEvent( NULL, MORALE_SAM_SITE_LIBERATED, sMapX, sMapY, bMapZ ); HandleGlobalLoyaltyEvent( GLOBAL_LOYALTY_GAIN_SAM, sMapX, sMapY, bMapZ ); // if Skyrider has been delivered to chopper, and already mentioned Drassen SAM site, but not used this quote yet if ( IsHelicopterPilotAvailable() && ( guiHelicopterSkyriderTalkState >= 1 ) && ( !gfSkyriderSaidCongratsOnTakingSAM ) ) { SkyRiderTalk( SAM_SITE_TAKEN ); gfSkyriderSaidCongratsOnTakingSAM = TRUE; } if ( !SectorInfo[ SECTOR( sMapX, sMapY ) ].fSurfaceWasEverPlayerControlled ) { // grant grace period if ( gGameOptions.ubDifficultyLevel >= DIF_LEVEL_HARD ) { UpdateLastDayOfPlayerActivity( ( UINT16 ) ( GetWorldDay() + 2 ) ); } else { UpdateLastDayOfPlayerActivity( ( UINT16 ) ( GetWorldDay() + 1 ) ); } } } // if it's a helicopter refueling site sector if( IsRefuelSiteInSector( sMapX, sMapY) ) { UpdateRefuelSiteAvailability( ); } // SetSectorFlag( sMapX, sMapY, bMapZ, SF_SECTOR_HAS_BEEN_LIBERATED_ONCE ); if ( bMapZ == 0 && ( ( sMapY == MAP_ROW_M && (sMapX >= 2 && sMapX <= 6) ) || sMapY == MAP_ROW_N && sMapX == 6) ) { HandleOutskirtsOfMedunaMeanwhileScene(); } } if( fContested ) { StrategicHandleQueenLosingControlOfSector( (UINT8)sMapX, (UINT8)sMapY, (UINT8)bMapZ ); } } else { if( sMapX == 3 && sMapY == 16 && bMapZ == 1 ) { //Basement sector (P3_b1) gfUseAlternateQueenPosition = TRUE; } } // also set fact the player knows they own it SectorInfo[ SECTOR( sMapX, sMapY ) ].fPlayer[ bMapZ ] = TRUE; if ( bMapZ == 0 ) { SectorInfo[ SECTOR( sMapX, sMapY ) ].fSurfaceWasEverPlayerControlled = TRUE; } //KM : Aug 11, 1999 -- Patch fix: Relocated this check so it gets called everytime a sector changes hands, // even if the sector isn't a SAM site. There is a bug _somewhere_ that fails to update the airspace, // even though the player controls it. UpdateAirspaceControl( ); // redraw map/income if in mapscreen fMapPanelDirty = TRUE; fMapScreenBottomDirty = TRUE; return fWasEnemyControlled; }
void HourlyLarryUpdate( void ) { SOLDIERTYPE * pSoldier; INT8 bSlot, bBoozeSlot; INT8 bLarryItemLoop; UINT16 usTemptation = 0; UINT16 usCashAmount; BOOLEAN fBar = FALSE; pSoldier = FindSoldierByProfileID( LARRY_NORMAL, TRUE ); if ( !pSoldier ) { pSoldier = FindSoldierByProfileID( LARRY_DRUNK, TRUE ); } if ( pSoldier ) { if ( pSoldier->bAssignment >= ON_DUTY ) { return; } if ( pSoldier->fBetweenSectors ) { return; } if ( pSoldier->bActive && pSoldier->bInSector && (gTacticalStatus.fEnemyInSector || guiCurrentScreen == GAME_SCREEN ) ) { return; } // look for items in Larry's inventory to maybe use for ( bLarryItemLoop = 0; bLarryItemLoop < NUM_LARRY_ITEMS; bLarryItemLoop++ ) { bSlot = FindObj( pSoldier, LarryItems[ bLarryItemLoop ][ 0 ] ); if ( bSlot != NO_SLOT ) { usTemptation = LarryItems[ bLarryItemLoop ][ 1 ]; break; } } // check to see if we're in a bar sector, if we are, we have access to alcohol // which may be better than anything we've got... if ( usTemptation < BAR_TEMPTATION && GetCurrentBalance() >= Item[ ALCOHOL ].usPrice ) { if ( pSoldier->bSectorZ == 0 && ( ( pSoldier->sSectorX == 13 && pSoldier->sSectorY == MAP_ROW_B) || ( pSoldier->sSectorX == 13 && pSoldier->sSectorY == MAP_ROW_C) || ( pSoldier->sSectorX == 5 && pSoldier->sSectorY == MAP_ROW_C) || ( pSoldier->sSectorX == 6 && pSoldier->sSectorY == MAP_ROW_C) || ( pSoldier->sSectorX == 5 && pSoldier->sSectorY == MAP_ROW_D) || ( pSoldier->sSectorX == 2 && pSoldier->sSectorY == MAP_ROW_H) ) ) { // in a bar! fBar = TRUE; usTemptation = BAR_TEMPTATION; } } if ( usTemptation > 0 ) { if ( pSoldier->ubProfile == LARRY_NORMAL ) { gMercProfiles[ LARRY_NORMAL ].bNPCData += (INT8) Random( usTemptation ); if ( gMercProfiles[ LARRY_NORMAL ].bNPCData >= LARRY_FALLS_OFF_WAGON ) { if ( fBar ) { // take $ from player's account usCashAmount = Item[ ALCOHOL ].usPrice; AddTransactionToPlayersBook ( TRANSFER_FUNDS_TO_MERC, pSoldier->ubProfile, GetWorldTotalMin() , -( usCashAmount ) ); // give Larry some booze and set slot etc values appropriately bBoozeSlot = FindEmptySlotWithin( pSoldier, HANDPOS, SMALLPOCK8POS ); if ( bBoozeSlot != NO_SLOT ) { // give Larry booze here CreateItem( ALCOHOL, 100, &(pSoldier->inv[bBoozeSlot]) ); } bSlot = bBoozeSlot; bLarryItemLoop = 1; } // ahhhh!!! SwapLarrysProfiles( pSoldier ); if ( bSlot != NO_SLOT ) { UseKitPoints( &(pSoldier->inv[ bSlot ]), LarryItems[ bLarryItemLoop ][ 2 ], pSoldier ); } } } else { // NB store all drunkenness info in LARRY_NORMAL profile (to use same values) // so long as he keeps consuming, keep number above level at which he cracked gMercProfiles[ LARRY_NORMAL ].bNPCData = __max( gMercProfiles[ LARRY_NORMAL ].bNPCData, LARRY_FALLS_OFF_WAGON ); gMercProfiles[ LARRY_NORMAL ].bNPCData += (INT8) Random( usTemptation ); // allow value to keep going up to 24 (about 2 days since we subtract Random( 2 ) when he has no access ) gMercProfiles[ LARRY_NORMAL ].bNPCData = __min( gMercProfiles[ LARRY_NORMAL ].bNPCData, 24 ); if ( fBar ) { // take $ from player's account usCashAmount = Item[ ALCOHOL ].usPrice; AddTransactionToPlayersBook ( TRANSFER_FUNDS_TO_MERC, pSoldier->ubProfile, GetWorldTotalMin() , -( usCashAmount ) ); // give Larry some booze and set slot etc values appropriately bBoozeSlot = FindEmptySlotWithin( pSoldier, HANDPOS, SMALLPOCK8POS ); if ( bBoozeSlot != NO_SLOT ) { // give Larry booze here CreateItem( ALCOHOL, 100, &(pSoldier->inv[bBoozeSlot]) ); } bSlot = bBoozeSlot; bLarryItemLoop = 1; } if ( bSlot != NO_SLOT ) { // ahhhh!!! UseKitPoints( &(pSoldier->inv[ bSlot ]), LarryItems[ bLarryItemLoop ][ 2 ], pSoldier ); } } } else if ( pSoldier->ubProfile == LARRY_DRUNK ) { gMercProfiles[ LARRY_NORMAL ].bNPCData -= (INT8) Random( 2 ); if ( gMercProfiles[ LARRY_NORMAL ].bNPCData <= 0 ) { // goes sober! SwapLarrysProfiles( pSoldier ); } } } }
BOOLEAN StrategicRemoveMerc( SOLDIERTYPE *pSoldier ) { UINT8 ubHistoryCode=0; if ( gfInContractMenuFromRenewSequence ) { EndCurrentContractRenewal( ); } // ATE: Determine which HISTORY ENTRY to use... if ( pSoldier->ubLeaveHistoryCode == 0 ) { // Default use contract expired reason... pSoldier->ubLeaveHistoryCode = HISTORY_MERC_CONTRACT_EXPIRED; } ubHistoryCode = pSoldier->ubLeaveHistoryCode; //if the soldier is DEAD if( pSoldier->stats.bLife <= 0 ) { AddCharacterToDeadList( pSoldier ); } //else if the merc was fired else if( ubHistoryCode == HISTORY_MERC_FIRED || pSoldier->bAssignment == ASSIGNMENT_POW ) { AddCharacterToFiredList( pSoldier ); } //The merc is leaving for some other reason else { AddCharacterToOtherList( pSoldier ); } if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__NPC ) { SetupProfileInsertionDataForSoldier( pSoldier ); } if (IsVehicle(pSoldier)) { // for some reason, vehicles have their own idea of handling group ids RemovePlayerFromGroup(pVehicleList[ pSoldier->bVehicleID ].ubMovementGroup, pSoldier); } //remove him from the soldier structure if( pSoldier->bAssignment >= ON_DUTY ) { // is he/she in a mvt group, if so, remove and destroy the group if( pSoldier->ubGroupID ) { if ( pSoldier->bAssignment != VEHICLE ) { //Can only remove groups if they aren't persistant (not in a squad or vehicle) RemoveGroup( pSoldier->ubGroupID ); } else { // remove him from any existing merc slot he could be in RemoveMercSlot( pSoldier ); TakeSoldierOutOfVehicle( pSoldier ); } } } else { RemoveCharacterFromSquads( pSoldier ); } // if the merc is not dead if( gMercProfiles[ pSoldier->ubProfile ].bMercStatus != MERC_IS_DEAD ) { //Set the status to returning home ( delay the merc for rehire ) gMercProfiles[ pSoldier->ubProfile ].bMercStatus = MERC_RETURNING_HOME; // specify how long the merc will continue to be unavailable gMercProfiles[ pSoldier->ubProfile ].uiDayBecomesAvailable = 1 + Random(2); // 1-2 days HandleSoldierLeavingWithLowMorale( pSoldier ); HandleSoldierLeavingForAnotherContract( pSoldier ); } //add an entry in the history page for the firing/quiting of the merc // ATE: Don't do this if they are already dead! if ( !( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) { AddHistoryToPlayersLog( ubHistoryCode, pSoldier->ubProfile, GetWorldTotalMin(), pSoldier->sSectorX, pSoldier->sSectorY ); } //if the merc was a POW, remember it becuase the merc cant show up in AIM or MERC anymore if( pSoldier->bAssignment == ASSIGNMENT_POW ) { gMercProfiles[ pSoldier->ubProfile ].bMercStatus = MERC_FIRED_AS_A_POW; } //else the merc CAN get his medical deposit back else { //Determine how much of a Medical deposit is going to be refunded to the player CalculateMedicalDepositRefund( pSoldier ); } //remove the merc from the tactical TacticalRemoveSoldier( pSoldier->ubID ); // Check if we should remove loaded world... CheckAndHandleUnloadingOfCurrentWorld(); if ( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) { ReBuildCharactersList( ); } fMapPanelDirty = TRUE; fTeamPanelDirty = TRUE; fCharacterInfoPanelDirty = TRUE; // stop time compression so player can react to the departure StopTimeCompression(); // WDS: This allows for replacing dead IMP mercs. See "BtnIMPBeginScreenDoneCallback" in "IMP Begin Screen.cpp" if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__PLAYER_CHARACTER ) && ( gMercProfiles[ pSoldier->ubProfile ].bMercStatus == MERC_IS_DEAD ) ) { // Replace the name with an empty string wcsncpy( gMercProfiles[ pSoldier->ubProfile ].zName, L"", 1 ); } // ATE: update team panels.... UpdateTeamPanelAssignments( ); // And unpause the @#$@#$ interface UnLockPauseState(); UnPauseGame(); if (is_client) send_dismiss(pSoldier->ubID); return( TRUE ); }
void PlayerSpokeToHeadMiner( UINT8 ubMinerProfileId ) { UINT8 ubMineIndex; ubMineIndex = GetHeadMinersMineIndex( ubMinerProfileId ); // if this is our first time set a history fact if( gMineStatus[ ubMineIndex ].fSpokeToHeadMiner == FALSE ) { AddHistoryToPlayersLog( HISTORY_TALKED_TO_MINER, gMineLocation[ ubMineIndex ].bAssociatedTown, GetWorldTotalMin( ), gMineLocation[ ubMineIndex ].sSectorX, gMineLocation[ ubMineIndex ].sSectorY ); gMineStatus[ ubMineIndex ].fSpokeToHeadMiner = TRUE; } }
// This is used only to EXTEND the contract of an AIM merc already on the team BOOLEAN MercContractHandling( SOLDIERTYPE *pSoldier, UINT8 ubDesiredAction ) { INT32 iContractCharge=0; INT32 iContractLength=0; UINT8 ubHistoryContractType=0; UINT8 ubFinancesContractType=0; INT32 iCostOfInsurance = 0; //determins what kind of merc the contract is being extended for (only aim mercs can extend contract) if( pSoldier->ubWhatKindOfMercAmI != MERC_TYPE__AIM_MERC ) return(FALSE); switch( ubDesiredAction ) { case CONTRACT_EXTEND_1_DAY: //check to see if the merc has enough money iContractCharge = gMercProfiles[ pSoldier->ubProfile ].sSalary; //set the contract length and the charge iContractLength = 1; ubHistoryContractType = HISTORY_EXTENDED_CONTRACT_1_DAY; ubFinancesContractType = EXTENDED_CONTRACT_BY_1_DAY; break; case CONTRACT_EXTEND_1_WEEK: iContractCharge = gMercProfiles[ pSoldier->ubProfile ].uiWeeklySalary; //set the contract length and the charge iContractLength = 7; ubHistoryContractType = HISTORY_EXTENDED_CONTRACT_1_WEEK; ubFinancesContractType = EXTENDED_CONTRACT_BY_1_WEEK; break; case CONTRACT_EXTEND_2_WEEK: iContractCharge = gMercProfiles[ pSoldier->ubProfile ].uiBiWeeklySalary; //set the contract length and the charge iContractLength = 14; ubHistoryContractType = HISTORY_EXTENDED_CONTRACT_2_WEEK; ubFinancesContractType = EXTENDED_CONTRACT_BY_2_WEEKS; break; default: return(FALSE); break; } //check to see if the merc has enough money if( LaptopSaveInfo.iCurrentBalance < iContractCharge ) return(FALSE); //Check to see if merc will renew if( !WillMercRenew( pSoldier, TRUE ) ) { // Remove soldier.... ( if this is setup because normal contract ending dequence... ) if ( ContractIsExpiring( pSoldier ) ) { TacticalCharacterDialogueWithSpecialEvent( pSoldier, 0, DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING, 1,0 ); } return(FALSE); } fPausedTimeDuringQuote = TRUE; SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,1 ,MAP_SCREEN ,0 ,0 ,0 ); // // These calcs need to be done before Getting/Calculating the insurance costs // //set the contract length and the charge pSoldier->iTotalContractLength += iContractLength; // pSoldier->iTotalContractCharge = iContractCharge; pSoldier->bTypeOfLastContract = ubDesiredAction; //determine the end of the contract pSoldier->iEndofContractTime += ( iContractLength * 1440 ); if( ( pSoldier->usLifeInsurance ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) ) // DEF: Removed cause they can extend a 1 day contract && ( iContractLength > 1 ) { // check if player can afford insurance, if not, tell them iCostOfInsurance = CalculateInsuranceContractCost( iContractLength, pSoldier->ubProfile ); HandleImportantMercQuote( pSoldier, QUOTE_ACCEPT_CONTRACT_RENEWAL ); if( iCostOfInsurance > LaptopSaveInfo.iCurrentBalance ) { // no can afford HandleNotifyPlayerCantAffordInsurance( ); // OK, handle ending of renew session if ( gfInContractMenuFromRenewSequence ) { EndCurrentContractRenewal( ); } } else { // can afford ask if they want it HandleNotifyPlayerCanAffordInsurance( pSoldier, ( UINT8 )( iContractLength ), iCostOfInsurance ); } } else { // no need to query for life insurance HandleImportantMercQuote( pSoldier, QUOTE_ACCEPT_CONTRACT_RENEWAL ); // OK, handle ending of renew session if ( gfInContractMenuFromRenewSequence ) { EndCurrentContractRenewal( ); } } SpecialCharacterDialogueEvent( DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE,0 ,MAP_SCREEN ,0 ,0 ,0 ); // ATE: Setup when they can be signed again! // If they are 2-weeks this can be extended // otherwise don't change from current if ( pSoldier->bTypeOfLastContract == CONTRACT_EXTEND_2_WEEK ) { pSoldier->iTimeCanSignElsewhere = pSoldier->iEndofContractTime; } // ARM: Do not reset because of renewal! The quote is for early dismissal from *initial* time of hiring // pSoldier->uiTimeOfLastContractUpdate = GetWorldTotalMin(); // ARM: Do not reset because of renewal! The deposit in the profile goes up when merc levels, but the one in the soldier // structure must always reflect the deposit actually paid (which does NOT change when a merc levels). // pSoldier->usMedicalDeposit = gMercProfiles[ pSoldier->ubProfile ].sMedicalDepositAmount; //add an entry in the finacial page for the extending of the mercs contract AddTransactionToPlayersBook( ubFinancesContractType, pSoldier->ubProfile, GetWorldTotalMin(), -iContractCharge ); //add an entry in the history page for the extending of the merc contract AddHistoryToPlayersLog( ubHistoryContractType, pSoldier->ubProfile, GetWorldTotalMin(), pSoldier->sSectorX, pSoldier->sSectorY ); return( TRUE ); }
UINT32 ExtractOreFromMine( INT8 bMineIndex, UINT32 uiAmount ) { // will remove the ore from the mine and return the amount that was removed UINT32 uiAmountExtracted = 0; UINT32 uiOreRunningOutPoint = 0; INT16 sSectorX, sSectorY; Assert( ( bMineIndex >= 0 ) && ( bMineIndex < MAX_NUMBER_OF_MINES ) ); // if mine is shut down if ( gMineStatus[ bMineIndex ].fShutDown) { return ( 0 ); } // if not capable of extracting anything, bail now if (uiAmount == 0) { return ( 0 ); } // will this exhaust the ore in this mine? if( uiAmount >= gMineStatus[ bMineIndex ].uiRemainingOreSupply ) { // exhaust remaining ore uiAmountExtracted = gMineStatus[ bMineIndex ].uiRemainingOreSupply; gMineStatus[ bMineIndex ].uiRemainingOreSupply = 0; gMineStatus[ bMineIndex ].uiMaxRemovalRate = 0; gMineStatus[ bMineIndex ].fEmpty = TRUE; gMineStatus[ bMineIndex ].fRunningOut = FALSE; // tell the strategic AI about this, that mine's and town's value is greatly reduced GetMineSector( bMineIndex, &sSectorX, &sSectorY ); StrategicHandleMineThatRanOut( ( UINT8 ) SECTOR( sSectorX, sSectorY ) ); AddHistoryToPlayersLog( HISTORY_MINE_RAN_OUT, gMineLocation[ bMineIndex ].bAssociatedTown, GetWorldTotalMin( ), gMineLocation[ bMineIndex ].sSectorX, gMineLocation[ bMineIndex ].sSectorY ); } else // still some left after this extraction { // set amount used, and decrement ore remaining in mine uiAmountExtracted = uiAmount; gMineStatus[ bMineIndex ].uiRemainingOreSupply -= uiAmount; // one of the mines (randomly chosen) will start running out eventually, check if we're there yet if (gMineStatus[ bMineIndex ].uiRemainingOreSupply < gMineStatus[ bMineIndex ].uiOreRunningOutPoint) { gMineStatus[ bMineIndex ].fRunningOut = TRUE; // round all fractions UP to the next REMOVAL_RATE_INCREMENT gMineStatus[ bMineIndex ].uiMaxRemovalRate = (UINT32) (((FLOAT) gMineStatus[ bMineIndex ].uiRemainingOreSupply / 10) / REMOVAL_RATE_INCREMENT + 0.9999) * REMOVAL_RATE_INCREMENT; // if we control it if (PlayerControlsMine(bMineIndex)) { // and haven't yet been warned that it's running out if (!gMineStatus[ bMineIndex ].fWarnedOfRunningOut) { // that mine's head miner tells player that the mine is running out IssueHeadMinerQuote( bMineIndex, HEAD_MINER_STRATEGIC_QUOTE_RUNNING_OUT ); gMineStatus[ bMineIndex ].fWarnedOfRunningOut = TRUE; AddHistoryToPlayersLog( HISTORY_MINE_RUNNING_OUT, gMineLocation[ bMineIndex ].bAssociatedTown, GetWorldTotalMin( ), gMineLocation[ bMineIndex ].sSectorX, gMineLocation[ bMineIndex ].sSectorY ); } } } } return( uiAmountExtracted ); }
void CalculateMedicalDepositRefund( SOLDIERTYPE *pSoldier ) { INT32 iRefundAmount=0; //if the merc didnt have any medical deposit, exit if( !gMercProfiles[ pSoldier->ubProfile ].bMedicalDeposit ) return; //if the merc is at full health, refund the full medical deposit if( pSoldier->stats.bLife == pSoldier->stats.bLifeMax ) { //add an entry in the finacial page for the FULL refund of the medical deposit // use the medical deposit in pSoldier, not in profile, which goes up with leveling AddTransactionToPlayersBook(FULL_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), pSoldier->usMedicalDeposit ); //add an email #ifdef JA2UB //no UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) AddEmailWithSpecialData( 27, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L2 ); } #else AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_REFUND, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); #endif } //else if the merc is a dead, refund NOTHING!! else if( pSoldier->stats.bLife <= 0 ) { //add an entry in the finacial page for NO refund of the medical deposit //AddTransactionToPlayersBook( NO_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), 0 ); //add an email #ifdef JA2UB //no UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) AddEmailWithSpecialData( 217, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L3 ); } #else AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_NO_REFUND, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); #endif } //else the player is injured, refund a partial amount else { // use the medical deposit in pSoldier, not in profile, which goes up with leveling iRefundAmount = (INT32) ( ( pSoldier->stats.bLife / ( FLOAT ) pSoldier->stats.bLifeMax ) * pSoldier->usMedicalDeposit + 0.5 ); //add an entry in the finacial page for a PARTIAL refund of the medical deposit AddTransactionToPlayersBook( PARTIAL_MEDICAL_REFUND, pSoldier->ubProfile, GetWorldTotalMin(), iRefundAmount ); //add an email #ifdef JA2UB // no UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) AddEmailWithSpecialData( 214, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L4 ); } #else AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); #endif } }
INT32 MineAMine( INT8 bMineIndex ) { // will extract ore based on available workforce, and increment players income based on amount INT8 bMineType = 0; INT32 iAmtExtracted = 0; Assert( ( bMineIndex >= 0 ) && ( bMineIndex < MAX_NUMBER_OF_MINES ) ); // is mine is empty if( gMineStatus[ bMineIndex ].fEmpty) { return 0; } // if mine is shut down if ( gMineStatus[ bMineIndex ].fShutDown) { return 0; } // who controls the PRODUCTION in the mine ? (Queen receives production unless player has spoken to the head miner) if( PlayerControlsMine(bMineIndex) ) { // player controlled iAmtExtracted = ExtractOreFromMine( bMineIndex , GetCurrentWorkRateOfMineForPlayer( bMineIndex ) ); // SHOW ME THE MONEY!!!! if( iAmtExtracted > 0 ) { // debug message // ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"%s - Mine income from %s = $%d", WORLDTIMESTR, pTownNames[ GetTownAssociatedWithMine( bMineIndex ) ], iAmtExtracted ); // check type of mine bMineType = gMineStatus[ bMineIndex ].ubMineType; // if this is the first time this mine has produced income for the player in the game if ( !gMineStatus[ bMineIndex ].fMineHasProducedForPlayer ) { // remember that we've earned income from this mine during the game gMineStatus[ bMineIndex ].fMineHasProducedForPlayer = TRUE; // and when we started to do so... gMineStatus[ bMineIndex ].uiTimePlayerProductionStarted = GetWorldTotalMin(); } } } else // queen controlled { // we didn't want mines to run out without player ever even going to them, so now the queen doesn't reduce the // amount remaining until the mine has produced for the player first (so she'd have to capture it). if ( gMineStatus[ bMineIndex ].fMineHasProducedForPlayer ) { // don't actually give her money, just take production away iAmtExtracted = ExtractOreFromMine( bMineIndex , GetCurrentWorkRateOfMineForEnemy( bMineIndex ) ); } } return iAmtExtracted; }
void ShutOffMineProduction( INT8 bMineIndex ) { Assert( ( bMineIndex >= 0 ) && ( bMineIndex < MAX_NUMBER_OF_MINES ) ); if ( !gMineStatus[ bMineIndex ].fShutDown ) { gMineStatus[ bMineIndex ].fShutDown = TRUE; AddHistoryToPlayersLog( HISTORY_MINE_SHUTDOWN, gMineLocation[ bMineIndex ].bAssociatedTown, GetWorldTotalMin( ), gMineLocation[ bMineIndex ].sSectorX, gMineLocation[ bMineIndex ].sSectorY ); } }
void RestartMineProduction( INT8 bMineIndex ) { Assert( ( bMineIndex >= 0 ) && ( bMineIndex < MAX_NUMBER_OF_MINES ) ); if ( !gMineStatus[ bMineIndex ].fShutDownIsPermanent ) { if ( gMineStatus[ bMineIndex ].fShutDown ) { gMineStatus[ bMineIndex ].fShutDown = FALSE; AddHistoryToPlayersLog( HISTORY_MINE_REOPENED, gMineLocation[ bMineIndex ].bAssociatedTown, GetWorldTotalMin( ), gMineLocation[ bMineIndex ].sSectorX, gMineLocation[ bMineIndex ].sSectorY ); } } }
// MercDailyUpdate() gets called every day at midnight. If something is to happen to a merc that day, add an event for it. void MercDailyUpdate() { INT32 cnt; INT8 bLastTeamID; SOLDIERTYPE *pSoldier; //SOLDIERTYPE *pQuitList[ 21 ]; MERCPROFILESTRUCT *pProfile; UINT32 uiChance; INT32 iOffset = 0; BOOLEAN fFoundSomeOneForMenuShowing = FALSE; //if its the first day, leave if( GetWorldDay() == 1 ) return; // debug message ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"%s - Doing MercDailyUpdate", WORLDTIMESTR ); // if the death rate is very low (this is independent of mercs' personal deathrate tolerances) if (CalcDeathRate() < 5) { // everyone gets a morale bonus, which also gets player a reputation bonus. HandleMoraleEvent( NULL, MORALE_LOW_DEATHRATE, -1, -1, -1 ); } //add an event so the merc will say the departing warning ( 2 hours prior to leaving // Do so for all time slots they will depart from AddSameDayStrategicEvent( EVENT_MERC_ABOUT_TO_LEAVE, MERC_ARRIVE_TIME_SLOT_1 - ( 2 * 60 ), 0 ); AddSameDayStrategicEvent( EVENT_MERC_ABOUT_TO_LEAVE, MERC_ARRIVE_TIME_SLOT_2 - ( 2 * 60 ), 0 ); AddSameDayStrategicEvent( EVENT_MERC_ABOUT_TO_LEAVE, MERC_ARRIVE_TIME_SLOT_3 - ( 2 * 60 ), 0 ); AddSameDayStrategicEvent( EVENT_BEGIN_CONTRACT_RENEWAL_SEQUENCE, MERC_ARRIVE_TIME_SLOT_1, 0 ); AddSameDayStrategicEvent( EVENT_BEGIN_CONTRACT_RENEWAL_SEQUENCE, MERC_ARRIVE_TIME_SLOT_2, 0 ); AddSameDayStrategicEvent( EVENT_BEGIN_CONTRACT_RENEWAL_SEQUENCE, MERC_ARRIVE_TIME_SLOT_3, 0 ); cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID; //loop though all the mercs for ( pSoldier = MercPtrs[ cnt ]; cnt <= bLastTeamID; cnt++,pSoldier++) { //if the merc is active if ( ( pSoldier->bActive )&&( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != IN_TRANSIT ) ) { //CJC: Reset dialogue flags for quotes that can be said once/day pSoldier->usQuoteSaidFlags &= ( ~SOLDIER_QUOTE_SAID_ANNOYING_MERC ); // ATE: Reset likes gun flag pSoldier->usQuoteSaidFlags &= ( ~SOLDIER_QUOTE_SAID_LIKESGUN ); // ATE: Reset seen corpse flag pSoldier->usQuoteSaidFlags &= ( ~SOLDIER_QUOTE_SAID_ROTTINGCORPSE ); // ATE; Reset found something nice flag... pSoldier->usQuoteSaidFlags &= ( ~SOLDIER_QUOTE_SAID_FOUND_SOMETHING_NICE ); // ATE: Decrement tolerance value... pSoldier->bCorpseQuoteTolerance--; if ( pSoldier->bCorpseQuoteTolerance < 0 ) { pSoldier->bCorpseQuoteTolerance = 0; } // CJC: For some personalities, reset personality quote said flag if ( pSoldier->ubProfile != NO_PROFILE ) { switch( gMercProfiles[ pSoldier->ubProfile ].bPersonalityTrait ) { case HEAT_INTOLERANT: case CLAUSTROPHOBIC: case NONSWIMMER: case FEAR_OF_INSECTS: // repeatable once per day pSoldier->usQuoteSaidFlags &= ( ~SOLDIER_QUOTE_SAID_PERSONALITY ); break; default: break; } } //ATE: Try to see if our equipment sucks! if ( SoldierHasWorseEquipmentThanUsedTo( pSoldier ) ) { // Randomly anytime between 6:00, and 10:00 AddSameDayStrategicEvent( EVENT_MERC_COMPLAIN_EQUIPMENT, 360 + Random( 1080 ) , pSoldier->ubProfile ); } // increment days served by this grunt gMercProfiles[pSoldier->ubProfile].usTotalDaysServed++; // player has hired him, so he'll eligible to get killed off on another job gMercProfiles[pSoldier->ubProfile].ubMiscFlags3 |= PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE; //if the character is an RPC if( pSoldier->ubProfile >= FIRST_RPC && pSoldier->ubProfile < FIRST_NPC ) { INT16 sSalary = gMercProfiles[ pSoldier->ubProfile ].sSalary; INT32 iMoneyOwedToMerc = 0; //increment the number of days the mercs has been on the team pSoldier->iTotalContractLength++; //if the player owes the npc money, the balance field will be negative if( gMercProfiles[ pSoldier->ubProfile ].iBalance < 0 ) { //the player owes the npc the salary and whatever money the player owes the npc iMoneyOwedToMerc = sSalary + ( - gMercProfiles[ pSoldier->ubProfile ].iBalance ); } else { //else the player only owes the salary iMoneyOwedToMerc = sSalary; } //if the player owes money if( iMoneyOwedToMerc != 0 ) { //if the player can afford to pay them if( LaptopSaveInfo.iCurrentBalance >= iMoneyOwedToMerc ) { //add the transaction to the player AddTransactionToPlayersBook( PAYMENT_TO_NPC, pSoldier->ubProfile, GetWorldTotalMin(), -iMoneyOwedToMerc); //if the player owed money to the npc if( gMercProfiles[ pSoldier->ubProfile ].iBalance < 0 ) { // reset the amount gMercProfiles[ pSoldier->ubProfile ].iBalance = 0; } } else { CHAR16 zMoney[128]; //create a string for the salary owed to the npc swprintf( zMoney, L"%d", sSalary ); InsertCommasForDollarFigure( zMoney ); InsertDollarSignInToString( zMoney ); //Display a screen msg indicating that the npc was NOT paid ScreenMsg( FONT_MCOLOR_WHITE, MSG_INTERFACE, pMessageStrings[ MSG_CANT_AFFORD_TO_PAY_NPC_DAILY_SALARY_MSG ], gMercProfiles[ pSoldier->ubProfile ].zNickname, zMoney ); //if the merc hasnt been paid for NUM_DAYS_TILL_UNPAID_RPC_QUITS days, the merc will quit if( ( gMercProfiles[ pSoldier->ubProfile ].iBalance - sSalary ) <= -( sSalary * NUM_DAYS_TILL_UNPAID_RPC_QUITS ) ) { // //Set it up so the merc quits // MercsContractIsFinished( pSoldier->ubID ); } else { //set how much money the player owes the merc gMercProfiles[ pSoldier->ubProfile ].iBalance -= sSalary; // Add even for displaying a dialogue telling the player this.... AddSameDayStrategicEvent( EVENT_RPC_WHINE_ABOUT_PAY, MERC_ARRIVE_TIME_SLOT_1, pSoldier->ubID ); } } } } DailyMoraleUpdate( pSoldier ); CheckIfMercGetsAnotherContract( pSoldier ); } else { if( ( pSoldier->bActive ) && ( pSoldier->bAssignment == ASSIGNMENT_POW ) ) { pSoldier->iEndofContractTime += 1440; } } // if active, here, & alive (POW is ok, don't care) if( ( pSoldier->bActive ) && ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) && ( pSoldier->bAssignment != IN_TRANSIT ) ) { // increment the "man days" played counter for each such merc in the player's employment gStrategicStatus.uiManDaysPlayed++; } } //r eset the counter cnt = 0; for ( pSoldier = MercPtrs[ cnt ]; cnt <= bLastTeamID; cnt++,pSoldier++) { //if the merc is active if ( ( pSoldier->bActive )&&( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != IN_TRANSIT ) ) { //if its a MERC merc, determine if the merc should leave ( because player refused to pay for merc ) if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC ) { //if the players account status is invalid if( LaptopSaveInfo.gubPlayersMercAccountStatus == MERC_ACCOUNT_INVALID ) { //if the soldier is alive anc concious if( IsTheSoldierAliveAndConcious( pSoldier ) ) { //if the merc should leave today MercsContractIsFinished( pSoldier->ubID ); } } } } } //Loop through all the profiles for( cnt = 0; cnt < NUM_PROFILES; cnt++) { pProfile = &(gMercProfiles[ cnt ]); // dead guys don't do nuthin' ! if ( pProfile->bMercStatus == MERC_IS_DEAD ) { continue; } //Every day reset this variable pProfile->uiPrecedentQuoteSaid = 0; // skip anyone currently on the player's team if ( IsMercOnTeam( (UINT8) cnt )) { continue; } // if he's an AIM/M.E.R.C. merc if ( cnt < AIM_AND_MERC_MERCS ) { // if he's not just on his way home if ( pProfile->bMercStatus != MERC_RETURNING_HOME ) { // check if any of his stats improve through working or training HandleUnhiredMercImprovement(pProfile); // if he's working on another job if (pProfile->bMercStatus == MERC_WORKING_ELSEWHERE) { // check if he's killed HandleUnhiredMercDeaths( cnt ); } } } // if merc is currently unavailable if( pProfile->uiDayBecomesAvailable > 0 ) { // reduce time til available by one day pProfile->uiDayBecomesAvailable--; // Check to see if the merc has become available if (pProfile->uiDayBecomesAvailable == 0) { //if the merc CAN become ready if( pProfile->bMercStatus != MERC_FIRED_AS_A_POW ) { pProfile->bMercStatus = MERC_OK; // if the player has left a message for this merc if ( pProfile->ubMiscFlags3 & PROFILE_MISC_FLAG3_PLAYER_LEFT_MSG_FOR_MERC_AT_AIM ) { iOffset = AIM_REPLY_BARRY; //remove the Flag, so if the merc goes on another assignment, the player can leave an email. pProfile->ubMiscFlags3 &= ~PROFILE_MISC_FLAG3_PLAYER_LEFT_MSG_FOR_MERC_AT_AIM; // TO DO: send E-mail to player telling him the merc has returned from an assignment AddEmail( ( UINT8 )( iOffset + ( cnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + cnt ), GetWorldTotalMin() ); } } } } else // was already available today { // if it's an AIM or M.E.R.C. merc if (cnt < AIM_AND_MERC_MERCS) { // check to see if he goes on another assignment if (cnt < MAX_NUMBER_MERCS) { // A.I.M. merc uiChance = 2 * pProfile->bExpLevel; // player has now had a chance to hire him, so he'll eligible to get killed off on another job pProfile->ubMiscFlags3 |= PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE; } else { // M.E.R.C. merc - very rarely get other work uiChance = 1 * pProfile->bExpLevel; // player doesn't have a chance to hire any M.E.R.C's until after Speck's E-mail is sent if (GetWorldDay() > DAYS_TIL_M_E_R_C_AVAIL) { // player has now had a chance to hire him, so he'll eligible to get killed off on another job pProfile->ubMiscFlags3 |= PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE; } } if (Random(100) < uiChance) { pProfile->bMercStatus = MERC_WORKING_ELSEWHERE; pProfile->uiDayBecomesAvailable = 1 + Random(6 + (pProfile->bExpLevel / 2) ); // 1-(6 to 11) days } } } // Decrement morale hangover (merc appears hirable, he just gives lame refusals during this time, though) if( pProfile->ubDaysOfMoraleHangover > 0 ) { pProfile->ubDaysOfMoraleHangover--; } } // build quit list //BuildMercQuitList( pQuitList ); HandleSlayDailyEvent( ); // rebuild list for mapscreen ReBuildCharactersList( ); }
BOOLEAN RecruitRPC( UINT8 ubCharNum ) { SOLDIERTYPE *pSoldier, *pNewSoldier; // Get soldier pointer pSoldier = FindSoldierByProfileID( ubCharNum, FALSE ); if (!pSoldier) { return( FALSE ); } // OK, set recruit flag.. gMercProfiles[ ubCharNum ].ubMiscFlags |= PROFILE_MISC_FLAG_RECRUITED; // Add this guy to our team! pNewSoldier = ChangeSoldierTeam( pSoldier, gbPlayerNum ); // handle set up any RPC's that will leave us in time if ( ubCharNum == SLAY ) { // slay will leave in a week pNewSoldier->iEndofContractTime = GetWorldTotalMin() + ( 7 * 24 * 60 ); KickOutWheelchair( pNewSoldier ); } else if ( ubCharNum == DYNAMO && gubQuest[ QUEST_FREE_DYNAMO ] == QUESTINPROGRESS ) { EndQuest( QUEST_FREE_DYNAMO, pSoldier->sSectorX, pSoldier->sSectorY ); } // handle town loyalty adjustment HandleTownLoyaltyForNPCRecruitment( pNewSoldier ); // Try putting them into the current squad if ( AddCharacterToSquad( pNewSoldier, (INT8)CurrentSquad( ) ) == FALSE ) { AddCharacterToAnySquad( pNewSoldier ); } ResetDeadSquadMemberList( pNewSoldier->bAssignment ); DirtyMercPanelInterface( pNewSoldier, DIRTYLEVEL2 ); if ( pNewSoldier->inv[ HANDPOS ].usItem == NOTHING ) { // empty handed - swap in first available weapon INT8 bSlot; bSlot = FindObjClass( pNewSoldier, IC_WEAPON ); if ( bSlot != NO_SLOT ) { if ( Item[ pNewSoldier->inv[ bSlot ].usItem ].fFlags & ITEM_TWO_HANDED ) { if ( bSlot != SECONDHANDPOS && pNewSoldier->inv[ SECONDHANDPOS ].usItem != NOTHING ) { // need to move second hand item out first AutoPlaceObject( pNewSoldier, &(pNewSoldier->inv[ SECONDHANDPOS ]), FALSE ); } } // swap item to hand SwapObjs( &(pNewSoldier->inv[ bSlot ]), &(pNewSoldier->inv[ HANDPOS ]) ); } } #ifdef JA2DEMO HandleEndDemoInCreatureLevel( ); #endif if ( ubCharNum == IRA ) { // trigger 0th PCscript line TriggerNPCRecord( IRA, 0 ); } // Set whatkind of merc am i pNewSoldier->ubWhatKindOfMercAmI = MERC_TYPE__NPC; // //add a history log that tells the user that a npc has joined the team // // ( pass in pNewSoldier->sSectorX cause if its invalid, -1, n/a will appear as the sector in the history log ) AddHistoryToPlayersLog( HISTORY_RPC_JOINED_TEAM, pNewSoldier->ubProfile, GetWorldTotalMin(), pNewSoldier->sSectorX, pNewSoldier->sSectorY ); //remove the merc from the Personnel screens departed list ( if they have never been hired before, its ok to call it ) RemoveNewlyHiredMercFromPersonnelDepartedList( pSoldier->ubProfile ); return( TRUE ); }
BOOLEAN InitNewGame( BOOLEAN fReset ) { INT32 iStartingCash; // static fScreenCount = 0; if( fReset ) { gubScreenCount = 0; return( TRUE ); } // reset meanwhile flags uiMeanWhileFlags = 0; // Reset the selected soldier gusSelectedSoldier = NOBODY; if( gubScreenCount == 0 ) { if( !LoadMercProfiles() ) return(FALSE); } //Initialize the Arms Dealers and Bobby Rays inventory if( gubScreenCount == 0 ) { //Init all the arms dealers inventory InitAllArmsDealers(); InitBobbyRayInventory(); } // clear tactical ClearTacticalMessageQueue( ); // clear mapscreen messages FreeGlobalMessageList(); #ifdef JA2DEMO // IF our first time, go into laptop! InitStrategicLayer(); // Hire demo mercs.... #if defined ( JA2TESTVERSION ) || defined ( JA2DEMO ) DemoHiringOfMercs( ); #endif // Setup initial money AddTransactionToPlayersBook( ANONYMOUS_DEPOSIT, 0, GetWorldTotalMin(), 20500 ); #ifdef GERMAN //The different mercs are slightly more expensive. This adds that difference. AddTransactionToPlayersBook( ANONYMOUS_DEPOSIT, 0, GetWorldTotalMin(), 1075 ); #endif if ( !SetCurrentWorldSector( 1, 16, 0 ) ) { } SetLaptopExitScreen( MAP_SCREEN ); FadeInGameScreen( ); EnterTacticalScreen( ); #else // IF our first time, go into laptop! if ( gubScreenCount == 0 ) { //Init the laptop here InitLaptopAndLaptopScreens(); InitStrategicLayer(); // Set new game flag SetLaptopNewGameFlag( ); // this is for the "mercs climbing down from a rope" animation, NOT Skyrider!! ResetHeliSeats( ); // Setup two new messages! AddPreReadEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin() ); AddPreReadEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin() ); AddPreReadEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin() ); AddPreReadEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin() ); AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin() ); //AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin() ); // ATE: Set starting cash.... switch( gGameOptions.ubDifficultyLevel ) { case DIF_LEVEL_EASY: iStartingCash = 45000; break; case DIF_LEVEL_MEDIUM: iStartingCash = 35000; break; case DIF_LEVEL_HARD: iStartingCash = 30000; break; default: Assert(0); return( FALSE ); } // Setup initial money AddTransactionToPlayersBook( ANONYMOUS_DEPOSIT, 0, GetWorldTotalMin(), iStartingCash ); { UINT32 uiDaysTimeMercSiteAvailable = Random( 2 ) + 1; // schedule email for message from spec at 7am 3 days in the future AddFutureDayStrategicEvent( EVENT_DAY3_ADD_EMAIL_FROM_SPECK, 60*7, 0, uiDaysTimeMercSiteAvailable ); } #ifdef CRIPPLED_VERSION { UINT32 cnt; //loop through the first 20 AIM mercs and set them to be away for( cnt = 0; cnt < 20; cnt++) { gMercProfiles[ cnt ].bMercStatus = MERC_WORKING_ELSEWHERE; gMercProfiles[ cnt ].uiDayBecomesAvailable = 14; // 14 days should be ok considering crippled version only goes to day 7 } } //Add an event to check for the end of the crippled version AddEveryDayStrategicEvent( EVENT_CRIPPLED_VERSION_END_GAME_CHECK, 0, 0 ); #endif SetLaptopExitScreen( INIT_SCREEN ); SetPendingNewScreen(LAPTOP_SCREEN); gubScreenCount = 1; //Set the fact the game is in progress gTacticalStatus.fHasAGameBeenStarted = TRUE; return( TRUE ); } /* if( ( guiExitScreen == MAP_SCREEN ) && ( LaptopSaveInfo.gfNewGameLaptop ) ) { SetLaptopExitScreen( GAME_SCREEN ); return( TRUE ); } */ if ( gubScreenCount == 1 ) { // OK , FADE HERE //BeginFade( INIT_SCREEN, 35, FADE_OUT_REALFADE, 5 ); //BeginFade( INIT_SCREEN, 35, FADE_OUT_VERSION_FASTER, 25 ); //BeginFade( INIT_SCREEN, 35, FADE_OUT_VERSION_SIDE, 0 ); gubScreenCount = 2; return( TRUE ); } /* if ( gubScreenCount == 2 ) { if ( !SetCurrentWorldSector( 9, 1, 0 ) ) { } SetLaptopExitScreen( MAP_SCREEN ); FadeInGameScreen( ); EnterTacticalScreen( ); if( gfAtLeastOneMercWasHired == TRUE ) { gubScreenCount = 3; } else { } return( TRUE ); } */ #endif return( TRUE ); }