From: SakirSoft <sak...@us...> - 2005-07-09 21:51:50
|
Update of /cvsroot/openmugen/OpenMugen/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2045 Modified Files: player.cpp player.h Log Message: Add ChangeAnim2 controller Index: player.cpp =================================================================== RCS file: /cvsroot/openmugen/OpenMugen/src/player.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -p -r1.11 -r1.12 --- player.cpp 6 Jul 2005 19:00:21 -0000 1.11 +++ player.cpp 9 Jul 2005 21:51:41 -0000 1.12 @@ -37,6 +37,7 @@ CPlayer::CPlayer() bMoveHitPresit=false; bHitDef=false; bPause=false; + bHitTarget = false; nLife=1000; nPower=2000; nStateTime=0; @@ -47,6 +48,10 @@ CPlayer::CPlayer() xVel=0; yVel=0; nSprPrio=5; + AttackerPlayer = 0; + + TargetListNum = 0; + memset( TargetList,0,sizeof(CPlayer*)); //this should be a unique player id number @@ -69,6 +74,9 @@ CPlayer::CPlayer() m_pCmdManager = new CCmdManager; m_pSndManager = new CSoundManager; + //keep a copy of it to restore a player from costum states from the opponent player + m_OrginStateManager = m_pStateManager; + } CPlayer::CPlayer(CSffManager *sff,CAirManager *air,CStateManager *state,CVirtualMachine *vm) @@ -84,7 +92,8 @@ CPlayer::~CPlayer() { delete m_pSffManager; delete m_pAirManager; - delete m_pStateManager; + //delete m_pStateManager; + delete m_OrginStateManager; // it is safer delete m_pCmdManager; delete m_pControllerExec; delete m_pVMachine; @@ -601,7 +610,12 @@ PlayHit sound, apply hit pause, Create s */ void CPlayer::HandleHit(CPlayer *opponent) { + opponent->SetInHitVar(myGetHitVar); + + opponent->SetAttacker( this ); + + if(myGetHitVar.groundtype == 3) opponent->ChangeState(5070); @@ -614,6 +628,13 @@ void CPlayer::HandleHit(CPlayer *opponen opponent->SetupGetHit(); + + if( myGetHitVar.p1StateNo != -1 ) + ChangeState( myGetHitVar.p1StateNo ); + + if( myGetHitVar.p2StateNo != -1 ) + opponent->ChangeState( myGetHitVar.p2StateNo, m_OrginStateManager ); + /*play hit sound sound*/ if( myGetHitVar.bPlayerSnd ) PlaySnd(myGetHitVar.snd_grp,myGetHitVar.snd_item); @@ -635,7 +656,11 @@ void CPlayer::HandleHit(CPlayer *opponen mugen->GetEngine()->AddObject( explod ); - bHitDef=false; + //add target to list + AddTargetToList( opponent ); + + /*bHitDef=false; */ + bHitTarget = true; } /* @@ -674,7 +699,9 @@ void CPlayer::HandleGuard(CPlayer *oppon pause->SetPauseTime( myGetHitVar.guardPauseTime); mugen->GetEngine()->AddObject( pause ); - bHitDef=false; + /*bHitDef=false;*/ + bHitTarget = true; + } } /* @@ -775,7 +802,7 @@ void CPlayer::HandlePushBehavior(CPlayer //This is for turning if( (nDistanceX < 0) && ( y == nGround ) && - (nCurrAnimNumber != 5 ) && (nCurrStateNumber != 52) ) + (nCurrAnimNumber != 5 ) && (nCurrStateNumber == 0) ) { if(GetRightFaced()) FaceLeft(); @@ -797,7 +824,7 @@ void CPlayer::HandlePushBehavior(CPlayer TODO:Handle air push */ if(nBodyDistanceX <= 0 && ( opponent->GetPosY() == GetPosY()) && - (nCurrStateNumber != 52) ) + ( GetRightFaced() != opponent->GetRightFaced() ) ) { opponent->PushPlayer(nBodyDistanceX); xVel*=ConstData.Movement.standFriction; @@ -830,6 +857,8 @@ void CPlayer::CheckGlobalStatus() { /*CPlayer *p2=m_pEngine->GetPlayerList();*/ list<CBaseObject*>* ObjList = m_pEngine->GetObjectList(); + + bHitTarget = false; HandlePhysic(); UpDateFacing(); @@ -857,6 +886,10 @@ void CPlayer::CheckGlobalStatus() } + //we hit a target so disable the hit def ) + if( bHitTarget ) + bHitDef = false; + } @@ -870,7 +903,7 @@ ToDo: Handle interaction with other play void CPlayer::Think() { DrawPlayer(); -// ShowClsn(); + // ShowClsn(); if( bPause ) return; @@ -950,6 +983,7 @@ void CPlayer::Debug() m_pVideoSystem->DrawText(0,60,"Life=%i | Power= %i",nLife,nPower); m_pVideoSystem->DrawText(0,70,"Ctrl = %i | Command = %s | facing %i ",bCtrl,strCommand,bRightFaced ? 1 : -1 ); m_pVideoSystem->DrawText(0,80,"P2Dist %f %f", nDistanceX , nDistanceY ); + m_pVideoSystem->DrawText(0,90,"NumTargets %i",TargetListNum ); } @@ -1029,7 +1063,7 @@ void CPlayer::PushPlayer(float nPushValu ======================= This effect to the current state of the player */ -void CPlayer::ChangeState(s32 nStateNumber) +void CPlayer::ChangeState(s32 nStateNumber,CStateManager *pOtherStateDef) { //restet StateTime nStateTime=0; @@ -1044,6 +1078,9 @@ void CPlayer::ChangeState(s32 nStateNumb } } + if( pOtherStateDef > 0 ) + m_pStateManager = pOtherStateDef; + lpCurrStatedef=m_pStateManager->GetStateDef(nStateNumber); // PrintMessage("change state %i",nStateNumber); @@ -1052,6 +1089,8 @@ void CPlayer::ChangeState(s32 nStateNumb if( !bHitDefPresit ) { bHitDef=0; + TargetListNum = 0; + memset( TargetList,0,sizeof(CPlayer*)); } if( lpCurrStatedef==0 ) @@ -1112,6 +1151,16 @@ void CPlayer::ChangeAnim(s32 nAnimNumber nCurrAnimNumber=nAnimNumber; } +void CPlayer::ChangeAnim2(s32 nAnimNumber,u16 nCurrElem) +{ + if( AttackerPlayer ) + { + ActionElement *Anim = AttackerPlayer->GetAir()->GetAction(nAnimNumber); + m_pSffManager->PrepareAnim2(nAnimNumber,Anim,nCurrElem); + + } +} + //Draw the Player void CPlayer::DrawPlayer() { @@ -1137,6 +1186,43 @@ bool CPlayer::IsAnimAviable(s32 nAnim) return true; } +/* +================================================================================ +Adds a target to the players target list +This list gets invalid when a changestate is executed and hitdef presist is false +================================================================================ +*/ +void CPlayer::AddTargetToList(CPlayer *target) +{ + if( TargetListNum == MaxTargets ) + throw(CError("Too many targets")); + + for( int i=0;i < MaxTargets;i++) + { + if( TargetList[i] == target ) + return; + } + + TargetList[TargetListNum] = target; + TargetListNum++; +} + +CPlayer* CPlayer::GetTargetById(s16 id) +{ + for( int i=0;i < TargetListNum;i++) + { + if( TargetList[i]->GetPlayerId() == id ) + return TargetList[i]; + } + return 0; +} + +CPlayer **CPlayer::GetAllTargets(int &indexSize) +{ + indexSize = TargetListNum; + return TargetList; +} + /* ================================================================================ @@ -1191,6 +1277,7 @@ u32 CPlayer::GetDuringTime() void CPlayer::SetPosX(float xPos){x=320/2+xPos;} + void CPlayer::SetPosY(float yPos){y=nGround+yPos;} void CPlayer::PosAddX(float xPos){if (bRightFaced) x+=xPos; else x-=xPos; } void CPlayer::PosAddY(float yPos){y+=yPos;} Index: player.h =================================================================== RCS file: /cvsroot/openmugen/OpenMugen/src/player.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -p -r1.8 -r1.9 --- player.h 6 Jul 2005 18:59:44 -0000 1.8 +++ player.h 9 Jul 2005 21:51:41 -0000 1.9 @@ -208,12 +208,17 @@ struct HitVar bool bPlayerSnd; bool bGuardPlayerSnd; bool bPlayerSpark; + s32 p1StateNo; + s32 p2StateNo; }; + void LoadPlayerDef(const char* strPlayerDef,PlayerDef &playerdef); PlayerConst LoadPlayerConst(const char* strPlayerConst); +const int MaxTargets = 20; + class CPlayer :public CBaseObject { CAllocater *m_pAlloc; @@ -226,6 +231,7 @@ CGameTimer *m_pTimer; CVirtualMachine *m_pVMachine; CControllerExecuter *m_pControllerExec; CEngine *m_pEngine; +CStateManager *m_OrginStateManager; CInputProcessor *m_pInputProcessor; CCmdManager *m_pCmdManager; @@ -234,6 +240,11 @@ CCmdManager *m_pCmdManager; HitVar myGetHitVar; HitVar InHitVar; +CPlayer* TargetList[MaxTargets]; +int TargetListNum; +CPlayer* AttackerPlayer; + + //Player information float x,y; float xVel,yVel; @@ -262,6 +273,7 @@ bool bCtrl; bool bRightFaced; bool bDebugInfo; bool bHitDef; +bool bHitTarget; bool bAlive; bool bIsHelper; bool bChangeState; @@ -351,7 +363,7 @@ enum EffectTeam enum HitPrior { - Hit=0, + Hit=1, Doge, Miss, @@ -384,6 +396,7 @@ enum HitPrior //Set functions void ResetPlayer(); void SetPosX(float xPos); + void SetGlobalPosX(float xPos) {x=xPos;} void SetPosY(float yPos); void PosAddX(float xPos); void PosAddY(float yPos); @@ -419,14 +432,17 @@ enum HitPrior u32 GetDuringTime(); //Player Controllers - void ChangeState(s32 nSateNumber); + void ChangeState(s32 nSateNumber,CStateManager *pOtherStateDef = 0); void ChangeAnim(s32 nAnimNumber,u16 nCurrElem=1); + void ChangeAnim2(s32 nAnimNumber,u16 nCurrElem=1); void SetIntVar(int index,float value); void SetFloatVar(int index,float value); void SetSysIntVar(int index,float value); void SetSysFloatVar(int index,float value); void PlaySnd(s32 nGpr,s32 nItem,bool bLooped=false,u8 nLeftPan=255,u8 nRightPan=255); void SetAttackDist(float dist); + void RestoreState() {m_pStateManager = m_OrginStateManager; } + void SetAttacker(CPlayer *attacker) {AttackerPlayer = attacker; } //trigger functions char *GetCommand(); @@ -459,12 +475,17 @@ enum HitPrior s32 GetStateNumber(); s32 GetPrevStateNumber(); s16 GetPower(); + s16 GetPlayerId() {return nPlayerID;} u32 GetStateTime(); HitVar GetVarHit(); u8 GetSprPrio(); CSffManager *GetSff(); + CAirManager *GetAir(){ return m_pAirManager; } + CPlayer *GetTargetById(s16 id); + CPlayer **GetAllTargets(int &indexSize); private: + void AddTargetToList(CPlayer *target); bool CheckState(PLSTATE* tempState); bool CheckClsn1Collision(ClsnRECT Clsn1,ClsnRECT Clsn2); void ExecuteController(PLSTATE* tempState); |