client/UserInterface/InstanceBaseMovement.cpp

357 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "InstanceBase.h"
#include "PythonBackground.h"
#include "../eterLib/GrpMath.h"
void CInstanceBase::SetAttackSpeed(UINT uAtkSpd)
{
if (uAtkSpd > 1100)
uAtkSpd = 0;
m_GraphicThingInstance.SetAttackSpeed(uAtkSpd/100.0f);
m_kHorse.SetAttackSpeed(uAtkSpd);
}
void CInstanceBase::SetMoveSpeed(UINT uMovSpd)
{
if (uMovSpd > 1100)
uMovSpd = 0;
m_GraphicThingInstance.SetMoveSpeed(uMovSpd/100.0f);
m_kHorse.SetMoveSpeed(uMovSpd);
}
void CInstanceBase::SetRotationSpeed(float fRotSpd)
{
m_fMaxRotSpd = fRotSpd;
}
void CInstanceBase::NEW_Stop()
{
if (__IsSyncing())
return;
if (isLock())
return;
if (IsUsingSkill())
return;
if (!IsWaiting())
EndWalking();
m_GraphicThingInstance.__OnStop();
}
void CInstanceBase::NEW_SyncPixelPosition(long & nPPosX, long & nPPosY)
{
m_GraphicThingInstance.TEMP_Push(nPPosX, nPPosY);
}
bool CInstanceBase::NEW_CanMoveToDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
if (kPPosCur.x==c_rkPPosDst.x && kPPosCur.y==c_rkPPosDst.y)
return false;
return true;
}
float CInstanceBase_GetDegreeFromPosition(float x, float y)
{
D3DXVECTOR3 vtDir(floor(x), floor(y), 0.0f);
D3DXVec3Normalize(&vtDir, &vtDir);
D3DXVECTOR3 vtStan(0, -1, 0);
float ret = D3DXToDegree(acosf(D3DXVec3Dot(&vtDir, &vtStan)));
if (vtDir.x < 0.0f)
ret = 360.0f - ret;
return ret;
}
float CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir)
{
float fDirRot=CInstanceBase_GetDegreeFromPosition(c_rkPPosDir.x, -c_rkPPosDir.y);
float fClampDirRot=ClampDegree(fDirRot);
return fClampDirRot;
}
float CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
return NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst);
}
float CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosDelta;
kPPosDelta=c_rkPPosDst-c_rkPPosSrc;
return NEW_GetAdvancingRotationFromDirPixelPosition(kPPosDelta);
}
void CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir)
{
float fClampDirRot=NEW_GetAdvancingRotationFromDirPixelPosition(c_rkPPosDir);
m_GraphicThingInstance.SetAdvancingRotation(fClampDirRot);
float fCurRot=m_GraphicThingInstance.GetRotation();
float fAdvRot=m_GraphicThingInstance.GetAdvancingRotation();
m_iRotatingDirection = GetRotatingDirection(fCurRot, fAdvRot);
}
void CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosDelta;
kPPosDelta=c_rkPPosDst-c_rkPPosSrc;
NEW_SetAdvancingRotationFromDirPixelPosition(kPPosDelta);
}
bool CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst))
{
Tracenf("Failed to move next position (%f,%f, %f)", c_rkPPosDst.x, c_rkPPosDst.y, c_rkPPosDst.z);
return false;
}
TPixelPosition kPPosSrc;
NEW_GetPixelPosition(&kPPosSrc);
NEW_SetAdvancingRotationFromPixelPosition(kPPosSrc, c_rkPPosDst);
return true;
}
void CInstanceBase::SetAdvancingRotation(float fRotation)
{
float frotDifference = GetDegreeDifference(GetRotation(), fRotation);
if (frotDifference > 45.0f)
m_fRotSpd = m_fMaxRotSpd;
else
m_fRotSpd = m_fMaxRotSpd * 5 / 12;
m_GraphicThingInstance.SetAdvancingRotation(ClampDegree(fRotation));
m_iRotatingDirection = GetRotatingDirection(m_GraphicThingInstance.GetRotation(),
m_GraphicThingInstance.GetAdvancingRotation());
}
void CInstanceBase::StartWalking()
{
m_GraphicThingInstance.Move();
if (IsAffect(AFFECT_GYEONGGONG))
{
m_adwCRCAffectEffect[AFFECT_GYEONGGONG] = __EffectContainer_AttachEffect(EFFECT_AFFECT_GYEONGGONG);
}
else if (IsAffect(AFFECT_KWAESOK))
{
m_adwCRCAffectEffect[AFFECT_KWAESOK] = __EffectContainer_AttachEffect(EFFECT_AFFECT_KWAESOK);
}
}
void CInstanceBase::EndWalking(float fBlendingTime)
{
assert (!IsWaiting() && "CInstanceBase::EndWalking");
m_isGoing = FALSE;
// <20>Ȱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߰<EFBFBD> <20>ؾ<EFBFBD> <20>Ѵ<EFBFBD>
if (IsWalking()||!IsAttacked())
{
m_GraphicThingInstance.Stop(fBlendingTime);
if (IsAffect(AFFECT_GYEONGGONG))
{
__EffectContainer_DetachEffect(EFFECT_AFFECT_GYEONGGONG);
}
else if (IsAffect(AFFECT_KWAESOK))
{
__EffectContainer_DetachEffect(EFFECT_AFFECT_KWAESOK);
}
}
}
void CInstanceBase::EndWalkingWithoutBlending()
{
EndWalking(0.0f);
}
BOOL CInstanceBase::IsWaiting()
{
return m_GraphicThingInstance.IsWaiting();
}
BOOL CInstanceBase::IsWalking()
{
return m_GraphicThingInstance.IsMoving();
}
BOOL CInstanceBase::IsPushing()
{
return m_GraphicThingInstance.IsPushing();
}
BOOL CInstanceBase::IsAttacked()
{
return m_GraphicThingInstance.IsAttacked();
}
BOOL CInstanceBase::IsKnockDown()
{
if (!m_GraphicThingInstance.IsKnockDown())
return FALSE;
return TRUE;
}
BOOL CInstanceBase::IsAttacking()
{
return m_GraphicThingInstance.isAttacking();
}
BOOL CInstanceBase::IsActingEmotion()
{
return m_GraphicThingInstance.IsActEmotion();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CInstanceBase::IsGoing()
{
return m_isGoing;
}
void CInstanceBase::NEW_MoveToDestInstanceDirection(CInstanceBase & rkInstDst)
{
TPixelPosition kPPosDst;
rkInstDst.NEW_GetPixelPosition(&kPPosDst);
NEW_MoveToDestPixelPositionDirection(kPPosDst);
}
bool CInstanceBase::NEW_MoveToDestPixelPositionDirection(const TPixelPosition & c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst);
return NEW_Goto(c_rkPPosDst, fDstRot);
}
bool CInstanceBase::NEW_Goto(const TPixelPosition& c_rkPPosDst, float fDstRot)
{
if (__IsSyncing())
{
return false;
}
if (m_GraphicThingInstance.IsUsingMovingSkill())
{
SetAdvancingRotation(fDstRot);
return true;
}
if (isLock())
{
return false;
}
if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst))
{
if (!IsWaiting())
EndWalking();
return true;
}
NEW_SetSrcPixelPosition(NEW_GetCurPixelPositionRef());
NEW_SetDstPixelPosition(c_rkPPosDst);
NEW_SetDstPixelPositionZ(NEW_GetSrcPixelPositionRef().z);
m_fDstRot=fDstRot;
m_isGoing = TRUE;
if (!IsWalking())
{
StartWalking();
}
NEW_SetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
return true;
}
void CInstanceBase::NEW_MoveToDirection(float fDirRot)
{
if (__IsSyncing())
return;
if (m_GraphicThingInstance.IsUsingMovingSkill())
{
SetAdvancingRotation(fDirRot);
return;
}
if (isLock())
return;
m_isGoing = FALSE;
SetAdvancingRotation(fDirRot);
if (!IsWalking())
{
StartWalking();
}
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
D3DXVECTOR3 kD3DVt3Cur(kPPosCur.x, -kPPosCur.y, kPPosCur.z);
D3DXVECTOR3 kD3DVt3Dst;
D3DXVECTOR3 kD3DVt3AdvDir(0.0f, -1.0f, 0.0f);
D3DXMATRIX kD3DMatAdv;
D3DXMatrixRotationZ(&kD3DMatAdv, D3DXToRadian(fDirRot));
D3DXVec3TransformCoord(&kD3DVt3AdvDir, &kD3DVt3AdvDir, &kD3DMatAdv);
D3DXVec3Scale(&kD3DVt3AdvDir, &kD3DVt3AdvDir, 300.0f);
D3DXVec3Add(&kD3DVt3Dst, &kD3DVt3AdvDir, &kD3DVt3Cur);
TPixelPosition kPPosDst;
kPPosDst.x = +kD3DVt3Dst.x;
kPPosDst.y = -kD3DVt3Dst.y;
kPPosDst.z = +kD3DVt3Dst.z;
NEW_SetSrcPixelPosition(kPPosCur);
NEW_SetDstPixelPosition(kPPosDst);
}
void CInstanceBase::EndGoing()
{
if (!IsWaiting())
EndWalking();
//Tracen("EndGoing");
m_isGoing = FALSE;
}
void CInstanceBase::SetRunMode()
{
m_GraphicThingInstance.SetRunMode();
}
void CInstanceBase::SetWalkMode()
{
m_GraphicThingInstance.SetWalkMode();
}