mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
New ammotype: cryo ammo deals no damage, but freezes a soldier for two turns (stackable effect). A frozen soldier cannot perform actions, and has drastically lowered damage resistance. For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=22926&start=0&
Requires GameDir >= r2284. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8034 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -1641,31 +1641,14 @@ BOOLEAN DamageSoldierFromBlast( UINT8 ubPerson, UINT8 ubOwner, INT32 sBombGridNo
|
||||
sNewWoundAmt = (INT16)(sNewWoundAmt * (100 - (gSkillTraitValues.bTanksDamageResistanceModifier / 2)) / 100);
|
||||
}
|
||||
|
||||
// Bodybuilding damage resistance
|
||||
if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, BODYBUILDING_NT ) )
|
||||
sNewWoundAmt = max( 1, (INT16)(sNewWoundAmt * (100 - gSkillTraitValues.ubBBDamageResistance) / 100));
|
||||
|
||||
// Flugente: moved the damage calculation into a separate function
|
||||
#ifdef ENABLE_ZOMBIES
|
||||
if ( pSoldier->GetDamageResistance(FALSE, FALSE) > 0 )
|
||||
sNewWoundAmt -= ((sNewWoundAmt * pSoldier->GetDamageResistance(FALSE, FALSE)) /100);
|
||||
#else
|
||||
// Damage resistance for Militia
|
||||
if (pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA && gGameExternalOptions.bGreenMilitiaDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.bGreenMilitiaDamageResistance) /100);
|
||||
else if (pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA && gGameExternalOptions.bRegularMilitiaDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.bRegularMilitiaDamageResistance) /100);
|
||||
else if (pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA && gGameExternalOptions.bVeteranMilitiaDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.bVeteranMilitiaDamageResistance) /100);
|
||||
// bonus for enemy too
|
||||
else if (pSoldier->ubSoldierClass == SOLDIER_CLASS_ADMINISTRATOR && gGameExternalOptions.sEnemyAdminDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.sEnemyAdminDamageResistance) /100);
|
||||
else if (pSoldier->ubSoldierClass == SOLDIER_CLASS_ARMY && gGameExternalOptions.sEnemyRegularDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.sEnemyRegularDamageResistance) /100);
|
||||
else if (pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE && gGameExternalOptions.sEnemyEliteDamageResistance != 0)
|
||||
sNewWoundAmt -= ((sNewWoundAmt * gGameExternalOptions.sEnemyEliteDamageResistance) /100);
|
||||
#endif
|
||||
INT32 sDamageResistance = pSoldier->GetDamageResistance( FALSE, FALSE );
|
||||
|
||||
sNewWoundAmt = max( 0, (INT16)(sNewWoundAmt * (100 - sDamageResistance) / 100) );
|
||||
|
||||
// Flugente: this seems a bit weird, but is consistent with the previous code - we do not receive stat damage if we have positive damage resistance
|
||||
if ( sDamageResistance > 0 )
|
||||
;
|
||||
// we can loose stats due to being hit by the blast
|
||||
else if ( gGameOptions.fNewTraitSystem && Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_NORMAL &&
|
||||
!AM_A_ROBOT( pSoldier ) && !(pSoldier->flags.uiStatusFlags & SOLDIER_MONSTER) && !TANK(pSoldier) &&
|
||||
@@ -2159,6 +2142,19 @@ BOOLEAN DishOutGasDamage( SOLDIERTYPE * pSoldier, EXPLOSIVETYPE * pExplosive, IN
|
||||
|
||||
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"ExpControl pSoldier->flags.fHitByGasFlags: %d", pSoldier->flags.fHitByGasFlags );
|
||||
|
||||
// Flugente: if we're frozen, we take no gas damage at all (because I say so)
|
||||
if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] )
|
||||
{
|
||||
sWoundAmt = 0;
|
||||
sBreathAmt = 0;
|
||||
|
||||
// fire makes us thaw faster
|
||||
if ( pExplosive->ubType == EXPLOSV_BURNABLEGAS )
|
||||
{
|
||||
pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO]--;
|
||||
}
|
||||
}
|
||||
|
||||
// a gas effect, take damage directly...
|
||||
pSoldier->SoldierTakeDamage( ANIM_STAND, sWoundAmt, sBreathAmt, TAKE_DAMAGE_GAS, NOBODY, NOWHERE, 0, TRUE );
|
||||
|
||||
|
||||
+28
-18
@@ -1596,15 +1596,15 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT
|
||||
if ( pSoldier->flags.uiStatusFlags & SOLDIER_MULTITILE_Z )
|
||||
{
|
||||
fMultiTransShadowZBlitter = TRUE;
|
||||
// ATE: Use one direction for queen!
|
||||
if ( pSoldier->ubBodyType == QUEENMONSTER )
|
||||
{
|
||||
sMultiTransShadowZBlitterIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->ubDirection ];
|
||||
}
|
||||
// ATE: Use one direction for queen!
|
||||
if ( pSoldier->ubBodyType == QUEENMONSTER )
|
||||
{
|
||||
sMultiTransShadowZBlitterIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->ubDirection ];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1647,7 +1647,7 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT
|
||||
ubShadeLevel = (pNode->ubShadeLevel&0x0f);
|
||||
ubShadeLevel=__max(ubShadeLevel-2, DEFAULT_SHADE_LEVEL);
|
||||
ubShadeLevel|=(pNode->ubShadeLevel&0x30);
|
||||
|
||||
|
||||
if ( pSoldier->flags.fBeginFade )
|
||||
{
|
||||
pShadeTable = pSoldier->pCurrentShade = pSoldier->pShades[ pSoldier->ubFadeLevel ];
|
||||
@@ -1708,17 +1708,17 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT
|
||||
{
|
||||
if ( pSelSoldier->aiData.bOppList[ pSoldier->ubID ] != SEEN_CURRENTLY )
|
||||
{
|
||||
if ( pSoldier->usAnimState != CHARIOTS_OF_FIRE && pSoldier->usAnimState != BODYEXPLODING )
|
||||
{
|
||||
bGlowShadeOffset = 10;
|
||||
}
|
||||
if ( pSoldier->usAnimState != CHARIOTS_OF_FIRE && pSoldier->usAnimState != BODYEXPLODING )
|
||||
{
|
||||
bGlowShadeOffset = 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( pSoldier->pathing.bLevel == 0 )
|
||||
{
|
||||
pShadeStart = (INT16 **) &( pSoldier->pGlowShades[ 0 ] );
|
||||
pShadeStart = (INT16 **)&(pSoldier->pGlowShades[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1804,6 +1804,12 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT
|
||||
pShadeTable = pSoldier->pEffectShades[ 1 ];
|
||||
}
|
||||
|
||||
// Flugente: frozen soldiers appear to be in ice, which we simulate by having the soldier be fully white
|
||||
if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] )
|
||||
{
|
||||
pShadeTable = White16BPPPalette;
|
||||
}
|
||||
|
||||
hVObject=gAnimSurfaceDatabase[ usAnimSurface ].hVideoObject;
|
||||
|
||||
if ( hVObject == NULL )
|
||||
@@ -1822,13 +1828,17 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT
|
||||
// ATE: Artificially increase z=level...
|
||||
sZLevel += 2;
|
||||
}
|
||||
|
||||
usImageIndex = pSoldier->usAniFrame;
|
||||
|
||||
|
||||
usImageIndex=pSoldier->usAniFrame;
|
||||
// Flugente: frozen soldiers don't move
|
||||
if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] && pSoldier->stats.bLife > 0 )
|
||||
{
|
||||
usImageIndex = 0;
|
||||
}
|
||||
|
||||
uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED| BGND_FLAG_MERC;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// Adjust for interface level
|
||||
|
||||
Reference in New Issue
Block a user