From ca45e66f44abbcbedf2b12a04550b28c67b40c3d Mon Sep 17 00:00:00 2001 From: lalien Date: Thu, 18 May 2006 14:58:18 +0000 Subject: [PATCH] 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 --- Init.cpp | 5 + JA2.vcproj | 5 +- Standard Gaming Platform/Container.cpp | 1 - Standard Gaming Platform/Types.h | 2 +- Strategic/Strategic AI.cpp | 4 +- Strategic/Strategic Town Loyalty.cpp | 4 +- Tactical/Interface Items.cpp | 2 +- Tactical/Inventory Choosing.cpp | 15 ++- Tactical/Items.cpp | 30 ++++- Tactical/Items.h | 3 + Tactical/Overhead Types.h | 12 +- Tactical/TeamTurns.cpp | 1 + Tactical/Turn Based Input.cpp | 85 ++++++------ Tactical/Weapons.cpp | 13 +- Tactical/XML.h | 6 + Tactical/opplist.cpp | 49 ++++--- TacticalAI/AIMain.cpp | 4 +- TacticalAI/Attacks.cpp | 2 +- TacticalAI/CreatureDecideAction.cpp | 2 + TileEngine/Explosion Control.cpp | 178 +++++++++++++------------ TileEngine/Explosion Control.h | 19 ++- TileEngine/TileEngine.vcproj | 3 + Utils/_EnglishText.cpp | 2 +- gameloop.cpp | 2 + 24 files changed, 273 insertions(+), 176 deletions(-) diff --git a/Init.cpp b/Init.cpp index f5aa60d3..51a3bc43 100644 --- a/Init.cpp +++ b/Init.cpp @@ -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; } diff --git a/JA2.vcproj b/JA2.vcproj index d9e3cf88..96e2197d 100644 --- a/JA2.vcproj +++ b/JA2.vcproj @@ -3,6 +3,7 @@ ProjectType="Visual C++" Version="7.10" Name="ja2" + RootNamespace="ja2" SccProjectName="" SccAuxPath="" SccLocalPath="" @@ -42,7 +43,7 @@ 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; } diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index 798f5af2..a8c0794c 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -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) diff --git a/Tactical/Inventory Choosing.cpp b/Tactical/Inventory Choosing.cpp index 1e6bddf1..e0ab091e 100644 --- a/Tactical/Inventory Choosing.cpp +++ b/Tactical/Inventory Choosing.cpp @@ -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 ); + } + } + } diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index d47d30e8..5ffcb011 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -7068,4 +7068,32 @@ UINT16 GetFirstExplosiveOfType(UINT16 expType) } return 0; -} \ No newline at end of file +} + +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 ); +} diff --git a/Tactical/Items.h b/Tactical/Items.h index 862ec697..c3d6adcc 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -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 diff --git a/Tactical/Overhead Types.h b/Tactical/Overhead Types.h index 71227e4a..4f18a143 100644 --- a/Tactical/Overhead Types.h +++ b/Tactical/Overhead Types.h @@ -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 diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp index cd483994..a2af069a 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -46,6 +46,7 @@ #include "Reinforcement.h" +extern INT8 STRAIGHT; //extern UINT8 gubSpeedUpAnimationFactor; void SetSoldierAniSpeed( SOLDIERTYPE *pSoldier ); diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 1a37e044..181ee076 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -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++ ) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index cff36c4a..1764bb16 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -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 ) diff --git a/Tactical/XML.h b/Tactical/XML.h index f168a32f..d9198ede 100644 --- a/Tactical/XML.h +++ b/Tactical/XML.h @@ -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 \ No newline at end of file diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index 5ae2d064..990ee8c9 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -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] = { diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index 7b30b874..d0c07a2a 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -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" ); diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index 24f3b4dc..0fe28eea 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -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 * diff --git a/TacticalAI/CreatureDecideAction.cpp b/TacticalAI/CreatureDecideAction.cpp index 9025a23e..7d88f5da 100644 --- a/TacticalAI/CreatureDecideAction.cpp +++ b/TacticalAI/CreatureDecideAction.cpp @@ -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) diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index 6df79193..5a412957 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -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 ) ); diff --git a/TileEngine/Explosion Control.h b/TileEngine/Explosion Control.h index 1f914601..45c13432 100644 --- a/TileEngine/Explosion Control.h +++ b/TileEngine/Explosion Control.h @@ -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; diff --git a/TileEngine/TileEngine.vcproj b/TileEngine/TileEngine.vcproj index 3bf84e5a..3b7017a7 100644 --- a/TileEngine/TileEngine.vcproj +++ b/TileEngine/TileEngine.vcproj @@ -2996,6 +2996,9 @@ BrowseInformation="1"/> + +