From 811f18009fa2ab9b6935fc4008b85947ffbdb1b5 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sun, 24 Jan 2016 22:54:13 +0000 Subject: [PATCH] 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 --- GameVersion.cpp | 18 ++--- Tactical/Animation Control.cpp | 134 +++++++++++++++++++++++++------ Tactical/Animation Control.h | 5 +- Tactical/Animation Data.cpp | 4 +- Tactical/Animation Data.h | 5 +- Tactical/Dialogue Control.cpp | 32 +++++--- Tactical/Faces.cpp | 98 ++++++++++++---------- Tactical/Interface Panels.cpp | 7 ++ Tactical/Rotting Corpses.cpp | 5 +- Tactical/Rotting Corpses.h | 1 + Tactical/Soldier Ani.cpp | 13 ++- Tactical/Soldier Control.cpp | 44 +++++++--- Tactical/Soldier Control.h | 1 + Tactical/Soldier Find.cpp | 63 ++++++++------- Tactical/Soldier macros.h | 12 +-- Tactical/Weapons.cpp | 8 ++ Tactical/Weapons.h | 2 +- TacticalAI/AIMain.cpp | 3 +- TacticalAI/Realtime.cpp | 2 +- TileEngine/Explosion Control.cpp | 42 +++++----- TileEngine/renderworld.cpp | 46 ++++++----- 21 files changed, 360 insertions(+), 185 deletions(-) diff --git a/GameVersion.cpp b/GameVersion.cpp index 1fc9b45e..f66eb249 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -15,9 +15,9 @@ #ifdef JA2EDITOR #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.8034 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.8034 (Development Build)" }; #endif // ------------------------------ @@ -27,11 +27,11 @@ //DEBUG BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.8034 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.8034 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Debug: v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: v1.13.8034 (Development Build)" }; #endif #elif defined CRIPPLED_VERSION @@ -46,16 +46,16 @@ //RELEASE BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.8034 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.8034 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Release v1.13.8013 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release v1.13.8034 (Development Build)" }; #endif #endif -CHAR8 czVersionNumber[16] = { "Build 16.01.09" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 16.01.24" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Tactical/Animation Control.cpp b/Tactical/Animation Control.cpp index 2fc69451..b55c7b65 100644 --- a/Tactical/Animation Control.cpp +++ b/Tactical/Animation Control.cpp @@ -97,6 +97,9 @@ static UINT16 FOCUSED_HTH_KICK_AnimationScript[MAX_FRAMES_PER_ANIM] = { 757,1,1, //static UINT16 LONG_JUMP_AnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,703,4,5,6,6,7,8,9,10,11,704,12,13,14,501,999,0,0,0,0 }; static UINT16 LONG_JUMP_AnimationScript[MAX_FRAMES_PER_ANIM] = { 2,703,3,4,5,6,6,7,7,8,704,9,501,999,0,0,0,0 }; +static UINT16 CRYO_DEATH_AnimationScript[MAX_FRAMES_PER_ANIM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 465, 440, 497, 442, 0, 0, 0, 0}; +static UINT16 CRYO_DEATH_CROUCHED_AnimationScript[MAX_FRAMES_PER_ANIM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 465, 440, 497, 442, 0, 0, 0, 0}; + ANI_SPEED_DEF gubAnimCrawlSpeeds[ TOTALBODYTYPES ]; //Block for anim file UINT16 gusAnimInst[ MAX_ANIMATIONS ][ MAX_FRAMES_PER_ANIM ]; @@ -871,7 +874,7 @@ ANIMCONTROLTYPE gAnimControl[ NUMANIMATIONSTATES ] = //SOLDIER BRUN "FIRE FIRE" , 0, 150, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_FASTTURN | ANIM_NORESTART | ANIM_NONINTERRUPT | ANIM_NOCHANGE_WEAPON | ANIM_LIGHT_EFFORT | ANIM_IGNORE_AUTOSTANCE | ANIM_ATTACK, ANIM_STAND, ANIM_STAND, -1, - + //AI TRIGGER "AI TRIGGER" , 0, 70, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_FASTTURN | ANIM_NORESTART | ANIM_LOWER_WEAPON | ANIM_LIGHT_EFFORT, ANIM_STAND, ANIM_STAND, -1, @@ -1075,7 +1078,12 @@ ANIMCONTROLTYPE gAnimControl[ NUMANIMATIONSTATES ] = {"FOCUSED HTH KICK" , 0, 40, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_NONINTERRUPT | ANIM_MODERATE_EFFORT | ANIM_NOCHANGE_WEAPON | ANIM_NORESTART | ANIM_ATTACK, ANIM_STAND, ANIM_STAND, -1}, // LONG JUMP - "LONG JUMP" , 0, 100, (FLOAT)3.4, ANIM_SPECIALMOVE | ANIM_NORESTART | ANIM_LOWER_WEAPON | ANIM_MODERATE_EFFORT | ANIM_TURNING, ANIM_STAND, ANIM_STAND, -1, + {"LONG JUMP" , 0, 100, (FLOAT)3.4, ANIM_SPECIALMOVE | ANIM_NORESTART | ANIM_LOWER_WEAPON | ANIM_MODERATE_EFFORT | ANIM_TURNING, ANIM_STAND, ANIM_STAND, -1}, + + // CRYO_DEATH + {"CRYO_DEATH", 0, 150, (FLOAT)0, ANIM_STATIONARY | ANIM_NOMOVE_MARKER | ANIM_NO_EFFORT | ANIM_NONINTERRUPT | ANIM_NOCHANGE_WEAPON | ANIM_IGNORE_AUTOSTANCE | ANIM_ATTACK, ANIM_STAND, ANIM_STAND, -1}, + // CRYO_DEATH_CROUCHED + {"CRYO_DEATH_CROUCHED", 0, 150, (FLOAT)0, ANIM_STATIONARY | ANIM_NOMOVE_MARKER | ANIM_NO_EFFORT | ANIM_NONINTERRUPT | ANIM_NOCHANGE_WEAPON | ANIM_IGNORE_AUTOSTANCE | ANIM_ATTACK, ANIM_CROUCH, ANIM_CROUCH, -1}, }; @@ -1519,7 +1527,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ REGMALE ][ FOCUSED_HTH_KICK ] = RGMKICKDOOR; gubAnimSurfaceIndex[ REGMALE ][ LONG_JUMP ] = RGMJUMPOVER; - + gubAnimSurfaceIndex[ REGMALE ][ CRYO_DEATH ] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ REGMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_EXPLODE_CROUCHED; + gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ STANDING][0] = RGMWATER_R_STD; gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ WALKING ][0] = RGMWATER_R_WALK; gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ RUNNING ][0] = RGMWATER_R_WALK; @@ -1680,7 +1690,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceCorpseID[ REGMALE ][ PRONE_LAYFROMHIT_STOP ] = SMERC_PRN; gubAnimSurfaceCorpseID[ REGMALE ][ CHARIOTS_OF_FIRE ] = BURNT_DEAD; gubAnimSurfaceCorpseID[ REGMALE ][ BODYEXPLODING ] = EXPLODE_DEAD; - + gubAnimSurfaceCorpseID[ REGMALE ][ CRYO_DEATH ] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ REGMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_CORPSE; + // BIG MALE GUY gubAnimSurfaceIndex[ BIGMALE ][ WALKING ] = BGMWALKING; @@ -1958,8 +1970,10 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ BIGMALE ][ HTH_KICK ] = BGMKICKDOOR; gubAnimSurfaceIndex[ BIGMALE ][ FOCUSED_HTH_KICK ] = BGMKICKDOOR; - gubAnimSurfaceIndex[ BIGMALE ][ LONG_JUMP ] = BGMJUMPOVER; - + gubAnimSurfaceIndex[ BIGMALE ][ LONG_JUMP ] = BGMJUMPOVER; + gubAnimSurfaceIndex[ BIGMALE ][ CRYO_DEATH ] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ BIGMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_EXPLODE_CROUCHED; + gubAnimSurfaceItemSubIndex[ BIGMALE ][ STANDING ] = BGMPISTOLBREATH; gubAnimSurfaceItemSubIndex[ BIGMALE ][ WALKING ] = BGMNOTHING_WALK; gubAnimSurfaceItemSubIndex[ BIGMALE ][ RUNNING ] = BGMNOTHING_RUN; @@ -2141,7 +2155,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceCorpseID[ BIGMALE ][ PRONE_LAYFROMHIT_STOP ] = MMERC_PRN; gubAnimSurfaceCorpseID[ BIGMALE ][ CHARIOTS_OF_FIRE ] = BURNT_DEAD; gubAnimSurfaceCorpseID[ BIGMALE ][ BODYEXPLODING ] = EXPLODE_DEAD; - + gubAnimSurfaceCorpseID[ BIGMALE ][ CRYO_DEATH ] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ BIGMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_CORPSE; + // STOCKY MALE GUY gubAnimSurfaceIndex[ STOCKYMALE ][ WALKING ] = RGMBASICWALKING; @@ -2330,7 +2346,7 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ STOCKYMALE ][ AI_RADIO ] = RGMRADIO; gubAnimSurfaceIndex[ STOCKYMALE ][ AI_CR_RADIO ] = RGMCRRADIO; gubAnimSurfaceIndex[ STOCKYMALE ][ SLAP_HIT ] = RGMHITSTAND; - gubAnimSurfaceIndex[ STOCKYMALE ][ TAKE_BLOOD_FROM_CORPSE ] = RGMMEDIC; + gubAnimSurfaceIndex[ STOCKYMALE ][ TAKE_BLOOD_FROM_CORPSE ] = RGMMEDIC; gubAnimSurfaceIndex[ STOCKYMALE ][ CHARIOTS_OF_FIRE ] = RGMBURN; gubAnimSurfaceIndex[ STOCKYMALE ][ AI_PULL_SWITCH ] = RGMOPEN; gubAnimSurfaceIndex[ STOCKYMALE ][ MERC_HURT_IDLE_ANIM ] = RGMHURTSTANDINGR; @@ -2420,7 +2436,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ STOCKYMALE ][ FOCUSED_HTH_KICK ] = RGMKICKDOOR; gubAnimSurfaceIndex[ STOCKYMALE ][ LONG_JUMP ] = RGMJUMPOVER; - + gubAnimSurfaceIndex[ STOCKYMALE ][ CRYO_DEATH ] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ STOCKYMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_EXPLODE_CROUCHED; + gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ STANDING ] = RGMPISTOLBREATH; gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ WALKING ] = RGMNOTHING_WALK; gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ RUNNING] = RGMNOTHING_RUN; @@ -2536,9 +2554,11 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceCorpseID[ STOCKYMALE ][ STAND_FALLFORWARD_STOP ] = SMERC_FWD; gubAnimSurfaceCorpseID[ STOCKYMALE ][ FALLBACKHIT_STOP ] = SMERC_BCK; gubAnimSurfaceCorpseID[ STOCKYMALE ][ PRONE_LAYFROMHIT_STOP ] = SMERC_PRN; - gubAnimSurfaceCorpseID[ STOCKYMALE ][ CHARIOTS_OF_FIRE ] = BURNT_DEAD; + gubAnimSurfaceCorpseID[ STOCKYMALE ][ CHARIOTS_OF_FIRE ] = BURNT_DEAD; gubAnimSurfaceCorpseID[ STOCKYMALE ][ BODYEXPLODING ] = EXPLODE_DEAD; - + gubAnimSurfaceCorpseID[ STOCKYMALE ][ CRYO_DEATH ] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ STOCKYMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_CORPSE; + //Setup some random stuff gRandomAnimDefs[ STOCKYMALE ][ 0 ].ubHandRestriction = RANDOM_ANIM_RIFLEINHAND; @@ -2854,7 +2874,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ REGFEMALE ][ FOCUSED_HTH_KICK ] = RGFKICKDOOR; gubAnimSurfaceIndex[ REGFEMALE ][ LONG_JUMP ] = RGFJUMPOVER; - + gubAnimSurfaceIndex[ REGFEMALE ][ CRYO_DEATH ] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ REGFEMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_EXPLODE_CROUCHED; + gubAnimSurfaceItemSubIndex[ REGFEMALE ][ STANDING ] = RGFPISTOLBREATH; gubAnimSurfaceItemSubIndex[ REGFEMALE ][ WALKING ] = RGFNOTHING_WALK; gubAnimSurfaceItemSubIndex[ REGFEMALE ][ RUNNING ] = RGFNOTHING_RUN; @@ -2970,7 +2992,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceCorpseID[ REGFEMALE ][ PRONE_LAYFROMHIT_STOP ] = FMERC_PRN; gubAnimSurfaceCorpseID[ REGFEMALE ][ CHARIOTS_OF_FIRE ] = BURNT_DEAD; gubAnimSurfaceCorpseID[ REGFEMALE ][ BODYEXPLODING ] = EXPLODE_DEAD; - + gubAnimSurfaceCorpseID[ REGFEMALE ][ CRYO_DEATH ] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ REGFEMALE ][ CRYO_DEATH_CROUCHED ] = CRYO_CORPSE; + //Setup some random stuff gRandomAnimDefs[ REGFEMALE ][ 0 ].ubHandRestriction = RANDOM_ANIM_RIFLEINHAND; @@ -3036,8 +3060,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ ADULTFEMALEMONSTER ][ MONSTER_JUMP ] = AFMJUMP; gubAnimSurfaceIndex[ ADULTFEMALEMONSTER ][ MONSTER_MELT ] = AFMMELT; gubAnimSurfaceIndex[ ADULTFEMALEMONSTER ][ MONSTER_WALK_BACKWARDS ] = AFMONSTERWALKING; + gubAnimSurfaceIndex[ADULTFEMALEMONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ADULTFEMALEMONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ ADULTFEMALEMONSTER ][ MONSTER_MELT ] = ADULTMONSTER_DEAD; + gubAnimSurfaceCorpseID[ADULTFEMALEMONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ADULTFEMALEMONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // Adult male gubAnimSurfaceIndex[ AM_MONSTER ][ STANDING ] = AFMONSTERSTANDING; @@ -3058,8 +3086,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ AM_MONSTER ][ MONSTER_JUMP ] = AFMJUMP; gubAnimSurfaceIndex[ AM_MONSTER ][ MONSTER_MELT ] = AFMMELT; gubAnimSurfaceIndex[ AM_MONSTER ][ MONSTER_WALK_BACKWARDS ] = AFMONSTERWALKING; + gubAnimSurfaceIndex[AM_MONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[AM_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ AM_MONSTER ][ MONSTER_MELT ] = ADULTMONSTER_DEAD; + gubAnimSurfaceCorpseID[AM_MONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[AM_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // Young adult female gubAnimSurfaceIndex[ YAF_MONSTER ][ STANDING ] = AFMONSTERSTANDING; @@ -3080,8 +3112,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ YAF_MONSTER ][ MONSTER_JUMP ] = AFMJUMP; gubAnimSurfaceIndex[ YAF_MONSTER ][ MONSTER_MELT] = AFMMELT; gubAnimSurfaceIndex[ YAF_MONSTER ][ MONSTER_WALK_BACKWARDS ] = AFMONSTERWALKING; + gubAnimSurfaceIndex[YAF_MONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[YAF_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ YAF_MONSTER ][ MONSTER_MELT ] = ADULTMONSTER_DEAD; + gubAnimSurfaceCorpseID[YAF_MONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[YAF_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // Young adult male @@ -3103,17 +3139,24 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ YAM_MONSTER ][ MONSTER_JUMP ] = AFMJUMP; gubAnimSurfaceIndex[ YAM_MONSTER ][ MONSTER_MELT ] = AFMMELT; gubAnimSurfaceIndex[ YAM_MONSTER ][ MONSTER_WALK_BACKWARDS ] = AFMONSTERWALKING; + gubAnimSurfaceIndex[YAM_MONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[YAM_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ YAM_MONSTER ][ MONSTER_MELT ] = ADULTMONSTER_DEAD; - + gubAnimSurfaceCorpseID[YAM_MONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[YAM_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gubAnimSurfaceIndex[ LARVAE_MONSTER ][ LARVAE_BREATH ] = LVBREATH; gubAnimSurfaceIndex[ LARVAE_MONSTER ][ LARVAE_HIT ] = LVDIE; gubAnimSurfaceIndex[ LARVAE_MONSTER ][ LARVAE_DIE ] = LVDIE; gubAnimSurfaceIndex[ LARVAE_MONSTER ][ LARVAE_DIE_STOP ] = LVDIE; gubAnimSurfaceIndex[ LARVAE_MONSTER ][ LARVAE_WALK ] = LVWALK; + gubAnimSurfaceIndex[LARVAE_MONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[LARVAE_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ LARVAE_MONSTER ][ LARVAE_DIE ] = LARVAEMONSTER_DEAD; + gubAnimSurfaceCorpseID[LARVAE_MONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[LARVAE_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gubAnimSurfaceIndex[ INFANT_MONSTER ][ STANDING ] = IBREATH; gubAnimSurfaceIndex[ INFANT_MONSTER ][ RUNNING ] = IWALK; @@ -3126,9 +3169,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ INFANT_MONSTER ][ INFANT_EATTING_FLESH ] = IEAT; gubAnimSurfaceIndex[ INFANT_MONSTER ][ INFANT_END_EATTING_FLESH ] = IEAT; gubAnimSurfaceIndex[ INFANT_MONSTER ][ WALK_BACKWARDS ] = IWALK; - + gubAnimSurfaceIndex[INFANT_MONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[INFANT_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ INFANT_MONSTER ][ INFANT_DIE ] = INFANTMONSTER_DEAD; + gubAnimSurfaceCorpseID[INFANT_MONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[INFANT_MONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gubAnimSurfaceIndex[ QUEENMONSTER ][ QUEEN_MONSTER_BREATHING ] = QUEENMONSTERSTANDING; @@ -3141,9 +3187,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ QUEENMONSTER ][ QUEEN_END_READY ] = QUEENMONSTERREADY; gubAnimSurfaceIndex[ QUEENMONSTER ][ QUEEN_SPIT ] = QUEENMONSTERSPIT_SW; gubAnimSurfaceIndex[ QUEENMONSTER ][ QUEEN_SWIPE ] = QUEENMONSTERSWIPE; + gubAnimSurfaceIndex[QUEENMONSTER][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[QUEENMONSTER][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ QUEENMONSTER ][ QUEEN_DIE ] = QUEEN_MONSTER_DEAD; - + gubAnimSurfaceCorpseID[QUEENMONSTER][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[QUEENMONSTER][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; ////// // FAT GUY @@ -3172,9 +3221,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ FATCIV ][ END_COWER ] = FATMANCOWER; gubAnimSurfaceIndex[ FATCIV ][ CIV_DIE2 ] = FATMANDIE2; gubAnimSurfaceIndex[ FATCIV ][ CIV_COWER_HIT ] = FATMANCOWERHIT; + gubAnimSurfaceIndex[FATCIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[FATCIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ FATCIV ][ GENERIC_HIT_DEATH ] = FT_DEAD1; gubAnimSurfaceCorpseID[ FATCIV ][ CIV_DIE2 ] = FT_DEAD2; + gubAnimSurfaceCorpseID[FATCIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[FATCIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ FATCIV ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ FATCIV ][ 0 ].sAnimID = FATCIV_ASS_SCRATCH; @@ -3215,11 +3268,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ MANCIV ][ END_OPENSTRUCT ] = MANCIVACT; gubAnimSurfaceIndex[ MANCIV ][ END_OPENSTRUCT_LOCKED ] = MANCIVACT; gubAnimSurfaceIndex[ MANCIV ][ CIV_COWER_HIT ] = MANCIVCOWERHIT; - + gubAnimSurfaceIndex[MANCIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[MANCIV ][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ MANCIV ][ GENERIC_HIT_DEATH ] = M_DEAD1; gubAnimSurfaceCorpseID[ MANCIV ][ CIV_DIE2 ] = M_DEAD2; - + gubAnimSurfaceCorpseID[MANCIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[MANCIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // mini skirt civ gubAnimSurfaceIndex[ MINICIV ][ STANDING ] = MINICIVSTANDING; @@ -3247,10 +3302,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ MINICIV ][ END_COWER ] = MINICOWER; gubAnimSurfaceIndex[ MINICIV ][ CIV_DIE2 ] = MINIDIE2; gubAnimSurfaceIndex[ MINICIV ][ CIV_COWER_HIT ] = MINICOWERHIT; + gubAnimSurfaceIndex[MINICIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[MINICIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ MINICIV ][ GENERIC_HIT_DEATH ] = S_DEAD1; gubAnimSurfaceCorpseID[ MINICIV ][ CIV_DIE2 ] = S_DEAD2; - + gubAnimSurfaceCorpseID[MINICIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[MINICIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ MINICIV ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ MINICIV ][ 0 ].sAnimID = MINIGIRL_STOCKING; @@ -3285,9 +3343,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ DRESSCIV ][ END_COWER ] = DRESSCIVCOWER; gubAnimSurfaceIndex[ DRESSCIV ][ CIV_DIE2 ] = DRESSCIVDIE2; gubAnimSurfaceIndex[ DRESSCIV ][ CIV_COWER_HIT ] = DRESSCIVCOWERHIT; + gubAnimSurfaceIndex[DRESSCIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[DRESSCIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ DRESSCIV ][ GENERIC_HIT_DEATH ] = W_DEAD1; gubAnimSurfaceCorpseID[ DRESSCIV ][ CIV_DIE2 ] = W_DEAD2; + gubAnimSurfaceCorpseID[DRESSCIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[DRESSCIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // HATKID civ gubAnimSurfaceIndex[ HATKIDCIV ][ STANDING ] = HATKIDCIVSTANDING; @@ -3319,10 +3381,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ HATKIDCIV ][ CIV_DIE2 ] = HATKIDCIVDIE2; gubAnimSurfaceIndex[ HATKIDCIV ][ CIV_COWER_HIT ] = HATKIDCIVCOWERHIT; gubAnimSurfaceIndex[ HATKIDCIV ][ KID_SKIPPING ] = HATKIDCIVSKIP; - + gubAnimSurfaceIndex[HATKIDCIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[HATKIDCIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ HATKIDCIV ][ GENERIC_HIT_DEATH ] = H_DEAD1; gubAnimSurfaceCorpseID[ HATKIDCIV ][ CIV_DIE2 ] = H_DEAD2; + gubAnimSurfaceCorpseID[HATKIDCIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[HATKIDCIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ HATKIDCIV ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ HATKIDCIV ][ 0 ].sAnimID = HATKID_YOYO; @@ -3362,10 +3427,13 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ KIDCIV ][ CIV_DIE2 ] = KIDCIVDIE2; gubAnimSurfaceIndex[ KIDCIV ][ CIV_COWER_HIT ] = KIDCIVCOWERHIT; gubAnimSurfaceIndex[ KIDCIV ][ KID_SKIPPING ] = KIDCIVSKIP; + gubAnimSurfaceIndex[KIDCIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[KIDCIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ KIDCIV ][ GENERIC_HIT_DEATH ] = K_DEAD1; gubAnimSurfaceCorpseID[ KIDCIV ][ CIV_DIE2 ] = K_DEAD2; - + gubAnimSurfaceCorpseID[KIDCIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[KIDCIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ KIDCIV ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ KIDCIV ][ 0 ].sAnimID = KID_ARMPIT; @@ -3389,8 +3457,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ CRIPPLECIV ][ CRIPPLE_CLOSE_DOOR ] = CRIPCIVBEG; gubAnimSurfaceIndex[ CRIPPLECIV ][ CRIPPLE_END_OPEN_DOOR ] = CRIPCIVBEG; gubAnimSurfaceIndex[ CRIPPLECIV ][ CRIPPLE_END_OPEN_LOCKED_DOOR ] = CRIPCIVBEG; + gubAnimSurfaceIndex[CRIPPLECIV][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[CRIPPLECIV][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ CRIPPLECIV ][ CRIPPLE_DIE ] = SMERC_BCK; + gubAnimSurfaceCorpseID[CRIPPLECIV][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[CRIPPLECIV][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ CRIPPLECIV ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ CRIPPLECIV ][ 0 ].sAnimID = CRIPPLE_BEG; @@ -3407,9 +3479,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ COW ][ COW_HIT ] = COWDIE; gubAnimSurfaceIndex[ COW ][ COW_DYING ] = COWDIE; gubAnimSurfaceIndex[ COW ][ COW_DYING_STOP ] = COWDIE; + gubAnimSurfaceIndex[COW][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[COW][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ COW ][ COW_DYING ] = COW_DEAD; - + gubAnimSurfaceCorpseID[COW][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[COW][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; gRandomAnimDefs[ COW ][ 0 ].ubHandRestriction = RANDOM_ANIM_IRRELEVENTINHAND; gRandomAnimDefs[ COW ][ 0 ].sAnimID = COW_EATING; @@ -3476,8 +3551,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ BLOODCAT ][ BLOODCAT_SWIPE ] = CATSWIPE; gubAnimSurfaceIndex[ BLOODCAT ][ BLOODCAT_BITE_ANIM ] = CATBITE; gubAnimSurfaceIndex[ BLOODCAT ][ BLOODCAT_WALK_BACKWARDS ] = CATWALK; + gubAnimSurfaceIndex[BLOODCAT][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[BLOODCAT][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; gubAnimSurfaceCorpseID[ BLOODCAT ][ BLOODCAT_DYING ] = BLOODCAT_DEAD; + gubAnimSurfaceCorpseID[BLOODCAT][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[BLOODCAT][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // ROBOT gubAnimSurfaceIndex[ ROBOTNOWEAPON ][ STANDING ] = ROBOTNWBREATH; @@ -3489,8 +3568,12 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ ROBOTNOWEAPON ][ ROBOT_SHOOT ] = ROBOTNWSHOOT; gubAnimSurfaceIndex[ ROBOTNOWEAPON ][ ROBOT_BURST_SHOOT ] = ROBOTNWSHOOT; gubAnimSurfaceIndex[ ROBOTNOWEAPON ][ ROBOT_CAMERA_NOT_MOVING ] = ROBOTNWBREATH; - gubAnimSurfaceCorpseID[ ROBOTNOWEAPON ][ ROBOTNW_DIE ] = ROBOT_DEAD; + gubAnimSurfaceIndex[ROBOTNOWEAPON][CRYO_DEATH] = CRYO_EXPLODE; + gubAnimSurfaceIndex[ROBOTNOWEAPON][CRYO_DEATH_CROUCHED] = CRYO_EXPLODE_CROUCHED; + gubAnimSurfaceCorpseID[ ROBOTNOWEAPON ][ ROBOTNW_DIE ] = ROBOT_DEAD; + gubAnimSurfaceCorpseID[ROBOTNOWEAPON][CRYO_DEATH] = CRYO_CORPSE; + gubAnimSurfaceCorpseID[ROBOTNOWEAPON][CRYO_DEATH_CROUCHED] = CRYO_CORPSE; // HUMVEE @@ -3656,6 +3739,9 @@ BOOLEAN LoadAnimationStateInstructions( ) memcpy(gusAnimInst[LONG_JUMP],LONG_JUMP_AnimationScript,sizeof(LONG_JUMP_AnimationScript)); + memcpy( gusAnimInst[CRYO_DEATH], CRYO_DEATH_AnimationScript, sizeof(CRYO_DEATH_AnimationScript) ); + memcpy( gusAnimInst[CRYO_DEATH_CROUCHED], CRYO_DEATH_CROUCHED_AnimationScript, sizeof(CRYO_DEATH_CROUCHED_AnimationScript) ); + // NOTE: Careful here... keep in mind you have to increase MAX_ANIMATIONS whenever you would go over 399(currently) animation numbers return( TRUE ); @@ -3835,7 +3921,7 @@ INT8 GetBodyTypePaletteSubstitutionCode( SOLDIERTYPE *pSoldier, UINT8 ubBodyType if ( pSoldier != NULL ) { // Are we on fire? - if ( pSoldier->usAnimState == CHARIOTS_OF_FIRE || pSoldier->usAnimState == BODYEXPLODING ) + if ( pSoldier->usAnimState == CHARIOTS_OF_FIRE || pSoldier->usAnimState == BODYEXPLODING || pSoldier->usAnimState == CRYO_DEATH || pSoldier->usAnimState == CRYO_DEATH_CROUCHED ) { return( 0 ); } diff --git a/Tactical/Animation Control.h b/Tactical/Animation Control.h index cd43d3f6..19e91b8a 100644 --- a/Tactical/Animation Control.h +++ b/Tactical/Animation Control.h @@ -494,7 +494,7 @@ enum AnimationStates QUEEN_FRUSTRATED_SLAP, CHARIOTS_OF_FIRE, - + AI_PULL_SWITCH, MONSTER_MELT, @@ -608,6 +608,9 @@ enum AnimationStates FOCUSED_HTH_KICK, LONG_JUMP, + + CRYO_DEATH, + CRYO_DEATH_CROUCHED, NUMANIMATIONSTATES diff --git a/Tactical/Animation Data.cpp b/Tactical/Animation Data.cpp index 2df7b698..2c529dce 100644 --- a/Tactical/Animation Data.cpp +++ b/Tactical/Animation Data.cpp @@ -313,6 +313,8 @@ AnimationSurfaceType gAnimSurfaceDatabase[ NUMANIMATIONSURFACETYPES ] = RGFCROWBAR, "ANIMS\\F_MERC\\F_CROBAR.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, RGFJUMPOVER, "ANIMS\\F_MERC\\F_N_RUN.STI", NO_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, + CRYO_EXPLODE, "ANIMS\\S_MERC\\S_CRYO_DEATH_S.STI", S_STRUCT, 0, 1, TO_INIT, NULL, NULL, 0, -1, + CRYO_EXPLODE_CROUCHED, "ANIMS\\S_MERC\\S_CRYO_DEATH_C.STI", S_STRUCT, 0, 1, TO_INIT, NULL, NULL, 0, -1, AFMONSTERSTANDING, "ANIMS\\MONSTERS\\MN_BREAT.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, AFMONSTERWALKING, "ANIMS\\MONSTERS\\MN_WALK.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, @@ -570,7 +572,7 @@ AnimationSurfaceType gAnimSurfaceDatabase[ NUMANIMATIONSURFACETYPES ] = RGM_PFSHOT_AIM, "ANIMS\\S_MERC\\S_N_SHOT.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, BGM_PFSHOT_AIM, "ANIMS\\M_MERC\\M_N_SHOT.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, - RGF_PFSHOT_AIM, "ANIMS\\F_MERC\\1_HND_N.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, + RGF_PFSHOT_AIM, "ANIMS\\F_MERC\\1_HND_N.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, }; diff --git a/Tactical/Animation Data.h b/Tactical/Animation Data.h index 19f338d5..c452b135 100644 --- a/Tactical/Animation Data.h +++ b/Tactical/Animation Data.h @@ -352,6 +352,9 @@ typedef enum RGFCROWBAR, RGFJUMPOVER, + CRYO_EXPLODE, + CRYO_EXPLODE_CROUCHED, + AFMONSTERSTANDING, AFMONSTERWALKING, AFMONSTERATTACK, @@ -601,7 +604,7 @@ BGMWITHSTONE, RGM_PFSHOT_AIM, BGM_PFSHOT_AIM, RGF_PFSHOT_AIM, - + NUMANIMATIONSURFACETYPES } AnimationSurfaceTypes; diff --git a/Tactical/Dialogue Control.cpp b/Tactical/Dialogue Control.cpp index 45a0f106..51c819df 100644 --- a/Tactical/Dialogue Control.cpp +++ b/Tactical/Dialogue Control.cpp @@ -1476,28 +1476,25 @@ BOOLEAN GetSnitchDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, UINT32 iData BOOLEAN DelayedTacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteNum ) { if ( pSoldier->ubProfile == NO_PROFILE ) - { return( FALSE ); - } if (pSoldier->stats.bLife < CONSCIOUSNESS ) - return( FALSE ); + return( FALSE ); + + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; if ( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) return( FALSE ); if ( (AM_A_ROBOT( pSoldier )) ) - { return( FALSE ); - } if (pSoldier->stats.bLife < OKLIFE && usQuoteNum != QUOTE_SERIOUSLY_WOUNDED ) - return( FALSE ); + return( FALSE ); if( pSoldier->bAssignment == ASSIGNMENT_POW ) - { return( FALSE ); - } return( CharacterDialogue( pSoldier->ubProfile, usQuoteNum, pSoldier->iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE, TRUE ) ); } @@ -1513,11 +1510,13 @@ BOOLEAN TacticalCharacterDialogueWithSpecialEvent( SOLDIERTYPE *pSoldier, UINT16 if ( uiFlag != DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND && uiData1 != BATTLE_SOUND_DIE1 ) { if (pSoldier->stats.bLife < CONSCIOUSNESS ) - return( FALSE ); + return( FALSE ); + + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; if ( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) return( FALSE ); - } return( CharacterDialogueWithSpecialEvent( pSoldier->ubProfile, usQuoteNum, pSoldier->iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE, FALSE, uiFlag, uiData1, uiData2 ) ); @@ -1533,7 +1532,10 @@ BOOLEAN TacticalCharacterDialogueWithSpecialEventEx( SOLDIERTYPE *pSoldier, UINT if ( uiFlag != DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND && uiData1 != BATTLE_SOUND_DIE1 ) { if (pSoldier->stats.bLife < CONSCIOUSNESS ) - return( FALSE ); + return( FALSE ); + + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; if ( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) return( FALSE ); @@ -1578,7 +1580,10 @@ BOOLEAN TacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteNum ) } #endif if (pSoldier->stats.bLife < CONSCIOUSNESS ) - return( FALSE ); + return( FALSE ); + + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; if (pSoldier->stats.bLife < OKLIFE && usQuoteNum != QUOTE_SERIOUSLY_WOUNDED ) return( FALSE ); @@ -1931,6 +1936,9 @@ BOOLEAN ExecuteCharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 return( FALSE ); } + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; + if ( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) return( FALSE ); diff --git a/Tactical/Faces.cpp b/Tactical/Faces.cpp index 9e44e181..4a04ac04 100644 --- a/Tactical/Faces.cpp +++ b/Tactical/Faces.cpp @@ -1698,7 +1698,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE { pSoldier = MercPtrs[ pFace->ubSoldierID ]; - if ( ( MercPtrs[ pFace->ubSoldierID ]->stats.bLife < CONSCIOUSNESS || MercPtrs[ pFace->ubSoldierID ]->flags.fDeadPanel ) ) + if ( (MercPtrs[pFace->ubSoldierID]->stats.bLife < CONSCIOUSNESS || MercPtrs[pFace->ubSoldierID]->flags.fDeadPanel ) ) { // Blit Closed eyes here! BltVideoObjectFromIndex( uiRenderBuffer, pFace->uiVideoObject, 1, usEyesX, usEyesY, VO_BLT_SRCTRANSPARENCY, NULL ); @@ -1713,6 +1713,16 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE BltVideoObjectFromIndex( uiRenderBuffer, pFace->uiVideoObject, 1, usEyesX, usEyesY, VO_BLT_SRCTRANSPARENCY, NULL ); } + // Flugente: frozen soldiers are, well, frozen + if ( MercPtrs[pFace->ubSoldierID]->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + { + // Blit Closed eyes here! + BltVideoObjectFromIndex( uiRenderBuffer, pFace->uiVideoObject, 2, usEyesX, usEyesY, VO_BLT_SRCTRANSPARENCY, NULL ); + + // Blit hatch! + BltVideoObjectFromIndex( uiRenderBuffer, guiHATCH, 0, sFaceX, sFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + if ( ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) { // IF we are in the process of doing any deal/close animations, show face, not skill... @@ -2886,51 +2896,52 @@ void HandleAutoFaces( ) pFace->fOldShowMoveHilight = FALSE; } + if ( pSoldier->flags.fGettingHit && pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_STOP ) + { + pSoldier->flags.fFlashPortrait = TRUE; + pSoldier->bFlashPortraitFrame = FLASH_PORTRAIT_STARTSHADE; + RESETTIMECOUNTER( pSoldier->timeCounters.PortraitFlashCounter, FLASH_PORTRAIT_DELAY ); + fRerender = TRUE; + } - if ( pSoldier->flags.fGettingHit && pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_STOP ) + if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START ) + { + // Loop through flash values + if ( TIMECOUNTERDONE( pSoldier->timeCounters.PortraitFlashCounter, FLASH_PORTRAIT_DELAY ) ) { - pSoldier->flags.fFlashPortrait = TRUE; - pSoldier->bFlashPortraitFrame = FLASH_PORTRAIT_STARTSHADE; RESETTIMECOUNTER( pSoldier->timeCounters.PortraitFlashCounter, FLASH_PORTRAIT_DELAY ); - fRerender = TRUE; - } - if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START ) - { - // Loop through flash values - if ( TIMECOUNTERDONE( pSoldier->timeCounters.PortraitFlashCounter, FLASH_PORTRAIT_DELAY ) ) + pSoldier->bFlashPortraitFrame++; + + if ( pSoldier->bFlashPortraitFrame > FLASH_PORTRAIT_ENDSHADE ) { - RESETTIMECOUNTER( pSoldier->timeCounters.PortraitFlashCounter, FLASH_PORTRAIT_DELAY ); - pSoldier->bFlashPortraitFrame++; + pSoldier->bFlashPortraitFrame = FLASH_PORTRAIT_ENDSHADE; - if ( pSoldier->bFlashPortraitFrame > FLASH_PORTRAIT_ENDSHADE ) + if ( pSoldier->flags.fGettingHit ) { - pSoldier->bFlashPortraitFrame = FLASH_PORTRAIT_ENDSHADE; - - if ( pSoldier->flags.fGettingHit ) - { - pSoldier->flags.fFlashPortrait = FLASH_PORTRAIT_WAITING; - } - else - { - // Render face again! - pSoldier->flags.fFlashPortrait = FLASH_PORTRAIT_STOP; - } - - fRerender = TRUE; + pSoldier->flags.fFlashPortrait = FLASH_PORTRAIT_WAITING; } + else + { + // Render face again! + pSoldier->flags.fFlashPortrait = FLASH_PORTRAIT_STOP; + } + + fRerender = TRUE; } } - // CHECK IF WE WERE WAITING FOR GETTING HIT TO FINISH! - if ( !pSoldier->flags.fGettingHit && pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_WAITING ) - { - pSoldier->flags.fFlashPortrait = FALSE; - fRerender = TRUE; - } + } + + // CHECK IF WE WERE WAITING FOR GETTING HIT TO FINISH! + if ( !pSoldier->flags.fGettingHit && pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_WAITING ) + { + pSoldier->flags.fFlashPortrait = FALSE; + fRerender = TRUE; + } - if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START ) - { - fRerender = TRUE; - } + if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START ) + { + fRerender = TRUE; + } if( pFace->uiFlags & FACE_REDRAW_WHOLE_FACE_NEXT_FRAME ) { @@ -2939,20 +2950,24 @@ void HandleAutoFaces( ) fRerender = TRUE; } - if ( fInterfacePanelDirty == DIRTYLEVEL2 && guiCurrentScreen == GAME_SCREEN ) - { + if ( fInterfacePanelDirty == DIRTYLEVEL2 && guiCurrentScreen == GAME_SCREEN ) + { fRerender = TRUE; - } + } if ( fRerender ) { - RenderAutoFace( uiCount ); + RenderAutoFace( uiCount ); } if ( bLife < CONSCIOUSNESS ) { fHandleFace = FALSE; } + + // Flugente: frozen soldiers can't be selected + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + fHandleFace = FALSE; } if ( fHandleFace ) @@ -2961,11 +2976,8 @@ void HandleAutoFaces( ) } MouthAutoFace( uiCount ); - } - } - } void HandleTalkingAutoFaces( ) diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp index a8ce9736..b667f1d6 100644 --- a/Tactical/Interface Panels.cpp +++ b/Tactical/Interface Panels.cpp @@ -6225,6 +6225,13 @@ void HandleLocateSelectMerc( UINT8 ubID, INT8 bFlag ) return; } + // Flugente: frozen soldiers can't be selected + if ( MercPtrs[ubID]->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + { + LocateSoldier( ubID, SETLOCATOR ); + return; + } + if ( _KeyDown( ALT ) ) { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index 2081f9cb..6dfedfd5 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -140,6 +140,7 @@ CHAR8 zCorpseFilenames[ NUM_CORPSES ][70] = "ANIMS\\CORPSES\\J_DEAD.STI", "ANIMS\\CORPSES\\S_BURNT.STI", "ANIMS\\CORPSES\\S_EXPLD.STI", + "ANIMS\\CORPSES\\CRYO_CORPSE.STI", }; @@ -205,6 +206,7 @@ CHAR8 zNoBloodCorpseFilenames[ NUM_CORPSES ][70] = "ANIMS\\CORPSES\\J_DEAD.STI", "ANIMS\\CORPSES\\S_BURNT.STI", "ANIMS\\CORPSES\\S_EXPLD.STI", + "ANIMS\\CORPSES\\CRYO_CORPSE.STI", }; UINT8 gb4DirectionsFrom8[8] = @@ -413,6 +415,7 @@ UINT16 GetCorpseStructIndex( ROTTING_CORPSE_DEFINITION *pCorpseDef, BOOLEAN fFor case QUEEN_MONSTER_DEAD: case BURNT_DEAD: case EXPLODE_DEAD: + case CRYO_CORPSE: bDirection = 0; break; @@ -926,7 +929,7 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE } } - if ( ubType == QUEEN_MONSTER_DEAD || ubType == BURNT_DEAD || ubType == EXPLODE_DEAD ) + if ( ubType == QUEEN_MONSTER_DEAD || ubType == BURNT_DEAD || ubType == EXPLODE_DEAD || ubType == CRYO_CORPSE ) { Corpse.ubDirection = NORTHWEST; } diff --git a/Tactical/Rotting Corpses.h b/Tactical/Rotting Corpses.h index 2936d5fd..30048c64 100644 --- a/Tactical/Rotting Corpses.h +++ b/Tactical/Rotting Corpses.h @@ -66,6 +66,7 @@ enum RottingCorpseDefines ROBOT_DEAD, BURNT_DEAD, EXPLODE_DEAD, + CRYO_CORPSE, NUM_CORPSES, diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp index 3ff3d696..94ee76ef 100644 --- a/Tactical/Soldier Ani.cpp +++ b/Tactical/Soldier Ani.cpp @@ -203,7 +203,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) } } } - + // Check for special code if ( sNewAniFrame < 399 ) { @@ -2158,7 +2158,14 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) } } - if ( gGameSettings.fOptions[ TOPTION_BLOOD_N_GORE ] ) + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] && pSoldier->usAnimState != CRYO_DEATH && pSoldier->usAnimState != CRYO_DEATH_CROUCHED ) + { + if ( gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_STAND ) + pSoldier->ChangeSoldierState( CRYO_DEATH, 0, TRUE ); + else + pSoldier->ChangeSoldierState( CRYO_DEATH_CROUCHED, 0, TRUE ); + } + else if ( gGameSettings.fOptions[ TOPTION_BLOOD_N_GORE ] ) { // If we are dead, play some death animations!! switch( pSoldier->usAnimState ) @@ -2236,8 +2243,8 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // ATE: Needs to be FALSE! return( FALSE ); } - return( TRUE ); + return( TRUE ); } else { diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 836e400b..a974abba 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -4128,6 +4128,14 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart // Merc on fire! this->aiData.uiPendingActionData1 = PlaySoldierJA2Sample( this->ubID, (FIRE_ON_MERC), RATE_11025, SoundVolume( HIGHVOLUME, this->sGridNo ), 5, SoundDir( this->sGridNo ), TRUE ); break; + + case CRYO_DEATH: + PlayJA2StreamingSampleFromFile( "stsounds\\CryoBlast_1.ogg", RATE_11025, SoundVolume( HIGHVOLUME, this->sGridNo ), 1, MIDDLEPAN, NULL ); + break; + + case CRYO_DEATH_CROUCHED: + PlayJA2StreamingSampleFromFile( "stsounds\\CryoBlast_2.ogg", RATE_11025, SoundVolume( HIGHVOLUME, this->sGridNo ), 1, MIDDLEPAN, NULL ); + break; } } @@ -6306,6 +6314,16 @@ void SOLDIERTYPE::EVENT_SoldierGotHit( UINT16 usWeaponIndex, INT16 sDamage, INT1 return; } + // Flugente: cryo death + if (this->stats.bLife <= 0 && this->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + { + if ( gAnimControl[this->usAnimState].ubEndHeight == ANIM_STAND ) + this->EVENT_InitNewSoldierAnim( CRYO_DEATH, 0, TRUE ); + else + this->EVENT_InitNewSoldierAnim( CRYO_DEATH_CROUCHED, 0, TRUE ); + + return; + } // SWITCH IN TYPE OF WEAPON if ( Item[usWeaponIndex].usItemClass & (IC_GUN | IC_THROWING_KNIFE) ) @@ -6536,7 +6554,7 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD // ReleaseSoldiersAttacker( pSoldier ); return; } - + if ( fFallenOver ) { // HEADROCK HAM 3.2: Critical legshots cost an extra number of APs, based on shot damage. @@ -7225,9 +7243,7 @@ void SOLDIERTYPE::SoldierGotoStationaryStance( void ) void SOLDIERTYPE::ChangeSoldierStance( UINT8 ubDesiredStance ) -{ - UINT16 usNewState; - +{ // Check if they are the same! if ( ubDesiredStance == gAnimControl[this->usAnimState].ubEndHeight ) { @@ -7263,7 +7279,7 @@ void SOLDIERTYPE::ChangeSoldierStance( UINT8 ubDesiredStance ) } else { - usNewState = this->GetNewSoldierStateFromNewStance( ubDesiredStance ); + UINT16 usNewState = this->GetNewSoldierStateFromNewStance( ubDesiredStance ); // Set desired stance this->ubDesiredHeight = ubDesiredStance; @@ -9796,7 +9812,7 @@ UINT8 SOLDIERTYPE::SoldierTakeDamage( INT8 bHeight, INT16 sLifeDeduct, INT16 sBr default: break; } - + // Deduct life!, Show damage if we want! bOldLife = this->stats.bLife; @@ -10798,6 +10814,9 @@ BOOLEAN SOLDIERTYPE::InternalDoMercBattleSound( UINT8 ubBattleSoundID, INT8 bSpe BOOLEAN SOLDIERTYPE::DoMercBattleSound( UINT8 ubBattleSoundID ) { + if ( this->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + return FALSE; + // We WANT to play some RIGHT AWAY..... if ( gBattleSndsData[ubBattleSoundID].fStopDialogue == 1 || (this->ubProfile == NO_PROFILE) || InOverheadMap( ) ) { @@ -14515,8 +14534,12 @@ INT32 SOLDIERTYPE::GetDamageResistance( BOOLEAN fAutoResolve, BOOLEAN fCalcBreat resistance += this->GetBackgroundValue( BG_RESI_PHYSICAL ); + // frozen targets go down HARD + if ( this->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + resistance -= 1000; + // resistance is between -100% and 95% - resistance = max( -100, resistance ); + resistance = max( -1000, resistance ); resistance = min( 95, resistance ); return(resistance); @@ -15421,7 +15444,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID ) // if we perform suspicious actions, we are easier to uncover for a short time (but not by ourselves if we test the disguise) if ( ubObserverID != this->ubID && this->usSoldierFlagMask & SOLDIER_COVERT_TEMPORARY_OVERT ) { - // if enough time ha passed, or we have spend enough AP, lose the flag + // if enough time has passed, or we have spend enough AP, lose the flag if ( this->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_APS] == 0 || GetWorldTotalSeconds( ) >= this->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_SECONDS] ) { this->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_SECONDS] = 0; @@ -17118,7 +17141,7 @@ void SOLDIERTYPE::SoldierPropertyUpkeep( ) { // these effects last only one turn this->usSoldierFlagMask &= ~(SOLDIER_AIRDROP_TURN | SOLDIER_ASSAULT_BONUS | SOLDIER_RAISED_REDALERT); - + if ( HasBackgroundFlag( BACKGROUND_EXP_UNDERGROUND ) && this->bSectorZ ) ++bExtraExpLevel; @@ -17141,6 +17164,9 @@ void SOLDIERTYPE::SoldierPropertyUpkeep( ) usSkillCounter[counter] = max( 0, usSkillCounter[counter] - 1 ); } + if ( this->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + this->usSkillCooldown[SOLDIER_COOLDOWN_CRYO]--; + // if soldier was seen this turn, increase his observed counter if ( this->usSoldierFlagMask & SOLDIER_ENEMY_OBSERVEDTHISTURN ) { diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index c07e96ff..4d09b520 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -600,6 +600,7 @@ enum { enum { SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_SECONDS = 0, SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_APS, + SOLDIER_COOLDOWN_CRYO, // counts how many turns character will be frozen SOLDIER_COOLDOWN_MAX = 20, // enough space for fillers }; diff --git a/Tactical/Soldier Find.cpp b/Tactical/Soldier Find.cpp index 672af9a7..a1e1507f 100644 --- a/Tactical/Soldier Find.cpp +++ b/Tactical/Soldier Find.cpp @@ -124,50 +124,50 @@ UINT32 GetSoldierFindFlags( UINT16 ubID ) UINT32 MercFlags = 0; SOLDIERTYPE *pSoldier; - // Get pSoldier! - pSoldier = MercPtrs[ ubID ]; + // Get pSoldier! + pSoldier = MercPtrs[ ubID ]; - // FInd out and set flags - if ( ubID == gusSelectedSoldier ) - { + // FInd out and set flags + if ( ubID == gusSelectedSoldier ) + { MercFlags |= SELECTED_MERC; - } - if ( ubID >= gTacticalStatus.Team[ gbPlayerNum ].bFirstID && ubID <= gTacticalStatus.Team[ gbPlayerNum ].bLastID ) - { - if ( ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !GetNumberInVehicle( pSoldier->bVehicleID ) ) - { - // Don't do anything! } - else + if ( ubID >= gTacticalStatus.Team[ gbPlayerNum ].bFirstID && ubID <= gTacticalStatus.Team[ gbPlayerNum ].bLastID ) { - // It's our own merc - MercFlags |= OWNED_MERC; - - if ( pSoldier->bAssignment < ON_DUTY ) + if ( ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !GetNumberInVehicle( pSoldier->bVehicleID ) ) { - MercFlags |= ONDUTY_MERC; + // Don't do anything! + } + else + { + // It's our own merc + MercFlags |= OWNED_MERC; + + if ( pSoldier->bAssignment < ON_DUTY ) + { + MercFlags |= ONDUTY_MERC; + } } } - } - else - { - // Check the side, etc - if ( !pSoldier->aiData.bNeutral && (pSoldier->bSide != gbPlayerNum ) ) - { - // It's an enemy merc - MercFlags |= ENEMY_MERC; - } else { - // It's not an enemy merc - MercFlags |= NEUTRAL_MERC; + // Check the side, etc + if ( !pSoldier->aiData.bNeutral && (pSoldier->bSide != gbPlayerNum ) ) + { + // It's an enemy merc + MercFlags |= ENEMY_MERC; + } + else + { + // It's not an enemy merc + MercFlags |= NEUTRAL_MERC; + } } - } // Check for a guy who does not have an iterrupt ( when applicable! ) if ( !OK_INTERRUPT_MERC( pSoldier ) ) { - MercFlags |= NOINTERRUPT_MERC; + MercFlags |= NOINTERRUPT_MERC; } if ( pSoldier->stats.bLife < OKLIFE ) @@ -175,6 +175,9 @@ UINT32 GetSoldierFindFlags( UINT16 ubID ) MercFlags |= UNCONSCIOUS_MERC; } + if ( pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) + MercFlags |= UNCONSCIOUS_MERC; + if ( pSoldier->stats.bLife == 0 ) { MercFlags |= DEAD_MERC; diff --git a/Tactical/Soldier macros.h b/Tactical/Soldier macros.h index 3b3bddfd..821fcc93 100644 --- a/Tactical/Soldier macros.h +++ b/Tactical/Soldier macros.h @@ -18,14 +18,14 @@ #define OK_ENEMY_MERC( p ) ( !p->aiData.bNeutral && (p->bSide != gbPlayerNum ) && p->stats.bLife >= OKLIFE && (p->bTeam < 5 )) // Checks if our guy can be controllable .... checks bInSector, team, on duty, etc... -//#define OK_CONTROLLABLE_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum && p->bAssignment < ON_DUTY ) -#define OK_CONTROLLABLE_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum && ( p->bAssignment < ON_DUTY || p->bAssignment == VEHICLE ) ) + +// Checks if our guy is controllable but doesn't care about current assignment +#define OK_CONTROL_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum && !(p->usSkillCooldown[SOLDIER_COOLDOWN_CRYO]) ) + +#define OK_CONTROLLABLE_MERC( p ) ( OK_CONTROL_MERC(p) && ( p->bAssignment < ON_DUTY || p->bAssignment == VEHICLE ) ) // Checks if our guy can be controllable .... checks bInSector, team, on duty, etc... -#define OK_INSECTOR_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum && p->bAssignment < ON_DUTY ) - -// Checks if our guy is controllable but doesn't care about current assignment -#define OK_CONTROL_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum ) +#define OK_INSECTOR_MERC( p ) ( p->stats.bLife >= OKLIFE && p->bActive && p->bInSector && p->bTeam == gbPlayerNum && p->bAssignment < ON_DUTY ) // Checkf if our guy can be selected and is not in a position where our team has an interupt and he does not have one... #define OK_INTERRUPT_MERC( p ) ( ( INTERRUPT_QUEUED != 0 ) ? ( ( p->aiData.bMoved ) ? FALSE : TRUE ) : TRUE ) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index b7fbb1f7..32c48546 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -9653,6 +9653,14 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget, gfNextShotKills = FALSE; } + // Flugente: if this is cryo ammo, freeze target. + if ( !TANK( pTarget ) && AmmoTypes[ubAmmoType].ammoflag & AMMO_CRYO ) + { + pTarget->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] += 2; + + ShutupaYoFace( pTarget->iFaceIndex ); + } + if ( iImpact > 0 && !TANK( pTarget ) ) { // Flugente: any bullet can have drug effects it set so in the magazine item diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h index 44cb0459..9154b024 100644 --- a/Tactical/Weapons.h +++ b/Tactical/Weapons.h @@ -177,7 +177,7 @@ enum // -------- added by Flugente: various ammo flags -------- // flags used for various ammo properties (easier than adding 32 differently named variables). DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!! -//#define AMMO_NEUROTOXIN 0x00000001 //1 // this ammo adds the cyanide drug effect to its target, killing it in a few turns // not used anymore +#define AMMO_CRYO 0x00000001 //1 // this ammo shock-freezes target #define AMMO_BLIND 0x00000002 //2 // this ammo will blind if it hits the head #define AMMO_ANTIMATERIEL 0x00000004 //4 // this ammo is anti-materiel, bullets can destroy structures /*#define CONCERTINA 0x00000008 //8 diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index c27ef34f..51490959 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -1317,13 +1317,12 @@ void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier) // pSoldier->flags.fNoAPToFinishMove = FALSE; // Flugente: pows don't do anything - if ( pSoldier->usSoldierFlagMask & SOLDIER_POW ) + if ( pSoldier->usSoldierFlagMask & SOLDIER_POW || pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) { EndAIGuysTurn( pSoldier); return; } - if ((pSoldier->aiData.bAction != AI_ACTION_NONE) && pSoldier->aiData.bActionInProgress) { // if action should remain in progress diff --git a/TacticalAI/Realtime.cpp b/TacticalAI/Realtime.cpp index 5d12e68b..1ba07c3f 100644 --- a/TacticalAI/Realtime.cpp +++ b/TacticalAI/Realtime.cpp @@ -73,7 +73,7 @@ void RTHandleAI( SOLDIERTYPE * pSoldier ) } // Flugente: prisoners of war don't do anything - if ( pSoldier->usSoldierFlagMask & SOLDIER_POW ) + if ( pSoldier->usSoldierFlagMask & SOLDIER_POW || pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) return; // if man has nothing to do diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index fd2e33d4..eb23ee52 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -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 ); diff --git a/TileEngine/renderworld.cpp b/TileEngine/renderworld.cpp index b7cd5b3e..d83f100c 100644 --- a/TileEngine/renderworld.cpp +++ b/TileEngine/renderworld.cpp @@ -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