www.pudn.com > XmudOSr.rar > 3DAnimation.cpp


#include "stdafx.h" 
#include "XMudClient.h" 
#include "D3DRMScreen.h" 
#include "3DSound.h" 
#include "3DFunction.h" 
#include "MainScreen.h" 
#include "MenuCreateNew.h" 
#include "Internetmsg.h" 
 
D3DVECTOR g_CameraPosition; 
 
extern LPDIRECT3DRMFRAME3 g_lpplayer; 
extern LPDIRECT3DRMFRAME3 g_pChaseFrame; 
extern LPDIRECT3DRMFRAME3 g_sFrame; 
extern LPDIRECT3DRM3 g_lpD3DRM; 
extern PathInfo info; 
 
extern rmfullglobals myglobs; 
extern int g_playerState; 
extern BOOL g_GetSameMove; 
extern CMainScreen m_MainScreen; 
 
extern CRITICAL_SECTION csAnimation; 
extern CList  animationlist; 
extern CListplayerlist; 
 
extern int	g_nReceiveMsgState,g_nGameState,nSpareTime,nRecTimes; 
 
float g_fightreadyDelta = 4.00f/40.0f; 
 BOOL bRestartAlready=FALSE; 
extern SOCKET hLCltForRSvrSock; 
 
void __cdecl animationCallback(LPDIRECT3DRMFRAME3 obj, LPVOID arg,  
                               D3DVALUE delta) 
{ 
  D3DVECTOR *path; 
  animationCallbackArgs* cb; 
  animationCallbackArgs* cbfight; 
  D3DVECTOR playerpos,sFramepos,pSoundPos,tmpSoundPos,camerapos; 
  D3DVECTOR Npcposite; 
  int i,j,k; 
  BOOL bM = FALSE; 
  TFightTag *lpFightTag; 
   
  g_lpplayer->GetPosition(myglobs.scene, &playerpos); 
   
  EnterCriticalSection(&csAnimation); 
  j = animationlist.GetCount(); 
  if(j < 2) 
  { 
    bM = TRUE; 
    j = 3; 
  } 
  for(i=0;iframe3obj; 
    if( i != 0 ){ 
      if(cb->cXFileType == "NPC"){ 
        switch( cb->PlayerState ){ 
        case STOP: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if(cb->time > STOP_START + NUM_STOP_FRAMES)	{ 
              cb->time = STOP_START; 
            }else{ 
              if(cb->way!=-1)	{ 
                if(!m_MainScreen.bSelectOne)	{ 
                  cb->time = LEFTGO_START; 
                  cb->PlayerState = LEFTGO; 
                } 
              }else	{ 
                cb->frame3obj->GetPosition(myglobs.scene,&Npcposite); 
                g_pChaseFrame->SetPosition(myglobs.scene,Npcposite.x,Npcposite.y,playerpos.z); 
                cb->frame3obj->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); 
              } 
            } 
          } 
          break; 
           
        case LEFTGO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta)*2; 
            if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES){ 
              Npcposite = GetNextPosite(cb->frame3obj,cb); 
               
              g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
              cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
              cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
               
              cb->time = RIGHTGO_START; 
              cb->PlayerState = RIGHTGO; 
            } 
            if(m_MainScreen.bSelectOne) 
            { 
              if(m_MainScreen.szSelectEName == cb->cXFileName) 
              { 
                cb->time = STOP_START; 
                cb->PlayerState = STOP; 
              } 
            } 
          } 
          break; 
        case RIGHTGO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta)*2; 
            if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ 
              Npcposite = GetNextPosite(cb->frame3obj,cb); 
               
              g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
              cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
              cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
               
              cb->time = LEFTGO_START; 
              cb->PlayerState = LEFTGO; 
            } 
            if(m_MainScreen.bSelectOne) 
            { 
              if(m_MainScreen.szSelectEName == cb->cXFileName) 
              { 
                cb->time = STOP_START; 
                cb->PlayerState = STOP; 
              } 
            } 
          } 
          break; 
        case FIGHTREADY: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time > FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) 
            { 
              k = cb->fightopplist.GetCount(); 
              if(k==0)break; 
              k = rand()%k; 
              lpFightTag = cb->fightopplist.GetAt(cb->fightopplist.FindIndex(k)); 
              cbfight = animationlist.GetAt(lpFightTag->tagPosite); 
              switch(rand()%10) 
              { 
              case 0: 
                { 
                  cb->time = HAND_START; 
                  cb->PlayerState = HAND; 
                   
                  switch( rand() % 2 ) 
                  { 
                  case 0: 
                    cbfight->time = WOUND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = WOUND; 
                    else 
                      cbfight->PlayerState = WOUND; 
                    break; 
                  case 1: 
                    cbfight->time = GURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = GURAD; 
                    else 
                      cbfight->PlayerState = GURAD; 
                    break; 
                  } 
                } 
                break; 
              case 1: 
                { 
                  cb->time = FOOT_START; 
                  cb->PlayerState = FOOT; 
                   
                  switch( rand() % 2 ) 
                  { 
                  case 0: 
                    cbfight->time = WOUND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = WOUND; 
                    else 
                      cbfight->PlayerState = WOUND; 
                    break; 
                  case 1: 
                    cbfight->time = GURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = GURAD; 
                    else 
                      cbfight->PlayerState = GURAD; 
                    break; 
                  } 
                } 
                break; 
              case 2://NPC受伤,有可能被拳击中,也有可能被踢中,也有可能对手泰山压顶 
                { 
                  cb->time = WOUND_START; 
                  cb->PlayerState = WOUND; 
                   
                  switch( rand() % 4 ) 
                  { 
                  case 0: 
                    cbfight->time = HAND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HAND; 
                    else 
                      cbfight->PlayerState = HAND; 
                    break; 
                  case 1: 
                    cbfight->time = FOOT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = FOOT; 
                    else 
                      cbfight->PlayerState = FOOT; 
                    break; 
                  case 2: 
                    cbfight->time = HANDEXT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HANDEXT; 
                    else 
                      cbfight->PlayerState = HANDEXT; 
                    break; 
                  case 3: 
                    cbfight->time = FOOTEXT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = FOOTEXT; 
                    else 
                      cbfight->PlayerState = FOOTEXT; 
                    break; 
                  } 
                } 
                break; 
              case 3: 
                { 
                  cb->time = GURAD_START; 
                  cb->PlayerState = GURAD; 
                  switch( rand() % 2 ){ 
                  case 0: 
                    cbfight->time = HAND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HAND; 
                    else 
                      cbfight->PlayerState = HAND; 
                    break; 
                  case 1: 
                    cbfight->time = HANDEXT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HANDEXT; 
                    else 
                      cbfight->PlayerState = HANDEXT; 
                    break; 
                  } 
                } 
                break; 
              case 4: 
                { 
                  cb->time = HANDEXTGURAD_START; 
                  cb->PlayerState = HANDEXTGURAD; 
                   
                  switch( rand() % 3 ){ 
                  case 0: 
                    cbfight->time = HAND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HAND; 
                    else 
                      cbfight->PlayerState = HAND; 
                    break; 
                  case 1: 
                    cbfight->time = HANDEXT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HANDEXT; 
                    else 
                      cbfight->PlayerState = HANDEXT; 
                    break; 
                  case 2: 
                    cbfight->time = FOOTEXT_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = FOOTEXT; 
                    else 
                      cbfight->PlayerState = FOOTEXT; 
                    break; 
                  } 
                } 
                break; 
              case 5: 
                { 
                  cb->time = HANDEXT_START; 
                  cb->PlayerState = HANDEXT; 
                  switch( rand() % 3 ){ 
                  case 0: 
                    cbfight->time = WOUND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = WOUND; 
                    else 
                      cbfight->PlayerState = WOUND; 
                    break; 
                  case 1: 
                    cbfight->time = HANDEXTGURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HANDEXTGURAD; 
                    else 
                      cbfight->PlayerState = HANDEXTGURAD; 
                    break; 
                  case 2: 
                    cbfight->time = GURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = GURAD; 
                    else 
                      cbfight->PlayerState = GURAD; 
                    break; 
                  } 
                } 
                break; 
              case 6: 
                { 
                  cb->time = FOOTEXT_START; 
                  cb->PlayerState = FOOTEXT; 
                   
                  switch( rand() % 2 ) 
                  { 
                  case 0: 
                    cbfight->time = WOUND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = WOUND; 
                    else 
                      cbfight->PlayerState = WOUND; 
                    break; 
                  case 1: 
                    cbfight->time = HANDEXTGURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = HANDEXTGURAD; 
                    else 
                      cbfight->PlayerState = HANDEXTGURAD; 
                    break; 
                  } 
                } 
                break; 
              case 7: 
                { 
                  cb->time = FOOTLOW_START; 
                  cb->PlayerState = FOOTLOW; 
                   
                  switch( rand() % 2 ){ 
                  case 0: 
                    cbfight->time = FOOTLOWWOUND_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = FOOTLOWWOUND; 
                    else 
                      cbfight->PlayerState = FOOTLOWWOUND; 
                    break; 
                  case 1: 
                    cbfight->time = FOOTLOWGURAD_START; 
                    if( cbfight->cXFileName.IsEmpty() ) 
                      g_playerState = FOOTLOWGURAD; 
                    else 
                      cbfight->PlayerState = FOOTLOWGURAD; 
                    break; 
                  } 
                } 
                break; 
              case 8: 
                { 
                  cb->time = FOOTLOWWOUND_START; 
                  cb->PlayerState = FOOTLOWWOUND; 
                  cbfight->time = FOOTLOW_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTLOW; 
                  else 
                    cbfight->PlayerState = FOOTLOW; 
                } 
                break; 
              case 9: 
                { 
                  cb->time = FOOTLOWGURAD_START; 
                  cb->PlayerState = FOOTLOWGURAD; 
                  cbfight->time = FOOTLOW_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTLOW; 
                  else 
                    cbfight->PlayerState = FOOTLOW; 
                  break; 
                } 
              } 
            } 
          } 
          break; 
        case HAND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >HAND_START + NUM_HAND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case HANDEXT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time > HANDEXT_START + NUM_HAND_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOT_START + NUM_FOOT_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTEXT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOW: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case WOUND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOWWOUND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case GURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >GURAD_START + NUM_GURAD_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case HANDEXTGURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOWGURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOWGURAD_START + NUM_HAND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case DAZUO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) 
              cb->time = DAZUO_START; 
          } 
          break; 
        case SLEEP: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) 
              cb->time = SLEEP_START; 
          } 
          break; 
        case DEAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >DEAD_START + NUM_DEAD_FRAMES) 
              cb->time = DEAD_START; 
          } 
          break; 
        case DRINK: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >DRINK_START + NUM_DRINK_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case EAT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >EAT_START + NUM_EAT_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case PRACTICE: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case KETOU: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >KETOU_START + NUM_KETOU_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        } 
      }else if(cb->cXFileType == "OTHERPLAY"){ 
        switch(cb->PlayerState){ 
        case STOP: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time > STOP_START + NUM_STOP_FRAMES){ 
              cb->time = STOP_START; 
            }else{ 
              if(!g_GetSameMove){ 
                if(!m_MainScreen.bSelectOne){ 
                  cb->time = LEFTGO_START; 
                  cb->PlayerState = LEFTGO; 
                } 
              } 
            } 
          } 
          break; 
        case LEFTGO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta)*2; 
            if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES){ 
              if(!g_GetSameMove){ 
                Npcposite = GetNextPosite(cb->frame3obj,cb); 
                g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
                cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
                cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
              }else{ 
                if(cb->pathlist.IsEmpty()){ 
                  cb->time = STOP_START; 
                  cb->PlayerState = STOP; 
                  break; 
                } 
                path = cb->pathlist.GetHead(); 
                g_pChaseFrame->SetPosition( myglobs.scene,path->x, path->y, path->z); 
                cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
                cb->frame3obj->SetPosition( myglobs.scene,path->x, path->y, path->z); 
                cb->pathlist.RemoveHead(); 
                delete path; 
              } 
              cb->time = RIGHTGO_START; 
              cb->PlayerState = RIGHTGO; 
            } 
            if(m_MainScreen.bSelectOne) 
            { 
              if(m_MainScreen.szSelectEName == cb->cXFileName) 
              { 
                cb->time = STOP_START; 
                cb->PlayerState = STOP; 
              } 
            } 
          } 
          break; 
        case RIGHTGO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta)*2; 
            if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ 
              if(!g_GetSameMove) 
              { 
                Npcposite = GetNextPosite(cb->frame3obj,cb); 
                g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
                cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
                cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); 
              } 
              else 
              { 
                if(cb->pathlist.IsEmpty()) 
                { 
                  cb->time = STOP_START; 
                  cb->PlayerState = STOP; 
                  break; 
                } 
                path = cb->pathlist.GetHead(); 
                 
                g_pChaseFrame->SetPosition( myglobs.scene,path->x, path->y, path->z); 
                cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); 
                cb->frame3obj->SetPosition( myglobs.scene,path->x, path->y, path->z); 
                 
                cb->pathlist.RemoveHead(); 
                delete path; 
              } 
              cb->time = LEFTGO_START; 
              cb->PlayerState = LEFTGO; 
            } 
            if(m_MainScreen.bSelectOne) 
            { 
              if(m_MainScreen.szSelectEName == cb->cXFileName) 
              { 
                cb->time = STOP_START; 
                cb->PlayerState = STOP; 
              } 
            } 
          } 
          break; 
        case FIGHTREADY: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) 
            { 
              k = cb->fightopplist.GetCount(); 
              if(k==0)break; 
              k = rand()%k; 
              lpFightTag = cb->fightopplist.GetAt(cb->fightopplist.FindIndex(k)); 
              cbfight = animationlist.GetAt(lpFightTag->tagPosite); 
              switch(rand()%10){ 
              case 0: 
                cb->time = HAND_START; 
                cb->PlayerState = HAND; 
                 
                switch( rand() % 2 ){ 
                case 0: 
                  cbfight->time = WOUND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = WOUND; 
                  else 
                    cbfight->PlayerState = WOUND; 
                  break; 
                case 1: 
                  cbfight->time = GURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = GURAD; 
                  else 
                    cbfight->PlayerState = GURAD; 
                  break; 
                } 
                break; 
              case 1: 
                cb->time = FOOT_START; 
                cb->PlayerState = FOOT; 
                 
                switch( rand() % 2 ){ 
                case 0: 
                  cbfight->time = WOUND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = WOUND; 
                  else 
                    cbfight->PlayerState = WOUND; 
                  break; 
                case 1: 
                  cbfight->time = GURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = GURAD; 
                  else 
                    cbfight->PlayerState = GURAD; 
                  break; 
                } 
                break; 
              case 2://NPC受伤,有可能被拳击中,也有可能被踢中,也有可能对手泰山压顶 
                cb->time = WOUND_START; 
                cb->PlayerState = WOUND; 
                 
                switch( rand() % 4 ) 
                { 
                case 0: 
                  cbfight->time = HAND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HAND; 
                  else 
                    cbfight->PlayerState = HAND; 
                  break; 
                case 1: 
                  cbfight->time = FOOT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOT; 
                  else 
                    cbfight->PlayerState = FOOT; 
                  break; 
                case 2: 
                  cbfight->time = HANDEXT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HANDEXT; 
                  else 
                    cbfight->PlayerState = HANDEXT; 
                  break; 
                case 3: 
                  cbfight->time = FOOTEXT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTEXT; 
                  else 
                    cbfight->PlayerState = FOOTEXT; 
                  break; 
                } 
                break; 
              case 3: 
                cb->time = GURAD_START; 
                cb->PlayerState = GURAD; 
                 
                switch( rand() % 2 ) 
                { 
                case 0: 
                  cbfight->time = HAND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HAND; 
                  else 
                    cbfight->PlayerState = HAND; 
                  break; 
                case 1: 
                  cbfight->time = HANDEXT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HANDEXT; 
                  else 
                    cbfight->PlayerState = HANDEXT; 
                  break; 
                } 
                break; 
              case 4: 
                cb->time = HANDEXTGURAD_START; 
                cb->PlayerState = HANDEXTGURAD; 
 
                switch( rand() % 3 ){ 
                case 0: 
                  cbfight->time = HAND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HAND; 
                  else 
                    cbfight->PlayerState = HAND; 
                  break; 
                case 1: 
                  cbfight->time = HANDEXT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HANDEXT; 
                  else 
                    cbfight->PlayerState = HANDEXT; 
                  break; 
                case 2: 
                  cbfight->time = FOOTEXT_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTEXT; 
                  else 
                    cbfight->PlayerState = FOOTEXT; 
                  break; 
                } 
                break; 
              case 5: 
                cb->time = HANDEXT_START; 
                cb->PlayerState = HANDEXT; 
                 
                switch( rand() % 3 ){ 
                case 0: 
                  cbfight->time = WOUND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = WOUND; 
                  else 
                    cbfight->PlayerState = WOUND; 
                  break; 
                case 1: 
                  cbfight->time = HANDEXTGURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HANDEXTGURAD; 
                  else 
                    cbfight->PlayerState = HANDEXTGURAD; 
                  break; 
                case 2: 
                  cbfight->time = GURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = GURAD; 
                  else 
                    cbfight->PlayerState = GURAD; 
                  break; 
                } 
                break; 
              case 6: 
                cb->time = FOOTEXT_START; 
                cb->PlayerState = FOOTEXT; 
                 
                switch( rand() % 2 ){ 
                case 0: 
                  cbfight->time = WOUND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = WOUND; 
                  else 
                    cbfight->PlayerState = WOUND; 
                  break; 
                case 1: 
                  cbfight->time = HANDEXTGURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = HANDEXTGURAD; 
                  else 
                    cbfight->PlayerState = HANDEXTGURAD; 
                  break; 
                } 
                break; 
              case 7: 
                cb->time = FOOTLOW_START; 
                cb->PlayerState = FOOTLOW; 
                 
                switch( rand() % 2 ){ 
                case 0: 
                  cbfight->time = FOOTLOWWOUND_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTLOWWOUND; 
                  else 
                    cbfight->PlayerState = FOOTLOWWOUND; 
                  break; 
                case 1: 
                  cbfight->time = FOOTLOWGURAD_START; 
                  if( cbfight->cXFileName.IsEmpty() ) 
                    g_playerState = FOOTLOWGURAD; 
                  else 
                    cbfight->PlayerState = FOOTLOWGURAD; 
                  break; 
                } 
                break; 
              case 8: 
                cb->time = FOOTLOWWOUND_START; 
                cb->PlayerState = FOOTLOWWOUND; 
                 
                cbfight->time = FOOTLOW_START; 
                if( cbfight->cXFileName.IsEmpty() ) 
                  g_playerState = FOOTLOW; 
                else 
                  cbfight->PlayerState = FOOTLOW; 
                break; 
              case 9: 
                cb->time = FOOTLOWGURAD_START; 
                cb->PlayerState = FOOTLOWGURAD; 
                 
                cbfight->time = FOOTLOW_START; 
                if( cbfight->cXFileName.IsEmpty() ) 
                  g_playerState = FOOTLOW; 
                else 
                  cbfight->PlayerState = FOOTLOW; 
                break; 
              } 
            } 
          } 
          break; 
        case HAND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >HAND_START + NUM_HAND_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case HANDEXT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time > HANDEXT_START + NUM_HAND_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOT_START + NUM_FOOT_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTEXT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOW: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case WOUND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
              
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOWWOUND: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case GURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >GURAD_START + NUM_GURAD_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case HANDEXTGURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES) 
            { 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
               
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case FOOTLOWGURAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >FOOTLOWGURAD_START + NUM_HAND_FRAMES){ 
              obj->GetPosition(myglobs.scene, &tmpSoundPos); 
              pSoundPos.x = tmpSoundPos.z - playerpos.z; 
              pSoundPos.y = 0.0f; 
              pSoundPos.z = tmpSoundPos.x - playerpos.x; 
            
              cb->time = FIGHTREADY_START; 
              cb->PlayerState = FIGHTREADY; 
            } 
          } 
          break; 
        case DAZUO: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) 
              cb->time = DAZUO_START; 
          } 
          break; 
        case SLEEP: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) 
              cb->time = SLEEP_START; 
          } 
          break; 
        case DEAD: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >DEAD_START + NUM_DEAD_FRAMES) 
              cb->time = DEAD_START; 
          } 
          break; 
        case DRINK: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >DRINK_START + NUM_DRINK_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case EAT: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >EAT_START + NUM_EAT_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case PRACTICE: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += delta; 
            if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) 
            { 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        case KETOU: 
          { 
            cb->animset->SetTime(cb->time); 
            cb->time += (g_fightreadyDelta*delta); 
            if( cb->time >KETOU_START + NUM_KETOU_FRAMES){ 
              cb->time = STOP_START; 
              g_playerState = STOP; 
            } 
          } 
          break; 
        } 
      } 
 
    } 
    else{ 
      switch(g_playerState){ 
      case STOP: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time > STOP_START + NUM_STOP_FRAMES) 
          { 
            cb->time = STOP_START; 
          } 
        } 
        break; 
      case LEFTGO: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += delta; 
          if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES) 
          { 
            if(cb->pathlist.IsEmpty()) 
            { 
              if(cb->iAimSite != 0) 
              { 
                if(g_sFrame) 
                { 
                  cb->iAimSite = 0; 
                  g_sFrame->GetPosition(myglobs.scene, &sFramepos); 
                  g_lpplayer->GetPosition(myglobs.scene, &playerpos); 
                  if( fabs(sFramepos.x - playerpos.x)<1.8f && fabs(sFramepos.z - playerpos.z)<1.0f) 
                  { 
                     
                    if(BumpAndShowMsg()) 
                    { 
                      cb->time = STOP_START; 
                      g_playerState = STOP;                 
                      break; 
                    } 
                  } 
                } 
              } 
              cb->time = STOP_START; 
              g_playerState = STOP; 
              break; 
            } 
            //g_lpplayer->GetPosition(myglobs.scene, &playerpos); 
            myglobs.camera->GetPosition(myglobs.scene,&camerapos); 
             
            path = cb->pathlist.GetHead(); 
            camerapos.x  += path->x - playerpos.x; 
            camerapos.z  += path->z - playerpos.z; 
            g_pChaseFrame->SetPosition(myglobs.scene,path->x,path->y,path->z); 
            g_lpplayer->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); 
            g_lpplayer->SetPosition(myglobs.scene,path->x,path->y,path->z); 
             
            myglobs.camera->SetPosition(myglobs.scene,camerapos.x,camerapos.y,camerapos.z); 
            myglobs.camera->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); 
            myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); 
             
            cb->pathlist.RemoveHead(); 
            delete path; 
             
             
            cb->time = RIGHTGO_START; 
            g_playerState = RIGHTGO; 
          } 
        } 
        break; 
      case RIGHTGO: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += delta; 
          if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ 
            if(cb->pathlist.IsEmpty()){ 
              if(cb->iAimSite != 0){ 
				  if(g_sFrame) { 
                  g_sFrame->GetPosition(myglobs.scene, &sFramepos); 
                  g_lpplayer->GetPosition(myglobs.scene, &playerpos); 
                  cb->iAimSite = 0; 
                  if( fabs(sFramepos.x - playerpos.x)<1.0f && fabs(sFramepos.z - playerpos.z)<1.0f) 
                  { 
                    if(BumpAndShowMsg()) 
                    { 
                      cb->time = STOP_START; 
                      g_playerState = STOP;                   
                      break; 
                    } 
                  } 
                } 
              } 
              cb->time = STOP_START; 
              g_playerState = STOP; 
              break; 
            } 
            myglobs.camera->GetPosition(myglobs.scene,&camerapos); 
             
            path = cb->pathlist.GetHead(); 
            camerapos.x  += path->x - playerpos.x; 
            camerapos.z  += path->z - playerpos.z; 
            g_pChaseFrame->SetPosition(myglobs.scene,path->x,path->y,path->z); 
            g_lpplayer->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); 
            g_lpplayer->SetPosition(myglobs.scene,path->x,path->y,path->z); 
             
            myglobs.camera->SetPosition(myglobs.scene,camerapos.x,camerapos.y,camerapos.z); 
            myglobs.camera->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); 
            myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); 
             
            cb->pathlist.RemoveHead(); 
            delete path; 
             
            cb->time = LEFTGO_START; 
            g_playerState = LEFTGO; 
          } 
        } 
        break; 
      case FIGHTREADY: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) 
            cb->time = FIGHTREADY_START; 
        } 
        break; 
      case HAND: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >HAND_START + NUM_HAND_FRAMES){ 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case HANDEXT: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >HANDEXT_START + NUM_HAND_FRAMES){ 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            cb->time = FIGHTREADY_START; 
            cb->PlayerState = FIGHTREADY; 
          } 
        } 
        break; 
      case FOOT: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FOOT_START + NUM_FOOT_FRAMES) 
          { 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
             
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case FOOTEXT: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES) 
          { 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
             
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case FOOTLOW: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES) 
          { 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
             
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case WOUND: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case FOOTLOWWOUND: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES) 
          { 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case GURAD: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >GURAD_START + NUM_GURAD_FRAMES){ 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            cb->time = FIGHTREADY_START; 
            g_playerState = FIGHTREADY; 
          } 
        } 
        break; 
      case HANDEXTGURAD: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES){ 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
            
            cb->time = FIGHTREADY_START; 
            cb->PlayerState = FIGHTREADY; 
          } 
        } 
        break; 
      case FOOTLOWGURAD: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >FOOTLOWGURAD_START + NUM_FOOT_FRAMES) 
          { 
            pSoundPos.x = 0.0f; 
            pSoundPos.y = 0.0f; 
            pSoundPos.z = 0.0f; 
             
            cb->time = FIGHTREADY_START; 
            cb->PlayerState = FIGHTREADY; 
          } 
        } 
        break; 
      case DAZUO: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += delta; 
          if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) 
            cb->time = DAZUO_START; 
        } 
        break; 
      case SLEEP: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += delta; 
          if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) 
            cb->time = SLEEP_START; 
        } 
        break; 
      case DEAD: 
        { 
          if(bRestartAlready)  
          {  
			  CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); 
			  bRestartAlready=FALSE; 
			  g_playerState = STOP; 
			  lpPlayerInfo->m_iSTATUS = AOS_none; 
			  cb->time = STOP_START; 
			  cb->PlayerState = STOP; 
          } 
		  else 
		  { 
			  cb->animset->SetTime(cb->time); 
			  cb->time += delta; 
			  if( cb->time >DEAD_START + NUM_DEAD_FRAMES) 
				  cb->time = DEAD_START; 
		  } 
        } 
        break; 
      case DRINK: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >DRINK_START + NUM_DRINK_FRAMES) 
          { 
            cb->time = STOP_START; 
            g_playerState = STOP; 
          } 
        } 
        break; 
      case EAT: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >EAT_START + NUM_EAT_FRAMES) 
          { 
            cb->time = STOP_START; 
            g_playerState = STOP; 
          } 
        } 
        break; 
      case PRACTICE: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += delta; 
          if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) 
          { 
            cb->time = STOP_START; 
            g_playerState = STOP; 
          } 
        } 
        break; 
      case KETOU: 
        { 
          cb->animset->SetTime(cb->time); 
          cb->time += (g_fightreadyDelta*delta); 
          if( cb->time >KETOU_START + NUM_KETOU_FRAMES) 
          { 
            cb->time = STOP_START; 
            g_playerState = STOP; 
          } 
        } 
        break; 
      } 
    }//end if() 
  }//end for() 
  LeaveCriticalSection(&csAnimation); 
} 
 
