Little Alien

- Bug fix: STRAIGHT_RANGE was not initialized properly causing enemies become invisible

Added changes from 2006-05-14 2 by Madd Mugsy

- Added Lesh's Explosion data externalization code for exp. animations, sounds, etc.
- Fixed some armor issues with ceramic plate-type attachments being attached to non-vest slots
- Removed hard coded item indexes from sun goggle / night goggle swapping, now it picks the best possible goggles



git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@71 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
lalien
2006-05-18 14:58:18 +00:00
parent d6820d6ef0
commit ca45e66f44
24 changed files with 273 additions and 176 deletions
+5
View File
@@ -281,6 +281,11 @@ BOOLEAN LoadExternalGameplayData(STR directoryName)
if(!ReadInMapStructure(fileName))
return FALSE;
strcpy(fileName, directoryName);
strcat(fileName, EXPLOSIONDATAFILENAME);
if(!ReadInExplosionDataStats(fileName))
return FALSE;
return TRUE;
}
+3 -2
View File
@@ -3,6 +3,7 @@
ProjectType="Visual C++"
Version="7.10"
Name="ja2"
RootNamespace="ja2"
SccProjectName=""
SccAuxPath=""
SccLocalPath=""
@@ -42,7 +43,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="libexpatMT.lib mss32.lib winmm.lib smackw32.lib fmodvc.lib"
OutputFile="C:\games\Jagged Alliance 2 v1.13\ja2_debug_2006_05_11.exe"
OutputFile="C:\games\Jagged Alliance 2 v1.13\ja2_debug_2006_05_18.exe"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
@@ -545,7 +546,7 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="libexpatMT.lib winmm.lib smackw32.lib mss32.lib fmodvc.lib"
OutputFile="C:\Games\Jagged Alliance 2 v1.13\ja2_release_2006_05_11.exe"
OutputFile="C:\Games\Jagged Alliance 2 v1.13\ja2_release_2006_05_18.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
-1
View File
@@ -42,7 +42,6 @@
//
//
//*****************************************************************************
#define STRICT
typedef struct StackHeaderTag
{
+1 -1
View File
@@ -127,7 +127,7 @@ typedef INT32 IVECTOR4[4]; // 4d vector (4x1 matrix)
typedef VECTOR3 MATRIX3[3]; // 3x3 matrix
typedef VECTOR4 MATRIX4[4]; // 4x4 matrix
typedef VECTOR3 ANGLE; // angle return array
//typedef VECTOR3 ANGLE; // angle return array //lal removed
typedef VECTOR4 COLOR; // rgba color array
+2 -2
View File
@@ -79,7 +79,7 @@ of the group. If the priority of the group is high, they
// values have been externalized into an INI file. Not all of them at this point,
// but more will be externalized as time goes on.
#define BASIC_POOL_INCREMENT gGameExternalOptions.guiBaseQueenPoolIncrement
//#define BASIC_POOL_INCREMENT gGameExternalOptions.guiBaseQueenPoolIncrement
//Modifies the number of troops the queen has at the beginning of the game on top
//of all of the garrison and patrol groups. Additionally, there are a total of
@@ -2957,7 +2957,7 @@ void EvaluateQueenSituation()
if( !giReinforcementPool )
{ //Queen has run out of reinforcements. Simulate recruiting and training new troops
uiOffset *= 10;
giReinforcementPool += ( BASIC_POOL_INCREMENT * gGameOptions.ubDifficultyLevel ) * ( 100 + CurrentPlayerProgressPercentage() ) / 100 ;
giReinforcementPool += ( gGameExternalOptions.guiBaseQueenPoolIncrement * gGameOptions.ubDifficultyLevel ) * ( 100 + CurrentPlayerProgressPercentage() ) / 100 ;
AddStrategicEvent( EVENT_EVALUATE_QUEEN_SITUATION, GetWorldTotalMin() + uiOffset, 0 );
return;
}
+2 -2
View File
@@ -768,13 +768,13 @@ void HandleMurderOfCivilian( SOLDIERTYPE *pSoldier, BOOLEAN fIntentional )
}
// killer seen by civ?
if ( SoldierToSoldierLineOfSightTest( pCivSoldier, MercPtrs[ pSoldier->ubAttackerID ], STRAIGHT_RANGE, TRUE ) != 0 )
if ( SoldierToSoldierLineOfSightTest( pCivSoldier, MercPtrs[ pSoldier->ubAttackerID ], gGameExternalOptions.ubStraightSightRange, TRUE ) != 0 )
{
bSeenState |= 1;
}
// victim seen by civ?
if( SoldierToSoldierLineOfSightTest( pCivSoldier, pSoldier, STRAIGHT_RANGE, TRUE ) != 0 )
if( SoldierToSoldierLineOfSightTest( pCivSoldier, pSoldier, gGameExternalOptions.ubStraightSightRange, TRUE ) != 0 )
{
bSeenState |= 2;
}
+1 -1
View File
@@ -148,7 +148,7 @@
#define DOTDOTDOT L"..."
#define COMMA_AND_SPACE L", "
#define ITEM_PROS_AND_CONS( usItem ) ( ( Item[ usItem ].usItemClass & IC_GUN) )
#define ITEM_PROS_AND_CONS( usItem ) ( ( Item[ usItem ].usItemClass & IC_GUN && !Item[ usItem ].rocketlauncher ) )
#define MAP_ITEMDESC_DESC_START_X ( 23 + gsInvDescX )
#define MAP_ITEMDESC_DESC_START_Y (170 + gsInvDescY)
+14 -1
View File
@@ -1194,7 +1194,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
{
CreateItem( usAttachment, (INT8)(70+Random(31)), &Object );
Object.fFlags |= OBJECT_UNDROPPABLE;
AttachObject( NULL, &(pp->Inv[ VESTPOS ]), &Object );
AttachObject( NULL, &(pp->Inv[ HELMETPOS ]), &Object );
}
}
@@ -1348,6 +1348,19 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
{
CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ LEGPOS ]) );
pp->Inv[ LEGPOS ].fFlags |= OBJECT_UNDROPPABLE;
// roll to see if he gets an attachment, too. Higher chance the higher his entitled Leggings class is
if (( INT8 ) Random( 100 ) < ( 15 * ( bLeggingsClass - Item[usItem].ubCoolness ) ) )
{
UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT,usItem, bLeggingsClass, FALSE);
if ( usAttachment > 0 )
{
CreateItem( usAttachment, (INT8)(70+Random(31)), &Object );
Object.fFlags |= OBJECT_UNDROPPABLE;
AttachObject( NULL, &(pp->Inv[ LEGPOS ]), &Object );
}
}
}
+29 -1
View File
@@ -7068,4 +7068,32 @@ UINT16 GetFirstExplosiveOfType(UINT16 expType)
}
return 0;
}
}
INT8 FindSunGoggles( SOLDIERTYPE * pSoldier, INT16 bonusToBeat )
{
INT8 bLoop;
for (bLoop = HANDPOS; bLoop <= SMALLPOCK8POS; bLoop++)
{
if (Item[pSoldier->inv[bLoop].usItem].brightlightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE )
{
return( bLoop );
}
}
return( ITEM_NOT_FOUND );
}
INT8 FindNightGoggles( SOLDIERTYPE * pSoldier, INT16 bonusToBeat )
{
INT8 bLoop;
for (bLoop = HANDPOS; bLoop <= SMALLPOCK8POS; bLoop++)
{
if (Item[pSoldier->inv[bLoop].usItem].nightvisionrangebonus > bonusToBeat && Item[pSoldier->inv[bLoop].usItem].usItemClass == IC_FACE )
{
return( bLoop );
}
}
return( ITEM_NOT_FOUND );
}
+3
View File
@@ -285,5 +285,8 @@ INT16 GetGearAPBonus( SOLDIERTYPE * pSoldier );
UINT16 GetFirstExplosiveOfType(UINT16 expType);
INT8 FindSunGoggles( SOLDIERTYPE * pSoldier, INT16 bonusToBeat );
INT8 FindNightGoggles( SOLDIERTYPE * pSoldier, INT16 bonusToBeat );
#endif
+6 -6
View File
@@ -186,7 +186,7 @@ enum
// CHANGE THIS VALUE TO AFFECT TOTAL SIGHT RANGE
#define STRAIGHT_RANGE gGameExternalOptions.ubStraightSightRange
//#define STRAIGHT_RANGE gGameExternalOptions.ubStraightSightRange
// CHANGE THESE VALUES TO ADJUST VARIOUS FOV ANGLES
#define STRAIGHT_RATIO 1 //* 1.5
@@ -199,11 +199,11 @@ enum
#define BEHIND_RATIO 0
// looking distance defines
#define BEHIND (INT8)( BEHIND_RATIO * STRAIGHT_RANGE )
#define SBEHIND (INT8)( SBEHIND_RATIO * STRAIGHT_RANGE )
#define SIDE (INT8)( SIDE_RATIO * STRAIGHT_RANGE )
#define ANGLE (INT8)( ANGLE_RATIO * STRAIGHT_RANGE )
#define STRAIGHT (INT8)( STRAIGHT_RATIO * STRAIGHT_RANGE )
//#define BEHIND (INT8)( BEHIND_RATIO * STRAIGHT_RANGE )
//#define SBEHIND (INT8)( SBEHIND_RATIO * STRAIGHT_RANGE )
//#define SIDE (INT8)( SIDE_RATIO * STRAIGHT_RANGE )
//#define ANGLE (INT8)( ANGLE_RATIO * STRAIGHT_RANGE )
//#define STRAIGHT (INT8)( STRAIGHT_RATIO * STRAIGHT_RANGE )
// opplist value constants
+1
View File
@@ -46,6 +46,7 @@
#include "Reinforcement.h"
extern INT8 STRAIGHT;
//extern UINT8 gubSpeedUpAnimationFactor;
void SetSoldierAniSpeed( SOLDIERTYPE *pSoldier );
+40 -45
View File
@@ -2895,8 +2895,8 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
case 'N':
{
SOLDIERTYPE *pTeamSoldier;
INT8 bLoop, bSlot1, bSlot2;
INT8 bLoop, bSlot1, bSlot2, temp;
INT16 lastBonus=0;
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 ) )
@@ -2904,55 +2904,51 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
//2 head slots
for (bSlot1 = HEAD1POS; bSlot1 <= HEAD2POS; bSlot1++)
{
if ( (pTeamSoldier->inv[bSlot1].usItem == SUNGOGGLES)||(pTeamSoldier->inv[bSlot1].usItem == NIGHTGOGGLES)||(pTeamSoldier->inv[bSlot1].usItem == UVGOGGLES) )
if ( Item[pTeamSoldier->inv[bSlot1].usItem].brightlightvisionrangebonus > 0 )
{
switch (pTeamSoldier->inv[bSlot1].usItem)
lastBonus=0;
bSlot2 = ITEM_NOT_FOUND;
temp = 0;
while (temp != ITEM_NOT_FOUND)
{
case SUNGOGGLES:
temp = FindNightGoggles( pTeamSoldier, lastBonus );
if ( temp > ITEM_NOT_FOUND )
{
bSlot2 = FindObjWithin( pTeamSoldier, UVGOGGLES, HANDPOS, SMALLPOCK8POS );
if ( bSlot2 != -1 )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
else
{
bSlot2 = FindObjWithin( pTeamSoldier, NIGHTGOGGLES, HANDPOS, SMALLPOCK8POS );
if ( bSlot2 != -1 )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
}
lastBonus = Item[pTeamSoldier->inv[temp].usItem].nightvisionrangebonus;
bSlot2 = temp;
}
break;
case NIGHTGOGGLES:
{
bSlot2 = FindObjWithin( pTeamSoldier, SUNGOGGLES, HANDPOS, SMALLPOCK8POS );
if ( bSlot2 != -1 )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
}
break;
case UVGOGGLES:
{
bSlot2 = FindObjWithin( pTeamSoldier, SUNGOGGLES, HANDPOS, SMALLPOCK8POS );
if ( bSlot2 != -1 )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
}
break;
}
fCharacterInfoPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
DeleteSoldierLight( pTeamSoldier );
PositionSoldierLight( pTeamSoldier );
if ( bSlot2 != ITEM_NOT_FOUND )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
break;
}
else if(Item[pTeamSoldier->inv[bSlot1].usItem].nightvisionrangebonus > 0)
{
lastBonus=0;
bSlot2 = ITEM_NOT_FOUND;
temp = 0;
while (temp != ITEM_NOT_FOUND)
{
temp = FindSunGoggles( pTeamSoldier, lastBonus );
if ( temp > ITEM_NOT_FOUND )
{
lastBonus = Item[pTeamSoldier->inv[temp].usItem].brightlightvisionrangebonus;
bSlot2 = temp;
}
}
if ( bSlot2 != ITEM_NOT_FOUND )
{
SwapObjs( &(pTeamSoldier->inv[bSlot1]), &(pTeamSoldier->inv[bSlot2] ) );
}
break;
}
}
fCharacterInfoPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
DeleteSoldierLight( pTeamSoldier );
PositionSoldierLight( pTeamSoldier );
}
}
}
@@ -3193,7 +3189,6 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
case 'S':
if (! (gTacticalStatus.uiFlags & INCOMBAT) )
{
for ( UINT32 uiLoop = 0; uiLoop < guiNumWorldItems; uiLoop++ )
+7 -6
View File
@@ -951,7 +951,7 @@ INT32 EffectiveArmour( OBJECTTYPE * pObj )
{
INT32 iValue2;
iValue2 = Armour[ Item[ CERAMIC_PLATES ].ubClassIndex ].ubProtection;
iValue2 = Armour[ Item[ pObj->usAttachItem[bPlate] ].ubClassIndex ].ubProtection;
iValue2 = iValue2 * pObj->bAttachStatus[ bPlate ] / 100;
iValue += iValue2;
@@ -1015,12 +1015,12 @@ INT32 ExplosiveEffectiveArmour( OBJECTTYPE * pObj )
iValue *= 3;
}
bPlate = FindAttachment( pObj, CERAMIC_PLATES );
bPlate = FindFirstArmourAttachment( pObj );
if ( bPlate != ITEM_NOT_FOUND )
{
INT32 iValue2;
iValue2 = Armour[ Item[ CERAMIC_PLATES ].ubClassIndex ].ubProtection;
iValue2 = Armour[ Item[ pObj->usAttachItem[bPlate] ].ubClassIndex ].ubProtection;
iValue2 = iValue2 * pObj->bAttachStatus[ bPlate ] / 100;
iValue += iValue2;
@@ -4064,8 +4064,8 @@ INT32 TotalArmourProtection( SOLDIERTYPE *pFirer, SOLDIERTYPE * pTarget, UINT8 u
if (pArmour->usItem != NOTHING)
{
// check plates first
if ( iSlot == VESTPOS )
{
//if ( iSlot == VESTPOS )
//{
// bPlatePos = FindAttachment( pArmour, CERAMIC_PLATES );
bPlatePos = FindFirstArmourAttachment( pArmour);
if (bPlatePos != -1)
@@ -4087,7 +4087,8 @@ INT32 TotalArmourProtection( SOLDIERTYPE *pFirer, SOLDIERTYPE * pTarget, UINT8 u
#endif
}
}
}
//}
// if the plate didn't stop the bullet...
if ( iImpact > iTotalProtection )
+6
View File
@@ -59,6 +59,8 @@ typedef PARSE_STAGE;
#define SOUNDSFILENAME "Sounds.xml"
#define BURSTSOUNDSFILENAME "BurstSounds.xml"
// Lesh: filename definition
#define EXPLOSIONDATAFILENAME "ExplosionData.xml"
#define CITYTABLEFILENAME "Cities.xml"
extern BOOLEAN ReadInItemStats(STR fileName);
@@ -122,4 +124,8 @@ extern BOOLEAN WriteAmmoTypeStats();
extern BOOLEAN ReadInBurstSoundArray(STR fileName);
extern BOOLEAN WriteBurstSoundArray();
// Lesh: over
// Lesh: 2 new lines added for explosion data
extern BOOLEAN ReadInExplosionDataStats(STR fileName);
extern BOOLEAN WriteExplosionDataStats();
// Lesh: over
#endif
+28 -21
View File
@@ -152,30 +152,37 @@ UINT8 gubWatchedLocPoints[ TOTAL_SOLDIERS ][ NUM_WATCHED_LOCS ];
BOOLEAN gfWatchedLocReset[ TOTAL_SOLDIERS ][ NUM_WATCHED_LOCS ];
BOOLEAN gfWatchedLocHasBeenIncremented[ TOTAL_SOLDIERS ][ NUM_WATCHED_LOCS ];
INT8 gbLookDistance[8][8] =
INT8 gbLookDistance[8][8];
INT8 BEHIND;
INT8 SBEHIND;
INT8 SIDE;
INT8 ANGLE;
INT8 STRAIGHT;
void InitSightRange()
{
BEHIND = (INT8)( BEHIND_RATIO * gGameExternalOptions.ubStraightSightRange );
SBEHIND = (INT8)( SBEHIND_RATIO * gGameExternalOptions.ubStraightSightRange );
SIDE = (INT8)( SIDE_RATIO * gGameExternalOptions.ubStraightSightRange );
ANGLE = (INT8)( ANGLE_RATIO * gGameExternalOptions.ubStraightSightRange );
STRAIGHT = (INT8)( STRAIGHT_RATIO * gGameExternalOptions.ubStraightSightRange );
// LOOKER DIR LOOKEE DIR
gbLookDistance[8][8] =
// LOOKER DIR LOOKEE DIR
// NORTH | NORTHEAST | EAST | SOUTHEAST | SOUTH | SOUTHWEST | WEST | NORTHWEST
/* NORTH */ STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE,
/* NORTHEAST */ ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE,
/* EAST */ SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND,
/* SOUTHEAST */ SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND,
/* SOUTH */ BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND,
/* SOUTHWEST */ SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE,
/* WEST */ SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE,
/* NORTHWEST */ ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT
;
}
// NORTH | NORTHEAST | EAST | SOUTHEAST | SOUTH | SOUTHWEST | WEST | NORTHWEST
/* NORTH */ STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE,
/* NORTHEAST */ ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE,
/* EAST */ SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND,
/* SOUTHEAST */ SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND, BEHIND,
/* SOUTH */ BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE, SBEHIND,
/* SOUTHWEST */ SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE, SIDE,
/* WEST */ SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT, ANGLE,
/* NORTHWEST */ ANGLE, SIDE, SBEHIND, BEHIND, SBEHIND, SIDE, ANGLE, STRAIGHT,
};
INT8 gbSmellStrength[3] =
{
+2 -2
View File
@@ -64,7 +64,7 @@ UINT8 gubAICounter;
//extern UINT8 gubDeadLockDelay;
//#define DEADLOCK_DELAY 10000 //Madd - let's see what this does -- orig: 15000
#define DEADLOCK_DELAY ( gGameExternalOptions.gubDeadLockDelay * 1000 )
//#define DEADLOCK_DELAY ( gGameExternalOptions.gubDeadLockDelay * 1000 )
// Very representing if this computer is the host, therefore controlling the ai
extern BYTE gfAmIHost;
@@ -474,7 +474,7 @@ void HandleSoldierAI( SOLDIERTYPE *pSoldier )
if (gfTurnBasedAI)
{
if ( ( GetJA2Clock() - gTacticalStatus.uiTimeSinceMercAIStart ) > DEADLOCK_DELAY && !gfUIInDeadlock )
if ( ( GetJA2Clock() - gTacticalStatus.uiTimeSinceMercAIStart ) > ( gGameExternalOptions.gubDeadLockDelay * 1000 ) && !gfUIInDeadlock )
{
// ATE: Display message that deadlock occured...
LiveMessage( "Breaking Deadlock" );
+1 -1
View File
@@ -1602,7 +1602,7 @@ INT32 EstimateShotDamage(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ub
}
// check for ceramic plates; these do affect monster spit
bPlatePos = FindAttachment( &(pOpponent->inv[VESTPOS]), CERAMIC_PLATES );
bPlatePos = FindFirstArmourAttachment( &(pOpponent->inv[VESTPOS]) );
if (bPlatePos != -1)
{
iTorsoProt += (INT32) Armour[Item[pOpponent->inv[VESTPOS].usAttachItem[bPlatePos]].ubClassIndex].ubProtection *
+2
View File
@@ -11,6 +11,8 @@
#include "soldier add.h"
#endif
extern INT8 STRAIGHT; //lal
#define CAN_CALL( s ) (s->ubBodyType != BLOODCAT && s->ubBodyType != LARVAE_MONSTER && s->ubBodyType != INFANT_MONSTER)
#define CAN_LISTEN_TO_CALL( s ) (s->ubBodyType != BLOODCAT && s->ubBodyType != LARVAE_MONSTER)
+96 -82
View File
@@ -70,78 +70,90 @@ extern void AddToShouldBecomeHostileOrSayQuoteList( UINT8 ubID );
extern void RecompileLocalMovementCostsForWall( INT16 sGridNo, UINT8 ubOrientation );
void FatigueCharacter( SOLDIERTYPE *pSoldier );
UINT8 ubTransKeyFrame[ NUM_EXP_TYPES ] =
#define NO_ALT_SOUND -1
EXPLOSION_DATA gExpAniData[ NUM_EXP_TYPES ] =
{
0,
17,
28,
24,
1,
1,
1,
1,
1,
1,
// Trans Damage Explosion Alternative Explosion Animation
// Key Key Sound Explosion Animation Speed
// Frame Frame ID SoundID Filename
{0, 0, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "", 0},
{17, 3, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHE\\ZGRAV_D.STI", 80},
{28, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHE\\ZGRAV_C.STI", 80},
{24, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHE\\ZGRAV_B.STI", 80},
{1, 5, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHE\\shckwave.STI", 20},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHE\\WAT_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHE\\TEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHE\\TEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHE\\MUST_EXP.STI", 80}
};
UINT8 ubDamageKeyFrame[ NUM_EXP_TYPES ] =
{
0,
3,
5,
5,
5,
18,
18,
18,
18,
18,
};
UINT32 uiExplosionSoundID[ NUM_EXP_TYPES ] =
{
EXPLOSION_1,
EXPLOSION_1,
EXPLOSION_BLAST_2, //LARGE
EXPLOSION_BLAST_2,
EXPLOSION_1,
AIR_ESCAPING_1,
AIR_ESCAPING_1,
AIR_ESCAPING_1,
AIR_ESCAPING_1,
325,//TODO: Madd: hard coded for now -- we need to externalize explosion sounds, animations, etc. at some point in the near future
};
CHAR8 zBlastFilenames[][70] =
{
"",
"TILECACHE\\ZGRAV_D.STI",
"TILECACHE\\ZGRAV_C.STI",
"TILECACHE\\ZGRAV_B.STI",
"TILECACHE\\shckwave.STI",
"TILECACHE\\WAT_EXP.STI",
"TILECACHE\\TEAR_EXP.STI",
"TILECACHE\\TEAR_EXP.STI",
"TILECACHE\\MUST_EXP.STI",
"TILECACHE\\FLAM_EXP.STI",
};
CHAR8 sBlastSpeeds[] =
{
0,
80,
80,
80,
20,
80,
80,
80,
80,
80,
80,
};
//UINT8 ubTransKeyFrame[ NUM_EXP_TYPES ] =
//{
// 0,
// 17,
// 28,
// 24,
// 1,
// 1,
// 1,
// 1,
// 1,
//};
//
//UINT8 ubDamageKeyFrame[ NUM_EXP_TYPES ] =
//{
// 0,
// 3,
// 5,
// 5,
// 5,
// 18,
// 18,
// 18,
// 18,
//};
//
//
//UINT32 uiExplosionSoundID[ NUM_EXP_TYPES ] =
//{
// EXPLOSION_1,
// EXPLOSION_1,
// EXPLOSION_BLAST_2, //LARGE
// EXPLOSION_BLAST_2,
// EXPLOSION_1,
// AIR_ESCAPING_1,
// AIR_ESCAPING_1,
// AIR_ESCAPING_1,
// AIR_ESCAPING_1,
//};
//
//
//CHAR8 zBlastFilenames[][70] =
//{
// "",
// "TILECACHE\\ZGRAV_D.STI",
// "TILECACHE\\ZGRAV_C.STI",
// "TILECACHE\\ZGRAV_B.STI",
// "TILECACHE\\shckwave.STI",
// "TILECACHE\\WAT_EXP.STI",
// "TILECACHE\\TEAR_EXP.STI",
// "TILECACHE\\TEAR_EXP.STI",
// "TILECACHE\\MUST_EXP.STI",
//};
//
//CHAR8 sBlastSpeeds[] =
//{
// 0,
// 80,
// 80,
// 80,
// 20,
// 80,
// 80,
// 80,
// 80,
//};
#define BOMB_QUEUE_DELAY (1000 + Random( 500 ) )
@@ -350,7 +362,7 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
AniParams.sGridNo = sGridNo;
AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
AniParams.sDelay = sBlastSpeeds[ ubTypeID ];
AniParams.sDelay = gExpAniData[ ubTypeID ].sBlastSpeed; // Lesh: edit this line
AniParams.sStartFrame = pExplosion->sCurrentFrame;
AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD | ANITILE_EXPLOSION;
@@ -376,12 +388,12 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
//AniParams.uiFlags |= ANITILE_USEABSOLUTEPOS;
}
AniParams.ubKeyFrame1 = ubTransKeyFrame[ ubTypeID ];
AniParams.ubKeyFrame1 = gExpAniData[ ubTypeID ].ubTransKeyFrame; // Lesh: edit this line
AniParams.uiKeyFrame1Code = ANI_KEYFRAME_BEGIN_TRANSLUCENCY;
if ( !( uiFlags & EXPLOSION_FLAG_DISPLAYONLY ) )
{
AniParams.ubKeyFrame2 = ubDamageKeyFrame[ ubTypeID ];
AniParams.ubKeyFrame2 = gExpAniData[ ubTypeID ].ubDamageKeyFrame; // Lesh: edit this line
AniParams.uiKeyFrame2Code = ANI_KEYFRAME_BEGIN_DAMAGE;
}
AniParams.uiUserData = usItem;
@@ -389,7 +401,7 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
AniParams.uiUserData3 = pExplosion->iID;
strcpy( AniParams.zCachedFile, zBlastFilenames[ ubTypeID ] );
strcpy( AniParams.zCachedFile, gExpAniData[ ubTypeID ].zBlastFilename ); // Lesh: edit this line
CreateAnimationTile( &AniParams );
@@ -408,16 +420,18 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
}
}
uiSoundID = uiExplosionSoundID[ ubTypeID ];
// Lesh: sound randomization
uiSoundID = gExpAniData[ ubTypeID ].uiExplosionSoundID;
if ( uiSoundID == EXPLOSION_1 )
{
// Randomize
if ( Random( 2 ) == 0 )
{
uiSoundID = EXPLOSION_ALT_BLAST_1;
}
}
if ( gExpAniData[ ubTypeID ].uiAltExplosionSoundID != NO_ALT_SOUND )
{
// Randomize
if ( Random( 2 ) == 0 )
{
uiSoundID = gExpAniData[ ubTypeID ].uiAltExplosionSoundID;
}
}
// Lesh: sound randomization ends
PlayJA2Sample( uiSoundID, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) );
+18 -1
View File
@@ -56,10 +56,27 @@ enum EXPLOSION_TYPES
SMOKE_EXP,
MUSTARD_EXP,
BURN_EXP,
NUM_EXP_TYPES
NUM_EXP_TYPES=50
} ;
// Lesh: introducing struct instead of linked arrays
#define MAX_BLAST_FILENAME_LEN 70
typedef struct
{
UINT8 ubTransKeyFrame;
UINT8 ubDamageKeyFrame;
UINT32 uiExplosionSoundID;
UINT32 uiAltExplosionSoundID;
CHAR8 zBlastFilename[MAX_BLAST_FILENAME_LEN];
CHAR8 sBlastSpeed;
} EXPLOSION_DATA;
extern EXPLOSION_DATA gExpAniData[NUM_EXP_TYPES];
// Lesh: done here
typedef struct
{
UINT32 uiWorldBombIndex;
+3
View File
@@ -2996,6 +2996,9 @@
BrowseInformation="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\XML_ExplosionData.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
+1 -1
View File
@@ -3471,7 +3471,7 @@ STR16 zOptionsScreenHelpText[] =
// Options for 1.13
L"When ON, the chance to hit is shown on the cursor.",
L"GL Burst uses burst cursor.",
L"Enemy drop all items, when he is dead.",
L"Enemies drop all items on death.",
};
+2
View File
@@ -50,6 +50,7 @@ extern BOOLEAN gfTacticalPlacementGUIActive;
extern BOOLEAN gfTacticalPlacementGUIDirty;
extern BOOLEAN gfValidLocationsChanged;
extern BOOLEAN gfInMsgBox;
extern void InitSightRange(); //lal
// callback to confirm game is over
@@ -96,6 +97,7 @@ BOOLEAN InitializeGame(void)
// Snap: Read options from an INI file in the default of custom Data directory
// Moved this up because some settings are used during other inits
LoadGameExternalOptions();
InitSightRange(); //lal
// Initlaize mouse subsystems
MSYS_Init( );