mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Made direction variables more consistent as unsigned chars. Several function prototypes updated for this. Many memory leaks plugged: External options, video overlays, laptop file lists, tactical message queue, strategic pathing, autobandage, merc hiring, detailed placements, crate in Drassen, tactical placement New functions and attributes for soldiers in LUA (still for debugging at best): Soldier.APs (current APs), Soldier.changestance (changes stance, uses game heights) File catalog ignores .SVN directories (game load speedup) Fix CTD in mouse regions JA2 window now refuses to move to negative coords Checks to prevent DirectX-related infinite loops due to minimizing and task switching Invading enemies should now appear on the borders even when reinforcements disabled in .ini Suppression should no longer work on mercs in medium water Infant/Young creatures use restored spit instead of Molotov Creatures begin with their 'guns' (spit) 'locked and loaded' (cartridge in chamber) Further fix to AXP and AlaarDB's weapon ready check: Now 'firing' is always counted as 'ready'. Prevent mercs from falling and flying back through obstacles Check whether battle group is even set before testing its location for battle setup Burst spread locations now limited to 6, the limit within the soldier struct Extra burst spread locations zeroed out so that they aren't used unless necessary Spread code now only shoots at locations in the spread, and will shoot at all 6 Only mercs in the sector where autobandage happens will be made to stand up after it's done Throwing a grenade at the tail of the plane in Drassen should not result in a CTD Reset attack busy count when loading a new sector git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1347 3b4a5df2-a311-0410-b5c6-a8a6f20db521
857 lines
24 KiB
C++
857 lines
24 KiB
C++
#ifdef PRECOMPILEDHEADERS
|
|
#include "Strategic All.h"
|
|
#include "Language Defines.h"
|
|
#include "HelpScreen.h"
|
|
#include "GameSettings.h"
|
|
#else
|
|
#include "sgp.h"
|
|
#include "jascreens.h"
|
|
#include "laptop.h"
|
|
#include "worlddef.h"
|
|
#include "Soldier Control.h"
|
|
#include "overhead.h"
|
|
#include "fade screen.h"
|
|
#include "gamescreen.h"
|
|
#include "email.h"
|
|
#include "Game Clock.h"
|
|
#include "soldier profile.h"
|
|
#include "strategicmap.h"
|
|
#include "game init.h"
|
|
#include "animation data.h"
|
|
#include "finances.h"
|
|
#include "soldier create.h"
|
|
#include "Soldier Init List.h"
|
|
#include "music control.h"
|
|
#include "strategic.h"
|
|
#include "history.h"
|
|
#include "merc entering.h"
|
|
#include "Squads.h"
|
|
#include "Campaign Init.h"
|
|
#include "Strategic Town Loyalty.h"
|
|
#include "Strategic Mines.h"
|
|
#include "gameloop.h"
|
|
#include "Random.h"
|
|
#include "Map Screen Interface.h"
|
|
#include "Tactical Save.h"
|
|
#include "Campaign Types.h"
|
|
#include "Message.h"
|
|
#include "Game Event Hook.h"
|
|
#include "Strategic Movement.h"
|
|
#include "Creature Spreading.h"
|
|
#include "Quests.h"
|
|
#include "Strategic AI.h"
|
|
#include "sound control.h"
|
|
#include "Laptopsave.h"
|
|
#include "AimMembers.h"
|
|
#include "dialogue control.h"
|
|
#include "npc.h"
|
|
#include "Init.h"
|
|
#include "GameSettings.h"
|
|
#include "opplist.h"
|
|
#include "interface dialogue.h"
|
|
#include "Map Screen Interface Border.h"
|
|
#include "Map Screen Helicopter.h"
|
|
#include "Vehicles.h"
|
|
#include "Map Screen Interface Map.h"
|
|
#include "PreBattle Interface.h"
|
|
#include "Arms Dealer Init.h"
|
|
#include "bobbyr.h"
|
|
#include "helpscreen.h"
|
|
#include "Air Raid.h"
|
|
#include "Interface.h"
|
|
#include "cheats.h"
|
|
#endif
|
|
|
|
// Temp function
|
|
void QuickSetupOfMercProfileItems( UINT32 uiCount, UINT8 ubProfileIndex );
|
|
BOOLEAN QuickGameMemberHireMerc( UINT8 ubCurrentSoldier );
|
|
extern UINT32 guiExitScreen;
|
|
extern UINT32 uiMeanWhileFlags;
|
|
extern BOOLEAN gfGamePaused;
|
|
|
|
extern UNDERGROUND_SECTORINFO* FindUnderGroundSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ );
|
|
extern void InitVehicles( );
|
|
|
|
|
|
UINT8 gubScreenCount=0;
|
|
|
|
void InitNPCs( void )
|
|
{
|
|
MERCPROFILESTRUCT * pProfile;
|
|
|
|
// add the pilot at a random location!
|
|
pProfile = &(gMercProfiles[ SKYRIDER ]);
|
|
switch( Random( 4 ) )
|
|
{
|
|
case 0:
|
|
pProfile->sSectorX = 15;
|
|
pProfile->sSectorY = MAP_ROW_B;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 1:
|
|
pProfile->sSectorX = 14;
|
|
pProfile->sSectorY = MAP_ROW_E;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 2:
|
|
pProfile->sSectorX = 12;
|
|
pProfile->sSectorY = MAP_ROW_D;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 3:
|
|
pProfile->sSectorX = 16;
|
|
pProfile->sSectorY = MAP_ROW_C;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
}
|
|
|
|
#ifdef JA2TESTVERSION
|
|
ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"Skyrider in %c %d", 'A' + pProfile->sSectorY - 1, pProfile->sSectorX );
|
|
#endif
|
|
// use alternate map, with Skyrider's shack, in this sector
|
|
SectorInfo[ SECTOR( pProfile->sSectorX, pProfile->sSectorY ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
|
|
|
|
// set up Madlab's secret lab (he'll be added when the meanwhile scene occurs)
|
|
|
|
switch( Random( 4 ) )
|
|
{
|
|
case 0:
|
|
// use alternate map in this sector
|
|
SectorInfo[ SECTOR( 7, MAP_ROW_H ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
break;
|
|
case 1:
|
|
SectorInfo[ SECTOR( 16, MAP_ROW_H ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
break;
|
|
case 2:
|
|
SectorInfo[ SECTOR( 11, MAP_ROW_I ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
break;
|
|
case 3:
|
|
SectorInfo[ SECTOR( 4, MAP_ROW_E ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
break;
|
|
}
|
|
|
|
// add Micky in random location
|
|
|
|
pProfile = &(gMercProfiles[MICKY]);
|
|
switch( Random( 5 ) )
|
|
{
|
|
case 0:
|
|
pProfile->sSectorX = 9;
|
|
pProfile->sSectorY = MAP_ROW_G;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 1:
|
|
pProfile->sSectorX = 13;
|
|
pProfile->sSectorY = MAP_ROW_D;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 2:
|
|
pProfile->sSectorX = 5;
|
|
pProfile->sSectorY = MAP_ROW_C;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 3:
|
|
pProfile->sSectorX = 2;
|
|
pProfile->sSectorY = MAP_ROW_H;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 4:
|
|
pProfile->sSectorX = 6;
|
|
pProfile->sSectorY = MAP_ROW_C;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
}
|
|
|
|
#ifdef JA2TESTVERSION
|
|
ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"%s in %c %d", pProfile->zNickname, 'A' + pProfile->sSectorY - 1, pProfile->sSectorX );
|
|
#endif
|
|
|
|
// use alternate map in this sector
|
|
//SectorInfo[ SECTOR( pProfile->sSectorX, pProfile->sSectorY ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
|
|
gfPlayerTeamSawJoey = FALSE;
|
|
|
|
|
|
if ( gGameOptions.ubGameStyle == STYLE_SCIFI && gGameExternalOptions.fEnableCrepitus )
|
|
{
|
|
// add Bob
|
|
pProfile = &(gMercProfiles[BOB]);
|
|
pProfile->sSectorX = 8;
|
|
pProfile->sSectorY = MAP_ROW_F;
|
|
pProfile->bSectorZ = 0;
|
|
|
|
// add Gabby in random location
|
|
pProfile = &(gMercProfiles[GABBY]);
|
|
switch( Random( 2 ) )
|
|
{
|
|
case 0:
|
|
pProfile->sSectorX = 11;
|
|
pProfile->sSectorY = MAP_ROW_H;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
case 1:
|
|
pProfile->sSectorX = 4;
|
|
pProfile->sSectorY = MAP_ROW_I;
|
|
pProfile->bSectorZ = 0;
|
|
break;
|
|
}
|
|
|
|
#ifdef JA2TESTVERSION
|
|
ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"%s in %c %d", pProfile->zNickname, 'A' + pProfile->sSectorY - 1, pProfile->sSectorX );
|
|
#endif
|
|
|
|
// use alternate map in this sector
|
|
SectorInfo[ SECTOR( pProfile->sSectorX, pProfile->sSectorY ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
}
|
|
else
|
|
{ //not scifi, so use alternate map in Tixa's b1 level that doesn't have the stairs going down to the caves.
|
|
UNDERGROUND_SECTORINFO *pSector;
|
|
pSector = FindUnderGroundSector( 9, 10, 1 ); //j9_b1
|
|
if( pSector )
|
|
{
|
|
pSector->uiFlags |= SF_USE_ALTERNATE_MAP;
|
|
}
|
|
}
|
|
|
|
// init hospital variables
|
|
giHospitalTempBalance = 0;
|
|
giHospitalRefund = 0;
|
|
gbHospitalPriceModifier = 0;
|
|
|
|
// set up Devin so he will be placed ASAP
|
|
gMercProfiles[ DEVIN ].bNPCData = 3;
|
|
}
|
|
|
|
void InitBloodCatSectors()
|
|
{
|
|
INT32 i;
|
|
//Hard coded table of bloodcat populations. We don't have
|
|
//access to the real population (if different) until we physically
|
|
//load the map. If the real population is different, then an error
|
|
//will be reported.
|
|
for( i = 0; i < 255; i++ )
|
|
{
|
|
SectorInfo[ i ].bBloodCats = -1;
|
|
}
|
|
SectorInfo[ SEC_A15 ].bBloodCatPlacements = 9;
|
|
SectorInfo[ SEC_B4 ].bBloodCatPlacements = 9;
|
|
SectorInfo[ SEC_B16 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_C3 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_C8 ].bBloodCatPlacements = 13;
|
|
SectorInfo[ SEC_C11 ].bBloodCatPlacements = 7;
|
|
SectorInfo[ SEC_D4 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_D9 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_E11 ].bBloodCatPlacements = 10;
|
|
SectorInfo[ SEC_E13 ].bBloodCatPlacements = 14;
|
|
SectorInfo[ SEC_F3 ].bBloodCatPlacements = 13;
|
|
SectorInfo[ SEC_F5 ].bBloodCatPlacements = 7;
|
|
SectorInfo[ SEC_F7 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_F12 ].bBloodCatPlacements = 9;
|
|
SectorInfo[ SEC_F14 ].bBloodCatPlacements = 14;
|
|
SectorInfo[ SEC_F15 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_G6 ].bBloodCatPlacements = 7;
|
|
SectorInfo[ SEC_G10 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_G12 ].bBloodCatPlacements = 11;
|
|
SectorInfo[ SEC_H5 ].bBloodCatPlacements = 9;
|
|
SectorInfo[ SEC_I4 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_I15 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_J6 ].bBloodCatPlacements = 11;
|
|
SectorInfo[ SEC_K3 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_K6 ].bBloodCatPlacements = 14;
|
|
SectorInfo[ SEC_K10 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_K14 ].bBloodCatPlacements = 14;
|
|
|
|
switch( gGameOptions.ubDifficultyLevel )
|
|
{
|
|
case DIF_LEVEL_EASY: //50%
|
|
SectorInfo[ SEC_I16 ].bBloodCatPlacements = 14;
|
|
SectorInfo[ SEC_I16 ].bBloodCats = 14;
|
|
SectorInfo[ SEC_N5 ].bBloodCatPlacements = 8;
|
|
SectorInfo[ SEC_N5 ].bBloodCats = 8;
|
|
break;
|
|
case DIF_LEVEL_MEDIUM: //75%
|
|
SectorInfo[ SEC_I16 ].bBloodCatPlacements = 19;
|
|
SectorInfo[ SEC_I16 ].bBloodCats = 19;
|
|
SectorInfo[ SEC_N5 ].bBloodCatPlacements = 10;
|
|
SectorInfo[ SEC_N5 ].bBloodCats = 10;
|
|
break;
|
|
case DIF_LEVEL_HARD: //100%
|
|
SectorInfo[ SEC_I16 ].bBloodCatPlacements = 26;
|
|
SectorInfo[ SEC_I16 ].bBloodCats = 26;
|
|
SectorInfo[ SEC_N5 ].bBloodCatPlacements = 12;
|
|
SectorInfo[ SEC_N5 ].bBloodCats = 12;
|
|
break;
|
|
case DIF_LEVEL_INSANE: //150%
|
|
SectorInfo[ SEC_I16 ].bBloodCatPlacements = 39;
|
|
SectorInfo[ SEC_I16 ].bBloodCats = 39;
|
|
SectorInfo[ SEC_N5 ].bBloodCatPlacements = 18;
|
|
SectorInfo[ SEC_N5 ].bBloodCats = 18;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void InitStrategicLayer( void )
|
|
{
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitStrategicLayer");
|
|
|
|
// Clear starategic layer!
|
|
SetupNewStrategicGame();
|
|
InitQuestEngine();
|
|
|
|
//Setup a new campaign via the enemy perspective.
|
|
InitNewCampaign();
|
|
// Init Squad Lists
|
|
InitSquads();
|
|
// Init vehicles
|
|
InitVehicles( );
|
|
// init town loyalty
|
|
InitTownLoyalty();
|
|
// init the mine management system
|
|
InitializeMines();
|
|
// initialize map screen flags
|
|
InitMapScreenFlags();
|
|
// initialize NPCs, select alternate maps, etc
|
|
InitNPCs();
|
|
// init Skyrider and his helicopter
|
|
InitializeHelicopter();
|
|
//Clear out the vehicle list
|
|
ClearOutVehicleList();
|
|
|
|
InitBloodCatSectors();
|
|
|
|
InitializeSAMSites();
|
|
|
|
// make Orta, Tixa, SAM sites not found
|
|
InitMapSecrets();
|
|
|
|
|
|
// free up any leave list arrays that were left allocated
|
|
ShutDownLeaveList( );
|
|
// re-set up leave list arrays for dismissed mercs
|
|
InitLeaveList( );
|
|
|
|
// reset time compression mode to X0 (this will also pause it)
|
|
SetGameTimeCompressionLevel( TIME_COMPRESS_X0 );
|
|
|
|
// select A9 Omerta as the initial selected sector
|
|
ChangeSelectedMapSector( 9, 1, 0 );
|
|
|
|
// Reset these flags or mapscreen could be disabled and cause major headache.
|
|
fDisableDueToBattleRoster = FALSE;
|
|
fDisableMapInterfaceDueToBattle = FALSE;
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitStrategicLayer done");
|
|
}
|
|
|
|
void ShutdownStrategicLayer()
|
|
{
|
|
DeleteAllStrategicEvents();
|
|
RemoveAllGroups();
|
|
TrashUndergroundSectorInfo();
|
|
DeleteCreatureDirectives();
|
|
KillStrategicAI();
|
|
ClearTacticalMessageQueue();
|
|
}
|
|
|
|
BOOLEAN InitNewGame( BOOLEAN fReset )
|
|
{
|
|
INT32 iStartingCash;
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame");
|
|
// static fScreenCount = 0;
|
|
|
|
if( fReset )
|
|
{
|
|
gubScreenCount = 0;
|
|
return( TRUE );
|
|
}
|
|
|
|
// reset meanwhile flags
|
|
uiMeanWhileFlags = 0;
|
|
|
|
// Reset the selected soldier
|
|
gusSelectedSoldier = NOBODY;
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame: loading merc profiles");
|
|
if( gubScreenCount == 0 )
|
|
{
|
|
if( !LoadMercProfiles() )
|
|
return(FALSE);
|
|
}
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame: init arms dealers");
|
|
//Initialize the Arms Dealers and Bobby Rays inventory
|
|
if( gubScreenCount == 0 )
|
|
{
|
|
//Init all the arms dealers inventory
|
|
InitAllArmsDealers();
|
|
InitBobbyRayInventory();
|
|
}
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame: clearing messages");
|
|
// clear tactical
|
|
ClearTacticalMessageQueue( );
|
|
|
|
// clear mapscreen messages
|
|
FreeGlobalMessageList();
|
|
|
|
// IF our first time, go into laptop!
|
|
if ( gubScreenCount == 0 )
|
|
{
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame: first time: init laptop");
|
|
//Init the laptop here
|
|
InitLaptopAndLaptopScreens();
|
|
|
|
InitStrategicLayer();
|
|
|
|
// Set new game flag
|
|
SetLaptopNewGameFlag( );
|
|
|
|
// this is for the "mercs climbing down from a rope" animation, NOT Skyrider!!
|
|
ResetHeliSeats( );
|
|
|
|
// Setup two new messages!
|
|
AddPreReadEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
|
|
AddPreReadEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
|
|
AddPreReadEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin() );
|
|
AddPreReadEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
|
|
AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin(), -1);
|
|
//AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
|
|
if(gGameExternalOptions.fMercDayOne)
|
|
{
|
|
AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1 );
|
|
}
|
|
|
|
|
|
|
|
// ATE: Set starting cash....
|
|
switch( gGameOptions.ubDifficultyLevel )
|
|
{
|
|
case DIF_LEVEL_EASY:
|
|
|
|
iStartingCash = gGameExternalOptions.iStartingCashNovice;
|
|
//iStartingCash = 45000;
|
|
break;
|
|
|
|
case DIF_LEVEL_MEDIUM:
|
|
|
|
iStartingCash = gGameExternalOptions.iStartingCashExperienced;
|
|
//iStartingCash = 35000;
|
|
break;
|
|
|
|
case DIF_LEVEL_HARD:
|
|
|
|
iStartingCash = gGameExternalOptions.iStartingCashExpert;
|
|
//iStartingCash = 30000;
|
|
break;
|
|
|
|
case DIF_LEVEL_INSANE:
|
|
|
|
iStartingCash = gGameExternalOptions.iStartingCashInsane;
|
|
// iStartingCash = 15000;
|
|
break;
|
|
|
|
default:
|
|
Assert(0);
|
|
return( FALSE );
|
|
}
|
|
|
|
// Setup initial money
|
|
AddTransactionToPlayersBook( ANONYMOUS_DEPOSIT, 0, GetWorldTotalMin(), iStartingCash );
|
|
|
|
|
|
{
|
|
UINT32 uiDaysTimeMercSiteAvailable = Random( 2 ) + 1;
|
|
|
|
// schedule email for message from spec at 7am 3 days in the future
|
|
AddFutureDayStrategicEvent( EVENT_DAY3_ADD_EMAIL_FROM_SPECK, 60*7, 0, uiDaysTimeMercSiteAvailable );
|
|
}
|
|
|
|
#ifdef CRIPPLED_VERSION
|
|
{
|
|
UINT32 cnt;
|
|
|
|
//loop through the first 20 AIM mercs and set them to be away
|
|
for( cnt = 0; cnt < 20; cnt++)
|
|
{
|
|
gMercProfiles[ cnt ].bMercStatus = MERC_WORKING_ELSEWHERE;
|
|
gMercProfiles[ cnt ].uiDayBecomesAvailable = 14; // 14 days should be ok considering crippled version only goes to day 7
|
|
}
|
|
}
|
|
|
|
//Add an event to check for the end of the crippled version
|
|
AddEveryDayStrategicEvent( EVENT_CRIPPLED_VERSION_END_GAME_CHECK, 0, 0 );
|
|
#endif
|
|
|
|
|
|
SetLaptopExitScreen( INIT_SCREEN );
|
|
SetPendingNewScreen(LAPTOP_SCREEN);
|
|
gubScreenCount = 1;
|
|
|
|
//Set the fact the game is in progress
|
|
gTacticalStatus.fHasAGameBeenStarted = TRUE;
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
/*
|
|
if( ( guiExitScreen == MAP_SCREEN ) && ( LaptopSaveInfo.gfNewGameLaptop ) )
|
|
{
|
|
SetLaptopExitScreen( GAME_SCREEN );
|
|
return( TRUE );
|
|
}
|
|
*/
|
|
if ( gubScreenCount == 1 )
|
|
{
|
|
// OK , FADE HERE
|
|
//BeginFade( INIT_SCREEN, 35, FADE_OUT_REALFADE, 5 );
|
|
//BeginFade( INIT_SCREEN, 35, FADE_OUT_VERSION_FASTER, 25 );
|
|
//BeginFade( INIT_SCREEN, 35, FADE_OUT_VERSION_SIDE, 0 );
|
|
|
|
|
|
gubScreenCount = 2;
|
|
return( TRUE );
|
|
}
|
|
|
|
/*
|
|
if ( gubScreenCount == 2 )
|
|
{
|
|
|
|
if ( !SetCurrentWorldSector( 9, 1, 0 ) )
|
|
{
|
|
|
|
}
|
|
|
|
SetLaptopExitScreen( MAP_SCREEN );
|
|
|
|
FadeInGameScreen( );
|
|
|
|
EnterTacticalScreen( );
|
|
|
|
if( gfAtLeastOneMercWasHired == TRUE )
|
|
{
|
|
gubScreenCount = 3;
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
*/
|
|
|
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InitNewGame done");
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN AnyMercsHired( )
|
|
{
|
|
INT32 cnt;
|
|
SOLDIERTYPE *pTeamSoldier;
|
|
INT16 bLastTeamID;
|
|
|
|
// Find first guy availible in team
|
|
cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
|
|
|
|
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
|
|
|
|
// look for all mercs on the same team,
|
|
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= bLastTeamID; cnt++,pTeamSoldier++)
|
|
{
|
|
if ( pTeamSoldier->bActive )
|
|
{
|
|
return( TRUE );
|
|
}
|
|
}
|
|
|
|
return( FALSE );
|
|
}
|
|
|
|
|
|
void QuickStartGame( )
|
|
{
|
|
INT32 cnt;
|
|
UINT16 usVal;
|
|
UINT8 ub1 = 0, ub2 = 0;
|
|
|
|
for ( cnt = 0; cnt < 3; cnt++ )
|
|
{
|
|
if ( cnt == 0 )
|
|
{
|
|
usVal = (UINT16)Random( 40 );
|
|
|
|
QuickSetupOfMercProfileItems( cnt, (UINT8)usVal );
|
|
QuickGameMemberHireMerc( (UINT8)usVal );
|
|
}
|
|
else if ( cnt == 1 )
|
|
{
|
|
do
|
|
{
|
|
usVal = (UINT16)Random( 40 );
|
|
}
|
|
while( usVal != ub1 );
|
|
|
|
QuickSetupOfMercProfileItems( cnt, (UINT8)usVal );
|
|
QuickGameMemberHireMerc( (UINT8)usVal );
|
|
}
|
|
else if ( cnt == 2 )
|
|
{
|
|
do
|
|
{
|
|
usVal = (UINT16)Random( 40 );
|
|
}
|
|
while( usVal != ub1 && usVal != ub2 );
|
|
|
|
QuickSetupOfMercProfileItems( cnt, (UINT8)usVal );
|
|
QuickGameMemberHireMerc( (UINT8)usVal );
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// TEMP FUNCTION!
|
|
void QuickSetupOfMercProfileItems( UINT32 uiCount, UINT8 ubProfileIndex )
|
|
{
|
|
// Quickly give some guys we hire some items
|
|
|
|
if ( uiCount == 0 )
|
|
{
|
|
//CreateGun( GLOCK_17, &(pSoldier->inv[ HANDPOS ] ) );
|
|
//gMercProfiles[ ubProfileIndex ].inv[ HANDPOS ] = HAND_GRENADE;
|
|
//gMercProfiles[ ubProfileIndex ].bInvStatus[ HANDPOS ] = 100;
|
|
//gMercProfiles[ ubProfileIndex ].bInvNumber[ HANDPOS ] = 3;
|
|
gMercProfiles[ ubProfileIndex ].inv[ HANDPOS ] = C7;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ HANDPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ HANDPOS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ BIGPOCK1POS ] = CAWS;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ BIGPOCK1POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ BIGPOCK1POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].bSkillTrait = MARTIALARTS;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK3POS ] = KEY_2;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK3POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK3POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK5POS ] = LOCKSMITHKIT;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK5POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK5POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ BIGPOCK3POS ] = MEDICKIT;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ BIGPOCK3POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ BIGPOCK3POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ BIGPOCK4POS ] = SHAPED_CHARGE;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ BIGPOCK4POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ BIGPOCK4POS ] = 1;
|
|
|
|
|
|
// TEMP!
|
|
// make carman's opinion of us high!
|
|
gMercProfiles[ 78 ].bMercOpinion[ ubProfileIndex ] = 25;
|
|
|
|
}
|
|
else if ( uiCount == 1 )
|
|
{
|
|
gMercProfiles[ ubProfileIndex ].inv[ HANDPOS ] = CAWS;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ HANDPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ HANDPOS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK3POS ] = KEY_1;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK3POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK3POS ] = 1;
|
|
|
|
|
|
}
|
|
else if ( uiCount == 2 )
|
|
{
|
|
gMercProfiles[ ubProfileIndex ].inv[ HANDPOS ] = GLOCK_17;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ HANDPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ HANDPOS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SECONDHANDPOS ] = 5;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SECONDHANDPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SECONDHANDPOS ] = 1;
|
|
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK1POS ] = SILENCER;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK1POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK1POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK2POS ] = SNIPERSCOPE;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK2POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK2POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK3POS ] = LASERSCOPE;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK3POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK3POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK5POS ] = BIPOD;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK5POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK5POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK6POS ] = LOCKSMITHKIT;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK6POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK6POS ] = 1;
|
|
|
|
}
|
|
else
|
|
{
|
|
gMercProfiles[ ubProfileIndex ].inv[ HANDPOS ] = (UINT8)Random(30);
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ HANDPOS ] = 1;
|
|
|
|
|
|
}
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ HELMETPOS ] = KEVLAR_HELMET;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ HELMETPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ HELMETPOS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ VESTPOS ] = KEVLAR_VEST;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ VESTPOS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ VESTPOS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ BIGPOCK2POS ] = RDX;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ BIGPOCK2POS ] = 10;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ BIGPOCK2POS ] = 1;
|
|
|
|
gMercProfiles[ ubProfileIndex ].inv[ SMALLPOCK4POS ] = HAND_GRENADE;
|
|
gMercProfiles[ ubProfileIndex ].bInvStatus[ SMALLPOCK4POS ] = 100;
|
|
gMercProfiles[ ubProfileIndex ].bInvNumber[ SMALLPOCK4POS ] = 4;
|
|
|
|
// Give special items to some NPCs
|
|
//gMercProfiles[ 78 ].inv[ SMALLPOCK4POS ] = TERRORIST_INFO;
|
|
//gMercProfiles[ 78 ].bInvStatus[ SMALLPOCK4POS ] = 100;
|
|
//gMercProfiles[ 78 ].bInvNumber[ SMALLPOCK4POS ] = 1;
|
|
|
|
}
|
|
|
|
|
|
BOOLEAN QuickGameMemberHireMerc( UINT8 ubCurrentSoldier )
|
|
{
|
|
MERC_HIRE_STRUCT HireMercStruct;
|
|
|
|
memset(&HireMercStruct, 0, sizeof(MERC_HIRE_STRUCT));
|
|
|
|
HireMercStruct.ubProfileID = ubCurrentSoldier;
|
|
|
|
HireMercStruct.sSectorX = gsMercArriveSectorX;
|
|
HireMercStruct.sSectorY = gsMercArriveSectorY;
|
|
HireMercStruct.fUseLandingZoneForArrival = TRUE;
|
|
|
|
HireMercStruct.fCopyProfileItemsOver = TRUE;
|
|
HireMercStruct.ubInsertionCode = INSERTION_CODE_CHOPPER;
|
|
|
|
HireMercStruct.iTotalContractLength = 7;
|
|
|
|
//specify when the merc should arrive
|
|
HireMercStruct.uiTimeTillMercArrives = 0;
|
|
|
|
//if we succesfully hired the merc
|
|
if( !HireMerc( &HireMercStruct ) )
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
//add an entry in the finacial page for the hiring of the merc
|
|
AddTransactionToPlayersBook(HIRED_MERC, ubCurrentSoldier, GetWorldTotalMin(), -(INT32) gMercProfiles[ubCurrentSoldier].uiWeeklySalary );
|
|
|
|
if( gMercProfiles[ ubCurrentSoldier ].bMedicalDeposit )
|
|
{
|
|
//add an entry in the finacial page for the medical deposit
|
|
AddTransactionToPlayersBook(MEDICAL_DEPOSIT, ubCurrentSoldier, GetWorldTotalMin(), -(gMercProfiles[ubCurrentSoldier].sMedicalDepositAmount) );
|
|
}
|
|
|
|
//add an entry in the history page for the hiring of the merc
|
|
AddHistoryToPlayersLog( HISTORY_HIRED_MERC_FROM_AIM, ubCurrentSoldier, GetWorldTotalMin(), -1, -1 );
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
|
|
//This function is called when the game is REstarted. Things that need to be reinited are placed in here
|
|
void ReStartingGame()
|
|
{
|
|
UINT16 cnt;
|
|
|
|
//Pause the game
|
|
gfGamePaused = TRUE;
|
|
|
|
//Reset the sectors
|
|
gWorldSectorX = gWorldSectorY = 0;
|
|
gbWorldSectorZ = -1;
|
|
|
|
SoundStopAll( );
|
|
|
|
//we are going to restart a game so initialize the variable so we can initialize a new game
|
|
InitNewGame( TRUE );
|
|
|
|
//Deletes all the Temp files in the Maps\Temp directory
|
|
InitTacticalSave( TRUE );
|
|
|
|
//Loop through all the soldier and delete them all
|
|
for( cnt=0; cnt< TOTAL_SOLDIERS; cnt++)
|
|
{
|
|
TacticalRemoveSoldier( cnt );
|
|
}
|
|
|
|
// Re-init overhead...
|
|
InitOverhead( );
|
|
|
|
//Reset the email list
|
|
ShutDownEmailList();
|
|
|
|
//Reinit the laptopn screen variables
|
|
InitLaptopAndLaptopScreens();
|
|
LaptopScreenInit();
|
|
|
|
//Reload the Merc profiles
|
|
LoadMercProfiles( );
|
|
|
|
// Reload quote files
|
|
ReloadAllQuoteFiles();
|
|
|
|
//Initialize the ShopKeeper Interface ( arms dealer inventory, etc. )
|
|
ShopKeeperScreenInit();
|
|
|
|
//Delete the world info
|
|
TrashWorld();
|
|
|
|
//Init the help screen system
|
|
InitHelpScreenSystem();
|
|
|
|
EmptyDialogueQueue( );
|
|
|
|
if ( InAirRaid( ) )
|
|
{
|
|
EndAirRaid( );
|
|
}
|
|
|
|
#ifdef JA2TESTVERSION
|
|
//Reset so we can use the 'cheat key' to start with mercs
|
|
TempHiringOfMercs( 0, TRUE );
|
|
#endif
|
|
|
|
//Make sure the game starts in the TEAM panel ( it wasnt being reset )
|
|
gsCurInterfacePanel = TEAM_PANEL;
|
|
|
|
//Delete all the strategic events
|
|
DeleteAllStrategicEvents();
|
|
|
|
//This function gets called when ur in a game a click the quit to main menu button, therefore no game is in progress
|
|
gTacticalStatus.fHasAGameBeenStarted = FALSE;
|
|
|
|
// Reset timer callbacks
|
|
gpCustomizableTimerCallback = NULL;
|
|
|
|
gubCheatLevel = STARTING_CHEAT_LEVEL;
|
|
} |