mirror of
https://github.com/1dot13/source.git
synced 2026-09-16 14:47:17 +02:00
- new feature: manual reload
- update readme git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@177 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
+1
-1
@@ -23,7 +23,7 @@ INT16 zVersionLabel[256] = { L"Beta v. 0.98" };
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
//RELEASE BUILD VERSION
|
//RELEASE BUILD VERSION
|
||||||
INT16 zVersionLabel[256] = { L"Release v1.13.174" };
|
INT16 zVersionLabel[256] = { L"Release v1.13.177" };
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-2
@@ -43,7 +43,7 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="libexpatMT.lib mss32.lib winmm.lib smackw32.lib fmodvc.lib"
|
AdditionalDependencies="libexpatMT.lib mss32.lib winmm.lib smackw32.lib fmodvc.lib"
|
||||||
OutputFile="C:\games\Jagged Alliance 2 v1.13\ja2_debug_v1.13.175_2006_06_05.exe"
|
OutputFile="C:\games\Jagged Alliance 2 v1.13\ja2_debug_v1.13.177_2006_06_06.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
|
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
|
||||||
@@ -546,7 +546,7 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="libexpatMT.lib winmm.lib smackw32.lib mss32.lib fmodvc.lib"
|
AdditionalDependencies="libexpatMT.lib winmm.lib smackw32.lib mss32.lib fmodvc.lib"
|
||||||
OutputFile="C:\Games\Jagged Alliance 2 v1.13\ja2_release_v1.13.175_2006_06_05.exe"
|
OutputFile="C:\Games\Jagged Alliance 2 v1.13\ja2_release_v1.13.177_2006_06_06.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
|
AdditionalLibraryDirectories=".\..\..\Standard Gaming Platform\"
|
||||||
|
|||||||
@@ -59,14 +59,16 @@ typedef enum
|
|||||||
#define PANIC_FREQUENCY_3 125
|
#define PANIC_FREQUENCY_3 125
|
||||||
|
|
||||||
#define OBJECT_UNDROPPABLE 0x01
|
#define OBJECT_UNDROPPABLE 0x01
|
||||||
#define OBJECT_MODIFIED 0x02
|
#define OBJECT_MODIFIED 0x02
|
||||||
#define OBJECT_AI_UNUSABLE 0x04
|
#define OBJECT_AI_UNUSABLE 0x04
|
||||||
#define OBJECT_ARMED_BOMB 0x08
|
#define OBJECT_ARMED_BOMB 0x08
|
||||||
#define OBJECT_KNOWN_TO_BE_TRAPPED 0x10
|
#define OBJECT_KNOWN_TO_BE_TRAPPED 0x10
|
||||||
#define OBJECT_DISABLED_BOMB 0x20
|
#define OBJECT_DISABLED_BOMB 0x20
|
||||||
#define OBJECT_ALARM_TRIGGER 0x40
|
#define OBJECT_ALARM_TRIGGER 0x40
|
||||||
#define OBJECT_NO_OVERWRITE 0x80
|
#define OBJECT_NO_OVERWRITE 0x80
|
||||||
|
|
||||||
|
#define GS_CARTRIDGE_IN_CHAMBER 0x01
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT16 usItem;
|
UINT16 usItem;
|
||||||
@@ -78,8 +80,9 @@ typedef struct
|
|||||||
INT8 bGunStatus; // status % of gun
|
INT8 bGunStatus; // status % of gun
|
||||||
UINT8 ubGunAmmoType; // ammo type, as per weapons.h
|
UINT8 ubGunAmmoType; // ammo type, as per weapons.h
|
||||||
UINT8 ubGunShotsLeft; // duh, amount of ammo left
|
UINT8 ubGunShotsLeft; // duh, amount of ammo left
|
||||||
UINT16 usGunAmmoItem; // the item # for the item table
|
UINT16 usGunAmmoItem; // the item # for the item table
|
||||||
INT8 bGunAmmoStatus; // only for "attached ammo" - grenades, mortar shells
|
INT8 bGunAmmoStatus; // only for "attached ammo" - grenades, mortar shells
|
||||||
|
UINT8 ubGunState; // SB manual recharge
|
||||||
UINT8 ubGunUnused[MAX_OBJECTS_PER_SLOT - 6];
|
UINT8 ubGunUnused[MAX_OBJECTS_PER_SLOT - 6];
|
||||||
};
|
};
|
||||||
struct
|
struct
|
||||||
|
|||||||
+22
-1
@@ -1169,7 +1169,6 @@ UINT16 ReplacementAmmo[][2] =
|
|||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN ItemIsLegal( UINT16 usItemIndex )
|
BOOLEAN ItemIsLegal( UINT16 usItemIndex )
|
||||||
{
|
{
|
||||||
//if the user has selected the reduced gun list
|
//if the user has selected the reduced gun list
|
||||||
@@ -2733,6 +2732,8 @@ BOOLEAN ReloadGun( SOLDIERTYPE * pSoldier, OBJECTTYPE * pGun, OBJECTTYPE * pAmmo
|
|||||||
pGun->bGunAmmoStatus = 100;
|
pGun->bGunAmmoStatus = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pGun->ubGunState |= GS_CARTRIDGE_IN_CHAMBER; // Madd: reloading should automatically put cartridge in chamber
|
||||||
|
|
||||||
return( TRUE );
|
return( TRUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2854,6 +2855,12 @@ INT8 FindAmmoToReload( SOLDIERTYPE * pSoldier, INT8 bWeaponIn, INT8 bExcludeSlot
|
|||||||
return( NO_SLOT );
|
return( NO_SLOT );
|
||||||
}
|
}
|
||||||
pObj = &(pSoldier->inv[bWeaponIn]);
|
pObj = &(pSoldier->inv[bWeaponIn]);
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
if (pObj->ubGunShotsLeft && !(pObj->ubGunState & GS_CARTRIDGE_IN_CHAMBER) )
|
||||||
|
return bWeaponIn;
|
||||||
|
//</SB>
|
||||||
|
|
||||||
if ( Item[pObj->usItem].usItemClass == IC_GUN && !Item[pObj->usItem].cannon )
|
if ( Item[pObj->usItem].usItemClass == IC_GUN && !Item[pObj->usItem].cannon )
|
||||||
{
|
{
|
||||||
// look for same ammo as before
|
// look for same ammo as before
|
||||||
@@ -2918,6 +2925,19 @@ BOOLEAN AutoReload( SOLDIERTYPE * pSoldier )
|
|||||||
CHECKF( pSoldier );
|
CHECKF( pSoldier );
|
||||||
pObj = &(pSoldier->inv[HANDPOS]);
|
pObj = &(pSoldier->inv[HANDPOS]);
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
if (pObj->ubGunShotsLeft && !(pObj->ubGunState & GS_CARTRIDGE_IN_CHAMBER) )
|
||||||
|
{
|
||||||
|
pObj->ubGunState |= GS_CARTRIDGE_IN_CHAMBER;
|
||||||
|
|
||||||
|
DeductPoints(pSoldier, Weapon[Item[(pObj)->usItem].ubClassIndex].APsToReloadManually, 0);
|
||||||
|
|
||||||
|
PlayJA2Sample( Weapon[ Item[pObj->usItem].ubClassIndex ].ManualReloadSound, RATE_11025, SoundVolume( HIGHVOLUME, pSoldier->sGridNo ), 1, SoundDir( pSoldier->sGridNo ) );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
//</SB>
|
||||||
|
|
||||||
if (Item[pObj->usItem].usItemClass == IC_GUN || Item[pObj->usItem].usItemClass == IC_LAUNCHER)
|
if (Item[pObj->usItem].usItemClass == IC_GUN || Item[pObj->usItem].usItemClass == IC_LAUNCHER)
|
||||||
{
|
{
|
||||||
bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT );
|
bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT );
|
||||||
@@ -4646,6 +4666,7 @@ BOOLEAN CreateGun( UINT16 usItem, INT8 bStatus, OBJECTTYPE * pObj )
|
|||||||
pObj->ubGunAmmoType = Magazine[ Item[ usAmmo ].ubClassIndex].ubAmmoType;
|
pObj->ubGunAmmoType = Magazine[ Item[ usAmmo ].ubClassIndex].ubAmmoType;
|
||||||
pObj->bGunAmmoStatus = 100;
|
pObj->bGunAmmoStatus = 100;
|
||||||
pObj->ubGunShotsLeft = Magazine[ Item[ usAmmo ].ubClassIndex ].ubMagSize;
|
pObj->ubGunShotsLeft = Magazine[ Item[ usAmmo ].ubClassIndex ].ubMagSize;
|
||||||
|
pObj->ubGunState |= GS_CARTRIDGE_IN_CHAMBER; // Madd: new guns should have cartridge in chamber
|
||||||
/*
|
/*
|
||||||
if (usItem == CAWS)
|
if (usItem == CAWS)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1583,6 +1583,16 @@ BOOLEAN EnoughAmmo( SOLDIERTYPE *pSoldier, BOOLEAN fDisplay, INT8 bInvPos )
|
|||||||
}
|
}
|
||||||
return( FALSE );
|
return( FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
if( pSoldier->bTeam == OUR_TEAM )
|
||||||
|
{
|
||||||
|
if ( !( pSoldier->inv[ bInvPos ].ubGunState & GS_CARTRIDGE_IN_CHAMBER ) )
|
||||||
|
{
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//</SB>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1756,6 +1766,13 @@ INT8 GetAPsToAutoReload( SOLDIERTYPE * pSoldier )
|
|||||||
CHECKF( pSoldier );
|
CHECKF( pSoldier );
|
||||||
pObj = &(pSoldier->inv[HANDPOS]);
|
pObj = &(pSoldier->inv[HANDPOS]);
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
if (pObj->ubGunShotsLeft && !(pObj->ubGunState & GS_CARTRIDGE_IN_CHAMBER) )
|
||||||
|
{
|
||||||
|
return Weapon[Item[(pObj)->usItem].ubClassIndex].APsToReloadManually;
|
||||||
|
}
|
||||||
|
//</SB>
|
||||||
|
|
||||||
if (Item[pObj->usItem].usItemClass == IC_GUN || Item[pObj->usItem].usItemClass == IC_LAUNCHER)
|
if (Item[pObj->usItem].usItemClass == IC_GUN || Item[pObj->usItem].usItemClass == IC_LAUNCHER)
|
||||||
{
|
{
|
||||||
bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT );
|
bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT );
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#ifndef __POINTS_H_
|
#ifndef __POINTS_H_
|
||||||
#define __POINTS_H_
|
#define __POINTS_H_
|
||||||
|
|
||||||
|
|
||||||
#define AP_MINIMUM 10 // no merc can have less for his turn
|
#define AP_MINIMUM 10 // no merc can have less for his turn
|
||||||
#define AP_MAXIMUM 25 // no merc can have more for his turn
|
#define AP_MAXIMUM 25 // no merc can have more for his turn
|
||||||
#define AP_MONSTER_MAXIMUM 40 // no monster can have more for his turn
|
#define AP_MONSTER_MAXIMUM 40 // no monster can have more for his turn
|
||||||
|
|||||||
+22
-5
@@ -394,8 +394,10 @@ weaponStartElementHandle(void *userData, const char *name, const char **atts)
|
|||||||
strcmp(name, "NoSemiAuto") == 0 ||
|
strcmp(name, "NoSemiAuto") == 0 ||
|
||||||
strcmp(name, "MaxDistForMessyDeath") == 0 ||
|
strcmp(name, "MaxDistForMessyDeath") == 0 ||
|
||||||
strcmp(name, "SilencedSound") == 0 || // Lesh: add new field (OR operand)
|
strcmp(name, "SilencedSound") == 0 || // Lesh: add new field (OR operand)
|
||||||
strcmp(name, "BurstAniDelay") == 0)) // Lesh: add new field (field itself)
|
strcmp(name, "BurstAniDelay") == 0 || // Lesh: add new field (field itself)
|
||||||
|
strcmp(name, "APsToReloadManually") == 0 ||
|
||||||
|
strcmp(name, "ManualReloadSound") == 0)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
pData->curElement = WEAPON_ELEMENT_WEAPON_PROPERY;
|
pData->curElement = WEAPON_ELEMENT_WEAPON_PROPERY;
|
||||||
|
|
||||||
@@ -611,6 +613,16 @@ weaponEndElementHandle(void *userData, const char *name)
|
|||||||
pData->curWeapon.sAniDelay = (INT16) atol(pData->szCharData);
|
pData->curWeapon.sAniDelay = (INT16) atol(pData->szCharData);
|
||||||
}
|
}
|
||||||
// Lesh: end
|
// Lesh: end
|
||||||
|
else if(strcmp(name, "APsToReloadManually") == 0)
|
||||||
|
{
|
||||||
|
pData->curElement = WEAPON_ELEMENT_WEAPON;
|
||||||
|
pData->curWeapon.APsToReloadManually = (UINT8) atol(pData->szCharData);
|
||||||
|
}
|
||||||
|
else if(strcmp(name, "ManualReloadSound") == 0)
|
||||||
|
{
|
||||||
|
pData->curElement = WEAPON_ELEMENT_WEAPON;
|
||||||
|
pData->curWeapon.ManualReloadSound = (UINT16) atol(pData->szCharData);
|
||||||
|
}
|
||||||
|
|
||||||
pData->maxReadDepth--;
|
pData->maxReadDepth--;
|
||||||
}
|
}
|
||||||
@@ -758,11 +770,13 @@ BOOLEAN ReadInWeaponStats(STR fileName)
|
|||||||
FilePrintf(hFile,"\t\t<ubHitVolume>%d</ubHitVolume>\r\n", Weapon[cnt].ubHitVolume);
|
FilePrintf(hFile,"\t\t<ubHitVolume>%d</ubHitVolume>\r\n", Weapon[cnt].ubHitVolume);
|
||||||
FilePrintf(hFile,"\t\t<sSound>%d</sSound>\r\n", Weapon[cnt].sSound);
|
FilePrintf(hFile,"\t\t<sSound>%d</sSound>\r\n", Weapon[cnt].sSound);
|
||||||
FilePrintf(hFile,"\t\t<sBurstSound>%d</sBurstSound>\r\n", Weapon[cnt].sBurstSound);
|
FilePrintf(hFile,"\t\t<sBurstSound>%d</sBurstSound>\r\n", Weapon[cnt].sBurstSound);
|
||||||
FilePrintf(hFile,"\t\t<sSilencedBurstSound>%d</sSilencedBurstSound>\r\n", Weapon[cnt].sSilencedBurstSound);
|
FilePrintf(hFile,"\t\t<sSilencedBurstSound>%d</sSilencedBurstSound>\r\n", Weapon[cnt].sSilencedBurstSound);
|
||||||
FilePrintf(hFile,"\t\t<sReloadSound>%d</sReloadSound>\r\n", Weapon[cnt].sReloadSound);
|
FilePrintf(hFile,"\t\t<sReloadSound>%d</sReloadSound>\r\n", Weapon[cnt].sReloadSound);
|
||||||
FilePrintf(hFile,"\t\t<sLocknLoadSound>%d</sLocknLoadSound>\r\n", Weapon[cnt].sLocknLoadSound);
|
FilePrintf(hFile,"\t\t<sLocknLoadSound>%d</sLocknLoadSound>\r\n", Weapon[cnt].sLocknLoadSound);
|
||||||
FilePrintf(hFile,"\t\t<bBurstAP>%d</bBurstAP>\r\n", Weapon[cnt].bBurstAP);
|
FilePrintf(hFile,"\t\t<bBurstAP>%d</bBurstAP>\r\n", Weapon[cnt].bBurstAP);
|
||||||
FilePrintf(hFile,"\t\t<bAutofireShotsPerFiveAP>%d</bAutofireShotsPerFiveAP>\r\n", Weapon[cnt].bAutofireShotsPerFiveAP);
|
FilePrintf(hFile,"\t\t<bAutofireShotsPerFiveAP>%d</bAutofireShotsPerFiveAP>\r\n", Weapon[cnt].bAutofireShotsPerFiveAP);
|
||||||
|
FilePrintf(hFile,"\t\t<APsToReloadManually>%d</APsToReloadManually>\r\n", Weapon[cnt].ManualReloadAPs);
|
||||||
|
FilePrintf(hFile,"\t\t<ManualReloadSound>%d</ManualReloadSound>\r\n", Weapon[cnt].ManualReloadSound);
|
||||||
FilePrintf(hFile,"\t</WEAPON>\r\n");
|
FilePrintf(hFile,"\t</WEAPON>\r\n");
|
||||||
}
|
}
|
||||||
FilePrintf(hFile,"</WEAPONLIST>\r\n");
|
FilePrintf(hFile,"</WEAPONLIST>\r\n");
|
||||||
@@ -1914,7 +1928,10 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT16 sTargetGridNo )
|
|||||||
pSoldier->bMonsterSmell--;
|
pSoldier->bMonsterSmell--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
if (Weapon[Item[usItemNum].ubClassIndex].APsToReloadManually > 0)
|
||||||
|
pSoldier->inv[ pSoldier->ubAttackingHand ].ubGunState &= ~GS_CARTRIDGE_IN_CHAMBER;
|
||||||
|
//<SB>
|
||||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("UseGun: done"));
|
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("UseGun: done"));
|
||||||
return( TRUE );
|
return( TRUE );
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -266,8 +266,10 @@ typedef struct
|
|||||||
UINT8 APsToReload;
|
UINT8 APsToReload;
|
||||||
UINT8 maxdistformessydeath;
|
UINT8 maxdistformessydeath;
|
||||||
BOOLEAN NoSemiAuto;
|
BOOLEAN NoSemiAuto;
|
||||||
UINT8 AutoPenalty;
|
UINT8 AutoPenalty;
|
||||||
INT16 sAniDelay; // Lesh: for burst animation delay
|
INT16 sAniDelay; // Lesh: for burst animation delay
|
||||||
|
UINT8 APsToReloadManually;
|
||||||
|
UINT16 ManualReloadSound;
|
||||||
|
|
||||||
} WEAPONTYPE;
|
} WEAPONTYPE;
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|||||||
+29
-7
@@ -1852,18 +1852,40 @@ INT32 EstimateStabDamage( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent,
|
|||||||
|
|
||||||
INT8 TryToReload( SOLDIERTYPE * pSoldier )
|
INT8 TryToReload( SOLDIERTYPE * pSoldier )
|
||||||
{
|
{
|
||||||
INT8 bSlot;
|
INT8 bSlot;
|
||||||
WEAPONTYPE * pWeapon;
|
WEAPONTYPE *pWeapon;
|
||||||
|
OBJECTTYPE *pObj;
|
||||||
|
|
||||||
pWeapon = &(Weapon[pSoldier->inv[HANDPOS].usItem]);
|
pWeapon = &(Weapon[pSoldier->inv[HANDPOS].usItem]);
|
||||||
bSlot = FindAmmo( pSoldier, pWeapon->ubCalibre, pWeapon->ubMagSize, NO_SLOT );
|
bSlot = FindAmmo( pSoldier, pWeapon->ubCalibre, pWeapon->ubMagSize, NO_SLOT );
|
||||||
if (bSlot != NO_SLOT)
|
|
||||||
|
//if (bSlot != NO_SLOT)
|
||||||
|
//{
|
||||||
|
// if (ReloadGun( pSoldier, &(pSoldier->inv[HANDPOS]), &(pSoldier->inv[bSlot]) ))
|
||||||
|
// {
|
||||||
|
// return( TRUE );
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//<SB> manual recharge
|
||||||
|
pObj = &(pSoldier->inv[HANDPOS]);
|
||||||
|
|
||||||
|
if (pObj->ubGunShotsLeft && !(pObj->ubGunState & GS_CARTRIDGE_IN_CHAMBER) )
|
||||||
{
|
{
|
||||||
if (ReloadGun( pSoldier, &(pSoldier->inv[HANDPOS]), &(pSoldier->inv[bSlot]) ))
|
pObj->ubGunState |= GS_CARTRIDGE_IN_CHAMBER;
|
||||||
{
|
|
||||||
return( TRUE );
|
DeductPoints(pSoldier, Weapon[Item[(pObj)->usItem].ubClassIndex].APsToReloadManually, 0);
|
||||||
}
|
|
||||||
|
//PlayJA2Sample( Weapon[ Item[pObj->usItem].ubClassIndex ].ManualReloadSound, RATE_11025, SoundVolume( HIGHVOLUME, pSoldier->sGridNo ), 1, SoundDir( pSoldier->sGridNo ) );
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
//</SB>
|
||||||
|
|
||||||
|
if (bSlot != NO_SLOT && ReloadGun( pSoldier, &(pSoldier->inv[HANDPOS]), &(pSoldier->inv[bSlot]) ))
|
||||||
|
{
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
return( NOSHOOT_NOAMMO );
|
return( NOSHOOT_NOAMMO );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user