From 4ad4f6c2237b92d375f2fa819bb78e56fd2425a2 Mon Sep 17 00:00:00 2001 From: Wanne Date: Sun, 6 May 2012 15:14:05 +0000 Subject: [PATCH] - New Animation: Prone bandaging (by Sandro & PasHancock) o Also available in a multiplayer game git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5264 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Multiplayer/client.cpp | 16 ++++- Tactical/Animation Control.cpp | 27 +++++++- Tactical/Animation Control.h | 4 ++ Tactical/Animation Data.cpp | 3 + Tactical/Animation Data.h | 4 ++ Tactical/Auto Bandage.cpp | 2 +- Tactical/Overhead.cpp | 4 +- Tactical/Soldier Ani.cpp | 10 +++ Tactical/Soldier Control.cpp | 110 ++++++++++++++++++++++++++++----- 9 files changed, 158 insertions(+), 22 deletions(-) diff --git a/Multiplayer/client.cpp b/Multiplayer/client.cpp index d3528058..ce5ef6fb 100644 --- a/Multiplayer/client.cpp +++ b/Multiplayer/client.cpp @@ -3681,10 +3681,24 @@ void recieveSTATE(RPCParameters *rpcParameters) if(new_state->usNewState==START_AID) { pSoldier->EVENT_InternalSetSoldierPosition( new_state->sXPos, new_state->sYPos ,FALSE, FALSE, FALSE ); - pSoldier->ChangeSoldierStance( ANIM_CROUCH ); pSoldier->EVENT_SetSoldierDirection( new_state->usNewDirection ); + // SANDRO - we can now bandage mercs when prone, so change stance only if standing + if ( gAnimControl[ pSoldier->usAnimState ].ubEndHeight == ANIM_STAND ) + { + pSoldier->ChangeSoldierStance( ANIM_CROUCH ); + } } + // SANDRO - if ordered to bandage in prone position... + else if (new_state->usNewState==START_AID_PRN) + { + pSoldier->EVENT_InternalSetSoldierPosition( new_state->sXPos, new_state->sYPos ,FALSE, FALSE, FALSE ); + pSoldier->EVENT_SetSoldierDirection( new_state->usNewDirection ); + if ( gAnimControl[ pSoldier->usAnimState ].ubEndHeight != ANIM_PRONE ) + { + pSoldier->ChangeSoldierStance( ANIM_PRONE ); + } + } // Start cutting fence else if (new_state->usNewState==CUTTING_FENCE) { diff --git a/Tactical/Animation Control.cpp b/Tactical/Animation Control.cpp index f8f9123e..bedae25c 100644 --- a/Tactical/Animation Control.cpp +++ b/Tactical/Animation Control.cpp @@ -71,7 +71,8 @@ static UINT16 REMOTE_DET_AnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,4,484,4, static UINT16 THROW_KNIFE_SP_BM_AnimationScript[MAX_FRAMES_PER_ANIM] = { 757,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,12,13,709,14,15,16,430,16,17,17,18,19,20,21,753,442,499,999,0,0,0,0 }; - +static UINT16 PRONE_START_FIRST_AID_AnimationScript[MAX_FRAMES_PER_ANIM] = { 1,2,3,4,442,1033,0,0,0,0 }; +static UINT16 PRONE_GIVE_FIRST_AID_AnimationScript[MAX_FRAMES_PER_ANIM] = { 4,5,6,7,6,5,4,3,4,5,6,6,5,7,6,5,4,3,4,5,5,6,7,6,7,6,5,7,6,5,4,3,2,3,2,4,501,0,0,0,0 }; @@ -1007,6 +1008,11 @@ ANIMCONTROLTYPE gAnimControl[ NUMANIMATIONSTATES ] = {"WALKING WITH RIFLE RDY" , 20, 0, (FLOAT)1.6, ANIM_MOVING | ANIM_TURNING | ANIM_NORESTART | ANIM_FIREREADY | ANIM_RAISE_WEAPON | ANIM_VARIABLE_EFFORT, ANIM_STAND, ANIM_STAND, -1}, {"WALKING WITH DUAL RDY" , 20, 0, (FLOAT)1.6, ANIM_MOVING | ANIM_TURNING | ANIM_NORESTART | ANIM_FIREREADY | ANIM_RAISE_WEAPON | ANIM_VARIABLE_EFFORT, ANIM_STAND, ANIM_STAND, -1}, + //GIVING AID WHILE PRONE + {"PRN START AID" , 0, 90, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_FASTTURN | ANIM_NORESTART | ANIM_NONINTERRUPT | ANIM_LOWER_WEAPON | ANIM_LIGHT_EFFORT , ANIM_PRONE, ANIM_PRONE, -1}, + {"PRN GIVING AID" , 0, 120, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_FASTTURN | ANIM_NORESTART | ANIM_LIGHT_EFFORT , ANIM_PRONE, ANIM_PRONE, -1}, + {"PRN END AID" , 0, 90, (FLOAT)0, ANIM_STATIONARY | ANIM_TURNING | ANIM_FASTTURN | ANIM_NORESTART | ANIM_RAISE_WEAPON | ANIM_NO_EFFORT | ANIM_NOCHANGE_PENDINGCOUNT, ANIM_PRONE, ANIM_PRONE, -1}, + }; ANI_SPEED_DEF gubAnimWalkSpeeds[ TOTALBODYTYPES ] = @@ -1416,6 +1422,10 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ REGMALE ][ WALKING_RIFLE_RDY ] = RGMWALK_R_RDY; gubAnimSurfaceIndex[ REGMALE ][ WALKING_DUAL_RDY ] = RGMWALK_D_RDY; + gubAnimSurfaceIndex[ REGMALE ][ START_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceIndex[ REGMALE ][ GIVING_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceIndex[ REGMALE ][ END_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ STANDING][0] = RGMWATER_R_STD; gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ WALKING ][0] = RGMWATER_R_WALK; gubAnimSurfaceMidWaterSubIndex[ REGMALE ][ RUNNING ][0] = RGMWATER_R_WALK; @@ -1801,6 +1811,10 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ BIGMALE ][ WALKING_RIFLE_RDY ] = BGMWALK_R_RDY; gubAnimSurfaceIndex[ BIGMALE ][ WALKING_DUAL_RDY ] = BGMWALK_D_RDY; + gubAnimSurfaceIndex[ BIGMALE ][ START_AID_PRN ] = BGMMEDICPRN; + gubAnimSurfaceIndex[ BIGMALE ][ GIVING_AID_PRN ] = BGMMEDICPRN; + gubAnimSurfaceIndex[ BIGMALE ][ END_AID_PRN ] = BGMMEDICPRN; + gubAnimSurfaceItemSubIndex[ BIGMALE ][ STANDING ] = BGMPISTOLBREATH; gubAnimSurfaceItemSubIndex[ BIGMALE ][ WALKING ] = BGMNOTHING_WALK; gubAnimSurfaceItemSubIndex[ BIGMALE ][ RUNNING ] = BGMNOTHING_RUN; @@ -2202,6 +2216,10 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ STOCKYMALE ][ WALKING_RIFLE_RDY ] = RGMWALK_R_RDY; gubAnimSurfaceIndex[ STOCKYMALE ][ WALKING_DUAL_RDY ] = RGMWALK_D_RDY; + gubAnimSurfaceIndex[ STOCKYMALE ][ START_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceIndex[ STOCKYMALE ][ GIVING_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceIndex[ STOCKYMALE ][ END_AID_PRN ] = RGMMEDICPRN; + gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ STANDING ] = RGMPISTOLBREATH; gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ WALKING ] = RGMNOTHING_WALK; gubAnimSurfaceItemSubIndex[ STOCKYMALE ][ RUNNING] = RGMNOTHING_RUN; @@ -2582,6 +2600,9 @@ void InitAnimationSurfacesPerBodytype( ) gubAnimSurfaceIndex[ REGFEMALE ][ WALKING_RIFLE_RDY ] = RGFWALK_R_RDY; gubAnimSurfaceIndex[ REGFEMALE ][ WALKING_DUAL_RDY ] = RGFWALK_D_RDY; + gubAnimSurfaceIndex[ REGFEMALE ][ START_AID_PRN ] = RGFMEDICPRN; + gubAnimSurfaceIndex[ REGFEMALE ][ GIVING_AID_PRN ] = RGFMEDICPRN; + gubAnimSurfaceIndex[ REGFEMALE ][ END_AID_PRN ] = RGFMEDICPRN; gubAnimSurfaceItemSubIndex[ REGFEMALE ][ STANDING ] = RGFPISTOLBREATH; gubAnimSurfaceItemSubIndex[ REGFEMALE ][ WALKING ] = RGFNOTHING_WALK; @@ -3324,6 +3345,10 @@ BOOLEAN LoadAnimationStateInstructions( ) memcpy(gusAnimInst[WALKING_RIFLE_RDY],fuckTheBoundz[WALKING],sizeof(fuckTheBoundz[WALKING])); memcpy(gusAnimInst[WALKING_DUAL_RDY],fuckTheBoundz[WALKING],sizeof(fuckTheBoundz[WALKING])); + memcpy(gusAnimInst[START_AID_PRN],PRONE_START_FIRST_AID_AnimationScript,sizeof(PRONE_START_FIRST_AID_AnimationScript)); + memcpy(gusAnimInst[GIVING_AID_PRN],PRONE_GIVE_FIRST_AID_AnimationScript,sizeof(PRONE_GIVE_FIRST_AID_AnimationScript)); + memcpy(gusAnimInst[END_AID_PRN],fuckTheBoundz[END_AID],sizeof(fuckTheBoundz[END_AID])); + return( TRUE ); } diff --git a/Tactical/Animation Control.h b/Tactical/Animation Control.h index 8d2d41bb..aa599c8b 100644 --- a/Tactical/Animation Control.h +++ b/Tactical/Animation Control.h @@ -571,6 +571,10 @@ enum AnimationStates WALKING_RIFLE_RDY, WALKING_DUAL_RDY, + START_AID_PRN, + GIVING_AID_PRN, + END_AID_PRN, + NUMANIMATIONSTATES }; diff --git a/Tactical/Animation Data.cpp b/Tactical/Animation Data.cpp index 4f9a2513..4c083112 100644 --- a/Tactical/Animation Data.cpp +++ b/Tactical/Animation Data.cpp @@ -548,6 +548,9 @@ AnimationSurfaceType gAnimSurfaceDatabase[ NUMANIMATIONSURFACETYPES ] = RGFWALK_R_RDY, "ANIMS\\F_MERC\\F_R_RDY_WALK.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, RGFWALK_D_RDY, "ANIMS\\F_MERC\\F_DBL_RDY_WALK.STI", S_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, + RGMMEDICPRN, "ANIMS\\S_MERC\\S_PRN_MED.STI", C_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, + BGMMEDICPRN, "ANIMS\\M_MERC\\M_PRN_MED.STI", C_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, + RGFMEDICPRN, "ANIMS\\F_MERC\\F_PRN_MED.STI", C_STRUCT, 0, 8, TO_INIT, NULL, NULL, 0, -1, }; diff --git a/Tactical/Animation Data.h b/Tactical/Animation Data.h index 4bd99e87..40f3632b 100644 --- a/Tactical/Animation Data.h +++ b/Tactical/Animation Data.h @@ -577,6 +577,10 @@ BGMWITHSTONE, RGFWALK_R_RDY, RGFWALK_D_RDY, + RGMMEDICPRN, + BGMMEDICPRN, + RGFMEDICPRN, + NUMANIMATIONSURFACETYPES } AnimationSurfaceTypes; diff --git a/Tactical/Auto Bandage.cpp b/Tactical/Auto Bandage.cpp index dd84db42..8afe3bb7 100644 --- a/Tactical/Auto Bandage.cpp +++ b/Tactical/Auto Bandage.cpp @@ -489,7 +489,7 @@ void AutoBandage( BOOLEAN fStart ) ActionDone( MercPtrs[ ubLoop ] ); // If anyone is still doing aid animation, stop! - if ( MercPtrs[ ubLoop ]->usAnimState == GIVING_AID ) + if ( MercPtrs[ ubLoop ]->usAnimState == GIVING_AID || MercPtrs[ ubLoop ]->usAnimState == GIVING_AID_PRN ) { MercPtrs[ ubLoop ]->SoldierGotoStationaryStance( ); } diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 5c10a276..76f73fbc 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -5723,7 +5723,7 @@ void HandleTeamServices( UINT8 ubTeamNum ) fDone = FALSE; // Check for different events! // FOR DOING AID - if ( pTeamSoldier->usAnimState == GIVING_AID ) + if ( pTeamSoldier->usAnimState == GIVING_AID || pTeamSoldier->usAnimState == GIVING_AID_PRN ) { // Get medkit info usInHand = pTeamSoldier->inv[ HANDPOS ].usItem; @@ -5811,7 +5811,7 @@ void HandlePlayerServices( SOLDIERTYPE *pTeamSoldier ) { // Check for different events! // FOR DOING AID - if ( pTeamSoldier->usAnimState == GIVING_AID ) + if ( pTeamSoldier->usAnimState == GIVING_AID || pTeamSoldier->usAnimState == GIVING_AID_PRN ) { // Get medkit info usInHand = pTeamSoldier->inv[ HANDPOS ].usItem; diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp index bb1f5eb6..73b82219 100644 --- a/Tactical/Soldier Ani.cpp +++ b/Tactical/Soldier Ani.cpp @@ -3008,6 +3008,10 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) PlaySoldierJA2Sample( pSoldier->ubID, FENCE_OPEN, RATE_11025, SoundVolume( HIGHVOLUME, pSoldier->sGridNo ), 1, SoundDir( pSoldier->sGridNo ), TRUE ); break; + case 792: + + + break; } // Adjust frame control pos, and try again pSoldier->usAniCode++; @@ -3019,6 +3023,12 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) pSoldier->usAniCode = 0; } + else if ( sNewAniFrame > 999 ) + { + // Jump, to animation script ( in the 300+ range ) + pSoldier->EVENT_InitNewSoldierAnim( (UINT16)(sNewAniFrame - 700 ), 0 , FALSE ); + return( TRUE ); + } // Loop here until we break on a real item! } while ( TRUE ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 928c9010..8fbd074a 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -3048,6 +3048,21 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart } } + if ( usNewState == START_AID_PRN ) + { + if ( this->ubPendingDirection != NO_PENDING_DIRECTION ) + { + this->EVENT_SetSoldierDesiredDirection( this->ubPendingDirection ); + this->ubPendingDirection = NO_PENDING_DIRECTION; + this->usPendingAnimation = START_AID_PRN; + this->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_ON; + this->flags.fTurningUntilDone = TRUE; + this->ubPendingStanceChange = ANIM_PRONE; + this->SoldierGotoStationaryStance( ); + return( TRUE ); + } + } + // ATE: Don't raise/lower automatically if we are low on health, // as our gun looks lowered anyway.... //if ( this->stats.bLife > INJURED_CHANGE_THREASHOLD ) @@ -3162,7 +3177,7 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart }*/ // Alrighty, check if we should free buddy up! - if ( usNewState == GIVING_AID ) + if ( usNewState == GIVING_AID || usNewState == GIVING_AID_PRN ) { UnSetUIBusy( this->ubID ); } @@ -3748,6 +3763,7 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart //break; case START_AID: + case START_AID_PRN: DeductPoints( this, APBPConstants[AP_START_FIRST_AID], APBPConstants[BP_START_FIRST_AID] ); break; @@ -6606,8 +6622,20 @@ void SOLDIERTYPE::SoldierGotoStationaryStance( void ) } else if ( this->ubServicePartner != NOBODY && this->stats.bLife >= OKLIFE && this->bBreath > 0 ) { - if(!is_networked)this->EVENT_InitNewSoldierAnim( GIVING_AID, 0 , FALSE ); - else this->ChangeSoldierState( GIVING_AID, 0, 0 ); + if ( gAnimControl[ this->usAnimState ].ubEndHeight == ANIM_PRONE ) + { + if(!is_networked) + this->EVENT_InitNewSoldierAnim( GIVING_AID_PRN, 0 , FALSE ); + else + this->ChangeSoldierState( GIVING_AID_PRN, 0, 0 ); + } + else + { + if(!is_networked) + this->EVENT_InitNewSoldierAnim( GIVING_AID, 0 , FALSE ); + else + this->ChangeSoldierState( GIVING_AID, 0, 0 ); + } } else @@ -11568,25 +11596,38 @@ void SOLDIERTYPE::EVENT_SoldierBeginFirstAid( INT32 sGridNo, UINT8 ubDirection ) // any now... this->InternalGivingSoldierCancelServices( FALSE ); + BOOLEAN fInProne = FALSE; + if ( gAnimControl[ this->usAnimState ].ubEndHeight == ANIM_PRONE && gAnimControl[ pTSoldier->usAnimState ].ubEndHeight == ANIM_PRONE && this->fDoingSurgery == FALSE ) + { + fInProne = TRUE; + } // CHANGE DIRECTION AND GOTO ANIMATION NOW this->EVENT_SetSoldierDesiredDirection( ubDirection ); this->EVENT_SetSoldierDirection( ubDirection ); - // CHECK OUR STANCE AND GOTO CROUCH IF NEEDED - //if ( gAnimControl[ this->usAnimState ].ubEndHeight != ANIM_CROUCH ) - //{ - // SET DESIRED STANCE AND SET PENDING ANIMATION - // SendChangeSoldierStanceEvent( this, ANIM_CROUCH ); - // this->usPendingAnimation = START_AID; - //} - //else + // CHANGE TO ANIMATION + if ( fInProne ) + { + // HACK! If we are not prone after the above stance change and we should be, send us down before start + if ( gAnimControl[ this->usAnimState ].ubEndHeight != ANIM_PRONE ) + { + this->usPendingAnimation = START_AID_PRN; + SendChangeSoldierStanceEvent( this, ANIM_PRONE ); + } + else + { + if(!is_networked) + this->EVENT_InitNewSoldierAnim( START_AID_PRN, 0 , FALSE ); + else + this->ChangeSoldierState( START_AID_PRN, 0, 0 ); + } + } + else { - // CHANGE TO ANIMATION if(!is_networked) this->EVENT_InitNewSoldierAnim( START_AID, 0 , FALSE ); else this->ChangeSoldierState( START_AID, 0, 0 ); - } // SET TARGET GRIDNO @@ -11697,6 +11738,17 @@ UINT32 SOLDIERTYPE::SoldierDressWound( SOLDIERTYPE *pVictim, INT16 sKitPts, INT1 { uiPossible += ( uiPossible / 2); // add extra 50 % } + + // when prone, bandaging is harder + if ( gAnimControl[ this->usAnimState ].ubEndHeight == ANIM_PRONE ) + { + // if we bandage ourselves, make it rather had when prone + if ( this->ubID == pVictim->ubID ) + uiPossible = uiPossible / 2; // -50% speed + else + uiPossible = uiPossible * 4 / 5; // -20% speed + } + // Doctor trait improves basic bandaging ability if (!(fOnSurgery) && gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( this, DOCTOR_NT )) { @@ -12051,8 +12103,20 @@ void SOLDIERTYPE::InternalReceivingSoldierCancelServices( BOOLEAN fPlayEndAnim ) // don't use end aid animation in autobandage if ( pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bBreath > 0 && fPlayEndAnim ) { - if(!is_networked)pTSoldier->EVENT_InitNewSoldierAnim( END_AID, 0 , FALSE ); - else pTSoldier->ChangeSoldierState( END_AID, 0, 0 ); + if ( gAnimControl[ pTSoldier->usAnimState ].ubEndHeight == ANIM_PRONE ) + { + if(!is_networked) + pTSoldier->EVENT_InitNewSoldierAnim( END_AID_PRN, 0 , FALSE ); + else + pTSoldier->ChangeSoldierState( END_AID_PRN, 0, 0 ); + } + else + { + if(!is_networked) + pTSoldier->EVENT_InitNewSoldierAnim( END_AID, 0 , FALSE ); + else + pTSoldier->ChangeSoldierState( END_AID, 0, 0 ); + } } } @@ -12101,8 +12165,20 @@ void SOLDIERTYPE::InternalGivingSoldierCancelServices( BOOLEAN fPlayEndAnim ) if ( this->stats.bLife >= OKLIFE && this->bBreath > 0 && fPlayEndAnim ) { // don't use end aid animation in autobandage - if(!is_networked)this->EVENT_InitNewSoldierAnim( END_AID, 0 , FALSE ); - else this->ChangeSoldierState( END_AID, 0, 0 ); + if ( gAnimControl[ this->usAnimState ].ubEndHeight == ANIM_PRONE ) + { + if(!is_networked) + this->EVENT_InitNewSoldierAnim( END_AID_PRN, 0 , FALSE ); + else + this->ChangeSoldierState( END_AID_PRN, 0, 0 ); + } + else + { + if(!is_networked) + this->EVENT_InitNewSoldierAnim( END_AID, 0 , FALSE ); + else + this->ChangeSoldierState( END_AID, 0, 0 ); + } } } }