void __cdecl animationDestroyCallback(LPDIRECT3DRMOBJECT pFrame, 
                                      LPVOID pvArg) 
{ 
  LPDIRECT3DRMANIMATIONSET2 pAnim = (LPDIRECT3DRMANIMATIONSET2)pvArg; 
  pAnim->Release(); 
} 
 
 
D3DVECTOR GetNextPosite(LPDIRECT3DRMFRAME3 npcframe,animationCallbackArgs * lpanimate) 
{ 
  LPDIRECT3DRMFRAMEARRAY frames; 
  LPDIRECT3DRMFRAME frame; 
  LPDIRECT3DRMFRAME3 pFrame3; 
  LPDIRECT3DRMFRAME3 roomFrame3; 
   
  D3DVECTOR oldPos,tmpPos; 
  npcframe->GetPosition( myglobs.scene,&tmpPos); 
  oldPos.x = tmpPos.x; 
  oldPos.z = tmpPos.z; 
   
  myglobs.scene->GetChildren(&frames); 
   
  frames->GetElement( 5, &frame); 
  frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); 
  roomFrame3 = pFrame3; 
   
  switch(lpanimate->way) { 
  case 0: 
    if(searchpath(tmpPos,roomFrame3,0.0f,(0.2f))) 
    { 
      tmpPos.z += 0.2f; 
    } 
    break; 
  case 1: 
    if(searchpath(tmpPos,roomFrame3,(-0.2f),0.2f)) 
    { 
      tmpPos.x += -0.2f; 
      tmpPos.z += 0.2f; 
    } 
    break; 
  case 2: 
    if(searchpath(tmpPos,roomFrame3,0.0f,(-0.2f))) 
    { 
      tmpPos.z += -0.2f; 
    } 
    break; 
  case 3: 
    if(searchpath(tmpPos,roomFrame3,0.2f,0.0f)) 
    { 
      tmpPos.x += 0.2f; 
    } 
    break; 
  case 4: 
    if(searchpath(tmpPos,roomFrame3,(-0.2f),0.0f)) 
    { 
      tmpPos.x += -0.2f; 
    } 
    break; 
  case 5: 
    if(searchpath(tmpPos,roomFrame3,0.2f,0.2f)) 
    { 
      tmpPos.x += 0.2f; 
      tmpPos.z += 0.2f; 
    } 
    break; 
  case 6: 
    if(searchpath(tmpPos,roomFrame3,0.2f,(-0.2f))) 
    { 
      tmpPos.x += 0.2f; 
      tmpPos.z += -0.2f; 
    } 
    break; 
  case 7: 
    if(searchpath(tmpPos,roomFrame3,(-0.2f),(-0.2f))){ 
      tmpPos.x += -0.2f; 
      tmpPos.z += -0.2f; 
    } 
    break; 
  default: 
    lpanimate->time = STOP_START; 
    lpanimate->PlayerState = STOP; 
    break; 
  } 
  if(lpanimate->nSteps >= 15){ 
    lpanimate->nSteps = 0; 
    lpanimate->way = rand()%12; 
  }else { 
    lpanimate->nSteps++; 
  } 
   
  if(oldPos.x == tmpPos.x && oldPos.z == tmpPos.z){ 
    lpanimate->nSteps = 0; 
    lpanimate->way = rand()%8; 
  } 
  roomFrame3->Release(); 
  pFrame3->Release(); 
  frames->Release(); 
  frame->Release(); 
  return tmpPos; 
} 
 
