Files
source/Tactical/Tactical Turns.cpp
T
Kriplo f5ac5be03f Brief: //dnl ch68
- Magically appeared reinforcements for enemy and militia just turn after they are called from now could be delayed and randomized.
Details:
- Practically all enemy reinforcement which can populate available slots was always appeared next turn after they are called so now we have game settings under "Strategic Gameplay Settings" for fine tunning enemy and militia reinforce entry:
  MIN_DELAY_ENEMY_REINFORCEMENTS enemy reinforcement will arrive minimum this number of turns after they are called, if 0 then is disabled.
  RND_DELAY_ENEMY_REINFORCEMENTS additional random delay added to minimum when reinforcements will arrive after they are called.
  MIN_ENTER_ENEMY_REINFORCEMENTS minimum enemy units which will enter after above delay is over.
  RND_ENTER_ENEMY_REINFORCEMENTS additional random enemy units to appear after passing delay.
  MIN_DELAY_MILITIA_REINFORCEMENTS enemy reinforcement will arrive minimum this number of turns after they are called, if 0 then is disabled.
  RND_DELAY_MILITIA_REINFORCEMENTS additional random delay added to minimum when reinforcements will arrive after they are called.
  MIN_ENTER_MILITIA_REINFORCEMENTS minimum enemy units which will enter after above delay is over.
  RND_ENTER_MILITIA_REINFORCEMENTS additional random enemy units to appear after passing delay.
- After first delay ends any other reinforcement appeared more frequently or if already arrive (but no free slot), they will pop up soon after slot is free.
- Add option NO_REMOVE_RANDOM_SECTOR_ITEMS under "Strategic Gameplay Settings" to prevent permanent random removal of your sector items.
- Add missing function DisplaySectorItemsInfo.


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6386 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2013-09-10 20:49:49 +00:00

