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
+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] =
{