void OtherFight(CString szCWho,CString szWho,CString szCWho2,CString szWho2) 
{ 
  animationCallbackArgs *cb, * cb1=NULL, * cb2=NULL; 
  POSITION posite1,posite2; 
  POSITION pos,lastpos; 
  D3DVECTOR fighttagpos; 
   
  pos = animationlist.GetHeadPosition(); 
  while(pos != NULL){ 
    lastpos = pos; 
    cb = animationlist.GetNext(pos); 
    if((szWho == cb->cXFileName)&&(szCWho == cb->cCName)){ 
      cb1 = cb; 
      posite1 = lastpos; 
    }else if((szWho2 == cb->cXFileName)&&(szCWho2 == cb->cCName)){ 
      cb2 = cb; 
      posite2 = lastpos; 
    } 
  } 
  if((cb1 == NULL)||(cb2 == NULL)) 
  { 
    ASSERT(FALSE); 
    return; 
  } 
  cb1->frame3obj->GetPosition(myglobs.scene,&fighttagpos); 
  cb1->PlayerState = FIGHTREADY; 
  cb1->time = FIGHTREADY_START; 
   
  cb2->PlayerState = FIGHTREADY; 
  cb2->time = FIGHTREADY_START; 
   
  cb1->frame3obj->SetPosition(myglobs.scene,fighttagpos.x-0.5f,fighttagpos.y,fighttagpos.z); 
  cb2->frame3obj->SetPosition(myglobs.scene,fighttagpos.x+0.5f,fighttagpos.y,fighttagpos.z); 
  cb1->frame3obj->LookAt(cb2->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); 
  cb2->frame3obj->LookAt(cb1->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); 
 
  TFightTag * lpFightTag = new TFightTag; 
  lpFightTag->tagPosite = posite2; 
  cb1->fightopplist.AddTail(lpFightTag); 
   
  lpFightTag = new TFightTag; 
  lpFightTag->tagPosite = posite1; 
  cb2->fightopplist.AddTail(lpFightTag); 
} 
 
