Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6601 lines
191 KiB
C++
6601 lines
191 KiB
C++
#include "CEffscript.h"
|
|
#include "BaseDataDefine.h"
|
|
#include "SceneNode.h"
|
|
#include "SceneManager.h"
|
|
#include "CameraControl.h"
|
|
#include "CharacterControl.h"
|
|
#include "EffDebugLog.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
|
|
|
|
#define __EFF_WCREATOR__ // World Creator 컴파일 할시에만 define 해준다
|
|
|
|
#include <exception>
|
|
|
|
|
|
const char* szName = "이펙트 스크립터";
|
|
CFixedPool CEffScript::ms_myPool(sizeof(CEffScript), 200, szName, strlen(szName));
|
|
|
|
#ifndef __EFF_WCREATOR__ //client compile 시
|
|
|
|
extern CCharacterControl g_CharacterData;
|
|
|
|
#endif
|
|
|
|
void CEffScript::Clone(CEffScript *Clone)
|
|
{
|
|
int i;
|
|
|
|
Clone->m_FileLoad = m_FileLoad;
|
|
Clone->m_bVisibility = m_bVisibility;
|
|
Clone->m_SubScriptNum = m_SubScriptNum;
|
|
|
|
if(!m_SubScriptNum) {
|
|
Clone->m_EffNum = m_EffNum;
|
|
Clone->m_EffList = new CEffInfo[m_EffNum];
|
|
for(i = 0;i < m_EffNum; i++ ) {
|
|
strcpy(Clone->m_EffList[i].m_EffName,m_EffList[i].m_EffName);
|
|
Clone->m_EffList[i].m_Scale = m_EffList[i].m_Scale;
|
|
Clone->m_EffList[i].m_MinFrame = m_EffList[i].m_MinFrame;
|
|
Clone->m_EffList[i].m_FadeInNum = m_EffList[i].m_FadeInNum;
|
|
int iFadeInNum = m_EffList[i].m_FadeInNum;
|
|
|
|
if(iFadeInNum) {
|
|
Clone->m_EffList[i].m_FadeInStart = new int[iFadeInNum];
|
|
Clone->m_EffList[i].m_FadeIn = new D3DXVECTOR3[iFadeInNum];
|
|
Clone->m_EffList[i].m_FadeColor = new color[iFadeInNum];
|
|
Clone->m_EffList[i].m_FadeInSwitch = new bool[iFadeInNum];
|
|
memcpy(Clone->m_EffList[i].m_FadeInStart,m_EffList[i].m_FadeInStart,sizeof(int) * iFadeInNum);
|
|
memcpy(Clone->m_EffList[i].m_FadeIn,m_EffList[i].m_FadeIn,sizeof(D3DXVECTOR3) * iFadeInNum);
|
|
memcpy(Clone->m_EffList[i].m_FadeColor,m_EffList[i].m_FadeColor,sizeof(color) * iFadeInNum);
|
|
memcpy(Clone->m_EffList[i].m_FadeInSwitch,m_EffList[i].m_FadeInSwitch,sizeof(bool) * iFadeInNum);
|
|
}
|
|
//clight
|
|
Clone->m_EffList[i].m_CLightNum = m_EffList[i].m_CLightNum;
|
|
int iCLightNum = m_EffList[i].m_CLightNum;
|
|
if(iCLightNum) {
|
|
Clone->m_EffList[i].m_CLightStart = new int[iCLightNum];
|
|
Clone->m_EffList[i].m_CLightColor = new color[iCLightNum];
|
|
Clone->m_EffList[i].m_CLightDistance = new float[iCLightNum];
|
|
Clone->m_EffList[i].m_CLightTime = new DWORD[iCLightNum];
|
|
Clone->m_EffList[i].m_CLightSwitch = new bool[iCLightNum];
|
|
Clone->m_EffList[i].m_CLightTarget = new int[iCLightNum];
|
|
|
|
memcpy(Clone->m_EffList[i].m_CLightStart,m_EffList[i].m_CLightStart,sizeof(int) * iCLightNum);
|
|
memcpy(Clone->m_EffList[i].m_CLightColor,m_EffList[i].m_CLightColor,sizeof(color) * iCLightNum);
|
|
memcpy(Clone->m_EffList[i].m_CLightDistance,m_EffList[i].m_CLightDistance,sizeof(float) * iCLightNum);
|
|
memcpy(Clone->m_EffList[i].m_CLightTime,m_EffList[i].m_CLightTime,sizeof(DWORD) * iCLightNum);
|
|
memcpy(Clone->m_EffList[i].m_CLightSwitch,m_EffList[i].m_CLightSwitch,sizeof(bool) * iCLightNum);
|
|
memcpy(Clone->m_EffList[i].m_CLightTarget,m_EffList[i].m_CLightTarget,sizeof(int) * iCLightNum);
|
|
}
|
|
// speed value
|
|
Clone->m_EffList[i].m_SpeedValue[0] = m_EffList[i].m_SpeedValue[0];
|
|
Clone->m_EffList[i].m_SpeedValue[1] = m_EffList[i].m_SpeedValue[1];
|
|
Clone->m_EffList[i].m_SpeedValue[2] = m_EffList[i].m_SpeedValue[2];
|
|
// Accel
|
|
Clone->m_EffList[i].m_AccelValue[0] = m_EffList[i].m_AccelValue[0];
|
|
Clone->m_EffList[i].m_AccelValue[1] = m_EffList[i].m_AccelValue[1];
|
|
Clone->m_EffList[i].m_AccelValue[2] = m_EffList[i].m_AccelValue[2];
|
|
// startpos
|
|
Clone->m_EffList[i].m_StartPos[0] = m_EffList[i].m_StartPos[0];
|
|
Clone->m_EffList[i].m_StartPos[1] = m_EffList[i].m_StartPos[1];
|
|
Clone->m_EffList[i].m_StartPos[2] = m_EffList[i].m_StartPos[2];
|
|
Clone->m_EffList[i].m_bStartRot = m_EffList[i].m_bStartRot;
|
|
//loop
|
|
Clone->m_EffList[i].m_LoopStart = m_EffList[i].m_LoopStart;
|
|
Clone->m_EffList[i].m_LoopEnd = m_EffList[i].m_LoopEnd;
|
|
Clone->m_EffList[i].m_LoopSwitch = m_EffList[i].m_LoopSwitch;
|
|
|
|
//camera shake value
|
|
Clone->m_EffList[i].m_ShakeNum = m_EffList[i].m_ShakeNum;
|
|
int iShakeNum = m_EffList[i].m_ShakeNum;
|
|
if(iShakeNum > 0) {
|
|
Clone->m_EffList[i].m_Shake = new CEffShake[iShakeNum];
|
|
memcpy(Clone->m_EffList[i].m_Shake,m_EffList[i].m_Shake,sizeof(CEffShake) * iShakeNum);
|
|
|
|
}
|
|
else
|
|
Clone->m_EffList[i].m_Shake = NULL;
|
|
|
|
//sound
|
|
Clone->m_EffList[i].m_SoundNum = m_EffList[i].m_SoundNum;
|
|
|
|
if(m_EffList[i].m_SoundNum> 0) {
|
|
Clone->m_EffList[i].m_Sound = new CEffSound[m_EffList[i].m_SoundNum];
|
|
memcpy(Clone->m_EffList[i].m_Sound,m_EffList[i].m_Sound,sizeof(CEffSound) * m_EffList[i].m_SoundNum);
|
|
}
|
|
else {
|
|
Clone->m_EffList[i].m_Sound = NULL;
|
|
|
|
}
|
|
//hit
|
|
Clone->m_EffList[i].m_HitFrameNum = m_EffList[i].m_HitFrameNum;
|
|
|
|
int iHitNum = m_EffList[i].m_HitFrameNum;
|
|
|
|
if(iHitNum> 0) {
|
|
Clone->m_EffList[i].m_HitFrame = new int[iHitNum];
|
|
memcpy(Clone->m_EffList[i].m_HitFrame,m_EffList[i].m_HitFrame,sizeof(int) * iHitNum);
|
|
}
|
|
|
|
////////
|
|
|
|
Clone->m_EffList[i].m_Ext6ValueNum = m_EffList[i].m_Ext6ValueNum;
|
|
Clone->m_EffList[i].m_SnapNum = m_EffList[i].m_SnapNum;
|
|
|
|
//
|
|
|
|
int iExt6Num = m_EffList[i].m_Ext6ValueNum;
|
|
|
|
if(iExt6Num > 0) { // slide
|
|
Clone->m_EffList[i].m_Ext6Value= new CEffExt6[iExt6Num];
|
|
memcpy(Clone->m_EffList[i].m_Ext6Value,m_EffList[i].m_Ext6Value,sizeof(CEffExt6) * iExt6Num);
|
|
}
|
|
// snap read
|
|
int iSnapNum = m_EffList[i].m_SnapNum;
|
|
if(iSnapNum > 0) {
|
|
Clone->m_EffList[i].m_Snap= new CEffSnap[iSnapNum];
|
|
memcpy(Clone->m_EffList[i].m_Snap,m_EffList[i].m_Snap,sizeof(CEffSnap) * iSnapNum);
|
|
}
|
|
|
|
|
|
////////
|
|
} //for (Eff)
|
|
|
|
|
|
Clone->m_bExt5ex = m_bExt5ex;
|
|
Clone->m_LningNum = m_LningNum; //번개
|
|
Clone->m_WheelNum = m_WheelNum; //궤적
|
|
Clone->m_WeaponEffNum = m_WeaponEffNum; //weapon effect
|
|
Clone->m_bBezierMid = m_bBezierMid; // Bezier Middle
|
|
Clone->m_iLight = m_iLight; // Vertex Light
|
|
Clone->m_bPlayTime = m_bPlayTime; // Play Time
|
|
Clone->m_bLightn2 = m_bLightn2; // Lightning2
|
|
Clone->m_bEffCharacter = m_bEffCharacter;// Character Effect
|
|
Clone->m_bEffWeaponLine = m_bEffWeaponLine;// Weapon Line
|
|
|
|
if(m_bExt5ex) { //extension5 extension
|
|
if(Clone->m_Ext5Value == NULL) {
|
|
Clone->m_Ext5Value = new CEffExt5;
|
|
}
|
|
Clone->m_bExt5 = m_bExt5;
|
|
strcpy(Clone->m_Ext5Value->m_TextureName,m_Ext5Value->m_TextureName);
|
|
Clone->m_Ext5Value->m_Rand = m_Ext5Value->m_Rand;
|
|
Clone->m_Ext5Value->m_LineSize = m_Ext5Value->m_LineSize;
|
|
|
|
}
|
|
if(m_LningNum >0) { // 번개효과
|
|
Clone->m_bLightning = m_bLightning; //번개 bit = true
|
|
Clone->m_Lning = new CEffLightn[m_LningNum];
|
|
memcpy(Clone->m_Lning,m_Lning,sizeof(CEffLightn) * m_LningNum);
|
|
|
|
for(int ln = 0;ln < m_LningNum;ln++) {
|
|
Clone->m_Lning[ln].m_Lightn = NULL;
|
|
Clone->m_Lning[ln].m_Lightn = new CLightning[m_Lning[ln].m_LnNum]; //CLightning 객체 생성
|
|
}
|
|
}
|
|
|
|
if(m_WheelNum >0) { // 궤적 라인
|
|
Clone->m_bWheel = m_bWheel;
|
|
Clone->m_Wheel = new CEffWheel[m_WheelNum];
|
|
|
|
for(int ln=0;ln< m_WheelNum;ln++) {
|
|
Clone->m_Wheel[ln].m_BlendMode = m_Wheel[ln].m_BlendMode;
|
|
Clone->m_Wheel[ln].m_PlaneSize = m_Wheel[ln].m_PlaneSize;
|
|
Clone->m_Wheel[ln].m_PlaneValue = m_Wheel[ln].m_PlaneValue;
|
|
Clone->m_Wheel[ln].m_PointNum = m_Wheel[ln].m_PointNum;
|
|
strcpy(Clone->m_Wheel[ln].m_TexName,m_Wheel[ln].m_TexName);
|
|
Clone->m_Wheel[ln].m_UnitUv = m_Wheel[ln].m_UnitUv;
|
|
|
|
}
|
|
}
|
|
|
|
if(m_WeaponEffNum > 0) { //weapon effect
|
|
Clone->m_bWeaponEff = m_bWeaponEff;
|
|
Clone->m_WeaponEff = new CEffWeapon[m_WeaponEffNum];
|
|
memcpy(Clone->m_WeaponEff,m_WeaponEff,sizeof(CEffWeapon) * m_WeaponEffNum);
|
|
}
|
|
if(m_bBezierMid == true ) { // Bezier Middle
|
|
Clone->m_pBezierMid = new CEffBezier;
|
|
memcpy(Clone->m_pBezierMid,m_pBezierMid,sizeof(CEffBezier));
|
|
|
|
Clone->m_pBezierMid->m_pBezierLine = NULL;
|
|
Clone->m_pBezierMid->m_nBezierPoint = 30; // 총 제어점 갯수
|
|
}
|
|
|
|
if(m_iLight > 0) { // Vertex Light
|
|
Clone->m_pLight = new CEffLight[m_iLight];
|
|
memcpy(Clone->m_pLight,m_pLight,sizeof(CEffLight) * m_iLight);
|
|
}
|
|
if(m_bPlayTime == true) { // PlayTime
|
|
|
|
Clone->m_iStartPlayTime = m_iStartPlayTime;
|
|
Clone->m_iEndPlayTime = m_iEndPlayTime;
|
|
Clone->m_bVisTime = m_bVisTime;
|
|
}
|
|
if(m_bLightn2 == true) { // Lightning2
|
|
Clone->m_pLightn2 = new CEffLightn2;
|
|
memcpy(Clone->m_pLightn2,m_pLightn2,sizeof(CEffLightn2));
|
|
|
|
Clone->m_pLightn2->m_pLightn = new CEffLightn[(Clone->m_pLightn2->m_iMaxLine)];
|
|
Clone->m_pLightn2->m_pTextureName = new CEffTextureDef[(Clone->m_pLightn2->m_iMaxLine)];
|
|
memcpy( Clone->m_pLightn2->m_pTextureName,m_pLightn2->m_pTextureName,sizeof(CEffTextureDef) * (m_pLightn2->m_iMaxLine));
|
|
|
|
GetBinLightn2(); // Sub Lightning 객체 생성및 처리
|
|
}
|
|
if(m_bEffCharacter == true) {
|
|
Clone->m_pEffCharacter = new CEffChar;
|
|
memcpy(Clone->m_pEffCharacter,m_pEffCharacter,sizeof(CEffChar));
|
|
}
|
|
if(m_bEffWeaponLine == true) { // 검기 관련 제어 Load (WEAPONLINE:)
|
|
Clone->m_pEffWeaponLine = new CEffWeaponLine;
|
|
|
|
memcpy(Clone->m_pEffWeaponLine,m_pEffWeaponLine,sizeof(CEffWeaponLine));
|
|
Clone->m_pEffWeaponLine->m_pLineTexture = new CTexture; // 검기 관련 텍스쳐
|
|
CTexture::SetPath(EFFECTTEXTUREPATH);
|
|
Clone->m_pEffWeaponLine->m_pLineTexture->Load(Clone->m_pEffWeaponLine->m_strTextureName);
|
|
|
|
}
|
|
|
|
//interface pos
|
|
Clone->m_bInterfacePos = m_bInterfacePos;
|
|
Clone->m_InterfacePos[0] = m_InterfacePos[0];
|
|
Clone->m_InterfacePos[1] = m_InterfacePos[1];
|
|
/////////////////////CEffPlay
|
|
|
|
// start id info
|
|
Clone->m_EffPlayData.m_StartIdNum = m_EffPlayData.m_StartIdNum;
|
|
Clone->m_EffPlayData.m_StartCount = m_EffPlayData.m_StartCount;
|
|
Clone->m_EffPlayData.m_StartFrameNextEff = m_EffPlayData.m_StartFrameNextEff;
|
|
|
|
if(m_EffPlayData.m_StartIdNum > 0) {
|
|
Clone->m_EffPlayData.m_StartId = new int[m_EffPlayData.m_StartIdNum];
|
|
memcpy(Clone->m_EffPlayData.m_StartId,m_EffPlayData.m_StartId,sizeof(int) * m_EffPlayData.m_StartIdNum);
|
|
}
|
|
|
|
//mid info
|
|
Clone->m_EffPlayData.m_MidEffIdNum = m_EffPlayData.m_MidEffIdNum;
|
|
Clone->m_EffPlayData.m_MidCount = m_EffPlayData.m_MidCount;
|
|
|
|
if(m_EffPlayData.m_MidEffIdNum > 0) {
|
|
Clone->m_EffPlayData.m_MidEffId = new int[m_EffPlayData.m_MidEffIdNum];
|
|
memcpy(Clone->m_EffPlayData.m_MidEffId,m_EffPlayData.m_MidEffId,sizeof(int) * m_EffPlayData.m_MidEffIdNum);
|
|
}
|
|
//end info
|
|
Clone->m_EffPlayData.m_EndPos[0] = m_EffPlayData.m_EndPos[0];
|
|
Clone->m_EffPlayData.m_EndPos[1] = m_EffPlayData.m_EndPos[1];
|
|
Clone->m_EffPlayData.m_EndPos[2] = m_EffPlayData.m_EndPos[2];
|
|
|
|
|
|
Clone->m_EffPlayData.m_EndEffIdNum = m_EffPlayData.m_EndEffIdNum;
|
|
Clone->m_EffPlayData.m_EndCount = m_EffPlayData.m_EndCount;
|
|
|
|
if(m_EffPlayData.m_EndEffIdNum > 0) {
|
|
Clone->m_EffPlayData.m_EndEffId = new int[m_EffPlayData.m_EndEffIdNum];
|
|
memcpy(Clone->m_EffPlayData.m_EndEffId,m_EffPlayData.m_EndEffId,sizeof(int) * m_EffPlayData.m_EndEffIdNum);
|
|
}
|
|
|
|
//speed accel min max speed
|
|
Clone->m_EffPlayData.m_Speed = m_EffPlayData.m_Speed;
|
|
Clone->m_EffPlayData.m_MaxSpeed = m_EffPlayData.m_MaxSpeed;
|
|
Clone->m_EffPlayData.m_MinSpeed = m_EffPlayData.m_MinSpeed;
|
|
Clone->m_EffPlayData.m_Accel = m_EffPlayData.m_Accel;
|
|
|
|
// mid direct
|
|
Clone->m_EffPlayData.m_Direct = m_EffPlayData.m_Direct;
|
|
Clone->m_EffPlayData.m_MidEffNum = m_EffPlayData.m_MidEffNum;
|
|
Clone->m_EffPlayData.m_StartMidNextEff = m_EffPlayData.m_StartMidNextEff;
|
|
/////////////////////////////
|
|
//other value set
|
|
Clone->m_StartPosSet = m_StartPosSet;
|
|
Clone->m_StartPos = m_StartPos;
|
|
Clone->m_MidPos = m_MidPos;
|
|
Clone->m_OldMidPos = m_OldMidPos;
|
|
Clone->m_MidUnit = m_MidUnit;
|
|
Clone->m_MidRot = m_MidRot;
|
|
Clone->m_NotRot = m_NotRot;
|
|
|
|
// endpos set
|
|
Clone->m_EndPosNum = m_EndPosNum;
|
|
if(m_EndPosNum >0) {
|
|
Clone->m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
memcpy(Clone->m_EndPos,m_EndPos,sizeof(D3DXVECTOR3) * m_EndPosNum );
|
|
|
|
}
|
|
else
|
|
Clone->m_EndPos = NULL;
|
|
|
|
//delay frame tickframe
|
|
Clone->m_DelayFrame = m_DelayFrame;
|
|
Clone->m_TickFrame = m_TickFrame;
|
|
|
|
//fade out write
|
|
Clone->m_FadeOut[0] = m_FadeOut[0];
|
|
Clone->m_FadeOut[1] = m_FadeOut[1];
|
|
Clone->m_FadeOut[2] = m_FadeOut[2];
|
|
|
|
|
|
|
|
|
|
}
|
|
else {
|
|
Clone->m_NextScript = new int[m_SubScriptNum];
|
|
Clone->m_SubScript = new CEffScript[m_SubScriptNum];
|
|
|
|
memcpy(Clone->m_NextScript,m_NextScript,sizeof(int) * m_SubScriptNum);
|
|
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
strcpy(Clone->m_SubScript[i].m_FileName,m_SubScript[i].m_FileName);
|
|
GetSubClone(i,Clone,Clone->m_SubScript[i].m_FileName);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
CEffScript :: CEffScript() {
|
|
memset(m_FileName,0,sizeof(char) * ESBUF_SIZE);
|
|
|
|
m_ScriptValue = ESNORMAL;
|
|
|
|
m_StartChr = NULL;
|
|
m_EndChr = NULL;
|
|
|
|
m_MidShootFrame = 0;
|
|
m_Weapone = ESEMPTY;
|
|
m_Sex = ESEMPTY;
|
|
|
|
del_count = 0;
|
|
m_NotRot = false;
|
|
//m_Wheel = NULL;
|
|
m_MidUnit.x= m_MidUnit.y = m_MidUnit.z = 0.0f;
|
|
m_MidRot.x = m_MidRot.y = m_MidRot.z = 0.0f;
|
|
m_ScriptFile = NULL;
|
|
m_EffList = NULL;
|
|
m_EffNum = 0;
|
|
m_CurrentNum = 0;
|
|
m_StartPosSet = false;
|
|
m_StartPos.x = m_StartPos.y = m_StartPos.z = 0.0f;
|
|
m_MidPos.x = m_MidPos.y = m_MidPos.z = 0.0f;
|
|
m_bMidFwd = false;
|
|
m_OldMidPos.x = m_OldMidPos.y = m_OldMidPos.z = 0.0f;
|
|
// fwd vector
|
|
m_ChrFwd.x = m_ChrFwd.y = m_ChrFwd.z = 0.0f;
|
|
|
|
// 운동중인 mid effect의 속도
|
|
m_MidSpeed = 0.0f;
|
|
m_EndPos = NULL;
|
|
m_EndPosNum = 0;
|
|
//start
|
|
m_ProcCount = ESEMPTY;
|
|
m_DelayFrame = 0;
|
|
m_FadeOut[0] = m_FadeOut[1] = m_FadeOut[2] = ESEMPTY;
|
|
m_FadeOutStart = false;
|
|
m_TickFrame = DEFAULTESTICK;
|
|
m_lstEff.clear();
|
|
m_Mine = true;
|
|
m_bSkill = false;
|
|
|
|
m_CheckCrash = false;
|
|
m_MulPos = 1.0f;
|
|
|
|
m_InterfacePos[0] = 0.0f;
|
|
m_InterfacePos[1] = 0.0f;
|
|
m_bInterfacePos = false;
|
|
// m_InterfacePos 가 화면 좌표인지 설정 (true : 화면 좌표)
|
|
m_bInterfaceSet = false;
|
|
|
|
// sub 스크립트 이용시
|
|
m_SubScript = NULL;
|
|
m_NextScript = NULL;
|
|
m_SubFirstLoad = false;
|
|
m_SubScriptNum = 0;
|
|
m_FileLoad = false;
|
|
m_CurrentSubScript = 0;
|
|
srand(timeGetTime());
|
|
DelayTick = 0.0f;
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
|
|
m_Projection.x = m_Projection.y = m_Projection.z = 0.0f;
|
|
|
|
m_bWorldEffect = false;
|
|
m_WorldAxis[0] = m_WorldAxis[1] = m_WorldAxis[2] = 0.0f;
|
|
m_bExt1 = false;
|
|
m_bExt2 = false;
|
|
m_bExt3 = false;
|
|
m_bExt3Crash = false;
|
|
m_bExt1Crash = false;
|
|
|
|
m_bExt4 = false;
|
|
m_bExt4InfoSet = false;
|
|
m_Ext4Ptr = NULL;
|
|
m_Ext4Pivot = ESEMPTY;
|
|
|
|
m_Ext4Quat.x = 0.0f;
|
|
m_Ext4Quat.y = 0.0f;
|
|
m_Ext4Quat.z = 0.0f;
|
|
m_Ext4Quat.w = 1.0f;
|
|
|
|
m_Ext4Object.x = 0.0f;
|
|
m_Ext4Object.y = 0.0f;
|
|
m_Ext4Object.z = 0.0f;
|
|
m_Ext4Object.w = 1.0f;
|
|
|
|
m_bExt4First = false;
|
|
|
|
m_bExt5 = false;
|
|
m_Ext5Value = NULL;
|
|
m_bExt5ex = false;
|
|
|
|
oldfwd_vec.x = oldfwd_vec.y = oldfwd_vec.z = 0.0f;
|
|
fwd_vec.x = fwd_vec.y = fwd_vec.z = 0.0f;
|
|
pos_vec.x = pos_vec.y = pos_vec.z = 0.0f;
|
|
m_EndChrChest = -1.0f;
|
|
m_bCast = false;
|
|
m_bPosSet = true;
|
|
m_Player = NULL;
|
|
m_PlayerID = 0;
|
|
|
|
m_bExt7 = false;
|
|
m_bExt8 = false;
|
|
m_bExt9 = false;
|
|
|
|
m_bLightning = false;
|
|
m_Lning = NULL;
|
|
m_LningNum = 0;
|
|
m_Chant = false;
|
|
|
|
m_Wheel = NULL;
|
|
m_WheelNum = 0;
|
|
m_bWheel = false;
|
|
m_bWheelStart = false;
|
|
|
|
m_WeaponEff = NULL;
|
|
m_WeaponEffNum = 0;
|
|
m_bWeaponEff = false;
|
|
m_bVisibility = true;
|
|
|
|
m_pBezierMid = NULL;
|
|
m_bBezierMid = false;
|
|
m_bBezierMidSet = false;
|
|
|
|
m_iLight = 0;
|
|
m_pLight = NULL;
|
|
|
|
m_iStartPlayTime = -1; // play start time
|
|
m_iEndPlayTime = -1; // play end time
|
|
m_bPlayTime = false;
|
|
m_bVisTime = true;
|
|
m_bSectorCull = true;
|
|
|
|
m_pLightn2 = NULL; // Lightning 2
|
|
m_bLightn2 = false; // lightning2 bool
|
|
|
|
m_pLightn3 = NULL;
|
|
m_bLightn3 = false;
|
|
|
|
m_bEffCharacter = false;
|
|
m_pEffCharacter = NULL;
|
|
|
|
m_pEffWeaponLine = NULL;
|
|
m_bEffWeaponLine = false;
|
|
|
|
m_bFrustumCull = true;
|
|
|
|
}
|
|
|
|
CEffScript ::~CEffScript() {
|
|
int j;
|
|
|
|
// _ASSERTE( _CrtCheckMemory());
|
|
if(m_ScriptFile)
|
|
fclose(m_ScriptFile);
|
|
if(m_SubScript)
|
|
delete[] m_SubScript;
|
|
if(m_NextScript)
|
|
delete[] m_NextScript;
|
|
|
|
for(int i=0;i<m_lstEff.size();i++) {
|
|
|
|
#ifndef __EFF_WCREATOR__ //client 용
|
|
|
|
if(!m_bExt9) { // extension 9일때는 snap이 메모리에서 삭제 되지 않는다
|
|
for(j=0;j<m_EffList[i].m_SnapNum;j++) {
|
|
// snap effect 있을시 ccreature에서 삭제
|
|
if(m_Player != NULL) {
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
// CCreature 몸에 붙는 effect delete
|
|
//m_Player->DeleteBodyEffect(m_EffList[i].m_Snap[j].m_PivotName);
|
|
m_Player->DeleteBodyEffectName(m_EffList[i].m_Snap[j].m_EffName);
|
|
//m_Player->DeleteBodyEffect(m_EffList[i].m_Snap[j].m_EffName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#else //world creator 용
|
|
if(!m_bExt9) {
|
|
for(j=0;j<m_EffList[i].m_SnapNum;j++) {
|
|
// snap effect 있을시 ccreature에서 삭제
|
|
if(m_Player != NULL) {
|
|
// CCreature 몸에 붙는 effect delete
|
|
//m_Player->DeleteBodyEffect(m_EffList[i].m_Snap[j].m_PivotName);
|
|
m_Player->DeleteBodyEffectName(m_EffList[i].m_Snap[j].m_EffName);
|
|
//m_Player->DeleteBodyEffect(m_EffList[i].m_Snap[j].m_EffName);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
for(j=0;j<m_EffList[i].m_SoundNum;j++) {
|
|
//fade out sound 를 위한 세팅후 루핑 effect 삭제
|
|
|
|
if(m_EffList[i].m_Sound[j].m_Target == ES)
|
|
StopEffSound(i,j,m_StartPos.x,m_StartPos.y,m_StartPos.z,m_EffList[i].m_Sound[j].m_Min,m_EffList[i].m_Sound[j].m_Max);
|
|
else if(m_EffList[i].m_Sound[j].m_Target == EM)
|
|
StopEffSound(i,j,m_MidPos.x,m_MidPos.y,m_MidPos.z,m_EffList[i].m_Sound[j].m_Min,m_EffList[i].m_Sound[j].m_Max);
|
|
else if(m_EffList[i].m_Sound[j].m_Target == EE)
|
|
StopEffSound(i,j,m_EndPos[0].x,m_EndPos[0].y,m_EndPos[0].z,m_EffList[i].m_Sound[j].m_Min,m_EffList[i].m_Sound[j].m_Max);
|
|
|
|
}
|
|
if(m_lstEff[i] != NULL) {
|
|
delete m_lstEff[i];
|
|
m_lstEff[i] = NULL;
|
|
}
|
|
}
|
|
if(m_EndPos)
|
|
delete[] m_EndPos;
|
|
|
|
if(m_EffList)
|
|
delete[] m_EffList;
|
|
|
|
|
|
if(m_bExt5) {
|
|
if(m_Ext5Value != NULL)
|
|
delete m_Ext5Value;
|
|
}
|
|
if(m_bLightning) {
|
|
delete[] m_Lning;
|
|
m_Lning = NULL;
|
|
}
|
|
|
|
if(m_bWheel) { // 궤적
|
|
delete[] m_Wheel;
|
|
m_Wheel = NULL;
|
|
}
|
|
if(m_bBezierMid) { // Middle로 bezier 스트립을 이용했을때..
|
|
delete m_pBezierMid;
|
|
m_pBezierMid = NULL;
|
|
}
|
|
m_lstEff.clear();
|
|
|
|
if(m_iLight > 0) {
|
|
delete[] m_pLight;
|
|
m_pLight = NULL;
|
|
}
|
|
if(m_pLightn2 != NULL) {
|
|
delete m_pLightn2; // Lightning 2
|
|
m_pLightn2 = NULL;
|
|
|
|
}
|
|
if(m_pLightn3 != NULL) {
|
|
delete m_pLightn3;
|
|
m_pLightn3 = NULL;
|
|
}
|
|
if(m_pEffCharacter != NULL) { // Character Effect
|
|
delete m_pEffCharacter;
|
|
m_pEffCharacter = NULL;
|
|
|
|
}
|
|
if(m_WeaponEff != NULL) { // Weapon Effect
|
|
DeleteWeaponEff();
|
|
delete[] m_WeaponEff;
|
|
m_WeaponEff = NULL;
|
|
}
|
|
if(m_pEffWeaponLine != NULL) // Weapon Line
|
|
{
|
|
DeleteWeaponLine(); // 검기를 이 스크립트가 제어하기 전 상태로 되돌림
|
|
|
|
delete m_pEffWeaponLine;
|
|
m_pEffWeaponLine = NULL;
|
|
}
|
|
|
|
|
|
// _ASSERTE( _CrtCheckMemory());
|
|
}
|
|
|
|
// script data 를 binary file 로 컨버팅
|
|
void CEffScript::WriteConvertFile(char *name) {
|
|
|
|
FILE *fp = NULL;
|
|
int effnum = 0;
|
|
int i;
|
|
effnum = m_EffNum;
|
|
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
fp = fopen(name,"wb");
|
|
if(fp) {
|
|
fwrite((int *)&m_SubScriptNum,sizeof(int),1,fp);
|
|
|
|
if(!m_SubScriptNum) {
|
|
// eff number write
|
|
fwrite((int *)&effnum,sizeof(int),1,fp);
|
|
for(i=0;i<effnum;i++) { // CEffInfo write
|
|
// eff name
|
|
fwrite((char *)m_EffList[i].m_EffName,sizeof(char) * ESBUF_SIZE,1,fp);
|
|
// scale
|
|
fwrite((float *)&(m_EffList[i].m_Scale),sizeof(float),1,fp);
|
|
//minframe
|
|
fwrite((int *)&(m_EffList[i].m_MinFrame),sizeof(int),1,fp);
|
|
//fade in info
|
|
fwrite((int *)&(m_EffList[i].m_FadeInNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_FadeInNum >0) {
|
|
fwrite((int *)(m_EffList[i].m_FadeInStart),sizeof(int),m_EffList[i].m_FadeInNum,fp);
|
|
fwrite((D3DXVECTOR3 *)(m_EffList[i].m_FadeIn),sizeof(D3DXVECTOR3),m_EffList[i].m_FadeInNum,fp);
|
|
fwrite((color *)(m_EffList[i].m_FadeColor),sizeof(color),m_EffList[i].m_FadeInNum,fp);
|
|
fwrite((bool *)(m_EffList[i].m_FadeInSwitch),sizeof(bool),m_EffList[i].m_FadeInNum,fp);
|
|
}
|
|
//clight
|
|
fwrite((int *)&(m_EffList[i].m_CLightNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_CLightNum >0) {
|
|
|
|
fwrite((int *)(m_EffList[i].m_CLightStart),sizeof(int),m_EffList[i].m_CLightNum,fp);
|
|
fwrite((color *)(m_EffList[i].m_CLightColor),sizeof(color),m_EffList[i].m_CLightNum,fp);
|
|
fwrite((float *)(m_EffList[i].m_CLightDistance),sizeof(float),m_EffList[i].m_CLightNum,fp);
|
|
fwrite((DWORD *)(m_EffList[i].m_CLightTime),sizeof(DWORD),m_EffList[i].m_CLightNum,fp);
|
|
fwrite((bool *)(m_EffList[i].m_CLightSwitch),sizeof(bool),m_EffList[i].m_CLightNum,fp);
|
|
fwrite((int *)(m_EffList[i].m_CLightTarget),sizeof(int),m_EffList[i].m_CLightNum,fp);
|
|
}
|
|
// speed value
|
|
fwrite((float *)(m_EffList[i].m_SpeedValue),sizeof(float),3,fp);
|
|
//accel value
|
|
fwrite((float *)(m_EffList[i].m_AccelValue),sizeof(float),3,fp);
|
|
// startpos
|
|
fwrite((float *)(m_EffList[i].m_StartPos),sizeof(float),3,fp);
|
|
fwrite((bool *)&(m_EffList[i].m_bStartRot),sizeof(bool),1,fp);
|
|
|
|
//loop
|
|
fwrite((int *)&(m_EffList[i].m_LoopStart),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffList[i].m_LoopEnd),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffList[i].m_LoopSwitch),sizeof(int),1,fp);
|
|
//camera shake value
|
|
fwrite((int *)&(m_EffList[i].m_ShakeNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_ShakeNum > 0)
|
|
fwrite((CEffShake *)m_EffList[i].m_Shake,sizeof(CEffShake),m_EffList[i].m_ShakeNum,fp);
|
|
//sound
|
|
fwrite((int *)&(m_EffList[i].m_SoundNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_SoundNum > 0)
|
|
fwrite((CEffSound *)m_EffList[i].m_Sound,sizeof(CEffSound),m_EffList[i].m_SoundNum,fp);
|
|
|
|
}
|
|
//interface pos
|
|
fwrite((bool *)&(m_bInterfacePos),sizeof(bool),1,fp);
|
|
fwrite((float *)m_InterfacePos,sizeof(float),2,fp);
|
|
|
|
/////////////////////CEffPlay
|
|
// start id info
|
|
fwrite((int *)&(m_EffPlayData.m_StartIdNum),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_StartCount),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_StartFrameNextEff),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_StartIdNum > 0) {
|
|
fwrite((int *)m_EffPlayData.m_StartId,sizeof(int),m_EffPlayData.m_StartIdNum,fp);
|
|
}
|
|
//mid info
|
|
fwrite((int *)&(m_EffPlayData.m_MidEffIdNum),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_MidCount),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_MidEffIdNum > 0) {
|
|
fwrite((int *)m_EffPlayData.m_MidEffId,sizeof(int),m_EffPlayData.m_MidEffIdNum,fp);
|
|
}
|
|
//end info
|
|
fwrite((float *)m_EffPlayData.m_EndPos,sizeof(float),3,fp);
|
|
|
|
fwrite((int *)&(m_EffPlayData.m_EndEffIdNum),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_EndCount),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_EndEffIdNum > 0) {
|
|
fwrite((int *)m_EffPlayData.m_EndEffId,sizeof(int),m_EffPlayData.m_EndEffIdNum,fp);
|
|
}
|
|
|
|
//speed accel min max speed
|
|
fwrite((float *)&(m_EffPlayData.m_Speed),sizeof(float),1,fp);
|
|
fwrite((float *)&(m_EffPlayData.m_MaxSpeed),sizeof(float),1,fp);
|
|
fwrite((float *)&(m_EffPlayData.m_MinSpeed),sizeof(float),1,fp);
|
|
fwrite((float *)&(m_EffPlayData.m_Accel),sizeof(float),1,fp);
|
|
// mid direct
|
|
fwrite((int *)&(m_EffPlayData.m_Direct),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_MidEffNum),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_EffPlayData.m_StartMidNextEff),sizeof(int),1,fp);
|
|
/////////////////////////////
|
|
|
|
//other value set
|
|
fwrite((bool *)&(m_StartPosSet),sizeof(bool),1,fp);
|
|
fwrite((D3DXVECTOR3 *)&(m_StartPos),sizeof(D3DXVECTOR3),1,fp);
|
|
fwrite((D3DXVECTOR3 *)&(m_MidPos),sizeof(D3DXVECTOR3),1,fp);
|
|
fwrite((D3DXVECTOR3 *)&(m_OldMidPos),sizeof(D3DXVECTOR3),1,fp);
|
|
|
|
fwrite((D3DXVECTOR3 *)&(m_MidUnit),sizeof(D3DXVECTOR3),1,fp);
|
|
fwrite((D3DXVECTOR3 *)&(m_MidRot),sizeof(D3DXVECTOR3),1,fp);
|
|
fwrite((bool *)&(m_NotRot),sizeof(bool),1,fp);
|
|
// endpos set
|
|
fwrite((int *)&m_EndPosNum,sizeof(int),1,fp);
|
|
if(m_EndPosNum >0) {
|
|
fwrite((D3DXVECTOR3 *)m_EndPos,sizeof(D3DXVECTOR3),m_EndPosNum,fp);
|
|
}
|
|
//delay frame tickframe
|
|
fwrite((int *)&m_DelayFrame,sizeof(int),1,fp);
|
|
fwrite((int *)&m_TickFrame,sizeof(int),1,fp);
|
|
//fade out write
|
|
fwrite((float *)m_FadeOut,sizeof(float),3,fp);
|
|
for(i=0;i<effnum;i++) { // CEffInfo write
|
|
//hit
|
|
fwrite((int *)&(m_EffList[i].m_HitFrameNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_HitFrameNum >0)
|
|
fwrite((int *)m_EffList[i].m_HitFrame,sizeof(int),m_EffList[i].m_HitFrameNum,fp);
|
|
|
|
}
|
|
// CEffExt6 write (hit 가 script안에 있다는 가정하에 쓰임)
|
|
// 기존 compile된 script와 호완하기 위해서..
|
|
for(i=0;i<effnum;i++) { // CEffInfo write
|
|
int array[50];
|
|
|
|
memset((int *)array,0,sizeof(int) * 50);
|
|
array[0] = m_EffList[i].m_Ext6ValueNum; //slide
|
|
array[1] = m_EffList[i].m_SnapNum; //snap
|
|
array[2] = m_bExt5ex;
|
|
array[3] = m_LningNum;
|
|
array[4] = m_WheelNum;
|
|
array[5] = m_WeaponEffNum;
|
|
array[6] = ((m_bBezierMid == true) ? 1 : 0); // Bezier Middle
|
|
array[7] = m_iLight; // Vertex Lighting Num
|
|
array[8] = ((m_bPlayTime == true) ? 1 : 0); // Play Time
|
|
array[9] = ((m_bLightn2 == true) ? 1 : 0); // Lightning 2
|
|
array[10] = ((m_bEffCharacter == true) ? 1 : 0); // Character Effect
|
|
array[11] = ((m_bEffWeaponLine == true) ? 1 : 0); // 검기
|
|
array[12] = ((m_bLightn3 == true) ? 1 : 0); // Lightning 3
|
|
|
|
fwrite((int *)array,sizeof(int),50,fp);
|
|
|
|
if(array[0] >0) //slide
|
|
fwrite((CEffExt6 *)m_EffList[i].m_Ext6Value,sizeof(CEffExt6),array[0],fp);
|
|
|
|
if(array[1] >0) //snap
|
|
fwrite((CEffSnap *)m_EffList[i].m_Snap,sizeof(CEffSnap),array[1],fp);
|
|
if(array[2] >0) { //extension6 extension
|
|
fwrite((char *)m_Ext5Value->m_TextureName,sizeof(char),ESBUF_SIZE,fp);
|
|
fwrite((bool *)&m_Ext5Value->m_Rand,sizeof(bool),1,fp);
|
|
fwrite((float *)&m_Ext5Value->m_LineSize,sizeof(float),1,fp);
|
|
}
|
|
if(i == 0) { // 처음 한번만 write
|
|
if(array[3] >0) { // 번개효과
|
|
for(int ln = 0;ln < array[3];ln++) {
|
|
if(m_Lning[ln].m_Lightn != NULL) {
|
|
delete[] m_Lning[ln].m_Lightn;
|
|
m_Lning[ln].m_Lightn = NULL;
|
|
}
|
|
}
|
|
fwrite((CEffLightn *)m_Lning,sizeof(CEffLightn),array[3],fp);
|
|
}
|
|
}
|
|
if(i == 0) { // 처음 한번만 write
|
|
if(array[4] >0) { // 궤적 라인
|
|
for(int ln=0;ln< array[4];ln++) {
|
|
fwrite((int *)&(m_Wheel[ln].m_BlendMode),sizeof(int),1,fp);
|
|
fwrite((float *)&(m_Wheel[ln].m_PlaneSize),sizeof(float),1,fp);
|
|
fwrite((int *)&(m_Wheel[ln].m_PlaneValue),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_Wheel[ln].m_PointNum),sizeof(int),1,fp);
|
|
fwrite((char *)m_Wheel[ln].m_TexName,sizeof(char),ESBUF_SIZE,fp);
|
|
fwrite((float *)&(m_Wheel[ln].m_UnitUv),sizeof(float),1,fp);
|
|
}
|
|
}
|
|
}
|
|
if(i == 0) { //처음 한번만 write
|
|
if(array[5] > 0) { //weapon effect
|
|
fwrite((CEffWeapon *)m_WeaponEff,sizeof(CEffWeapon),array[5],fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[6] > 0) {
|
|
|
|
if(m_pBezierMid->m_pBezierLine) { // Bezier Middle
|
|
delete m_pBezierMid->m_pBezierLine;
|
|
m_pBezierMid->m_pBezierLine = NULL;
|
|
}
|
|
fwrite((CEffBezier *)m_pBezierMid,sizeof(CEffBezier),1,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[7] > 0) { // Vertex Light
|
|
fwrite((CEffLight *)m_pLight,sizeof(CEffLight),m_iLight,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[8] > 0) { // Play Time
|
|
int iValue[2] = {m_iStartPlayTime,m_iEndPlayTime};
|
|
fwrite((int *)iValue,sizeof(int),2,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[9] > 0) {
|
|
CEffTextureDef *pTmpTextureDef = NULL;
|
|
pTmpTextureDef = new CEffTextureDef[m_pLightn2->m_iMaxLine];
|
|
memcpy(pTmpTextureDef,(m_pLightn2->m_pTextureName),sizeof(CEffTextureDef) * m_pLightn2->m_iMaxLine);
|
|
|
|
if(m_pLightn2->m_pLightn != NULL) {
|
|
delete[] (m_pLightn2->m_pLightn);
|
|
m_pLightn2->m_pLightn = NULL;
|
|
}
|
|
if(m_pLightn2->m_pTextureName != NULL) {
|
|
delete[] (m_pLightn2->m_pTextureName);
|
|
m_pLightn2->m_pTextureName = NULL;
|
|
}
|
|
fwrite((CEffLightn2 *)m_pLightn2,sizeof(CEffLightn2),1,fp);
|
|
fwrite((CEffTextureDef *)pTmpTextureDef,sizeof(CEffTextureDef),m_pLightn2->m_iMaxLine,fp);
|
|
delete[] pTmpTextureDef;
|
|
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[10] > 0) {
|
|
fwrite((CEffChar *)m_pEffCharacter,sizeof(CEffChar),1,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(array[11] > 0) { // 검기
|
|
if(m_pEffWeaponLine->m_pLineTexture != NULL) {
|
|
delete (m_pEffWeaponLine->m_pLineTexture);
|
|
m_pEffWeaponLine->m_pLineTexture = NULL;
|
|
}
|
|
fwrite((CEffWeaponLine *)m_pEffWeaponLine,sizeof(CEffWeaponLine),1,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
|
|
if(array[12] > 0) { // Lightning 3
|
|
|
|
}
|
|
}
|
|
/*
|
|
//slide
|
|
fwrite((int *)&(m_EffList[i].m_Ext6ValueNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_Ext6ValueNum >0)
|
|
fwrite((CEffExt6 *)m_EffList[i].m_Ext6Value,sizeof(CEffExt6),m_EffList[i].m_Ext6ValueNum,fp);
|
|
//snap
|
|
fwrite((int *)&(m_EffList[i].m_SnapNum),sizeof(int),1,fp);
|
|
if(m_EffList[i].m_SnapNum >0)
|
|
fwrite((CEffSnap *)m_EffList[i].m_Snap,sizeof(CEffSnap),m_EffList[i].m_SnapNum,fp);
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
}
|
|
//sub script data
|
|
|
|
else{
|
|
|
|
fwrite((int *)m_NextScript,sizeof(int),m_SubScriptNum,fp);
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
//name save code..
|
|
fwrite((char *)(m_SubScript[i].m_FileName),sizeof(char) * ESBUF_SIZE,1,fp);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(fp) {
|
|
fclose(fp);
|
|
}
|
|
|
|
}
|
|
// binary 형식의 script data file load
|
|
// file load 실패시 false return
|
|
bool CEffScript::GetScriptBinData(char *filename,bool vis) {
|
|
|
|
|
|
char filepath[ESBUF_SIZE] = {0};
|
|
|
|
FILE *fp;
|
|
int i;
|
|
int fadeinnum = 0;
|
|
int clightnum = 0;
|
|
int shakenum = 0;
|
|
int soundnum = 0;
|
|
int hitnum = 0;
|
|
|
|
if(filename == NULL) {
|
|
m_FileLoad = false;
|
|
return false;
|
|
}
|
|
// Visibility setting
|
|
m_bVisibility = vis;
|
|
|
|
strcpy(m_FileName,filename);
|
|
|
|
strcpy(filepath,EFFECTSCRIPTPATH);
|
|
strcat(filepath,filename);
|
|
|
|
fp = fopen(filepath,"rb");
|
|
if(fp) {
|
|
m_FileLoad = true;
|
|
fread((int *)&m_SubScriptNum,sizeof(int),1,fp);
|
|
if(!m_SubScriptNum) {
|
|
fread((int *)&m_EffNum,sizeof(int),1,fp);
|
|
m_EffList = new CEffInfo[m_EffNum];
|
|
for(i=0;i<m_EffNum;i++) {
|
|
// eff name
|
|
fread((char *)m_EffList[i].m_EffName,sizeof(char) * ESBUF_SIZE,1,fp);
|
|
// scale
|
|
fread((float *)&(m_EffList[i].m_Scale),sizeof(float),1,fp);
|
|
//minframe
|
|
fread((int *)&(m_EffList[i].m_MinFrame),sizeof(int),1,fp);
|
|
//fade in info
|
|
fread((int *)&(m_EffList[i].m_FadeInNum),sizeof(int),1,fp);
|
|
fadeinnum = m_EffList[i].m_FadeInNum;
|
|
|
|
if(fadeinnum> 0) {
|
|
m_EffList[i].m_FadeInStart = new int[fadeinnum];
|
|
m_EffList[i].m_FadeIn = new D3DXVECTOR3[fadeinnum];
|
|
m_EffList[i].m_FadeColor = new color[fadeinnum];
|
|
m_EffList[i].m_FadeInSwitch = new bool[fadeinnum];
|
|
fread((int *)m_EffList[i].m_FadeInStart,sizeof(int),fadeinnum,fp);
|
|
fread((D3DXVECTOR3 *)m_EffList[i].m_FadeIn,sizeof(D3DXVECTOR3),fadeinnum,fp);
|
|
fread((color *)m_EffList[i].m_FadeColor,sizeof(color),fadeinnum,fp);
|
|
fread((bool *)m_EffList[i].m_FadeInSwitch,sizeof(bool),fadeinnum,fp);
|
|
}
|
|
|
|
//clight
|
|
fread((int *)&(m_EffList[i].m_CLightNum),sizeof(int),1,fp);
|
|
clightnum = m_EffList[i].m_CLightNum;
|
|
if(clightnum) {
|
|
m_EffList[i].m_CLightStart = new int[clightnum];
|
|
m_EffList[i].m_CLightColor = new color[clightnum];
|
|
m_EffList[i].m_CLightDistance = new float[clightnum];
|
|
m_EffList[i].m_CLightTime = new DWORD[clightnum];
|
|
m_EffList[i].m_CLightSwitch = new bool[clightnum];
|
|
m_EffList[i].m_CLightTarget = new int[clightnum];
|
|
|
|
fread((int *)m_EffList[i].m_CLightStart,sizeof(int),clightnum,fp);
|
|
fread((color *)m_EffList[i].m_CLightColor,sizeof(color),clightnum,fp);
|
|
fread((float *)m_EffList[i].m_CLightDistance,sizeof(float),clightnum,fp);
|
|
fread((DWORD *)m_EffList[i].m_CLightTime,sizeof(DWORD),clightnum,fp);
|
|
fread((bool *)m_EffList[i].m_CLightSwitch,sizeof(bool),clightnum,fp);
|
|
fread((int *)m_EffList[i].m_CLightTarget,sizeof(int),clightnum,fp);
|
|
|
|
}
|
|
|
|
// speed value
|
|
fread((float *)(m_EffList[i].m_SpeedValue),sizeof(float),3,fp);
|
|
//accel value
|
|
fread((float *)(m_EffList[i].m_AccelValue),sizeof(float),3,fp);
|
|
// startpos
|
|
fread((float *)(m_EffList[i].m_StartPos),sizeof(float),3,fp);
|
|
fread((bool *)&(m_EffList[i].m_bStartRot),sizeof(bool),1,fp);
|
|
//loop
|
|
fread((int *)&(m_EffList[i].m_LoopStart),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffList[i].m_LoopEnd),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffList[i].m_LoopSwitch),sizeof(int),1,fp);
|
|
//camera shake value
|
|
fread((int *)&(m_EffList[i].m_ShakeNum),sizeof(int),1,fp);
|
|
shakenum = m_EffList[i].m_ShakeNum;
|
|
if(shakenum > 0) {
|
|
m_EffList[i].m_Shake = new CEffShake[shakenum];
|
|
fread((CEffShake *)m_EffList[i].m_Shake,sizeof(CEffShake),shakenum,fp);
|
|
}
|
|
//sound
|
|
fread((int *)&(m_EffList[i].m_SoundNum),sizeof(int),1,fp);
|
|
soundnum = m_EffList[i].m_SoundNum;
|
|
|
|
if(soundnum> 0) {
|
|
m_EffList[i].m_Sound = new CEffSound[soundnum];
|
|
fread((CEffSound *)m_EffList[i].m_Sound,sizeof(CEffSound),soundnum,fp);
|
|
}
|
|
|
|
}//for
|
|
//interface pos
|
|
fread((bool *)&(m_bInterfacePos),sizeof(bool),1,fp);
|
|
fread((float *)m_InterfacePos,sizeof(float),2,fp);
|
|
|
|
/////////////////////CEffPlay
|
|
// start id info
|
|
fread((int *)&(m_EffPlayData.m_StartIdNum),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_StartCount),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_StartFrameNextEff),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_StartIdNum > 0) {
|
|
m_EffPlayData.m_StartId = new int[m_EffPlayData.m_StartIdNum];
|
|
fread((int *)m_EffPlayData.m_StartId,sizeof(int),m_EffPlayData.m_StartIdNum,fp);
|
|
}
|
|
//mid info
|
|
fread((int *)&(m_EffPlayData.m_MidEffIdNum),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_MidCount),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_MidEffIdNum > 0) {
|
|
m_EffPlayData.m_MidEffId = new int[m_EffPlayData.m_MidEffIdNum];
|
|
fread((int *)m_EffPlayData.m_MidEffId,sizeof(int),m_EffPlayData.m_MidEffIdNum,fp);
|
|
}
|
|
|
|
//end info
|
|
fread((float *)m_EffPlayData.m_EndPos,sizeof(float),3,fp);
|
|
|
|
fread((int *)&(m_EffPlayData.m_EndEffIdNum),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_EndCount),sizeof(int),1,fp);
|
|
if(m_EffPlayData.m_EndEffIdNum > 0) {
|
|
m_EffPlayData.m_EndEffId = new int[m_EffPlayData.m_EndEffIdNum];
|
|
fread((int *)m_EffPlayData.m_EndEffId,sizeof(int),m_EffPlayData.m_EndEffIdNum,fp);
|
|
}
|
|
|
|
//speed accel min max speed
|
|
fread((float *)&(m_EffPlayData.m_Speed),sizeof(float),1,fp);
|
|
fread((float *)&(m_EffPlayData.m_MaxSpeed),sizeof(float),1,fp);
|
|
fread((float *)&(m_EffPlayData.m_MinSpeed),sizeof(float),1,fp);
|
|
fread((float *)&(m_EffPlayData.m_Accel),sizeof(float),1,fp);
|
|
// mid direct
|
|
fread((int *)&(m_EffPlayData.m_Direct),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_MidEffNum),sizeof(int),1,fp);
|
|
fread((int *)&(m_EffPlayData.m_StartMidNextEff),sizeof(int),1,fp);
|
|
/////////////////////////////
|
|
//other value set
|
|
fread((bool *)&(m_StartPosSet),sizeof(bool),1,fp);
|
|
fread((D3DXVECTOR3 *)&(m_StartPos),sizeof(D3DXVECTOR3),1,fp);
|
|
fread((D3DXVECTOR3 *)&(m_MidPos),sizeof(D3DXVECTOR3),1,fp);
|
|
fread((D3DXVECTOR3 *)&(m_OldMidPos),sizeof(D3DXVECTOR3),1,fp);
|
|
|
|
fread((D3DXVECTOR3 *)&(m_MidUnit),sizeof(D3DXVECTOR3),1,fp);
|
|
fread((D3DXVECTOR3 *)&(m_MidRot),sizeof(D3DXVECTOR3),1,fp);
|
|
fread((bool *)&(m_NotRot),sizeof(bool),1,fp);
|
|
// endpos set
|
|
fread((int *)&m_EndPosNum,sizeof(int),1,fp);
|
|
if(m_EndPosNum >0) {
|
|
m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
|
|
fread((D3DXVECTOR3 *)m_EndPos,sizeof(D3DXVECTOR3),m_EndPosNum,fp);
|
|
}
|
|
//delay frame tickframe
|
|
fread((int *)&m_DelayFrame,sizeof(int),1,fp);
|
|
fread((int *)&m_TickFrame,sizeof(int),1,fp);
|
|
//fade out write
|
|
fread((float *)m_FadeOut,sizeof(float),3,fp);
|
|
for(i=0;i<m_EffNum;i++) {
|
|
//hit
|
|
int size = fread((int *)&(m_EffList[i].m_HitFrameNum),sizeof(int),1,fp);
|
|
if(size == 0) {
|
|
m_EffList[i].m_HitFrameNum = 0;
|
|
break;
|
|
}
|
|
hitnum = m_EffList[i].m_HitFrameNum;
|
|
|
|
if(hitnum> 0) {
|
|
m_EffList[i].m_HitFrame = new int[hitnum];
|
|
fread((int *)m_EffList[i].m_HitFrame,sizeof(int),hitnum,fp);
|
|
}
|
|
}
|
|
|
|
for(i=0;i<m_EffNum;i++) { // CEffExt6 read (hit 가 script안에 있다는 가정하에 쓰임)
|
|
// 기존 compile된 script와 호완하기 위해서..
|
|
int array[50];
|
|
memset((int *)array,0,sizeof(int) * 50);
|
|
|
|
int size = fread((int *)array,sizeof(int),50,fp);
|
|
// 각종 효과들의 bit or number load
|
|
|
|
m_EffList[i].m_Ext6ValueNum= array[0];
|
|
m_EffList[i].m_SnapNum = array[1];
|
|
m_bExt5ex = (array[2]>0) ? true:false;
|
|
m_LningNum = array[3]; //번개
|
|
m_WheelNum = array[4]; //궤적
|
|
m_WeaponEffNum = array[5]; //weapon effect
|
|
m_bBezierMid = (array[6] > 0) ? true : false; // Bezier Middle
|
|
m_iLight = array[7]; // Vertex Light
|
|
m_bPlayTime = (array[8] > 0) ? true : false; // Play Time
|
|
m_bLightn2 = (array[9] > 0) ? true : false; // Lightning2
|
|
m_bEffCharacter = (array[10] > 0) ? true : false; // Character Effect
|
|
m_bEffWeaponLine = (array[11] > 0) ? true : false; // Weapon Line
|
|
|
|
//
|
|
|
|
int ext6num = 0;
|
|
int snapnum = 0;
|
|
|
|
if(size == 0) {
|
|
m_EffList[i].m_Ext6ValueNum= 0;
|
|
m_EffList[i].m_SnapNum = 0;
|
|
|
|
m_LningNum = 0; //번개
|
|
m_WheelNum = 0; //궤적
|
|
m_WeaponEffNum = 0; //weapon effect
|
|
m_bBezierMid = false; // Bezier Middle
|
|
m_iLight = 0; // Vertex Light
|
|
m_bPlayTime = false; // Play Time
|
|
m_bLightn2 = false; // Lightning2
|
|
m_bEffCharacter = false; // Character Effect
|
|
m_bEffWeaponLine = false; // Weapon Line
|
|
|
|
|
|
break;
|
|
}
|
|
ext6num = m_EffList[i].m_Ext6ValueNum;
|
|
|
|
if(ext6num> 0) { // slide
|
|
m_EffList[i].m_Ext6Value= new CEffExt6[ext6num];
|
|
fread((CEffExt6 *)m_EffList[i].m_Ext6Value,sizeof(CEffExt6),ext6num,fp);
|
|
}
|
|
// snap read
|
|
snapnum = m_EffList[i].m_SnapNum;
|
|
if(snapnum > 0) {
|
|
m_EffList[i].m_Snap= new CEffSnap[snapnum];
|
|
fread((CEffSnap *)m_EffList[i].m_Snap,sizeof(CEffSnap),snapnum,fp);
|
|
}
|
|
if(m_bExt5ex) { //extension5 extension
|
|
if(m_Ext5Value == NULL) {
|
|
m_Ext5Value = new CEffExt5;
|
|
}
|
|
m_bExt5 = true;
|
|
fread((char *)m_Ext5Value->m_TextureName,sizeof(char),ESBUF_SIZE,fp);
|
|
fread((bool *)&m_Ext5Value->m_Rand,sizeof(bool),1,fp);
|
|
fread((float *)&m_Ext5Value->m_LineSize,sizeof(float),1,fp);
|
|
|
|
}
|
|
if(i == 0) { // 처음 한번만 read
|
|
if(m_LningNum >0) { // 번개효과
|
|
m_bLightning = true; //번개 bit = true
|
|
m_Lning = new CEffLightn[m_LningNum];
|
|
fread((CEffLightn *)m_Lning,sizeof(CEffLightn),m_LningNum,fp);
|
|
for(int ln = 0;ln < m_LningNum;ln++)
|
|
m_Lning[ln].m_Lightn = new CLightning[m_Lning[ln].m_LnNum]; //CLightning 객체 생성
|
|
|
|
}
|
|
}
|
|
if(i == 0) { // 처음 한번만 write
|
|
if(m_WheelNum >0) { // 궤적 라인
|
|
m_bWheel = true;
|
|
m_Wheel = new CEffWheel[m_WheelNum];
|
|
|
|
for(int ln=0;ln< m_WheelNum;ln++) {
|
|
fread((int *)&(m_Wheel[ln].m_BlendMode),sizeof(int),1,fp);
|
|
fread((float *)&(m_Wheel[ln].m_PlaneSize),sizeof(float),1,fp);
|
|
fread((int *)&(m_Wheel[ln].m_PlaneValue),sizeof(int),1,fp);
|
|
fread((int *)&(m_Wheel[ln].m_PointNum),sizeof(int),1,fp);
|
|
fread((char *)m_Wheel[ln].m_TexName,sizeof(char),ESBUF_SIZE,fp);
|
|
fread((float *)&(m_Wheel[ln].m_UnitUv),sizeof(float),1,fp);
|
|
}
|
|
}
|
|
}
|
|
if(i == 0) { //처음 한번만 read
|
|
if(m_WeaponEffNum > 0) { //weapon effect
|
|
m_bWeaponEff = true;
|
|
m_WeaponEff = new CEffWeapon[m_WeaponEffNum];
|
|
|
|
fread((CEffWeapon *)m_WeaponEff,sizeof(CEffWeapon),m_WeaponEffNum,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(m_bBezierMid == true ) { // Bezier Middle
|
|
m_pBezierMid = new CEffBezier;
|
|
fread((CEffBezier *)m_pBezierMid,sizeof(CEffBezier),1,fp);
|
|
m_pBezierMid->m_pBezierLine = NULL;
|
|
m_pBezierMid->m_nBezierPoint = 30; // 총 제어점 갯수
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(m_iLight > 0) { // Vertex Light
|
|
m_pLight = new CEffLight[m_iLight];
|
|
fread((CEffLight *)m_pLight,sizeof(CEffLight),m_iLight,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(m_bPlayTime == true) { // PlayTime
|
|
int iValue[2] = {0};
|
|
fread((int *)iValue,sizeof(int),2,fp);
|
|
m_iStartPlayTime = iValue[0];
|
|
m_iEndPlayTime = iValue[1];
|
|
m_bVisTime = true;
|
|
}
|
|
}
|
|
if(i==0) {
|
|
if(m_bLightn2 == true) { // Lightning2
|
|
m_pLightn2 = new CEffLightn2;
|
|
fread((CEffLightn2 *)m_pLightn2,sizeof(CEffLightn2),1,fp);
|
|
|
|
m_pLightn2->m_pLightn = new CEffLightn[(m_pLightn2->m_iMaxLine)];
|
|
m_pLightn2->m_pTextureName = new CEffTextureDef[(m_pLightn2->m_iMaxLine)];
|
|
|
|
fread((CEffTextureDef *)(m_pLightn2->m_pTextureName),sizeof(CEffTextureDef),(m_pLightn2->m_iMaxLine),fp);
|
|
|
|
GetBinLightn2(); // Sub Lightning 객체 생성및 처리
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(m_bEffCharacter == true) {
|
|
m_pEffCharacter = new CEffChar;
|
|
fread((CEffChar *)m_pEffCharacter,sizeof(CEffChar),1,fp);
|
|
}
|
|
}
|
|
if(i == 0) {
|
|
if(m_bEffWeaponLine == true) { // 검기 관련 제어 Load (WEAPONLINE:)
|
|
m_pEffWeaponLine = new CEffWeaponLine;
|
|
fread((CEffWeaponLine *)m_pEffWeaponLine,sizeof(CEffWeaponLine),1,fp);
|
|
m_pEffWeaponLine->m_pLineTexture = new CTexture; // 검기 관련 텍스쳐
|
|
CTexture::SetPath(EFFECTTEXTUREPATH);
|
|
m_pEffWeaponLine->m_pLineTexture->Load(m_pEffWeaponLine->m_strTextureName);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else {
|
|
m_NextScript = new int[m_SubScriptNum];
|
|
m_SubScript = new CEffScript[m_SubScriptNum];
|
|
fread((int *)m_NextScript,sizeof(int),m_SubScriptNum,fp);
|
|
SetDevice(m_Device);
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
fread((char *)(m_SubScript[i].m_FileName),sizeof(char) * ESBUF_SIZE,1,fp);
|
|
GetBinSubData(i,m_SubScript[i].m_FileName);
|
|
|
|
}
|
|
}
|
|
//_ASSERTE( _CrtCheckMemory());
|
|
|
|
|
|
fclose(fp);
|
|
}
|
|
else {
|
|
m_FileLoad = false;
|
|
//char tmp_message[256]={0};
|
|
//sprintf(tmp_message,"%s 이 존재하지 않습니다.",filepath);
|
|
|
|
//MessageBox(NULL,tmp_message,"Error",MB_OK);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
void CEffScript::GetLnNum() {
|
|
char *tok = NULL;
|
|
tok = strtok(NULL," \t\n");
|
|
m_LningNum = atoi(tok);
|
|
}
|
|
void CEffScript::GetLn3Num() {
|
|
int iMaxLine = 0;
|
|
int iMaxDummy = 0;
|
|
|
|
char *tok = NULL;
|
|
tok = strtok(NULL," \t\n");
|
|
m_bLightn3 = true;
|
|
m_pLightn3 = new CEffLightn3;
|
|
|
|
|
|
iMaxLine = atoi(tok); // Max Line Setting
|
|
m_pLightn3->m_iMaxLine = iMaxLine;
|
|
|
|
iMaxDummy = 2;
|
|
m_pLightn3->m_iEffChar = iMaxDummy;
|
|
|
|
tok = strtok(NULL," \t\n");
|
|
m_pLightn3->m_fUvAniMax = atof(tok); // Max Uv Ani
|
|
|
|
tok = strtok(NULL," \t\n");
|
|
m_pLightn3->m_fRange = atof(tok); // Max Range
|
|
|
|
tok = strtok(NULL," \n\t"); // Blend
|
|
m_pLightn3->m_iBlend = atoi(tok);
|
|
|
|
m_pLightn3->m_pLightn = new CEffLightn[iMaxLine];
|
|
m_pLightn3->m_pEffChar = new CEffChar[iMaxDummy];
|
|
m_pLightn3->m_pTextureName = new CEffTextureDef[iMaxLine];
|
|
|
|
|
|
}
|
|
void CEffScript::GetLn2Num() {
|
|
int iMaxLine = 0;
|
|
|
|
char *tok = NULL;
|
|
tok = strtok(NULL," \t\n");
|
|
m_bLightn2 = true;
|
|
m_pLightn2 = new CEffLightn2;
|
|
|
|
iMaxLine = atoi(tok); // Max Line Setting
|
|
m_pLightn2->m_iMaxLine = iMaxLine;
|
|
|
|
tok = strtok(NULL," \t\n");
|
|
m_pLightn2->m_fUvAniMax = atof(tok); // Max Uv Ani
|
|
|
|
tok = strtok(NULL," \t\n");
|
|
m_pLightn2->m_fRange = atof(tok); // Max Range
|
|
|
|
tok = strtok(NULL," \n\t");
|
|
m_pLightn2->m_vecPos.x = atof(tok);
|
|
|
|
tok = strtok(NULL," \n\t");
|
|
m_pLightn2->m_vecPos.y = atof(tok);
|
|
|
|
tok = strtok(NULL," \n\t");
|
|
m_pLightn2->m_vecPos.z = atof(tok);
|
|
|
|
tok = strtok(NULL," \n\t"); // Blend
|
|
m_pLightn2->m_iBlend = atoi(tok);
|
|
|
|
m_pLightn2->m_pLightn = new CEffLightn[iMaxLine];
|
|
m_pLightn2->m_pTextureName = new CEffTextureDef[iMaxLine];
|
|
|
|
|
|
}
|
|
void CEffScript::GetEffWeaponNum() {
|
|
char *tok = NULL;
|
|
tok = strtok(NULL," \t\n");
|
|
m_WeaponEffNum = atoi(tok);
|
|
}
|
|
void CEffScript::GetEffWheelNum() {
|
|
char *tok = NULL;
|
|
tok = strtok(NULL," \t\n");
|
|
m_WheelNum = atoi(tok);
|
|
}
|
|
//WEAPONLINE: [Texture Name] [R] [G] [B] [블랜드 모드]
|
|
void CEffScript::GetEffWeaponLine() {
|
|
m_bEffWeaponLine = true;
|
|
m_pEffWeaponLine = new CEffWeaponLine;
|
|
char *token = strtok(NULL," \n\t");
|
|
// Texture
|
|
m_pEffWeaponLine->m_pLineTexture = new CTexture;
|
|
CTexture::SetPath(EFFECTTEXTUREPATH);
|
|
strcpy(m_pEffWeaponLine->m_strTextureName,token);
|
|
m_pEffWeaponLine->m_pLineTexture->Load(token);
|
|
// Color
|
|
m_pEffWeaponLine->m_iColor[0] = atoi(strtok(NULL," \n\t"));
|
|
m_pEffWeaponLine->m_iColor[1] = atoi(strtok(NULL," \n\t"));
|
|
m_pEffWeaponLine->m_iColor[2] = atoi(strtok(NULL," \n\t"));
|
|
// Blend Mode
|
|
m_pEffWeaponLine->m_iBlendMode = atoi(strtok(NULL," \n\t"));
|
|
|
|
}
|
|
void CEffScript::GetEffChar() {
|
|
m_bEffCharacter = true;
|
|
m_pEffCharacter = new CEffChar;
|
|
char * token = strtok(NULL," \n\t[]");
|
|
// Pivot name
|
|
strcpy(m_pEffCharacter->m_PivotName,token);
|
|
// local Position
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecPos.x = atof(token);
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecPos.y = atof(token);
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecPos.z = atof(token);
|
|
// local quaternion
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecQuat.x = atof(token);
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecQuat.y = atof(token);
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecQuat.z = atof(token);
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->vecQuat.w = atof(token);
|
|
// Position, Rotation Update
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->m_bPosUpdate = (atoi(token)) ? true : false;
|
|
token = strtok(NULL," \n\t[]");
|
|
m_pEffCharacter->m_bRotUpdate = (atoi(token)) ? true : false;
|
|
// First Update Flag False Setting
|
|
m_pEffCharacter->m_bFirstUpdate = false;
|
|
|
|
|
|
}
|
|
bool CEffScript::GetScriptData(char *esfname) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
char filepath[ESBUF_SIZE] = {0};
|
|
|
|
char *token = NULL;
|
|
|
|
int CurrentLoad = ESEMPTY;
|
|
if(esfname == NULL) {
|
|
return false;
|
|
}
|
|
strcpy(m_FileName,esfname);
|
|
|
|
strcpy(filepath,EFFECTSCRIPTPATH);
|
|
strcat(filepath,esfname);
|
|
|
|
m_ScriptFile = fopen(filepath,"rt");
|
|
|
|
if(!m_ScriptFile) {
|
|
char tmp_message[256]={0};
|
|
sprintf(tmp_message,"%s 이 존재하지 않습니다.",filepath);
|
|
MessageBox(NULL,tmp_message,"Error",MB_OK);
|
|
#ifdef __EFF_WCREATOR__
|
|
WriteDebug(filepath);
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
else {
|
|
m_FileLoad = true;
|
|
}
|
|
while(!feof(m_ScriptFile)) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \t\n");
|
|
if(token) {
|
|
if(token[0] == '/')
|
|
continue;
|
|
// 라벨 체크
|
|
if(!strcmp(token,ESSTART))
|
|
CurrentLoad = ESS;
|
|
else if(!strcmp(token,ESLIST)) {
|
|
CurrentLoad = EST;
|
|
// effect list num setting
|
|
GetEffNum();
|
|
|
|
}
|
|
else if(!strcmp(token,ESLOOP)) {
|
|
CurrentLoad = ESL;
|
|
|
|
|
|
}
|
|
else if(!strcmp(token,ESPLAY)) {
|
|
CurrentLoad = ESP;
|
|
GetStartEndNum();
|
|
}
|
|
else if(!strcmp(token,ESSNAP)) {
|
|
CurrentLoad = ESN;
|
|
//GetSnapNum();
|
|
|
|
}
|
|
else if(!strcmp(token,ESFADEOUT)) {
|
|
CurrentLoad = ESFO;
|
|
|
|
}
|
|
else if(!strcmp(token,ESFADEIN)) {
|
|
CurrentLoad = ESFI;
|
|
|
|
}
|
|
else if(!strcmp(token,ESSHAKE)) {
|
|
CurrentLoad = ESSK;
|
|
|
|
}
|
|
else if(!strcmp(token,ESSOUND)) {
|
|
CurrentLoad = ESO;
|
|
}
|
|
else if(!strcmp(token,ESHIT)) {
|
|
CurrentLoad = ESH;
|
|
}
|
|
else if(!strcmp(token,ESEND)) {
|
|
CurrentLoad = ESE;
|
|
|
|
}
|
|
else if(!strcmp(token,ESSUB)) {
|
|
CurrentLoad = ESB;
|
|
GetSubNum();
|
|
|
|
}
|
|
else if(!strcmp(token,ESCLIGHT)) {
|
|
CurrentLoad = ESCL;
|
|
}
|
|
else if(!strcmp(token,ESSLIDE)) { // Slide
|
|
CurrentLoad = ESSL;
|
|
}
|
|
else if(!strcmp(token,ESEXT5)) {
|
|
CurrentLoad = ESE5;
|
|
}
|
|
else if(!strcmp(token,ESLIGHTN)) { //lightning
|
|
CurrentLoad = ESLN;
|
|
GetLnNum();
|
|
}
|
|
else if(!strcmp(token,ESLIGHTN2)) { //lightning2
|
|
CurrentLoad = ESLN2;
|
|
GetLn2Num();
|
|
}
|
|
else if(!strcmp(token,ESLIGHTN3)) { //lightning3
|
|
CurrentLoad = ESLN3;
|
|
GetLn3Num();
|
|
}
|
|
else if(!strcmp(token,ESWHEEL)) { // wheel
|
|
CurrentLoad = ESW;
|
|
GetEffWheelNum();
|
|
}
|
|
else if(!strcmp(token,ESWEAPON)) { //weapon effect
|
|
CurrentLoad = ESWP;
|
|
GetEffWeaponNum();
|
|
}
|
|
else if(!strcmp(token,ESBEZIERM)) { //Bezier Middle
|
|
CurrentLoad = ESBM;
|
|
|
|
}
|
|
else if(!strcmp(token,ESLIGHT)) { // Light
|
|
CurrentLoad = ESLT;
|
|
GetEffLightNum();
|
|
}
|
|
else if(!strcmp(token,ESPLAYT)) { // Play Time
|
|
CurrentLoad = ESPT;
|
|
GetEffPlayTime();
|
|
}
|
|
else if(!strcmp(token,ESCHAR)) { // Character
|
|
CurrentLoad = ESCH;
|
|
GetEffChar();
|
|
}
|
|
else if(!strcmp(token,ESWEAPONL)) { // 검기 관련 제어
|
|
CurrentLoad = ESWL;
|
|
GetEffWeaponLine();
|
|
|
|
}
|
|
else { // data 부분 로드
|
|
switch (CurrentLoad) {
|
|
case EST: // list load
|
|
GetEffList(token);
|
|
break;
|
|
case ESL:
|
|
GetEffLoop(token);
|
|
break;
|
|
case ESP:
|
|
GetEffPlay(token);
|
|
break;
|
|
case ESN:
|
|
GetEffSnap(token);
|
|
break;
|
|
case ESFO: //fade out
|
|
GetFadeOut(token);
|
|
break;
|
|
case ESFI: //fade in
|
|
GetFadeIn(token);
|
|
break;
|
|
case ESSK: //camera shake
|
|
GetCameraShake(token);
|
|
break;
|
|
case ESO: //sound
|
|
GetSound(token);
|
|
break;
|
|
case ESB:
|
|
GetSubData(token);
|
|
break;
|
|
case ESCL: //CLight
|
|
GetCLight(token);
|
|
break;
|
|
case ESH: //Hit
|
|
GetHit(token);
|
|
break;
|
|
case ESSL: //slide
|
|
GetSlide(token);
|
|
break;
|
|
case ESE5:
|
|
GetExt5ex(token);
|
|
break;
|
|
case ESLN: //lightning
|
|
GetLightn(token);
|
|
break;
|
|
case ESLN2: //lightning2
|
|
GetLightn2(token);
|
|
break;
|
|
case ESLN3: //lightning3
|
|
GetLightn3(token);
|
|
case ESW: //Wheel
|
|
GetEffWheel(token);
|
|
break;
|
|
case ESWP: //weapon Effect
|
|
GetEffWeapon(token);
|
|
break;
|
|
case ESBM: //Bezier Middle
|
|
GetEffBezier(token);
|
|
break;
|
|
case ESLT: // Vertex Light 적용되는 eff load
|
|
GetEffLight(token);
|
|
break;
|
|
case ESPT:
|
|
break;
|
|
case ESCH:
|
|
break;
|
|
case ESWL:
|
|
break;
|
|
|
|
}
|
|
if(CurrentLoad == ESE)
|
|
break;
|
|
|
|
}
|
|
|
|
} // if(token)
|
|
|
|
} // while
|
|
if(m_ScriptFile != NULL) {
|
|
|
|
fclose(m_ScriptFile);
|
|
m_ScriptFile = NULL;
|
|
//WriteConvertFile(m_FileName);
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
void CEffScript::GetEffPlayTime() { // Play Time Setting (시간 개념 들어갔을때를 준비)
|
|
char *token = strtok(NULL," \n\t");
|
|
m_iStartPlayTime = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_iEndPlayTime = atoi(token);
|
|
m_bPlayTime = true;
|
|
}
|
|
void CEffScript::GetEffLightNum() {
|
|
char *token = strtok(NULL," \t\n");
|
|
m_iLight = atoi(token);
|
|
m_pLight = new CEffLight[m_iLight];
|
|
|
|
}
|
|
void CEffScript ::GetEffNum() {
|
|
char *token = strtok(NULL," \t\n");
|
|
m_EffNum = atoi(token);
|
|
|
|
m_EffList = new CEffInfo[m_EffNum];
|
|
|
|
}
|
|
void CEffScript::GetSubNum() {
|
|
|
|
char *token = strtok(NULL," \t\n");
|
|
m_SubScriptNum = atoi(token);
|
|
m_SubScript = new CEffScript[m_SubScriptNum];
|
|
m_NextScript = new int[m_SubScriptNum];
|
|
if(m_SubScriptNum)
|
|
SetDevice(m_Device);
|
|
}
|
|
void CEffScript::GetSubClone(int index,CEffScript *Clone,char *filename) {
|
|
CEffScript *pTmp = NULL;
|
|
char *dot = NULL;
|
|
|
|
pTmp = (CEffScript *)(CSceneManager::m_pEsfCasher->GetCashData(filename));
|
|
if(pTmp) {
|
|
pTmp->Clone(&Clone->m_SubScript[index]);
|
|
}
|
|
else {
|
|
if((Clone->m_Weapone != ESEMPTY) || (Clone->m_Sex != ESEMPTY)) {
|
|
dot = strrchr(filename,'.');
|
|
// sub effect script load
|
|
|
|
switch(m_Weapone) {
|
|
case 6:// 한손 무기
|
|
case 7:
|
|
case 8:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '6';dot++;
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '9';dot++;
|
|
break;
|
|
case 11:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '1';dot++;
|
|
break;
|
|
case 12:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '2';dot++;
|
|
break;
|
|
case 13:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
case 14:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '4';dot++;
|
|
break;
|
|
case 15:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '5';dot++;
|
|
break;
|
|
case 33: // 아칸 한손무기
|
|
case 34:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '3';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '6';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
switch(m_Sex) {
|
|
case 1:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'm';dot++;
|
|
break;
|
|
case 2:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'f';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
(*dot) = '.';dot++;
|
|
(*dot) = 'e';dot++;
|
|
(*dot) = 's';dot++;
|
|
(*dot) = 'f';dot++;
|
|
|
|
pTmp = (CEffScript *)(CSceneManager::m_pEsfCasher->GetCashData(filename));
|
|
if(pTmp) {
|
|
pTmp->Clone(&Clone->m_SubScript[index]);
|
|
}
|
|
else {
|
|
MessageBox(NULL,"에러","eee",MB_OK);
|
|
|
|
//delete Clone->m_SubScript[index];
|
|
//Clone->m_SubScript[index] = NULL;
|
|
}
|
|
}
|
|
else {
|
|
MessageBox(NULL,"에러","eee",MB_OK);
|
|
|
|
/*
|
|
delete Clone->m_SubScript[index];
|
|
Clone->m_SubScript[index] = NULL;*/
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::GetBinSubData(int index,char *filename) {
|
|
char *dot = NULL;
|
|
FILE *fp = NULL;
|
|
char filepath[256] = {0};
|
|
|
|
strcpy(filepath,EFFECTSCRIPTPATH);
|
|
strcat(filepath,filename);
|
|
|
|
fp = fopen(filepath,"rb");
|
|
|
|
if(fp == NULL) { // 열려고 하는 파일 없을시 검사 시작
|
|
#ifdef __EFF_WCREATOR__
|
|
WriteDebug(filepath);
|
|
#endif
|
|
|
|
if((m_Weapone != ESEMPTY) || (m_Sex != ESEMPTY)) {
|
|
dot = strrchr(filename,'.');
|
|
// sub effect script load
|
|
|
|
switch(m_Weapone) {
|
|
case 6:// 한손 무기
|
|
case 7:
|
|
case 8:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '6';dot++;
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '9';dot++;
|
|
break;
|
|
case 11:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '1';dot++;
|
|
break;
|
|
case 12:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '2';dot++;
|
|
break;
|
|
case 13:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
case 14:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '4';dot++;
|
|
break;
|
|
case 15:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '5';dot++;
|
|
break;
|
|
case 33: // 아칸 한손무기
|
|
case 34:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '3';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '6';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
switch(m_Sex) {
|
|
case 1:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'm';dot++;
|
|
break;
|
|
case 2:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'f';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
(*dot) = '.';dot++;
|
|
(*dot) = 'e';dot++;
|
|
(*dot) = 's';dot++;
|
|
(*dot) = 'f';dot++;
|
|
}
|
|
}
|
|
else {
|
|
fclose(fp);
|
|
}
|
|
m_SubScript[index].GetScriptBinData(filename);
|
|
|
|
}
|
|
void CEffScript::GetSubData(char *tok) {
|
|
int i = 0;
|
|
FILE *fp;
|
|
|
|
char *dot = NULL;
|
|
|
|
char *token = NULL;
|
|
char filename[ESBUF_SIZE]= {0};
|
|
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
m_NextScript[i] = atoi(tok);
|
|
token = strtok(NULL," \n\t");
|
|
strcpy(filename,token);
|
|
fp = fopen(filename,"rt");
|
|
|
|
if(!fp) { // 열려고 하는 파일 없을시 검사 시작
|
|
if((m_Weapone != ESEMPTY) || (m_Sex != ESEMPTY)) {
|
|
dot = strrchr(filename,'.');
|
|
// sub effect script load
|
|
|
|
switch(m_Weapone) {
|
|
case 6:// 한손 무기
|
|
case 7:
|
|
case 8:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '6';dot++;
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '9';dot++;
|
|
break;
|
|
case 11:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '1';dot++;
|
|
break;
|
|
case 12:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '2';dot++;
|
|
break;
|
|
case 13:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
case 14:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '4';dot++;
|
|
break;
|
|
case 15:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '1';dot++;
|
|
(*dot) = '5';dot++;
|
|
break;
|
|
case 33: // 아칸 한손무기
|
|
case 34:
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = '3';dot++;
|
|
(*dot) = '3';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
switch(m_Sex) {
|
|
case 1:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'm';dot++;
|
|
break;
|
|
case 2:
|
|
(*dot) = '_';dot++;
|
|
(*dot) = 'f';dot++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
(*dot) = '.';dot++;
|
|
(*dot) = 'e';dot++;
|
|
(*dot) = 's';dot++;
|
|
(*dot) = 'f';dot++;
|
|
}
|
|
}
|
|
else {
|
|
fclose(fp);
|
|
}
|
|
m_SubScript[i].GetScriptData(filename);
|
|
|
|
for(i=1;i<m_SubScriptNum;i++) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_NextScript[i] = atoi(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
m_SubScript[i].GetScriptData(token);
|
|
|
|
}
|
|
}
|
|
void CEffScript ::GetSnapNum() {
|
|
char *token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_SnapNum = atoi(token);
|
|
if(m_EffPlayData.m_SnapNum)
|
|
m_EffPlayData.m_SnapEff = new CEffSnap[m_EffPlayData.m_SnapNum];
|
|
|
|
}
|
|
void CEffScript ::GetStartEndNum() {
|
|
char *token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_StartIdNum = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_MidEffIdNum = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_EndEffIdNum = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
if(token)
|
|
m_TickFrame = atoi(token);
|
|
|
|
if(m_EffPlayData.m_StartIdNum)
|
|
m_EffPlayData.m_StartId = new int[m_EffPlayData.m_StartIdNum];
|
|
if(m_EffPlayData.m_MidEffIdNum) {
|
|
m_EffPlayData.m_MidEffId = new int[m_EffPlayData.m_MidEffIdNum];
|
|
// 궤적 (각 mid 마다 하나씩)
|
|
//m_Wheel = new CLightning[m_EffPlayData.m_MidEffIdNum];
|
|
|
|
// m_EffPlayData.m_MidValue = new CEffMidValue[m_EffPlayData.m_MidEffIdNum];
|
|
}
|
|
if(m_EffPlayData.m_EndEffIdNum)
|
|
m_EffPlayData.m_EndEffId = new int[m_EffPlayData.m_EndEffIdNum];
|
|
|
|
}
|
|
void CEffScript::SetSkillInfo(int s,int w) {
|
|
m_Sex = s;
|
|
m_Weapone = w;
|
|
|
|
}
|
|
void CEffScript::SetDevice(LPDIRECT3DDEVICE8 device) {
|
|
int i;
|
|
m_Device = device;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetDevice(m_Device);
|
|
}
|
|
}
|
|
void CEffScript::SetRot(D3DXVECTOR3 before,D3DXVECTOR3 now,D3DXVECTOR3 &target) {
|
|
float roll, pitch, yaw;
|
|
float lateDot = 0.0f;
|
|
roll = pitch = yaw = 0.0f;
|
|
|
|
D3DXVec3Normalize(&before,&before);
|
|
D3DXVec3Normalize(&now,&now);
|
|
|
|
D3DXVECTOR3 late(0.0f,0.0f,0.0f);
|
|
D3DXVECTOR3 tmp(0.0f,0.0f,0.0f);
|
|
|
|
D3DXVECTOR3 tmp2(0.0f,0.0f,0.0f);
|
|
|
|
tmp = now - before;
|
|
D3DXVec3Normalize(&tmp,&tmp);
|
|
|
|
D3DXVec3Cross(&tmp2,&now,&tmp);
|
|
|
|
D3DXVec3Cross(&late,&tmp2,&now);
|
|
D3DXVec3Normalize(&late,&late);
|
|
|
|
lateDot = D3DXVec3Dot(&tmp,&late);
|
|
if (lateDot == 0) {
|
|
roll = 0.0f;
|
|
}
|
|
else {
|
|
roll = (float) -atan2(ESGRAVITY, lateDot) + ESHALF_PI;
|
|
}
|
|
|
|
pitch = (float) -atan(now.y / sqrt((now.z * now.z) + (now.x * now.x)));
|
|
|
|
yaw = (float) atan2(now.x, now.z);
|
|
|
|
target.x = pitch;
|
|
target.y = yaw;
|
|
target.z = roll;
|
|
}
|
|
void CEffScript ::SetMine(bool m) {
|
|
int i;
|
|
m_Mine = m;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetMine(m);
|
|
}
|
|
}
|
|
void CEffScript::SetVisibility(bool t) {
|
|
|
|
m_bVisibility = t;
|
|
/* for( i = 0; i < m_SubScriptNum; i++ ) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetVisibility(t);
|
|
|
|
}
|
|
*/
|
|
}
|
|
void CEffScript ::SetAllLoopOff() {
|
|
int i;
|
|
if( m_lstEff.size() > 0 ) {
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(m_lstEff[i] != NULL)
|
|
m_lstEff[i]->SetLoop(false);
|
|
|
|
}
|
|
}
|
|
if(m_SubScript != NULL) { // Sub Script Loop Off
|
|
for( i = 0; i < m_SubScriptNum; i++ ) {
|
|
m_SubScript[i].SetAllLoopOff();
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript ::SetEndPos(D3DXVECTOR3 *end,int num) {
|
|
if(m_bPosSet) {
|
|
if(m_bExt7) {// extension7 일때 SetEndPos 할시 start pos setting
|
|
int i;
|
|
int index;
|
|
m_StartPosSet = true;
|
|
m_StartPos.x = end[0].x;
|
|
m_StartPos.y = end[0].y;
|
|
m_StartPos.z = end[0].z;
|
|
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_StartIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
|
|
index = m_EffPlayData.m_StartId[i];
|
|
|
|
tmp_pos = m_StartPos;
|
|
tmp_pos.x += (m_EffList[index].m_StartPos[0]* m_MulPos);
|
|
tmp_pos.y += (m_EffList[index].m_StartPos[1]* m_MulPos);
|
|
tmp_pos.z += (m_EffList[index].m_StartPos[2]* m_MulPos);
|
|
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
|
|
}
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetStartPos(m_StartPos);
|
|
}
|
|
}
|
|
else { // 기본 end pos setting
|
|
int i;
|
|
int index;
|
|
m_EndPosNum = num;
|
|
|
|
/*if(m_EndPos) {
|
|
delete[] m_EndPos;
|
|
m_EndPos = NULL;
|
|
}
|
|
*/
|
|
if(m_EndPos == NULL) // (03.03.01 수정)
|
|
m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
|
|
memcpy(m_EndPos,end,sizeof(D3DXVECTOR3) * m_EndPosNum);
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_EndEffIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
tmp_pos.x = m_EndPos[0].x + (m_EffPlayData.m_EndPos[0] * m_MulPos);
|
|
tmp_pos.y = m_EndPos[0].y + (m_EffPlayData.m_EndPos[1] * m_MulPos);
|
|
tmp_pos.z = m_EndPos[0].z + (m_EffPlayData.m_EndPos[2] * m_MulPos);
|
|
|
|
index = m_EffPlayData.m_EndEffId[i];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
// effect 시작
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
}
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetEndPos(end,num);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
void CEffScript::SetEndPos(float x,float y,float z) {
|
|
if(m_bPosSet) {
|
|
if(m_bExt7) {// extension7 일때 SetEndPos 할시 start pos setting
|
|
int i;
|
|
int index;
|
|
m_StartPosSet = true;
|
|
m_StartPos.x = x;
|
|
m_StartPos.y = y;
|
|
m_StartPos.z = z;
|
|
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_StartIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
|
|
index = m_EffPlayData.m_StartId[i];
|
|
|
|
tmp_pos = m_StartPos;
|
|
tmp_pos.x += (m_EffList[index].m_StartPos[0]* m_MulPos);
|
|
tmp_pos.y += (m_EffList[index].m_StartPos[1]* m_MulPos);
|
|
tmp_pos.z += (m_EffList[index].m_StartPos[2]* m_MulPos);
|
|
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
|
|
}
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetStartPos(m_StartPos);
|
|
}
|
|
}
|
|
else { // 기본 end pos setting
|
|
|
|
int i;
|
|
int index;
|
|
m_EndPosNum = 1;
|
|
/*if(m_EndPos) {
|
|
|
|
delete[] m_EndPos;
|
|
m_EndPos = NULL;
|
|
}*/
|
|
|
|
if(m_EndPos == NULL) // (03.03.01 수정)
|
|
m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
|
|
m_EndPos[0].x = x;
|
|
m_EndPos[0].y = y;
|
|
m_EndPos[0].z = z;
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_EndEffIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
tmp_pos.x = m_EndPos[0].x + (m_EffPlayData.m_EndPos[0]* m_MulPos);
|
|
tmp_pos.y = m_EndPos[0].y + (m_EffPlayData.m_EndPos[1]* m_MulPos);
|
|
tmp_pos.z = m_EndPos[0].z + (m_EffPlayData.m_EndPos[2]* m_MulPos);
|
|
|
|
index = m_EffPlayData.m_EndEffId[i];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
// effect 시작
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetEndPos(m_EndPos[0].x,m_EndPos[0].y,m_EndPos[0].z);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::GetEffLight(char *effname) {
|
|
char *token = NULL;
|
|
|
|
if(m_iLight > 0 ) {
|
|
strcpy(m_pLight[0].m_strEff,effname);
|
|
for(int i = 1;i < m_iLight;i++) {
|
|
char strEff[ESBUF_SIZE] = {0};
|
|
fgets(strEff,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
token = strtok(strEff," \n\t");
|
|
strcpy(m_pLight[0].m_strEff,token);
|
|
}
|
|
}
|
|
}
|
|
void CEffScript ::GetEffList(char *effname) {
|
|
|
|
strcpy(m_EffList[m_CurrentNum].m_EffName,effname);
|
|
char *token = strtok(NULL," \t\n");
|
|
if(token) { // scale load
|
|
m_EffList[m_CurrentNum].m_Scale = (float)atoi(token);
|
|
m_EffList[m_CurrentNum].m_Scale /= 100.0f;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
if(token) {
|
|
m_EffList[m_CurrentNum].m_MinFrame = atoi(token);
|
|
}
|
|
m_CurrentNum++;
|
|
|
|
}
|
|
|
|
void CEffScript ::GetEffLoop(char *tok) {
|
|
int i;
|
|
int index = ESEMPTY;
|
|
char *token = NULL;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!strcmp(tok,m_EffList[i].m_EffName)) {
|
|
index = i;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(index != ESEMPTY) {
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[index].m_LoopStart = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[index].m_LoopEnd = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[index].m_LoopSwitch = atoi(token);
|
|
}
|
|
}
|
|
|
|
/*
|
|
void CEffScript ::SetWheelPoint(int index,float x,float y,float z) {
|
|
|
|
int current_index = m_Wheel[index].m_Current;
|
|
|
|
m_Wheel[index].m_Point[current_index].x = x;
|
|
m_Wheel[index].m_Point[current_index].y = y;
|
|
m_Wheel[index].m_Point[current_index].z = z;
|
|
m_Wheel[index].m_Current++;
|
|
if(m_Wheel[index].m_Current >= m_Wheel[index].m_PointNum) {
|
|
m_Wheel[index].m_FullSetting = true;
|
|
m_Wheel[index].m_Current = 0;
|
|
}
|
|
}*/
|
|
void CEffScript ::GetEffPlay(char *tok) {
|
|
|
|
char *token = NULL;
|
|
int index = ESEMPTY;
|
|
|
|
|
|
int i;
|
|
|
|
if(!strcmp(tok,"S")) { //start
|
|
|
|
token = strtok(NULL," \t\n");
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!strcmp(token,m_EffList[i].m_EffName)) {
|
|
index = i;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(index != ESEMPTY) {
|
|
m_EffPlayData.m_StartId[m_EffPlayData.m_StartCount++] = index;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
if(!strcmp(token,"R")) {
|
|
|
|
m_EffList[index].m_bStartRot = true;
|
|
token = strtok(NULL," \t\n");
|
|
}
|
|
if(token)
|
|
m_DelayFrame = atoi(token);
|
|
else {
|
|
return;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
if(token)
|
|
m_EffPlayData.m_StartFrameNextEff = atoi(token);
|
|
else {
|
|
|
|
return;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
|
|
if(token) { // position
|
|
m_EffList[index].m_StartPos[0] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[index].m_StartPos[1] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[index].m_StartPos[2] = atof(token);
|
|
}
|
|
|
|
token = strtok(NULL," \t\n");
|
|
|
|
if(token) { // interface position
|
|
m_bInterfacePos = true;
|
|
m_InterfacePos[0] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_InterfacePos[1] = atof(token);
|
|
}
|
|
}
|
|
else if(!strcmp(tok,"M")) {
|
|
|
|
token = strtok(NULL," \t\n");
|
|
|
|
if(token[0] == '[') {
|
|
token = strtok(NULL," \t\n");
|
|
m_MidUnit.x = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_MidUnit.y = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_MidUnit.z = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
token = strtok(NULL," \t\n");
|
|
}
|
|
|
|
|
|
if(!strcmp(token,"N")) {
|
|
//궤적에 따른 회전 없음
|
|
m_NotRot = true;
|
|
token = strtok(NULL," \t\n");
|
|
}
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!strcmp(token,m_EffList[i].m_EffName)) {
|
|
index = i;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(index != ESEMPTY) {
|
|
m_EffPlayData.m_MidEffId[m_EffPlayData.m_MidCount] = index;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
if(!token) {
|
|
m_EffPlayData.m_MidCount++;
|
|
return;
|
|
}
|
|
//speed
|
|
m_EffPlayData.m_Speed = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_Accel = atof(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_MinSpeed = atof(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_MaxSpeed = atof(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
|
|
if(!strcmp(token,"R")) { //Random 궤적
|
|
// 한계 value get (int 형 절대값으로..)
|
|
D3DXVECTOR3 tmp_s;
|
|
D3DXVECTOR3 tmp_a;
|
|
token = strtok(NULL," \t\n");
|
|
tmp_s.x = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
tmp_s.y = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
tmp_s.z = atoi(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
tmp_a.x = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
tmp_a.y = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
tmp_a.z = atoi(token);
|
|
|
|
if(tmp_s.x) {
|
|
m_EffList[i].m_SpeedValue[0] = (float)(rand() % (int)tmp_s.x);
|
|
if(rand() %2)
|
|
m_EffList[i].m_SpeedValue[0] *= (-1.0f);
|
|
}
|
|
else
|
|
m_EffList[i].m_SpeedValue[0] = 0.0f;
|
|
|
|
if(tmp_s.y) {
|
|
m_EffList[i].m_SpeedValue[1] = (float)(rand() % (int)tmp_s.y);
|
|
if(rand() %2)
|
|
m_EffList[i].m_SpeedValue[1] *= (-1.0f);
|
|
}
|
|
else
|
|
m_EffList[i].m_SpeedValue[1] = 0.0f;
|
|
|
|
if(tmp_s.z) {
|
|
m_EffList[i].m_SpeedValue[2] = (float)(rand() % (int)tmp_s.z);
|
|
if(rand() %2)
|
|
m_EffList[i].m_SpeedValue[2] *= (-1.0f);
|
|
}
|
|
else
|
|
m_EffList[i].m_SpeedValue[2] = 0.0f;
|
|
|
|
if(tmp_a.x) {
|
|
m_EffList[i].m_AccelValue[0] = (float)(rand() % (int)tmp_a.x);
|
|
if(rand() %2)
|
|
m_EffList[i].m_AccelValue[0] *= (-1.0f);
|
|
}
|
|
else
|
|
m_EffList[i].m_AccelValue[0] = 0.0f;
|
|
if(tmp_a.y) {
|
|
m_EffList[i].m_AccelValue[1] = (float)(rand() % (int)tmp_a.y);
|
|
if(rand() %2)
|
|
m_EffList[i].m_AccelValue[1] *= (-1.0f);
|
|
}
|
|
else
|
|
m_EffList[i].m_AccelValue[0] = 0.0f;
|
|
if(tmp_a.z) {
|
|
m_EffList[i].m_AccelValue[2] = (float)(rand() % (int)tmp_a.z);
|
|
if(rand() %2)
|
|
m_EffList[i].m_AccelValue[2] *= (-1.0f);
|
|
|
|
}
|
|
else
|
|
m_EffList[i].m_AccelValue[0] = 0.0f;
|
|
}
|
|
else {
|
|
m_EffList[i].m_SpeedValue[0] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[i].m_SpeedValue[1] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[i].m_SpeedValue[2] = atof(token);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[i].m_AccelValue[0] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[i].m_AccelValue[1] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffList[i].m_AccelValue[2] = atof(token);
|
|
}
|
|
// 궤적 라인 DATA 가져옴
|
|
token = strtok(NULL," \t\n");
|
|
if(!token)
|
|
return;
|
|
int point_num = atoi(token);
|
|
//m_Wheel[m_EffPlayData.m_MidCount].CreateList(point_num);
|
|
|
|
token = strtok(NULL," \t\n");
|
|
//m_Wheel[m_EffPlayData.m_MidCount].SetSize(atof(token));
|
|
|
|
token = strtok(NULL," \t\n");
|
|
//m_Wheel[m_EffPlayData.m_MidCount].CreateTexture(1);
|
|
//m_Wheel[m_EffPlayData.m_MidCount].SetDevice(m_Device);
|
|
// 라인 갯수
|
|
//m_Wheel[m_EffPlayData.m_MidCount].SetVertNum(1);
|
|
//m_Wheel[m_EffPlayData.m_MidCount].CreateVertexBuffer();
|
|
//m_Wheel[m_EffPlayData.m_MidCount++].SetTexture(0,token);
|
|
|
|
|
|
|
|
|
|
/* m_Wheel[m_EffPlayData.m_MidCount].m_PointNum = atoi(token);
|
|
if(m_Wheel[m_EffPlayData.m_MidCount].m_PointNum) {
|
|
m_Wheel[m_EffPlayData.m_MidCount].m_Point = new D3DXVECTOR3[m_Wheel[m_EffPlayData.m_MidCount].m_PointNum];
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
m_Wheel[m_EffPlayData.m_MidCount].m_QuadSize = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
strcpy(m_Wheel[m_EffPlayData.m_MidCount++].m_TexName,token);
|
|
*/
|
|
|
|
}
|
|
else if(!strcmp(tok,"V")) { // mid effect value
|
|
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_MidEffNum = atoi(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_StartMidNextEff = atoi(token);
|
|
}
|
|
else if(!strcmp(tok,"E")) { // end effect
|
|
|
|
token = strtok(NULL," \t\n");
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!strcmp(token,m_EffList[i].m_EffName)) {
|
|
index = i;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(index != ESEMPTY) {
|
|
m_EffPlayData.m_EndEffId[m_EffPlayData.m_EndCount++] = index;
|
|
}
|
|
token = strtok(NULL," \t\n");
|
|
|
|
if(token) { // position
|
|
m_EffPlayData.m_EndPos[0] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_EndPos[1] = atof(token);
|
|
token = strtok(NULL," \t\n");
|
|
m_EffPlayData.m_EndPos[2] = atof(token);
|
|
}
|
|
|
|
}
|
|
//start_count = end_count = 0;
|
|
|
|
}
|
|
|
|
void CEffScript ::GetSlide(char *tok) { // extension6 : 스킬 사용시 캐릭 미끌어짐 관련
|
|
char *token = NULL;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int slide_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Ext6ValueNum = atoi(token);
|
|
slide_num = m_EffList[index].m_Ext6ValueNum;
|
|
|
|
if(slide_num > 0) {
|
|
m_EffList[index].m_Ext6Value = new CEffExt6[slide_num];
|
|
}
|
|
for(int j=0;j<slide_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
// slide startframe, slide speed, slide accel, slide length,slide limitspeed
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_Ext6Value[j].m_SlideStartFrame = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Ext6Value[j].m_SlideSpeed = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Ext6Value[j].m_SlideAccel = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Ext6Value[j].m_SlideLength = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Ext6Value[j].m_LimitSpeed = atof(token);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEffScript ::GetEffSnap(char *tok) { // character에 effect 붙이기 관련
|
|
|
|
char *token = NULL;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int snap_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_SnapNum = atoi(token);
|
|
snap_num = m_EffList[index].m_SnapNum;
|
|
|
|
if(snap_num > 0) {
|
|
m_EffList[index].m_Snap = new CEffSnap[snap_num];
|
|
}
|
|
for(int j=0;j<snap_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
// snap effect start frame
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_Snap[j].m_SnapStartFrame = atoi(token);
|
|
|
|
token = strtok(NULL," \n\t");
|
|
//esf name
|
|
strcpy(m_EffList[index].m_Snap[j].m_EffName,token);
|
|
//pivot name
|
|
token = strtok(NULL," \n\t");
|
|
strcpy(m_EffList[index].m_Snap[j].m_PivotName,token);
|
|
|
|
token = strtok(NULL," \n\t");
|
|
if(token[0] == 'L')
|
|
m_EffList[index].m_Snap[j].m_Loop = 1; // character object rot 적용true
|
|
else
|
|
m_EffList[index].m_Snap[j].m_Loop = 0; // character object rot 적용false
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::RenderLightn3() {
|
|
int i,j;
|
|
if(!m_pLightn3->m_bStart || m_pLightn3->m_bEnd)
|
|
return;
|
|
for(i = 0;i < m_pLightn3->m_iMaxLine;i++) {
|
|
CEffLightn *ptr = &(m_pLightn3->m_pLightn[i]);
|
|
for(j=0; j < ptr->m_LnNum; j++) {
|
|
if(ptr->m_Lightn != NULL) {
|
|
|
|
ptr->m_Lightn[j].Render(ptr->m_BlendMode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::RenderLightn2() {
|
|
int i,j;
|
|
if(!m_pLightn2->m_bStart || m_pLightn2->m_bEnd)
|
|
return;
|
|
for(i = 0;i < m_pLightn2->m_iMaxLine;i++) {
|
|
CEffLightn *ptr = &(m_pLightn2->m_pLightn[i]);
|
|
for(j=0; j < ptr->m_LnNum; j++) {
|
|
if(ptr->m_Lightn != NULL) {
|
|
|
|
ptr->m_Lightn[j].Render(ptr->m_BlendMode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::RenderLightn() {
|
|
int i,j;
|
|
for(i=0;i<m_LningNum;i++) {
|
|
if((m_Lning[i].m_bLightnStart)) {// && (!m_Lning[i].m_bLightnEnd)) {
|
|
if(m_Lning[i].m_Lightn != NULL) {
|
|
for(j=0;j<m_Lning[i].m_LnNum;j++) {
|
|
m_Lning[i].m_Lightn[j].Render(m_Lning[i].m_BlendMode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::RenderWheel() {
|
|
int i;
|
|
for(i=0;i<m_WheelNum;i++) {
|
|
m_Wheel[i].m_WheelBody.Render2(m_Wheel[i].m_BlendMode);
|
|
}
|
|
}
|
|
|
|
void CEffScript::PlayWheel(){ // 궤적 라인play
|
|
int i;
|
|
|
|
CLightning *ptr = NULL;
|
|
m_bWheelStart = true;
|
|
for(i=0;i<m_WheelNum;i++) {
|
|
ptr = &(m_Wheel[i].m_WheelBody);
|
|
ptr->SetDevice(m_Device);
|
|
ptr->CreateList(m_Wheel[i].m_PointNum);
|
|
ptr->SetSize(m_Wheel[i].m_PlaneSize);
|
|
|
|
// insert point
|
|
/*
|
|
for(int j=0;j<8;j+=2) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
int insert_pos = m_Wheel[i].m_WheelBody.m_InsertCount;
|
|
if(insert_pos >= 2) {
|
|
D3DXVec3CatmullRom(&tmp_pos,
|
|
&(m_Wheel[i].m_WheelBody.m_PointList[insert_pos-2]),
|
|
&(m_Wheel[i].m_WheelBody.m_PointList[insert_pos-1]),
|
|
&(m_MidPos),
|
|
&(m_MidPos),(float)j/10.0f);
|
|
}
|
|
else {
|
|
D3DXVec3CatmullRom(&tmp_pos,
|
|
&(m_OldMidPos),
|
|
&(m_OldMidPos),
|
|
&(m_MidPos),
|
|
&(m_MidPos),(float)j/10.0f);
|
|
}
|
|
|
|
m_Wheel[i].m_WheelBody.InsertEmptyPoint(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
|
|
}
|
|
*/
|
|
ptr->InsertEmptyPoint(m_MidPos.x,m_MidPos.y,m_MidPos.z);
|
|
|
|
//
|
|
ptr->SetPlaneValue(m_Wheel[i].m_PlaneValue);
|
|
ptr->CreateTexture(1);
|
|
ptr->SetTexture(0,m_Wheel[i].m_TexName);
|
|
ptr->SetVertNum(1);
|
|
ptr->SetColor(D3DCOLOR_ARGB(255,255,255,255));
|
|
ptr->SetUnitUv(m_Wheel[i].m_UnitUv);
|
|
ptr->CreateVertexBuffer();
|
|
|
|
|
|
}
|
|
}
|
|
void CEffScript::PlayWeaponLine() {
|
|
|
|
#ifndef __EFF_WCREATOR__ //client 용
|
|
|
|
if(m_Player != NULL) {
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
m_Player->SetWeaponLine((LPDIRECT3DTEXTURE8)m_pEffWeaponLine->m_pLineTexture->GetTexture(), m_pEffWeaponLine->m_iColor,m_pEffWeaponLine->m_iBlendMode);
|
|
}
|
|
}
|
|
}
|
|
|
|
#else //world creator 용
|
|
|
|
if(m_Player != NULL) {
|
|
m_Player->SetWeaponLine((LPDIRECT3DTEXTURE8)m_pEffWeaponLine->m_pLineTexture->GetTexture(), m_pEffWeaponLine->m_iColor,m_pEffWeaponLine->m_iBlendMode);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
void CEffScript::DeleteWeaponLine() { // 검기를 이 스크립트가 제어하기 전 상태로 되돌림
|
|
|
|
if(m_pEffWeaponLine != NULL) {
|
|
#ifndef __EFF_WCREATOR__ //client 용
|
|
|
|
if(m_Player != NULL) {
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
m_Player->DeleteWeaponLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
#else //world creator 용
|
|
|
|
if(m_Player != NULL) {
|
|
m_Player->DeleteWeaponLine();
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void CEffScript::DeleteWeaponEff() {
|
|
int i;
|
|
|
|
if(m_WeaponEff != NULL) {
|
|
#ifndef __EFF_WCREATOR__ //client 용
|
|
|
|
if(m_Player != NULL) {
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
|
|
for( i = 0; i < m_WeaponEffNum; i++ ) {
|
|
m_Player->DeleteWeaponEffect(m_WeaponEff[i].m_EffName,m_WeaponEff[i].m_EffNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#else //world creator 용
|
|
|
|
if(m_Player != NULL) {
|
|
for( i = 0; i < m_WeaponEffNum; i++ ) {
|
|
m_Player->DeleteWeaponEffect(m_WeaponEff[i].m_EffName,m_WeaponEff[i].m_EffNum);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
void CEffScript::PlayWeaponEff() {
|
|
int i;
|
|
|
|
#ifndef __EFF_WCREATOR__ //client 용
|
|
|
|
if(m_Player != NULL) {
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
for( i = 0; i < m_WeaponEffNum; i++ ) {
|
|
m_Player->AddWeaponEffect(m_WeaponEff[i].m_EffName,m_WeaponEff[i].m_EffNum);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#else //world creator 용
|
|
|
|
if(m_Player != NULL) {
|
|
for( i = 0; i < m_WeaponEffNum; i++ ) {
|
|
m_Player->AddWeaponEffect(m_WeaponEff[i].m_EffName,m_WeaponEff[i].m_EffNum);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
}
|
|
void CEffScript::PlayLning3(int index,int obj_index,float currentframe,D3DXVECTOR3 vecCharEff) {
|
|
int i,j;
|
|
CLightning *ptr = NULL;
|
|
|
|
if(!m_bLightn3 || (m_pLightn3 == NULL))
|
|
return;
|
|
////// Dummy pos Get
|
|
D3DXVECTOR3 vecDumyPos[2];
|
|
|
|
CZ3DObject *body = NULL;
|
|
D3DXVECTOR3 bodypos;
|
|
D3DXMATRIX matQuatRot;
|
|
D3DXMATRIX matResult;
|
|
D3DXMATRIX matTmp;
|
|
if(m_StartChr != NULL) {
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(!g_CharacterData.CheckCharacterListIn(m_StartChr)) // 캐릭터 없다면
|
|
{
|
|
if(m_pLightn3 != NULL) {
|
|
m_pLightn3->m_bEnd = true;
|
|
if(m_pLightn3->m_pLightn != NULL) {
|
|
for(i = 0;i < m_pLightn3->m_iMaxLine;i++) {
|
|
if(m_pLightn3->m_pLightn[i].m_Lightn != NULL) {
|
|
delete[] m_pLightn3->m_pLightn[i].m_Lightn;
|
|
m_pLightn3->m_pLightn[i].m_Lightn = NULL;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
// Pivot Info Get
|
|
for( i = 0; i < 2; i++ )
|
|
{
|
|
vecDumyPos[i] = m_StartPos;
|
|
|
|
body = m_StartChr->GetSkeletonPartObject(m_pLightn3->m_pEffChar[i].m_PivotName);
|
|
if(body != NULL)
|
|
{
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pLightn3->m_pEffChar[i].vecPos.x;
|
|
matTmp._42 = m_pLightn3->m_pEffChar[i].vecPos.y;
|
|
matTmp._43 = m_pLightn3->m_pEffChar[i].vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pLightn3->m_pEffChar[i].vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
|
|
vecDumyPos[i] = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
}
|
|
|
|
}
|
|
}
|
|
//////
|
|
if(!m_pLightn3->m_bStart) {
|
|
if((m_pLightn3->m_iStartEff == obj_index) && (m_pLightn3->m_iStartFrame <= (int)currentframe)) {
|
|
m_pLightn3->m_bStart = true;
|
|
m_pLightn3->m_StartTime = timeGetTime();
|
|
for(i = 0 ; i< m_pLightn3->m_iMaxLine; i++) {
|
|
for(j = 0;j < m_pLightn3->m_pLightn[i].m_LnNum;j++) {
|
|
ptr = &(m_pLightn3->m_pLightn[i].m_Lightn[j]);
|
|
// Blend Mode
|
|
m_pLightn3->m_pLightn[i].m_BlendMode = m_pLightn3->m_iBlend;
|
|
|
|
if(ptr != NULL) { // clight setting
|
|
ptr->SetDevice(m_Device);
|
|
ptr->CreateList(m_pLightn3->m_pLightn[i].m_LPointNum);
|
|
ptr->SetSize((rand() % (int)m_pLightn3->m_pLightn[i].m_PlaneSize) + 0.01f);
|
|
ptr->SetShakeValue(m_pLightn3->m_pLightn[i].m_ShakeMin,m_pLightn3->m_pLightn[i].m_ShakeMax);
|
|
|
|
ptr->SetStartPoint(vecDumyPos[0].x,vecDumyPos[0].y,vecDumyPos[0].z);
|
|
// endpos setting
|
|
|
|
ptr->SetEndPoint(vecDumyPos[1].x,vecDumyPos[1].y,vecDumyPos[1].z);
|
|
|
|
ptr->SetRandPoint();
|
|
ptr->SetPlaneValue(m_pLightn3->m_pLightn[i].m_PlaneValue);
|
|
|
|
ptr->CreateTexture(1);
|
|
ptr->SetTexture(0,m_pLightn3->m_pLightn[i].m_TexName);
|
|
ptr->SetVertNum(1);
|
|
ptr->SetColor(m_pLightn3->m_pLightn[i].m_Color);
|
|
ptr->CreateVertexBuffer();
|
|
ptr->SetUnitUv(m_pLightn3->m_pLightn[i].m_UnitUv);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}//if(!m_pLightn2->m_bStart) {
|
|
else { // 이미 lightning이 시작된 이후라면..
|
|
//중단 프레임에 도달 했을때 중단
|
|
if((m_pLightn3->m_iEndEff == obj_index) && (m_pLightn3->m_iEndFrame <= (int)currentframe)) {
|
|
m_pLightn3->m_bEnd = true;
|
|
for(i = 0;i < m_pLightn3->m_iMaxLine;i++) {
|
|
if(m_pLightn3->m_pLightn[i].m_Lightn != NULL) {
|
|
delete[] m_pLightn3->m_pLightn[i].m_Lightn;
|
|
m_pLightn3->m_pLightn[i].m_Lightn = NULL;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
else { //play (라이트닝 업데이트)
|
|
|
|
UpdateLning3(vecCharEff);
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::PlayLning2(int index,int obj_index,float currentframe,D3DXVECTOR3 vecCharEff) {
|
|
int i,j;
|
|
CLightning *ptr = NULL;
|
|
|
|
if(!m_bLightn2 || (m_pLightn2 == NULL))
|
|
return;
|
|
if(!m_pLightn2->m_bStart) {
|
|
if((m_pLightn2->m_iStartEff == obj_index) && (m_pLightn2->m_iStartFrame <= (int)currentframe)) {
|
|
m_pLightn2->m_bStart = true;
|
|
m_pLightn2->m_StartTime = timeGetTime();
|
|
for(i = 0 ; i< m_pLightn2->m_iMaxLine; i++) {
|
|
for(j = 0;j < m_pLightn2->m_pLightn[i].m_LnNum;j++) {
|
|
ptr = &(m_pLightn2->m_pLightn[i].m_Lightn[j]);
|
|
// Blend Mode
|
|
m_pLightn2->m_pLightn[i].m_BlendMode = m_pLightn2->m_iBlend;
|
|
|
|
if(ptr != NULL) { // clight setting
|
|
ptr->SetDevice(m_Device);
|
|
ptr->CreateList(m_pLightn2->m_pLightn[i].m_LPointNum);
|
|
ptr->SetSize((rand() % (int)m_pLightn2->m_pLightn[i].m_PlaneSize) + 0.01f);
|
|
ptr->SetShakeValue(m_pLightn2->m_pLightn[i].m_ShakeMin,m_pLightn2->m_pLightn[i].m_ShakeMax);
|
|
|
|
///
|
|
D3DXVECTOR3 tmprot;
|
|
D3DXVECTOR3 tmpfwd = m_ChrFwd;
|
|
|
|
tmpfwd *= 1000000.0f;
|
|
tmpfwd.y = 0.0f;
|
|
|
|
SetRot(m_StartPos,m_StartPos+tmpfwd,tmprot);
|
|
|
|
D3DXMATRIX tmp_rotm;
|
|
D3DXMATRIX tmp_unitm;
|
|
D3DXMATRIX tmp_roted;
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
tmp_unitm._41 = m_pLightn2->m_vecPos.x;
|
|
tmp_unitm._42 = m_pLightn2->m_vecPos.y;
|
|
tmp_unitm._43 = m_pLightn2->m_vecPos.z;
|
|
|
|
D3DXMatrixRotationYawPitchRoll(&tmp_rotm,tmprot.y,tmprot.x,tmprot.z);
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&tmp_rotm);
|
|
if(m_bEffCharacter) // Character Effect 경우
|
|
ptr->SetStartPoint(vecCharEff.x,vecCharEff.y,vecCharEff.z);
|
|
else
|
|
ptr->SetStartPoint(m_StartPos.x + tmp_roted._41,m_StartPos.y + tmp_roted._42,m_StartPos.z + tmp_roted._43);
|
|
// endpos setting
|
|
D3DXMATRIX matRot;
|
|
D3DXVECTOR3 tmp_end;
|
|
tmpfwd = m_ChrFwd;
|
|
D3DXVec3Normalize(&tmpfwd,&tmpfwd);
|
|
D3DXMatrixRotationYawPitchRoll(&matRot,D3DXToRadian( rand() % 360),
|
|
D3DXToRadian( rand() % 360),
|
|
D3DXToRadian( rand() % 360));
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
tmp_unitm._41 = tmpfwd.x;
|
|
tmp_unitm._42 = tmpfwd.y;
|
|
tmp_unitm._43 = tmpfwd.z;
|
|
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&matRot);
|
|
tmp_end = D3DXVECTOR3(tmp_roted._41,tmp_roted._42,tmp_roted._43);
|
|
D3DXVec3Normalize(&tmp_end,&tmp_end);
|
|
int tmpRange = m_pLightn2->m_fRange * 100.0f;
|
|
tmp_end *= ((rand() % tmpRange) / 100.0f + 0.01f);
|
|
tmp_end += (ptr->m_PointList[0]);
|
|
|
|
if( m_pLightn2->m_pLightn[i].m_RandSize > 0.0f) { // rand value setting
|
|
|
|
float rand_size = m_pLightn2->m_pLightn[i].m_RandSize;
|
|
D3DXVECTOR3 rand_value;
|
|
|
|
rand_value.x = (float)(rand() % (int)(rand_size * 1000.0f))/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.x *= -1.0f;
|
|
}
|
|
rand_value.y = (float)(rand() % (int)(rand_size * 1000.0f))/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.y *= -1.0f;
|
|
}
|
|
rand_value.z = (float)(rand() % (int)(rand_size * 1000.0f))/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.z *= -1.0f;
|
|
}
|
|
tmp_end += rand_value;
|
|
|
|
}
|
|
|
|
ptr->SetEndPoint(tmp_end.x,tmp_end.y,tmp_end.z);
|
|
|
|
ptr->SetRandPoint();
|
|
ptr->SetPlaneValue(m_pLightn2->m_pLightn[i].m_PlaneValue);
|
|
|
|
ptr->CreateTexture(1);
|
|
ptr->SetTexture(0,m_pLightn2->m_pLightn[i].m_TexName);
|
|
ptr->SetVertNum(1);
|
|
ptr->SetColor(m_pLightn2->m_pLightn[i].m_Color);
|
|
ptr->CreateVertexBuffer();
|
|
ptr->SetUnitUv(m_pLightn2->m_pLightn[i].m_UnitUv);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}//if(!m_pLightn2->m_bStart) {
|
|
else { // 이미 lightning이 시작된 이후라면..
|
|
//중단 프레임에 도달 했을때 중단
|
|
if((m_pLightn2->m_iEndEff == obj_index) && (m_pLightn2->m_iEndFrame <= (int)currentframe)) {
|
|
m_pLightn2->m_bEnd = true;
|
|
for(i = 0;i < m_pLightn2->m_iMaxLine;i++) {
|
|
if(m_pLightn2->m_pLightn[i].m_Lightn != NULL) {
|
|
delete[] m_pLightn2->m_pLightn[i].m_Lightn;
|
|
m_pLightn2->m_pLightn[i].m_Lightn = NULL;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
else { //play (라이트닝 업데이트)
|
|
|
|
UpdateLning2(vecCharEff);
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::PlayLning(int index,int obj_index,float currentframe,D3DXVECTOR3 vecCharEff) {
|
|
int i;
|
|
CLightning *ptr = NULL;
|
|
|
|
if(!(m_Lning[index].m_bLightnStart) && m_StartPosSet && (m_EndPosNum > 0)) { //lightning not start
|
|
if((m_Lning[index].m_StartEffIndex == obj_index) && (m_Lning[index].m_StartFrame <= (int)currentframe)) {
|
|
|
|
m_Lning[index].m_bLightnStart = true;
|
|
|
|
m_Lning[index].m_StartTime = timeGetTime();
|
|
|
|
for(i=0;i<m_Lning[index].m_LnNum;i++) {
|
|
ptr = &(m_Lning[index].m_Lightn[i]);
|
|
if(ptr != NULL) { // clight setting
|
|
ptr->SetDevice(m_Device);
|
|
ptr->CreateList(m_Lning[index].m_LPointNum);
|
|
ptr->SetSize(m_Lning[index].m_PlaneSize);
|
|
ptr->SetShakeValue(m_Lning[index].m_ShakeMin,m_Lning[index].m_ShakeMax);
|
|
///
|
|
D3DXVECTOR3 tmprot;
|
|
D3DXVECTOR3 tmpfwd = m_ChrFwd;
|
|
|
|
tmpfwd *= 1000000.0f;
|
|
tmpfwd.y = 0.0f;
|
|
|
|
SetRot(m_StartPos,m_StartPos+tmpfwd,tmprot);
|
|
|
|
D3DXMATRIX tmp_rotm;
|
|
D3DXMATRIX tmp_unitm;
|
|
D3DXMATRIX tmp_roted;
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
|
|
tmp_unitm._41 = m_Lning[index].m_Pos.x;
|
|
tmp_unitm._42 = m_Lning[index].m_Pos.y;
|
|
tmp_unitm._43 = m_Lning[index].m_Pos.z;
|
|
|
|
D3DXMatrixRotationYawPitchRoll(&tmp_rotm,tmprot.y,tmprot.x,tmprot.z);
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&tmp_rotm);
|
|
/*
|
|
m_Lning[index].m_Pos.x = tmp_roted._41;
|
|
//m_MidUnit.y = tmp_roted._42;
|
|
m_Lning[index].m_Pos.z = tmp_roted._43;
|
|
///
|
|
*/
|
|
if(m_bEffCharacter) //캐릭터 effect
|
|
ptr->SetStartPoint(vecCharEff.x,vecCharEff.y,vecCharEff.z);
|
|
else
|
|
ptr->SetStartPoint(m_StartPos.x + tmp_roted._41,m_StartPos.y + m_Lning[index].m_Pos.y,m_StartPos.z + tmp_roted._43);
|
|
// endpos setting
|
|
|
|
//target 의 chest 얻기
|
|
float tmp_Chest = 0.0f;
|
|
|
|
CZ3DObject *body;
|
|
if(m_EndChr != NULL) {
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(!g_CharacterData.CheckCharacterListIn(m_EndChr)) // 캐릭터 없다면
|
|
{
|
|
tmp_Chest = 100.0f;
|
|
}
|
|
else {
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
tmp_Chest = chest->_42; //무조건 chest 높이로 세팅
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
tmp_Chest = 150.0f;
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
tmp_Chest = chest->_42; //무조건 chest 높이로 세팅
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
tmp_Chest = 150.0f;
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
}
|
|
else {
|
|
tmp_Chest = 100.0f;
|
|
}
|
|
//
|
|
|
|
D3DXVECTOR3 tmp_end = D3DXVECTOR3(m_EndPos[0].x,m_EndPos[0].y + tmp_Chest,m_EndPos[0].z);
|
|
|
|
if(m_Lning[index].m_RandSize > 0.0f) { // rand value setting
|
|
|
|
float rand_size = m_Lning[index].m_RandSize;
|
|
D3DXVECTOR3 rand_value;
|
|
|
|
rand_value.x = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.x *= -1.0f;
|
|
}
|
|
rand_value.y = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.y *= -1.0f;
|
|
}
|
|
rand_value.z = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.z *= -1.0f;
|
|
}
|
|
tmp_end += rand_value;
|
|
|
|
}
|
|
ptr->SetEndPoint(tmp_end.x,tmp_end.y,tmp_end.z);
|
|
ptr->SetRandPoint();
|
|
ptr->SetPlaneValue(m_Lning[index].m_PlaneValue);
|
|
|
|
ptr->CreateTexture(1);
|
|
ptr->SetTexture(0,m_Lning[index].m_TexName);
|
|
ptr->SetVertNum(1);
|
|
ptr->SetColor(m_Lning[index].m_Color);
|
|
ptr->CreateVertexBuffer();
|
|
ptr->SetUnitUv(m_Lning[index].m_UnitUv);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
else { // 이미 lightning이 시작된 이후라면..
|
|
//중단 프레임에 도달 했을때 중단
|
|
if((m_Lning[index].m_EndEffIndex == obj_index) && (m_Lning[index].m_EndFrame <= (int)currentframe)) {
|
|
m_Lning[index].m_bLightnEnd = true;
|
|
if(m_Lning[index].m_Lightn != NULL) {
|
|
delete[] m_Lning[index].m_Lightn;
|
|
m_Lning[index].m_Lightn = NULL;
|
|
}
|
|
}
|
|
else { //play (라이트닝 업데이트)
|
|
UpdateLning(index,vecCharEff);
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::UpdateLning3(D3DXVECTOR3 vecCharEff) {
|
|
int i,j;
|
|
int iUpdateFrame = m_pLightn3->m_pLightn[0].m_UpdateFrame;
|
|
|
|
unsigned long tmp = timeGetTime();
|
|
////// Dummy pos Get
|
|
D3DXVECTOR3 vecDumyPos[2];
|
|
|
|
CZ3DObject *body = NULL;
|
|
D3DXVECTOR3 bodypos;
|
|
D3DXMATRIX matQuatRot;
|
|
D3DXMATRIX matResult;
|
|
D3DXMATRIX matTmp;
|
|
if(m_StartChr != NULL) {
|
|
|
|
// Pivot Info Get
|
|
for( i = 0; i < 2; i++ )
|
|
{
|
|
vecDumyPos[i] = m_StartPos;
|
|
|
|
body = m_StartChr->GetSkeletonPartObject(m_pLightn3->m_pEffChar[i].m_PivotName);
|
|
if(body != NULL)
|
|
{
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pLightn3->m_pEffChar[i].vecPos.x;
|
|
matTmp._42 = m_pLightn3->m_pEffChar[i].vecPos.y;
|
|
matTmp._43 = m_pLightn3->m_pEffChar[i].vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pLightn3->m_pEffChar[i].vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
|
|
vecDumyPos[i] = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
}
|
|
|
|
}
|
|
}
|
|
//////
|
|
|
|
if(1 || ((tmp - m_pLightn3->m_StartTime)/DEFAULTESTICK) >= iUpdateFrame) {
|
|
m_pLightn3->m_StartTime = tmp;
|
|
|
|
for(i=0;i<m_pLightn3->m_iMaxLine;i++) {
|
|
CEffLightn *pTmp = &(m_pLightn3->m_pLightn[i]);
|
|
for(j = 0;j < pTmp->m_LnNum;j++) {
|
|
if((pTmp->m_Lightn) != NULL) {
|
|
|
|
pTmp->m_Lightn[j].SetStartPoint(vecDumyPos[0].x,vecDumyPos[0].y,vecDumyPos[0].z);
|
|
|
|
pTmp->m_Lightn[j].SetEndPoint(vecDumyPos[1].x,vecDumyPos[1].y,vecDumyPos[1].z);
|
|
|
|
|
|
D3DXVECTOR3 dermi;
|
|
pTmp->m_Lightn[j].UpdateLightning(dermi,false);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::UpdateLning2(D3DXVECTOR3 vecCharEff) {
|
|
int i,j;
|
|
int iUpdateFrame = m_pLightn2->m_pLightn[0].m_UpdateFrame;
|
|
|
|
unsigned long tmp = timeGetTime();
|
|
if(1 || ((tmp - m_pLightn2->m_StartTime)/DEFAULTESTICK) >= iUpdateFrame) {
|
|
m_pLightn2->m_StartTime = tmp;
|
|
|
|
for(i=0;i<m_pLightn2->m_iMaxLine;i++) {
|
|
CEffLightn *pTmp = &(m_pLightn2->m_pLightn[i]);
|
|
for(j = 0;j < pTmp->m_LnNum;j++) {
|
|
if((pTmp->m_Lightn) != NULL) {
|
|
|
|
D3DXVECTOR3 tmp_end = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
// endpos setting
|
|
D3DXMATRIX matRot;
|
|
|
|
D3DXVECTOR3 tmpfwd;
|
|
D3DXMATRIX tmp_unitm;
|
|
D3DXMATRIX tmp_roted;
|
|
|
|
tmpfwd = m_ChrFwd;
|
|
D3DXVec3Normalize(&tmpfwd,&tmpfwd);
|
|
D3DXMatrixRotationYawPitchRoll(&matRot,D3DXToRadian( rand() % 360),
|
|
D3DXToRadian( rand() % 360),
|
|
D3DXToRadian( rand() % 360));
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
tmp_unitm._41 = tmpfwd.x;
|
|
tmp_unitm._42 = tmpfwd.y;
|
|
tmp_unitm._43 = tmpfwd.z;
|
|
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&matRot);
|
|
//스타트 위치 업데이트
|
|
if(m_bEffCharacter)
|
|
pTmp->m_Lightn[j].SetStartPoint(vecCharEff.x,vecCharEff.y,vecCharEff.z);
|
|
else
|
|
pTmp->m_Lightn[j].SetStartPoint(m_StartPos.x + tmp_roted._41,m_StartPos.y + tmp_roted._42,m_StartPos.z + tmp_roted._43);
|
|
|
|
tmp_end = D3DXVECTOR3(tmp_roted._41,tmp_roted._42,tmp_roted._43);
|
|
D3DXVec3Normalize(&tmp_end,&tmp_end);
|
|
int tmpRange = m_pLightn2->m_fRange * 100.0f;
|
|
tmp_end *= ((rand() % tmpRange) / 100.0f + 0.01f);
|
|
tmp_end += (pTmp->m_Lightn[j].m_PointList[0]);
|
|
|
|
if( m_pLightn2->m_pLightn[i].m_RandSize > 0.0f) { // rand value setting
|
|
|
|
float rand_size = m_pLightn2->m_pLightn[i].m_RandSize;
|
|
D3DXVECTOR3 rand_value;
|
|
|
|
rand_value.x = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.x *= -1.0f;
|
|
}
|
|
rand_value.y = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.y *= -1.0f;
|
|
}
|
|
rand_value.z = (float)(rand() % (int)(rand_size * 1000.0f) + 0.1f)/ 1000.0f;
|
|
if(rand() %2) {
|
|
rand_value.z *= -1.0f;
|
|
}
|
|
tmp_end += rand_value;
|
|
|
|
}
|
|
//tmp_end += pTmp->m_Lightn[j].m_PointList[(pTmp->m_Lightn[j].m_PointNum - 1)];
|
|
pTmp->m_Lightn[j].SetEndPoint(tmp_end.x,tmp_end.y,tmp_end.z);
|
|
|
|
|
|
D3DXVECTOR3 dermi;
|
|
pTmp->m_Lightn[j].UpdateLightning(dermi,false);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::UpdateLning(int index,D3DXVECTOR3 vecCharEff) {
|
|
int i;
|
|
unsigned long tmp = timeGetTime();
|
|
if(((tmp - m_Lning[index].m_StartFrame)/DEFAULTESTICK) >= m_Lning[index].m_UpdateFrame) {
|
|
m_Lning[index].m_StartFrame = tmp;
|
|
for(i=0;i<m_Lning[index].m_LnNum;i++) {
|
|
if(m_Lning[index].m_Lightn != NULL) {
|
|
|
|
if(m_Lning[index].m_Follow) { // user 이동시 따라오는 번개
|
|
/// 상대적 rot 적용
|
|
D3DXVECTOR3 tmprot;
|
|
D3DXVECTOR3 tmpfwd = m_ChrFwd;
|
|
|
|
tmpfwd *= 1000000.0f;
|
|
tmpfwd.y = 0.0f;
|
|
|
|
SetRot(m_StartPos,m_StartPos+tmpfwd,tmprot);
|
|
|
|
D3DXMATRIX tmp_rotm;
|
|
D3DXMATRIX tmp_unitm;
|
|
D3DXMATRIX tmp_roted;
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
|
|
tmp_unitm._41 = m_Lning[index].m_Pos.x;
|
|
tmp_unitm._42 = m_Lning[index].m_Pos.y;
|
|
tmp_unitm._43 = m_Lning[index].m_Pos.z;
|
|
|
|
D3DXMatrixRotationYawPitchRoll(&tmp_rotm,tmprot.y,tmprot.x,tmprot.z);
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&tmp_rotm);
|
|
/*
|
|
m_Lning[index].m_Pos.x = tmp_roted._41;
|
|
//m_MidUnit.y = tmp_roted._42;
|
|
m_Lning[index].m_Pos.z = tmp_roted._43;
|
|
///
|
|
*/
|
|
if(m_bEffCharacter)
|
|
m_Lning[index].m_Lightn[i].SetStartPoint(vecCharEff.x,vecCharEff.y,vecCharEff.z);
|
|
else
|
|
m_Lning[index].m_Lightn[i].SetStartPoint(m_StartPos.x + tmp_roted._41,m_StartPos.y + m_Lning[index].m_Pos.y,m_StartPos.z + tmp_roted._43);
|
|
}
|
|
//end point는 항상 따라간다
|
|
//target 의 chest 얻기
|
|
float tmp_Chest = 0.0f;
|
|
|
|
CZ3DObject *body;
|
|
if(m_EndChr != NULL) {
|
|
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(!g_CharacterData.CheckCharacterListIn(m_EndChr)) // 캐릭터 없다면
|
|
{
|
|
tmp_Chest = 100.0f;
|
|
}
|
|
else
|
|
{
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
tmp_Chest = chest->_42; //무조건 chest 높이로 세팅
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
tmp_Chest = 150.0f;
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
tmp_Chest = chest->_42; //무조건 chest 높이로 세팅
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
tmp_Chest = 150.0f;
|
|
tmp_Chest *= body_scale;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
}
|
|
else {
|
|
tmp_Chest = 100.0f;
|
|
}
|
|
//
|
|
m_Lning[index].m_Lightn[i].SetEndPoint(m_EndPos[0].x,m_EndPos[0].y + tmp_Chest,m_EndPos[0].z);
|
|
//update lightning
|
|
D3DXVECTOR3 dermi;
|
|
|
|
m_Lning[index].m_Lightn[i].UpdateLightning(dermi,false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//nx,ny,nz 는 다음mid 점의 예상좌표
|
|
void CEffScript::UpdateWheel(float x,float y,float z,float nx,float ny,float nz,int value) { //궤적 point update
|
|
int i;
|
|
if (value == 0) {
|
|
for(i=0;i<m_WheelNum;i++) {
|
|
|
|
// insert point
|
|
D3DXVECTOR3 pos = D3DXVECTOR3(x,y,z);
|
|
D3DXVECTOR3 npos = D3DXVECTOR3(nx,ny,nz);
|
|
//이번점이 들어갈 위치
|
|
int insert_pos = m_Wheel[i].m_WheelBody.m_InsertCount;
|
|
|
|
|
|
if(insert_pos == 0) { //List에 아무점도 없을때
|
|
m_Wheel[i].m_WheelBody.InsertEmptyPoint(x,y,z);
|
|
}
|
|
else { //List에 점이 들어있다면
|
|
|
|
D3DXVECTOR3 interpol = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
D3DXVECTOR3 bp1;
|
|
if(insert_pos == 1)
|
|
bp1 = m_Wheel[i].m_WheelBody.m_PointList[insert_pos-1];
|
|
else
|
|
bp1 = m_Wheel[i].m_WheelBody.m_PointList[insert_pos-2];
|
|
|
|
D3DXVECTOR3 bp2 = m_Wheel[i].m_WheelBody.m_PointList[insert_pos-1];
|
|
D3DXVECTOR3 np1 = pos;
|
|
D3DXVECTOR3 np2 = npos;
|
|
|
|
for(int j=0;j<20;j++) {
|
|
|
|
D3DXVec3CatmullRom(&interpol,
|
|
&bp1,
|
|
&bp2,
|
|
&np1,
|
|
&np2,
|
|
(float)(j+1)/20.0f);
|
|
m_Wheel[i].m_WheelBody.InsertEmptyPoint(interpol.x,interpol.y,interpol.z);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
m_Wheel[i].m_WheelBody.SetVertexBuffer(0,1);
|
|
}
|
|
}
|
|
else { //목적지 까지 도착했을때 라인 줄여주기
|
|
for(i=0;i<m_WheelNum;i++) {
|
|
CLightning *ptr = &(m_Wheel[i].m_WheelBody);
|
|
if(ptr != NULL) //end setting
|
|
ptr->SetEffectEnd(true,(int)m_Wheel[i].m_UnitUv);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEffScript::GetEffBezier(char *tok) { // Bezier Middle data load
|
|
char *token = NULL;
|
|
|
|
m_bBezierMid = true;
|
|
m_pBezierMid = new CEffBezier;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
strcpy(m_pBezierMid->m_strTexture,token); // Texture Name
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fUv = atof(token); // Unit Uv
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fPlaneSize = atof(token); // Plane Size
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fFadeOut = atof(token); // Unit Fade Out
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fIncreaseSpeed = atof(token); // 초기 속도(비율) ex> 0.1f
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fIncreaseAccel = atof(token); // 가속도(비율) ex> 0.04f
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_nBezierPoint = atoi(token); // 총 제어점 갯수
|
|
|
|
m_pBezierMid->m_nBezierPoint = 30; // 총 제어점 갯수
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fLimitLength = atof(token); // Limit Length
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_iEndSpeed = atoi(token); // 꼬리 속도
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_iEndAccel = atoi(token); // 꼬리 가속도
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_iUvMode = atoi(token); // Uv Mode (0 or 1)
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_iAxis = atoi(token);
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fBaseLength = atof(token); // 제어점 의 위치(비율)
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_pBezierMid->m_fBaseHeight = atof(token); // 제어점의 높이
|
|
|
|
}
|
|
void CEffScript::GetEffWeapon(char *tok) {
|
|
int i;
|
|
char *token = NULL;
|
|
m_WeaponEff = new CEffWeapon[m_WeaponEffNum];
|
|
m_bWeaponEff = true;
|
|
for( i=0; i < m_WeaponEffNum; i++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
// texture name
|
|
if(i != 0) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
token = strtok(buf," \n\t");
|
|
strcpy(m_WeaponEff[i].m_EffName,token);
|
|
}
|
|
else {
|
|
strcpy(m_WeaponEff[i].m_EffName,tok);
|
|
}
|
|
token = strtok(NULL," \n\t");
|
|
m_WeaponEff[i].m_EffNum = atoi(token);
|
|
|
|
}
|
|
}
|
|
void CEffScript::GetEffWheel(char *tok) {
|
|
int i;
|
|
char *token = NULL;
|
|
int index = ESEMPTY;
|
|
m_Wheel = new CEffWheel[m_WheelNum];
|
|
m_bWheel = true;
|
|
for(i=0;i<m_WheelNum;i++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
// texture name
|
|
if(i != 0) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
token = strtok(buf," \n\t");
|
|
strcpy(m_Wheel[i].m_TexName,token);
|
|
}
|
|
else {
|
|
strcpy(m_Wheel[i].m_TexName,tok);
|
|
}
|
|
//plane size
|
|
token = strtok(NULL," \n\t");
|
|
m_Wheel[i].m_PlaneSize = atof(token);
|
|
// point num
|
|
token = strtok(NULL," \n\t");
|
|
m_Wheel[i].m_PointNum = atoi(token);
|
|
// 줄어드는 라인 unit
|
|
token = strtok(NULL," \n\t");
|
|
m_Wheel[i].m_UnitUv = atof(token);
|
|
//blend mode
|
|
token = strtok(NULL," \n\t");
|
|
m_Wheel[i].m_BlendMode = atoi(token);
|
|
//plane value
|
|
token = strtok(NULL," \n\t");
|
|
m_Wheel[i].m_PlaneValue = atoi(token);
|
|
|
|
}
|
|
}
|
|
void CEffScript::GetBinLightn2() {
|
|
|
|
int i;
|
|
|
|
int iEndFrame = m_pLightn2->m_iEndFrame;
|
|
int iStartFrame = m_pLightn2->m_iStartFrame;
|
|
int iEndIndex = m_pLightn2->m_iEndEff;
|
|
int iStartIndex = m_pLightn2->m_iStartEff;
|
|
|
|
for(i=0;i< (m_pLightn2->m_iMaxLine); i++) {
|
|
|
|
//start eff setting
|
|
strcpy((m_pLightn2->m_pLightn[i].m_TexName),(m_pLightn2->m_pTextureName[i].m_strName));
|
|
m_pLightn2->m_pLightn[i].m_Lightn = new CLightning[1];
|
|
m_pLightn2->m_pLightn[i].m_EndEffIndex = iEndIndex;
|
|
m_pLightn2->m_pLightn[i].m_EndFrame = iEndFrame;
|
|
m_pLightn2->m_pLightn[i].m_StartEffIndex = iStartIndex;
|
|
m_pLightn2->m_pLightn[i].m_StartFrame = iStartFrame;
|
|
m_pLightn2->m_pLightn[i].m_Follow = true;
|
|
m_pLightn2->m_pLightn[i].m_LnNum = 1;
|
|
m_pLightn2->m_pLightn[i].m_LPointNum = 4;
|
|
// Plane Size
|
|
float fPlaneRange = m_pLightn2->m_fMaxSize - m_pLightn2->m_fMinSize;
|
|
int iPlaneRange = (int)(fPlaneRange * 10000.0f);
|
|
|
|
m_pLightn2->m_pLightn[i].m_PlaneSize = (rand() % iPlaneRange) / 10000.0f + m_pLightn2->m_fMinSize;
|
|
m_pLightn2->m_pLightn[i].m_PlaneValue = 0;
|
|
m_pLightn2->m_pLightn[i].m_RandSize = (rand() % 800) + 1;
|
|
m_pLightn2->m_pLightn[i].m_ShakeMax = 20.0f;
|
|
m_pLightn2->m_pLightn[i].m_ShakeMin = -20.0f;
|
|
// Blend
|
|
m_pLightn2->m_pLightn[i].m_BlendMode = (m_pLightn2->m_iBlend);
|
|
int iUnitUv = (m_pLightn2->m_fUvAniMax * 10000.0f);
|
|
if(iUnitUv > 0)
|
|
m_pLightn2->m_pLightn[i].m_UnitUv = (rand() % iUnitUv) / 10000.0f + 0.01f;
|
|
else
|
|
m_pLightn2->m_pLightn[i].m_UnitUv = 0.0f;
|
|
m_pLightn2->m_pLightn[i].m_UpdateFrame = 1;
|
|
|
|
}
|
|
}
|
|
void CEffScript::GetLightn3(char *tok)
|
|
{
|
|
|
|
int i;
|
|
if(tok == NULL)
|
|
return;
|
|
|
|
char *token = tok;
|
|
int index = ESEMPTY;
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
int iStartIndex = 0;
|
|
int iEndIndex = 0;
|
|
|
|
int iEndFrame = 0;
|
|
int iStartFrame = 0;
|
|
|
|
|
|
for(i=0;i < m_EffNum;i++) {
|
|
if(!(strcmp(token,m_EffList[i].m_EffName))) {
|
|
iStartIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
m_pLightn3->m_iStartEff = iStartIndex; // Start Index
|
|
token = strtok(NULL," \n\t");
|
|
m_pLightn3->m_iStartFrame = atoi(token); // Start Frame
|
|
token = strtok(NULL," \n\t");
|
|
|
|
for(i=0;i < m_EffNum;i++) {
|
|
if(!(strcmp(token,m_EffList[i].m_EffName))) {
|
|
iEndIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
m_pLightn3->m_iEndEff = iEndIndex; // End Index
|
|
token = strtok(NULL," \n\t");
|
|
m_pLightn3->m_iEndFrame = atoi(token); // End Frame
|
|
|
|
token = strtok(NULL," \n\t"); // 최소 사이즈
|
|
m_pLightn3->m_fMinSize = atof(token);
|
|
|
|
token = strtok(NULL," \n\t"); // 최대 사이즈
|
|
m_pLightn3->m_fMaxSize = atof(token);
|
|
|
|
|
|
iEndFrame = m_pLightn3->m_iEndFrame;
|
|
iStartFrame = m_pLightn3->m_iStartFrame;
|
|
iEndIndex = m_pLightn3->m_iEndEff;
|
|
iStartIndex = m_pLightn3->m_iStartEff;
|
|
|
|
for(i=0;i< (m_pLightn3->m_iMaxLine); i++) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
//start eff setting
|
|
token = strtok(buf," \n\t");
|
|
strcpy((m_pLightn3->m_pLightn[i].m_TexName),token);
|
|
strcpy((m_pLightn3->m_pTextureName[i].m_strName),token);
|
|
|
|
m_pLightn3->m_pLightn[i].m_Lightn = new CLightning[1];
|
|
m_pLightn3->m_pLightn[i].m_EndEffIndex = iEndIndex;
|
|
m_pLightn3->m_pLightn[i].m_EndFrame = iEndFrame;
|
|
m_pLightn3->m_pLightn[i].m_StartEffIndex = iStartIndex;
|
|
m_pLightn3->m_pLightn[i].m_StartFrame = iStartFrame;
|
|
m_pLightn3->m_pLightn[i].m_Follow = true;
|
|
m_pLightn3->m_pLightn[i].m_LnNum = 1;
|
|
m_pLightn3->m_pLightn[i].m_LPointNum = 4;
|
|
// Plane Size
|
|
float fPlaneRange = m_pLightn3->m_fMaxSize - m_pLightn3->m_fMinSize;
|
|
int iPlaneRange = (int)(fPlaneRange * 10000.0f);
|
|
m_pLightn3->m_pLightn[i].m_PlaneSize = (rand() % iPlaneRange) / 10000.0f + m_pLightn3->m_fMinSize;
|
|
|
|
m_pLightn3->m_pLightn[i].m_PlaneValue = 0;
|
|
m_pLightn3->m_pLightn[i].m_RandSize = (rand() % 800) + 1;
|
|
m_pLightn3->m_pLightn[i].m_ShakeMax = 20.0f;
|
|
m_pLightn3->m_pLightn[i].m_ShakeMin = -20.0f;
|
|
int iUnitUv = (m_pLightn3->m_fUvAniMax * 10000.0f);
|
|
if(iUnitUv > 0)
|
|
m_pLightn3->m_pLightn[i].m_UnitUv = (rand() % iUnitUv) / 10000.0f + 0.01f;
|
|
else
|
|
m_pLightn3->m_pLightn[i].m_UnitUv = 0.0f;
|
|
m_pLightn3->m_pLightn[i].m_UpdateFrame = 1;
|
|
|
|
}
|
|
// Character Effect Setting
|
|
for( i = 0; i < m_pLightn3->m_iEffChar; i++ ) {
|
|
CEffChar *pEffChar = &(m_pLightn3->m_pEffChar[i]);
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
// Pivot name get
|
|
token = strtok(buf," \n\t");
|
|
strcpy(pEffChar->m_PivotName,token);
|
|
// Pos
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecPos.x = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecPos.y = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecPos.z = atof(token);
|
|
// Quaternion
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecQuat.x = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecQuat.y = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecQuat.z = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
pEffChar->vecQuat.w = atof(token);
|
|
|
|
}
|
|
}
|
|
void CEffScript::GetLightn2(char *tok) {
|
|
int i;
|
|
if(tok == NULL)
|
|
return;
|
|
|
|
char *token = tok;
|
|
int index = ESEMPTY;
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
int iStartIndex = 0;
|
|
int iEndIndex = 0;
|
|
|
|
int iEndFrame = 0;
|
|
int iStartFrame = 0;
|
|
|
|
|
|
for(i=0;i < m_EffNum;i++) {
|
|
if(!(strcmp(token,m_EffList[i].m_EffName))) {
|
|
iStartIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
m_pLightn2->m_iStartEff = iStartIndex; // Start Index
|
|
token = strtok(NULL," \n\t");
|
|
m_pLightn2->m_iStartFrame = atoi(token); // Start Frame
|
|
token = strtok(NULL," \n\t");
|
|
|
|
for(i=0;i < m_EffNum;i++) {
|
|
if(!(strcmp(token,m_EffList[i].m_EffName))) {
|
|
iEndIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
m_pLightn2->m_iEndEff = iEndIndex; // End Index
|
|
token = strtok(NULL," \n\t");
|
|
m_pLightn2->m_iEndFrame = atoi(token); // End Frame
|
|
|
|
token = strtok(NULL," \n\t"); // 최소 사이즈
|
|
m_pLightn2->m_fMinSize = atof(token);
|
|
|
|
token = strtok(NULL," \n\t"); // 최대 사이즈
|
|
m_pLightn2->m_fMaxSize = atof(token);
|
|
|
|
|
|
iEndFrame = m_pLightn2->m_iEndFrame;
|
|
iStartFrame = m_pLightn2->m_iStartFrame;
|
|
iEndIndex = m_pLightn2->m_iEndEff;
|
|
iStartIndex = m_pLightn2->m_iStartEff;
|
|
|
|
for(i=0;i< (m_pLightn2->m_iMaxLine); i++) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
//start eff setting
|
|
token = strtok(buf," \n\t");
|
|
strcpy((m_pLightn2->m_pLightn[i].m_TexName),token);
|
|
strcpy((m_pLightn2->m_pTextureName[i].m_strName),token);
|
|
|
|
m_pLightn2->m_pLightn[i].m_Lightn = new CLightning[1];
|
|
m_pLightn2->m_pLightn[i].m_EndEffIndex = iEndIndex;
|
|
m_pLightn2->m_pLightn[i].m_EndFrame = iEndFrame;
|
|
m_pLightn2->m_pLightn[i].m_StartEffIndex = iStartIndex;
|
|
m_pLightn2->m_pLightn[i].m_StartFrame = iStartFrame;
|
|
m_pLightn2->m_pLightn[i].m_Follow = true;
|
|
m_pLightn2->m_pLightn[i].m_LnNum = 1;
|
|
m_pLightn2->m_pLightn[i].m_LPointNum = 4;
|
|
// Plane Size
|
|
float fPlaneRange = m_pLightn2->m_fMaxSize - m_pLightn2->m_fMinSize;
|
|
int iPlaneRange = (int)(fPlaneRange * 10000.0f);
|
|
m_pLightn2->m_pLightn[i].m_PlaneSize = (rand() % iPlaneRange) / 10000.0f + m_pLightn2->m_fMinSize;
|
|
|
|
m_pLightn2->m_pLightn[i].m_PlaneValue = 0;
|
|
m_pLightn2->m_pLightn[i].m_RandSize = (rand() % 800) + 1;
|
|
m_pLightn2->m_pLightn[i].m_ShakeMax = 20.0f;
|
|
m_pLightn2->m_pLightn[i].m_ShakeMin = -20.0f;
|
|
int iUnitUv = (m_pLightn2->m_fUvAniMax * 10000.0f);
|
|
if(iUnitUv > 0)
|
|
m_pLightn2->m_pLightn[i].m_UnitUv = (rand() % iUnitUv) / 10000.0f + 0.01f;
|
|
else
|
|
m_pLightn2->m_pLightn[i].m_UnitUv = 0.0f;
|
|
m_pLightn2->m_pLightn[i].m_UpdateFrame = 1;
|
|
|
|
}
|
|
|
|
}
|
|
void CEffScript::GetLightn(char *tok) {
|
|
int i,j;
|
|
char *token = NULL;
|
|
int index = ESEMPTY;
|
|
|
|
m_Lning = new CEffLightn[m_LningNum];
|
|
m_bLightning = true;
|
|
for(i=0;i<m_LningNum;i++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
if(i!=0) {
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
//start eff setting
|
|
token = strtok(buf," \n\t");
|
|
}
|
|
//texture name
|
|
token = strtok(NULL," \n\t");
|
|
strcpy(m_Lning[i].m_TexName,token);
|
|
//uv ani시 한번에 이동하는 단위
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_UnitUv = atof(token);
|
|
// 분기점 갯수
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_LPointNum = atoi(token);
|
|
// 번개 갯수
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_LnNum = atoi(token);
|
|
// pos.x :: 스킬쓴 캐릭 위치에서 상대적인 위치
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_Pos.x = atof(token);
|
|
//pos.y
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_Pos.y = atof(token);
|
|
//pos.z
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_Pos.z = atof(token);
|
|
// plane size
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_PlaneSize = atof(token);
|
|
//color
|
|
m_Lning[i].m_Color = D3DCOLOR_ARGB(255,255,255,255);
|
|
// shake value 최소값
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_ShakeMin = atof(token);
|
|
// shake value 최대값
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_ShakeMax = atof(token);
|
|
// 업데이트 주기(흔들림 속도)
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_UpdateFrame = atoi(token);
|
|
//캐릭 위치가 업데이트 되었을때 따라올것인지아닌지
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_Follow = (atoi(token) > 0)? true : false;
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
// blendmode
|
|
token = strtok(buf," \n\t");
|
|
m_Lning[i].m_BlendMode = atoi(token);
|
|
// random 폭 size
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_RandSize = atof(token);
|
|
// 십자 플랜인지 1자 플랜인지
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_PlaneValue = atoi(token);
|
|
//세번째 줄
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
//start eff setting
|
|
token = strtok(buf," \n\t");
|
|
|
|
for(j=0;j<m_EffNum;j++) {
|
|
if(!(strcmp(token,m_EffList[j].m_EffName))) {
|
|
index = j;
|
|
break;
|
|
}
|
|
}
|
|
m_Lning[i].m_StartEffIndex = index;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_StartFrame = atoi(token);
|
|
|
|
//end eff setting
|
|
token = strtok(NULL," \n\t");
|
|
|
|
for(j=0;j<m_EffNum;j++) {
|
|
if(!(strcmp(token,m_EffList[j].m_EffName))) {
|
|
index = j;
|
|
break;
|
|
}
|
|
}
|
|
m_Lning[i].m_EndEffIndex = index;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_Lning[i].m_EndFrame = atoi(token);
|
|
// lightning 객체 malloc
|
|
m_Lning[i].m_Lightn = new CLightning[m_Lning[i].m_LnNum];
|
|
}
|
|
|
|
}
|
|
void CEffScript ::GetSound(char *tok) {
|
|
char *token = NULL;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int sound_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_SoundNum = atoi(token);
|
|
sound_num = m_EffList[index].m_SoundNum;
|
|
|
|
if(sound_num > 0) {
|
|
m_EffList[index].m_Sound = new CEffSound[sound_num];
|
|
}
|
|
for(int j=0;j<sound_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_Sound[j].m_StartFrame = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
strcpy(m_EffList[index].m_Sound[j].m_Name,token);
|
|
token = strtok(NULL," \n\t");
|
|
if(token == NULL)
|
|
continue;
|
|
m_EffList[index].m_Sound[j].m_Min = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Sound[j].m_Max = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
if(token[0] == 'S')
|
|
m_EffList[index].m_Sound[j].m_Target = ES;
|
|
else if(token[0] == 'M')
|
|
m_EffList[index].m_Sound[j].m_Target = EM;
|
|
else if(token[0] == 'E')
|
|
m_EffList[index].m_Sound[j].m_Target = EE;
|
|
}
|
|
}
|
|
}
|
|
void CEffScript ::GetHit(char *tok) {
|
|
char *token = NULL;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int hit_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_HitFrameNum = atoi(token);
|
|
hit_num = m_EffList[index].m_HitFrameNum;
|
|
|
|
if(hit_num > 0) {
|
|
m_EffList[index].m_HitFrame = new int[hit_num];
|
|
}
|
|
for(int j=0;j<hit_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_HitFrame[j] = atoi(token);
|
|
}
|
|
}
|
|
}
|
|
void CEffScript ::GetFadeOut(char *tok) {
|
|
char *token = NULL;
|
|
m_FadeOut[0] = atof(tok);
|
|
token = strtok(NULL," \n\t");
|
|
m_FadeOut[1] = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_FadeOut[2] = atof(token);
|
|
|
|
}
|
|
void CEffScript ::GetCLight(char *tok) {
|
|
|
|
char *token;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int clight_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightNum = atoi(token);
|
|
clight_num = m_EffList[index].m_CLightNum;
|
|
|
|
if(clight_num > 0) {
|
|
m_EffList[index].m_CLightColor = new color[clight_num];
|
|
m_EffList[index].m_CLightDistance = new float[clight_num];
|
|
m_EffList[index].m_CLightStart = new int[clight_num];
|
|
m_EffList[index].m_CLightSwitch = new bool[clight_num];
|
|
m_EffList[index].m_CLightTime = new DWORD[clight_num];
|
|
m_EffList[index].m_CLightTarget = new int[clight_num];
|
|
|
|
|
|
}
|
|
for(int j=0;j<clight_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_CLightStart[j] = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightColor[j].r = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightColor[j].g = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightColor[j].b = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightColor[j].a = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightDistance[j] = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_CLightTime[j] = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
if(token[0] == 'S')
|
|
m_EffList[index].m_CLightTarget[j] = ESS;
|
|
else if(token[0] == 'E')
|
|
m_EffList[index].m_CLightTarget[j] = ESE;
|
|
|
|
m_EffList[index].m_CLightSwitch[j] = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
void CEffScript::GetExt5ex(char *tok) {
|
|
char *token;
|
|
|
|
m_bExt5ex = true;
|
|
m_bExt5 = true;
|
|
m_Ext5Value = new CEffExt5;
|
|
strcpy(m_Ext5Value->m_TextureName,tok);
|
|
token = strtok(NULL," \n\t");
|
|
m_Ext5Value->m_LineSize = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_Ext5Value->m_Rand = (atoi(token) > 0) ? true : false;
|
|
|
|
}
|
|
|
|
void CEffScript ::GetFadeIn(char *tok) {
|
|
char *token;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int fade_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeInNum = atoi(token);
|
|
fade_num = m_EffList[index].m_FadeInNum;
|
|
|
|
if((m_EffList[index].m_FadeInNum) > 0) {
|
|
m_EffList[index].m_FadeColor = new color[fade_num];
|
|
m_EffList[index].m_FadeInStart = new int[fade_num];
|
|
m_EffList[index].m_FadeIn = new D3DXVECTOR3[fade_num];
|
|
m_EffList[index].m_FadeInSwitch = new bool[fade_num];
|
|
}
|
|
for(int j=0;j<fade_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_FadeInStart[j] = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeIn[j].x = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeIn[j].y = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeIn[j].z = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeColor[j].r = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeColor[j].g = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_FadeColor[j].b = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
if(token) {
|
|
m_EffList[index].m_FadeColor[j].a = atoi(token);
|
|
}
|
|
m_EffList[index].m_FadeInSwitch[j] = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEffScript::SetInterfaceSet(bool b) {
|
|
int i;
|
|
|
|
m_bInterfaceSet = b;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetInterfaceSet(b);
|
|
}
|
|
}
|
|
void CEffScript::SetStartPos(float x,float y,float z) {
|
|
if(m_bPosSet) {
|
|
if(m_bExt7) { // extension7 일때 SetStartPos 할시 end pos setting
|
|
int i;
|
|
int index;
|
|
m_EndPosNum = 1;
|
|
if(m_EndPos) {
|
|
|
|
delete[] m_EndPos;
|
|
m_EndPos = NULL;
|
|
}
|
|
m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
m_EndPos[0].x = x;
|
|
m_EndPos[0].y = y;
|
|
m_EndPos[0].z = z;
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_EndEffIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
tmp_pos.x = m_EndPos[0].x + (m_EffPlayData.m_EndPos[0]* m_MulPos);
|
|
tmp_pos.y = m_EndPos[0].y + (m_EffPlayData.m_EndPos[1]* m_MulPos);
|
|
tmp_pos.z = m_EndPos[0].z + (m_EffPlayData.m_EndPos[2]* m_MulPos);
|
|
|
|
index = m_EffPlayData.m_EndEffId[i];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
// effect 시작
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetEndPos(m_EndPos[0].x,m_EndPos[0].y,m_EndPos[0].z);
|
|
}
|
|
}
|
|
else { // 기본 start pos settting
|
|
int i;
|
|
int index;
|
|
m_StartPosSet = true;
|
|
m_StartPos.x = x;
|
|
m_StartPos.y = y;
|
|
m_StartPos.z = z;
|
|
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_StartIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
|
|
index = m_EffPlayData.m_StartId[i];
|
|
|
|
tmp_pos = m_StartPos;
|
|
tmp_pos.x += (m_EffList[index].m_StartPos[0]* m_MulPos);
|
|
tmp_pos.y += (m_EffList[index].m_StartPos[1]* m_MulPos);
|
|
tmp_pos.z += (m_EffList[index].m_StartPos[2]* m_MulPos);
|
|
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
|
|
}
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetStartPos(m_StartPos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::SetScriptValue(int n) {
|
|
int i;
|
|
m_ScriptValue = n;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetScriptValue(n);
|
|
}
|
|
}
|
|
void CEffScript::SetStartPos(D3DXVECTOR3 start) {
|
|
if(m_bPosSet) {
|
|
if(m_bExt7) {// extension7 일때 SetStartPos 할시 end pos setting
|
|
int i;
|
|
int index;
|
|
m_EndPosNum = 1;
|
|
if(m_EndPos) {
|
|
|
|
delete[] m_EndPos;
|
|
m_EndPos = NULL;
|
|
}
|
|
m_EndPos = new D3DXVECTOR3[m_EndPosNum];
|
|
m_EndPos[0].x = start.x;
|
|
m_EndPos[0].y = start.y;
|
|
m_EndPos[0].z = start.z;
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_EndEffIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
tmp_pos.x = m_EndPos[0].x + (m_EffPlayData.m_EndPos[0]* m_MulPos);
|
|
tmp_pos.y = m_EndPos[0].y + (m_EffPlayData.m_EndPos[1]* m_MulPos);
|
|
tmp_pos.z = m_EndPos[0].z + (m_EffPlayData.m_EndPos[2]* m_MulPos);
|
|
|
|
index = m_EffPlayData.m_EndEffId[i];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
// effect 시작
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetEndPos(m_EndPos[0].x,m_EndPos[0].y,m_EndPos[0].z);
|
|
}
|
|
}
|
|
else { // 기본 startpos setting
|
|
int i;
|
|
int index;
|
|
m_StartPos = start;
|
|
m_StartPosSet = true;
|
|
if(m_lstEff.size()) {
|
|
for(i=0;i<m_EffPlayData.m_StartIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
|
|
index = m_EffPlayData.m_StartId[i];
|
|
|
|
tmp_pos = m_StartPos;
|
|
tmp_pos.x += (m_EffList[index].m_StartPos[0]* m_MulPos);
|
|
tmp_pos.y += (m_EffList[index].m_StartPos[1]* m_MulPos);
|
|
tmp_pos.z += (m_EffList[index].m_StartPos[2]* m_MulPos);
|
|
|
|
if(m_lstEff[index] != NULL) {
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetStartPos(m_StartPos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
D3DXQUATERNION CEffScript::GetExt4Quat() {
|
|
if(m_bExt4InfoSet)
|
|
return m_Ext4Quat;
|
|
else {
|
|
for(int i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript[i].m_bExt4InfoSet)
|
|
return m_SubScript[i].GetExt4Quat();
|
|
}
|
|
}
|
|
return m_Ext4Quat;
|
|
|
|
}
|
|
void CEffScript::GetCameraShake(char *tok) {
|
|
|
|
char *token;
|
|
int i;
|
|
int index = ESEMPTY;
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
if(!(strcmp(tok,m_EffList[i].m_EffName))) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
if(index != ESEMPTY) {
|
|
int shake_num = 0;
|
|
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[i].m_ShakeNum = atoi(token);
|
|
shake_num = m_EffList[i].m_ShakeNum;
|
|
|
|
if(shake_num > 0)
|
|
m_EffList[i].m_Shake = new CEffShake[shake_num];
|
|
|
|
for(int j=0;j<shake_num;j++) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
|
|
memset(buf,0,sizeof(char) * ESBUF_SIZE);
|
|
fgets(buf,sizeof(char) * ESBUF_SIZE,m_ScriptFile);
|
|
|
|
token = strtok(buf," \n\t");
|
|
m_EffList[index].m_Shake[j].m_StartTime = atoi(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Shake[j].m_ShakeTime = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Shake[j].m_length[0] = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Shake[j].m_length[1] = atof(token);
|
|
token = strtok(NULL," \n\t");
|
|
m_EffList[index].m_Shake[j].m_length[2] = atof(token);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void CEffScript::PlayEffSound(int index,int j,float x,float y,float z,float mind,float maxd) {
|
|
|
|
static bool bEnable = true;
|
|
|
|
if( !bEnable )
|
|
return;
|
|
|
|
char buf[ESBUF_SIZE] = {0};
|
|
int sindex = ESEMPTY;
|
|
try
|
|
{
|
|
CSoundManager &smanager = CSoundManager::GetInstance();
|
|
sprintf(buf,"%s%s",EFFECTSOUNDMPATH,m_EffList[index].m_Sound[j].m_Name);
|
|
ISoundObject & sbuffer = smanager.GetBuffer(buf,true,false,30);
|
|
if((m_EffList[index].m_Sound[j].m_Name[0] == 'L')&&(m_EffList[index].m_Sound[j].m_Name[1] == '_')) {
|
|
//looping sound
|
|
sindex = sbuffer.Play(true);
|
|
}
|
|
else
|
|
sindex = sbuffer.Play(false);
|
|
sbuffer.SetPosition(sindex,x,y,z);
|
|
if(!m_Mine) { // 다른 사람이 쓴 스킬
|
|
float oppmind = mind / 2.0f;
|
|
sbuffer.SetDistance(sindex,oppmind,maxd);
|
|
}
|
|
else { // 내가 쓴 스킬
|
|
float oppmind = mind * 1.5f;
|
|
float oppmaxd = maxd * 1.5f;
|
|
|
|
sbuffer.SetDistance(sindex,oppmind,oppmaxd);
|
|
}
|
|
}
|
|
catch( std::exception & e )
|
|
{
|
|
MessageBox( NULL, e.what(), " ", MB_OK );
|
|
bEnable = false;
|
|
}
|
|
}
|
|
void CEffScript::PlaySlide(int index,int j) { // 캐릭터를 뒤로 미끌리는 효과
|
|
if(m_EffList[index].m_Ext6Value[j].m_SlideLength != 0.0f) {
|
|
if(m_Player != NULL) {
|
|
#ifndef __EFF_WCREATOR__
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
// SetPlayer로 지정된 CCreature *에 슬라이드 value setting
|
|
// slide 에 관한 직접적 처리는 CCreature class에서 일어난다
|
|
m_Player->SetSlideValue(m_EffList[index].m_Ext6Value[j]);
|
|
}
|
|
}
|
|
#else
|
|
// SetPlayer로 지정된 CCreature *에 슬라이드 value setting
|
|
// slide 에 관한 직접적 처리는 CCreature class에서 일어난다
|
|
m_Player->SetSlideValue(m_EffList[index].m_Ext6Value[j]);
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::PlaySnap(int index,int j) { // snap effect
|
|
|
|
if(m_Player != NULL) {
|
|
|
|
bool tmp = ((m_EffList[index].m_Snap[j].m_Loop) > 0) ? true : false;
|
|
|
|
#ifndef __EFF_WCREATOR__
|
|
if(g_CharacterData.GetIsExistChar(m_PlayerID)) {
|
|
if(g_CharacterData.GetCreature(m_PlayerID) == m_Player) {
|
|
// SetPlayer로 지정된 CCreature *에 슬라이드 value setting
|
|
// SnapEffect는 CCreature에 effect 붙이는 명령 실행시킨다
|
|
m_Player->AddBodyEffect((m_EffList[index].m_Snap[j].m_EffName),(m_EffList[index].m_Snap[j].m_PivotName),tmp);
|
|
}
|
|
}
|
|
#else
|
|
// SetPlayer로 지정된 CCreature *에 슬라이드 value setting
|
|
// SnapEffect는 CCreature에 effect 붙이는 명령 실행시킨다
|
|
|
|
m_Player->AddBodyEffect((m_EffList[index].m_Snap[j].m_EffName),(m_EffList[index].m_Snap[j].m_PivotName),tmp);
|
|
#endif
|
|
}
|
|
}
|
|
void CEffScript::PlayEffSound(int index,int j) {
|
|
char buf[ESBUF_SIZE] = {0};
|
|
int sindex = ESEMPTY;
|
|
try
|
|
{
|
|
CSoundManager &smanager = CSoundManager::GetInstance();
|
|
sprintf(buf,"%s%s",EFFECTSOUNDMPATH,m_EffList[index].m_Sound[j].m_Name);
|
|
|
|
ISoundObject & sbuffer = smanager.GetBuffer(buf,false);
|
|
if((m_EffList[index].m_Sound[j].m_Name[0] == 'L')&&(m_EffList[index].m_Sound[j].m_Name[1] == '_')) {
|
|
// looping sound
|
|
sindex = sbuffer.Play(true);
|
|
}
|
|
else
|
|
sindex = sbuffer.Play(false);
|
|
|
|
}
|
|
catch( std::exception & e )
|
|
{
|
|
MessageBox( NULL, e.what(), " ", MB_OK );
|
|
}
|
|
}
|
|
void CEffScript::StopEffSound(int index,int j,float x,float y,float z,float mind,float maxd) {
|
|
|
|
if(strstr(m_EffList[index].m_Sound[j].m_Name,"L_chage.wav") != NULL) {
|
|
//casting effect 종료시 루핑을 돌던 sound 파일과 새 effect의 사운드 파일 재생의
|
|
//빈 공간을 채워 주는 sound play
|
|
char buf[ESBUF_SIZE] = {0};
|
|
int sindex = ESEMPTY;
|
|
|
|
CSoundManager &smanager = CSoundManager::GetInstance();
|
|
|
|
sprintf(buf,"%s%s",EFFECTSOUNDMPATH,m_EffList[index].m_Sound[j].m_Name);
|
|
ISoundObject & sbuffer = smanager.GetBuffer(buf,false);
|
|
// looping sound
|
|
sbuffer.StopAll();
|
|
////
|
|
// fade out sound (부드럽게 넘어가기 위해서)
|
|
|
|
sprintf(buf,"%s%s",EFFECTSOUNDMPATH,"ch.wav");
|
|
try
|
|
{
|
|
ISoundObject & sfadeoutbuffer = smanager.GetBuffer(buf,false);
|
|
|
|
sindex = sfadeoutbuffer.Play(false);
|
|
|
|
sfadeoutbuffer.SetPosition(sindex,x,y,z);
|
|
sfadeoutbuffer.SetDistance(sindex,mind,maxd);
|
|
}
|
|
catch( std::exception & e )
|
|
{
|
|
MessageBox( NULL, e.what(), " ", MB_OK );
|
|
}
|
|
|
|
////
|
|
|
|
}
|
|
else if((strstr(m_EffList[index].m_Sound[j].m_Name,"archargeo2.wav") != NULL) || (strstr(m_EffList[index].m_Sound[j].m_Name,"TPR12.wav") != NULL)) {
|
|
// aimed shot sound kill
|
|
// turnpunch ready sound kill
|
|
char buf[ESBUF_SIZE] = {0};
|
|
int sindex = ESEMPTY;
|
|
|
|
CSoundManager &smanager = CSoundManager::GetInstance();
|
|
|
|
sprintf(buf,"%s%s",EFFECTSOUNDMPATH,m_EffList[index].m_Sound[j].m_Name);
|
|
ISoundObject & sbuffer = smanager.GetBuffer(buf,false);
|
|
// looping sound
|
|
sbuffer.StopAll();
|
|
////
|
|
}
|
|
|
|
}
|
|
void CEffScript::PlayFadeIn(int index,int i) {
|
|
|
|
if(m_EffList[index].m_FadeInSwitch[i] == false) {
|
|
CCameraControl::SetFadeIn(m_EffList[index].m_FadeIn[i].x,m_EffList[index].m_FadeIn[i].y,m_EffList[index].m_FadeIn[i].z,m_EffList[index].m_FadeColor[i]);
|
|
m_EffList[index].m_FadeInSwitch[i] = true;
|
|
}
|
|
}
|
|
void CEffScript::PlayCLight(int index,int i) {
|
|
if(m_EffList[index].m_CLightSwitch[i] == false) {
|
|
if(m_EffList[index].m_CLightTarget[i] == ESS) {
|
|
vector3 pos;
|
|
DWORD lightcolor;
|
|
lightcolor = D3DCOLOR_ARGB(m_EffList[index].m_CLightColor[i].a,
|
|
m_EffList[index].m_CLightColor[i].r,
|
|
m_EffList[index].m_CLightColor[i].g,
|
|
m_EffList[index].m_CLightColor[i].b);
|
|
|
|
pos.x = m_StartPos.x;// + 198.5f;
|
|
pos.y = m_StartPos.y + 10.0f;// + 350.0f;
|
|
pos.z = m_StartPos.z;// + 185.0f;
|
|
if(m_StartChr != NULL) {
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(g_CharacterData.CheckCharacterListIn(m_StartChr)) // 캐릭터 없다면
|
|
{
|
|
CSceneManager::AddChrLight(m_StartChr,pos,lightcolor,m_EffList[index].m_CLightDistance[i],m_EffList[index].m_CLightTime[i]);
|
|
}
|
|
#else
|
|
CSceneManager::AddChrLight(m_StartChr,pos,lightcolor,m_EffList[index].m_CLightDistance[i],m_EffList[index].m_CLightTime[i]);
|
|
#endif
|
|
|
|
}
|
|
}
|
|
else if(m_EffList[index].m_CLightTarget[i] == ESE) {
|
|
vector3 pos;
|
|
DWORD lightcolor;
|
|
lightcolor = D3DCOLOR_ARGB(m_EffList[index].m_CLightColor[i].a,
|
|
m_EffList[index].m_CLightColor[i].r,
|
|
m_EffList[index].m_CLightColor[i].g,
|
|
m_EffList[index].m_CLightColor[i].b);
|
|
|
|
|
|
pos.x = m_EndPos[0].x; //+ 198.5f;
|
|
pos.y = m_EndPos[0].y + 10.0f;
|
|
pos.z = m_EndPos[0].z; //+ 185.0f;
|
|
|
|
CSceneManager::AddChrLight(m_EndChr,pos,lightcolor,m_EffList[index].m_CLightDistance[i],m_EffList[index].m_CLightTime[i]);
|
|
|
|
}
|
|
m_EffList[index].m_CLightSwitch[i] = true;
|
|
}
|
|
}
|
|
// Bezier Middle 의 초기 정보 세팅
|
|
void CEffScript::SetInitBezier(float startx,float starty,float startz,float endx,float endy,float endz) {
|
|
|
|
CLightning *ptr = NULL;
|
|
|
|
D3DXVECTOR3 tmp_length = D3DXVECTOR3(endx - startx,endy - starty,endz - startz);
|
|
float length = D3DXVec3Length(&tmp_length);
|
|
|
|
// 시작점과 끝점 사이에 거리 세팅
|
|
m_pBezierMid->m_fStartEndLength = length;
|
|
ptr = new CLightning;
|
|
|
|
m_pBezierMid->m_pBezierLine = ptr;
|
|
ptr->SetLightningValue(LV_BEZIER);
|
|
ptr->SetDevice(m_Device);
|
|
ptr->CreateList(m_pBezierMid->m_nBezierPoint);
|
|
|
|
ptr->SetSize(m_pBezierMid->m_fPlaneSize);
|
|
|
|
ptr->SetStartPoint(startx,starty,startz);
|
|
ptr->SetEndPoint(endx,endy,endz);
|
|
|
|
ptr->CreateTexture(1);
|
|
ptr->SetTexture(0,m_pBezierMid->m_strTexture);
|
|
ptr->SetVertNum(1);
|
|
ptr->SetColor(D3DCOLOR_ARGB(255,255,255,255));
|
|
ptr->SetUnitUv(m_pBezierMid->m_fUv);
|
|
ptr->SetPlaneValue(LPLANE_CROSS);
|
|
ptr->CreateVertexBuffer();
|
|
|
|
ptr->SetBezierControl(m_pBezierMid->m_fBaseLength,m_pBezierMid->m_fBaseHeight,
|
|
m_pBezierMid->m_fIncreaseSpeed,m_pBezierMid->m_fIncreaseAccel,
|
|
m_pBezierMid->m_fStartEndLength,m_pBezierMid->m_fFadeOut,m_pBezierMid->m_fLimitLength,
|
|
m_pBezierMid->m_iAxis,m_pBezierMid->m_iEndSpeed,m_pBezierMid->m_iEndAccel,m_pBezierMid->m_iUvMode);
|
|
|
|
// 충돌 후에 구조적으로 궤적라이트닝을 독립 시킨다..?
|
|
//CSceneManager::m_EffectManager.AddLightning(ptr);
|
|
|
|
m_bBezierMidSet = true;
|
|
|
|
|
|
}
|
|
|
|
int CEffScript::ProcessEffect() { // 이 스크립트의 처리가 끝나면 0 return
|
|
// 0 return 하면 script list에서 해제
|
|
// 수행 도중은 1 return
|
|
// S - M - E 구조에서 M ~ E 사이의 충돌 순간 2 return
|
|
|
|
// end pos 사용되는 것은 end pos가 세팅이 안되어 있을시 0을 리턴
|
|
// load 한 스크립트 data 에 따라 effect 구동 및 발생 제어
|
|
int i,j;
|
|
int index = 0;
|
|
bool hit_return = false;
|
|
|
|
bool crash = false;
|
|
|
|
D3DXVECTOR3 g_vecCharEff = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
// bool wend = false;
|
|
// static int DelayTick = 0.0f;
|
|
// static bool DelayStart = false;
|
|
// static int DelayFrame = 0;
|
|
// static int del_count = 0;
|
|
|
|
|
|
if(!(m_FileLoad))
|
|
return 0;
|
|
|
|
if(m_SubScriptNum > 0 ) {
|
|
|
|
if(!m_SubFirstLoad) { // sub effect 미리 로딩 해 놓는 부분
|
|
for(int sl = 0;sl <m_SubScriptNum;sl++) {
|
|
m_SubScript[sl].m_bVisibility = m_bVisibility;
|
|
m_SubScript[sl].ProcessEffect(); // sub script effect 들 로딩순간
|
|
}
|
|
m_SubFirstLoad = true;
|
|
}
|
|
|
|
int subcount = 0;
|
|
bool subcrash = false;
|
|
int subreturn = 0;
|
|
|
|
if(!DelayStart) {
|
|
m_dwTick = timeGetTime();
|
|
DelayTick = m_dwTick;
|
|
DelayStart = true;
|
|
}
|
|
else
|
|
m_dwTick = timeGetTime();
|
|
|
|
if( (m_dwTick-DelayTick) >= DEFAULTESTICK) {//m_TickFrame) {
|
|
DelayFrame +=((int)(m_dwTick-DelayTick)/ DEFAULTESTICK);
|
|
DelayTick = m_dwTick;
|
|
}
|
|
if(m_CurrentSubScript < m_SubScriptNum) {
|
|
if(DelayFrame >= m_NextScript[m_CurrentSubScript]) {
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
DelayTick = 0.0f;
|
|
m_CurrentSubScript++;
|
|
}
|
|
}
|
|
else {
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
DelayTick = 0.0f;
|
|
}
|
|
if(m_CurrentSubScript > m_SubScriptNum)
|
|
m_CurrentSubScript = m_SubScriptNum;
|
|
|
|
for(i=0;i<m_CurrentSubScript;i++) {
|
|
if(!(subreturn = m_SubScript[i].ProcessEffect())) {
|
|
subcount++;
|
|
}
|
|
if(subreturn == 2) {
|
|
// sub quaternion setting
|
|
if(m_SubScript != NULL)
|
|
m_Ext4Quat = m_SubScript[i].m_Ext4Quat;
|
|
subcrash = true;
|
|
|
|
}
|
|
}
|
|
if(subcount == m_SubScriptNum) {
|
|
m_CheckCrash = false;
|
|
DelayTick = 0.0f;
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
|
|
return 0;
|
|
}
|
|
else if(subcrash) {
|
|
|
|
subcrash = false;
|
|
DelayTick = 0.0f;
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
|
|
m_CheckCrash = true;
|
|
return 2;
|
|
}
|
|
|
|
}
|
|
else {
|
|
//script 가 처음 수행되었을때 eff load
|
|
if(m_ProcCount == ESEMPTY) {
|
|
if(!m_lstEff.size()) {
|
|
PushEff();
|
|
|
|
if(m_bWeaponEff) { //무기에 붙는 이팩트 가 있을경우
|
|
PlayWeaponEff();
|
|
}
|
|
if(m_bEffWeaponLine) { // 검기 세팅
|
|
PlayWeaponLine();
|
|
}
|
|
m_ProcCount = ED;
|
|
|
|
|
|
|
|
}
|
|
m_CheckCrash = false;
|
|
return 1;
|
|
}
|
|
else if(m_ProcCount >=ED && m_ProcCount <=EF){
|
|
|
|
// 시작 했으면..
|
|
switch(m_ProcCount) {
|
|
|
|
case ED: //delay frame
|
|
if(!DelayStart) {
|
|
m_dwTick = timeGetTime();
|
|
DelayTick = m_dwTick;
|
|
DelayStart = true;
|
|
}
|
|
else
|
|
m_dwTick = timeGetTime();
|
|
|
|
if( m_dwTick-DelayTick >= DEFAULTESTICK) {//m_TickFrame) {
|
|
DelayFrame +=((int)(m_dwTick-DelayTick)/DEFAULTESTICK);
|
|
DelayTick = m_dwTick;
|
|
}
|
|
if(DelayFrame >= m_DelayFrame) {
|
|
DelayStart = false;
|
|
DelayFrame = 0;
|
|
m_ProcCount = ES;
|
|
}
|
|
|
|
break;
|
|
|
|
case ES: // S와 N effect 발생
|
|
|
|
|
|
|
|
// fade out
|
|
if(m_bVisibility) {
|
|
if(m_FadeOut[0] != ESEMPTY) {
|
|
if(m_Mine) {
|
|
if(!m_FadeOutStart) {
|
|
float fTime = CSceneManager::GetWeatherTime();
|
|
if(( fTime < 16.0f) && (fTime > 9.0f))
|
|
CCameraControl::SetFadeOut(m_FadeOut[0],m_FadeOut[1],m_FadeOut[2]);
|
|
m_FadeOutStart = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i=0;i<m_EffPlayData.m_StartIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
|
|
index = m_EffPlayData.m_StartId[i];
|
|
// effect 시작
|
|
|
|
m_lstEff[index]->SetAxis(0.0f,0.0f,0.0f);
|
|
tmp_pos = m_StartPos;
|
|
tmp_pos.x += (m_EffList[index].m_StartPos[0]* m_MulPos);
|
|
tmp_pos.y += (m_EffList[index].m_StartPos[1]* m_MulPos);
|
|
tmp_pos.z += (m_EffList[index].m_StartPos[2]* m_MulPos);
|
|
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
m_lstEff[index]->SetTick(timeGetTime());
|
|
m_lstEff[index]->SetEffectStart(true);
|
|
m_lstEff[index]->SetLoop(false);
|
|
|
|
}
|
|
|
|
m_ProcCount = EM;
|
|
break;
|
|
case EM:
|
|
if(m_EffPlayData.m_MidEffId == NULL) {
|
|
m_ProcCount = EE;
|
|
break;
|
|
}
|
|
index = m_EffPlayData.m_MidEffId[0];
|
|
if(index == ESEMPTY) {
|
|
m_ProcCount = EE;
|
|
break;
|
|
}
|
|
if(m_EffPlayData.m_StartId) {
|
|
index = m_EffPlayData.m_StartId[0];
|
|
|
|
if(m_EffPlayData.m_StartFrameNextEff == ESEMPTY)
|
|
break;
|
|
}
|
|
if(!m_EffPlayData.m_StartId || (m_EffPlayData.m_StartFrameNextEff <= m_lstEff[index]->GetFrame())) {
|
|
/////// target의 chest 얻기
|
|
CZ3DObject *body;
|
|
if(m_EndChr != NULL) {
|
|
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(g_CharacterData.CheckCharacterListIn(m_EndChr)) // 캐릭터 없다면
|
|
{
|
|
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
m_EndChrChest = chest->_42; //무조건 chest 높이로 세팅
|
|
m_EndChrChest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
m_EndChrChest = 150.0f;
|
|
m_EndChrChest *= body_scale;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
|
|
float body_scale = 0.0f;
|
|
body = m_EndChr->GetSkeletonPartObject("CHEST");
|
|
body_scale = m_EndChr->GetScale();
|
|
|
|
if(body != NULL) {
|
|
matrix *chest = body->GetTM();
|
|
if(chest != NULL) {
|
|
//if(m_MidUnit.y > chest->_42) // chest 높이보다 mid unit의 위치가 높다면 chest 높이로 세팅
|
|
m_EndChrChest = chest->_42; //무조건 chest 높이로 세팅
|
|
m_EndChrChest *= body_scale;
|
|
}
|
|
else { // chest 가 없을시
|
|
m_EndChrChest = 150.0f;
|
|
m_EndChrChest *= body_scale;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
}
|
|
// mid unit pos 캐릭 방향에 따라 회전
|
|
// 지금까지 script 안의 좌표 값이 절대좌표였던것을 상대 좌표로 바꿈
|
|
if((m_MidUnit.x || m_MidUnit.y || m_MidUnit.z) && !m_bMidFwd) {
|
|
m_bMidFwd = true;
|
|
|
|
D3DXVECTOR3 tmprot;
|
|
D3DXVECTOR3 tmpfwd = m_ChrFwd;
|
|
|
|
tmpfwd *= 1000000.0f;
|
|
tmpfwd.y = 0.0f;
|
|
|
|
SetRot(m_StartPos,m_StartPos+tmpfwd,tmprot);
|
|
|
|
D3DXMATRIX tmp_rotm;
|
|
D3DXMATRIX tmp_unitm;
|
|
D3DXMATRIX tmp_roted;
|
|
|
|
D3DXMatrixIdentity(&tmp_unitm);
|
|
|
|
tmp_unitm._41 = m_MidUnit.x;
|
|
tmp_unitm._42 = m_MidUnit.y;
|
|
tmp_unitm._43 = m_MidUnit.z;
|
|
|
|
D3DXMatrixRotationYawPitchRoll(&tmp_rotm,tmprot.y,tmprot.x,tmprot.z);
|
|
D3DXMatrixMultiply(&tmp_roted,&tmp_unitm,&tmp_rotm);
|
|
|
|
m_MidUnit.x = tmp_roted._41;
|
|
//m_MidUnit.y = tmp_roted._42;
|
|
m_MidUnit.z = tmp_roted._43;
|
|
}
|
|
//
|
|
|
|
//////////////////////////
|
|
D3DXVECTOR3 vecChrEffPos;
|
|
|
|
if(m_bEffCharacter) { // Character Effect
|
|
CZ3DObject *body;
|
|
D3DXVECTOR3 bodypos;
|
|
D3DXMATRIX matQuatRot;
|
|
D3DXMATRIX matResult;
|
|
D3DXMATRIX matTmp;
|
|
if(m_StartChr != NULL) {
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(g_CharacterData.CheckCharacterListIn(m_StartChr)) // 캐릭터 없다면
|
|
{
|
|
|
|
// Pivot Info Get
|
|
body = m_StartChr->GetSkeletonPartObject(m_pEffCharacter->m_PivotName);
|
|
if(body != NULL) {
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pEffCharacter->vecPos.x;
|
|
matTmp._42 = m_pEffCharacter->vecPos.y;
|
|
matTmp._43 = m_pEffCharacter->vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pEffCharacter->vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
|
|
vecChrEffPos = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
|
|
|
|
|
|
} // if(body != NULL)
|
|
|
|
}
|
|
#else
|
|
// Pivot Info Get
|
|
body = m_StartChr->GetSkeletonPartObject(m_pEffCharacter->m_PivotName);
|
|
if(body != NULL) {
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pEffCharacter->vecPos.x;
|
|
matTmp._42 = m_pEffCharacter->vecPos.y;
|
|
matTmp._43 = m_pEffCharacter->vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pEffCharacter->vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
|
|
vecChrEffPos = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
|
|
|
|
|
|
} // if(body != NULL)
|
|
|
|
#endif
|
|
} // if(m_StartChr != NULL)
|
|
for(int k=0;k < m_EffPlayData.m_MidEffIdNum;k++) {
|
|
index = m_EffPlayData.m_MidEffId[k];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
m_lstEff[index]->SetLoop(true);
|
|
m_lstEff[index]->SetAxis(0.0f,0.0f,0.0f);
|
|
m_lstEff[index]->SetCenter(vecChrEffPos.x,vecChrEffPos.y,vecChrEffPos.z);
|
|
m_lstEff[index]->SetTick(timeGetTime());
|
|
m_lstEff[index]->SetEffectStart(true);
|
|
m_lstEff[index]->SetMoveState(true);
|
|
}
|
|
SetMidPos(vecChrEffPos.x,vecChrEffPos.y,vecChrEffPos.z);
|
|
SetOldMidPos(vecChrEffPos.x,vecChrEffPos.y,vecChrEffPos.z);
|
|
|
|
} // if(m_bEffCharacter)
|
|
else {
|
|
/////////////////////////
|
|
for(int k=0;k < m_EffPlayData.m_MidEffIdNum;k++) {
|
|
index = m_EffPlayData.m_MidEffId[k];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
m_lstEff[index]->SetLoop(true);
|
|
m_lstEff[index]->SetAxis(0.0f,0.0f,0.0f);
|
|
m_lstEff[index]->SetCenter(m_StartPos.x + m_MidUnit.x,m_StartPos.y+ m_MidUnit.y,m_StartPos.z+ m_MidUnit.z);
|
|
m_lstEff[index]->SetTick(timeGetTime());
|
|
m_lstEff[index]->SetEffectStart(true);
|
|
m_lstEff[index]->SetMoveState(true);
|
|
}
|
|
SetMidPos(m_StartPos.x + m_MidUnit.x,m_StartPos.y+ m_MidUnit.y,m_StartPos.z+ m_MidUnit.z);
|
|
SetOldMidPos(m_StartPos.x + m_MidUnit.x,m_StartPos.y+ m_MidUnit.y,m_StartPos.z+ m_MidUnit.z);
|
|
}
|
|
SetMidSpeed(m_EffPlayData.m_Speed);
|
|
m_MidShootFrame = timeGetTime();
|
|
m_MidMoveFrame = m_MidShootFrame;
|
|
m_ProcCount = EE;
|
|
|
|
if(m_bWheel) {
|
|
PlayWheel();
|
|
}
|
|
if(m_bBezierMid) { // Bezier Mid 이용할때
|
|
if(!m_bEffCharacter) {
|
|
SetInitBezier(m_StartPos.x + m_MidUnit.x,m_StartPos.y + m_MidUnit.y,m_StartPos.z + m_MidUnit.z,
|
|
m_EndPos[0].x,m_EndPos[0].y + m_EndChrChest,m_EndPos[0].z);
|
|
}
|
|
else {
|
|
SetInitBezier(vecChrEffPos.x,vecChrEffPos.y,vecChrEffPos.z,
|
|
m_EndPos[0].x,m_EndPos[0].y + m_EndChrChest,m_EndPos[0].z);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
case EE:
|
|
if(m_EffPlayData.m_MidEffId)
|
|
index = m_EffPlayData.m_MidEffId[0];
|
|
else
|
|
index = ESEMPTY;
|
|
// mid effect 가 없거나 끝났다면
|
|
if((index == ESEMPTY) || (m_lstEff[index] == NULL) ||(!m_lstEff[index]->GetEffectStart()) || (m_bExt1 && m_bExt1Crash) || (m_bExt3 && m_bExt3Crash)) {
|
|
for(i=0;i<m_EffPlayData.m_EndEffIdNum;i++) {
|
|
D3DXVECTOR3 tmp_pos;
|
|
// end pos not setting 시 0리턴 하여 스크립트 삭제
|
|
if(m_EndPosNum <=0) {
|
|
m_ProcCount = EF;
|
|
break;
|
|
}
|
|
tmp_pos.x = m_EndPos[0].x + (m_EffPlayData.m_EndPos[0]* m_MulPos);
|
|
tmp_pos.y = m_EndPos[0].y + (m_EffPlayData.m_EndPos[1]* m_MulPos);
|
|
tmp_pos.z = m_EndPos[0].z + (m_EffPlayData.m_EndPos[2]* m_MulPos);
|
|
|
|
index = m_EffPlayData.m_EndEffId[i];
|
|
if(index == ESEMPTY)
|
|
break;
|
|
// effect 시작
|
|
m_lstEff[index]->SetLoop(false);
|
|
m_lstEff[index]->SetAxis(0.0f,0.0f,0.0f);
|
|
m_lstEff[index]->SetCenter(tmp_pos.x,tmp_pos.y,tmp_pos.z);
|
|
//m_lstEff[index]->SetCenter(m_StartPos.x,m_StartPos.y,m_StartPos.z);
|
|
m_lstEff[index]->SetTick(timeGetTime());
|
|
m_lstEff[index]->SetEffectStart(true);
|
|
|
|
}
|
|
m_ProcCount = EF;
|
|
}
|
|
break;
|
|
/* case EF:
|
|
for(i=0;i<m_EffPlayData.m_MidEffIdNum;i++) {
|
|
int count = 0;
|
|
if(m_Wheel[i].GetEnd())
|
|
count++;
|
|
if(count == m_EffPlayData.m_MidEffIdNum) {
|
|
wend = true;
|
|
}
|
|
else
|
|
wend = false;
|
|
}
|
|
|
|
break;
|
|
*/
|
|
default:
|
|
break;
|
|
|
|
}
|
|
////////////////
|
|
// midunit 에서 y 값만 있는것
|
|
// End Pos Settting 할때 이용한다.
|
|
D3DXVECTOR3 CurrentMidUnit = D3DXVECTOR3(0.0f,m_MidUnit.y,0.0f);
|
|
|
|
CX3DEffect *pEffect = NULL;
|
|
|
|
m_Device->GetTransform(D3DTS_VIEW, (D3DMATRIX *)&m_View);
|
|
|
|
// delay time 이 아니면
|
|
if(m_ProcCount != ED) {
|
|
for(i = 0;i < m_lstEff.size();i++) {
|
|
pEffect = m_lstEff[i];
|
|
// 시작 되었으면 update
|
|
if(m_lstEff[i] == NULL) {
|
|
del_count++;
|
|
continue;
|
|
|
|
}
|
|
|
|
if(pEffect->GetEffectStart()) {
|
|
//set loop
|
|
if(m_EffList[i].m_LoopStart != ESEMPTY) {
|
|
if(!(m_EffList[i].m_LoopAction)) {
|
|
if(1) {//m_EffList[i].m_LoopSwitch <= m_lstEff[i]->GetFrame()) {
|
|
m_EffList[i].m_LoopAction = true;
|
|
m_lstEff[i]->SetLoop(true);
|
|
m_lstEff[i]->SetMaxFrame(m_EffList[i].m_LoopEnd);
|
|
m_lstEff[i]->SetMinFrame(m_EffList[i].m_LoopStart);
|
|
|
|
}
|
|
}
|
|
}
|
|
bool bCharEff = false;
|
|
|
|
if(m_EffPlayData.m_StartIdNum > 0) {
|
|
int cStart;
|
|
for(cStart = 0; cStart < m_EffPlayData.m_StartIdNum; cStart++) {
|
|
int iCurrentList = m_EffPlayData.m_StartId[cStart];
|
|
if(m_lstEff[iCurrentList] == pEffect)
|
|
bCharEff = true; // Start Effect 이면 True (Character Effect 적용)
|
|
}
|
|
}
|
|
if(m_bEffCharacter && bCharEff) { // Character Effect
|
|
CZ3DObject *body;
|
|
D3DXVECTOR3 bodypos;
|
|
D3DXMATRIX matQuatRot;
|
|
D3DXMATRIX matResult;
|
|
D3DXMATRIX matTmp;
|
|
if(m_StartChr != NULL) {
|
|
#ifndef __EFF_WCREATOR__ // Client
|
|
if(g_CharacterData.CheckCharacterListIn(m_StartChr)) // 캐릭터 없다면
|
|
{
|
|
|
|
|
|
// Pivot Info Get
|
|
body = m_StartChr->GetSkeletonPartObject(m_pEffCharacter->m_PivotName);
|
|
if(body != NULL) {
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pEffCharacter->vecPos.x;
|
|
matTmp._42 = m_pEffCharacter->vecPos.y;
|
|
matTmp._43 = m_pEffCharacter->vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pEffCharacter->vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
// Effect Pos Setting ( World Position + 최종 로컬 effect Position )
|
|
if(m_pEffCharacter->m_bPosUpdate || !m_pEffCharacter->m_bFirstUpdate) {
|
|
pEffect->SetCenter(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
|
|
g_vecCharEff = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
}
|
|
else { // 처음 한번만 업데이트
|
|
pEffect->SetCenter(m_pEffCharacter->m_vecPosBackup.x,
|
|
m_pEffCharacter->m_vecPosBackup.y,
|
|
m_pEffCharacter->m_vecPosBackup.z);
|
|
|
|
g_vecCharEff = D3DXVECTOR3(m_pEffCharacter->m_vecPosBackup.x,
|
|
m_pEffCharacter->m_vecPosBackup.y,
|
|
m_pEffCharacter->m_vecPosBackup.z);
|
|
}
|
|
if(m_pEffCharacter->m_bRotUpdate || !m_pEffCharacter->m_bFirstUpdate) {
|
|
// Effect Rotation Setting
|
|
pEffect->SetAxis(&body_q);
|
|
}
|
|
else { // 처음 한번만 로테이션
|
|
quaternion Init_Quat = quaternion(0.0f,0.0f,0.0f,1.0f);
|
|
//pEffect->SetAxis(&(m_pEffCharacter->m_RotBackup));
|
|
pEffect->SetAxis(&Init_Quat);
|
|
|
|
}
|
|
|
|
if(m_pEffCharacter->m_bFirstUpdate == false)
|
|
{
|
|
m_pEffCharacter->m_bFirstUpdate = true;
|
|
m_pEffCharacter->m_vecPosBackup = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
m_pEffCharacter->m_RotBackup = D3DXQUATERNION(body_q.x,
|
|
body_q.y,
|
|
body_q.z,
|
|
body_q.w);
|
|
}
|
|
|
|
|
|
} // if(body != NULL)
|
|
}
|
|
#else
|
|
|
|
// Pivot Info Get
|
|
body = m_StartChr->GetSkeletonPartObject(m_pEffCharacter->m_PivotName);
|
|
if(body != NULL) {
|
|
|
|
vector3 body_tm;
|
|
quaternion body_q;
|
|
D3DXQUATERNION tmp;
|
|
float body_scale = 0.0f;
|
|
body_scale = m_StartChr->GetScale();
|
|
|
|
body->GetDirection(body_q); // Direction
|
|
body->GetPosition(body_tm); // Position
|
|
|
|
tmp.x = body_q.x;
|
|
tmp.y = body_q.y;
|
|
tmp.z = body_q.z;
|
|
tmp.w = body_q.w;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_pEffCharacter->vecPos.x;
|
|
matTmp._42 = m_pEffCharacter->vecPos.y;
|
|
matTmp._43 = m_pEffCharacter->vecPos.z;
|
|
// 상대좌표를 head에서의 world 좌표로 변환 ( World Pivot Pos + Local Effect Pos * rotation[character] )
|
|
D3DXMatrixRotationQuaternion(&matQuatRot,&tmp);
|
|
D3DXMatrixMultiply(&matResult,&matTmp,&matQuatRot);
|
|
// 상대 rotation 값 적용 ( rotation[character] * rotation[local Effect] )
|
|
tmp = m_pEffCharacter->vecQuat * tmp;
|
|
|
|
body_q.x = tmp.x;
|
|
body_q.y = tmp.y;
|
|
body_q.z = tmp.z;
|
|
body_q.w = tmp.w;
|
|
|
|
bodypos.x = body_tm.x + matResult._41;
|
|
bodypos.y = body_tm.y + matResult._42;
|
|
bodypos.z = body_tm.z + matResult._43;
|
|
|
|
bodypos *= body_scale;
|
|
// Effect Pos Setting ( World Position + 최종 로컬 effect Position )
|
|
if(m_pEffCharacter->m_bPosUpdate || !m_pEffCharacter->m_bFirstUpdate) {
|
|
pEffect->SetCenter(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
|
|
g_vecCharEff = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
}
|
|
else { // 처음 한번만 업데이트
|
|
pEffect->SetCenter(m_pEffCharacter->m_vecPosBackup.x,
|
|
m_pEffCharacter->m_vecPosBackup.y,
|
|
m_pEffCharacter->m_vecPosBackup.z);
|
|
|
|
g_vecCharEff = D3DXVECTOR3(m_pEffCharacter->m_vecPosBackup.x,
|
|
m_pEffCharacter->m_vecPosBackup.y,
|
|
m_pEffCharacter->m_vecPosBackup.z);
|
|
}
|
|
if(m_pEffCharacter->m_bRotUpdate || !m_pEffCharacter->m_bFirstUpdate) {
|
|
// Effect Rotation Setting
|
|
pEffect->SetAxis(&body_q);
|
|
}
|
|
else { // 처음 한번만 로테이션
|
|
quaternion Init_Quat = quaternion(0.0f,0.0f,0.0f,1.0f);
|
|
//pEffect->SetAxis(&(m_pEffCharacter->m_RotBackup));
|
|
pEffect->SetAxis(&Init_Quat);
|
|
|
|
}
|
|
|
|
if(m_pEffCharacter->m_bFirstUpdate == false)
|
|
{
|
|
m_pEffCharacter->m_bFirstUpdate = true;
|
|
m_pEffCharacter->m_vecPosBackup = D3DXVECTOR3(m_StartPos.x + bodypos.x,
|
|
m_StartPos.y + bodypos.y,
|
|
m_StartPos.z + bodypos.z);
|
|
m_pEffCharacter->m_RotBackup = D3DXQUATERNION(body_q.x,
|
|
body_q.y,
|
|
body_q.z,
|
|
body_q.w);
|
|
}
|
|
|
|
|
|
} // if(body != NULL)
|
|
#endif
|
|
|
|
} // if(m_StartChr != NULL)
|
|
} // if(m_bEffCharacter)
|
|
if((m_EffList[i].m_bStartRot)&&(!m_EffList[i].m_bRotStart)) {
|
|
|
|
D3DXVECTOR3 startfwd = m_ChrFwd;
|
|
|
|
if(!m_bExt2) // m_bExt2 == true :: start effect 회전이 시작 이후에도 계속 적용
|
|
m_EffList[i].m_bRotStart = true;
|
|
|
|
startfwd *= 1000000.0f;
|
|
startfwd.y = 0.0f;
|
|
/*
|
|
m_ChrFwd *= 1000000.0f;
|
|
m_ChrFwd.y = 0.0f;
|
|
SetRot(m_StartPos,m_StartPos+m_ChrFwd,m_EffList[i].m_StartRot);
|
|
|
|
*/
|
|
|
|
SetRot(m_StartPos,m_StartPos+startfwd,m_EffList[i].m_StartRot);
|
|
|
|
// quaternion 생성
|
|
|
|
|
|
D3DXQUATERNION sqt;
|
|
// 03.06.04 수정 roll 값의 영향을 받지 않게(z 축중심의 회전 X).
|
|
//D3DXQuaternionRotationYawPitchRoll(&sqt,m_EffList[i].m_StartRot.y,m_EffList[i].m_StartRot.x,m_EffList[i].m_StartRot.z);
|
|
D3DXQuaternionRotationYawPitchRoll(&sqt,m_EffList[i].m_StartRot.y,m_EffList[i].m_StartRot.x,0.0f);
|
|
|
|
if(m_bExt4InfoSet) {
|
|
if(!m_bExt4First) {
|
|
// 화살이 꼽힌 object의 방향 quaternion의 역 quaternion을 생성
|
|
D3DXQUATERNION sqt2;
|
|
sqt2.x = -m_Ext4Object.x;
|
|
sqt2.y = -m_Ext4Object.y;
|
|
sqt2.z = -m_Ext4Object.z;
|
|
sqt2.w = m_Ext4Object.w;
|
|
|
|
/*
|
|
sqt2.x = -sqt.x;
|
|
sqt2.y = -sqt.y;
|
|
sqt2.z = -sqt.z;
|
|
sqt2.w = sqt.w;
|
|
*/
|
|
|
|
// world에서 화살의 방향을 object 방향에 상대적 값으로 계산
|
|
m_Ext4Quat = m_Ext4Quat * sqt2;
|
|
// 상대적이 각도는 처음 한번만 계산해 주면 됨
|
|
m_bExt4First = true;
|
|
}
|
|
//sqt = m_Ext4Object * m_Ext4Quat;
|
|
// 매 업데이트 순간마다 화살의 상대적인 각도에 object의 방향 값을 곱하여 준다
|
|
sqt = m_Ext4Quat * m_Ext4Object;
|
|
//sqt = sqt * m_Ext4Quat;
|
|
|
|
}
|
|
|
|
quaternion sqtt;
|
|
sqtt.x = sqt.x;
|
|
sqtt.y = sqt.y;
|
|
sqtt.z = sqt.z;
|
|
sqtt.w = sqt.w;
|
|
if(m_lstEff[i] != NULL) {
|
|
|
|
m_lstEff[i]->SetAxis(&sqtt);
|
|
}
|
|
}
|
|
|
|
//world effect
|
|
if(m_bWorldEffect) {
|
|
PlayTime(); // Set Play Time
|
|
|
|
D3DXQUATERNION sqt;
|
|
quaternion sqtt;
|
|
D3DXQuaternionRotationYawPitchRoll(&sqt,D3DXToRadian(m_WorldAxis[1]),D3DXToRadian(m_WorldAxis[0]),D3DXToRadian(m_WorldAxis[2]));
|
|
sqtt.x = sqt.x;
|
|
sqtt.y = sqt.y;
|
|
sqtt.z = sqt.z;
|
|
sqtt.w = sqt.w;
|
|
|
|
m_lstEff[i]->SetAxis(&sqtt);
|
|
}
|
|
if(m_bVisibility) {
|
|
if(m_Mine) {
|
|
// CLight
|
|
for(j=0;j<m_EffList[i].m_CLightNum;j++) {
|
|
if(m_EffList[i].m_CLightStart[j] != ESEMPTY) {
|
|
if(m_EffList[i].m_CLightStart[j] <= m_lstEff[i]->GetFrame())
|
|
PlayCLight(i,j);
|
|
}
|
|
}
|
|
//fade in 부분
|
|
for(j=0;j<m_EffList[i].m_FadeInNum;j++) {
|
|
if(m_EffList[i].m_FadeInStart[j] != ESEMPTY) {
|
|
if(m_EffList[i].m_FadeInStart[j] <= m_lstEff[i]->GetFrame())
|
|
PlayFadeIn(i,j);
|
|
}
|
|
}
|
|
|
|
//카메라 쉐이킹
|
|
for(j=0;j<m_EffList[i].m_ShakeNum;j++) {
|
|
if(!(m_EffList[i].m_Shake[j].m_Action)) {
|
|
if(m_EffList[i].m_Shake[j].m_length[0] != ESEMPTY) {
|
|
if(m_EffList[i].m_Shake[j].m_StartTime <= m_lstEff[i]->GetFrame()) {
|
|
m_EffList[i].m_Shake[j].m_Action = true;
|
|
CCameraControl::m_fCameraShakeRateTime = m_EffList[i].m_Shake[j].m_ShakeTime;
|
|
CCameraControl::m_fCameraShakeNowTime = 0.0f;
|
|
CCameraControl::m_vecCameraShakeLength = vector3(m_EffList[i].m_Shake[j].m_length[0],
|
|
m_EffList[i].m_Shake[j].m_length[1],
|
|
m_EffList[i].m_Shake[j].m_length[2]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}//mine
|
|
}// if(m_bVisibility)
|
|
int skipframe = 0;
|
|
for(int k=0;k<m_EffPlayData.m_MidEffIdNum;k++) {
|
|
if(i == m_EffPlayData.m_MidEffId[k]) { // mid effect 이면 궤적 처리
|
|
|
|
if(k==0) {
|
|
|
|
//fwd_vec = m_EndPos[0] - m_StartPos;
|
|
|
|
// end pos not setting 시 0리턴 하여 스크립트 삭제
|
|
if(m_EndPosNum <=0) {
|
|
|
|
return 0;
|
|
}
|
|
//frame skip
|
|
unsigned long move_frame = timeGetTime();
|
|
|
|
if( move_frame - m_MidMoveFrame >= DEFAULTESTICK) {//m_TickFrame) {
|
|
skipframe +=((int)(move_frame-m_MidMoveFrame)/DEFAULTESTICK);
|
|
m_MidMoveFrame = move_frame;
|
|
}
|
|
|
|
for(int fs = 0;fs<skipframe;fs++) {
|
|
if(!m_bBezierMid) {
|
|
if(m_EndChrChest == -1.0f) {
|
|
oldfwd_vec = (m_EndPos[0] + CurrentMidUnit) - m_OldMidPos;
|
|
fwd_vec = (m_EndPos[0] + CurrentMidUnit) - m_MidPos;
|
|
}
|
|
else {
|
|
D3DXVECTOR3 tmpmid;
|
|
tmpmid = CurrentMidUnit;
|
|
tmpmid.y = m_EndChrChest;
|
|
|
|
oldfwd_vec = (m_EndPos[0] + tmpmid) - m_OldMidPos;
|
|
fwd_vec = (m_EndPos[0] + tmpmid) - m_MidPos;
|
|
}
|
|
pos_vec = m_MidPos;
|
|
|
|
|
|
D3DXVec3Normalize(&fwd_vec,&fwd_vec);
|
|
pos_vec.x += fwd_vec.x * (m_MidSpeed) + m_EffList[i].m_SpeedValue[0];
|
|
pos_vec.y += fwd_vec.y * (m_MidSpeed) + m_EffList[i].m_SpeedValue[1];
|
|
pos_vec.z += fwd_vec.z * (m_MidSpeed) + m_EffList[i].m_SpeedValue[2];
|
|
|
|
m_EffList[i].m_SpeedValue[0] += m_EffList[i].m_AccelValue[0];
|
|
m_EffList[i].m_SpeedValue[1] += m_EffList[i].m_AccelValue[1];
|
|
m_EffList[i].m_SpeedValue[2] += m_EffList[i].m_AccelValue[2];
|
|
// 영향력 감소
|
|
m_EffList[i].m_SpeedValue[0] *= 0.9f;
|
|
m_EffList[i].m_SpeedValue[1] *= 0.9f;
|
|
m_EffList[i].m_SpeedValue[2] *= 0.9f;
|
|
|
|
|
|
m_MidSpeed += m_EffPlayData.m_Accel;
|
|
} //if(!m_bBezierMid) {
|
|
/////////// Bezier Line update
|
|
else {
|
|
if(m_pBezierMid != NULL) {
|
|
if(m_pBezierMid->m_pBezierLine != NULL)
|
|
crash = m_pBezierMid->m_pBezierLine->UpdateLightning(pos_vec,false);
|
|
}
|
|
|
|
}
|
|
//////////
|
|
}
|
|
|
|
//extension 5
|
|
if(m_bExt5) { // mid effect 처음 시작시 plane setting 과 알파 세팅
|
|
//if((m_Ext5Value->m_bExt5ValueSet) == false) {
|
|
|
|
//D3DXVECTOR3 PlaneFwd = m_EndPos[0] - m_StartPos;
|
|
|
|
D3DXVECTOR3 PlaneFwd = m_EndPos[0] - m_StartPos;
|
|
|
|
D3DXVECTOR3 PlaneNormal(0.0f,1.0f,0.0f);
|
|
D3DXVECTOR3 PlaneRight;
|
|
|
|
D3DXVec3Normalize(&PlaneFwd,&PlaneFwd);
|
|
D3DXVec3Normalize(&PlaneNormal,&PlaneNormal);
|
|
D3DXVec3Cross(&PlaneRight,&PlaneFwd,&PlaneNormal);
|
|
D3DXVec3Normalize(&PlaneRight,&PlaneRight);
|
|
|
|
m_Ext5Value->m_PlaneStartPos = m_StartPos + m_MidUnit;
|
|
//높이 세팅
|
|
if((pos_vec.x == 0.0f) && (pos_vec.y == 0.0f) && (pos_vec.z == 0.0f)) {
|
|
m_Ext5Value->m_PlaneEndPos = m_StartPos + m_MidUnit;
|
|
}
|
|
else {
|
|
D3DXVECTOR3 length1;
|
|
if(m_EndChrChest == -1.0f) // 가슴 높이
|
|
length1 = (m_EndPos[0] + CurrentMidUnit) - m_StartPos;
|
|
else {
|
|
D3DXVECTOR3 tempmid = CurrentMidUnit;
|
|
tempmid.y = m_EndChrChest;
|
|
|
|
length1 = (m_EndPos[0] + tempmid) - m_StartPos;
|
|
}
|
|
D3DXVECTOR3 length2 = pos_vec - m_StartPos;
|
|
float len1 = D3DXVec3Length(&length1);
|
|
float len2 = D3DXVec3Length(&length2);
|
|
if(len1 > len2) // 충돌전
|
|
m_Ext5Value->m_PlaneEndPos = pos_vec;
|
|
else {//충돌후
|
|
if(m_EndChrChest == -1.0f)
|
|
m_Ext5Value->m_PlaneEndPos = (m_EndPos[0] + CurrentMidUnit);
|
|
else {
|
|
D3DXVECTOR3 tmpmid = CurrentMidUnit;
|
|
tmpmid.y = m_EndChrChest;
|
|
|
|
m_Ext5Value->m_PlaneEndPos = (m_EndPos[0] + tmpmid);
|
|
}
|
|
}
|
|
}
|
|
|
|
// EXT5 : setting 시 m_Ext5Value->m_Rand 값에 영향 받는다
|
|
// start pos에 random vector 적용시킨다
|
|
// 기본치 30 * 30 거리
|
|
|
|
if(!m_bExt5ex ||(m_Ext5Value->m_Rand)) {
|
|
if((m_Ext5Value->m_bExt5ValueSet) == false) {
|
|
m_Ext5Value->m_bExt5ValueSet = true;
|
|
|
|
m_Ext5Value->m_RandValue.x= rand() % (int)(ESEXTLINESIZE * 3);
|
|
m_Ext5Value->m_RandValue.y= rand() % (int)(ESEXTLINESIZE * 3);
|
|
m_Ext5Value->m_RandValue.z= rand() % (int)(ESEXTLINESIZE * 3);
|
|
|
|
if(rand()%2)
|
|
m_Ext5Value->m_RandValue.x *=-1.0f;
|
|
if(rand()%2)
|
|
m_Ext5Value->m_RandValue.y *=-1.0f;
|
|
if(rand()%2)
|
|
m_Ext5Value->m_RandValue.z *=-1.0f;
|
|
|
|
m_Ext5Value->m_PlaneStartPos +=m_Ext5Value->m_RandValue;
|
|
}
|
|
else {
|
|
m_Ext5Value->m_PlaneStartPos +=m_Ext5Value->m_RandValue;
|
|
}
|
|
}
|
|
else {
|
|
m_Ext5Value->m_bExt5ValueSet = true;
|
|
|
|
}
|
|
//화살 line setting 부분
|
|
CTexture::SetPath(EFFECTTEXTUREPATH);
|
|
if(!m_bExt5ex) {
|
|
m_Ext5Value->m_PlaneTexture.Load("lightningbeam2.DDS");
|
|
}
|
|
else { //스크립트 내부의 EXT5: 에서 세팅해준 정보 적용
|
|
m_Ext5Value->m_PlaneTexture.Load(m_Ext5Value->m_TextureName);
|
|
}
|
|
//EXT5: 세팅시 plane size 배율 적용시켜 준다 :: m_Ext5Value->m_LineSize 적용
|
|
//가로 plane
|
|
m_Ext5Value->m_Plane[0].x = m_Ext5Value->m_PlaneStartPos.x - (PlaneRight.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[0].y = m_Ext5Value->m_PlaneStartPos.y - (PlaneRight.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[0].z = m_Ext5Value->m_PlaneStartPos.z - (PlaneRight.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[0].s = 0.0f;
|
|
m_Ext5Value->m_Plane[0].t = 0.0f;
|
|
m_Ext5Value->m_Plane[0].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[0]);
|
|
|
|
m_Ext5Value->m_Plane[2].x = m_Ext5Value->m_PlaneStartPos.x + (PlaneRight.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[2].y = m_Ext5Value->m_PlaneStartPos.y + (PlaneRight.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[2].z = m_Ext5Value->m_PlaneStartPos.z + (PlaneRight.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[2].s = 1.0f;
|
|
m_Ext5Value->m_Plane[2].t = 0.0f;
|
|
m_Ext5Value->m_Plane[2].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[2]);
|
|
|
|
|
|
m_Ext5Value->m_Plane[1].x = m_Ext5Value->m_PlaneEndPos.x - (PlaneRight.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[1].y = m_Ext5Value->m_PlaneEndPos.y - (PlaneRight.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[1].z = m_Ext5Value->m_PlaneEndPos.z - (PlaneRight.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[1].s = 0.0f;
|
|
m_Ext5Value->m_Plane[1].t = 1.0f;
|
|
m_Ext5Value->m_Plane[1].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[1]);
|
|
|
|
m_Ext5Value->m_Plane[3].x = m_Ext5Value->m_PlaneEndPos.x + (PlaneRight.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[3].y = m_Ext5Value->m_PlaneEndPos.y + (PlaneRight.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[3].z = m_Ext5Value->m_PlaneEndPos.z + (PlaneRight.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[3].s = 1.0f;
|
|
m_Ext5Value->m_Plane[3].t = 1.0f;
|
|
m_Ext5Value->m_Plane[3].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[3]);
|
|
//세로 플랜
|
|
m_Ext5Value->m_Plane[4].x = m_Ext5Value->m_PlaneStartPos.x - (PlaneNormal.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[4].y = m_Ext5Value->m_PlaneStartPos.y - (PlaneNormal.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[4].z = m_Ext5Value->m_PlaneStartPos.z - (PlaneNormal.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[4].s = 0.0f;
|
|
m_Ext5Value->m_Plane[4].t = 0.0f;
|
|
m_Ext5Value->m_Plane[4].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[0]);
|
|
|
|
m_Ext5Value->m_Plane[6].x = m_Ext5Value->m_PlaneStartPos.x + (PlaneNormal.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[6].y = m_Ext5Value->m_PlaneStartPos.y + (PlaneNormal.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[6].z = m_Ext5Value->m_PlaneStartPos.z + (PlaneNormal.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[6].s = 1.0f;
|
|
m_Ext5Value->m_Plane[6].t = 0.0f;
|
|
m_Ext5Value->m_Plane[6].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[2]);
|
|
|
|
|
|
m_Ext5Value->m_Plane[5].x = m_Ext5Value->m_PlaneEndPos.x - (PlaneNormal.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[5].y = m_Ext5Value->m_PlaneEndPos.y - (PlaneNormal.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[5].z = m_Ext5Value->m_PlaneEndPos.z - (PlaneNormal.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[5].s = 0.0f;
|
|
m_Ext5Value->m_Plane[5].t = 1.0f;
|
|
m_Ext5Value->m_Plane[5].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[1]);
|
|
|
|
m_Ext5Value->m_Plane[7].x = m_Ext5Value->m_PlaneEndPos.x + (PlaneNormal.x * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[7].y = m_Ext5Value->m_PlaneEndPos.y + (PlaneNormal.y * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[7].z = m_Ext5Value->m_PlaneEndPos.z + (PlaneNormal.z * (ESEXTLINESIZE/2.0f) * (m_Ext5Value->m_LineSize));
|
|
m_Ext5Value->m_Plane[7].s = 1.0f;
|
|
m_Ext5Value->m_Plane[7].t = 1.0f;
|
|
m_Ext5Value->m_Plane[7].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[3]);
|
|
|
|
//}
|
|
|
|
}
|
|
//
|
|
|
|
|
|
//effect rot set
|
|
//SetRot(oldfwd_vec,fwd_vec);
|
|
if(!m_NotRot) {
|
|
SetRot(-oldfwd_vec,-fwd_vec,m_MidRot);
|
|
|
|
// quaternion 생성
|
|
D3DXQUATERNION qt;
|
|
quaternion qtt;
|
|
D3DXQuaternionRotationYawPitchRoll(&qt,m_MidRot.y,m_MidRot.x,m_MidRot.z);
|
|
qtt.x = qt.x;
|
|
qtt.y = qt.y;
|
|
qtt.z = qt.z;
|
|
qtt.w = qt.w;
|
|
|
|
pEffect->SetAxis(&qtt);
|
|
}
|
|
|
|
|
|
if(skipframe) {
|
|
//현제 position setting
|
|
SetMidPos(pos_vec.x,pos_vec.y,pos_vec.z);
|
|
|
|
}
|
|
}
|
|
|
|
// m_Wheel[k].InsertEmptyPoint(m_MidPos.x,m_MidPos.y+150.0f,m_MidPos.z);
|
|
//////////////////////////////////////////////////////////
|
|
// loop off test(목적지에 도착했는지 test)
|
|
if(skipframe) {
|
|
|
|
D3DXVECTOR3 test_vec1;
|
|
D3DXVECTOR3 test_vec2;
|
|
D3DXVECTOR3 tmp_v;
|
|
if(m_EndChrChest == -1.0f) {
|
|
test_vec1 = (m_EndPos[0] + CurrentMidUnit) - m_OldMidPos;
|
|
test_vec2 = (m_EndPos[0] + CurrentMidUnit) - m_MidPos;
|
|
tmp_v = (m_EndPos[0] + CurrentMidUnit) - m_MidPos;
|
|
}
|
|
else {
|
|
D3DXVECTOR3 tmpmid = CurrentMidUnit;
|
|
tmpmid.y = m_EndChrChest;
|
|
|
|
test_vec1 = (m_EndPos[0] + tmpmid) - m_OldMidPos;
|
|
test_vec2 = (m_EndPos[0] + tmpmid) - m_MidPos;
|
|
tmp_v = (m_EndPos[0] + tmpmid) - m_MidPos;
|
|
}
|
|
D3DXVECTOR3 up_vec(0.0f,1.0f,0.0f);
|
|
D3DXVECTOR3 cro1;
|
|
D3DXVECTOR3 cro2;
|
|
float dot_value;
|
|
|
|
|
|
|
|
float crash_length = D3DXVec3Length(&tmp_v);
|
|
D3DXVec3Cross(&cro1,&test_vec1,&up_vec);
|
|
D3DXVec3Cross(&cro2,&test_vec2,&up_vec);
|
|
dot_value = D3DXVec3Dot(&cro1,&cro2);
|
|
|
|
unsigned long test_tick = timeGetTime();
|
|
test_tick -= m_MidShootFrame;
|
|
|
|
if((dot_value < 0) || (crash_length <50.0f) || ((test_tick / DEFAULTESTICK) >= 100) || crash) {
|
|
|
|
|
|
//pEffect->SetLoop(false);
|
|
pEffect->SetMoveState(false);
|
|
//pEffect->SetEffectStart(false);
|
|
// 궤적 페이드 아웃 시작
|
|
/*for(int t=0;t<m_EffPlayData.m_MidEffIdNum;t++) {
|
|
m_Wheel[t].SetFadeStart(true);
|
|
}*/
|
|
|
|
|
|
if(m_bExt3) {
|
|
/////
|
|
int ie_count = 0;
|
|
for(int ie=0;ie<m_EffPlayData.m_EndEffIdNum;ie++) {
|
|
int ieindex = m_EffPlayData.m_EndEffId[ie];
|
|
if(ieindex == ESEMPTY) {
|
|
ie_count++;
|
|
continue;
|
|
}
|
|
if(m_lstEff[ieindex] == NULL)
|
|
ie_count++;
|
|
}
|
|
if(ie_count == m_EffPlayData.m_EndEffIdNum) {
|
|
if(pEffect != NULL)
|
|
pEffect->SetLoop(false);
|
|
|
|
}
|
|
/////
|
|
m_bExt3Crash = true;
|
|
if(pEffect != NULL) {
|
|
if(m_EndChrChest == -1.0f)
|
|
pEffect->SetCenter(m_EndPos[0].x + CurrentMidUnit.x,m_EndPos[0].y + CurrentMidUnit.y,m_EndPos[0].z + CurrentMidUnit.z);
|
|
else
|
|
pEffect->SetCenter(m_EndPos[0].x + CurrentMidUnit.x,m_EndPos[0].y + m_EndChrChest,m_EndPos[0].z + CurrentMidUnit.z);
|
|
pEffect->SetStopParticle(pEffect->GetFrame());
|
|
}
|
|
|
|
}
|
|
else if(m_bExt1){ // ext1
|
|
pEffect->SetLoop(false);
|
|
m_bExt1Crash = true;
|
|
if(pEffect != NULL) {
|
|
if(m_EndChrChest == -1.0f)
|
|
pEffect->SetCenter(m_EndPos[0].x + CurrentMidUnit.x,m_EndPos[0].y + CurrentMidUnit.y,m_EndPos[0].z + CurrentMidUnit.z);
|
|
else
|
|
pEffect->SetCenter(m_EndPos[0].x + CurrentMidUnit.x,m_EndPos[0].y + m_EndChrChest,m_EndPos[0].z + CurrentMidUnit.z);
|
|
}
|
|
}
|
|
else {
|
|
del_count++;
|
|
pEffect->SetLoop(false);
|
|
delete pEffect;
|
|
pEffect = NULL;
|
|
m_lstEff[i] = NULL;
|
|
}
|
|
D3DXQUATERNION qt;
|
|
D3DXQuaternionRotationYawPitchRoll(&qt,m_MidRot.y,m_MidRot.x,m_MidRot.z);
|
|
|
|
//extension 4
|
|
if(m_bExt4) {
|
|
|
|
//extesion4 info setting
|
|
SetExt4Info(EHEAD,qt);
|
|
}
|
|
|
|
m_Ext4Quat = qt;
|
|
|
|
/*m_Ext4Quat.x = m_MidRot.x;
|
|
m_Ext4Quat.y = m_MidRot.y;
|
|
m_Ext4Quat.z = m_MidRot.z;
|
|
*/
|
|
crash = true;
|
|
// wheel end setting
|
|
if(m_bWheel)
|
|
UpdateWheel(0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1);
|
|
|
|
continue;
|
|
|
|
}
|
|
else if(pEffect->GetMoveState()) {// 지나친것이 아니므로 위치 업데이트
|
|
/////////// Bezier Line update
|
|
//if(m_bBezierMid)
|
|
// m_pBezierMid->m_pBezierLine->UpdateLightning(pos_vec,true);
|
|
|
|
//////////
|
|
|
|
|
|
pEffect->SetCenter(pos_vec.x,pos_vec.y,pos_vec.z);
|
|
|
|
if(m_bWheel) {
|
|
//next position 계산
|
|
D3DXVECTOR3 npos = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
D3DXVECTOR3 fwd = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
npos = m_MidPos;
|
|
|
|
if(m_EndChrChest == -1.0f) {
|
|
|
|
fwd = (m_EndPos[0] + CurrentMidUnit) - m_MidPos;
|
|
}
|
|
else {
|
|
D3DXVECTOR3 tmpmid;
|
|
tmpmid = CurrentMidUnit;
|
|
tmpmid.y = m_EndChrChest;
|
|
|
|
|
|
fwd = (m_EndPos[0] + tmpmid) - m_MidPos;
|
|
}
|
|
|
|
D3DXVec3Normalize(&fwd,&fwd);
|
|
npos.x += fwd.x * (m_MidSpeed) + m_EffList[i].m_SpeedValue[0];
|
|
npos.y += fwd.y * (m_MidSpeed) + m_EffList[i].m_SpeedValue[1];
|
|
npos.z += fwd.z * (m_MidSpeed) + m_EffList[i].m_SpeedValue[2];
|
|
|
|
UpdateWheel(pos_vec.x,pos_vec.y,pos_vec.z,npos.x,npos.y,npos.z);
|
|
}
|
|
}
|
|
////////////////////////////////////////////////////////////////
|
|
/*for(int fr = 0;fr <skipframe;fr++) {
|
|
m_MidSpeed += m_EffPlayData.m_Accel;
|
|
}*/
|
|
}
|
|
// min max check
|
|
if(m_MidSpeed < m_EffPlayData.m_MinSpeed)
|
|
m_MidSpeed = m_EffPlayData.m_MinSpeed;
|
|
else if(m_MidSpeed > m_EffPlayData.m_MaxSpeed)
|
|
m_MidSpeed = m_EffPlayData.m_MaxSpeed;
|
|
}
|
|
|
|
}
|
|
|
|
if(pEffect == NULL)
|
|
continue;
|
|
// 랜덤 사운드 일때 사용
|
|
int soundlimit = 0;
|
|
int psound = 0;
|
|
|
|
|
|
if(m_bVisibility) { // Visibility 값이 true 일때
|
|
//sound 출력
|
|
for(j=0;j<m_EffList[i].m_SoundNum;j++) {
|
|
if(m_EffList[i].m_Sound) {
|
|
if(!(m_EffList[i].m_Sound[j].m_bPlay)) {
|
|
if(m_EffList[i].m_Sound[j].m_StartFrame <= m_lstEff[i]->GetFrame()) {
|
|
//랜덤 사운드 체크
|
|
for(int k=j;k<(m_EffList[i].m_SoundNum);k++) {
|
|
if(m_EffList[i].m_Sound[j].m_StartFrame == m_EffList[i].m_Sound[k].m_StartFrame) {
|
|
soundlimit++;
|
|
m_EffList[i].m_Sound[k].m_bPlay = true;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
if(soundlimit == 1) {
|
|
psound = j;
|
|
}
|
|
else if(soundlimit >1) {
|
|
psound = j + (rand() % soundlimit);
|
|
}
|
|
if(!m_bInterfaceSet) { //interface effect 가 아니면..
|
|
if(m_EffList[i].m_Sound[psound].m_Target == ES)
|
|
PlayEffSound(i,psound,m_StartPos.x,m_StartPos.y,m_StartPos.z,m_EffList[i].m_Sound[psound].m_Min,m_EffList[i].m_Sound[psound].m_Max);
|
|
else if(m_EffList[i].m_Sound[psound].m_Target == EM)
|
|
PlayEffSound(i,psound,m_MidPos.x,m_MidPos.y,m_MidPos.z,m_EffList[i].m_Sound[psound].m_Min,m_EffList[i].m_Sound[psound].m_Max);
|
|
else if(m_EffList[i].m_Sound[psound].m_Target == EE)
|
|
PlayEffSound(i,psound,m_EndPos[0].x,m_EndPos[0].y,m_EndPos[0].z,m_EffList[i].m_Sound[psound].m_Min,m_EffList[i].m_Sound[psound].m_Max);
|
|
}
|
|
else { // interface effect sound
|
|
PlayEffSound(i,psound);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}// if(!(m_EffList[i].m_Sound[j].m_bPlay))
|
|
else if(m_lstEff[i] == NULL) { // 이미 죽은 effect 이면..
|
|
|
|
}
|
|
else { // 재생되었던 사운드
|
|
if(m_bWorldEffect) {
|
|
if(m_lstEff[i]->GetFrame() < m_lstEff[i]->GetBeforeFrame()) {
|
|
m_EffList[i].m_Sound[j].m_bPlay = false;
|
|
}
|
|
}
|
|
}
|
|
}// if(m_EffList[i].m_Sound)
|
|
} //for
|
|
if(m_bLightning) { //lightning use
|
|
for(j=0;j<m_LningNum;j++) { //lightning setting
|
|
PlayLning(j,i,m_lstEff[i]->GetFrame(),g_vecCharEff);
|
|
}
|
|
}
|
|
if(m_bLightn2) { //lightning2 use
|
|
PlayLning2(j,i,m_lstEff[i]->GetFrame(),g_vecCharEff);
|
|
}
|
|
if(m_bLightn3) { // lightning3 use
|
|
PlayLning3(j,i,m_lstEff[i]->GetFrame(),g_vecCharEff);
|
|
}
|
|
} // m_bVisibility
|
|
//hit return
|
|
if(m_EffList[i].m_HitFrameNum >0) {
|
|
for(j=m_EffList[i].m_HitFrameCount;j<m_EffList[i].m_HitFrameNum;j++) {
|
|
if(m_EffList[i].m_HitFrame[j] != ESEMPTY) {
|
|
if(m_EffList[i].m_HitFrame[j] <= m_lstEff[i]->GetFrame()) {
|
|
hit_return = true;
|
|
m_EffList[i].m_HitFrameCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
//if(m_Mine) { //내 것일때만 실행
|
|
//slide
|
|
if(m_EffList[i].m_Ext6ValueNum >0) {
|
|
for(j=m_EffList[i].m_Ext6ValueCount;j<m_EffList[i].m_Ext6ValueNum;j++) {
|
|
if(m_EffList[i].m_Ext6Value[j].m_SlideStartFrame != ESEMPTY) {
|
|
if(m_EffList[i].m_Ext6Value[j].m_SlideStartFrame <= m_lstEff[i]->GetFrame()) {
|
|
PlaySlide(i,j);
|
|
m_EffList[i].m_Ext6ValueCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//}
|
|
if(m_bVisibility) {
|
|
if(m_EffList[i].m_SnapNum > 0) { //snap effect play
|
|
for(j=m_EffList[i].m_SnapCount;j<m_EffList[i].m_SnapNum;j++) {
|
|
if(m_EffList[i].m_Snap[j].m_SnapStartFrame != ESEMPTY) {
|
|
if(m_EffList[i].m_Snap[j].m_SnapStartFrame <= m_lstEff[i]->GetFrame()) {
|
|
PlaySnap(i,j);
|
|
m_EffList[i].m_SnapCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} // if(m_bVisibility)
|
|
m_dwTick = timeGetTime();
|
|
if(m_dwTick - pEffect->GetTick() >= pEffect->GetFrameTick())
|
|
{
|
|
|
|
if(!pEffect->Interpolation(m_dwTick - pEffect->GetTick()))
|
|
{
|
|
del_count++;
|
|
|
|
delete pEffect;
|
|
pEffect = NULL;
|
|
m_lstEff[i] = NULL;
|
|
//m_lstEff[i]->SetEffectStart(false);
|
|
|
|
//m_lstEff.erase(&(m_lstEff[i]));
|
|
|
|
} else
|
|
{
|
|
|
|
pEffect->SetTick(m_dwTick);
|
|
}
|
|
}
|
|
}
|
|
}//for
|
|
/////////// Bezier Line update
|
|
if(m_bBezierMid) {
|
|
if((m_pBezierMid != NULL) && ((m_pBezierMid->m_pBezierLine) != NULL)) {
|
|
unsigned long tmp_tick = timeGetTime();
|
|
int extframe = 0;
|
|
|
|
if((m_pBezierMid->m_lTick) != 0) {
|
|
if((tmp_tick - m_pBezierMid->m_lTick) > DEFAULTESTICK) {
|
|
extframe = (int)((tmp_tick - m_pBezierMid->m_lTick)/ DEFAULTESTICK);
|
|
m_pBezierMid->m_lTick = tmp_tick;
|
|
}
|
|
}
|
|
else {
|
|
extframe = 1;
|
|
m_pBezierMid->m_lTick = tmp_tick;
|
|
}
|
|
for(int fr = 0;fr<extframe;fr++) {
|
|
m_pBezierMid->m_pBezierLine->UpdateLightning(pos_vec,true);
|
|
}
|
|
}
|
|
}
|
|
//////////
|
|
|
|
|
|
if(m_bExt5){ // extension5 일때 서서히 사라지는 라인
|
|
if(m_Ext5Value->m_bExt5ValueSet) {
|
|
unsigned long tmp_tick = timeGetTime();
|
|
int extframe = 0;
|
|
|
|
if((m_Ext5Value->m_UpdateTime) != 0) {
|
|
if((tmp_tick - m_Ext5Value->m_UpdateTime) > DEFAULTESTICK) {
|
|
extframe = (int)((tmp_tick - m_Ext5Value->m_UpdateTime)/ DEFAULTESTICK);
|
|
m_Ext5Value->m_UpdateTime = tmp_tick;
|
|
}
|
|
}
|
|
else {
|
|
extframe = 1;
|
|
m_Ext5Value->m_UpdateTime = tmp_tick;
|
|
}
|
|
for(int fr = 0;fr<extframe;fr++) {
|
|
for(int pa = 0;pa<4;pa++) {
|
|
if((pa == 0) || (pa == 2)) // 내쪽 정점
|
|
m_Ext5Value->m_PlaneAlpha[pa] -= 0.06f;
|
|
else // targer쪽 정점
|
|
m_Ext5Value->m_PlaneAlpha[pa] -= 0.04f;
|
|
if((m_Ext5Value->m_PlaneAlpha[pa]) <=0.0f) {
|
|
m_Ext5Value->m_PlaneAlpha[pa] = 0.0f;
|
|
}
|
|
m_Ext5Value->m_Plane[pa].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[pa]);
|
|
m_Ext5Value->m_Plane[pa+4].color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Ext5Value->m_PlaneAlpha[pa]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* for(int k=0;k<m_EffPlayData.m_EndEffIdNum;k++) {
|
|
if(m_ProcCount == EF) {
|
|
m_Wheel[k].SetEnd();
|
|
}
|
|
m_Wheel[k].SetVertexBuffer(0);
|
|
}
|
|
*/
|
|
} //if
|
|
if(del_count == m_lstEff.size()) {
|
|
del_count = 0;
|
|
|
|
m_CheckCrash = false;
|
|
// if(wend)
|
|
if(hit_return) {
|
|
hit_return = false;
|
|
return 2;
|
|
}
|
|
if(m_bExt5) { // extension 5 수행중이면 계속유지
|
|
if(m_Ext5Value->m_bExt5End == false) //끝났으면 0을 리턴 아니면 1 리턴
|
|
return 1;
|
|
}
|
|
return 0;
|
|
/* else
|
|
return 1;
|
|
*/
|
|
}
|
|
else {
|
|
del_count = 0;
|
|
if(crash) {
|
|
crash = false;
|
|
m_CheckCrash = true;
|
|
|
|
if(hit_return) {
|
|
hit_return = false;
|
|
return 2;
|
|
}
|
|
return 1; //충돌시 2return 하는것 취소
|
|
}
|
|
else{
|
|
m_CheckCrash = false;
|
|
if(hit_return) {
|
|
hit_return = false;
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
del_count = 0;
|
|
m_CheckCrash = false;
|
|
if(hit_return) {
|
|
hit_return = false;
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
void CEffScript::SetEffectRot(float x,float y,float z) {
|
|
m_WorldAxis[0] = x;
|
|
m_WorldAxis[1] = y;
|
|
m_WorldAxis[2] = z;
|
|
|
|
/*
|
|
for(int i=0;i<m_EffNum;i++) {
|
|
D3DXQUATERNION sqt;
|
|
quaternion sqtt;
|
|
D3DXQuaternionRotationYawPitchRoll(&sqt,D3DXToRadian(y),D3DXToRadian(x),D3DXToRadian(z));
|
|
sqtt.x = sqt.x;
|
|
sqtt.y = sqt.y;
|
|
sqtt.z = sqt.z;
|
|
sqtt.w = sqt.w;
|
|
|
|
m_lstEff[i]->SetAxis(&sqtt);
|
|
}*/
|
|
}
|
|
|
|
void CEffScript::Render() {
|
|
|
|
|
|
int i=0;
|
|
|
|
if(m_SubScriptNum) { // sub script 처리
|
|
for(i=0;i<m_CurrentSubScript;i++) {
|
|
if(m_SubScript != NULL)
|
|
{ // Sub Script Visibility Setting
|
|
m_SubScript[i].m_bVisibility = m_bVisibility;
|
|
m_SubScript[i].Render();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
|
|
if(m_bVisibility) { // Visibility 가 false이면 render 하지 않는다.
|
|
|
|
m_Device->SetVertexShader(LVERTEXFVF);
|
|
|
|
m_Device->SetTexture(0, NULL);
|
|
m_Device->SetTexture(1, NULL);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING, FALSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHAFUNC,D3DCMP_ALWAYS);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHAREF,0x00000000);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|
|
|
// interface effect 일 경우 z-buffer끔
|
|
if(m_ScriptValue == ESINTERFACE) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,FALSE);
|
|
}
|
|
for(i =0 ;i < m_lstEff.size();i++)
|
|
{
|
|
|
|
if(m_lstEff[i] == NULL)
|
|
continue;
|
|
if(!(m_lstEff[i]->GetEffectStart()))
|
|
continue;
|
|
//if(effectmap->EffectSectorIn(
|
|
//camera pos
|
|
matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition();
|
|
vector3 vecViewPos=matViewPosition->GetLoc();
|
|
|
|
int indexx=(int)(vecViewPos.x/SECTORSIZE);
|
|
int indexy=(int)(vecViewPos.z/SECTORSIZE);
|
|
|
|
if(m_EffList[i].m_bFogOff) // Fog off flag true
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE);
|
|
else
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
|
|
|
|
//culling
|
|
CSceneNode CheckNode;
|
|
|
|
CheckNode.m_fRad=100.0f;
|
|
CheckNode.m_AccumulateTM.Translation(*m_lstEff[i]->GetCenter());
|
|
m_lstEff[i]->SetScale(m_EffList[i].m_Scale,m_EffList[i].m_Scale,m_EffList[i].m_Scale);
|
|
if(m_lstEff[i]->map_effect == true) {
|
|
if(CheckNode.isCulling())
|
|
{
|
|
//if(effectmap->EffectSectorIn(indexx,indexy,i)) {
|
|
if(m_lstEff[i]) m_lstEff[i]->Render();
|
|
//}
|
|
|
|
}
|
|
}
|
|
else {
|
|
if(m_lstEff[i]) m_lstEff[i]->Render();
|
|
}
|
|
|
|
}
|
|
} //if(m_bVisibility)
|
|
|
|
if(m_bExt5) {
|
|
if(m_Ext5Value->m_bExt5ValueSet) { // 화살 라인 렌더링
|
|
RenderExt5();
|
|
}
|
|
}
|
|
if(m_bVisibility) { // Visibility 가 false이면 render 하지 않는다.
|
|
|
|
if(m_bLightning) {
|
|
RenderLightn();
|
|
}
|
|
if(m_bLightn2) {
|
|
RenderLightn2();
|
|
|
|
}
|
|
if(m_bLightn3) {
|
|
RenderLightn3();
|
|
}
|
|
if(m_bWheel) {
|
|
if(m_bWheelStart)
|
|
RenderWheel();
|
|
}
|
|
////////////// Bezier middle
|
|
if(m_bBezierMid && m_bBezierMidSet)
|
|
m_pBezierMid->m_pBezierLine->Render(0);
|
|
|
|
|
|
matrix matWorld;
|
|
matWorld.MakeIdent();
|
|
m_Device->SetTransform(D3DTS_WORLD, (D3DMATRIX *)&matWorld);
|
|
|
|
if(m_ScriptValue == ESINTERFACE) {
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
|
|
}
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::RenderExt5() { // 화살 라인 렌더링 Code
|
|
if(m_bVisibility) { // Visibility 가 false이면 render 하지 않는다.
|
|
|
|
DWORD cull,zbuffer;
|
|
|
|
D3DXMATRIX beforeworld;
|
|
m_Device->GetTransform(D3DTS_WORLD,&beforeworld);
|
|
m_Device->GetRenderState(D3DRS_CULLMODE,&cull);
|
|
m_Device->GetRenderState(D3DRS_ZWRITEENABLE,&zbuffer);
|
|
D3DXMATRIX world;
|
|
D3DXMatrixIdentity(&world);
|
|
m_Device->SetTransform(D3DTS_WORLD,&world);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
/* CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHAREF,0x00000000);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS);*/
|
|
/* CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
|
|
*/
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
|
|
|
|
m_Device->SetTexture(0,m_Ext5Value->m_PlaneTexture.GetTexture());
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
|
|
|
m_Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
|
|
|
|
m_Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,(void *)(m_Ext5Value->m_Plane),sizeof(CEffExt5Vertex));
|
|
m_Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,(void *)(&(m_Ext5Value->m_Plane[4])),sizeof(CEffExt5Vertex));
|
|
|
|
|
|
m_Device->SetTransform(D3DTS_WORLD,&beforeworld);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,cull);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,zbuffer);
|
|
}
|
|
|
|
int count = 0;
|
|
for(int i=0;i<4;i++) {
|
|
if(m_Ext5Value->m_PlaneAlpha[i] == 0.0f)
|
|
count++;
|
|
}
|
|
if(count == 4) // 라인이 완전히 사라졌을경우 끝났음을 세팅(메모리 해제용 flag)
|
|
m_Ext5Value->m_bExt5End = true;
|
|
}
|
|
//궤적 strip 그려줌
|
|
/*void CEffScript::RenderStrip(int index) {
|
|
|
|
}*/
|
|
void CEffScript::SetLight() { // Vertex Light Setting
|
|
int i,j;
|
|
if(m_iLight > 0) {
|
|
for(i=0;i<m_iLight;i++) {
|
|
|
|
for(j=0;j<m_EffNum;j++) {
|
|
if(!strcmp(m_EffList[j].m_EffName,m_pLight[i].m_strEff)) {
|
|
m_EffList[j].m_bLight = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CEffScript::PushEff() {
|
|
|
|
int i;
|
|
|
|
m_Device->GetTransform(D3DTS_VIEW, (D3DMATRIX *)&m_View);
|
|
// Vertex Light Setting
|
|
SetLight();
|
|
|
|
for(i=0;i<m_EffNum;i++) {
|
|
float tmp_frame = 0.0f;
|
|
CX3DEffect *tmp;
|
|
tmp = new CX3DEffect;
|
|
m_lstEff.push_back(tmp);
|
|
|
|
m_lstEff[i]->SetDevice(m_Device);
|
|
m_lstEff[i]->SetViewMatrix(&m_View);
|
|
m_lstEff[i]->SetEffectSetting();
|
|
m_lstEff[i]->SetScale(m_EffList[i].m_Scale,m_EffList[i].m_Scale,m_EffList[i].m_Scale);
|
|
// Light Setting
|
|
if(m_EffList[i].m_bLight) {
|
|
m_lstEff[i]->SetLight(true);
|
|
}
|
|
|
|
// extesion 1 : mid effect가 충돌한뒤에도 자기 생명이 끝날때 까지 유지
|
|
if(strstr(m_EffList[i].m_EffName,"EXT1_") != NULL)
|
|
m_bExt1 = true;
|
|
// extesion 2 : start effect가 계속 캐릭 방향에 따라 회전
|
|
if(strstr(m_EffList[i].m_EffName,"EXT2_") != NULL)
|
|
m_bExt2 = true;
|
|
// extesion 3 : aimed shot 용 particle 유지
|
|
if(strstr(m_EffList[i].m_EffName,"EXT3_") != NULL)
|
|
m_bExt3 = true;
|
|
// extesion 4 : effect 양도 플레그 (ex.화살 꽃히는 등의 용도)
|
|
if(strstr(m_EffList[i].m_EffName,"EXT4_") != NULL){
|
|
m_bExt4 = true;
|
|
m_bExt2 = true;
|
|
}
|
|
// extesion 5 : 화살 라인 그려주는 확장
|
|
if(strstr(m_EffList[i].m_EffName,"EXT5_") != NULL) {
|
|
m_bExt5 = true;
|
|
if(m_bExt5ex == false) {
|
|
m_Ext5Value = new CEffExt5;
|
|
}
|
|
}
|
|
//extension 7 : end pos 와 start pos 위치 swap
|
|
if(strstr(m_EffList[i].m_EffName,"EXT7_") != NULL) {
|
|
CZ3DGeneralChrModel *t_c;
|
|
m_bExt7 = true;
|
|
//start 와 end 위치 swap
|
|
D3DXVECTOR3 t_p = m_StartPos;
|
|
m_StartPos = m_EndPos[0];
|
|
m_EndPos[0] = t_p;
|
|
// start 와 end model swap
|
|
t_c = m_EndChr;
|
|
m_EndChr = m_StartChr;
|
|
m_StartChr = t_c;
|
|
}
|
|
//extension 8: 이 스크립트가 적용되는 캐릭터의 스캐일에 따라 effect 크기변화 적용
|
|
if(strstr(m_EffList[i].m_EffName,"EXT8_") != NULL) {
|
|
m_bExt8 = true;
|
|
if(m_StartChr != NULL) {
|
|
float human_size = 150.0f;
|
|
float chr_size = m_StartChr->GetSizeFactor();
|
|
float percentage = chr_size / human_size;
|
|
|
|
m_EffList[i].m_Scale *= percentage;
|
|
m_lstEff[i]->SetScale(m_EffList[i].m_Scale,m_EffList[i].m_Scale,m_EffList[i].m_Scale);
|
|
|
|
}
|
|
}
|
|
// extension 9: 이 캐릭터에 붙는 snap effect 가 이 이팩트가 끝나더라도 삭제 되지 않는다.
|
|
if(strstr(m_EffList[i].m_EffName,"EXT9_") != NULL) {
|
|
m_bExt9 = true;
|
|
}
|
|
if(strstr(m_EffList[i].m_EffName,"EXT10_") != NULL) { // fog off
|
|
m_EffList[i].m_bFogOff = true;
|
|
}
|
|
if(strstr(m_EffList[i].m_EffName,"EXT11_") != NULL) { // cull mode off
|
|
m_bSectorCull = false;
|
|
}
|
|
if(strstr(m_EffList[i].m_EffName,"EXT13_") != NULL) { // cull mode off
|
|
m_bFrustumCull = false;
|
|
|
|
}
|
|
tmp->Load(EFFECTPATH,m_EffList[i].m_EffName,m_bVisibility);
|
|
tmp->SetEffectStart(false);
|
|
tmp->SetMine(m_Mine);
|
|
|
|
if(m_TickFrame != DEFAULTESTICK) {
|
|
if((80 - m_TickFrame) <=0)
|
|
tmp_frame = 1;
|
|
else
|
|
tmp_frame = 80 - m_TickFrame;
|
|
tmp->SetFrameTick(tmp_frame);
|
|
}
|
|
// 시작 프레임 세팅
|
|
if((m_EffList[i].m_MinFrame) != ESEMPTY) {
|
|
m_lstEff[i]->SetMinFrame(m_EffList[i].m_MinFrame);
|
|
m_lstEff[i]->SetFrame(m_EffList[i].m_MinFrame);
|
|
}
|
|
// world effect 일때 flag setting
|
|
if(m_bWorldEffect)
|
|
m_lstEff[i]->SetWorldEffect(m_bWorldEffect);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
void CEffScript::SetChr(CZ3DGeneralChrModel *s,CZ3DGeneralChrModel *e) {
|
|
int i;
|
|
m_StartChr = s;
|
|
m_EndChr = e;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetChr(s,e);
|
|
}
|
|
|
|
}
|
|
void CEffScript::SetChrFwd(float x,float y,float z) {
|
|
int i;
|
|
m_ChrFwd.x = x;
|
|
m_ChrFwd.y = y;
|
|
m_ChrFwd.z = z;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetChrFwd(x,y,z);
|
|
}
|
|
}
|
|
void CEffScript::SetExt4Ptr(CEffScript *ptr) { // extesin4 용 pointer setting
|
|
int i;
|
|
m_Ext4Ptr = ptr;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetExt4Ptr(ptr);
|
|
}
|
|
}
|
|
void CEffScript::SetCast(bool t) {
|
|
int i;
|
|
m_bCast = t;
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetCast(t);
|
|
}
|
|
}
|
|
void CEffScript::SetExt4SelfInfo(D3DXQUATERNION rot) {
|
|
int i;
|
|
m_bExt4InfoSet = true;
|
|
|
|
m_Ext4Quat.x = rot.x;
|
|
m_Ext4Quat.y = rot.y;
|
|
m_Ext4Quat.z = rot.z;
|
|
m_Ext4Quat.w = rot.w;
|
|
for(i = 0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetExt4SelfInfo(rot);
|
|
}
|
|
|
|
}
|
|
void CEffScript::SetExt4Rot(D3DXQUATERNION rot) {
|
|
int i;
|
|
m_Ext4Object = rot;
|
|
for(i = 0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetExt4Rot(rot);
|
|
}
|
|
|
|
}
|
|
void CEffScript::SetExt4Info(int pivotnum,D3DXQUATERNION rot) { //extension 4 용 data setting
|
|
if(m_Ext4Ptr != NULL) {
|
|
m_Ext4Ptr->m_Ext4Pivot = pivotnum;
|
|
m_Ext4Ptr->m_Ext4Quat.x = rot.x;
|
|
m_Ext4Ptr->m_Ext4Quat.y = rot.y;
|
|
m_Ext4Ptr->m_Ext4Quat.z = rot.z;
|
|
m_Ext4Ptr->m_Ext4Quat.w = rot.w;
|
|
m_Ext4Ptr->m_bExt4InfoSet = true;
|
|
}
|
|
}
|
|
void CEffScript::PlayTime() { // 시간적용 되었을때를 위해 미리 준비
|
|
|
|
float fCurrentTime = CSceneManager::GetWeatherTime();
|
|
|
|
if(m_bPlayTime) {
|
|
// 시간 돌아가는 순서를 알기 위해
|
|
int sub = m_iStartPlayTime - m_iEndPlayTime;
|
|
|
|
if(sub > 0 ) { // 큰시간부터 돌아갈때 ex) 23~5
|
|
if( (fCurrentTime > (float)m_iEndPlayTime) && ( fCurrentTime < (float)m_iStartPlayTime))
|
|
m_bVisTime = false;
|
|
else
|
|
m_bVisTime = true;
|
|
}
|
|
else {
|
|
if( (fCurrentTime >= (float)m_iStartPlayTime) && ( fCurrentTime <= (float)m_iEndPlayTime))
|
|
m_bVisTime = true;
|
|
else
|
|
m_bVisTime = false;
|
|
}
|
|
|
|
}
|
|
}
|
|
void CEffScript::SetScale(float fScale) {
|
|
int i;
|
|
|
|
if(m_EffList != NULL) {
|
|
for( i = 0; i < m_EffNum; i++ ) {
|
|
m_EffList[i].m_Scale = fScale;
|
|
}
|
|
}
|
|
for(i=0;i<m_SubScriptNum;i++) {
|
|
if(m_SubScript != NULL)
|
|
m_SubScript[i].SetScale(fScale);
|
|
}
|
|
|
|
} |