mirror of
https://github.com/1dot13/source.git
synced 2026-08-12 14:10:23 +02:00
Space Viking's many mercs changes plus numerous generic bug fixes
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2498 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -958,11 +958,17 @@ UINT8 GetCurrentSuitabilityForItem( INT8 bArmsDealer, UINT16 usItemIndex, BOOLEA
|
||||
}
|
||||
}
|
||||
|
||||
// WDS - Improve Tony's and Devin's inventory like BR's
|
||||
// Tony has the better stuff sooner (than Bobby R's)
|
||||
if (bArmsDealer == ARMS_DEALER_TONY)
|
||||
{
|
||||
ubMinCoolness += 1;
|
||||
ubMaxCoolness += 1;
|
||||
|
||||
if (gGameExternalOptions.tonyUsesBRSetting) {
|
||||
ubMinCoolness += gGameOptions.ubBobbyRay / 3;
|
||||
ubMaxCoolness += gGameOptions.ubBobbyRay;
|
||||
}
|
||||
}
|
||||
else if (bArmsDealer == ARMS_DEALER_DEVIN)
|
||||
{
|
||||
@@ -972,6 +978,11 @@ UINT8 GetCurrentSuitabilityForItem( INT8 bArmsDealer, UINT16 usItemIndex, BOOLEA
|
||||
ubMinCoolness = 3;
|
||||
ubMaxCoolness = 4;
|
||||
}
|
||||
|
||||
if (gGameExternalOptions.devinUsesBRSetting) {
|
||||
ubMinCoolness += gGameOptions.ubBobbyRay / 3;
|
||||
ubMaxCoolness += gGameOptions.ubBobbyRay;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+36
-14
@@ -59,11 +59,14 @@ MOUSE_REGION gAutoBandageRegion;
|
||||
|
||||
|
||||
// the lists of the doctor and patient
|
||||
INT32 iDoctorList[ MAX_CHARACTER_COUNT ];
|
||||
INT32 iPatientList[ MAX_CHARACTER_COUNT ];
|
||||
std::vector<INT32> iDoctorList (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, -1);
|
||||
std::vector<INT32> iPatientList (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, -1);
|
||||
//INT32 iDoctorList[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
|
||||
//INT32 iPatientList[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
|
||||
|
||||
// faces for update panel
|
||||
INT32 giAutoBandagesSoldierFaces[ 2 * MAX_CHARACTER_COUNT ];
|
||||
std::vector<INT32> giAutoBandagesSoldierFaces (2*CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, -1);
|
||||
//INT32 giAutoBandagesSoldierFaces[ 2 * CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
|
||||
|
||||
// has the button for autobandage end been setup yet
|
||||
BOOLEAN fAutoEndBandageButtonCreated = FALSE;
|
||||
@@ -307,7 +310,8 @@ BOOLEAN HandleAutoBandage( )
|
||||
BOOLEAN CreateAutoBandageString( void )
|
||||
{
|
||||
INT32 cnt;
|
||||
UINT8 ubDoctor[20], ubDoctors = 0;
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
UINT8 ubDoctor[CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS], ubDoctors = 0;
|
||||
UINT32 uiDoctorNameStringLength = 1; // for end-of-string character
|
||||
STR16 sTemp;
|
||||
SOLDIERTYPE * pSoldier;
|
||||
@@ -554,9 +558,16 @@ void SetUpAutoBandageUpdatePanel( void )
|
||||
INT32 iNumberOnTeam = 0;
|
||||
INT32 iCounterA = 0;
|
||||
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
// reset the tables of merc ids
|
||||
memset( iDoctorList, -1, sizeof( INT32 ) * MAX_CHARACTER_COUNT );
|
||||
memset( iPatientList, -1, sizeof( INT32 ) * MAX_CHARACTER_COUNT );
|
||||
for (std::vector<INT32>::iterator docIter = iDoctorList.begin(); docIter != iDoctorList.end(); ++docIter) {
|
||||
*docIter = -1;
|
||||
}
|
||||
for (std::vector<INT32>::iterator pIter = iPatientList.begin(); pIter != iPatientList.end(); ++pIter) {
|
||||
*pIter = -1;
|
||||
}
|
||||
// memset( iDoctorList, -1, sizeof( iDoctorList ) );
|
||||
// memset( iPatientList, -1, sizeof( iPatientList ) );
|
||||
|
||||
|
||||
// grab number of potential grunts on players team
|
||||
@@ -588,9 +599,16 @@ void SetUpAutoBandageUpdatePanel( void )
|
||||
// makes sure there is someone to doctor and patient...
|
||||
if( ( iNumberDoctoring == 0 ) || ( iNumberPatienting == 0 ) )
|
||||
{
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
// reset the tables of merc ids
|
||||
memset( iDoctorList, -1, sizeof( INT32 ) * MAX_CHARACTER_COUNT );
|
||||
memset( iPatientList, -1, sizeof( INT32 ) * MAX_CHARACTER_COUNT );
|
||||
for (std::vector<INT32>::iterator iter = iDoctorList.begin(); iter != iDoctorList.end(); ++iter) {
|
||||
*iter = -1;
|
||||
}
|
||||
for (std::vector<INT32>::iterator iter = iPatientList.begin(); iter != iPatientList.end(); ++iter) {
|
||||
*iter = -1;
|
||||
}
|
||||
// memset( iDoctorList, -1, sizeof( iDoctorList ) );
|
||||
// memset( iPatientList, -1, sizeof( iPatientList ) );
|
||||
}
|
||||
|
||||
// now add the faces
|
||||
@@ -1046,12 +1064,16 @@ BOOLEAN AddFacesToAutoBandageBox( void )
|
||||
VOBJECT_DESC VObjectDesc;
|
||||
|
||||
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
// reset
|
||||
memset( &giAutoBandagesSoldierFaces, -1, 2 * MAX_CHARACTER_COUNT );
|
||||
for (std::vector<INT32>::iterator iter = giAutoBandagesSoldierFaces.begin(); iter != giAutoBandagesSoldierFaces.end(); ++iter) {
|
||||
*iter = -1;
|
||||
}
|
||||
// memset( &giAutoBandagesSoldierFaces, -1, sizeof(giAutoBandagesSoldierFaces));
|
||||
|
||||
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
|
||||
|
||||
for( iCounter = 0; iCounter < MAX_CHARACTER_COUNT; iCounter++ )
|
||||
for( iCounter = 0; iCounter < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
|
||||
{
|
||||
// find a free slot
|
||||
if( iDoctorList[ iCounter ] != -1 )
|
||||
@@ -1074,7 +1096,7 @@ BOOLEAN AddFacesToAutoBandageBox( void )
|
||||
}
|
||||
}
|
||||
|
||||
for( iCounter = 0; iCounter < MAX_CHARACTER_COUNT; iCounter++ )
|
||||
for( iCounter = 0; iCounter < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
|
||||
{
|
||||
// find a free slot
|
||||
if( iPatientList[ iCounter ] != -1 )
|
||||
@@ -1112,7 +1134,7 @@ BOOLEAN RemoveFacesForAutoBandage( void )
|
||||
INT32 iCounter = 0, iNumberOfDoctors = 0;
|
||||
|
||||
|
||||
for( iCounter = 0; iCounter < MAX_CHARACTER_COUNT; iCounter++ )
|
||||
for( iCounter = 0; iCounter < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
|
||||
{
|
||||
// find a free slot
|
||||
if( iDoctorList[ iCounter ] != -1 )
|
||||
@@ -1124,7 +1146,7 @@ BOOLEAN RemoveFacesForAutoBandage( void )
|
||||
}
|
||||
|
||||
|
||||
for( iCounter = 0; iCounter < MAX_CHARACTER_COUNT; iCounter++ )
|
||||
for( iCounter = 0; iCounter < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
|
||||
{
|
||||
// find a free slot
|
||||
if( iPatientList[ iCounter ] != -1 )
|
||||
@@ -1160,7 +1182,7 @@ BOOLEAN RenderSoldierSmallFaceForAutoBandagePanel( INT32 iIndex, INT16 sCurrentX
|
||||
BltVideoObject( FRAME_BUFFER , hHandle , 0, sCurrentXPosition+2, sCurrentYPosition+2, VO_BLT_SRCTRANSPARENCY, NULL );
|
||||
|
||||
|
||||
for( iCounter = 0; iCounter < MAX_CHARACTER_COUNT; iCounter++ )
|
||||
for( iCounter = 0; iCounter < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; iCounter++ )
|
||||
{
|
||||
// find a free slot
|
||||
if( iDoctorList[ iCounter ] != -1 )
|
||||
|
||||
+13
-4
@@ -1267,7 +1267,7 @@ UINT8 CurrentPlayerProgressPercentage(void)
|
||||
{
|
||||
UINT32 uiCurrentIncome;
|
||||
UINT32 uiPossibleIncome;
|
||||
UINT8 ubCurrentProgress;
|
||||
UINT8 ubCurrentProgress = gGameExternalOptions.ubGameProgressIncrement;
|
||||
UINT8 ubKillsPerPoint;
|
||||
UINT16 usKillsProgress;
|
||||
UINT16 usControlProgress;
|
||||
@@ -1343,12 +1343,21 @@ UINT8 CurrentPlayerProgressPercentage(void)
|
||||
|
||||
// WDS: Adding more ways to progress in the game
|
||||
// Get a ratio of sectors visited to the total number of sectors
|
||||
usVisitProgress = CountSurfaceSectorsVisited() * gGameExternalOptions.ubGameProgressPortionVisited / ((MAP_WORLD_X - 2) * (MAP_WORLD_Y - 2));
|
||||
usVisitProgress = CountSurfaceSectorsVisited() * gGameExternalOptions.ubGameProgressPortionVisited / ((MAP_WORLD_X - 2) * (MAP_WORLD_Y - 2) - 56 /* note: should be calculated */);
|
||||
|
||||
// add control progress
|
||||
// add visit progress
|
||||
ubCurrentProgress += usVisitProgress;
|
||||
|
||||
return(ubCurrentProgress);
|
||||
// Add increment to progress
|
||||
ubCurrentProgress += gGameExternalOptions.ubGameProgressIncrement;
|
||||
|
||||
if (ubCurrentProgress < gGameExternalOptions.ubGameProgressMinimum)
|
||||
return gGameExternalOptions.ubGameProgressMinimum;
|
||||
|
||||
if (ubCurrentProgress < 100)
|
||||
return ubCurrentProgress;
|
||||
else
|
||||
return 100;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@
|
||||
#include "los.h"
|
||||
#include "qarray.h"
|
||||
#endif
|
||||
#include <vector>
|
||||
#include "Auto Resolve.h"
|
||||
|
||||
#include "connect.h"
|
||||
|
||||
@@ -478,7 +480,6 @@ void HandleDialogue( )
|
||||
|
||||
iQSize = QueueSize( ghDialogueQ );
|
||||
|
||||
|
||||
if ( iQSize == 0 && gpCurrentTalkingFace == NULL )
|
||||
{
|
||||
HandlePendingInitConv( );
|
||||
@@ -2453,7 +2454,8 @@ void RenderSubtitleBoxOverlay( VIDEO_OVERLAY *pBlitter )
|
||||
|
||||
void SayQuoteFromAnyBodyInSector( UINT16 usQuoteNum )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS, 0);
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
@@ -2516,7 +2518,8 @@ void SayQuoteFromAnyBodyInSector( UINT16 usQuoteNum )
|
||||
|
||||
void SayQuoteFromAnyBodyInThisSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usQuoteNum )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0);
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
@@ -2568,7 +2571,8 @@ void SayQuoteFromAnyBodyInThisSector( INT16 sSectorX, INT16 sSectorY, INT8 bSect
|
||||
|
||||
void SayQuoteFromNearbyMercInSector( INT16 sGridNo, INT8 bDistance, UINT16 usQuoteNum )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0 );
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
@@ -2612,7 +2616,8 @@ void SayQuoteFromNearbyMercInSector( INT16 sGridNo, INT8 bDistance, UINT16 usQuo
|
||||
|
||||
void SayQuote58FromNearbyMercInSector( INT16 sGridNo, INT8 bDistance, UINT16 usQuoteNum, INT8 bSex )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0);
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "Enemy Soldier Save.h"
|
||||
#else
|
||||
#include "builddefines.h"
|
||||
#include "GameSettings.h"
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
|
||||
@@ -167,7 +168,8 @@ BOOLEAN LoadEnemySoldiersFromTempFile()
|
||||
}
|
||||
|
||||
FileRead( hfile, &slots, 4, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != 4 )
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
if( (uiNumBytesRead != 4) || (slots > TOTAL_SOLDIERS) )
|
||||
{
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "EnemySoldier -- EOF while reading slots. KM" );
|
||||
@@ -215,7 +217,7 @@ BOOLEAN LoadEnemySoldiersFromTempFile()
|
||||
FileClose( hfile );
|
||||
return TRUE;
|
||||
}
|
||||
if( slots < 0 || slots >= 64 )
|
||||
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfEnemies )
|
||||
{ //bad IO!
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "EnemySoldier -- illegal slot value of %d. KM", slots );
|
||||
@@ -771,7 +773,8 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile()
|
||||
}
|
||||
|
||||
FileRead( hfile, &slots, 4, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != 4 )
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
if( (uiNumBytesRead != 4) || (slots > TOTAL_SOLDIERS) )
|
||||
{
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "EnemySoldier -- EOF while reading slots. KM" );
|
||||
@@ -820,7 +823,7 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile()
|
||||
}
|
||||
|
||||
|
||||
if( slots < 0 || slots >= 64 )
|
||||
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfEnemies )
|
||||
{ //bad IO!
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "EnemySoldier -- illegal slot value of %d. KM", slots );
|
||||
@@ -1114,7 +1117,8 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile()
|
||||
}
|
||||
|
||||
FileRead( hfile, &slots, 4, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != 4 )
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
if( (uiNumBytesRead != 4) || (slots > TOTAL_SOLDIERS) )
|
||||
{
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "Civilian -- EOF while reading slots. KM" );
|
||||
@@ -1149,6 +1153,7 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile()
|
||||
goto FAIL_LOAD;
|
||||
}
|
||||
|
||||
// WDS - DEBUG - Comment out the following ling to force reinit of a sector
|
||||
if( !slots )
|
||||
{
|
||||
//no need to restore the enemy's to the map. This means we are restoring a saved game.
|
||||
@@ -1156,7 +1161,7 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile()
|
||||
FileClose( hfile );
|
||||
return TRUE;
|
||||
}
|
||||
if( slots < 0 || slots >= 64 )
|
||||
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfCivilians )
|
||||
{
|
||||
//bad IO!
|
||||
#ifdef JA2TESTVERSION
|
||||
@@ -1647,7 +1652,8 @@ BOOLEAN CountNumberOfElitesRegularsAdminsAndCreaturesFromEnemySoldiersTempFile(
|
||||
}
|
||||
|
||||
FileRead( hfile, &slots, 4, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != 4 )
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
if( (uiNumBytesRead != 4) || (slots > TOTAL_SOLDIERS) )
|
||||
{
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "Check EnemySoldier -- EOF while reading slots. KM" );
|
||||
@@ -1690,7 +1696,7 @@ BOOLEAN CountNumberOfElitesRegularsAdminsAndCreaturesFromEnemySoldiersTempFile(
|
||||
}
|
||||
|
||||
|
||||
if( slots < 0 || slots >= 64 )
|
||||
if( slots < 0 || slots >= (int)gGameExternalOptions.ubGameMaximumNumberOfEnemies )
|
||||
{ //bad IO!
|
||||
#ifdef JA2TESTVERSION
|
||||
sprintf( zReason, "Check EnemySoldier -- illegal slot value of %d. KM", slots );
|
||||
|
||||
@@ -4967,10 +4967,18 @@ void MineSpottedDialogueCallBack( void )
|
||||
|
||||
GetItemPool( gsBoobyTrapGridNo, &pItemPool, gbBoobyTrapLevel );
|
||||
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
// WDS - Automatically flag mines
|
||||
if (gGameExternalOptions.automaticallyFlagMines) {
|
||||
// play a locator at the location of the mine
|
||||
SetItemPoolLocator( pItemPool );
|
||||
|
||||
// play a locator at the location of the mine
|
||||
SetItemPoolLocatorWithCallback( pItemPool, MineSpottedLocatorCallback );
|
||||
AddBlueFlag( gsBoobyTrapGridNo, gbBoobyTrapLevel );
|
||||
} else {
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
|
||||
// play a locator at the location of the mine
|
||||
SetItemPoolLocatorWithCallback( pItemPool, MineSpottedLocatorCallback );
|
||||
}
|
||||
}
|
||||
|
||||
void MineSpottedLocatorCallback( void )
|
||||
|
||||
@@ -1077,9 +1077,10 @@ UINT32 UIHandleNewMerc( UI_EVENT *pUIEvent )
|
||||
{
|
||||
ScreenMsg( FONT_ORANGE, MSG_BETAVERSION, L"Merc hire failed: Either already hired or dislikes you." );
|
||||
}
|
||||
else if( bReturnCode == MERC_HIRE_OVER_18_MERCS_HIRED )
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
else if( bReturnCode == MERC_HIRE_OVER_PLAYER_LIMIT )
|
||||
{
|
||||
ScreenMsg( FONT_ORANGE, MSG_BETAVERSION, L"Can't hire more than 18 mercs." );
|
||||
ScreenMsg( FONT_ORANGE, MSG_BETAVERSION, L"Can't hire that many mercs." );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -664,7 +664,7 @@ void RenderTopmostTacticalInterface( )
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
if ( gfUIInDeadlock )
|
||||
{
|
||||
SetFont( LARGEFONT1 );
|
||||
@@ -674,7 +674,7 @@ void RenderTopmostTacticalInterface( )
|
||||
mprintf( 0, 300, L"OPPONENT %d DEADLOCKED - 'Q' TO DEBUG, <ALT><ENTER> END OPP TURN", gUIDeadlockedSoldier );
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// Syncronize for upcoming soldier counters
|
||||
SYNCTIMECOUNTER( );
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
#include "end game.h"
|
||||
#include "Map Screen Helicopter.h"
|
||||
#include "Cheats.h"
|
||||
#include "Overhead.h"
|
||||
#endif
|
||||
|
||||
//forward declarations of common classes to eliminate includes
|
||||
@@ -2036,13 +2037,16 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
||||
// Delete menu
|
||||
DeleteTalkingMenu( );
|
||||
|
||||
if ( PlayerTeamFull( ) )
|
||||
{
|
||||
if ( PlayerTeamFull( ) )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ CANNOT_RECRUIT_TEAM_FULL ] );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RecruitRPC( ubTargetNPC );
|
||||
if (!RecruitRPC( ubTargetNPC )) {
|
||||
ScreenMsg( FONT_MCOLOR_RED, MSG_ERROR, L"Internal error in recruiting RPC, trying to recover as best it can but this might not be pretty..." );
|
||||
return;
|
||||
}
|
||||
// OK, update UI with message that we have been recruited
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ HAS_BEEN_RECRUITED_STR ], gMercProfiles[ ubTargetNPC ].zNickname );
|
||||
}
|
||||
@@ -4366,25 +4370,7 @@ UINT32 CalcMedicalCost( UINT8 ubId )
|
||||
|
||||
BOOLEAN PlayerTeamHasTwoSpotsLeft( )
|
||||
{
|
||||
UINT32 cnt, uiCount = 0;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
|
||||
for ( cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID, pSoldier = MercPtrs[ cnt ]; cnt <= (UINT32)( gTacticalStatus.Team[ gbPlayerNum ].bLastID - 2 ); cnt++, pSoldier++ )
|
||||
{
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
uiCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( uiCount <= (UINT32) (gTacticalStatus.Team[ gbPlayerNum].bLastID - 2) - 1 )
|
||||
{
|
||||
return( TRUE );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
return ( CountNonVehiclesOnPlayerTeam() <= gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs - 2 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -267,16 +267,17 @@ int MONEY_HEIGHT;
|
||||
* why we declare array with 12 items? coz we got 2 valuse x and y maby we can work it out
|
||||
* and change INT16 to INV_REGION_DESC for ex.
|
||||
*/
|
||||
INT16 sTEAMAPPanelXY[12];
|
||||
INT16 sTEAMFacesXY[12];
|
||||
INT16 sTEAMNamesXY[12];
|
||||
INT16 sTEAMFaceHighlXY[12];
|
||||
INT16 sTEAMLifeXY[12];
|
||||
INT16 sTEAMBreathXY[12];
|
||||
INT16 sTEAMMoraleXY[12];
|
||||
INT16 sTEAMApXY[12];
|
||||
INT16 sTEAMBarsXY[12];
|
||||
INT16 sTEAMHandInvXY[12];
|
||||
const int TeamInterfaceMax = NUMBER_OF_SOLDIERS_PER_SQUAD * 2; // WDS
|
||||
INT16 sTEAMAPPanelXY[TeamInterfaceMax];
|
||||
INT16 sTEAMFacesXY[TeamInterfaceMax];
|
||||
INT16 sTEAMNamesXY[TeamInterfaceMax];
|
||||
INT16 sTEAMFaceHighlXY[TeamInterfaceMax];
|
||||
INT16 sTEAMLifeXY[TeamInterfaceMax];
|
||||
INT16 sTEAMBreathXY[TeamInterfaceMax];
|
||||
INT16 sTEAMMoraleXY[TeamInterfaceMax];
|
||||
INT16 sTEAMApXY[TeamInterfaceMax];
|
||||
INT16 sTEAMBarsXY[TeamInterfaceMax];
|
||||
INT16 sTEAMHandInvXY[TeamInterfaceMax];
|
||||
|
||||
int TM_FACE_WIDTH;
|
||||
int TM_FACE_HEIGHT;
|
||||
@@ -454,14 +455,14 @@ MOUSE_REGION gSM_SELMERCBarsRegion;
|
||||
MOUSE_REGION gSM_SELMERCMoneyRegion;
|
||||
MOUSE_REGION gSM_SELMERCEnemyIndicatorRegion;
|
||||
MOUSE_REGION gTEAM_PanelRegion;
|
||||
MOUSE_REGION gTEAM_FaceRegions[ 6 ];
|
||||
MOUSE_REGION gTEAM_BarsRegions[ 6 ];
|
||||
MOUSE_REGION gTEAM_LeftBarsRegions[ 6 ];
|
||||
MOUSE_REGION gTEAM_FirstHandInv[ 6 ];
|
||||
MOUSE_REGION gTEAM_SecondHandInv[ 6 ];
|
||||
MOUSE_REGION gTEAM_EnemyIndicator[ 6 ];
|
||||
MOUSE_REGION gTEAM_FaceRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
MOUSE_REGION gTEAM_BarsRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
MOUSE_REGION gTEAM_LeftBarsRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
MOUSE_REGION gTEAM_FirstHandInv[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
MOUSE_REGION gTEAM_SecondHandInv[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
MOUSE_REGION gTEAM_EnemyIndicator[ NUMBER_OF_SOLDIERS_PER_SQUAD ];
|
||||
|
||||
BOOLEAN gfTEAM_HandInvDispText[ 6 ][ NUM_INV_SLOTS ];
|
||||
BOOLEAN gfTEAM_HandInvDispText[ NUMBER_OF_SOLDIERS_PER_SQUAD ][ NUM_INV_SLOTS ];
|
||||
BOOLEAN gfSM_HandInvDispText[ NUM_INV_SLOTS ];
|
||||
|
||||
void HelpTextDoneCallback( void );
|
||||
@@ -771,7 +772,7 @@ void UpdateForContOverPortrait( SOLDIERTYPE *pSoldier, BOOLEAN fOn )
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( cnt = 0; cnt < 6; cnt++ )
|
||||
for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ )
|
||||
{
|
||||
if ( gTeamPanel[ cnt ].ubID == pSoldier->ubID )
|
||||
{
|
||||
@@ -4449,6 +4450,24 @@ BOOLEAN InitializeTEAMPanelCoords( )
|
||||
INDICATOR_BOX_WIDTH = 12;
|
||||
INDICATOR_BOX_HEIGHT = 10;
|
||||
|
||||
for (int idx = 0; idx < TeamInterfaceMax/2; idx+=1) {
|
||||
const int evenIdx = idx * 2;
|
||||
Assert(evenIdx < TeamInterfaceMax);
|
||||
const int oddIdx = idx*2+1;
|
||||
Assert(oddIdx < TeamInterfaceMax);
|
||||
sTEAMAPPanelXY[evenIdx] = ( 69+idx*83 + INTERFACE_START_X ); sTEAMAPPanelXY[oddIdx] = ( 6 + INTERFACE_START_Y );
|
||||
sTEAMFacesXY[evenIdx] = ( 13+idx*83+(idx>0) + INTERFACE_START_X ); sTEAMFacesXY[oddIdx] = ( 6 + INTERFACE_START_Y );
|
||||
sTEAMNamesXY[evenIdx] = ( 7+idx*83 + INTERFACE_START_X ); sTEAMNamesXY[oddIdx] = ( 55 + INTERFACE_START_Y );
|
||||
sTEAMFaceHighlXY[evenIdx] = ( 4+idx*83 + INTERFACE_START_X ); sTEAMFaceHighlXY[oddIdx] = ( 2 + INTERFACE_START_Y );
|
||||
sTEAMLifeXY[evenIdx] = ( 69+idx*83 + INTERFACE_START_X ); sTEAMLifeXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT );
|
||||
sTEAMBreathXY[evenIdx] = ( 75+idx*83 + INTERFACE_START_X ); sTEAMBreathXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT );
|
||||
sTEAMMoraleXY[evenIdx] = ( 81+idx*83 + INTERFACE_START_X ); sTEAMMoraleXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT );
|
||||
sTEAMApXY[evenIdx] = ( 68+idx*83 + INTERFACE_START_X ); sTEAMApXY[oddIdx] = ( 52 + INTERFACE_START_Y );
|
||||
sTEAMBarsXY[evenIdx] = ( 61+idx*83+(idx>0) + INTERFACE_START_X ); sTEAMBarsXY[oddIdx] = ( 3 + INTERFACE_START_Y );
|
||||
sTEAMHandInvXY[evenIdx] = ( TM_INV_HAND1STARTX + ( idx * TM_INV_HAND_SEP )); sTEAMHandInvXY[oddIdx] = TM_INV_HAND1STARTY;
|
||||
}
|
||||
|
||||
/*
|
||||
sTEAMAPPanelXY[0] = ( 69 + INTERFACE_START_X ); sTEAMAPPanelXY[1] = ( 6 + INTERFACE_START_Y );
|
||||
sTEAMAPPanelXY[2] = ( 151 + INTERFACE_START_X ); sTEAMAPPanelXY[3] = ( 6 + INTERFACE_START_Y );
|
||||
sTEAMAPPanelXY[4] = ( 234 + INTERFACE_START_X ); sTEAMAPPanelXY[5] = ( 6 + INTERFACE_START_Y );
|
||||
@@ -4519,7 +4538,7 @@ BOOLEAN InitializeTEAMPanelCoords( )
|
||||
sTEAMHandInvXY[8] = ( TM_INV_HAND1STARTX + ( 4 * TM_INV_HAND_SEP )); sTEAMHandInvXY[9] = TM_INV_HAND1STARTY;
|
||||
sTEAMHandInvXY[10] = ( TM_INV_HAND1STARTX + ( 5 * TM_INV_HAND_SEP )); sTEAMHandInvXY[11] = TM_INV_HAND1STARTY;
|
||||
// ufff to much copy&paste :D
|
||||
|
||||
*/
|
||||
// CHRISL: New definitions for the team panel clock and location coordinates
|
||||
INTERFACE_CLOCK_TM_X = ( SCREEN_WIDTH - 86 );
|
||||
INTERFACE_CLOCK_TM_Y = ( 98 + INTERFACE_START_Y );
|
||||
@@ -4680,7 +4699,7 @@ BOOLEAN ShutdownTEAMPanel( )
|
||||
// Remove viewport
|
||||
MSYS_RemoveRegion( &gViewportRegion );
|
||||
|
||||
for ( cnt = 0; cnt < 6; cnt++ )
|
||||
for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ )
|
||||
{
|
||||
MSYS_RemoveRegion( &gTEAM_EnemyIndicator[ cnt ] );
|
||||
MSYS_RemoveRegion( &gTEAM_FaceRegions[ cnt ] );
|
||||
@@ -4760,9 +4779,10 @@ void RenderTEAMPanel( BOOLEAN fDirty )
|
||||
if ( pSoldier->flags.uiStatusFlags & ( SOLDIER_DRIVER ) )
|
||||
{
|
||||
// Get soldier pointer for vehicle.....
|
||||
SOLDIERTYPE *pVehicle;
|
||||
SOLDIERTYPE *pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId );
|
||||
|
||||
pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId );
|
||||
// WDS 07/02/3008 - Fix bug of getting into vehicle you don't control
|
||||
Assert (pVehicle != 0);
|
||||
|
||||
//OK, for each item, set dirty text if applicable!
|
||||
swprintf( pStr, TacticalStr[ DRIVER_POPUPTEXT ], pVehicle->stats.bLife, pVehicle->stats.bLifeMax, pVehicle->bBreath, pVehicle->bBreathMax );
|
||||
@@ -5157,7 +5177,7 @@ void UpdateTEAMPanel( )
|
||||
DisableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] );
|
||||
|
||||
// OK, disable item regions.......
|
||||
for ( cnt = 0; cnt < 6; cnt++ )
|
||||
for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ )
|
||||
{
|
||||
MSYS_DisableRegion( &gTEAM_EnemyIndicator[ cnt ] );
|
||||
|
||||
@@ -5178,7 +5198,7 @@ void UpdateTEAMPanel( )
|
||||
{
|
||||
EnableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] );
|
||||
|
||||
for ( cnt = 0; cnt < 6; cnt++ )
|
||||
for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ )
|
||||
{
|
||||
MSYS_EnableRegion( &gTEAM_EnemyIndicator[ cnt ] );
|
||||
|
||||
@@ -6918,7 +6938,7 @@ void ConfirmationToDepositMoneyToPlayersAccount( UINT8 ubExitValue )
|
||||
if ( ubExitValue == MSG_BOX_RETURN_YES )
|
||||
{
|
||||
//add the money to the players account
|
||||
AddTransactionToPlayersBook( MERC_DEPOSITED_MONEY_TO_PLAYER_ACCOUNT, gpSMCurrentMerc->ubProfile, GetWorldTotalMin(), (*gpItemPointer)[0]->data.money.uiMoneyAmount );
|
||||
AddTransactionToPlayersBook( MERC_DEPOSITED_MONEY_TO_PLAYER_ACCOUNT, gpSMCurrentMerc->ubProfile, GetWorldTotalMin(), (*gpItemPointer)[0]->data.money.uiMoneyAmount);
|
||||
|
||||
// dirty shopkeeper
|
||||
gubSkiDirtyLevel = SKI_DIRTY_LEVEL2;
|
||||
|
||||
@@ -49,21 +49,23 @@ UINT16 itemRPG;
|
||||
|
||||
UINT32 guiMortarsRolledByTeam = 0;
|
||||
|
||||
//
|
||||
// WDS note 08/06/2008: This is no longer used
|
||||
// ARMY_GUN_CHOICE_TYPE gRegularArmyGunChoices[ARMY_GUN_LEVELS] =
|
||||
// { // INDEX CLASS #CHOICES
|
||||
// { /* 0 - lo pistols */ 2, SW38, DESERTEAGLE, -1, -1, -1 },
|
||||
// { /* 1 - hi pistols */ 2, GLOCK_17, BERETTA_93R, -1, -1, -1 },
|
||||
// { /* 2 - lo SMG/shotgun */ 2, M870, MP5K, -1, -1, -1 },
|
||||
// { /* 3 - lo rifles */ 1, MINI14, -1, -1, -1, -1 },
|
||||
// { /* 4 - hi SMGs */ 2, MAC10, COMMANDO, -1, -1, -1 },
|
||||
// { /* 5 - med rifles */ 1, G41, -1, -1, -1, -1 },
|
||||
// { /* 6 - sniper rifles */ 1, M24, -1, -1, -1, -1 },
|
||||
// { /* 7 - hi rifles */ 2, M14, C7, -1, -1, -1 },
|
||||
// { /* 8 - best rifle */ 1, FNFAL, -1, -1, -1, -1 },
|
||||
// { /* 9 - machine guns */ 1, MINIMI, -1, -1, -1, -1 },
|
||||
// { /* 10- rocket rifle */ 2, ROCKET_RIFLE, MINIMI, -1, -1, -1 },
|
||||
// };
|
||||
|
||||
ARMY_GUN_CHOICE_TYPE gRegularArmyGunChoices[ARMY_GUN_LEVELS] =
|
||||
{ // INDEX CLASS #CHOICES
|
||||
{ /* 0 - lo pistols */ 2, SW38, DESERTEAGLE, -1, -1, -1 },
|
||||
{ /* 1 - hi pistols */ 2, GLOCK_17, BERETTA_93R, -1, -1, -1 },
|
||||
{ /* 2 - lo SMG/shotgun */ 2, M870, MP5K, -1, -1, -1 },
|
||||
{ /* 3 - lo rifles */ 1, MINI14, -1, -1, -1, -1 },
|
||||
{ /* 4 - hi SMGs */ 2, MAC10, COMMANDO, -1, -1, -1 },
|
||||
{ /* 5 - med rifles */ 1, G41, -1, -1, -1, -1 },
|
||||
{ /* 6 - sniper rifles */ 1, M24, -1, -1, -1, -1 },
|
||||
{ /* 7 - hi rifles */ 2, M14, C7, -1, -1, -1 },
|
||||
{ /* 8 - best rifle */ 1, FNFAL, -1, -1, -1, -1 },
|
||||
{ /* 9 - machine guns */ 1, MINIMI, -1, -1, -1, -1 },
|
||||
{ /* 10- rocket rifle */ 2, ROCKET_RIFLE, MINIMI, -1, -1, -1 },
|
||||
};
|
||||
|
||||
ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[ARMY_GUN_LEVELS];// =
|
||||
//{ // INDEX CLASS #CHOICES
|
||||
@@ -3145,7 +3147,10 @@ UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness, BOOLEAN getMatchingCo
|
||||
}
|
||||
|
||||
// couldn't find anything with the exact matching coolness, so return the best item we did find
|
||||
return defaultItem;
|
||||
if (ItemIsLegal(defaultItem))
|
||||
return defaultItem;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
UINT16 PickARandomAttachment(UINT8 typeIndex, UINT16 usBaseItem, UINT8 maxCoolness, BOOLEAN getMatchingCoolness)
|
||||
{
|
||||
@@ -3187,7 +3192,7 @@ UINT16 PickARandomAttachment(UINT8 typeIndex, UINT16 usBaseItem, UINT8 maxCoolne
|
||||
|
||||
// couldn't find anything with the exact matching coolness, so return the best item we did find
|
||||
// DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomAttachment: baseItem = %d, defaultItem = %d",usBaseItem, defaultItem));
|
||||
if (ItemIsLegal(usItem))
|
||||
if (ItemIsLegal(defaultItem))
|
||||
return defaultItem;
|
||||
else
|
||||
return 0;
|
||||
|
||||
+25
-10
@@ -8416,39 +8416,54 @@ UINT16 GetFirstExplosiveOfType(UINT16 expType)
|
||||
return 0;
|
||||
}
|
||||
|
||||
OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier )
|
||||
// WDS - Smart goggle switching
|
||||
OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory )
|
||||
{
|
||||
INT8 bLoop;
|
||||
INT16 bonusToBeat = 0;
|
||||
OBJECTTYPE* pGoggles = 0;
|
||||
// CHRISL:
|
||||
for (bLoop = HANDPOS; bLoop < NUM_INV_SLOTS; bLoop++)
|
||||
{
|
||||
for (bLoop = (searchAllInventory ? HELMETPOS : HANDPOS); bLoop < NUM_INV_SLOTS; bLoop++) {
|
||||
if ( pSoldier->inv[bLoop].exists() == true ) {
|
||||
if (Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE )
|
||||
{
|
||||
if (Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE ) {
|
||||
pGoggles = &(pSoldier->inv[bLoop]);
|
||||
bonusToBeat = Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus;
|
||||
}
|
||||
if (searchAllInventory) {
|
||||
OBJECTTYPE* pObj = &(pSoldier->inv[bLoop]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
|
||||
if ( Item[ iter->usItem ].brightlightvisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE ) {
|
||||
pGoggles = &(*iter);
|
||||
bonusToBeat = Item[ iter->usItem ].brightlightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return( pGoggles );
|
||||
}
|
||||
|
||||
OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier )
|
||||
OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory )
|
||||
{
|
||||
INT8 bLoop;
|
||||
INT16 bonusToBeat = 0;
|
||||
OBJECTTYPE* pGoggles = 0;
|
||||
// CHRISL:
|
||||
for (bLoop = HANDPOS; bLoop < NUM_INV_SLOTS; bLoop++)
|
||||
{
|
||||
for (bLoop = (searchAllInventory ? HELMETPOS : HANDPOS); bLoop < NUM_INV_SLOTS; bLoop++) {
|
||||
if ( pSoldier->inv[bLoop].exists() == true ) {
|
||||
if (Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE )
|
||||
{
|
||||
if (Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE ) {
|
||||
pGoggles = &(pSoldier->inv[bLoop]);
|
||||
bonusToBeat = Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus;
|
||||
}
|
||||
if (searchAllInventory) {
|
||||
OBJECTTYPE* pObj = &(pSoldier->inv[bLoop]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
|
||||
if ( Item[ iter->usItem ].nightvisionrangebonus > bonusToBeat && Item[ iter->usItem ].usItemClass == IC_FACE ) {
|
||||
pGoggles = &(*iter);
|
||||
bonusToBeat = Item[ iter->usItem ].nightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return( pGoggles );
|
||||
|
||||
+3
-2
@@ -281,6 +281,7 @@ INT8 FindRocketLauncherOrCannon( SOLDIERTYPE * pSoldier );
|
||||
INT8 FindNonSmokeLaunchable( SOLDIERTYPE * pSoldier, UINT16 usWeapon );
|
||||
OBJECTTYPE* FindNonSmokeLaunchableAttachment( OBJECTTYPE * pObj, UINT16 usWeapon );
|
||||
UINT16 PickARandomLaunchable(UINT16 itemIndex);
|
||||
bool BadGoggles(SOLDIERTYPE *pTeamSoldier);
|
||||
|
||||
BOOLEAN IsFlashSuppressor( OBJECTTYPE * pObj, SOLDIERTYPE * pSoldier );
|
||||
// HEADROCK: Declaration of new function to detect flash suppression without SOLDIERTYPE argument
|
||||
@@ -329,8 +330,8 @@ INT16 GetAPBonus( OBJECTTYPE * pObj );
|
||||
|
||||
UINT16 GetFirstExplosiveOfType(UINT16 expType);
|
||||
|
||||
OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier );
|
||||
OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier );
|
||||
OBJECTTYPE* FindSunGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory = FALSE );
|
||||
OBJECTTYPE* FindNightGogglesInInv( SOLDIERTYPE * pSoldier, BOOLEAN searchAllInventory = FALSE );
|
||||
|
||||
INT16 GetMinRangeForAimBonus( OBJECTTYPE * pObj );
|
||||
UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier);
|
||||
|
||||
+6
-6
@@ -164,7 +164,7 @@ BOOLEAN SoldierHasKey( SOLDIERTYPE *pSoldier, UINT8 ubKeyID )
|
||||
BOOLEAN KeyExistsInKeyRing( SOLDIERTYPE *pSoldier, UINT8 ubKeyID, UINT8 * pubPos )
|
||||
{
|
||||
// returns the index into the key ring where the key can be found
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
if (!(pSoldier->pKeyRing))
|
||||
{
|
||||
@@ -193,7 +193,7 @@ BOOLEAN KeyExistsInKeyRing( SOLDIERTYPE *pSoldier, UINT8 ubKeyID, UINT8 * pubPos
|
||||
|
||||
BOOLEAN KeyExistsInInventory( SOLDIERTYPE *pSoldier, UINT8 ubKeyID )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
for (ubLoop = 0; ubLoop < pSoldier->inv.size(); ubLoop++)
|
||||
{
|
||||
@@ -250,7 +250,7 @@ BOOLEAN DoUnlockDoor( DOOR * pDoor, UINT8 ubKeyID )
|
||||
|
||||
BOOLEAN AttemptToUnlockDoor( SOLDIERTYPE * pSoldier, DOOR * pDoor )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubKeyID;
|
||||
|
||||
for( ubLoop = 0; ubLoop < MAX_KEYS_PER_LOCK; ubLoop++)
|
||||
@@ -278,7 +278,7 @@ BOOLEAN AttemptToUnlockDoor( SOLDIERTYPE * pSoldier, DOOR * pDoor )
|
||||
|
||||
BOOLEAN AttemptToLockDoor( SOLDIERTYPE * pSoldier, DOOR * pDoor )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubKeyID;
|
||||
|
||||
for( ubLoop = 0; ubLoop < MAX_KEYS_PER_LOCK; ubLoop++)
|
||||
@@ -1866,7 +1866,7 @@ BOOLEAN LoadDoorStatusArrayFromDoorStatusTempFile()
|
||||
CHAR8 zMapName[ 128 ];
|
||||
HWFILE hFile;
|
||||
UINT32 uiNumBytesRead;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
//Convert the current sector location into a file name
|
||||
// GetMapFileName( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, zTempName, FALSE );
|
||||
@@ -2111,7 +2111,7 @@ void DropKeysInKeyRing( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, INT8
|
||||
// no key ring!
|
||||
return;
|
||||
}
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubItem;
|
||||
for (ubLoop = 0; ubLoop < NUM_KEYS; ubLoop++)
|
||||
{
|
||||
|
||||
+1
-1
@@ -3601,7 +3601,7 @@ INT8 FireBulletGivenTarget( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, FLOA
|
||||
|
||||
INT32 iDistance;
|
||||
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubShots;
|
||||
UINT8 ubImpact;
|
||||
INT8 bCTGT;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "ai.h"
|
||||
#include "Dialogue Control.h"
|
||||
#include "Music Control.h"
|
||||
#include "Tactical Save.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -45,7 +46,8 @@
|
||||
class OBJECTTYPE;
|
||||
class SOLDIERTYPE;
|
||||
|
||||
#define MAX_MERC_IN_HELI 20
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
#define MAX_MERC_IN_HELI CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS
|
||||
#define MAX_HELI_SCRIPT 30
|
||||
#define ME_SCRIPT_DELAY 100
|
||||
#define NUM_PER_HELI_RUN 6
|
||||
@@ -474,7 +476,7 @@ void HandleHeliDrop( )
|
||||
{
|
||||
// Add merc to sector
|
||||
MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
|
||||
UpdateMercInSector( MercPtrs[ gusHeliSeats[ cnt ] ], 9, 1, 0 );
|
||||
UpdateMercInSector( MercPtrs[ gusHeliSeats[ cnt ] ], startingX, startingY, startingZ );
|
||||
|
||||
// Check for merc arrives quotes...
|
||||
HandleMercArrivesQuotes( MercPtrs[ gusHeliSeats[ cnt ] ] );
|
||||
@@ -610,7 +612,7 @@ void HandleHeliDrop( )
|
||||
// Change insertion code
|
||||
MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
|
||||
|
||||
UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], 9, 1, 0 );
|
||||
UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], startingX, startingY, startingZ );
|
||||
//EVENT_SetSoldierPosition( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], sWorldX, sWorldY );
|
||||
|
||||
// IF the first guy down, set squad!
|
||||
@@ -809,6 +811,9 @@ void HandleFirstHeliDropOfGame( )
|
||||
// Call people to area
|
||||
CallAvailableEnemiesTo( gsGridNoSweetSpot );
|
||||
|
||||
// Move to header file...
|
||||
AddExtraItems( startingX, startingY, startingZ, true );
|
||||
|
||||
// Say quote.....
|
||||
SayQuoteFromAnyBodyInSector( QUOTE_ENEMY_PRESENCE );
|
||||
|
||||
@@ -820,8 +825,7 @@ void HandleFirstHeliDropOfGame( )
|
||||
}
|
||||
|
||||
// Send message to turn on ai again....
|
||||
CharacterDialogueWithSpecialEvent( 0, 0, 0 , DIALOGUE_TACTICAL_UI , FALSE , FALSE , DIALOGUE_SPECIAL_EVENT_ENABLE_AI ,0, 0 );
|
||||
|
||||
CharacterDialogueWithSpecialEvent( 0, 0, 0, DIALOGUE_TACTICAL_UI , FALSE , FALSE , DIALOGUE_SPECIAL_EVENT_ENABLE_AI ,0, 0 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
+37
-32
@@ -102,8 +102,8 @@ INT8 HireMerc( MERC_HIRE_STRUCT *pHireMerc)
|
||||
if( ( pMerc->bMercStatus != 0 ) && (pMerc->bMercStatus != MERC_ANNOYED_BUT_CAN_STILL_CONTACT ) && ( pMerc->bMercStatus != MERC_HIRED_BUT_NOT_ARRIVED_YET ) )
|
||||
return( MERC_HIRE_FAILED );
|
||||
|
||||
if( NumberOfMercsOnPlayerTeam() >= 18 || (is_client && NumberOfMercsOnPlayerTeam() >= MAX_MERCS)) //hayden, 7 member team limit setable in ini
|
||||
return( MERC_HIRE_OVER_18_MERCS_HIRED );
|
||||
if( NumberOfMercsOnPlayerTeam() >= gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs )
|
||||
return( MERC_HIRE_OVER_PLAYER_LIMIT );
|
||||
|
||||
// ATE: if we are to use landing zone, update to latest value
|
||||
// they will be updated again just before arrival...
|
||||
@@ -197,21 +197,21 @@ INT8 HireMerc( MERC_HIRE_STRUCT *pHireMerc)
|
||||
|
||||
if (!is_networked)
|
||||
{
|
||||
if( DidGameJustStart() )
|
||||
{
|
||||
pHireMerc->uiTimeTillMercArrives = ( gGameExternalOptions.iGameStartingTime + gGameExternalOptions.iFirstArrivalDelay ) / NUM_SEC_IN_MIN;
|
||||
if( DidGameJustStart() )
|
||||
{
|
||||
pHireMerc->uiTimeTillMercArrives = ( gGameExternalOptions.iGameStartingTime + gGameExternalOptions.iFirstArrivalDelay ) / NUM_SEC_IN_MIN;
|
||||
|
||||
// Set insertion for first time in chopper
|
||||
pHireMerc->ubInsertionCode = INSERTION_CODE_CHOPPER;
|
||||
// Set insertion for first time in chopper
|
||||
pHireMerc->ubInsertionCode = INSERTION_CODE_CHOPPER;
|
||||
|
||||
//set when the merc's contract is finished
|
||||
pSoldier->iEndofContractTime = GetMidnightOfFutureDayInMinutes( pSoldier->iTotalContractLength ) + ( GetHourWhenContractDone( pSoldier ) * 60 );
|
||||
}
|
||||
else
|
||||
{
|
||||
//set when the merc's contract is finished ( + 1 cause it takes a day for the merc to arrive )
|
||||
pSoldier->iEndofContractTime = GetMidnightOfFutureDayInMinutes( 1 + pSoldier->iTotalContractLength ) + ( GetHourWhenContractDone( pSoldier ) * 60 );
|
||||
}
|
||||
//set when the merc's contract is finished
|
||||
pSoldier->iEndofContractTime = GetMidnightOfFutureDayInMinutes( pSoldier->iTotalContractLength ) + ( GetHourWhenContractDone( pSoldier ) * 60 );
|
||||
}
|
||||
else
|
||||
{
|
||||
//set when the merc's contract is finished ( + 1 cause it takes a day for the merc to arrive )
|
||||
pSoldier->iEndofContractTime = GetMidnightOfFutureDayInMinutes( 1 + pSoldier->iTotalContractLength ) + ( GetHourWhenContractDone( pSoldier ) * 60 );
|
||||
}
|
||||
}
|
||||
// WANNE - MP: We need this, so the merc contract is correct!
|
||||
else
|
||||
@@ -225,15 +225,15 @@ INT8 HireMerc( MERC_HIRE_STRUCT *pHireMerc)
|
||||
|
||||
if (!is_client)
|
||||
{
|
||||
//if we are trying to hire a merc that should arrive later, put the merc in the queue
|
||||
if( pHireMerc->uiTimeTillMercArrives != 0 )
|
||||
{
|
||||
AddStrategicEvent( EVENT_DELAYED_HIRING_OF_MERC, pHireMerc->uiTimeTillMercArrives, pSoldier->ubID );
|
||||
//if we are trying to hire a merc that should arrive later, put the merc in the queue
|
||||
if( pHireMerc->uiTimeTillMercArrives != 0 )
|
||||
{
|
||||
AddStrategicEvent( EVENT_DELAYED_HIRING_OF_MERC, pHireMerc->uiTimeTillMercArrives, pSoldier->ubID );
|
||||
|
||||
//specify that the merc is hired but hasnt arrived yet
|
||||
pMerc->bMercStatus = MERC_HIRED_BUT_NOT_ARRIVED_YET;
|
||||
//specify that the merc is hired but hasnt arrived yet
|
||||
pMerc->bMercStatus = MERC_HIRED_BUT_NOT_ARRIVED_YET;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -315,17 +315,17 @@ void MercArrivesCallback( UINT8 ubSoldierID )
|
||||
if (!is_networked)
|
||||
{
|
||||
// hayden - maybe you want to duke it out in omerta ;)
|
||||
if( !DidGameJustStart() && gsMercArriveSectorX == 9 && gsMercArriveSectorY == 1 )
|
||||
if( !DidGameJustStart() && gsMercArriveSectorX == 9 && gsMercArriveSectorY == 1 )
|
||||
{
|
||||
//Mercs arriving in A9. This sector has been deemed as the always safe sector.
|
||||
//Seeing we don't support entry into a hostile sector (except for the beginning),
|
||||
//we will nuke any enemies in this sector first.
|
||||
if( gWorldSectorX != 9 || gWorldSectorY != 1 || gbWorldSectorZ )
|
||||
{
|
||||
EliminateAllEnemies( (UINT8)gsMercArriveSectorX, (UINT8)gsMercArriveSectorY );
|
||||
}
|
||||
//Seeing we don't support entry into a hostile sector (except for the beginning),
|
||||
//we will nuke any enemies in this sector first.
|
||||
if( gWorldSectorX != 9 || gWorldSectorY != 1 || gbWorldSectorZ )
|
||||
{
|
||||
EliminateAllEnemies( (UINT8)gsMercArriveSectorX, (UINT8)gsMercArriveSectorY );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This will update ANY soldiers currently schedules to arrive too
|
||||
CheckForValidArrivalSector( );
|
||||
@@ -471,17 +471,22 @@ BOOLEAN IsTheSoldierAliveAndConcious( SOLDIERTYPE *pSoldier )
|
||||
|
||||
UINT8 NumberOfMercsOnPlayerTeam()
|
||||
{
|
||||
INT8 cnt;
|
||||
INT8 cnt;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
INT16 bLastTeamID;
|
||||
UINT8 ubCount=0;
|
||||
INT16 bLastTeamID;
|
||||
UINT8 ubCount=0;
|
||||
|
||||
// Set locator to first merc
|
||||
cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
|
||||
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
|
||||
|
||||
if (! MercPtrs[cnt])
|
||||
return 0;
|
||||
|
||||
for ( pSoldier = MercPtrs[ cnt ]; cnt <= bLastTeamID; cnt++,pSoldier++)
|
||||
{
|
||||
AssertNotNIL(pSoldier);
|
||||
|
||||
//if the is active, and is not a vehicle
|
||||
if( pSoldier->bActive && !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) )
|
||||
{
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
//
|
||||
// Used with the HireMerc function
|
||||
//
|
||||
#define MERC_HIRE_OVER_18_MERCS_HIRED -1
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
#define MERC_HIRE_OVER_PLAYER_LIMIT -1
|
||||
#define MERC_HIRE_FAILED 0
|
||||
#define MERC_HIRE_OK 1
|
||||
|
||||
|
||||
@@ -167,7 +167,6 @@ void ResetMilitia()
|
||||
// a flag for autoresolve if different initialization or destruction is desired.
|
||||
guiCurrentScreen = GAME_SCREEN;
|
||||
|
||||
|
||||
RemoveMilitiaFromTactical();
|
||||
ubNumGreen = MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, GREEN_MILITIA);
|
||||
ubNumReg = MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, REGULAR_MILITIA);
|
||||
|
||||
+3
-3
@@ -151,7 +151,7 @@ void DecayStrategicMorale( SOLDIERTYPE * pSoldier )
|
||||
void DecayTacticalMoraleModifiers( void )
|
||||
{
|
||||
SOLDIERTYPE * pSoldier;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
BOOLEAN fHandleNervous;
|
||||
|
||||
ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
|
||||
@@ -251,7 +251,7 @@ void DecayTacticalMoraleModifiers( void )
|
||||
void DecayStrategicMoraleModifiers( void )
|
||||
{
|
||||
SOLDIERTYPE * pSoldier;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
|
||||
for ( pSoldier = MercPtrs[ ubLoop ]; ubLoop <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ubLoop++, pSoldier++ )
|
||||
@@ -444,7 +444,7 @@ void HandleMoraleEventForSoldier( SOLDIERTYPE * pSoldier, INT8 bMoraleEvent )
|
||||
|
||||
void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, INT16 sMapY, INT8 bMapZ )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
SOLDIERTYPE * pTeamSoldier;
|
||||
MERCPROFILESTRUCT * pProfile;
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
#define MAXTEAMS_SP 6 // WANNE: for singleplayer
|
||||
#define MAXTEAMS 11 //hayden
|
||||
#define MAXMERCS MAX_NUM_SOLDIERS
|
||||
#define MAXMERCS MAX_NUM_SOLDIERS
|
||||
|
||||
//TACTICAL OVERHEAD STUFF
|
||||
//#define NO_SOLDIER TOTAL_SOLDIERS // SAME AS NOBODY
|
||||
@@ -264,11 +264,50 @@ enum WorldDirections
|
||||
};
|
||||
|
||||
|
||||
// Starting Sector
|
||||
const int startingX = 9;
|
||||
const int startingY = 1;
|
||||
const int startingZ = 0;
|
||||
|
||||
|
||||
// ENUMERATION OF SOLDIER POSIITONS IN GLOBAL SOLDIER LIST
|
||||
#define MAX_NUM_SOLDIERS 148
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
#define CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS 32
|
||||
#define CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES 6
|
||||
#define CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES
|
||||
#define CODE_MAXIMUM_NUMBER_OF_ENEMIES 64
|
||||
#define CODE_MAXIMUM_NUMBER_OF_CREATURES 40
|
||||
#define CODE_MAXIMUM_NUMBER_OF_REBELS 64
|
||||
#define CODE_MAXIMUM_NUMBER_OF_CIVS 40
|
||||
|
||||
// The following should be the largest from the above set of constants.
|
||||
// Note: Is there any way to compute this via the preprocessor?
|
||||
#define LARGEST_NUMBER_IN_ANY_GROUP 64
|
||||
|
||||
#define MAX_NUM_SOLDIERS (CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES+CODE_MAXIMUM_NUMBER_OF_CREATURES+CODE_MAXIMUM_NUMBER_OF_REBELS+CODE_MAXIMUM_NUMBER_OF_CIVS)
|
||||
#define NUM_PLANNING_MERCS 8
|
||||
#define TOTAL_SOLDIERS ( NUM_PLANNING_MERCS + MAX_NUM_SOLDIERS )
|
||||
|
||||
// If there are more than (one less the size of the field used to store IDs (currently a char)) then fail
|
||||
#if TOTAL_SOLDIERS > 254
|
||||
#error Too many!
|
||||
#endif
|
||||
#if CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS > LARGEST_NUMBER_IN_ANY_GROUP
|
||||
#error _LARGEST_NUMBER_IN_ANY_GROUP is too small
|
||||
#endif
|
||||
#if CODE_MAXIMUM_NUMBER_OF_ENEMIES > LARGEST_NUMBER_IN_ANY_GROUP
|
||||
#error _LARGEST_NUMBER_IN_ANY_GROUP is too small
|
||||
#endif
|
||||
#if CODE_MAXIMUM_NUMBER_OF_CREATURES > LARGEST_NUMBER_IN_ANY_GROUP
|
||||
#error _LARGEST_NUMBER_IN_ANY_GROUP is too small
|
||||
#endif
|
||||
#if CODE_MAXIMUM_NUMBER_OF_REBELS > LARGEST_NUMBER_IN_ANY_GROUP
|
||||
#error _LARGEST_NUMBER_IN_ANY_GROUP is too small
|
||||
#endif
|
||||
#if CODE_MAXIMUM_NUMBER_OF_CIVS > LARGEST_NUMBER_IN_ANY_GROUP
|
||||
#error _LARGEST_NUMBER_IN_ANY_GROUP is too small
|
||||
#endif
|
||||
|
||||
// DEFINE TEAMS
|
||||
#define OUR_TEAM 0
|
||||
#define ENEMY_TEAM 1
|
||||
|
||||
+70
-20
@@ -142,6 +142,7 @@ INT32 giPauseAllAITimer = 0;
|
||||
|
||||
BOOLEAN sniperwarning;
|
||||
BOOLEAN biggunwarning;
|
||||
BOOLEAN gogglewarning;
|
||||
//BOOLEAN airstrikeavailable;
|
||||
|
||||
TacticalStatusType gTacticalStatus;
|
||||
@@ -326,7 +327,7 @@ CHAR8 gzDirectionStr[][ 30 ] =
|
||||
"NORTH"
|
||||
};
|
||||
|
||||
// TEMP VALUES FOR TEAM DEAFULT POSITIONS
|
||||
// TEMP VALUES FOR TEAM DEFAULT POSITIONS
|
||||
UINT8 bDefaultTeamRangesMP[ MAXTEAMS ][ 2 ] =
|
||||
|
||||
{
|
||||
@@ -345,12 +346,18 @@ UINT8 bDefaultTeamRangesMP[ MAXTEAMS ][ 2 ] =
|
||||
|
||||
UINT8 bDefaultTeamRanges[ MAXTEAMS_SP ][ 2 ] =
|
||||
{
|
||||
0, 19, //20 US
|
||||
20, 51, //32 ENEMY
|
||||
52, 83, //32 CREATURE
|
||||
84, 115, //32 REBELS ( OUR GUYS )
|
||||
116, MAX_NUM_SOLDIERS - 1, //32 CIVILIANS
|
||||
MAX_NUM_SOLDIERS, TOTAL_SOLDIERS - 1 // PLANNING SOLDIERS
|
||||
0,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES-1,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES-1,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES+CODE_MAXIMUM_NUMBER_OF_CREATURES-1,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES+CODE_MAXIMUM_NUMBER_OF_CREATURES,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES+CODE_MAXIMUM_NUMBER_OF_CREATURES+CODE_MAXIMUM_NUMBER_OF_REBELS-1,
|
||||
CODE_MAXIMUM_NUMBER_OF_PLAYER_MERCS+CODE_MAXIMUM_NUMBER_OF_PLAYER_VEHICLES+CODE_MAXIMUM_NUMBER_OF_ENEMIES+CODE_MAXIMUM_NUMBER_OF_CREATURES+CODE_MAXIMUM_NUMBER_OF_REBELS,
|
||||
MAX_NUM_SOLDIERS -1,
|
||||
MAX_NUM_SOLDIERS,
|
||||
TOTAL_SOLDIERS - 1 // PLANNING SOLDIERS
|
||||
};
|
||||
|
||||
COLORVAL bDefaultTeamColors[ MAXTEAMS ] =
|
||||
@@ -669,6 +676,36 @@ BOOLEAN InitOverhead( )
|
||||
gTacticalStatus.Team[ cnt ].bFirstID = bDefaultTeamRangesMP[ cnt ][0];
|
||||
gTacticalStatus.Team[ cnt ].bLastID = bDefaultTeamRangesMP[ cnt ][1];
|
||||
}
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
unsigned max = 0;
|
||||
switch (cnt) {
|
||||
case OUR_TEAM:
|
||||
max = gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs + gGameExternalOptions.ubGameMaximumNumberOfPlayerVehicles;
|
||||
break;
|
||||
case ENEMY_TEAM:
|
||||
max = gGameExternalOptions.ubGameMaximumNumberOfEnemies;
|
||||
break;
|
||||
case CREATURE_TEAM:
|
||||
max = gGameExternalOptions.ubGameMaximumNumberOfCreatures;
|
||||
break;
|
||||
case MILITIA_TEAM:
|
||||
max = gGameExternalOptions.ubGameMaximumNumberOfRebels;
|
||||
break;
|
||||
case CIV_TEAM:
|
||||
max = gGameExternalOptions.ubGameMaximumNumberOfCivilians;
|
||||
break;
|
||||
// Don't worry about the others
|
||||
case PLAYER_PLAN:
|
||||
case LAN_TEAM_ONE:
|
||||
case LAN_TEAM_TWO:
|
||||
case LAN_TEAM_THREE:
|
||||
case LAN_TEAM_FOUR:
|
||||
max = 9999;
|
||||
break;
|
||||
}
|
||||
if (max < (unsigned)(gTacticalStatus.Team[ cnt ].bLastID - gTacticalStatus.Team[ cnt ].bFirstID + 1)) {
|
||||
gTacticalStatus.Team[ cnt ].bLastID = gTacticalStatus.Team[ cnt ].bFirstID + max - 1;
|
||||
}
|
||||
|
||||
gTacticalStatus.Team[ cnt ].RadarColor = bDefaultTeamColors[ cnt ];
|
||||
|
||||
@@ -727,7 +764,7 @@ BOOLEAN InitOverhead( )
|
||||
if (is_networked)
|
||||
gTacticalStatus.fDidGameJustStart = FALSE; //hayden
|
||||
else
|
||||
gTacticalStatus.fDidGameJustStart = TRUE;
|
||||
gTacticalStatus.fDidGameJustStart = TRUE;
|
||||
|
||||
gTacticalStatus.ubLastRequesterTargetID = NO_PROFILE;
|
||||
|
||||
@@ -986,6 +1023,13 @@ BOOLEAN ExecuteOverhead( )
|
||||
{
|
||||
pSoldier = MercSlots[ cnt ];
|
||||
|
||||
if ( pSoldier && pSoldier->bActive && (pSoldier->bTeam == OUR_TEAM) ) {
|
||||
if (!gogglewarning && BadGoggles(pSoldier)) {
|
||||
gogglewarning = TRUE;
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_CHECK_GOGGLES] );
|
||||
}
|
||||
}
|
||||
|
||||
// Syncronize for upcoming soldier counters
|
||||
SYNCTIMECOUNTER( );
|
||||
|
||||
@@ -4015,7 +4059,7 @@ void MilitiaChangesSides( void )
|
||||
/*
|
||||
void MakePotentiallyHostileCivGroupsHostile( void )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
// loop through all civ groups that might become hostile and set them
|
||||
// to hostile
|
||||
@@ -5651,11 +5695,11 @@ void EnterCombatMode( UINT8 ubStartingTeam )
|
||||
|
||||
if (!is_client || is_server) //hayden
|
||||
{
|
||||
StartPlayerTeamTurn( FALSE, TRUE );
|
||||
StartPlayerTeamTurn( FALSE, TRUE );
|
||||
if(is_client)send_EndTurn( ubStartingTeam ); //hayden
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
//ScreenMsg( FONT_YELLOW, MSG_CHAT, L"client skipped EnterCombatMode");
|
||||
if(is_client)startCombat(ubStartingTeam);//clients other than server meet and send request for combat for server
|
||||
}
|
||||
@@ -5775,6 +5819,7 @@ void SetEnemyPresence( )
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("SetEnemyPresence: warnings = false"));
|
||||
sniperwarning = FALSE;
|
||||
biggunwarning = FALSE;
|
||||
gogglewarning = FALSE;
|
||||
// airstrikeavailable = TRUE;
|
||||
}
|
||||
else
|
||||
@@ -5782,6 +5827,7 @@ void SetEnemyPresence( )
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("SetEnemyPresence: warnings = true"));
|
||||
sniperwarning = TRUE;
|
||||
biggunwarning = TRUE;
|
||||
//gogglewarning = TRUE;
|
||||
// airstrikeavailable = FALSE;
|
||||
}
|
||||
|
||||
@@ -5904,7 +5950,9 @@ BOOLEAN WeSawSomeoneThisTurn( void )
|
||||
|
||||
void SayBattleSoundFromAnyBodyInSector( INT32 iBattleSnd )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
// UINT8 ubMercsInSector[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ] = { 0 };
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0);
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
@@ -6615,11 +6663,11 @@ void CycleVisibleEnemies( SOLDIERTYPE *pSrcSoldier )
|
||||
}
|
||||
|
||||
|
||||
INT8 CountNonVehiclesOnPlayerTeam( void )
|
||||
UINT32 CountNonVehiclesOnPlayerTeam( void )
|
||||
{
|
||||
UINT32 cnt;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
INT8 bNumber = 0;
|
||||
UINT32 bNumber = 0;
|
||||
|
||||
for ( cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID, pSoldier = MercPtrs[ cnt ]; cnt <= (UINT32)( gTacticalStatus.Team[ gbPlayerNum ].bLastID ); cnt++, pSoldier++ )
|
||||
{
|
||||
@@ -6637,7 +6685,7 @@ INT8 CountNonVehiclesOnPlayerTeam( void )
|
||||
BOOLEAN PlayerTeamFull( )
|
||||
{
|
||||
// last ID for the player team is 19, so long as we have at most 17 non-vehicles...
|
||||
if ( CountNonVehiclesOnPlayerTeam() <= gTacticalStatus.Team[ gbPlayerNum ].bLastID - 2 )
|
||||
if ( CountNonVehiclesOnPlayerTeam() < gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs /*gTacticalStatus.Team[ gbPlayerNum ].bLastID - 2*/ )
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
@@ -6905,7 +6953,7 @@ BOOLEAN CheckForLosingEndOfBattle( )
|
||||
{
|
||||
// if here, check if we should autoresolve.
|
||||
// if we have at least one guy unconscious, call below function...
|
||||
if ( HandlePotentialBringUpAutoresolveToFinishBattle( ) )
|
||||
if ( HandlePotentialBringUpAutoresolveToFinishBattle( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ) )
|
||||
{
|
||||
// return false here as we are autoresolving...
|
||||
return( FALSE );
|
||||
@@ -7117,7 +7165,7 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker )
|
||||
INT16 sClosestOpponent, sClosestOppLoc;
|
||||
UINT8 ubPointsLost, ubTotalPointsLost, ubNewStance;
|
||||
UINT32 uiLoop;
|
||||
UINT8 ubLoop2;
|
||||
UINT8 ubLoop2;
|
||||
UINT16 uiLoop3;
|
||||
SOLDIERTYPE * pSoldier;
|
||||
|
||||
@@ -8419,7 +8467,9 @@ BOOLEAN HostileBloodcatsPresent( void )
|
||||
|
||||
void HandleCreatureTenseQuote( )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
// UINT8 ubMercsInSector[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ] = { 0 };
|
||||
std::vector<UINT8> ubMercsInSector (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, 0);
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
|
||||
+7
-4
@@ -45,12 +45,12 @@ typedef struct
|
||||
UINT8 bFirstID;
|
||||
UINT8 bLastID;
|
||||
COLORVAL RadarColor;
|
||||
INT8 bSide;
|
||||
INT8 bSide;
|
||||
INT8 bMenInSector;
|
||||
UINT8 ubLastMercToRadio;
|
||||
INT8 bTeamActive;
|
||||
INT8 bAwareOfOpposition;
|
||||
INT8 bHuman;
|
||||
INT8 bTeamActive;
|
||||
INT8 bAwareOfOpposition;
|
||||
INT8 bHuman;
|
||||
} TacticalTeamType;
|
||||
|
||||
//for use with TacticalStatusType.ubEnemyIntention
|
||||
@@ -223,6 +223,8 @@ BOOLEAN InitOverhead( );
|
||||
BOOLEAN ShutdownOverhead( );
|
||||
BOOLEAN GetSoldier( SOLDIERTYPE **ppSoldier, UINT16 usSoldierIndex );
|
||||
|
||||
UINT32 CountNonVehiclesOnPlayerTeam( void );
|
||||
|
||||
INT16 NewOKDestination( SOLDIERTYPE * pCurrSoldier, INT16 sGridNo, BOOLEAN fPeopleToo, INT8 bLevel );
|
||||
|
||||
//Simple check to see if a (one-tiled) soldier can occupy a given location on the ground or roof.
|
||||
@@ -361,6 +363,7 @@ void SetSoldierNeutral( SOLDIERTYPE * pSoldier );
|
||||
|
||||
extern BOOLEAN sniperwarning;
|
||||
extern BOOLEAN biggunwarning;
|
||||
extern BOOLEAN gogglewarning;
|
||||
//extern BOOLEAN airstrikeavailable;
|
||||
|
||||
//void CheckForAndSetupAirRaid ();
|
||||
|
||||
+2
-1
@@ -2378,7 +2378,8 @@ INT16 MinAPsToThrow( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 ubAddTurningCos
|
||||
// make sure the guy's actually got a throwable item in his hand!
|
||||
usInHand = pSoldier->inv[ HANDPOS ].usItem;
|
||||
|
||||
if ( ( !(Item[ usInHand ].usItemClass & IC_GRENADE) ) )
|
||||
if ( ( !(Item[ usInHand ].usItemClass & IC_GRENADE) &&
|
||||
!(Item[ usInHand ].usItemClass & IC_LAUNCHER)) )
|
||||
{
|
||||
//AXP 25.03.2007: See if we are about to throw grenade (grenade was not in hand, but in temp object)
|
||||
if ( pSoldier->pTempObject != NULL && pSoldier->pThrowParams != NULL &&
|
||||
|
||||
@@ -694,7 +694,7 @@ void QueryRTLeftButton( UINT32 *puiNewEvent )
|
||||
else
|
||||
{
|
||||
//if ( FindBestPath( pSoldier, sMapPos, pSoldier->pathing.bLevel, pSoldier->usUIMovementMode, NO_COPYROUTE, 0 ) == 0 )
|
||||
if ( gsCurrentActionPoints == 0 && !gfUIAllMoveOn && !gTacticalStatus.fAtLeastOneGuyOnMultiSelect )
|
||||
if (gsCurrentActionPoints == 0 && !gfUIAllMoveOn && !gTacticalStatus.fAtLeastOneGuyOnMultiSelect )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
|
||||
gfRTClickLeftHoldIntercepted = TRUE;
|
||||
|
||||
@@ -354,7 +354,7 @@ INT8 gDecapitatedCorpse[ NUM_CORPSES ] =
|
||||
|
||||
|
||||
|
||||
ROTTING_CORPSE gRottingCorpse[ MAX_ROTTING_CORPSES ];
|
||||
std::vector<ROTTING_CORPSE> gRottingCorpse (MAX_ROTTING_CORPSES);
|
||||
INT32 giNumRottingCorpse = 0;
|
||||
|
||||
|
||||
@@ -465,7 +465,7 @@ INT32 AddRottingCorpse( ROTTING_CORPSE_DEFINITION *pCorpseDef )
|
||||
STRUCTURE_FILE_REF * pStructureFileRef = NULL;
|
||||
CHAR8 zFilename[150];
|
||||
DB_STRUCTURE_REF *pDBStructureRef;
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
INT16 sTileGridNo;
|
||||
DB_STRUCTURE_TILE ** ppTile;
|
||||
UINT16 usStructIndex;
|
||||
|
||||
@@ -168,9 +168,11 @@ void HandleCrowLeave( SOLDIERTYPE *pSoldier );
|
||||
|
||||
void HandleCrowFlyAway( SOLDIERTYPE *pSoldier );
|
||||
|
||||
#define MAX_ROTTING_CORPSES 100
|
||||
// WDS - increase number of corpses
|
||||
#define MAX_ROTTING_CORPSES 250
|
||||
|
||||
extern ROTTING_CORPSE gRottingCorpse[ MAX_ROTTING_CORPSES ];
|
||||
//extern ROTTING_CORPSE gRottingCorpse[ MAX_ROTTING_CORPSES ];
|
||||
extern std::vector<ROTTING_CORPSE> gRottingCorpse;
|
||||
extern INT32 giNumRottingCorpse;
|
||||
extern UINT8 gb4DirectionsFrom8[8];
|
||||
|
||||
|
||||
@@ -364,8 +364,8 @@ BOOLEAN gfRemindedPlayerToPickUpHisStuff = FALSE;
|
||||
BOOLEAN gfDoneBusinessThisSession = FALSE;
|
||||
|
||||
// this is used within SKI exclusively, to handle small faces
|
||||
UINT8 gubArrayOfEmployedMercs[ MAX_CHARACTER_COUNT ];
|
||||
UINT32 guiSmallSoldiersFace[ MAX_CHARACTER_COUNT ];
|
||||
UINT8 gubArrayOfEmployedMercs[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
|
||||
UINT32 guiSmallSoldiersFace[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ];
|
||||
UINT8 gubNumberMercsInArray;
|
||||
|
||||
//The subutitled text for what the merc is saying
|
||||
|
||||
@@ -295,7 +295,7 @@ INT32 SkillCheck( SOLDIERTYPE * pSoldier, INT8 bReason, INT8 bChanceMod )
|
||||
|
||||
case DISARM_TRAP_CHECK:
|
||||
|
||||
fForceDamnSound = TRUE;
|
||||
fForceDamnSound = TRUE;
|
||||
|
||||
iSkill = EffectiveExplosive( pSoldier ) * 7;
|
||||
if ( iSkill == 0 )
|
||||
|
||||
@@ -1090,14 +1090,14 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO
|
||||
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
// ATE: Make sure life of elliot is OK if from a meanwhile
|
||||
if ( AreInMeanwhile() && pSoldier->ubProfile == ELLIOT )
|
||||
{
|
||||
if ( pSoldier->stats.bLife < OKLIFE )
|
||||
// ATE: Make sure life of elliot is OK if from a meanwhile
|
||||
if ( AreInMeanwhile() && pSoldier->ubProfile == ELLIOT )
|
||||
{
|
||||
pSoldier->stats.bLife = 25;
|
||||
if ( pSoldier->stats.bLife < OKLIFE )
|
||||
{
|
||||
pSoldier->stats.bLife = 25;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ADD SOLDIER TO SLOT!
|
||||
if (pSoldier->flags.uiStatusFlags & SOLDIER_OFF_MAP)
|
||||
@@ -1151,7 +1151,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO
|
||||
if( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
|
||||
{
|
||||
sGridNo = FindGridNoFromSweetSpotWithStructDataUsingGivenDirectionFirst( pSoldier, STANDING, pSoldier->sInsertionGridNo, 12, &ubCalculatedDirection, FALSE, pSoldier->ubInsertionDirection );
|
||||
// ATE: Override insertion direction
|
||||
// ATE: Override insertion direction
|
||||
if (sGridNo == NOWHERE)
|
||||
{
|
||||
// Well, we gotta place this soldier/vehicle somewhere. Just use the first position for now
|
||||
|
||||
@@ -2937,8 +2937,11 @@ BOOLEAN ShouldMercSayHappyWithGunQuote( SOLDIERTYPE *pSoldier )
|
||||
|
||||
void SayBuddyWitnessedQuoteFromKill( SOLDIERTYPE *pKillerSoldier, INT16 sGridNo, INT8 bLevel )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
INT8 bBuddyIndex[ 20 ] = { -1 };
|
||||
// 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 };
|
||||
std::vector<INT8> bBuddyIndex (CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS, -1);
|
||||
// INT8 bBuddyIndex[ CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS ] = { -1 };
|
||||
INT8 bTempBuddyIndex;
|
||||
UINT8 ubNumMercs = 0;
|
||||
UINT8 ubChosenMerc;
|
||||
@@ -3043,7 +3046,9 @@ void HandleKilledQuote( SOLDIERTYPE *pKilledSoldier, SOLDIERTYPE *pKillerSoldier
|
||||
{
|
||||
SOLDIERTYPE *pTeamSoldier;
|
||||
INT32 cnt;
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// 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;
|
||||
BOOLEAN fDoSomeoneElse = FALSE;
|
||||
|
||||
@@ -7273,7 +7273,7 @@ BOOLEAN SOLDIERTYPE::CreateSoldierPalettes( void )
|
||||
// --- TAKE FROM CURRENT ANIMATION HVOBJECT!
|
||||
usAnimSurface = GetSoldierAnimationSurface( this, this->usAnimState );
|
||||
|
||||
CHECKF( usAnimSurface != INVALID_ANIMATION_SURFACE );
|
||||
// CHECKF( usAnimSurface != INVALID_ANIMATION_SURFACE );
|
||||
|
||||
if ( ( bBodyTypePalette = GetBodyTypePaletteSubstitutionCode( this, this->ubBodyType, zColFilename ) ) == -1 )
|
||||
{
|
||||
|
||||
@@ -438,6 +438,7 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *
|
||||
tbTeam=pCreateStruct->bTeam;
|
||||
tfPP=pCreateStruct->fPlayerPlan; //used as temp indicator of struct sent from the server //hayden.
|
||||
|
||||
if(is_networked) {
|
||||
if(is_networked && (pCreateStruct->fOnRoof==1))
|
||||
{
|
||||
ScreenMsg( FONT_YELLOW, MSG_CHAT, L"skipping roof merc");
|
||||
@@ -464,7 +465,7 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *
|
||||
ScreenMsg( FONT_YELLOW, MSG_CHAT, L"skipping tank");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//hayden
|
||||
//Kris:
|
||||
@@ -606,7 +607,7 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *
|
||||
{
|
||||
if( Soldier.bTeam == gbPlayerNum )
|
||||
{
|
||||
cnt = gTacticalStatus.Team[ Soldier.bTeam ].bLastID - 1;
|
||||
cnt = gTacticalStatus.Team[ Soldier.bTeam ].bLastID - gGameExternalOptions.ubGameMaximumNumberOfPlayerVehicles+1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ class SOLDIERTYPE;
|
||||
|
||||
#define SOLDIER_CREATE_AUTO_TEAM -1
|
||||
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
//Kris:
|
||||
//This value is the total maximum number of slots in a map.
|
||||
//Players 20
|
||||
@@ -26,7 +27,7 @@ class SOLDIERTYPE;
|
||||
//Rebels 32
|
||||
//Civilians 32
|
||||
//Total 148
|
||||
#define MAX_INDIVIDUALS 148
|
||||
#define MAX_INDIVIDUALS TOTAL_SOLDIERS
|
||||
|
||||
//Kris: SERIALIZING INFORMATION
|
||||
//All maps must have:
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "debug.h"
|
||||
#include "Random.h"
|
||||
#include "items.h"
|
||||
#include "GameSettings.h"
|
||||
|
||||
#include "cursors.h"
|
||||
|
||||
@@ -918,6 +919,8 @@ void AddSoldierInitListEnemyDefenceSoldiers( UINT8 ubTotalAdmin, UINT8 ubTotalTr
|
||||
|
||||
ubMaxNum = ubTotalAdmin + ubTotalTroops + ubTotalElite;
|
||||
|
||||
AssertLE (ubMaxNum, gGameExternalOptions.ubGameMaximumNumberOfEnemies);
|
||||
|
||||
//Sort the list in the following manner:
|
||||
//-Priority placements first
|
||||
//-Basic placements next
|
||||
|
||||
@@ -481,7 +481,7 @@ BOOLEAN LoadMercProfiles(void)
|
||||
|
||||
void DecideActiveTerrorists( void )
|
||||
{
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubTerrorist;
|
||||
UINT8 ubNumAdditionalTerrorists, ubNumTerroristsAdded = 0;
|
||||
UINT32 uiChance, uiLocationChoice;
|
||||
@@ -691,7 +691,7 @@ 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 ubLoop, ubLoop2;
|
||||
UINT8 ubTown;
|
||||
|
||||
#ifdef CRIPPLED_VERSION
|
||||
@@ -1121,6 +1121,11 @@ BOOLEAN RecruitRPC( UINT8 ubCharNum )
|
||||
// Add this guy to our team!
|
||||
pNewSoldier = ChangeSoldierTeam( pSoldier, gbPlayerNum );
|
||||
|
||||
if (!pNewSoldier)
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
|
||||
if ( ubCharNum == SLAY )
|
||||
{
|
||||
if(gGameExternalOptions.fEnableSlayForever == TRUE)
|
||||
|
||||
+16
-20
@@ -18,7 +18,9 @@
|
||||
#include "jascreens.h"
|
||||
#include "screenids.h"
|
||||
#include "Soldier macros.h"
|
||||
#include "GameSettings.h"
|
||||
#endif
|
||||
#include <vector>
|
||||
|
||||
|
||||
typedef struct
|
||||
@@ -341,9 +343,8 @@ BOOLEAN AddCharacterToAnySquad( SOLDIERTYPE *pCharacter )
|
||||
RemoveCharacterFromSquads( pCharacter );
|
||||
|
||||
// first look for a compatible NON-EMPTY squad (don't start new squad if we don't have to)
|
||||
for( bCounter = 0; bCounter < NUMBER_OF_SQUADS; bCounter++ )
|
||||
{
|
||||
if( SquadIsEmpty( bCounter ) == FALSE )
|
||||
for( bCounter = 0; bCounter < NUMBER_OF_SQUADS; bCounter++ ) {
|
||||
if( !SquadIsEmpty( bCounter ) )
|
||||
{
|
||||
if( AddCharacterToSquad( pCharacter, bCounter ) == TRUE )
|
||||
{
|
||||
@@ -400,24 +401,19 @@ INT8 AddCharacterToUniqueSquad( SOLDIERTYPE *pCharacter )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
void SortSquadByID( INT8 bSquadValue )
|
||||
{
|
||||
INT8 teamOrder[18] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
|
||||
|
||||
for(int count = 0; count < NUMBER_OF_SOLDIERS_PER_SQUAD; count ++)
|
||||
{
|
||||
if(Squad[bSquadValue][0] != NULL)
|
||||
{
|
||||
teamOrder[Squad[bSquadValue][0]->ubID] = count;
|
||||
RemoveCharacterFromSquads( Squad[bSquadValue][0] );
|
||||
}
|
||||
}
|
||||
for(int count = 0; count < 18; count++)
|
||||
//for(int count = 17; count >= 0; count--)
|
||||
{
|
||||
if(teamOrder[count] != -1)
|
||||
{
|
||||
AddCharacterToSquad(MercPtrs[count], bSquadValue);
|
||||
for(unsigned idx1 = 0; idx1 < NUMBER_OF_SOLDIERS_PER_SQUAD-1; ++idx1) {
|
||||
if (Squad[bSquadValue][idx1]) {
|
||||
for(unsigned idx2 = idx1+1; idx2 < NUMBER_OF_SOLDIERS_PER_SQUAD; ++idx2) {
|
||||
if (Squad[bSquadValue][idx2] &&
|
||||
(Squad[bSquadValue][idx2]->ubID < Squad[bSquadValue][idx1]->ubID)) {
|
||||
SOLDIERTYPE *temp = Squad[bSquadValue][idx1];
|
||||
Squad[bSquadValue][idx1] = Squad[bSquadValue][idx2];
|
||||
Squad[bSquadValue][idx2] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -914,7 +910,7 @@ void RebuildCurrentSquad( void )
|
||||
void ExamineCurrentSquadLights( void )
|
||||
{
|
||||
// rebuilds current squad to reset faces in tactical
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
// OK, we should add lights for any guy currently bInSector who is not bad OKLIFE...
|
||||
ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "Soldier Control.h"
|
||||
#include "FileMan.h"
|
||||
#include "Overhead Types.h"
|
||||
|
||||
// header for squad management system
|
||||
#define NUMBER_OF_SOLDIERS_PER_SQUAD 6
|
||||
|
||||
@@ -95,6 +95,8 @@ BOOLEAN SetSectorFlag( INT16 sMapX, INT16 sMapY, UINT8 bMapZ, UINT32 uiFlagToSet
|
||||
BOOLEAN ReSetUnderGroundSectorFlag( INT16 sSectorX, INT16 sSectorY, UINT8 ubSectorZ, UINT32 uiFlagToSet );
|
||||
BOOLEAN ReSetSectorFlag( INT16 sMapX, INT16 sMapY, UINT8 bMapZ, UINT32 uiFlagToSet );
|
||||
|
||||
void AddExtraItems (UINT8, UINT8, UINT8, bool = false);
|
||||
|
||||
|
||||
//Saves the NPC temp Quote file to the saved game file
|
||||
BOOLEAN LoadTempNpcQuoteArrayToSaveGameFile( HWFILE hFile );
|
||||
|
||||
@@ -44,7 +44,9 @@ extern UINT8 NumEnemyInSector();
|
||||
|
||||
void HandleRPCDescription( )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// 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;
|
||||
|
||||
+101
-91
@@ -123,7 +123,7 @@ typedef struct
|
||||
|
||||
void ClearIntList( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"ClearIntList");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"ClearIntList");
|
||||
memset( &gubOutOfTurnOrder, 0, MAXMERCS );
|
||||
gubOutOfTurnOrder[0] = END_OF_INTERRUPTS;
|
||||
gubOutOfTurnPersons = 0;
|
||||
@@ -134,7 +134,7 @@ BOOLEAN BloodcatsPresent( void )
|
||||
INT32 iLoop;
|
||||
SOLDIERTYPE * pSoldier;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"BloodcatsPresent");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"BloodcatsPresent");
|
||||
if ( gTacticalStatus.Team[ CREATURE_TEAM ].bTeamActive == FALSE )
|
||||
{
|
||||
return( FALSE );
|
||||
@@ -156,7 +156,7 @@ BOOLEAN BloodcatsPresent( void )
|
||||
void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
{
|
||||
INT32 cnt;
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"StartPlayerTeamTurn");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"StartPlayerTeamTurn");
|
||||
// SOLDIERTYPE *pSoldier;
|
||||
// EV_S_BEGINTURN SBeginTurn;
|
||||
|
||||
@@ -204,7 +204,7 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
// Check if this guy is able to be selected....
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->stats.bLife < OKLIFE )
|
||||
{
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("StartPlayerTeamTurn: SelectNextAvailSoldier"));
|
||||
DebugMsg(TOPIC_JA2INTERRUPT,DBG_LEVEL_3,String("StartPlayerTeamTurn: SelectNextAvailSoldier"));
|
||||
SelectNextAvailSoldier( MercPtrs[ gusSelectedSoldier ] );
|
||||
}
|
||||
else
|
||||
@@ -261,7 +261,7 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
|
||||
void FreezeInterfaceForEnemyTurn( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"FreezeInterfaceForEnemyTurn");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"FreezeInterfaceForEnemyTurn");
|
||||
// Reset flags
|
||||
gfPlotNewMovement = TRUE;
|
||||
|
||||
@@ -288,7 +288,7 @@ void FreezeInterfaceForEnemyTurn( void )
|
||||
|
||||
void EndTurn( UINT8 ubNextTeam )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EndTurn");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EndTurn");
|
||||
SOLDIERTYPE * pSoldier;
|
||||
INT32 cnt;
|
||||
|
||||
@@ -343,7 +343,7 @@ void EndTurn( UINT8 ubNextTeam )
|
||||
|
||||
void EndAITurn( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EndAITurn");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EndAITurn");
|
||||
SOLDIERTYPE * pSoldier;
|
||||
INT32 cnt;
|
||||
|
||||
@@ -379,7 +379,7 @@ void EndAITurn( void )
|
||||
|
||||
void EndAllAITurns( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EndAllAITurns");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EndAllAITurns");
|
||||
// warp turn to the player's turn
|
||||
SOLDIERTYPE * pSoldier;
|
||||
INT32 cnt;
|
||||
@@ -413,7 +413,7 @@ void EndAllAITurns( void )
|
||||
|
||||
void EndTurnEvents( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EndTurnEvents");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EndTurnEvents");
|
||||
// HANDLE END OF TURN EVENTS
|
||||
// handle team services like healing
|
||||
HandleTeamServices( gbPlayerNum );
|
||||
@@ -435,7 +435,7 @@ BOOLEAN LightningEndOfTurn( UINT8 ubTeam );
|
||||
|
||||
void BeginTeamTurn( UINT8 ubTeam )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"BeginTeamTurn");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"BeginTeamTurn");
|
||||
INT32 cnt;
|
||||
UINT8 ubID;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
@@ -554,8 +554,8 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
if(!gfAmIHost)
|
||||
break;
|
||||
#endif
|
||||
if( is_client && !is_server ) //hayden //disable independant client AI
|
||||
break;
|
||||
if( is_client && !is_server ) //hayden //disable independant client AI
|
||||
break;
|
||||
|
||||
|
||||
// Set First enemy merc to AI control
|
||||
@@ -594,7 +594,7 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
|
||||
void DisplayHiddenInterrupt( SOLDIERTYPE * pSoldier )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"DisplayHiddenInterrupt");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"DisplayHiddenInterrupt");
|
||||
// If the AI got an interrupt but this has been hidden from the player until this point,
|
||||
// this code will display the interrupt
|
||||
|
||||
@@ -621,20 +621,20 @@ void DisplayHiddenInterrupt( SOLDIERTYPE * pSoldier )
|
||||
// Dirty panel interface!
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"about to call ErasePath");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"about to call ErasePath");
|
||||
// Erase path!
|
||||
ErasePath( TRUE );
|
||||
|
||||
// Reset flags
|
||||
gfPlotNewMovement = TRUE;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"about to call AdjustNoAPToFinishMove");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"about to call AdjustNoAPToFinishMove");
|
||||
// Stop our guy....
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->AdjustNoAPToFinishMove( TRUE );
|
||||
// Stop him from going to prone position if doing a turn while prone
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"about to call AddTopMessage");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"about to call AddTopMessage");
|
||||
// get rid of any old overlay message
|
||||
if ( pSoldier->bTeam == MILITIA_TEAM )
|
||||
{
|
||||
@@ -647,12 +647,12 @@ void DisplayHiddenInterrupt( SOLDIERTYPE * pSoldier )
|
||||
|
||||
gfHiddenInterrupt = FALSE;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"DisplayHiddenInterrupt completed");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"DisplayHiddenInterrupt completed");
|
||||
}
|
||||
|
||||
void DisplayHiddenTurnbased( SOLDIERTYPE * pActingSoldier )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"DisplayHiddenTurnBased");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"DisplayHiddenTurnBased");
|
||||
// This code should put the game in turn-based and give control to the AI-controlled soldier
|
||||
// whose pointer has been passed in as an argument (we were in non-combat and the AI is doing
|
||||
// something visible, i.e. making an attack)
|
||||
@@ -702,7 +702,7 @@ void DisplayHiddenTurnbased( SOLDIERTYPE * pActingSoldier )
|
||||
|
||||
BOOLEAN EveryoneInInterruptListOnSameTeam( void )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EveryoneInInterruptListOnSameTeam");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EveryoneInInterruptListOnSameTeam");
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubTeam = 255;
|
||||
|
||||
@@ -732,19 +732,23 @@ void StartInterrupt( void )
|
||||
UINT8 ubInterrupter;
|
||||
INT32 cnt;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"StartInterrupt");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"StartInterrupt");
|
||||
ubFirstInterrupter = LATEST_INTERRUPT_GUY;
|
||||
AssertLE(ubFirstInterrupter, MAX_NUM_SOLDIERS);
|
||||
pSoldier = MercPtrs[ubFirstInterrupter];
|
||||
AssertNotNIL(pSoldier);
|
||||
bTeam = pSoldier->bTeam;
|
||||
ubInterrupter = ubFirstInterrupter;
|
||||
|
||||
#ifdef _DEBUG
|
||||
// display everyone on int queue!
|
||||
for ( cnt = gubOutOfTurnPersons; cnt > 0; cnt-- )
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("STARTINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("STARTINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
}
|
||||
#endif
|
||||
|
||||
//DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: %d is now on top of the interrupt queue", ubFirstInterrupter ) );
|
||||
//DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: %d is now on top of the interrupt queue", ubFirstInterrupter ) );
|
||||
|
||||
gTacticalStatus.fInterruptOccurred = TRUE;
|
||||
|
||||
@@ -769,7 +773,7 @@ void StartInterrupt( void )
|
||||
while( 1 )
|
||||
{
|
||||
MercPtrs[ubInterrupter]->aiData.bMoved = FALSE;
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
|
||||
REMOVE_LATEST_INTERRUPT_GUY();
|
||||
// now LATEST_INTERRUPT_GUY is the guy before the previous
|
||||
@@ -818,7 +822,7 @@ void StartInterrupt( void )
|
||||
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, sTemp );
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: starting interrupt for %d", ubFirstInterrupter ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: starting interrupt for %d", ubFirstInterrupter ) );
|
||||
// gusSelectedSoldier should become the topmost guy on the interrupt list
|
||||
//gusSelectedSoldier = ubFirstInterrupter;
|
||||
|
||||
@@ -889,7 +893,7 @@ void StartInterrupt( void )
|
||||
|
||||
MercPtrs[ubInterrupter]->aiData.bMoved = FALSE;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
|
||||
REMOVE_LATEST_INTERRUPT_GUY();
|
||||
// now LATEST_INTERRUPT_GUY is the guy before the previous
|
||||
@@ -949,7 +953,7 @@ void StartInterrupt( void )
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->AdjustNoAPToFinishMove( TRUE );
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
}
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"StartInterrupt done");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"StartInterrupt done");
|
||||
|
||||
}
|
||||
|
||||
@@ -962,11 +966,11 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
BOOLEAN fFound;
|
||||
INT16 ubMinAPsToAttack;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"EndInterrupt");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"EndInterrupt");
|
||||
|
||||
for ( cnt = gubOutOfTurnPersons; cnt > 0; cnt-- )
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ENDINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("ENDINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
}
|
||||
|
||||
// ATE: OK, now if this all happended on one frame, we may not have to stop
|
||||
@@ -1001,8 +1005,9 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
// resume interrupted interrupt
|
||||
//hayden
|
||||
if (is_networked)
|
||||
{
|
||||
if (!is_networked) {
|
||||
StartInterrupt();
|
||||
} else {
|
||||
UINT8 nubFirstInterrupter;
|
||||
INT8 nbTeam;
|
||||
SOLDIERTYPE * npSoldier;
|
||||
@@ -1021,8 +1026,8 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
else if(is_server && gTacticalStatus.ubCurrentTeam == 1)// against ai
|
||||
{
|
||||
|
||||
//hayden
|
||||
send_interrupt( npSoldier ); //
|
||||
//hayden
|
||||
send_interrupt( npSoldier ); //
|
||||
if(nbTeam !=0)intAI(npSoldier);
|
||||
else StartInterrupt();//
|
||||
//requestAIint( npSoldier );
|
||||
@@ -1038,17 +1043,13 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
StartInterrupt();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ubInterruptedSoldier = LATEST_INTERRUPT_GUY;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: interrupt over, %d's team regains control", ubInterruptedSoldier ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: interrupt over, %d's team regains control", ubInterruptedSoldier ) );
|
||||
|
||||
pSoldier = MercPtrs[ubInterruptedSoldier];
|
||||
|
||||
@@ -1097,7 +1098,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
// Select soldier....
|
||||
if ( MercPtrs[ ubInterruptedSoldier ]->stats.bLife < OKLIFE )
|
||||
{
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("EndInterrupt: SelectNextAvailSoldier"));
|
||||
DebugMsg(TOPIC_JA2INTERRUPT,DBG_LEVEL_3,String("EndInterrupt: SelectNextAvailSoldier"));
|
||||
SelectNextAvailSoldier( MercPtrs[ ubInterruptedSoldier ] );
|
||||
}
|
||||
else
|
||||
@@ -1171,7 +1172,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
}
|
||||
|
||||
}
|
||||
else if(pSoldier->bTeam < 6)//hayden : is Ai or LAN ?
|
||||
else if (!is_networked || (pSoldier->bTeam < 6))//hayden : is Ai or LAN ?
|
||||
{
|
||||
// this could be set to true for AI-vs-AI interrupts
|
||||
gfHiddenInterrupt = FALSE;
|
||||
@@ -1261,13 +1262,13 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
// Signal UI done enemy's turn
|
||||
if(is_client)
|
||||
{
|
||||
guiPendingOverrideEvent = LA_BEGINUIOURTURNLOCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
}
|
||||
{
|
||||
guiPendingOverrideEvent = LA_BEGINUIOURTURNLOCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
}
|
||||
|
||||
// must clear int list before ending turn
|
||||
ClearIntList();
|
||||
@@ -1275,19 +1276,19 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
}
|
||||
}
|
||||
|
||||
else //its going to another Lan client..//hayden
|
||||
else if (is_networked) //its going to another Lan client..//hayden
|
||||
{
|
||||
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
AddTopMessage( COMPUTER_TURN_MESSAGE, TeamTurnString[ gTacticalStatus.ubCurrentTeam ] );
|
||||
if(is_client)
|
||||
{
|
||||
guiPendingOverrideEvent = LA_BEGINUIOURTURNLOCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
}
|
||||
if(is_client)
|
||||
{
|
||||
guiPendingOverrideEvent = LA_BEGINUIOURTURNLOCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
guiPendingOverrideEvent = LU_BEGINUILOCK;
|
||||
}
|
||||
|
||||
// must clear int list before ending turn
|
||||
ClearIntList();
|
||||
@@ -1302,7 +1303,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, INT8 bOldOppList)
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"StandardInterruptConditionsMet");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"StandardInterruptConditionsMet");
|
||||
// UINT8 ubAniType;
|
||||
INT16 ubMinPtsNeeded;
|
||||
INT8 bDir;
|
||||
@@ -1495,10 +1496,18 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !(is_client || (pOpponent->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL)) && (pSoldier->bSide != pOpponent->bSide))
|
||||
{
|
||||
return( FALSE );
|
||||
if (!is_networked) {
|
||||
if ( !(pOpponent->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL) && (pSoldier->bSide != pOpponent->bSide))
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
} else {
|
||||
if ( !(is_client || (pOpponent->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL)) && (pSoldier->bSide != pOpponent->bSide))
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* old DG code for same:
|
||||
|
||||
@@ -1590,7 +1599,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
INT32 iPoints;
|
||||
INT8 bLightLevel;
|
||||
UINT8 ubDistance;
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"CalcInterruptDuelPts");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"CalcInterruptDuelPts");
|
||||
|
||||
// extra check to make sure neutral folks never get interrupts
|
||||
if (pSoldier->aiData.bNeutral)
|
||||
@@ -1766,20 +1775,20 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
}
|
||||
|
||||
#ifdef DEBUG_INTERRUPTS
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Calculating int pts for %d vs %d, number is %d", pSoldier->ubID, ubOpponentID, iPoints ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("Calculating int pts for %d vs %d, number is %d", pSoldier->ubID, ubOpponentID, iPoints ) );
|
||||
#endif
|
||||
if(is_networked)
|
||||
{
|
||||
SOLDIERTYPE *pOpp = &Menptr[ubOpponentID];
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_CHAT, L"Interrupt: '%s' vs '%s' = %d points.",pSoldier->name,pOpp->name, iPoints );
|
||||
}
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"CalcInterruptDuelPts done");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"CalcInterruptDuelPts done");
|
||||
return( (INT8)iPoints );
|
||||
}
|
||||
|
||||
BOOLEAN InterruptDuel( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOpponent)
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InterruptDuel");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"InterruptDuel");
|
||||
BOOLEAN fResult = FALSE;
|
||||
|
||||
// if opponent can't currently see us and we can see them
|
||||
@@ -1801,14 +1810,14 @@ BOOLEAN InterruptDuel( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOpponent)
|
||||
}
|
||||
}
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt duel %d (%d pts) vs %d (%d pts)", pSoldier->ubID, pSoldier->aiData.bInterruptDuelPts, pOpponent->ubID, pOpponent->aiData.bInterruptDuelPts );
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InterruptDuel done");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"InterruptDuel done");
|
||||
return( fResult );
|
||||
}
|
||||
|
||||
|
||||
void DeleteFromIntList( UINT8 ubIndex, BOOLEAN fCommunicate)
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"DeleteFromIntList");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"DeleteFromIntList");
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubID;
|
||||
|
||||
@@ -1821,7 +1830,7 @@ void DeleteFromIntList( UINT8 ubIndex, BOOLEAN fCommunicate)
|
||||
ubID = gubOutOfTurnOrder[ubIndex];
|
||||
|
||||
#ifdef DEBUG_INTERRUPTS
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: removing ID %d", ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: removing ID %d", ubID ) );
|
||||
#endif
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%d removed from int list", ubID );
|
||||
// if we're NOT deleting the LAST entry in the int list
|
||||
@@ -1850,11 +1859,11 @@ void DeleteFromIntList( UINT8 ubIndex, BOOLEAN fCommunicate)
|
||||
|
||||
void AddToIntList( UINT8 ubID, BOOLEAN fGainControl, BOOLEAN fCommunicate )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"AddToIntList");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"AddToIntList");
|
||||
UINT8 ubLoop;
|
||||
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%d added to int list", ubID );
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: adding ID %d who %s", ubID, fGainControl ? "gains control" : "loses control" ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: adding ID %d who %s", ubID, fGainControl ? "gains control" : "loses control" ) );
|
||||
|
||||
// check whether 'who' is already anywhere on the queue after the first index
|
||||
// which we want to preserve so we can restore turn order
|
||||
@@ -1911,12 +1920,12 @@ void AddToIntList( UINT8 ubID, BOOLEAN fGainControl, BOOLEAN fCommunicate )
|
||||
|
||||
void VerifyOutOfTurnOrderArray()
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"VerifyOutOfTurnOrderArray");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"VerifyOutOfTurnOrderArray");
|
||||
UINT8 ubTeamHighest[ MAXTEAMS ] = { 0 };
|
||||
UINT8 ubTeamsInList;
|
||||
UINT8 ubNextInArrayOnTeam, ubNextIndex;
|
||||
UINT8 ubTeam;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
BOOLEAN fFoundLoop = FALSE;
|
||||
|
||||
for (ubLoop = 1; ubLoop <= gubOutOfTurnPersons; ubLoop++)
|
||||
@@ -2020,7 +2029,7 @@ void VerifyOutOfTurnOrderArray()
|
||||
|
||||
void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInterruptType)
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"DoneAddingToIntList");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"DoneAddingToIntList");
|
||||
if (fChange)
|
||||
{
|
||||
VerifyOutOfTurnOrderArray();
|
||||
@@ -2030,8 +2039,9 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_networked)
|
||||
{
|
||||
if (!is_networked) {
|
||||
StartInterrupt();
|
||||
} else {
|
||||
UINT8 nubFirstInterrupter;
|
||||
INT8 nbTeam;
|
||||
SOLDIERTYPE * npSoldier;
|
||||
@@ -2085,17 +2095,13 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter
|
||||
ClearIntList();//no interrupt to be awarded, clear generated list.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
StartInterrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("ResolveInterruptsVs: Soldier ID = %d, APs = %d",pSoldier->ubID,pSoldier->bActionPoints));
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,String("ResolveInterruptsVs: Soldier ID = %d, APs = %d (interrupt type = %d)",pSoldier->ubID,pSoldier->bActionPoints, ubInterruptType));
|
||||
UINT8 ubTeam, ubOpp;
|
||||
UINT8 ubIntCnt;
|
||||
UINT8 ubIntList[MAXMERCS];
|
||||
@@ -2107,17 +2113,21 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
SOLDIERTYPE * pOpponent;
|
||||
BOOLEAN fControlChanged = FALSE;
|
||||
|
||||
AssertNotNIL(pSoldier);
|
||||
|
||||
if ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) )
|
||||
{
|
||||
ubIntCnt = 0;
|
||||
|
||||
for (ubTeam = 0; ubTeam < MAXTEAMS; ubTeam++)
|
||||
{
|
||||
if (gTacticalStatus.Team[ubTeam].bTeamActive && (gTacticalStatus.Team[ubTeam].bSide != pSoldier->bSide) && ubTeam != CIV_TEAM)
|
||||
// WDS fix broken interrupts (I hope...)
|
||||
if (/*gTacticalStatus.Team[ubTeam].bTeamActive &&*/ (gTacticalStatus.Team[ubTeam].bSide != pSoldier->bSide) && ubTeam != CIV_TEAM)
|
||||
{
|
||||
for ( ubOpp = gTacticalStatus.Team[ ubTeam ].bFirstID; ubOpp <= gTacticalStatus.Team[ ubTeam ].bLastID; ubOpp++)
|
||||
{
|
||||
pOpponent = MercPtrs[ubOpp];
|
||||
AssertNotNIL(pOpponent);
|
||||
if ( pOpponent->bActive && pOpponent->bInSector && (pOpponent->stats.bLife >= OKLIFE) && !(pOpponent->bCollapsed) )
|
||||
{
|
||||
if ( ubInterruptType == NOISEINTERRUPT )
|
||||
@@ -2127,7 +2137,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
{
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d - NOISE BEYOND SIGHT DISTANCE!?", pOpponent->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("Resetting int pts for %d - NOISE BEYOND SIGHT DISTANCE!?", pOpponent->ubID ) );
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -2136,7 +2146,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
{
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d - DOESN'T SEE ON SIGHT INTERRUPT!?", pOpponent->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("Resetting int pts for %d - DOESN'T SEE ON SIGHT INTERRUPT!?", pOpponent->ubID ) );
|
||||
|
||||
|
||||
continue;
|
||||
@@ -2145,7 +2155,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
switch (pOpponent->aiData.bInterruptDuelPts)
|
||||
{
|
||||
case NO_INTERRUPT: // no interrupt possible, no duel necessary
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ResolveInterruptsVs: No interrupt for opponent %d", pOpponent->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("ResolveInterruptsVs: No interrupt for opponent %d", pOpponent->ubID ) );
|
||||
fIntOccurs = FALSE;
|
||||
break;
|
||||
|
||||
@@ -2153,18 +2163,18 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
pSoldier->aiData.bInterruptDuelPts = 0; // just to have a valid intDiff later
|
||||
fIntOccurs = TRUE;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: automatic interrupt on %d by %d", pSoldier->ubID, pOpponent->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: automatic interrupt on %d by %d", pSoldier->ubID, pOpponent->ubID ) );
|
||||
|
||||
break;
|
||||
|
||||
default: // interrupt is possible, run a duel
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Calculating int duel pts for onlooker in ResolveInterruptsVs" );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, "Calculating int duel pts for onlooker in ResolveInterruptsVs" );
|
||||
pSoldier->aiData.bInterruptDuelPts = CalcInterruptDuelPts(pSoldier,pOpponent->ubID,TRUE);
|
||||
fIntOccurs = InterruptDuel(pOpponent,pSoldier);
|
||||
#ifdef DEBUG_INTERRUPTS
|
||||
if (fIntOccurs)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: standard interrupt on %d (%d pts) by %d (%d pts)", pSoldier->ubID, pSoldier->aiData.bInterruptDuelPts, pOpponent->ubID, pOpponent->aiData.bInterruptDuelPts) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("INTERRUPT: standard interrupt on %d (%d pts) by %d (%d pts)", pSoldier->ubID, pSoldier->aiData.bInterruptDuelPts, pOpponent->ubID, pOpponent->aiData.bInterruptDuelPts) );
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2196,7 +2206,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
|
||||
if (pSoldier->aiData.bInterruptDuelPts != NO_INTERRUPT)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d", pSoldier->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("Resetting int pts for %d", pSoldier->ubID ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -2205,7 +2215,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
|
||||
if (pOpponent->aiData.bInterruptDuelPts != NO_INTERRUPT)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d", pOpponent->ubID ) );
|
||||
DebugMsg( TOPIC_JA2INTERRUPT, DBG_LEVEL_3, String("Resetting int pts for %d", pOpponent->ubID ) );
|
||||
}
|
||||
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
@@ -2285,13 +2295,13 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
// unless it's a MOVEMENT interrupt, in which case that is delayed til later
|
||||
DoneAddingToIntList(pSoldier,fControlChanged,ubInterruptType);
|
||||
}
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"ResolveInterruptsVs done");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"ResolveInterruptsVs done");
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN SaveTeamTurnsToTheSaveGameFile( HWFILE hFile )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"SaveTeamTurnsToTheSaveGameFile");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"SaveTeamTurnsToTheSaveGameFile");
|
||||
UINT32 uiNumBytesWritten;
|
||||
TEAM_TURN_SAVE_STRUCT TeamTurnStruct;
|
||||
|
||||
@@ -2324,7 +2334,7 @@ BOOLEAN SaveTeamTurnsToTheSaveGameFile( HWFILE hFile )
|
||||
|
||||
BOOLEAN LoadTeamTurnsFromTheSavedGameFile( HWFILE hFile )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"LoadTeamTurnsFromTheSavedGameFile");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"LoadTeamTurnsFromTheSavedGameFile");
|
||||
UINT32 uiNumBytesRead;
|
||||
TEAM_TURN_SAVE_STRUCT TeamTurnStruct;
|
||||
|
||||
@@ -2357,7 +2367,7 @@ BOOLEAN LoadTeamTurnsFromTheSavedGameFile( HWFILE hFile )
|
||||
|
||||
BOOLEAN NPCFirstDraw( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pTargetSoldier )
|
||||
{
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"NPCFirstDraw");
|
||||
DebugMsg (TOPIC_JA2INTERRUPT,DBG_LEVEL_3,"NPCFirstDraw");
|
||||
// if attacking an NPC check to see who draws first!
|
||||
|
||||
if ( pTargetSoldier->ubProfile != NO_PROFILE && pTargetSoldier->ubProfile != SLAY && pTargetSoldier->aiData.bNeutral && pTargetSoldier->aiData.bOppList[ pSoldier->ubID ] == SEEN_CURRENTLY && ( FindAIUsableObjClass( pTargetSoldier, IC_WEAPON ) != NO_SLOT ) )
|
||||
|
||||
+201
-102
@@ -2473,7 +2473,7 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
//no crates in sector inventory. search merc inventories
|
||||
if(mergeSuccessful == false)
|
||||
{
|
||||
for(int loop=0; loop<18; loop++)
|
||||
for(int loop=0; loop<(int)gGameExternalOptions.ubGameMaximumNumberOfPlayerMercs; loop++)
|
||||
{
|
||||
if(MercPtrs[loop]->bActive && MercPtrs[loop]->bInSector)
|
||||
{
|
||||
@@ -2818,6 +2818,12 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
//Display the range to the target
|
||||
DisplayRangeToTarget( MercPtrs[ gusSelectedSoldier ], sGridNo );
|
||||
}
|
||||
|
||||
#ifdef JA2TESTVERSION
|
||||
CHAR16 zOutputString[512];
|
||||
swprintf( zOutputString, L"gridno: %d", sGridNo);
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -3302,8 +3308,7 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
INT8 bLoop;
|
||||
for (bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID, pTeamSoldier=MercPtrs[bLoop]; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++, pTeamSoldier++)
|
||||
{
|
||||
if ( OK_CONTROLLABLE_MERC( pTeamSoldier ) && pTeamSoldier->bAssignment == CurrentSquad( ) && !AM_A_ROBOT( pTeamSoldier ) )
|
||||
{
|
||||
if ( OK_CONTROLLABLE_MERC( pTeamSoldier ) && pTeamSoldier->bAssignment == CurrentSquad( ) && !AM_A_ROBOT( pTeamSoldier ) ) {
|
||||
SwapGoggles(pTeamSoldier);
|
||||
}
|
||||
}
|
||||
@@ -5554,134 +5559,228 @@ void PopupMilitiaControlMenu( SOLDIERTYPE *pSoldier )
|
||||
gfIgnoreScrolling = TRUE;
|
||||
}
|
||||
|
||||
INT32 PickPocket(MERCPROFILESTRUCT *pProfile, UINT8 ppStart, UINT8 ppStop, UINT16 usItem, UINT8 iNumber, UINT8 * cap);
|
||||
|
||||
bool BadGoggles(SOLDIERTYPE *pTeamSoldier) {
|
||||
// WDS - Smart goggle switching
|
||||
// NOTE: Investigate using GetItemVisionRangeBonus from Items.cpp???
|
||||
if (!gGameExternalOptions.smartGoggleSwitch) {
|
||||
return false;
|
||||
} else {
|
||||
// Look through the head slots and find any sort of goggle. Check if it is bad for this time of day.
|
||||
for (int headSlot = HEAD1POS; headSlot <= HEAD2POS; ++headSlot) {
|
||||
if ( (Item[pTeamSoldier->inv[headSlot].usItem].brightlightvisionrangebonus > 0) && !DayTime() ) {
|
||||
return true;
|
||||
} else if ( (Item[pTeamSoldier->inv[headSlot].usItem].nightvisionrangebonus > 0) && DayTime() ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Find the best goggles for the current time of day anywhere in inventory
|
||||
OBJECTTYPE * pGoggles = 0;
|
||||
if (DayTime()) {
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier, TRUE );
|
||||
} else {
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier, TRUE );
|
||||
}
|
||||
|
||||
if (pGoggles) {
|
||||
// Check that the player is actually wearing them
|
||||
for (int headSlot = HEAD1POS; headSlot <= HEAD2POS; ++headSlot) {
|
||||
if (!(pTeamSoldier->inv[headSlot] == *pGoggles)) {
|
||||
// return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SwapGoggles(SOLDIERTYPE *pTeamSoldier)
|
||||
{
|
||||
/* CHRISL - Adjusted this option to allow the game to search through Helmet attachments
|
||||
as well as inventory positions.
|
||||
*/
|
||||
OBJECTTYPE * pObj;
|
||||
OBJECTTYPE * pGoggles = NULL;
|
||||
INT8 bSlot1;
|
||||
int bestBonus;
|
||||
bool itemFound = false;
|
||||
//CHRISL: Before doing anything, we should look at both head slots to see if either slot has some sort of goggles
|
||||
for(bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
|
||||
{
|
||||
if(Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0)
|
||||
itemFound = true;
|
||||
if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0)
|
||||
itemFound = true;
|
||||
}
|
||||
//2 head slots
|
||||
for (bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
|
||||
{
|
||||
// if wearing sungoggles
|
||||
if ( Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0 )
|
||||
{
|
||||
itemFound = true;
|
||||
bestBonus = 0;
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier );
|
||||
//search for better goggles on the helmet
|
||||
if (pGoggles)
|
||||
{
|
||||
bestBonus = Item[pGoggles->usItem].nightvisionrangebonus;
|
||||
}
|
||||
//search helmet and vest
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
{
|
||||
if ( Item[ iter->usItem ].nightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE )
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[ iter->usItem ].nightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( pGoggles )
|
||||
{
|
||||
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
|
||||
|
||||
// WDS - Smart goggle switching
|
||||
// NOTE: Investigate using GetItemVisionRangeBonus from Items.cpp???
|
||||
if (gGameExternalOptions.smartGoggleSwitch) {
|
||||
// Look through the head slots and find any sort of goggle or an empty spot
|
||||
int slotToUse = -1;
|
||||
for (int headSlot = HEAD1POS; headSlot <= HEAD2POS; ++headSlot) {
|
||||
if ( (Item[pTeamSoldier->inv[headSlot].usItem].brightlightvisionrangebonus > 0) ) {
|
||||
slotToUse = headSlot;
|
||||
break;
|
||||
} else if ( (Item[pTeamSoldier->inv[headSlot].usItem].nightvisionrangebonus > 0) ) {
|
||||
slotToUse = headSlot;
|
||||
break;
|
||||
} else if (pTeamSoldier->inv[headSlot].exists() == false) {
|
||||
slotToUse = headSlot;
|
||||
}
|
||||
}
|
||||
// else if wearing NVGs
|
||||
else if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0)
|
||||
{
|
||||
itemFound = true;
|
||||
bestBonus = 0;
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier );
|
||||
//search for better goggles on the helmet
|
||||
if (pGoggles)
|
||||
{
|
||||
bestBonus = Item[pGoggles->usItem].brightlightvisionrangebonus;
|
||||
if (slotToUse == -1) {
|
||||
// No place to swap in a new goggle, give up
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the best goggles for the current time of day anywhere in inventory
|
||||
OBJECTTYPE * pGoggles = 0;
|
||||
if (DayTime()) {
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier, TRUE );
|
||||
} else {
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier, TRUE );
|
||||
}
|
||||
|
||||
if (pGoggles) {
|
||||
// Now either swap or equip the best one that was found
|
||||
if (pTeamSoldier->inv[slotToUse].exists()) {
|
||||
SwapObjs( pTeamSoldier, slotToUse, pGoggles, TRUE );
|
||||
} else {
|
||||
pGoggles->MoveThisObjectTo(pTeamSoldier->inv[slotToUse], 1, pTeamSoldier, slotToUse);
|
||||
}
|
||||
//search helmet and vest
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
{
|
||||
if ( Item[ iter->usItem ].brightlightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE )
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[ iter->usItem ].brightlightvisionrangebonus;
|
||||
} else {
|
||||
// No goggles to equip, should the current ones be unequiped?
|
||||
if (pTeamSoldier->inv[slotToUse].exists()) {
|
||||
if ((DayTime() && (Item[pTeamSoldier->inv[slotToUse].usItem].nightvisionrangebonus > 0)) ||
|
||||
(!DayTime() && (Item[pTeamSoldier->inv[slotToUse].usItem].brightlightvisionrangebonus > 0))) {
|
||||
// It's day and we're wearing night goggles (or vice-versa), find a place to stash them
|
||||
if (pTeamSoldier->inv[ HELMETPOS ].exists()) {
|
||||
if (pTeamSoldier->inv[ HELMETPOS ].AttachObject( NULL, &pTeamSoldier->inv[slotToUse] )) {
|
||||
// It worked!
|
||||
} else {
|
||||
// Try dumping it anywhere in inventory because it doesn't attach to the helmet
|
||||
}
|
||||
} else {
|
||||
// Try dumping it anywhere in inventory given there's no helemt
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( pGoggles )
|
||||
{
|
||||
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
|
||||
break;
|
||||
}
|
||||
}
|
||||
// else if not wearing anything and no goggles found
|
||||
else if(itemFound == false && pTeamSoldier->inv[bSlot1].exists() == false)
|
||||
} else {
|
||||
// Normal goggle switching
|
||||
OBJECTTYPE * pObj;
|
||||
OBJECTTYPE * pGoggles = NULL;
|
||||
INT8 bSlot1;
|
||||
int bestBonus;
|
||||
bool itemFound = false;
|
||||
|
||||
//CHRISL: Before doing anything, we should look at both head slots to see if either slot has some sort of goggles
|
||||
for (bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++) {
|
||||
if ((Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0) ||
|
||||
(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0))
|
||||
itemFound = true;
|
||||
}
|
||||
//2 head slots
|
||||
for (bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
|
||||
{
|
||||
bestBonus = 0;
|
||||
// search helmet and vest for goggles of some kind
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
// if wearing sungoggles
|
||||
if ( (Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0) )
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for(attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
bestBonus = 0;
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier );
|
||||
//search for better goggles on the helmet
|
||||
if (pGoggles)
|
||||
{
|
||||
if(DayTime() == TRUE && Item[iter->usItem].brightlightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
|
||||
bestBonus = Item[pGoggles->usItem].nightvisionrangebonus;
|
||||
}
|
||||
//search helmet and vest
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[iter->usItem].brightlightvisionrangebonus;
|
||||
}
|
||||
else if(NightTime() == TRUE && Item[iter->usItem].nightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[iter->usItem].nightvisionrangebonus;
|
||||
if ( Item[ iter->usItem ].nightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE )
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[ iter->usItem ].nightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(pGoggles)
|
||||
{
|
||||
pGoggles->MoveThisObjectTo(pTeamSoldier->inv[bSlot1], 1, pTeamSoldier, bSlot1);
|
||||
pObj->RemoveAttachment(pGoggles);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(pTeamSoldier->inv[bSlot1].exists() == false)
|
||||
{
|
||||
if(DayTime() == TRUE)
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier );
|
||||
else
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier );
|
||||
if(pGoggles)
|
||||
if ( pGoggles )
|
||||
{
|
||||
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
// else if wearing NVGs
|
||||
else if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0 )
|
||||
{
|
||||
break;
|
||||
bestBonus = 0;
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier );
|
||||
//search for better goggles on the helmet
|
||||
if (pGoggles)
|
||||
{
|
||||
bestBonus = Item[pGoggles->usItem].brightlightvisionrangebonus;
|
||||
}
|
||||
//search helmet and vest
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
{
|
||||
if ( Item[ iter->usItem ].brightlightvisionrangebonus > bestBonus && Item[ iter->usItem ].usItemClass == IC_FACE )
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[ iter->usItem ].brightlightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( pGoggles )
|
||||
{
|
||||
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
|
||||
break;
|
||||
}
|
||||
}
|
||||
// else if not wearing anything and no goggles found
|
||||
else if(itemFound == false && pTeamSoldier->inv[bSlot1].exists() == false)
|
||||
{
|
||||
bestBonus = 0;
|
||||
// search helmet and vest for goggles of some kind
|
||||
for(UINT8 gear = HELMETPOS; gear <= VESTPOS; gear++)
|
||||
{
|
||||
pObj = &(pTeamSoldier->inv[gear]);
|
||||
for(attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
|
||||
{
|
||||
if(DayTime() == TRUE && Item[iter->usItem].brightlightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[iter->usItem].brightlightvisionrangebonus;
|
||||
}
|
||||
else if(NightTime() == TRUE && Item[iter->usItem].nightvisionrangebonus > bestBonus && Item[iter->usItem].usItemClass == IC_FACE)
|
||||
{
|
||||
pGoggles = &(*iter);
|
||||
bestBonus = Item[iter->usItem].nightvisionrangebonus;
|
||||
}
|
||||
}
|
||||
if(pGoggles)
|
||||
{
|
||||
pGoggles->MoveThisObjectTo(pTeamSoldier->inv[bSlot1], 1, pTeamSoldier, bSlot1);
|
||||
pObj->RemoveAttachment(pGoggles);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(pTeamSoldier->inv[bSlot1].exists() == false)
|
||||
{
|
||||
if(DayTime() == TRUE)
|
||||
pGoggles = FindSunGogglesInInv( pTeamSoldier );
|
||||
else
|
||||
pGoggles = FindNightGogglesInInv( pTeamSoldier );
|
||||
if(pGoggles)
|
||||
{
|
||||
SwapObjs( pTeamSoldier, bSlot1, pGoggles, TRUE );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
fCharacterInfoPanelDirty = TRUE;
|
||||
fTeamPanelDirty = TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
|
||||
+69
-51
@@ -38,9 +38,11 @@
|
||||
#include "Soldier macros.h"
|
||||
#include "opplist.h"
|
||||
#include "Soldier ani.h"
|
||||
#include "GameSettings.h"
|
||||
#endif
|
||||
|
||||
INT8 gubVehicleMovementGroups[ MAX_VEHICLES ];
|
||||
//INT8 gubVehicleMovementGroups[ MAX_VEHICLES ];
|
||||
std::vector<INT8> gubVehicleMovementGroups (MAX_VEHICLES, 0);
|
||||
|
||||
// the list of vehicles
|
||||
VEHICLETYPE *pVehicleList = NULL;
|
||||
@@ -174,23 +176,20 @@ void SetDriver( INT32 iID, UINT8 ubID );
|
||||
|
||||
void TeleportVehicleToItsClosestSector( INT32 iVehicleId, UINT8 ubGroupID );
|
||||
|
||||
void InitAVehicle(int index, int x, int y) {
|
||||
gubVehicleMovementGroups[ index ] = CreateNewVehicleGroupDepartingFromSector( x, y, index );
|
||||
|
||||
// Set persistent....
|
||||
GROUP *pGroup = GetGroup( gubVehicleMovementGroups[ index ] );
|
||||
AssertNotNIL(pGroup);
|
||||
pGroup->fPersistant = TRUE;
|
||||
}
|
||||
|
||||
|
||||
// Loop through and create a few soldier squad ID's for vehicles ( max # 3 )
|
||||
void InitVehicles( )
|
||||
{
|
||||
INT32 cnt;
|
||||
GROUP *pGroup = NULL;
|
||||
|
||||
for( cnt = 0; cnt < MAX_VEHICLES; cnt++ )
|
||||
{
|
||||
// create mvt groups
|
||||
gubVehicleMovementGroups[ cnt ] = CreateNewVehicleGroupDepartingFromSector( 1, 1, cnt );
|
||||
|
||||
// Set persistent....
|
||||
pGroup = GetGroup( gubVehicleMovementGroups[ cnt ] );
|
||||
pGroup->fPersistant = TRUE;
|
||||
}
|
||||
// Loop through and create a few soldier squad ID's for vehicles
|
||||
void InitAllVehicles( ) {
|
||||
for( int cnt = 0; cnt < MAX_VEHICLES; cnt++ )
|
||||
InitAVehicle(cnt, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -431,7 +430,7 @@ BOOLEAN IsThisVehicleAccessibleToSoldier( SOLDIERTYPE *pSoldier, INT32 iId )
|
||||
BOOLEAN AddSoldierToVehicle( SOLDIERTYPE *pSoldier, INT32 iId )
|
||||
{
|
||||
INT32 iCounter = 0;
|
||||
INT8 vCount = 0;
|
||||
UINT32 vCount = 0;
|
||||
SOLDIERTYPE *pVehicleSoldier = NULL;
|
||||
|
||||
|
||||
@@ -453,7 +452,7 @@ BOOLEAN AddSoldierToVehicle( SOLDIERTYPE *pSoldier, INT32 iId )
|
||||
pVehicleSoldier = GetSoldierStructureForVehicle( iId );
|
||||
|
||||
//CHRISL: Get number of vehicles currently in player team
|
||||
for(int x = 0; x < 20; x++)
|
||||
for(int x = 0; x < CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS; x++)
|
||||
{
|
||||
if(MercPtrs[x]->bTeam == OUR_TEAM && (MercPtrs[x]->flags.uiStatusFlags & SOLDIER_VEHICLE) && MercPtrs[x]->bActive == TRUE)
|
||||
vCount ++;
|
||||
@@ -464,7 +463,7 @@ BOOLEAN AddSoldierToVehicle( SOLDIERTYPE *pSoldier, INT32 iId )
|
||||
if ( pVehicleSoldier->bTeam != gbPlayerNum )
|
||||
{
|
||||
// Can we add a new vehicle
|
||||
if( vCount >= 2 )
|
||||
if( vCount >= gGameExternalOptions.ubGameMaximumNumberOfPlayerVehicles )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[VEHICLE_CAN_NOT_BE_ADDED] );
|
||||
return( FALSE );
|
||||
@@ -1793,30 +1792,24 @@ INT16 GetOrigInternalArmorValueForVehicleInLocation( UINT8 ubID, UINT8 ubLocatio
|
||||
|
||||
SOLDIERTYPE * GetSoldierStructureForVehicle( INT32 iId )
|
||||
{
|
||||
SOLDIERTYPE *pSoldier = NULL, *pFoundSoldier = NULL;
|
||||
INT32 iCounter = 0, iNumberOnTeam = 0;
|
||||
|
||||
// get number of mercs on team
|
||||
iNumberOnTeam = TOTAL_SOLDIERS; //gTacticalStatus.Team[ OUR_TEAM ].bLastID;
|
||||
|
||||
for( iCounter = 0; iCounter < iNumberOnTeam; iCounter++ )
|
||||
for( INT32 iCounter = 0; iCounter < TOTAL_SOLDIERS; iCounter++ )
|
||||
{
|
||||
pSoldier = &Menptr[ iCounter ];
|
||||
SOLDIERTYPE *pSoldier = &Menptr[ iCounter ];
|
||||
|
||||
if ( pSoldier->bActive )
|
||||
if( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
|
||||
{
|
||||
if( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
if( pSoldier->bVehicleID == iId )
|
||||
{
|
||||
pFoundSoldier = pSoldier;
|
||||
iCounter = iNumberOnTeam;
|
||||
return( pSoldier );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( pFoundSoldier );
|
||||
// Didn't find the vehicle
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
@@ -2153,10 +2146,16 @@ BOOLEAN SaveVehicleMovementInfoToSavedGameFile( HWFILE hFile )
|
||||
{
|
||||
UINT32 uiNumBytesWritten = 0;
|
||||
//Save all the vehicle movement id's
|
||||
FileWrite( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * 5, &uiNumBytesWritten );
|
||||
if( uiNumBytesWritten != sizeof( INT8 ) * 5 )
|
||||
{
|
||||
return(FALSE);
|
||||
// FileWrite( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * 5, &uiNumBytesWritten );
|
||||
// if( uiNumBytesWritten != sizeof( INT8 ) * 5 )
|
||||
// {
|
||||
// return(FALSE);
|
||||
// }
|
||||
for (int cnt=0; cnt<5; ++cnt) {
|
||||
FileWrite( hFile, &gubVehicleMovementGroups[cnt], sizeof( INT8 ), &uiNumBytesWritten );
|
||||
if( uiNumBytesWritten != sizeof( INT8 ) ) {
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return( TRUE );
|
||||
@@ -2165,17 +2164,22 @@ BOOLEAN SaveVehicleMovementInfoToSavedGameFile( HWFILE hFile )
|
||||
|
||||
BOOLEAN LoadVehicleMovementInfoFromSavedGameFile( HWFILE hFile )
|
||||
{
|
||||
INT32 cnt;
|
||||
GROUP *pGroup = NULL;
|
||||
UINT32 uiNumBytesRead=0;
|
||||
//Load in the Squad movement id's
|
||||
FileRead( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * 5, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != sizeof( INT8 ) * 5 )
|
||||
{
|
||||
return(FALSE);
|
||||
// FileRead( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * 5, &uiNumBytesRead );
|
||||
// if( uiNumBytesRead != sizeof( INT8 ) * 5 )
|
||||
// {
|
||||
// return(FALSE);
|
||||
// }
|
||||
for (int cnt=0; cnt<5; ++cnt) {
|
||||
FileRead( hFile, &gubVehicleMovementGroups[cnt], sizeof( INT8 ), &uiNumBytesRead );
|
||||
if( uiNumBytesRead != sizeof( INT8 ) ) {
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
for( cnt = 5; cnt < MAX_VEHICLES; cnt++ )
|
||||
for( int cnt = 5; cnt < MAX_VEHICLES; cnt++ )
|
||||
{
|
||||
// create mvt groups
|
||||
gubVehicleMovementGroups[ cnt ] = CreateNewVehicleGroupDepartingFromSector( 1, 1, cnt );
|
||||
@@ -2193,10 +2197,16 @@ BOOLEAN NewSaveVehicleMovementInfoToSavedGameFile( HWFILE hFile )
|
||||
{
|
||||
UINT32 uiNumBytesWritten = 0;
|
||||
//Save all the vehicle movement id's
|
||||
FileWrite( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * MAX_VEHICLES, &uiNumBytesWritten );
|
||||
if( uiNumBytesWritten != sizeof( INT8 ) * MAX_VEHICLES )
|
||||
{
|
||||
return(FALSE);
|
||||
// FileWrite( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * MAX_VEHICLES, &uiNumBytesWritten );
|
||||
// if( uiNumBytesWritten != sizeof( INT8 ) * MAX_VEHICLES )
|
||||
// {
|
||||
// return(FALSE);
|
||||
// }
|
||||
for (int cnt=0; cnt<MAX_VEHICLES; ++cnt) {
|
||||
FileWrite( hFile, &gubVehicleMovementGroups[cnt], sizeof( INT8 ), &uiNumBytesWritten );
|
||||
if( uiNumBytesWritten != sizeof( INT8 ) ) {
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return( TRUE );
|
||||
@@ -2207,10 +2217,16 @@ BOOLEAN NewLoadVehicleMovementInfoFromSavedGameFile( HWFILE hFile )
|
||||
{
|
||||
UINT32 uiNumBytesRead=0;
|
||||
//Load in the Squad movement id's
|
||||
FileRead( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * MAX_VEHICLES, &uiNumBytesRead );
|
||||
if( uiNumBytesRead != sizeof( INT8 ) * MAX_VEHICLES )
|
||||
{
|
||||
return(FALSE);
|
||||
// FileRead( hFile, gubVehicleMovementGroups, sizeof( INT8 ) * MAX_VEHICLES, &uiNumBytesRead );
|
||||
// if( uiNumBytesRead != sizeof( INT8 ) * MAX_VEHICLES )
|
||||
// {
|
||||
// return(FALSE);
|
||||
// }
|
||||
for (int cnt=0; cnt<MAX_VEHICLES; ++cnt) {
|
||||
FileRead( hFile, &gubVehicleMovementGroups[cnt], sizeof( INT8 ), &uiNumBytesRead );
|
||||
if( uiNumBytesRead != sizeof( INT8 ) ) {
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return( TRUE );
|
||||
@@ -2472,7 +2488,9 @@ BOOLEAN IsSoldierInThisVehicleSquad( SOLDIERTYPE *pSoldier, INT8 bSquadNumber )
|
||||
|
||||
SOLDIERTYPE* PickRandomPassengerFromVehicle( SOLDIERTYPE *pSoldier )
|
||||
{
|
||||
UINT8 ubMercsInSector[ 20 ] = { 0 };
|
||||
// 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;
|
||||
INT32 iCounter, iId;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "Strategic Movement.h"
|
||||
|
||||
#define MAX_VEHICLES 10
|
||||
extern std::vector<INT8> gubVehicleMovementGroups;
|
||||
|
||||
// type of vehicles
|
||||
enum{
|
||||
@@ -233,5 +234,9 @@ BOOLEAN DoesVehicleGroupHaveAnyPassengers( GROUP *pGroup );
|
||||
|
||||
void SetSoldierExitVehicleInsertionData( SOLDIERTYPE *pSoldier, INT32 iId );
|
||||
|
||||
void InitAVehicle(int index, int x, int y);
|
||||
|
||||
void InitAllVehicles( );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -559,7 +559,7 @@ void LoadWorldItemsFromMap( INT8 **hBuffer, float dMajorMapVersion, int ubMinorM
|
||||
usReplacement = StandardGunListAmmoReplacement( dummyItem.object.usItem );
|
||||
if ( usReplacement )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
// go through status values and scale up/down
|
||||
for ( ubLoop = 0; ubLoop < dummyItem.object.ubNumberOfObjects; ubLoop++ )
|
||||
|
||||
@@ -88,6 +88,9 @@ typedef PARSE_STAGE;
|
||||
#define ALTSECTORSFILENAME "Map\\AltSectors.xml"
|
||||
#define SAMSITESFILENAME "Map\\SamSites.xml"
|
||||
#define ROAMINGMILITIAFILENAME "Map\\RestrictedRoamingMilitia.xml"
|
||||
#define EXTRAITEMSFILENAME "Map\\A9_0_ExtraItems.xml"
|
||||
#define EXTRAITEMSFILENAME2 "Map\\A11_0_ExtraItems.xml"
|
||||
|
||||
// Gotthard: Strategic Text Files [2007-10-19]
|
||||
#define STRATEGICSECTORNAMETEXTFILENAME "Map\\SectorNames.xml"
|
||||
|
||||
|
||||
@@ -350,6 +350,9 @@ enum
|
||||
NPC_ACTION_TRIGGER_MADLAB_31,
|
||||
NPC_ACTION_TRIGGER_MADLAB_32,
|
||||
NPC_ACTION_TRIGGER_BREWSTER_BY_WARDEN_PROXIMITY, // 298
|
||||
// WDS - New AI
|
||||
NPC_ACTION_SEND_WEIGHTED_ASSAULT_TO_LOCATION, // 1st optional parm is "direness: rating
|
||||
NPC_ACTION_SEND_SPECIFIC_ASSAULT_TO_LOCATION, // 1st option parm is # of soldiers to send, 2nd is composition
|
||||
|
||||
NPC_ACTION_TURN_TO_FACE_NEAREST_MERC = 500,
|
||||
NPC_ACTION_TURN_TO_FACE_PROFILE_ID_0,
|
||||
|
||||
+12
-9
@@ -345,7 +345,7 @@ void SwapBestSightingPositions( INT8 bPos1, INT8 bPos2 )
|
||||
|
||||
void ReevaluateBestSightingPosition( SOLDIERTYPE * pSoldier, INT8 bInterruptDuelPts )
|
||||
{
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
BOOLEAN fFound = FALSE;
|
||||
BOOLEAN fPointsGotLower = FALSE;
|
||||
|
||||
@@ -459,7 +459,7 @@ void HandleBestSightingPositionInRealtime( void )
|
||||
// This function is called for handling interrupts when opening a door in non-combat or
|
||||
// just sighting in non-combat, deciding who gets the first turn
|
||||
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
if ( gfDelayResolvingBestSightingDueToDoor )
|
||||
{
|
||||
@@ -533,7 +533,7 @@ void HandleBestSightingPositionInTurnbased( void )
|
||||
{
|
||||
// This function is called for handling interrupts when opening a door in turnbased
|
||||
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
UINT8 ubLoop, ubLoop2;
|
||||
BOOLEAN fOk = FALSE;
|
||||
|
||||
if ( gubBestToMakeSighting[ 0 ] != NOBODY )
|
||||
@@ -629,7 +629,7 @@ void InitSightArrays( void )
|
||||
|
||||
void AddToShouldBecomeHostileOrSayQuoteList( UINT8 ubID )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
|
||||
Assert( gubNumShouldBecomeHostileOrSayQuote < SHOULD_BECOME_HOSTILE_SIZE );
|
||||
|
||||
@@ -654,7 +654,7 @@ void AddToShouldBecomeHostileOrSayQuoteList( UINT8 ubID )
|
||||
UINT8 SelectSpeakerFromHostileOrSayQuoteList( void )
|
||||
{
|
||||
UINT8 ubProfileList[ SHOULD_BECOME_HOSTILE_SIZE ]; // NB list of merc IDs, not profiles!
|
||||
UINT8 ubLoop, ubNumProfiles = 0;
|
||||
UINT8 ubLoop, ubNumProfiles = 0;
|
||||
SOLDIERTYPE * pSoldier;
|
||||
|
||||
for ( ubLoop = 0; ubLoop < gubNumShouldBecomeHostileOrSayQuote; ubLoop++ )
|
||||
@@ -823,7 +823,9 @@ void HandleSight(SOLDIERTYPE *pSoldier, UINT8 ubSightFlags)
|
||||
} // end of SIGHT_LOOK
|
||||
|
||||
// if we've been told that interrupts are possible as a result of sighting
|
||||
if ((gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) && (ubSightFlags & SIGHT_INTERRUPT))
|
||||
if ((gTacticalStatus.uiFlags & TURNBASED) &&
|
||||
(gTacticalStatus.uiFlags & INCOMBAT) &&
|
||||
(ubSightFlags & SIGHT_INTERRUPT))
|
||||
{
|
||||
ResolveInterruptsVs( pSoldier, SIGHTINTERRUPT );
|
||||
}
|
||||
@@ -931,7 +933,8 @@ void HandleSight(SOLDIERTYPE *pSoldier, UINT8 ubSightFlags)
|
||||
void OurTeamRadiosRandomlyAbout(UINT8 ubAbout)
|
||||
{
|
||||
INT32 iLoop;
|
||||
INT8 radioCnt = 0,radioMan[20];
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
INT8 radioCnt = 0,radioMan[CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS];
|
||||
SOLDIERTYPE *pSoldier;
|
||||
|
||||
|
||||
@@ -1356,7 +1359,7 @@ void TurnOffEveryonesMuzzleFlashes( void )
|
||||
|
||||
void TurnOffTeamsMuzzleFlashes( UINT8 ubTeam )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
SOLDIERTYPE * pSoldier;
|
||||
|
||||
for (ubLoop = gTacticalStatus.Team[ ubTeam ].bFirstID; ubLoop <= gTacticalStatus.Team[ ubTeam ].bLastID; ubLoop++)
|
||||
@@ -7066,7 +7069,7 @@ INT8 GetHighestWatchedLocPoints( UINT8 ubID )
|
||||
|
||||
void CommunicateWatchedLoc( UINT8 ubID, INT16 sGridNo, INT8 bLevel, UINT8 ubPoints )
|
||||
{
|
||||
UINT8 ubLoop;
|
||||
UINT8 ubLoop;
|
||||
INT8 bTeam, bLoopPoint, bPoint;
|
||||
|
||||
bTeam = MercPtrs[ ubID ]->bTeam;
|
||||
|
||||
@@ -112,7 +112,8 @@ typedef enum
|
||||
NONSWIMMER,
|
||||
FEAR_OF_INSECTS,
|
||||
FORGETFUL,
|
||||
PSYCHO
|
||||
PSYCHO,
|
||||
NUM_PERSONALITYTRAIT
|
||||
} PersonalityTrait;
|
||||
|
||||
#define NERVOUS_RADIUS 10
|
||||
|
||||
Reference in New Issue
Block a user