void DoFight(CString szWho,int iFightKind) 
{ 
  D3DVECTOR tagPos; 
  animationCallbackArgs *cb = NULL, *selfcb; 
  myglobs.camera->DeleteMoveCallback(MoveCameraCallback,&info); 
  m_MainScreen.bFaceSomeOne[0] = FALSE; 
  m_MainScreen.bFaceSomeOne[1] = FALSE; 
  m_MainScreen.bSelectOne = FALSE; 
   
  int numPts = 8; 
  g_lpplayer->GetPosition(myglobs.scene,&tagPos); 
  g_lpplayer->SetPosition(myglobs.scene,tagPos.x,tagPos.y,tagPos.z); 
  POSITION lastpos, pos = animationlist.GetHeadPosition(); 
  while(pos != NULL){ 
    lastpos = pos; 
    cb = animationlist.GetNext(pos); 
    if(cb->cXFileName == szWho) 
      break; 
    cb = NULL; 
  } 
  if(cb == NULL) { ASSERT(FALSE); return; } 
  cb->frame3obj->SetPosition(myglobs.scene,tagPos.x+1.0f,tagPos.y,tagPos.z); 
   
  g_pChaseFrame->SetPosition(myglobs.scene,tagPos.x+0.5f,tagPos.y+0.5f,tagPos.z); 
 
  g_lpplayer->LookAt(cb->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); 
  cb->frame3obj->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); 
 
	if(g_playerState != FIGHTREADY) 
	{ 
		myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); 
	} 
  myglobs.camera->SetPosition(myglobs.scene,tagPos.x+0.5f,tagPos.y+3.5f,tagPos.z-8.0f); 
  myglobs.camera->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); 
 
  g_playerState = FIGHTREADY; 
  selfcb = animationlist.GetHead(); 
  selfcb->time = FIGHTREADY_START; 
  cb->PlayerState = FIGHTREADY; 
  cb->time = FIGHTREADY_START; 
   
 
  CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); 
  lpPlayerInfo = playerlist.GetHead(); 
   
  lpPlayerInfo->m_iSTATUS = iFightKind; 
   
  TFightTag * lpFightTag = new TFightTag; 
  lpFightTag->tagPosite = lastpos; 
  selfcb->fightopplist.AddTail(lpFightTag); 
   
  lpFightTag = new TFightTag; 
  lpFightTag->tagPosite = animationlist.FindIndex(0); 
  cb->fightopplist.AddTail(lpFightTag); 
} 
 
