mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
HAM5.5b2 merged in!
Notes: -There may still be bugs!! (In fact, I almost guarantee it -- there's -Ammo box code added to HR's crate code -Splitting a crate/box also automatically refills half empty magazines -new pathing arrows for map screen not included -code for scouts to know where enemies are going doesn't appear to work... but i'm not sure it was completed. -lots of gobledy gook (chinese?) comments turned back to english -also added Bob's popups -other languages besides english still need to have there language.cpp files updated with array changes -AI enhancements by Warmsteel (reloading, suppression, roaming, avoiding gas, and other fixes) git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5181 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -103,6 +103,9 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
|
||||
// Flashbang effect on soldier
|
||||
UINT8 DetermineFlashbangEffect( SOLDIERTYPE *pSoldier, INT8 ubExplosionDir, BOOLEAN fInBuilding);
|
||||
|
||||
// HEADROCK HAM 5.1: Explosion Fragments launcher
|
||||
void FireFragments( SOLDIERTYPE * pThrower, INT16 sX, INT16 sY, INT16 sZ, UINT16 usItem );
|
||||
|
||||
extern INT8 gbSAMGraphicList[ MAX_NUMBER_OF_SAMS ];
|
||||
extern void AddToShouldBecomeHostileOrSayQuoteList( UINT8 ubID );
|
||||
extern void RecompileLocalMovementCostsForWall( INT32 sGridNo, UINT8 ubOrientation );
|
||||
@@ -338,12 +341,17 @@ void InternalIgniteExplosion( UINT8 ubOwner, INT16 sX, INT16 sY, INT16 sZ, INT32
|
||||
ExpParams.bLevel = bLevel;
|
||||
|
||||
GenerateExplosion( &ExpParams );
|
||||
|
||||
// HEADROCK HAM 5.1: Launch fragments from the explosion.
|
||||
if (Explosive[ Item[ usItem ].ubClassIndex ].usNumFragments > 0 )
|
||||
{
|
||||
// HEADROCK HAM 5: Deactivated until the release of HAM 5.1.
|
||||
FireFragments( MercPtrs[ubOwner], sX, sY, sZ, usItem );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void IgniteExplosion( UINT8 ubOwner, INT16 sX, INT16 sY, INT16 sZ, INT32 sGridNo, UINT16 usItem, INT8 bLevel )
|
||||
{
|
||||
InternalIgniteExplosion( ubOwner, sX, sY, sZ, sGridNo, usItem, TRUE, bLevel );
|
||||
@@ -4349,6 +4357,43 @@ UINT8 DetermineFlashbangEffect( SOLDIERTYPE *pSoldier, INT8 ubExplosionDir, BOOL
|
||||
return ( FIRE_WEAPON_BLINDED_AND_DEAFENED );
|
||||
}
|
||||
|
||||
|
||||
// HEADROCK HAM 5.1: This handles launching fragments out of an explosion. The number of fragments is read from
|
||||
// the Explosives.XML file, and they each have a set amount of damage and range as well. They are currently
|
||||
// fired at completely random trajectories.
|
||||
void FireFragments( SOLDIERTYPE * pThrower, INT16 sX, INT16 sY, INT16 sZ, UINT16 usItem )
|
||||
{
|
||||
UINT16 usNumFragments = Explosive[Item[usItem].ubClassIndex].usNumFragments;
|
||||
UINT16 ubFragRange = Explosive[Item[usItem].ubClassIndex].ubFragRange;
|
||||
|
||||
AssertMsg( ubFragRange > 0 , "Fragmentation data lacks range property!" );
|
||||
|
||||
for (UINT16 x = 0; x < usNumFragments; x++)
|
||||
{
|
||||
FLOAT dRandomX = ((FLOAT)Random(2000) / 1000.0f) - 1.0f;
|
||||
FLOAT dRandomY = ((FLOAT)Random(2000) / 1000.0f) - 1.0f;
|
||||
FLOAT dRandomZ = ((FLOAT)Random(2000) / 1000.0f) - 1.0f;
|
||||
|
||||
FLOAT dDeltaX = (dRandomX * ubFragRange);
|
||||
FLOAT dDeltaY = (dRandomY * ubFragRange);
|
||||
FLOAT dDeltaZ = ((dRandomZ * 25.6f) * 50 );
|
||||
|
||||
FLOAT dRangeMultiplier = 10; // Arbitrary, but gives good results.
|
||||
|
||||
FLOAT dEndX = (FLOAT)(sX + (dDeltaX * dRangeMultiplier));
|
||||
FLOAT dEndY = (FLOAT)(sY + (dDeltaY * dRangeMultiplier));
|
||||
FLOAT dEndZ = (FLOAT)(sZ + (dDeltaZ * dRangeMultiplier));
|
||||
|
||||
// Add some randomness to the start coordinates as well, so that not all fragments fly from the same point
|
||||
// in space.
|
||||
FLOAT dStartX = (FLOAT)sX + (dRandomX * ((FLOAT)Random(4)+1.0f));
|
||||
FLOAT dStartY = (FLOAT)sY + (dRandomY * ((FLOAT)Random(4)+1.0f));
|
||||
FLOAT dStartZ = (FLOAT)sZ + (dRandomZ * ((FLOAT)Random(4)+1.0f));
|
||||
|
||||
FireFragmentGivenTarget( pThrower, dStartX, dStartY, dStartZ, dEndX, dEndY, dEndZ, usItem );
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef JA2UB
|
||||
|
||||
//-- UB
|
||||
|
||||
+68
-70
@@ -546,45 +546,43 @@ void DecaySmokeEffects( UINT32 uiTime )
|
||||
|
||||
if ( pSmoke->fAllocated )
|
||||
{
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_ON_ROOF )
|
||||
{
|
||||
bLevel = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bLevel = 0;
|
||||
}
|
||||
|
||||
|
||||
// Do things differently for combat /vs realtime
|
||||
// always try to update during combat
|
||||
if (gTacticalStatus.uiFlags & INCOMBAT )
|
||||
{
|
||||
fUpdate = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ATE: Do this every so ofte, to acheive the effect we want...
|
||||
if ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) > 10 )
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_ON_ROOF )
|
||||
{
|
||||
fUpdate = TRUE;
|
||||
bLevel = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bLevel = 0;
|
||||
}
|
||||
|
||||
usNumUpdates = ( UINT16 ) ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) / 10 );
|
||||
}
|
||||
}
|
||||
// Do things differently for combat /vs realtime
|
||||
// always try to update during combat
|
||||
if (gTacticalStatus.uiFlags & INCOMBAT )
|
||||
{
|
||||
fUpdate = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ATE: Do this every so ofte, to acheive the effect we want...
|
||||
if ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) > 10 )
|
||||
{
|
||||
fUpdate = TRUE;
|
||||
usNumUpdates = ( UINT16 ) ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) / 10 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( fUpdate )
|
||||
{
|
||||
if ( fUpdate )
|
||||
{
|
||||
pSmoke->uiTimeOfLastUpdate = uiTime;
|
||||
|
||||
for ( cnt2 = 0; cnt2 < usNumUpdates; cnt2++ )
|
||||
{
|
||||
pSmoke->bAge++;
|
||||
|
||||
for ( cnt2 = 0; cnt2 < usNumUpdates; cnt2++ )
|
||||
{
|
||||
pSmoke->bAge++;
|
||||
|
||||
if ( pSmoke->bAge == 1 )
|
||||
{
|
||||
// ATE: At least mark for update!
|
||||
pSmoke->bFlags |= SMOKE_EFFECT_MARK_FOR_UPDATE;
|
||||
// ATE: At least mark for update!
|
||||
pSmoke->bFlags |= SMOKE_EFFECT_MARK_FOR_UPDATE;
|
||||
fSpreadEffect = FALSE;
|
||||
}
|
||||
else
|
||||
@@ -592,41 +590,41 @@ void DecaySmokeEffects( UINT32 uiTime )
|
||||
fSpreadEffect = TRUE;
|
||||
}
|
||||
|
||||
if ( fSpreadEffect )
|
||||
{
|
||||
// if this cloud remains effective (duration not reached)
|
||||
if ( pSmoke->bAge <= pSmoke->ubDuration)
|
||||
{
|
||||
// ATE: Only mark now and increse radius - actual drawing is done
|
||||
// in another pass cause it could
|
||||
// just get erased...
|
||||
pSmoke->bFlags |= SMOKE_EFFECT_MARK_FOR_UPDATE;
|
||||
if ( fSpreadEffect )
|
||||
{
|
||||
// if this cloud remains effective (duration not reached)
|
||||
if ( pSmoke->bAge <= pSmoke->ubDuration)
|
||||
{
|
||||
// ATE: Only mark now and increse radius - actual drawing is done
|
||||
// in another pass cause it could
|
||||
// just get erased...
|
||||
pSmoke->bFlags |= SMOKE_EFFECT_MARK_FOR_UPDATE;
|
||||
|
||||
// calculate the new cloud radius
|
||||
// cloud expands by 1 every turn outdoors, and every other turn indoors
|
||||
// calculate the new cloud radius
|
||||
// cloud expands by 1 every turn outdoors, and every other turn indoors
|
||||
|
||||
// ATE: If radius is < maximun, increase radius, otherwise keep at max
|
||||
if ( pSmoke->ubRadius < Explosive[ Item[ pSmoke->usItem ].ubClassIndex ].ubRadius )
|
||||
{
|
||||
pSmoke->ubRadius++;
|
||||
// ATE: If radius is < maximun, increase radius, otherwise keep at max
|
||||
if ( pSmoke->ubRadius < Explosive[ Item[ pSmoke->usItem ].ubClassIndex ].ubRadius )
|
||||
{
|
||||
pSmoke->ubRadius++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// deactivate tear gas cloud (use last known radius)
|
||||
SpreadEffect( pSmoke->sGridNo, pSmoke->ubRadius, pSmoke->usItem, pSmoke->ubOwner, ERASE_SPREAD_EFFECT, bLevel, cnt );
|
||||
pSmoke->fAllocated = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// deactivate tear gas cloud (use last known radius)
|
||||
SpreadEffect( pSmoke->sGridNo, pSmoke->ubRadius, pSmoke->usItem, pSmoke->ubOwner, ERASE_SPREAD_EFFECT, bLevel, cnt );
|
||||
pSmoke->fAllocated = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// damage anyone standing in cloud
|
||||
SpreadEffect( pSmoke->sGridNo, pSmoke->ubRadius, pSmoke->usItem, pSmoke->ubOwner, REDO_SPREAD_EFFECT, bLevel, cnt );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( cnt = 0; cnt < guiNumSmokeEffects; cnt++ )
|
||||
@@ -635,22 +633,22 @@ void DecaySmokeEffects( UINT32 uiTime )
|
||||
|
||||
if ( pSmoke->fAllocated )
|
||||
{
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_ON_ROOF )
|
||||
{
|
||||
bLevel = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bLevel = 0;
|
||||
}
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_ON_ROOF )
|
||||
{
|
||||
bLevel = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bLevel = 0;
|
||||
}
|
||||
|
||||
// if this cloud remains effective (duration not reached)
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_MARK_FOR_UPDATE )
|
||||
// if this cloud remains effective (duration not reached)
|
||||
if ( pSmoke->bFlags & SMOKE_EFFECT_MARK_FOR_UPDATE )
|
||||
{
|
||||
SpreadEffect( pSmoke->sGridNo, pSmoke->ubRadius, pSmoke->usItem, pSmoke->ubOwner, TRUE, bLevel, cnt );
|
||||
pSmoke->bFlags &= (~SMOKE_EFFECT_MARK_FOR_UPDATE);
|
||||
pSmoke->bFlags &= (~SMOKE_EFFECT_MARK_FOR_UPDATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AllTeamsLookForAll( TRUE );
|
||||
|
||||
@@ -44,6 +44,8 @@ extern UINT32 guiNumSmokeEffects;
|
||||
INT8 GetSmokeEffectOnTile( INT32 sGridNo, INT8 bLevel );
|
||||
|
||||
// Decays all smoke effects...
|
||||
// HEADROCK HAM 5: New argument here tells the decay function to only process clouds belonging to one team.
|
||||
// -1 = all teams.
|
||||
void DecaySmokeEffects( UINT32 uiTime );
|
||||
|
||||
// Add smoke to gridno
|
||||
|
||||
+26
-17
@@ -220,7 +220,14 @@ void EnvironmentController( BOOLEAN fCheckForLights )
|
||||
{
|
||||
if ( guiRainLoop == NO_SAMPLE )
|
||||
{
|
||||
guiRainLoop = PlayJA2Ambient( RAIN_1, BTNVOLUME, 0 );
|
||||
if (guiEnvWeather & WEATHER_FORECAST_THUNDERSHOWERS )
|
||||
{
|
||||
guiRainLoop = PlayJA2Ambient( RAIN_1, 140, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
guiRainLoop = PlayJA2Ambient( RAIN_1, 70, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -707,24 +714,26 @@ void EnvBeginRainStorm( UINT8 ubIntensity )
|
||||
{
|
||||
gfDoLighting = TRUE;
|
||||
|
||||
#ifdef JA2TESTVERSION
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_TESTVERSION, L"Starting Rain...." );
|
||||
#endif
|
||||
#ifdef JA2TESTVERSION
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_TESTVERSION, L"Starting Rain...." );
|
||||
#endif
|
||||
|
||||
// First turn off whatever rain it is, then turn on the requested rain
|
||||
guiEnvWeather &= ~(WEATHER_FORECAST_THUNDERSHOWERS | WEATHER_FORECAST_SHOWERS);
|
||||
// First turn off whatever rain it is, then turn on the requested rain
|
||||
guiEnvWeather &= ~(WEATHER_FORECAST_THUNDERSHOWERS | WEATHER_FORECAST_SHOWERS);
|
||||
|
||||
if ( ubIntensity == 1 )
|
||||
{
|
||||
// Turn on rain storms
|
||||
guiEnvWeather |= WEATHER_FORECAST_THUNDERSHOWERS;
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_STORM_STARTED] );
|
||||
}
|
||||
else
|
||||
{
|
||||
guiEnvWeather |= WEATHER_FORECAST_SHOWERS;
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_RAIN_STARTED] );
|
||||
}
|
||||
if ( ubIntensity == 1 )
|
||||
{
|
||||
// Turn on rain storms
|
||||
guiEnvWeather |= WEATHER_FORECAST_THUNDERSHOWERS;
|
||||
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_STORM_STARTED] );
|
||||
}
|
||||
else
|
||||
{
|
||||
guiEnvWeather |= WEATHER_FORECAST_SHOWERS;
|
||||
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_RAIN_STARTED] );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,7 +62,8 @@ class SOLDIERTYPE;
|
||||
|
||||
#define GET_OBJECT_LEVEL( z ) ( (INT8)( ( z + 10 ) / HEIGHT_UNITS ) )
|
||||
//#define OBJECT_DETONATE_ON_IMPACT( object ) ( ( object->Obj.usItem == MORTAR_SHELL ) ) // && ( object->ubActionCode == THROW_ARM_ITEM || pObject->fTestObject ) )
|
||||
#define OBJECT_DETONATE_ON_IMPACT( object ) ( ( Item[object->Obj.usItem].usItemClass == IC_BOMB ) ) // && ( object->ubActionCode == THROW_ARM_ITEM || pObject->fTestObject ) )
|
||||
// HEADROCK HAM 5: Enabled "Explode on Impact" flag for explosive items
|
||||
#define OBJECT_DETONATE_ON_IMPACT( object ) ( ( Item[object->Obj.usItem].usItemClass == IC_BOMB ) || ( Explosive[Item[object->Obj.usItem].ubClassIndex ].fExplodeOnImpact ) ) // && ( object->ubActionCode == THROW_ARM_ITEM || pObject->fTestObject ) )
|
||||
|
||||
|
||||
#define MAX_INTEGRATIONS 8
|
||||
|
||||
Reference in New Issue
Block a user