mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
GameDir >= r2204 is recommended. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7727 3b4a5df2-a311-0410-b5c6-a8a6f20db521
260 lines
7.0 KiB
C++
260 lines
7.0 KiB
C++
#ifdef PRECOMPILEDHEADERS
|
|
#include "Strategic All.h"
|
|
#else
|
|
#include "Strategic.h"
|
|
#include "Types.h"
|
|
#include "Squads.h"
|
|
#include "jascreens.h"
|
|
#include "Assignments.h"
|
|
#include "Interface Control.h"
|
|
#include "Overhead.h"
|
|
#include "Soldier Profile.h"
|
|
#include "Dialogue Control.h"
|
|
#include "personnel.h"
|
|
#include "Tactical Save.h"
|
|
#include "Isometric Utils.h"
|
|
#include "Vehicles.h"
|
|
#include "Game Clock.h"
|
|
#include "CampaignStats.h" // added by Flugente
|
|
#include "militiasquads.h" // added by Flugente
|
|
#include "Game Event Hook.h" // added by Flugente
|
|
#include "message.h" // added by Flugente
|
|
#include "Text.h" // added by Flugente
|
|
#include "Queen Command.h" // added by Flugente
|
|
#endif
|
|
|
|
#ifdef JA2UB
|
|
#else
|
|
// anv: for playable Speck
|
|
#include "mercs.h"
|
|
#endif
|
|
|
|
StrategicMapElement StrategicMap[MAP_WORLD_X*MAP_WORLD_Y];
|
|
|
|
extern BOOLEAN fReDrawFace;
|
|
|
|
|
|
|
|
BOOLEAN HandleStrategicDeath( SOLDIERTYPE *pSoldier )
|
|
{
|
|
// add the guy to the dead list
|
|
//AddCharacterToDeadList( pSoldier );
|
|
|
|
// If in a vehicle, remove them!
|
|
if( ( pSoldier->bAssignment == VEHICLE ) && ( pSoldier->iVehicleId != -1 ) )
|
|
{
|
|
// remove from vehicle
|
|
TakeSoldierOutOfVehicle( pSoldier );
|
|
}
|
|
|
|
// if not in mapscreen
|
|
if ( !(guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
|
|
{
|
|
// ATE; At least make them dead!
|
|
if( ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) )
|
|
{
|
|
SetTimeOfAssignmentChangeForMerc( pSoldier );
|
|
}
|
|
|
|
ChangeSoldiersAssignment( pSoldier, ASSIGNMENT_DEAD );
|
|
}
|
|
else if( ( pSoldier->stats.bLife == 0 )&&( pSoldier->bAssignment != ASSIGNMENT_DEAD ) )
|
|
{
|
|
// died in mapscreen
|
|
|
|
fReDrawFace = TRUE;
|
|
|
|
// dead
|
|
if( ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) )
|
|
{
|
|
SetTimeOfAssignmentChangeForMerc( pSoldier );
|
|
}
|
|
|
|
ChangeSoldiersAssignment( pSoldier, ASSIGNMENT_DEAD );
|
|
|
|
//s et breath and breath max to 0
|
|
pSoldier->bBreath = pSoldier->bBreathMax = 0;
|
|
|
|
// rebuild list
|
|
ReBuildCharactersList( );
|
|
|
|
// ste merc as dead
|
|
// pSoldier->flags.fUIdeadMerc = TRUE;
|
|
|
|
// attempt to remove character from squad
|
|
RemoveCharacterFromSquads( pSoldier );
|
|
|
|
// handle any passign comments by grunts
|
|
HandleSoldierDeadComments( pSoldier );
|
|
|
|
// put the dead guys down
|
|
AddDeadSoldierToUnLoadedSector( ( UINT8 ) ( pSoldier->sSectorX ), ( UINT8 )( pSoldier->sSectorY ), pSoldier->bSectorZ, pSoldier, RandomGridNo(), ADD_DEAD_SOLDIER_TO_SWEETSPOT );
|
|
|
|
fTeamPanelDirty = TRUE;
|
|
fMapPanelDirty = TRUE;
|
|
fCharacterInfoPanelDirty = TRUE;
|
|
|
|
StopTimeCompression();
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
void HandleSoldierDeadComments( SOLDIERTYPE *pSoldier )
|
|
{
|
|
INT32 cnt = 0;
|
|
SOLDIERTYPE *pTeamSoldier;
|
|
INT8 bBuddyIndex;
|
|
|
|
// IF IT'S THE SELECTED GUY, MAKE ANOTHER SELECTED!
|
|
cnt = gTacticalStatus.Team[ pSoldier->bTeam ].bFirstID;
|
|
|
|
|
|
// see if this was the friend of a living merc
|
|
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID; cnt++,pTeamSoldier++)
|
|
{
|
|
if ( pTeamSoldier->stats.bLife >= OKLIFE && pTeamSoldier->bActive )
|
|
{
|
|
bBuddyIndex = WhichBuddy( pTeamSoldier->ubProfile, pSoldier->ubProfile );
|
|
switch( bBuddyIndex )
|
|
{
|
|
case 0:
|
|
// buddy #1 died!
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_ONE_KILLED );
|
|
break;
|
|
case 1:
|
|
// buddy #2 died!
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_BUDDY_TWO_KILLED );
|
|
break;
|
|
case 2:
|
|
// buddy #3 died!
|
|
if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_THREE_KILLED );
|
|
else
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_THREE_KILLED );
|
|
break;
|
|
case 3:
|
|
// buddy #4 died!
|
|
if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_FOUR_KILLED );
|
|
else
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_FOUR_KILLED );
|
|
break;
|
|
case 4:
|
|
// buddy #5 died!
|
|
if( pTeamSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_AIM_BUDDY_FIVE_KILLED );
|
|
else
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_NON_AIM_BUDDY_FIVE_KILLED );
|
|
break;
|
|
case 5:
|
|
// learn to like buddy died!
|
|
TacticalCharacterDialogue( pTeamSoldier, QUOTE_LEARNED_TO_LIKE_MERC_KILLED );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef JA2UB
|
|
#else
|
|
// anv: handle Speck witnessing his employee death
|
|
if( pTeamSoldier->ubProfile == SPECK_PLAYABLE && pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__MERC )
|
|
HandleSpeckWitnessingEmployeeDeath( pSoldier );
|
|
#endif
|
|
|
|
}
|
|
}
|
|
|
|
BOOLEAN SetMilitiaMovementOrder(INT16 sX, INT16 sY, INT8 sZ, UINT32 dir)
|
|
{
|
|
// militia can only move on the surface
|
|
if ( sZ )
|
|
return FALSE;
|
|
|
|
// militia needs to be here...
|
|
if ( !NumNonPlayerTeamMembersInSector( sX, sY, MILITIA_TEAM ) )
|
|
return FALSE;
|
|
|
|
// in order to give movement orders, we need a merc to staff a military headquarter
|
|
if ( !MercStaffsMilitaryHQ() )
|
|
return FALSE;
|
|
|
|
INT16 newX = sX;
|
|
INT16 newY = sY;
|
|
UINT8 movetype = THROUGH_STRATEGIC_MOVE;
|
|
|
|
switch (dir)
|
|
{
|
|
case MILITIA_MOVE_NORTH:
|
|
--newY;
|
|
movetype = NORTH_STRATEGIC_MOVE;
|
|
break;
|
|
|
|
case MILITIA_MOVE_WEST:
|
|
--newX;
|
|
movetype = WEST_STRATEGIC_MOVE;
|
|
break;
|
|
|
|
case MILITIA_MOVE_EAST:
|
|
++newX;
|
|
movetype = EAST_STRATEGIC_MOVE;
|
|
break;
|
|
|
|
case MILITIA_MOVE_SOUTH:
|
|
++newY;
|
|
movetype = SOUTH_STRATEGIC_MOVE;
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
break;
|
|
}
|
|
|
|
if ( gGameExternalOptions.gflimitedRoaming && !IsSectorRoamingAllowed( SECTOR(newX, newY) ) )
|
|
{
|
|
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, gpStrategicString[STR_MILITIAMOVEMENT_NO_LIMITEDROAMING] );
|
|
return FALSE;
|
|
}
|
|
|
|
UINT8 ubTraverseType = SectorInfo[ SECTOR(sX, sY) ].ubTraversability[ movetype ];
|
|
|
|
if( ubTraverseType == GROUNDBARRIER || ubTraverseType == EDGEOFWORLD )
|
|
return FALSE;
|
|
|
|
UINT32 ubTraverseMod = 0;
|
|
|
|
switch( ubTraverseType )
|
|
{
|
|
case TOWN: ubTraverseMod = 1780;break;
|
|
case ROAD: ubTraverseMod = 100;break;
|
|
case PLAINS: ubTraverseMod = 85; break;
|
|
case SAND: ubTraverseMod = 50; break;
|
|
case SPARSE: ubTraverseMod = 70; break;
|
|
case DENSE: ubTraverseMod = 60; break;
|
|
case SWAMP: ubTraverseMod = 35; break;
|
|
case WATER: ubTraverseMod = 25; break;
|
|
case HILLS: ubTraverseMod = 50; break;
|
|
case NS_RIVER: ubTraverseMod = 25; break;
|
|
case EW_RIVER: ubTraverseMod = 25; break;
|
|
}
|
|
|
|
if( ubTraverseMod )
|
|
{
|
|
UINT32 timeneeded = FOOT_TRAVEL_TIME * 100 / ubTraverseMod;
|
|
|
|
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sX, sY ) ] );
|
|
|
|
StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags &= ~MILITIA_MOVE_ALLDIRS;
|
|
StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags |= dir;
|
|
|
|
AddStrategicEvent( EVENT_MILITIA_MOVEMENT_ORDER, GetWorldTotalMin() + timeneeded, SECTOR( sX, sY ) );
|
|
|
|
fMapPanelDirty = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
} |