void StopOther(POSITION posite) 
{ 
  POSITION pos, lastpos; 
  POSITION pos2, lastpos2; 
  animationCallbackArgs *cb, *cbOther, *cbself; 
  TFightTag * lpFightTag, *lpFightTag2; 
  cbself = animationlist.GetHead(); 
  cb = animationlist.GetAt(posite); 
  pos = cb->fightopplist.GetHeadPosition(); 
  while(pos != NULL){ 
    lastpos = pos; 
    lpFightTag = cb->fightopplist.GetNext(pos); 
    cbOther = animationlist.GetAt(lpFightTag->tagPosite); 
    pos2 = cbOther->fightopplist.GetHeadPosition(); 
    while(pos2 != NULL) 
    { 
      lastpos2 = pos2; 
      lpFightTag2 = cbOther->fightopplist.GetNext(pos2); 
      if(lpFightTag2->tagPosite == posite){ 
        cbOther->fightopplist.RemoveAt(lastpos2); 
        delete lpFightTag2; 
        break; 
      } 
    } 
    if(cbOther->fightopplist.GetCount() == 0) 
    { 
      cbOther->PlayerState = STOP; 
      cbOther->time = STOP_START; 
      D3DVECTOR tagPos; 
      cbOther->frame3obj->GetPosition(myglobs.scene, &tagPos); 
      tagPos.y = 0; 
      cbOther->frame3obj->SetPosition(myglobs.scene, tagPos.x,tagPos.y,tagPos.z); 
      if(cbOther == cbself) 
      { 
        g_playerState = STOP; 
        CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); 
        lpPlayerInfo->m_iSTATUS = AOS_none; 
      } 
    } 
    cb->fightopplist.RemoveAt(lastpos); 
    delete lpFightTag; 
  } 
}