- 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
This commit is contained in:
Wanne
2012-05-06 15:14:05 +00:00
parent 3a479ccdc5
commit 4ad4f6c223
9 changed files with 158 additions and 22 deletions
+15 -1
View File
@@ -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)
{
+26 -1
View File
@@ -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 );
}
+4
View File
@@ -571,6 +571,10 @@ enum AnimationStates
WALKING_RIFLE_RDY,
WALKING_DUAL_RDY,
START_AID_PRN,
GIVING_AID_PRN,
END_AID_PRN,
NUMANIMATIONSTATES
};
+3
View File
@@ -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,
};
+4
View File
@@ -577,6 +577,10 @@ BGMWITHSTONE,
RGFWALK_R_RDY,
RGFWALK_D_RDY,
RGMMEDICPRN,
BGMMEDICPRN,
RGFMEDICPRN,
NUMANIMATIONSURFACETYPES
} AnimationSurfaceTypes;
+1 -1
View File
@@ -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( );
}
+2 -2
View File
@@ -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;
+10
View File
@@ -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 );
+93 -17
View File
@@ -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 );
}
}
}
}