288 lines
7.5 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Tactical All.h"
#else
#include "sgp.h"
#include "Game Clock.h"
#include "Font Control.h"
#include "Timer Control.h"
#include "overhead.h"
#include "Game Clock.h"
#include "message.h"
#include "worlddef.h"
#include "rotting corpses.h"
#include "soldier create.h"
#include "soldier add.h"
#include "isometric utils.h"
#include "animation data.h"
#include "animation control.h"
#include "Tactical Turns.h"
#include "smell.h"
#include "opplist.h"
#include "Queen Command.h"
#include "dialogue control.h"
#include "smokeeffects.h"
#include "lighteffects.h"
#include "campaign.h"
#include "Soldier macros.h"
#include "strategicmap.h"
#include "Random.h"
#include "Explosion Control.h"
#endif
#include "Reinforcement.h"
extern void DecayPublicOpplist( INT8 bTeam );
//not in overhead.h!
extern UINT8 NumEnemyInSector();
#ifdef JA2UB
//no uB
#else
void HandleRPCDescription( )
{
// WDS - make number of mercenaries, etc. be configurable
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0);
// UINT8 ubMercsInSector[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ] = { 0 };
UINT8 ubNumMercs = 0;
UINT8 ubChosenMerc;
SOLDIERTYPE *pTeamSoldier;
INT32 cnt2;
BOOLEAN fSAMSite = FALSE;
if ( !gTacticalStatus.fCountingDownForGuideDescription )
{
return;
}
// ATE: postpone if we are not in tactical
if ( guiCurrentScreen != GAME_SCREEN )
{
return;
}
if ( ( gTacticalStatus.uiFlags & ENGAGED_IN_CONV ) )
{
return;
}
// Are we a SAM site?
if ( gTacticalStatus.ubGuideDescriptionToUse == 27 ||
gTacticalStatus.ubGuideDescriptionToUse == 30 ||
gTacticalStatus.ubGuideDescriptionToUse == 32 ||
gTacticalStatus.ubGuideDescriptionToUse == 25 ||
gTacticalStatus.ubGuideDescriptionToUse == 31 )
{
fSAMSite = TRUE;
gTacticalStatus.bGuideDescriptionCountDown = 1;
}
// ATE; Don't do in combat
if ( ( gTacticalStatus.uiFlags & INCOMBAT ) && !fSAMSite )
{
return;
}
// Don't do if enemy in sector
if ( NumEnemyInSector( ) && !fSAMSite )
{
return;
}
gTacticalStatus.bGuideDescriptionCountDown--;
if ( gTacticalStatus.bGuideDescriptionCountDown == 0 )
{
gTacticalStatus.fCountingDownForGuideDescription = FALSE;
// OK, count how many rpc guys we have....
// set up soldier ptr as first element in mercptrs list
cnt2 = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
// run through list
for ( pTeamSoldier = MercPtrs[ cnt2 ]; cnt2 <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt2++,pTeamSoldier++ )
{
// Add guy if he's a candidate...
if ( RPC_RECRUITED( pTeamSoldier ) )
{
if ( pTeamSoldier->stats.bLife >= OKLIFE && pTeamSoldier->bActive &&
pTeamSoldier->sSectorX == gTacticalStatus.bGuideDescriptionSectorX && pTeamSoldier->sSectorY == gTacticalStatus.bGuideDescriptionSectorY &&
pTeamSoldier->bSectorZ == gbWorldSectorZ &&
!pTeamSoldier->flags.fBetweenSectors )
{
if ( pTeamSoldier->ubProfile == IRA ||
pTeamSoldier->ubProfile == MIGUEL ||
pTeamSoldier->ubProfile == CARLOS ||
pTeamSoldier->ubProfile == DIMITRI )
{
ubMercsInSector[ ubNumMercs ] = (UINT8)cnt2;
ubNumMercs++;
}
}
}
}
// If we are > 0
if ( ubNumMercs > 0 )
{
ubChosenMerc = (UINT8)Random( ubNumMercs );
TacticalCharacterDialogueWithSpecialEvent( MercPtrs[ ubMercsInSector[ ubChosenMerc ] ], gTacticalStatus.ubGuideDescriptionToUse, DIALOGUE_SPECIAL_EVENT_USE_ALTERNATE_FILES, 0, 0 );
}
}
}
#endif
void HandleTacticalEndTurn( )
{
UINT32 cnt;
SOLDIERTYPE *pSoldier;
UINT32 uiTime;
static UINT32 uiTimeSinceLastStrategicUpdate = 0;
// OK, Do a number of things here....
// Every few turns......
SetFastForwardMode(FALSE); // Cancel FF at end of battle
// Get time elasped
uiTime = GetWorldTotalSeconds( );
if ( ( uiTimeSinceLastStrategicUpdate - uiTime ) > 1200 )
{
HandleRottingCorpses( );
//DecayTacticalMoraleModifiers();
uiTimeSinceLastStrategicUpdate = uiTime;
}
DecayBombTimers( );
DecaySmokeEffects( uiTime );
DecayLightEffects( uiTime );
// Decay smells
//DecaySmells();
// Decay blood
DecayBloodAndSmells( uiTime );
// decay AI warning values from corpses
DecayRottingCorpseAIWarnings();
((gTacticalStatus.Team[ENEMY_TEAM].bTeamActive || gTacticalStatus.Team[MILITIA_TEAM].bTeamActive) ? (guiTurnCnt++) : (guiTurnCnt = 0));//dnl ch68 090913
//Check for enemy pooling (add enemies if there happens to be more than the max in the
//current battle. If one or more slots have freed up, we can add them now.
AddPossiblePendingEnemiesToBattle();
AddPossiblePendingMilitiaToBattle();
// Loop through each active team and decay public opplist...
// May want this done every few times too
NonCombatDecayPublicOpplist( uiTime );
/*
for( cnt = 0; cnt < MAXTEAMS; cnt++ )
{
if ( gTacticalStatus.Team[ cnt ].bMenInSector > 0 )
{
// decay team's public opplist
DecayPublicOpplist( (INT8)cnt );
}
}
*/
// First pass:
// Loop through our own mercs:
// Check things like ( even if not in our sector )
// 1 ) All updates of breath, shock, bleeding, etc
// 2 ) Updating First AID, etc
// ( If in our sector: )
// 3 ) Update things like decayed opplist, etc
// Second pass:
// Loop through all mercs in tactical engine
// If not a player merc ( ubTeam ) , do things like 1 , 2 , 3 above
// First exit if we are not in realtime combat or realtime noncombat
if (!(gTacticalStatus.uiFlags & TURNBASED) || !(gTacticalStatus.uiFlags & INCOMBAT ) )
{
BeginLoggingForBleedMeToos( TRUE );
cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pSoldier++)
{
if ( pSoldier->bActive && pSoldier->stats.bLife > 0 && !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !( AM_A_ROBOT( pSoldier ) ) )
{
// Handle everything from getting breath back, to bleeding, etc
pSoldier->EVENT_BeginMercTurn( TRUE, 0 );
// Handle Player services
HandlePlayerServices( pSoldier );
// if time is up, turn off xray
if ( pSoldier->uiXRayActivatedTime && uiTime > pSoldier->uiXRayActivatedTime + XRAY_TIME )
{
TurnOffXRayEffects( pSoldier );
}
// Handle stat changes if ness.
//if ( fCheckStats )
//{
//// UpdateStats( pSoldier );
//}
// Flugente: update multi-turn actions
pSoldier->UpdateMultiTurnAction();
}
}
BeginLoggingForBleedMeToos( FALSE );
// OK, loop through the mercs to perform 'end turn' events on each...
// We're looping through only mercs in tactical engine, ignoring our mercs
// because they were done earilier...
for ( cnt = 0; cnt < guiNumMercSlots; cnt++ )
{
pSoldier = MercSlots[ cnt ];
if ( pSoldier != NULL )
{
if ( pSoldier->bTeam != gbPlayerNum )
{
// Handle everything from getting breath back, to bleeding, etc
pSoldier->EVENT_BeginMercTurn( TRUE, 0 );
// Handle Player services
HandlePlayerServices( pSoldier );
}
}
}
}
#ifdef JA2UB
// HandleRPCDescription( );
#else
HandleRPCDescription( );
#endif
// Flugente: Cool down/decay all items not in a soldier's inventory
CoolDownWorldItems();
#ifdef ENABLE_ZOMBIES
// Flugente: raise zombies if in gamescreen and option set
if ( guiCurrentScreen == GAME_SCREEN )
{
RaiseZombies();
}
#endif
}