// Creature.cpp: implementation of the CCreature class. // ////////////////////////////////////////////////////////////////////// #include "Creature.h" #include "SceneManager.h" #include "CameraControl.h" #include "CharacterControl.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define KeyPressed( key ) HIBYTE( GetAsyncKeyState( key ) ) //extern CCharacterControl g_CharacterData; //char CCreature::m_strWeaponMotionSheet[MAX_WEAPONTABLE][256]; //char CCreature::m_strWeapon[MAX_WEAPONTABLE][256]; CCreature::CCreature() { m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_dwLowerChrAction = CA_WAIT; m_dwUpperChrAction = CA_WAIT; m_fRunFactor = 0.0f; m_dwAttackCombo = 0; m_dwSkillComboCount = 0; m_bSkillCombo = FALSE; m_fDeadTimer = -1.0f; m_sDamage = 0; m_fScale = 1.0f; m_fChatTimer = 0.0f; m_wMaxHP = 0; m_sCurrHP = -1; m_wMaxMP = 0; m_sCurrMP = -1; m_dwPartyID = 0; m_dwChant = 0; m_cSex = 1; m_cNation = 0; m_cLevel = 0; m_bCharDead = FALSE; m_bUsed = FALSE; m_bSitMode = FALSE; m_bFlying = FALSE; m_bFlyFirstCheck = FALSE; m_bStillCasting = FALSE; m_fFixAngle=0.0f; m_dwWeaponPos = 0; m_bNoneComboAttackMode=TRUE; m_bFirstPositionSend = FALSE; m_ChrAction.m_wAniNum = 0; m_ChrAction.m_wAniNumCount = 0; m_bArrowExist = false; m_Arrow.clear(); m_bSlide = false; m_BodyEffect.clear(); m_bBodyEffect = false; m_WeaponEffect.clear(); m_bWeaponEffect = false; m_pWeaponLine = NULL; m_bWeaponLine = false; m_dwTargetId = 0xffffffff; } CCreature::~CCreature() { for( int i=0; i < m_Arrow.size(); i++ ) { delete m_Arrow[i]; } m_Arrow.clear(); for( i=0; i < m_BodyEffect.size(); i++ ) { delete m_BodyEffect[i]; } m_BodyEffect.clear(); for( i=0; i < m_WeaponEffect.size(); i++ ) { delete m_WeaponEffect[i]; } m_WeaponEffect.clear(); if(m_pWeaponLine != NULL) { delete m_pWeaponLine; m_pWeaponLine = NULL; } } BOOL CCreature::SetAction(unsigned long dwUpperAni, unsigned long dwLowerAni) { char strUpperAction[MAX_PATH], strLowerAction[MAX_PATH]; BOOL bAction = FALSE; if(m_lpChrModel) { SetMotionString(dwUpperAni, strUpperAction); SetMotionString(dwLowerAni, strLowerAction); if(m_dwUpperChrAction != dwUpperAni) { if(IsCancelAction(1)) { m_dwUpperChrAction = dwUpperAni; m_bUpperAnimating = FALSE; } } if(m_dwLowerChrAction != dwLowerAni) { if(IsCancelAction(2)) { m_dwLowerChrAction = dwLowerAni; m_bLowerAnimating = FALSE; } } /* if(m_lpChrModel->IsActionFinished(0)) { m_dwUpperChrAction = dwUpperAni; m_bUpperAble = TRUE; } if(m_lpChrModel->IsActionFinished(1)) { m_dwLowerChrAction = dwLowerAni; m_bLowerAble = TRUE; } */ if( ((m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2 || m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 || m_dwUpperChrAction == CA_CASTING || m_dwUpperChrAction == CA_REST || m_dwUpperChrAction == CA_WAIT) && !m_bUpperAnimating) && ((m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 || m_dwLowerChrAction == CA_CASTING || m_dwLowerChrAction == CA_REST || m_dwLowerChrAction == CA_WAIT) && !m_bLowerAnimating)) { m_dwUpperChrAction = dwUpperAni; m_dwLowerChrAction = dwLowerAni; m_lpChrModel->SetMotion(strUpperAction, 3); m_bUpperAnimating = TRUE; m_bLowerAnimating = TRUE; if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE; if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE; return TRUE; } if(!m_bUpperAnimating) { m_dwUpperChrAction = dwUpperAni; m_lpChrModel->SetMotion(strUpperAction, 1); m_bUpperAnimating = TRUE; bAction = TRUE; if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE; // if(!m_bLowerAble) m_lpChrModel->SetMotionCurrentFrame(1, m_lpChrModel->GetMotionCurrentFrame(2)); } if(!m_bLowerAnimating) { m_dwLowerChrAction = dwLowerAni; m_lpChrModel->SetMotion(strLowerAction, 2); m_bLowerAnimating = TRUE; bAction = TRUE; if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE; // if(!m_bUpperAble) m_lpChrModel->SetMotionCurrentFrame(2, m_lpChrModel->GetMotionCurrentFrame(1)); } } else { m_dwUpperChrAction = dwUpperAni; m_dwLowerChrAction = dwLowerAni; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_bUpperAble = TRUE; m_bLowerAble = TRUE; } return bAction; } BOOL CCreature::SetAction(char *strUpperAction, char *strLowerAction) { unsigned long dwUpperAni, dwLowerAni; BOOL bAction = FALSE; SetMotionString(&dwUpperAni, strUpperAction); SetMotionString(&dwLowerAni, strLowerAction); if(m_lpChrModel) { if(m_dwUpperChrAction != dwUpperAni) { if(IsCancelAction(1)) { m_dwUpperChrAction = dwUpperAni; m_bUpperAnimating = FALSE; if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE; } } if(m_dwLowerChrAction != dwLowerAni) { if(IsCancelAction(2)) { m_dwLowerChrAction = dwLowerAni; m_bLowerAnimating = FALSE; if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE; } } if( ((m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2 || m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 || m_dwUpperChrAction == CA_CASTING || m_dwUpperChrAction == CA_REST || m_dwUpperChrAction == CA_WAIT) && !m_bUpperAnimating) && ((m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 || m_dwLowerChrAction == CA_CASTING || m_dwLowerChrAction == CA_REST || m_dwLowerChrAction == CA_WAIT) && !m_bLowerAnimating)) { m_lpChrModel->SetMotion(strUpperAction, 3); m_dwUpperChrAction = dwUpperAni; m_dwLowerChrAction = dwLowerAni; m_bUpperAnimating = TRUE; m_bLowerAnimating = TRUE; return TRUE; } if(!m_bUpperAnimating) { m_lpChrModel->SetMotion(strUpperAction, 1); m_dwUpperChrAction = dwUpperAni; m_bUpperAnimating = TRUE; bAction = TRUE; // if(!m_bLowerAble) m_lpChrModel->SetMotionCurrentFrame(1, m_lpChrModel->GetMotionCurrentFrame(2)); } if(!m_bLowerAnimating) { m_lpChrModel->SetMotion(strLowerAction, 2); m_dwLowerChrAction = dwLowerAni; m_bLowerAnimating = TRUE; bAction = TRUE; // if(!m_bUpperAble) m_lpChrModel->SetMotionCurrentFrame(2, m_lpChrModel->GetMotionCurrentFrame(1)); } } else { m_dwUpperChrAction = dwUpperAni; m_dwLowerChrAction = dwLowerAni; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_bUpperAble = TRUE; m_bLowerAble = TRUE; } return bAction; } void CCreature::SetMotionString(unsigned long dwAction, char *strAction) { /// ¿©±â¼­ ¹«±â¿¡ µû¶ó ½ÃÆ®¸¦ Ʋ¸®°Ô ÇÑ´Ù. CollisionType CT = CSceneManager::GetCharacterCollisionType(m_lpChrModel); if(CT == CT_WATER) { strcpy(strAction, "SWIM"); if(m_lpChrModel) m_lpChrModel->SetFixHeight(true); //m_lpChrModel->m_fFixHeight = 0.0f; return; } else { m_lpChrModel->SetFixHeight(false); //m_lpChrModel->m_fFixHeight = 0.0f; } switch(dwAction) { case CA_WAIT: strcpy(strAction, "WAIT"); break; case CA_WALK: strcpy(strAction, "WALK"); break; case CA_WALKRIGHT: strcpy(strAction, "WALK_RIGHT"); break; case CA_WALKLEFT: strcpy(strAction, "WALK_LEFT"); break; case CA_WALKBACK: strcpy(strAction, "WALK_BACK"); break; case CA_RUN: strcpy(strAction, "RUN"); break; case CA_REST: strcpy(strAction, "REST"); break; case CA_SITDOWN: strcpy(strAction, "SIT_DOWN"); break; case CA_STANDUP: strcpy(strAction, "STAND_UP"); break; case CA_ATTACK: strcpy(strAction, "ATTACK"); break; case CA_ATTACKADVANCE: strcpy(strAction, "ATTACK_ADVANCE"); break; case CA_ATTACKLEFT: strcpy(strAction, "ATTACK_LEFT"); break; case CA_ATTACKRIGHT: strcpy(strAction, "ATTACK_RIGHT"); break; case CA_ATTACKRETREAT: strcpy(strAction, "ATTACK_RETREAT"); break; case CA_ATTACK2: strcpy(strAction, "ATTACK2"); break; case CA_ATTACK3: strcpy(strAction, "ATTACK3"); break; case CA_ATTACK4: strcpy(strAction, "ATTACK4"); break; case CA_ATTACK5: strcpy(strAction, "ATTACK5"); break; case CA_ATTACK6: strcpy(strAction, "ATTACK6"); break; case CA_FALLDOWN: strcpy(strAction, "FALLDOWN"); break; case CA_BASH: strcpy(strAction, "BASH"); break; case CA_COMBINATIONBLOW: strcpy(strAction, "COMBINATION_BLOW"); break; case CA_BACKSTAB: strcpy(strAction, "BACKSTAB"); break; case CA_FIRE1: strcpy(strAction, "FIRE1"); break; case CA_FIRE2: strcpy(strAction, "FIRE2"); break; case CA_SHOT: strcpy(strAction, "SHOT"); break; case CA_JUMPSHOT: strcpy(strAction, "JUMP_SHOT"); break; case CA_JUMP: strcpy(strAction, "JUMP"); break; case CA_FORWARDJUMP: strcpy(strAction, "JUMP"); break; case CA_BACKJUMP: strcpy(strAction, "JUMP"); break; case CA_FRONTDASH: strcpy(strAction, "DODGE_FRONT"); break; case CA_LEFTDASH: strcpy(strAction, "DODGE_LEFT"); break; case CA_RIGHTDASH: strcpy(strAction, "DODGE_RIGHT"); break; case CA_AIMEDSHOT1: strcpy(strAction, "AIMED_SHOT1"); break; case CA_AIMEDSHOT2: strcpy(strAction, "AIMED_SHOT2"); break; case CA_AIMEDSHOT3: strcpy(strAction, "AIMED_SHOT3"); break; case CA_SWIM: strcpy(strAction, "SWIM"); break; case CA_CASTING: strcpy(strAction, "CASTING"); break; case CA_BACKDASH: strcpy(strAction, "DODGE_BACK"); break; case CA_JUMPATTACK: strcpy(strAction, "JUMP_ATTACK"); break; case CA_JUMPATTACK2: strcpy(strAction, "JUMP_ATTACK2"); break; case CA_LAND: strcpy(strAction, "LAND"); break; case CA_OVERBASH1: strcpy(strAction, "OVER_BASH1"); break; case CA_OVERBASH2: strcpy(strAction, "OVER_BASH2"); break; case CA_OVERBASH3: strcpy(strAction, "OVER_BASH3"); break; case CA_OVERBASH4: strcpy(strAction, "OVER_BASH4"); break; case CA_OVERBASH5: strcpy(strAction, "OVER_BASH5"); break; case CA_POWERDRAIN: strcpy(strAction, "POWER_DRAIN"); break; case CA_TURNPUNCH1: strcpy(strAction, "TURN_PUNCH1"); break; case CA_TURNPUNCH2: strcpy(strAction, "TURN_PUNCH2"); break; case CA_TURNPUNCH3: strcpy(strAction, "TURN_PUNCH3"); break; case CA_JUMPATTACK3: strcpy(strAction, "JUMP_ATTACK3"); break; case CA_STUN: strcpy(strAction, "STUN"); break; case CA_ROUNDSWING: strcpy(strAction, "ROUND_SWING"); break; } } void CCreature::SetMotionString(unsigned long *dwAction, char *strAction) { // unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]); if(!strcmp(strAction, "BASH")) { *dwAction = CA_BASH; } else if(!strcmp(strAction, "FIRE1")) { *dwAction = CA_FIRE1; } else if(!strcmp(strAction, "FIRE2")) { *dwAction = CA_FIRE2; } else if(!strcmp(strAction, "COMBINATION_BLOW")) { *dwAction = CA_COMBINATIONBLOW; } else if(!strcmp(strAction, "BACKSTAB")) { *dwAction = CA_BACKSTAB; } else if(!strcmp(strAction, "AIMED_SHOT1")) { *dwAction = CA_AIMEDSHOT1; } else if(!strcmp(strAction, "AIMED_SHOT2")) { *dwAction = CA_AIMEDSHOT2; } else if(!strcmp(strAction, "AIMED_SHOT3")) { *dwAction = CA_AIMEDSHOT3; } else if(!strcmp(strAction, "CASTING")) { *dwAction = CA_CASTING; } else if(!strcmp(strAction, "JUMP_ATTACK")) { *dwAction = CA_JUMPATTACK; } else if(!strcmp(strAction, "JUMP_ATTACK2")) { *dwAction = CA_JUMPATTACK2; } else if(!strcmp(strAction, "SHOT")) { *dwAction = CA_SHOT; } else if(!strcmp(strAction, "JUMP_SHOT")) { *dwAction = CA_JUMPSHOT; } else if(!strcmp(strAction, "OVER_BASH1")) { *dwAction = CA_OVERBASH1; } else if(!strcmp(strAction, "OVER_BASH2")) { *dwAction = CA_OVERBASH2; } else if(!strcmp(strAction, "OVER_BASH3")) { *dwAction = CA_OVERBASH3; } else if(!strcmp(strAction, "OVER_BASH4")) { *dwAction = CA_OVERBASH4; } else if(!strcmp(strAction, "OVER_BASH5")) { *dwAction = CA_OVERBASH5; } else if(!strcmp(strAction, "POWER_DRAIN")) { *dwAction = CA_POWERDRAIN; } else if(!strcmp(strAction, "TURN_PUNCH1")) { *dwAction = CA_TURNPUNCH1; } else if(!strcmp(strAction, "TURN_PUNCH2")) { *dwAction = CA_TURNPUNCH2; } else if(!strcmp(strAction, "TURN_PUNCH3")) { *dwAction = CA_TURNPUNCH3; } else if(!strcmp(strAction, "JUMP_ATTACL3")) { *dwAction = CA_JUMPATTACK3; } else if(!strcmp(strAction, "STUN")) { *dwAction = CA_STUN; } else if(!strcmp(strAction, "ROUND_SWING")) { *dwAction = CA_ROUNDSWING; } } BOOL CCreature::IsCancelAction(unsigned long dwPart) { switch(dwPart) { case 1: if( m_dwUpperChrAction == CA_RUN || m_dwUpperChrAction == CA_WALK || m_dwUpperChrAction == CA_WALKLEFT || m_dwUpperChrAction == CA_WALKRIGHT || m_dwUpperChrAction == CA_WALKBACK || m_dwUpperChrAction == CA_WAIT || m_dwUpperChrAction == CA_REST)/* || m_dwUpperChrAction == CA_LEFTDASH || m_dwUpperChrAction == CA_RIGHTDASH)/**/ return TRUE; break; case 2: if( m_dwLowerChrAction == CA_RUN || m_dwLowerChrAction == CA_WALK || m_dwLowerChrAction == CA_WALKLEFT || m_dwLowerChrAction == CA_WALKRIGHT || m_dwLowerChrAction == CA_WALKBACK || m_dwLowerChrAction == CA_WAIT || m_dwLowerChrAction == CA_REST) return TRUE; break; case 3: if((m_dwUpperChrAction == CA_RUN || m_dwUpperChrAction == CA_WALK || m_dwUpperChrAction == CA_WALKLEFT || m_dwUpperChrAction == CA_WALKRIGHT || m_dwUpperChrAction == CA_WALKBACK || m_dwUpperChrAction == CA_WAIT || m_dwUpperChrAction == CA_REST) && (m_dwLowerChrAction == CA_RUN || m_dwLowerChrAction == CA_WALK || m_dwLowerChrAction == CA_WALKLEFT || m_dwLowerChrAction == CA_WALKRIGHT || m_dwLowerChrAction == CA_WALKBACK || m_dwLowerChrAction == CA_WAIT || m_dwLowerChrAction == CA_REST)) return TRUE; break; } return FALSE; } void CCreature::InitChrAction() { /* if(m_bStillCasting && m_lpChrModel->IsActionFinished(0) && m_lpChrModel->IsActionFinished(1) && !m_bCharDead) { m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_dwUpperChrAction = CA_CASTING; m_dwLowerChrAction = CA_CASTING; SetAction(m_dwUpperChrAction, m_dwLowerChrAction); return; }*/ if(m_bCharDead) { m_dwUpperChrAction = CA_FALLDOWN; m_dwLowerChrAction = CA_FALLDOWN; } if(m_lpChrModel->IsActionFinished(0) && !m_bCharDead) { if(GetChantFlag(26)) { m_dwUpperChrAction = CA_STUN; } else { if(m_dwUpperChrAction == CA_SWIM) { m_dwUpperChrAction = CA_SWIM; } else if(m_bSitMode) { m_dwUpperChrAction = CA_REST; } else if(!m_bStillCasting) { m_dwUpperChrAction = CA_WAIT; } } m_bUpperAble = TRUE; m_bUpperAnimating = FALSE; if(m_lpChrModel) { if(GetChantFlag(27)) { m_lpChrModel->SetAnimationSpeed(0.5f); } else { m_lpChrModel->SetAnimationSpeed(1.0f); } } } if(m_lpChrModel->IsActionFinished(1)) { if(m_dwLowerChrAction == CA_FIRE1 || m_dwLowerChrAction == CA_FIRE2 || m_dwLowerChrAction == CA_SHOT || m_dwLowerChrAction == CA_JUMPSHOT) { InitWeapon(1); } if(m_bCharDead) { m_bLowerAnimating = FALSE; } else { if(m_dwLowerChrAction==CA_LEFTDASH || m_dwLowerChrAction==CA_RIGHTDASH || m_dwLowerChrAction == CA_BACKDASH) { CSceneManager::CharacterFirstAccelate(m_lpChrModel,false); CSceneManager::AddDelayTimer(m_lpChrModel,30); } if(GetChantFlag(26)) { m_dwUpperChrAction = CA_STUN; } else { if(m_dwLowerChrAction == CA_SWIM) { m_dwLowerChrAction = CA_SWIM; } else if(m_bSitMode) { m_dwLowerChrAction = CA_REST; } else if(m_dwLowerChrAction != CA_FORWARDJUMP && m_dwLowerChrAction != CA_BACKJUMP && m_dwLowerChrAction != CA_JUMP && m_dwLowerChrAction != CA_FRONTDASH && !m_bStillCasting) { m_dwLowerChrAction = CA_WAIT; } } m_bLowerAble = TRUE; m_bLowerAnimating = FALSE; } } } void CCreature::Run(float fRunFactor) { if(m_bLowerAble) { if(m_bSitMode) { CrouchAndStandup(); return; } /* if(m_dwUpperChrAction == CA_ATTACK || m_dwUpperChrAction == CA_ATTACKADVANCE) { m_fRunFactor = 0.0f; if(!m_lpChrModel->IsActionFinished(0)) { SetAction(m_dwUpperChrAction, CA_WALK); return; } } */ if(m_fRunFactor < 155.0f) m_fRunFactor += fRunFactor; SetAction(CA_RUN, CA_RUN); } } void CCreature::WalkLeft() { if(m_bLowerAble) { m_fRunFactor = 0.0f; if(m_bSitMode) { CrouchAndStandup(); return; } SetAction(CA_WALKLEFT, CA_WALKLEFT); } } void CCreature::WalkRight() { if(m_bLowerAble) { m_fRunFactor = 0.0f; if(m_bSitMode) { CrouchAndStandup(); return; } SetAction(CA_WALKRIGHT, CA_WALKRIGHT); } } void CCreature::WalkBack() { if(m_bLowerAble) { m_fRunFactor = 0.0f; if(m_bSitMode) { CrouchAndStandup(); return; } SetAction(CA_WALKBACK, CA_WALKBACK); } } void CCreature::CrouchAndStandup(void) { if(m_bUpperAble && m_bLowerAble && m_lpChrModel) { m_fRunFactor = 0.0f; if(GetChantFlag(27)) { m_lpChrModel->SetAnimationSpeed(0.5f); } else { m_lpChrModel->SetAnimationSpeed(1.0f); } CSceneManager::CharacterMovementVector(m_lpChrModel, vector3(0.0f, 0.0f, 0.0f)); if(m_bSitMode) { InitWeapon(0); SetAction(CA_STANDUP, CA_STANDUP); m_bSitMode = FALSE; } else { InitWeapon(0); SetAction(CA_SITDOWN, CA_SITDOWN); m_bSitMode = TRUE; } } } void CCreature::Wait() { if(m_bUpperAble || m_bLowerAble) { m_fRunFactor = 0.0f; if(GetChantFlag(26)) { SetAction(CA_STUN, CA_STUN); } else { if(m_bSitMode) { /* if(m_dwUpperChrAction != CA_REST || m_dwLowerChrAction != CA_REST) { m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; }*/ SetAction(CA_REST, CA_REST); } else { /* if(m_dwUpperChrAction != CA_WAIT || m_dwLowerChrAction != CA_WAIT) { m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; }*/ SetAction(CA_WAIT, CA_WAIT); } } } } void CCreature::Dead() { // if(m_dwLowerChrAction != CA_FALLDOWN && m_dwUpperChrAction != CA_FALLDOWN) if(!m_bCharDead) { m_fRunFactor = 0.0f; m_dwAttackCombo = 0; m_dwSkillComboCount = 0; m_bSkillCombo = FALSE; /* if(g_CharacterData.m_lpButtonNormal) { CSceneManager::m_EffectManager.DeleteInterfaceScript(g_CharacterData.m_lpButtonNormal); g_CharacterData.m_lpButtonNormal = NULL; g_CharacterData.m_bComboSuccess = FALSE; } */ m_bSitMode = FALSE; m_fDeadTimer = 1.0f; m_bCharDead = TRUE; m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; if(m_lpChrModel) { m_lpChrModel->SetAnimationSpeed(1.0f); InitWeapon(0); CSceneManager::CharacterMovementVector(m_lpChrModel, vector3(0.0f, 0.0f, 0.0f)); CSceneManager::CharacterFirstAccelate(m_lpChrModel, false); SetAction(CA_FALLDOWN, CA_FALLDOWN); } else { SetAction(CA_FALLDOWN, CA_FALLDOWN); } } } BOOL CCreature::Attack(unsigned long dwUpperAni, unsigned long dwLowerAni) { if(m_bFlying) { // InitWeapon(1); if((m_dwLowerChrAction != CA_JUMPATTACK && m_dwLowerChrAction != CA_JUMPATTACK2) && m_bFlyFirstCheck) { if(m_wClass == 6 || m_wClass == 2 || m_wClass == 7 || m_wClass == 20 || m_wClass == 24) // Á¡ÇÁ °ø°Ý { m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; if(KeyPressed('S') && (m_wClass == 2 || m_wClass == 7 || m_wClass == 20)) // ³»·Á Âï±â { SetAction(CA_JUMPATTACK2, CA_JUMPATTACK2); } else { SetAction(CA_JUMPATTACK, CA_JUMPATTACK); } return TRUE; } } } if(m_bUpperAble) { // InitWeapon(1); m_fRunFactor = 0.0f; if(m_bSitMode) { CrouchAndStandup(); return TRUE; } unsigned long dwUpperAni2, dwLowerAni2; if(dwUpperAni == 0xFFFFFFFF && dwLowerAni == 0xFFFFFFFF) { switch(m_dwLowerChrAction) { case CA_WALK: case CA_RUN: dwUpperAni2 = CA_ATTACKADVANCE; dwLowerAni2 = m_dwLowerChrAction; break; case CA_WALKLEFT: dwUpperAni2 = CA_ATTACKLEFT; dwLowerAni2 = m_dwLowerChrAction; break; case CA_WALKRIGHT: dwUpperAni2 = CA_ATTACKRIGHT; dwLowerAni2 = m_dwLowerChrAction; break; case CA_WALKBACK: dwUpperAni2 = CA_ATTACKRETREAT; dwLowerAni2 = m_dwLowerChrAction; break; case CA_LEFTDASH: if(m_wClass == 1 || m_wClass == 5 || m_wClass == 6 || m_wClass == 19 || m_wClass == 20) // ´ë½¬ °ø°Ý { if(m_dwUpperChrAction == CA_LEFTDASH) m_dwUpperChrAction = CA_WAIT; dwUpperAni2 = CA_ATTACKLEFT; dwLowerAni2 = m_dwLowerChrAction; } else { return FALSE; } break; case CA_RIGHTDASH: if(m_wClass == 1 || m_wClass == 5 || m_wClass == 6 || m_wClass == 19 || m_wClass == 20) // ´ë½¬ °ø°Ý { if(m_dwUpperChrAction == CA_RIGHTDASH) m_dwUpperChrAction = CA_WAIT; dwUpperAni2 = CA_ATTACKRIGHT; dwLowerAni2 = m_dwLowerChrAction; } else { return FALSE; } break; default: switch(m_dwAttackCombo) { case 0: dwUpperAni2 = CA_ATTACK; dwLowerAni2 = CA_ATTACK; break; case 1: dwUpperAni2 = CA_ATTACK2; dwLowerAni2 = CA_ATTACK2; break; case 2: dwUpperAni2 = CA_ATTACK3; dwLowerAni2 = CA_ATTACK3; break; case 3: dwUpperAni2 = CA_ATTACK4; dwLowerAni2 = CA_ATTACK4; break; case 4: dwUpperAni2 = CA_ATTACK5; dwLowerAni2 = CA_ATTACK5; break; case 5: dwUpperAni2 = CA_ATTACK6; dwLowerAni2 = CA_ATTACK6; break; } break; } } else { dwUpperAni2 = dwUpperAni; dwLowerAni2 = dwLowerAni; } if(SetAction(dwUpperAni2, dwLowerAni2)) { if(m_strShape[11 + m_dwWeaponPos]) { if(m_lpChrModel) { if(GetChantFlag(27)) { m_lpChrModel->SetAnimationSpeed(0.55f); // 0.55 } else { m_lpChrModel->SetAnimationSpeed(1.10f); // 1.10 } } /* switch(CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos])) { case 6: case 7: case 8: if(m_lpChrModel && (m_wClass == 4 || m_wClass == 11 || m_wClass == 12 || m_wClass == 3 || m_wClass == 9 || m_wClass == 10)) // °ø¼Ó ´À·ÁÁö°Ô Çϱâ { if(GetChantFlag(27)) { m_lpChrModel->SetAnimationSpeed(0.5f); // 0.5 } else { m_lpChrModel->SetAnimationSpeed(1.0f); // 1.0 } } break; case 9: case 10: case 11: if(m_lpChrModel && (m_wClass == 2 || m_wClass == 7 || m_wClass == 8 || m_wClass == 4 || m_wClass == 11 || m_wClass == 12 || m_wClass == 3 || m_wClass == 9 || m_wClass == 10)) // °ø¼Ó ´À·ÁÁö°Ô Çϱâ { if(GetChantFlag(27)) { m_lpChrModel->SetAnimationSpeed(0.475f); // 0.475 } else { m_lpChrModel->SetAnimationSpeed(0.95f); // 0.95 } } break; } */ } return TRUE; } } return FALSE; } void CCreature::Respawn() { m_fRunFactor = 0.0f; m_bSitMode = FALSE; m_sDamage = 0; m_bCharDead = FALSE; for( int i=0; i < m_Arrow.size(); i++ ) { delete m_Arrow[i]; } m_Arrow.clear(); if(m_lpChrModel) { InitWeapon(0); m_lpChrModel->SetAnimationSpeed(1.0f); } for(i = 0; i < m_lstActionData.num;) { m_lstActionData.DelIndex(0); } m_lstActionData.num = 0; for(i = 0; i < m_lstDamageNumber.num;) { m_lstDamageNumber.DelIndex(0); } m_lstDamageNumber.num = 0; m_dwUpperChrAction = CA_WAIT; m_dwLowerChrAction = CA_WAIT; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_bUpperAble = TRUE; m_bLowerAble = TRUE; SetAction(CA_WAIT, CA_WAIT); } void CCreature::SetShape(char strShape[15][256]) { for(int i = 0; i < 15; i++) { strcpy(m_strShape[i], strShape[i]); } if(m_lpChrModel == NULL) return; if(m_cNation == 0) // Human { m_lpChrModel->BeginOutfitSetting(); m_lpChrModel->SetOutfitSlot("HEAD", m_strShape[0]); m_lpChrModel->SetOutfitSlot("BODY", m_strShape[1]); m_lpChrModel->SetOutfitSlot("BODY", m_strShape[2]); m_lpChrModel->SetOutfitSlot("BODY", m_strShape[3]); m_lpChrModel->SetOutfitSlot("HAND", m_strShape[4]); m_lpChrModel->SetOutfitSlot("FOOT", m_strShape[5]);/**/ m_lpChrModel->EndOutfitSetting(); m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]); m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]); } else if(m_cNation == 1) // Akhan { m_lpChrModel->BeginOutfitSetting(); m_lpChrModel->SetOutfitSlot("HEAD", m_strShape[0]); m_lpChrModel->SetOutfitSlot("BODY", m_strShape[3]); m_lpChrModel->SetOutfitSlot("PELVIS", m_strShape[5]);/**/ m_lpChrModel->SetOutfitSlot("ARM", m_strShape[4]); m_lpChrModel->SetOutfitSlot("SKILL", m_strShape[9]); m_lpChrModel->EndOutfitSetting(); m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]); } InitWeapon(1); } void CCreature::SkillAttack(unsigned long dwUpperAni, unsigned int dwLowerAni) { if(m_bUpperAble && m_bLowerAble) { SetAction(dwUpperAni, dwLowerAni); } } BOOL CCreature::Jump() { BOOL bResult = FALSE; if(m_bUpperAble && m_bLowerAble && !m_bSitMode) { if(m_dwLowerChrAction != CA_WAIT) { const char *strMotionSheet = m_lpChrModel->GetCurrentMotionSheetName(); if(strMotionSheet && (!strcmp(strMotionSheet, "CLASS_ROGUE") || !strcmp(strMotionSheet, "WEAPON_SHADOW_OFF") || !strcmp(strMotionSheet, "WEAPON_2CLAW") || !strcmp(strMotionSheet, "WEAPON_2DA"))) { if(KeyPressed('W')) bResult = SetAction(CA_FRONTDASH, CA_FRONTDASH); else if(KeyPressed('S')) { } else SetAction(CA_JUMP, CA_JUMP); } else { if(KeyPressed('W')) bResult = SetAction(CA_FORWARDJUMP, CA_FORWARDJUMP); else if(KeyPressed('S')) bResult = SetAction(CA_BACKJUMP, CA_BACKJUMP); else SetAction(CA_JUMP, CA_JUMP); } m_bLowerAble = FALSE; m_bLowerAble = FALSE; } else { SetAction(CA_JUMP, CA_JUMP); m_vecJumpAttackVector = vector3(0.0f, 0.0f, 0.0f); } m_bFlying = TRUE; //Jump sound// char strSoundFilename[256]; sprintf(strSoundFilename, "%s%s",SOUNDFILEPATH,"jump.wav"); try { CSoundManager &sm = CSoundManager::GetInstance(); ISoundObject &sb = sm.GetBuffer(strSoundFilename,true,false,1); int nBuffer; nBuffer = sb.Play(false); sb.SetPosition(nBuffer,m_vecPos.x,m_vecPos.y,m_vecPos.z); sb.SetDistance(nBuffer,1000.0f,2000.0f); } catch(exception &e) { static bool bFirstShowMessage=false; if(bFirstShowMessage==false) { MessageBox(NULL,e.what(),0,0); bFirstShowMessage=true; } } ///////////// return bResult; } return bResult; } BOOL CCreature::Dash(int nDir) { if(m_bUpperAble && !m_bSitMode) { /* m_bUpperAnimating = TRUE; m_bLowerAnimating = TRUE; m_bUpperAble = FALSE; m_bLowerAble = FALSE; */ /* CCameraControl::m_fCameraShakeRateTime=3000.0f/30.0f; CCameraControl::m_fCameraShakeNowTime=0.0f; CCameraControl::m_vecCameraShakeLength=vector3(10.0f,10.0f,10.0f); */ //CCameraControl::SetFadeOut(1000.0f,5000.0f,1000.0f); //CCameraControl::SetFadeOut(30.0f,60.0f,30.0f); /* color c; c.c=0xff660000; */ //CCameraControl::SetFadeIn(1.0f,2.0f,10.0f,c); //SetFadeIn(float fStart,float fMaintenance,float fEnd,color FadeColor); BOOL bResult; switch(nDir) { case 0: bResult = SetAction(CA_LEFTDASH, CA_LEFTDASH); break; case 1: bResult = SetAction(CA_RIGHTDASH, CA_RIGHTDASH); break; case 2: bResult = SetAction(CA_BACKDASH, CA_BACKDASH); break; } m_bUpperAble = TRUE; return bResult; } return FALSE; } void CCreature::BeginCast(char *strMotion) { m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]); if(dwWeapon != 14 && // STAFF strcmp(strMotion, "AIMED_SHOT1")) { InitWeapon(0); } else { if(m_cNation == 0) { InitWeapon(1); } else if(m_cNation == 1) { InitWeapon(0); } } SetAction(strMotion, strMotion); } void CCreature::EndSkill(char *strMotion) { m_bStillCasting = FALSE; m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; if(strcmp(strMotion, "FIRE1") && strcmp(strMotion, "FIRE2") && strcmp(strMotion, "SHOT") && strcmp(strMotion, "JUMP_SHOT")) { InitWeapon(1); } SetAction(strMotion, strMotion); } void CCreature::InitWeapon(unsigned long dwEquip) { if(m_lpChrModel) { switch(dwEquip) { case 0: if(m_cNation == 0) { m_lpChrModel->SetMotionSheet("NO_WEAPON"); // m_lpChrModel->SetAttachmentSlot("ETC", ""); m_lpChrModel->SetAttachmentHolder("WEAPON", 0); m_lpChrModel->SetAttachmentHolder("SHIELD", 2); m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]); m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]); } else if(m_cNation == 1) { m_lpChrModel->SetMotionSheet("NO_WEAPON"); // m_lpChrModel->SetAttachmentSlot("ETC", ""); m_lpChrModel->SetAttachmentHolder("WEAPON", 0); m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]); } break; case 1: if(CCharacterControl::GetMotionSheet) { if(m_bSitMode) { InitWeapon(0); } else { if(m_cNation == 0) { char *strMotionSheet = CCharacterControl::GetMotionSheet(m_strShape[11 + m_dwWeaponPos], m_strShape[9 + m_dwWeaponPos], m_wClass); // ¸ð¼Ç½ÃÆ® ¾Ë¾Æ³»±â m_lpChrModel->SetMotionSheet(strMotionSheet); /* if(!strcmp(strMotionSheet, "WEAPON_BOW") || !strcmp(strMotionSheet, "WEAPON_CROSSBOW")) { m_lpChrModel->SetAttachmentSlot("ETC", "QUIVER"); } else { m_lpChrModel->SetAttachmentSlot("ETC", ""); }*/ if(!strcmp(strMotionSheet, "NO_WEAPON_B")) { m_bNoneComboAttackMode = FALSE; } else { m_bNoneComboAttackMode = TRUE; } m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]); m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]); m_lpChrModel->SetAttachmentHolder("WEAPON", 1); m_lpChrModel->SetAttachmentHolder("SHIELD", 3); } else if(m_cNation == 1) { char *strMotionSheet = CCharacterControl::GetMotionSheet(m_strShape[11], m_strShape[9], m_wClass); // ¸ð¼Ç½ÃÆ® ¾Ë¾Æ³»±â m_lpChrModel->SetMotionSheet(strMotionSheet); if(!strcmp(strMotionSheet, "NO_WEAPON_B")) { m_bNoneComboAttackMode = FALSE; } else { m_bNoneComboAttackMode = TRUE; } m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]); m_lpChrModel->SetAttachmentHolder("WEAPON", 1); } } } else // Ŭ¶óÀÌ¾ðÆ® ¿Ü ó¸® { m_lpChrModel->SetMotionSheet("WEAPON_ONE_HAND"); m_lpChrModel->SetAttachmentHolder("WEAPON", 1); m_bNoneComboAttackMode = TRUE; /* m_lpChrModel->SetAttachmentSlot("ETC", ""); m_lpChrModel->SetMotionSheet("WEAPON_ONE_HAND"); m_lpChrModel->SetAttachmentSlot("WEAPON","BASTARD_SWORD"); m_lpChrModel->SetAttachmentSlot("SHIELD","LARGE_SHIELD"); */ } break; } } } void CCreature::CancelSkill() { m_bStillCasting = FALSE; if(m_dwUpperChrAction == CA_CASTING || m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 || m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2) { m_bUpperAble = TRUE; m_bLowerAble = TRUE; m_bUpperAnimating = FALSE; m_bLowerAnimating = FALSE; m_dwUpperChrAction = CA_WAIT; m_dwLowerChrAction = CA_WAIT; Wait(); } } BOOL CCreature::Casting(unsigned long dwUpperAni, unsigned long dwLowerAni) { unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]); m_bStillCasting = TRUE; if(m_bUpperAble) { if(dwWeapon != 14 && // STAFF ((dwLowerAni != CA_AIMEDSHOT1 && dwLowerAni != CA_AIMEDSHOT2) && (m_dwLowerChrAction != CA_AIMEDSHOT1 && m_dwLowerChrAction != CA_AIMEDSHOT2))) { InitWeapon(0); } else { if(m_cNation == 0) { InitWeapon(1); } else if(m_cNation == 1) { InitWeapon(0); } } m_fRunFactor = 0.0f; if(m_bSitMode) { CrouchAndStandup(); return TRUE; } unsigned long dwUpperAni2, dwLowerAni2; if(dwUpperAni == 0xFFFFFFFF && dwLowerAni == 0xFFFFFFFF) { if(m_dwLowerChrAction == CA_AIMEDSHOT1) { dwUpperAni2 = CA_AIMEDSHOT2; dwLowerAni2 = CA_AIMEDSHOT2; } else if(m_dwLowerChrAction == CA_TURNPUNCH1) { dwUpperAni2 = CA_TURNPUNCH2; dwLowerAni2 = CA_TURNPUNCH2; } else { dwUpperAni2 = m_dwUpperChrAction; dwLowerAni2 = m_dwLowerChrAction; } } else { dwUpperAni2 = dwUpperAni; dwLowerAni2 = dwLowerAni; } return SetAction(dwUpperAni2, dwLowerAni2); } return FALSE; } void CCreature::ArrowUpdate() { // ¸ö¿¡ ¸ÂÀº È­»ìµé ¾÷µ¥ÀÌÆ® if(m_bArrowExist) { int i; for(i=0;im_ArrowEsf)) //delete DeleteArrow(i); if(m_Arrow[i] != NULL) { D3DXVECTOR3 bodypos; D3DXVECTOR3 effectfwd; CZ3DObject *body; if(m_lpChrModel != NULL) { body = m_lpChrModel->GetSkeletonPartObject(m_Arrow[i]->m_PivotName); if(body != NULL) { /*matrix *body_tm = body->GetTM(); bodypos.x = body_tm->_41; bodypos.y = body_tm->_42; bodypos.z = body_tm->_43; */ vector3 body_tm; quaternion body_q; D3DXQUATERNION tmp; float body_scale = 0.0f; body_scale = m_lpChrModel->GetScale(); body->GetDirection(body_q); body->GetPosition(body_tm); bodypos.x = body_tm.x; bodypos.y = body_tm.y; bodypos.z = body_tm.z; bodypos *= body_scale; tmp.x = body_q.x; tmp.y = body_q.y; tmp.z = body_q.z; tmp.w = body_q.w; m_Arrow[i]->m_ArrowEsf->SetExt4Rot(tmp); m_Arrow[i]->m_ArrowEsf->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_Arrow[i]->m_ArrowEsf->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); } else { delete m_Arrow[i]; m_Arrow[i] = NULL; m_Arrow.erase(&(m_Arrow[i])); } } else { delete m_Arrow[i]; m_Arrow[i] = NULL; m_Arrow.erase(&(m_Arrow[i])); } } } } } void CCreature::ArrowUpdate(int i) { if(m_Arrow[i] != NULL) { D3DXVECTOR3 bodypos; D3DXVECTOR3 effectfwd; CZ3DObject *body; if(m_lpChrModel != NULL) { body = m_lpChrModel->GetSkeletonPartObject(m_Arrow[i]->m_PivotName); if(body != NULL) { /*matrix *body_tm = body->GetTM(); bodypos.x = body_tm->_41; bodypos.y = body_tm->_42; bodypos.z = body_tm->_43; */ vector3 body_tm; quaternion body_q; D3DXQUATERNION tmp; body->GetPosition(body_tm); body->GetDirection(body_q); float body_scale = 0.0f; body_scale = m_lpChrModel->GetScale(); bodypos.x = body_tm.x; bodypos.y = body_tm.y; bodypos.z = body_tm.z; bodypos *= body_scale; tmp.x = body_q.x; tmp.y = body_q.y; tmp.z = body_q.z; tmp.w = body_q.w; m_Arrow[i]->m_ArrowEsf->SetExt4Rot(tmp); m_Arrow[i]->m_ArrowEsf->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_Arrow[i]->m_ArrowEsf->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); } else { delete m_Arrow[i]; m_Arrow[i] = NULL; m_Arrow.erase(&(m_Arrow[i])); } } else { delete m_Arrow[i]; m_Arrow[i] = NULL; m_Arrow.erase(&(m_Arrow[i])); } } } void CCreature::AddArrow(char *pivot,D3DXQUATERNION rot,int division) { CCreatureArrow *AddNode; AddNode = new CCreatureArrow; strcpy(AddNode->m_PivotName,pivot); if(m_Arrow.size() > 2) { // È­»ì°¹¼ö Á¦ÇÑ delete m_Arrow[0]; m_Arrow.erase(&m_Arrow[0]); } m_Arrow.push_back(AddNode); m_bArrowExist = true; AddNode->m_ArrowEsf = new CEffScript; AddNode->m_ArrowEsf->SetExt4SelfInfo(rot); CSceneManager::AddEffectScript((AddNode->m_ArrowEsf)); switch(division) { case 0: if(rand() % 2) AddNode->m_ArrowEsf->GetScriptData("arrow_body.esf"); else AddNode->m_ArrowEsf->GetScriptData("arrow_body2.esf"); break; case 1: AddNode->m_ArrowEsf->GetScriptData("dagger_body1.esf"); break; case 2: AddNode->m_ArrowEsf->GetScriptData("dagger_body2.esf"); break; case 3: AddNode->m_ArrowEsf->GetScriptData("dagger_body3.esf"); break; case 4: AddNode->m_ArrowEsf->GetScriptData("dagger_body4.esf"); break; case 5: AddNode->m_ArrowEsf->GetScriptData("dagger_body5.esf"); break; } ArrowUpdate(m_Arrow.size() -1); } void CCreature::SetSlideValue(CEffScript::CEffExt6 value){ m_SlideValue = value; m_bSlide = true; } void CCreature::PlaySlide() { if(GetChantFlag(25)) { // hold½Ã slide ÀÛµ¿ x m_bSlide = false; return ; } if(m_bSlide) { float fChrDir = GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); vector3 tmp; vector3 *char_pos; float tmp_length; if(m_SlideValue.m_CurrentSlideLength < m_SlideValue.m_SlideLength) { tmp = vecChrToward * (m_SlideValue.m_SlideSpeed); tmp *= (-1.0f); m_SlideValue.m_SlideSpeed += m_SlideValue.m_SlideAccel; if(m_SlideValue.m_SlideAccel <= 0.0f) { if(m_SlideValue.m_SlideSpeed < m_SlideValue.m_LimitSpeed) m_SlideValue.m_SlideSpeed = m_SlideValue.m_LimitSpeed; } else { if(m_SlideValue.m_SlideSpeed > m_SlideValue.m_LimitSpeed) m_SlideValue.m_SlideSpeed = m_SlideValue.m_LimitSpeed; } } else { tmp.x = 0.0f; tmp.y = 0.0f; tmp.z = 0.0f; m_bSlide = false; } tmp_length = tmp.GetLens(); m_SlideValue.m_CurrentSlideLength += tmp_length; vector3 before_pos; char_pos = GetPosition(); before_pos.x = char_pos->x; before_pos.y = char_pos->y; before_pos.z = char_pos->z; SetPosition(char_pos->x + tmp.x,char_pos->y,char_pos->z + tmp.z); // slide ¸ÕÁö render if(m_bSlide && (!m_bFlying)) //RenderSlide(before_pos.x - tmp.x,before_pos.y,before_pos.z - tmp.x,char_pos->x - tmp.x,char_pos->y,char_pos->z - tmp.x,30.0f); RenderSlide(before_pos.x,before_pos.y,before_pos.z,char_pos->x,char_pos->y,char_pos->z,30.0f); /*if(m_SlideEffect != NULL && m_bSlide) { //snap if(!CSceneManager::m_EffectManager.CheckNullScript(m_SlideEffect)) { m_SlideEffect->SetSnapPos(char_pos->x + tmp.x,char_pos->y,char_pos->z + tmp.z); } else m_SlideEffect = NULL; }*/ } } void CCreature::RenderSlide(float beforex,float beforey,float beforez,float nowx,float nowy,float nowz,float unitsize) { //unitsize : ÀÌÆÑÆ® »çÀÌ °£°Ý float vec_length = 0.0f; int unitcount = 0; D3DXVECTOR3 tmp_vec; D3DXVECTOR3 tmp_vec2(0.0f,0.0f,0.0f); D3DXVECTOR3 r_foot; D3DXVECTOR3 l_foot; tmp_vec.x = nowx - beforex; tmp_vec.y = nowy - beforey; tmp_vec.z = nowz - beforez; vec_length = D3DXVec3Length(&tmp_vec); D3DXVec3Normalize(&tmp_vec,&tmp_vec); CZ3DObject *snappoint = NULL; float body_scale = 0.0f; if(m_lpChrModel == NULL) //model ÀÌ NULL À϶§ skip return; //rfoot snappoint = m_lpChrModel->GetSkeletonPartObject("R_FOOT"); body_scale = m_lpChrModel->GetScale(); if(snappoint != NULL) { vector3 snaptm; snappoint->GetPosition(snaptm); r_foot.x = snaptm.x; r_foot.y = snaptm.y; r_foot.z = snaptm.z; r_foot *= body_scale; } //lfoot snappoint = m_lpChrModel->GetSkeletonPartObject("L_FOOT"); body_scale = m_lpChrModel->GetScale(); if(snappoint != NULL) { vector3 snaptm; snappoint->GetPosition(snaptm); l_foot.x = snaptm.x; l_foot.y = snaptm.y; l_foot.z = snaptm.z; l_foot *= body_scale; } while(vec_length > D3DXVec3Length(&tmp_vec2)) { // À̹ø¿¡ ¹Ì²ø¸° °Å¸®¿Í ±× ÀÌÀüÀÇ À§Ä¡ »çÀÌ¿¡ effect Ãâ·Â D3DXVECTOR3 effectpos(nowx,nowy,nowz); tmp_vec2 += tmp_vec * unitsize; //rfoot CX3DEffect *pEffect = NULL; pEffect=new CX3DEffect; CSceneManager::AddEffect(pEffect); pEffect->Load(EFFECTPATH,"smoke.eff"); pEffect->SetLoop(FALSE); pEffect->SetAxis(0.0f,0.0f,0.0f); pEffect->SetCenter(effectpos.x - tmp_vec2.x + r_foot.x, effectpos.y - tmp_vec2.y + r_foot.y + 20.0f, effectpos.z - tmp_vec2.z + r_foot.z); pEffect->SetFrame((float)(unitcount * 2.0f)); //lfoot CX3DEffect *pEffect2 = NULL; pEffect2=new CX3DEffect; CSceneManager::AddEffect(pEffect2); pEffect2->Load(EFFECTPATH,"smoke.eff"); pEffect2->SetLoop(FALSE); pEffect2->SetAxis(0.0f,0.0f,0.0f); pEffect2->SetCenter(effectpos.x - tmp_vec2.x + l_foot.x, effectpos.y - tmp_vec2.y + l_foot.y + 20.0f, effectpos.z - tmp_vec2.z + l_foot.z); pEffect2->SetFrame((float)(unitcount * 2.0f)); unitcount++; } } void CCreature::DeleteArrow(int index) { int i; for(i=0;i= 0; i-- ) { if(m_BodyEffect[i]->m_EffId == id) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } if(m_BodyEffect.size() <= 0) { m_bBodyEffect = false; m_BodyEffect.clear(); } } void CCreature::DeleteBodyEffect(char *pivot) { int i; if(pivot != NULL) { for( i = m_BodyEffect.size() - 1; i >= 0; i-- ) { if(strlen(m_BodyEffect[i]->m_PivotName) > 1) { if(!strcmp(m_BodyEffect[i]->m_PivotName,pivot)) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } } if(m_BodyEffect.size() <= 0) { m_bBodyEffect = false; m_BodyEffect.clear(); } } /* int i; if(pivot != NULL){ for(i=0;im_PivotName) > 1) { if(!strcmp(m_BodyEffect[i]->m_PivotName,pivot)) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } } if(m_BodyEffect.size() <= 0) { m_bBodyEffect = false; m_BodyEffect.clear(); } } */ } void CCreature::DeleteBodyEffectName(char *effectname) { int i; for(i = m_BodyEffect.size() - 1; i >= 0; i-- ) { if(!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)) { if(!strcmp(effectname,m_BodyEffect[i]->m_Effect->m_FileName)) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } else { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } if(m_BodyEffect.size() <= 0) { m_bBodyEffect = false; m_BodyEffect.clear(); } } void CCreature::DeleteBodyEffect() { int i; for( i = m_BodyEffect.size() - 1; i >= 0; i-- ) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; } m_bBodyEffect = false; m_BodyEffect.clear(); } //ÇöÀç body effect list¾È¿¡ ÀÌ ÀÌÆÑÆ®°¡ Á¸Àç ÇÏ´ÂÁö °Ë»ç bool CCreature::CheckInBodyEffect(char *file) { int i; for(i=0;im_Effect->m_FileName,file) != NULL) return true; } return false; } // pivot index¿¡ effect ºÙÀÓ void CCreature::AddBodyEffect(char *filename,int pivotindex,bool rot,unsigned long effid) { char *ptr = strrchr(filename,'.'); D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f); long pivotnum = 0; if(!m_lpChrModel) return; m_lpChrModel->GetSkeletonSet(&pivotnum); if((filename == NULL) || (pivotindex < 0) || (pivotindex >= pivotnum)) return; if(!m_lpChrModel) return; /* if(CheckInBodyEffect(filename)) { // ±âÁ¸¿¡ ÀÖ´ø °°Àº Á¾·ùÀÇ effect ¸¦ »èÁ¦ÈÄ À̹ø °ÍÀ» ¿Ã¸°´Ù. DeleteBodyEffectName(filename); } */ m_bBodyEffect = true; CCreatureEffect *tmp_node = NULL; tmp_node = new CCreatureEffect; m_BodyEffect.push_back(tmp_node); if(strstr(ptr,"eff") != NULL) { //'snap' eff use tmp_node->m_EffValue = true; tmp_node->m_bPivotRot = rot; tmp_node->m_PivotIndex = pivotindex; tmp_node->m_EffId = effid; strcpy(tmp_node->m_EffName,filename); } else { //'snap' esf use tmp_node->m_EffId = effid; tmp_node->m_EffValue = false; tmp_node->m_bPivotRot = rot; tmp_node->m_Effect = new CEffScript; tmp_node->m_Effect->GetScriptData(filename); if(rot) tmp_node->m_Effect->SetExt4SelfInfo(tmpquat); tmp_node->m_PivotIndex = pivotindex; CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect); } BodyEffectUpdate(m_BodyEffect.size() -1); } // pivot Çϳª¿¡ effect ºÙÀÓ void CCreature::AddBodyEffect(char *filename,char *pivot,bool rot,unsigned long effid) { char *ptr = strrchr(filename,'.'); D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f); if((filename == NULL) || (pivot == NULL)) return; if(!m_lpChrModel) return; /* if(CheckInBodyEffect(filename)) { // ±âÁ¸¿¡ ÀÖ´ø °°Àº Á¾·ùÀÇ effect ¸¦ »èÁ¦ÈÄ À̹ø °ÍÀ» ¿Ã¸°´Ù. DeleteBodyEffectName(filename); } */ m_bBodyEffect = true; CCreatureEffect *tmp_node = NULL; tmp_node = new CCreatureEffect; m_BodyEffect.push_back(tmp_node); if(strstr(ptr,"eff") != NULL) { //snap eff use tmp_node->m_EffId = effid; tmp_node->m_EffValue = true; tmp_node->m_bPivotRot = rot; strcpy(tmp_node->m_PivotName,pivot); strcpy(tmp_node->m_EffName,filename); } else { //'snap' esf use tmp_node->m_EffId = effid; tmp_node->m_bPivotRot = rot; tmp_node->m_Effect = new CEffScript; tmp_node->m_Effect->GetScriptData(filename); strcpy(tmp_node->m_PivotName,pivot); if(rot) tmp_node->m_Effect->SetExt4SelfInfo(tmpquat); CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect); } BodyEffectUpdate(m_BodyEffect.size() -1); } // pivot Áß¿¡ ·»´ý ÇÏ°Ô num °¹¼ö ¸¸Å­ effect ºÙÀÓ (num °ªÀÌ -1À̸é Àü pivot ¿¡ ´Ù ºÙÀÓ) void CCreature::AddBodyEffect(char *filename,bool rot,unsigned long effid,int num) { int i; long pivotnum = 0; D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f); if(!m_lpChrModel) return; m_lpChrModel->GetSkeletonSet(&pivotnum); if(pivotnum <= 0) return; if((filename == NULL) || (strlen(filename) < 1)) return; /* if(CheckInBodyEffect(filename)) { // ±âÁ¸¿¡ ÀÖ´ø °°Àº Á¾·ùÀÇ effect ¸¦ »èÁ¦ÈÄ À̹ø °ÍÀ» ¿Ã¸°´Ù. DeleteBodyEffectName(filename); } */ m_bBodyEffect = true; if(num >0) { for(i=0;im_EffId = effid; tmp_node->m_bPivotRot = rot; tmp_node->m_Effect = new CEffScript; tmp_node->m_Effect->GetScriptData(filename); tmp_node->m_PivotIndex = rand() % pivotnum; if(rot) tmp_node->m_Effect->SetExt4SelfInfo(tmpquat); CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect); BodyEffectUpdate(m_BodyEffect.size() -1); } } else if(num == -1) { // Àü pivot¿¡ effect ºÙÀÓ for(i=0;im_bPivotRot = rot; tmp_node->m_Effect = new CEffScript; tmp_node->m_Effect->GetScriptData(filename); tmp_node->m_PivotIndex = i; tmp_node->m_EffId = effid; if(rot) tmp_node->m_Effect->SetExt4SelfInfo(tmpquat); CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect); BodyEffectUpdate(m_BodyEffect.size() -1); } } else { // num 0 return; } } // ij¸¯ÀÇ ¼¾ÅÍ¿¡ effect ºÙÀϰæ¿ì void CCreature::AddBodyEffect(char *filename,unsigned long effid,bool mine,bool bvis) { if(!m_lpChrModel) return; if((filename == NULL) || (strlen(filename) < 1)) return; if(CheckInBodyEffect(filename)) { // ±âÁ¸¿¡ °°Àº Á¾·ùÀÇ effect °¡ ÀÖ´Ù¸é À̹ø°Í ¹«½Ã. return; //DeleteBodyEffectName(filename); } m_bBodyEffect = true; CCreatureEffect *tmp_node = NULL; tmp_node = new CCreatureEffect; m_BodyEffect.push_back(tmp_node); tmp_node->m_bPivotRot = false; tmp_node->m_EffId = effid; tmp_node->m_Effect = new CEffScript; tmp_node->m_Effect->GetScriptData(filename); //´©±¸ÀÇ °ÍÀÎÁö tmp_node->m_Effect->SetMine(mine); tmp_node->m_Effect->SetChant(true); //////////////// Monster Effect // ij¸¯ ¹æÇâ »ý¼º float fChrDir = m_fDirection; fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); tmp_node->m_Effect->SetChr(m_lpChrModel,m_lpChrModel); tmp_node->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); //////////////// CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect); BodyEffectUpdate(m_BodyEffect.size() -1); } void CCreature::BodyEffectUpdate(int i) { if(m_BodyEffect[i] != NULL) { D3DXVECTOR3 bodypos; D3DXVECTOR3 effectfwd; //modified by Ppu // CZ3DObject body; CZ3DObject* body; CZ3DSkeletonObject *pivotarray = NULL; long pivotnum = 0; if(m_lpChrModel != NULL) { if(m_BodyEffect[i]->m_PivotIndex != -1) { pivotarray = m_lpChrModel->GetSkeletonSet(&pivotnum); } else if(strlen(m_BodyEffect[i]->m_PivotName) > 1){ CZ3DObject *tmp_ptr = NULL; tmp_ptr = m_lpChrModel->GetSkeletonPartObject(m_BodyEffect[i]->m_PivotName); if(tmp_ptr == NULL) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); return; } //modified by Ppu // body = (*tmp_ptr); body = tmp_ptr; } else { vector3 charpos = m_lpChrModel->GetPosition(); m_BodyEffect[i]->m_Effect->SetStartPos(charpos.x,charpos.y,charpos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); return ; } if(1) { vector3 body_tm; quaternion body_q; D3DXQUATERNION tmp; if(m_BodyEffect[i]->m_PivotIndex!=-1) { pivotarray[m_BodyEffect[i]->m_PivotIndex].GetPosition(body_tm); pivotarray[m_BodyEffect[i]->m_PivotIndex].GetDirection(body_q); } else { //modified by Ppu // body.GetPosition(body_tm); //modified by Ppu // body.GetDirection(body_q); body->GetPosition(body_tm); body->GetDirection(body_q); } float body_scale = 0.0f; body_scale = m_lpChrModel->GetScale(); bodypos.x = body_tm.x; bodypos.y = body_tm.y; bodypos.z = body_tm.z; bodypos *= body_scale; tmp.x = body_q.x; tmp.y = body_q.y; tmp.z = body_q.z; tmp.w = body_q.w; if(m_BodyEffect[i]->m_EffValue) { //m_BodyEffect[i] use eff file /////////// m_BodyEffect[i]->m_EffPos.x = m_vecPos.x + bodypos.x; m_BodyEffect[i]->m_EffPos.y = m_vecPos.y + bodypos.y; m_BodyEffect[i]->m_EffPos.z = m_vecPos.z + bodypos.z; ////////// } else { // m_BodyEffect[i] use esf file if(m_BodyEffect[i]->m_bPivotRot) m_BodyEffect[i]->m_Effect->SetExt4Rot(tmp); m_BodyEffect[i]->m_Effect->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); } } else { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } else { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } } void CCreature::BodyEffectUpdate() { if(m_bBodyEffect) { int i; for(i=0;im_EffValue || (!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)))) { D3DXVECTOR3 bodypos; D3DXVECTOR3 effectfwd; //modified by Ppu // CZ3DObject body; CZ3DObject* body; CZ3DSkeletonObject *pivotarray = NULL; long pivotnum = 0; if(m_lpChrModel != NULL) { if(m_BodyEffect[i]->m_PivotIndex != -1) { pivotarray = m_lpChrModel->GetSkeletonSet(&pivotnum); } else if(strlen(m_BodyEffect[i]->m_PivotName)>1){ CZ3DObject *tmp_ptr = NULL; tmp_ptr = m_lpChrModel->GetSkeletonPartObject(m_BodyEffect[i]->m_PivotName); if(tmp_ptr == NULL) { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); return; } //modified by Ppu // body = (*tmp_ptr); body = tmp_ptr; } else { vector3 charpos = m_lpChrModel->GetPosition(); m_BodyEffect[i]->m_Effect->SetStartPos(charpos.x,charpos.y,charpos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); continue; } if(1) { vector3 body_tm; quaternion body_q; D3DXQUATERNION tmp; float body_scale = 0.0f; body_scale = m_lpChrModel->GetScale(); if(m_BodyEffect[i]->m_PivotIndex != -1) { pivotarray[m_BodyEffect[i]->m_PivotIndex].GetPosition(body_tm); pivotarray[m_BodyEffect[i]->m_PivotIndex].GetDirection(body_q); } else { //modified by Ppu // body.GetDirection(body_q); //modified by Ppu // body.GetPosition(body_tm); body->GetDirection(body_q); body->GetPosition(body_tm); } bodypos.x = body_tm.x; bodypos.y = body_tm.y; bodypos.z = body_tm.z; bodypos *= body_scale; tmp.x = body_q.x; tmp.y = body_q.y; tmp.z = body_q.z; tmp.w = body_q.w; if(m_BodyEffect[i]->m_EffValue) { //m_BodyEffect[i] use eff file /////////// //snap effect render(30.0f : effect °£°Ý) RenderSnap(m_BodyEffect[i]->m_EffPos.x,m_BodyEffect[i]->m_EffPos.y,m_BodyEffect[i]->m_EffPos.z, m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z,30.0f,m_BodyEffect[i]->m_EffName); m_BodyEffect[i]->m_EffPos.x = m_vecPos.x + bodypos.x; m_BodyEffect[i]->m_EffPos.y = m_vecPos.y + bodypos.y; m_BodyEffect[i]->m_EffPos.z = m_vecPos.z + bodypos.z; ////////// } else { //m_BodyEffect[i] use esf file if(m_BodyEffect[i]->m_bPivotRot) m_BodyEffect[i]->m_Effect->SetExt4Rot(tmp); m_BodyEffect[i]->m_Effect->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); } } else { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } else { delete m_BodyEffect[i]; m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } } else {//if((m_BodyEffect[i] != NULL) && (!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect))) { if(!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)) { delete m_BodyEffect[i]; } m_BodyEffect[i] = NULL; m_BodyEffect.erase(&(m_BodyEffect[i])); } }//for }//if } void CCreature::SetEffect() { // ³ªÁß¿¡ character¿¡ effect ºÙÀ϶§ ¾²´Â ÄÚµå // GCMDS ¿¡¼­ ij¸¯¿¡ ºÙ´Â effect filename°ú pivot ¸íÀ» ³Ñ°ÜÁÜ /* if(m_lpChrModel != NULL) { //if(strstr(m_lpChrModel->GetGCMDSFileName(),"PC_Akhan_A.GCMDS") != NULL) { long effectnum = 0; const Z3D_EFFECT_INFO **ChrEffect; effectnum = m_lpChrModel->GetEffectInfoList(ChrEffect); DeleteBodyEffect(); for(int i=0;iszESFName,ChrEffect[i]->szSkelName,true); } //} } */ } void CCreature::RenderSnap(float beforex,float beforey,float beforez,float nowx,float nowy,float nowz,float unitsize,char *eff) { // snap effect Áß eff ¸¦ ÀÌ¿ëÇÏ´Â °Íµé. //unitsize : ÀÌÆÑÆ® »çÀÌ °£°Ý float vec_length = 0.0f; int unitcount = 0; D3DXVECTOR3 tmp_vec; D3DXVECTOR3 tmp_vec2(0.0f,0.0f,0.0f); tmp_vec.x = nowx - beforex; tmp_vec.y = nowy - beforey; tmp_vec.z = nowz - beforez; vec_length = D3DXVec3Length(&tmp_vec); D3DXVec3Normalize(&tmp_vec,&tmp_vec); while(vec_length > D3DXVec3Length(&tmp_vec2)) { D3DXVECTOR3 effectpos(nowx,nowy,nowz); tmp_vec2 += tmp_vec * unitsize; //rfoot CX3DEffect *pEffect = NULL; pEffect=new CX3DEffect; CSceneManager::AddEffect(pEffect); pEffect->Load(EFFECTPATH,eff); pEffect->SetLoop(FALSE); pEffect->SetAxis(0.0f,0.0f,0.0f); pEffect->SetCenter(effectpos.x - tmp_vec2.x, effectpos.y - tmp_vec2.y, effectpos.z - tmp_vec2.z); pEffect->SetFrame((float)(unitcount * 2.0f)); unitcount++; } } BOOL CCreature::GetSkillMotion() { if(m_dwLowerChrAction == CA_SHOT || m_dwLowerChrAction == CA_JUMPSHOT || m_dwLowerChrAction == CA_FIRE1 || m_dwLowerChrAction == CA_FIRE2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 || m_dwLowerChrAction == CA_AIMEDSHOT3 || m_dwLowerChrAction == CA_OVERBASH1 || m_dwLowerChrAction == CA_OVERBASH2 || m_dwLowerChrAction == CA_OVERBASH3 || m_dwLowerChrAction == CA_OVERBASH4 || m_dwLowerChrAction == CA_OVERBASH5 || m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_TURNPUNCH3 || m_dwLowerChrAction == CA_COMBINATIONBLOW || m_dwLowerChrAction == CA_BACKSTAB || m_dwLowerChrAction == CA_POWERDRAIN || m_dwLowerChrAction == CA_BASH || m_dwLowerChrAction == CA_ROUNDSWING) { return TRUE; } return FALSE; } void CCreature::SetChantEffect(unsigned long dwChant, BOOL bSelf) { unsigned long i, dwChantFlag; for(i = 0; i < 32; i++) { dwChantFlag = 0x00000001 << i; if(dwChant & dwChantFlag) SetChantEffect(i + 1, TRUE, bSelf); else SetChantEffect(i + 1, FALSE, bSelf); } m_dwChant = dwChant; } void CCreature::SetChantEffect(unsigned long dwChant, BOOL bToggle, BOOL bSelf) { bool bMySelf; if(bSelf) bMySelf = true; else bMySelf = false; if(bToggle) { switch(dwChant) { case 1: AddBodyEffect("Chant_BattleSong.esf",(unsigned long)0, bMySelf); break; case 2: AddBodyEffect("Chant_MaintenanceChant.esf",(unsigned long)0, bMySelf); break; case 3: AddBodyEffect("Chant_AccelerationChant.esf",(unsigned long)0, bMySelf); break; case 4: AddBodyEffect("Chant_LifeAura.esf",(unsigned long)0, bMySelf); break; case 17: break; case 18: AddBodyEffect("Chant_ManaShell2.esf",(unsigned long)0, bMySelf); break; case 19: AddBodyEffect("Chant_Encourage.esf",(unsigned long)0, bMySelf); break; case 20: AddBodyEffect("Chant_EnchantWeapon.esf",(unsigned long)0, bMySelf); break; case 21: AddBodyEffect("Chant_BrightArmor.esf",(unsigned long)0, bMySelf); break; case 22: AddBodyEffect("Chant_HardenSkin.esf",(unsigned long)0, bMySelf); break; case 23: AddBodyEffect("Chant_Flexibility.esf",(unsigned long)0, bMySelf); break; case 24: AddBodyEffect("Chant_Guard.esf",(unsigned long)0, bMySelf); break; case 25: AddBodyEffect("Chant_Hold.esf",(unsigned long)0, bMySelf); break; case 26: AddBodyEffect("Chant_Stun.esf",(unsigned long)0, bMySelf); break; case 27: AddBodyEffect("Chant_Frozen.esf",(unsigned long)0, bMySelf); break; case 28: AddBodyEffect("Chant_Poisoned.esf",(unsigned long)0, bMySelf); break; case 29: AddBodyEffect("Chant_LowerStrength.esf",(unsigned long)0, bMySelf); break; } m_dwChant += (0x00000001 << (dwChant - 1)); } else { switch(dwChant) { case 1: DeleteBodyEffectName("Chant_BattleSong.esf"); break; case 2: DeleteBodyEffectName("Chant_MaintenanceChant.esf"); break; case 3: DeleteBodyEffectName("Chant_AccelerationChant.esf"); break; case 4: DeleteBodyEffectName("Chant_LifeAura.esf"); break; case 17: break; case 18: DeleteBodyEffectName("Chant_ManaShell2.esf"); break; case 19: DeleteBodyEffectName("Chant_Encourage.esf"); break; case 20: DeleteBodyEffectName("Chant_EnchantWeapon.esf"); break; case 21: DeleteBodyEffectName("Chant_BrightArmor.esf"); break; case 22: DeleteBodyEffectName("Chant_HardenSkin.esf"); break; case 23: DeleteBodyEffectName("Chant_Flexibility.esf"); break; case 24: DeleteBodyEffectName("Chant_Guard.esf"); break; case 25: DeleteBodyEffectName("Chant_Hold.esf"); break; case 26: DeleteBodyEffectName("Chant_Stun.esf"); break; case 27: DeleteBodyEffectName("Chant_Frozen.esf"); break; case 28: DeleteBodyEffectName("Chant_Poisoned.esf"); break; case 29: DeleteBodyEffectName("Chant_LowerStrength.esf"); break; } m_dwChant -= (0x00000001 << (dwChant - 1)); } } void CCreature::SetWeaponLine(LPDIRECT3DTEXTURE8 lpTexture,int iColor[3],int iBlend) { m_bWeaponLine = true; if(m_pWeaponLine == NULL) m_pWeaponLine = new CWeaponLine; m_pWeaponLine->m_lpLineTexture = lpTexture; m_pWeaponLine->m_iBlend = iBlend; if(iColor[0] == -1) m_pWeaponLine->m_iColor[0] = rand() % 256; else m_pWeaponLine->m_iColor[0] = iColor[0]; if(iColor[1] == -1) m_pWeaponLine->m_iColor[1] = rand() % 256; else m_pWeaponLine->m_iColor[1] = iColor[1]; if(iColor[2] == -1) m_pWeaponLine->m_iColor[2] = rand() % 256; else m_pWeaponLine->m_iColor[2] = iColor[2]; } void CCreature::DeleteWeaponLine() { if((m_lpChrModel != NULL) && (m_bWeaponLine == true) && (m_pWeaponLine != NULL)) { // WEAPON ½½·Ô¿¡ µé¾îÀÖ´Â ¹«±â class Get CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" ); if(pWp == NULL) //¹«±â Á¸ÀçÇÏÁö ¾ÊÀ»¶§ return; CZ3DBladeTrail* pBladeTrail = pWp->GetBladeTrailInterface(); if( pBladeTrail ) { // Ãʱ⠰˱⠺¹±¸ pBladeTrail->SetRGB(255,255,255); pBladeTrail->SetTexture((LPDIRECT3DTEXTURE8)NULL); pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_ONE ); } delete m_pWeaponLine; m_pWeaponLine = NULL; m_bWeaponLine = false; } else { delete m_pWeaponLine; m_pWeaponLine = NULL; m_bWeaponLine = false; } } void CCreature::WeaponLineUpdate() { if((m_lpChrModel != NULL) && (m_bWeaponLine == true) && (m_pWeaponLine != NULL)) { // WEAPON ½½·Ô¿¡ µé¾îÀÖ´Â ¹«±â class Get CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" ); if(pWp == NULL) //¹«±â Á¸ÀçÇÏÁö ¾ÊÀ»¶§ return; CZ3DBladeTrail* pBladeTrail = pWp->GetBladeTrailInterface(); if( pBladeTrail ) { pBladeTrail->SetRGB( m_pWeaponLine->m_iColor[0], //R m_pWeaponLine->m_iColor[1], //G m_pWeaponLine->m_iColor[2]); //B if(m_pWeaponLine->m_lpLineTexture != NULL) pBladeTrail->SetTexture( m_pWeaponLine->m_lpLineTexture ); // Texture else pBladeTrail->SetTexture((LPDIRECT3DTEXTURE8)NULL); switch(m_pWeaponLine->m_iBlend) { case 0: pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_ONE ); break; case 1: pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA ); break; case 2: pBladeTrail->SetSecondRenderBlend(D3DBLEND_ONE, D3DBLEND_ONE ); break; } } } else { delete m_pWeaponLine; m_pWeaponLine = NULL; m_bWeaponLine = false; } } void CCreature::AddWeaponEffect(char *esfname,int effectnum) { if(m_lpChrModel != NULL) { /// ¹«±âÀÇ Ã³À½°ú ³¡À» ¾Ë¾Æ³½´Ù. vector3 v1, v2; vector3 v3; // WEAPON ½½·Ô¿¡ µé¾îÀÖ´Â ¹«±â class Get CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" ); // óÀ½Á¡, ³¡Á¡ ¾ò¾î³½´Ù. (v1,v2 ¾î¶²°ÍÀÌ À§ÀÇ Á¡ÀÎÁö´Â ¾Ë¼ö ¾ø´ç) //»ó´ëÁÂÇ¥ÀÌ´Ù. if(pWp == NULL) //¹«±â Á¸ÀçÇÏÁö ¾ÊÀ»¶§ return; pWp->GetMarker( v1, v2 ); /// // »ó´ëÁÂÇ¥À̹ǷΠ½Ç ÁÂÇ¥´Â (¹«±âÁÂÇ¥ + ij¸¯ÅÍ ÁÂÇ¥) ÀÌ´Ù. v1 += m_vecPos; v2 += m_vecPos; v3 = v2 - v1; m_bWeaponEffect = true; int i; for( i=0; im_nWeaponEffectNum = effectnum; node->m_nWeaponPosNum = i; strcpy(node->m_strEffect,esfname); node->m_pEffect = new CEffScript; node->m_pEffect->GetScriptData(esfname); //lopv1 == ÀÌÆÑÆ® À§Ä¡ node->m_pEffect->SetStartPos( lopv1.x, lopv1.y, lopv1.z ); node->m_pEffect->SetEndPos( lopv1.x, lopv1.y, lopv1.z ); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); node->m_pEffect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); CSceneManager::m_EffectManager.AddEffScript(node->m_pEffect); m_WeaponEffect.push_back(node); } } } void CCreature::DeleteWeaponEffect() //Àü weapon effect delete { int i; for( i=0; i < m_WeaponEffect.size(); i++ ) { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; } m_bWeaponEffect = false; m_WeaponEffect.clear(); } void CCreature::DeleteWeaponEffect(char *esfname,int iNum) //esfnameÀ» °¡Áö´Â effect delete { int i; int iEffNum = iNum; for( i = m_WeaponEffect.size() - 1; i >= 0; i-- ) { if(m_WeaponEffect[i] != NULL) { if( !CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect) ) { if( !strcmp(esfname,m_WeaponEffect[i]->m_strEffect) ) { if(iEffNum) // Áö¿ì´Â °¹¼ö Çѵµ¸¦ ³ÑÁö ¾Ê´Â´Ù { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; m_WeaponEffect.erase(&(m_WeaponEffect[i])); iEffNum--; } } } else { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } else { m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } /* for( i=0; i < m_WeaponEffect.size(); i++ ) { if( !CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect) ) { if( !strcmp(esfname,m_WeaponEffect[i]->m_strEffect) ) { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } else { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } */ if(m_WeaponEffect.size() <= 0) { m_bWeaponEffect = false; m_WeaponEffect.clear(); } } void CCreature::WeaponEffectUpdate() { int i; if(m_bWeaponEffect) //µî·ÏµÈ Weapon Effect °¡ ÀÖÀ»¶§ { if(m_lpChrModel) { /// ¹«±âÀÇ Ã³À½°ú ³¡À» ¾Ë¾Æ³½´Ù. vector3 v1, v2; vector3 v3; // WEAPON ½½·Ô¿¡ µé¾îÀÖ´Â ¹«±â class Get CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" ); if(pWp == NULL) { //ij¸¯ÅͰ¡ ¹«±â ¾Êµé¾úÀ»½Ã¿¡ weapon effect Àüü »èÁ¦ DeleteWeaponEffect(); return; } // óÀ½Á¡, ³¡Á¡ ¾ò¾î³½´Ù. (v1,v2 ¾î¶²°ÍÀÌ À§ÀÇ Á¡ÀÎÁö´Â ¾Ë¼ö ¾ø´ç) //»ó´ëÁÂÇ¥ÀÌ´Ù. pWp->GetMarker( v1, v2 ); /// // »ó´ëÁÂÇ¥À̹ǷΠ½Ç ÁÂÇ¥´Â (¹«±âÁÂÇ¥ + ij¸¯ÅÍ ÁÂÇ¥) ÀÌ´Ù. v1 += m_vecPos; v2 += m_vecPos; v3 = v2 - v1; if( m_WeaponEffect.size() > 0 ) { for( i=0; i < m_WeaponEffect.size(); i++ ) { if(m_WeaponEffect[i] != NULL) { float veclen = (m_WeaponEffect[i]->m_nWeaponPosNum + 1) / (float)(m_WeaponEffect[i]->m_nWeaponEffectNum + 1); vector3 lopv1 = v1; lopv1 += v3 * veclen; //lopv1ÀÌ Update µÉ effectÀÇ À§Ä¡ // 6. 16ÀÏ Update if(m_WeaponEffect[i]->m_pEffect != NULL && !(CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect))){ m_WeaponEffect[i]->m_pEffect->SetStartPos(lopv1.x,lopv1.y,lopv1.z); m_WeaponEffect[i]->m_pEffect->SetEndPos(lopv1.x,lopv1.y,lopv1.z); float fChrDir = m_fDirection = m_lpChrModel->GetDirection(); fChrDir = -fChrDir; fChrDir -= FLOAT_PHI / 2.0f; vector3 vecChrToward; vecChrToward.x = cosf(fChrDir); vecChrToward.z = sinf(fChrDir); vecChrToward.y = 0.0f; vecChrToward.Normalize(); m_WeaponEffect[i]->m_pEffect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z); } else { delete m_WeaponEffect[i]; m_WeaponEffect[i] = NULL; m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } else { m_WeaponEffect.erase(&(m_WeaponEffect[i])); } } //for } //if( m_WeaponEffect.size() > 0 ) else { m_WeaponEffect.clear(); m_bWeaponEffect = false; } }//if(m_lpChrModel) else { DeleteWeaponEffect(); } } }