📄 charmakemanager.cpp
字号:
#include "stdafx.h"
#include "Hero.h"
#include "CharMakeManager.h"
#include "GameResourceManager.h"
#include "CharMake.h"
#include "windowidenum.h"
#include "cComboBoxEx.h"
#include "ObjectManager.h"
#include "MoveManager.h"
#include "HelperManager.h"
#include "CharMakeDialog.h"
#include "interface/cGuageBar.h"
GLOBALTON(cCharMakeManager)
cCharMakeManager::cCharMakeManager()
{
m_bInit = FALSE;
}
cCharMakeManager::~cCharMakeManager()
{
}
void cCharMakeManager::Init()
{
m_pNewPlayer = NULL;
memset(&m_CharMakeInfo, 0, sizeof(CHARACTERMAKEINFO));
LoadUserSelectOption(); // ³»¿ëÀ» Àоî¿Â´Ù.
SetUserSelectOption(); // ³»¿ëÀ» ¼ÂÆÃÇÑ´Ù.
m_fAngle = 70;
m_fOldX = 0.0f;
m_bInit = TRUE;
m_pHeight = (cGuageBar*)CHARMAKE->GetCharMakeDialog()->GetWindowForID(CMID_Height);
m_pWidth = (cGuageBar*)CHARMAKE->GetCharMakeDialog()->GetWindowForID(CMID_Width);
}
void cCharMakeManager::Release()
{
for(int i=0;i<CE_MAX;++i)
{
if( !m_UserSelectOption[i].IsEmpty() )
{
PTRLISTSEARCHSTART(m_UserSelectOption[i],CM_OPTION*,Value)
delete Value;
PTRLISTSEARCHEND
m_UserSelectOption[i].RemoveAll();
}
}
}
void cCharMakeManager::ComboBoxResetAll()
{
// ¼ºº°,Áö¿ªÀº ¸®¼ÂÇÏÁö ¾Ê´Â´Ù.
cComboBoxEx* pCombo = NULL;
for(int i=0;i<CE_MAX;++i)
{
if( !m_UserSelectOption[i].IsEmpty() && i != CE_SEX && i != CE_AREA)
{
PTRLISTPOS pos = m_UserSelectOption[i].GetHeadPosition();
CM_OPTION* Value = (CM_OPTION*)m_UserSelectOption[i].GetAt(pos);
pCombo = (cComboBoxEx*)Value->pDescCombo;
pCombo->SelectComboText(0);
}
}
}
void cCharMakeManager::LoadUserSelectOption()
{
int idx = 0;
int num = 0;
char ComboId[64];
CMHFile file;
#ifdef _FILE_BIN_
if(!file.Init(PATH_UOPTION, "rb")) return;
#else
if(!file.Init(PATH_UOPTION, "rt")) return;
#endif
while(1)
{
if( idx >= CE_MAX || file.IsEOF()) break;
num = file.GetInt(); // ¼±Åà ¿É¼ÇÀÇ °¹¼ö
strcpy(ComboId, file.GetString());
for( int i=0;i<num;++i)
{
CM_OPTION* option = new CM_OPTION;
strcpy(option->strName, file.GetString());
option->dwData = file.GetDword();
option->dwHelperData = file.GetDword();
option->pDescCombo = CHARMAKE->GetCharMakeDialog()->GetWindowForID( IDSEARCH(ComboId) );
m_UserSelectOption[idx].AddTail(option);
}
++idx;
}
}
void cCharMakeManager::SetUserSelectOption()
{
cComboBoxEx* pCombo = NULL;
OPTIONITEM * pItem = NULL;
for(int i=0;i<CE_MAX;++i)
{
if( !m_UserSelectOption[i].IsEmpty() )
{
DWORD MaxOption = 0;
PTRLISTSEARCHSTART(m_UserSelectOption[i],CM_OPTION*,Value)
pCombo = (cComboBoxEx*)Value->pDescCombo;
pItem = new OPTIONITEM;
pItem->wComboType = i;
strcpy(pItem->string, Value->strName);
pItem->dwData = Value->dwData;
if( Value->dwHelperData != 0 )
pItem->nExtData = Value->dwHelperData;
pCombo->AddItem(pItem);
++MaxOption;
PTRLISTSEARCHEND
if(pItem->wComboType == CE_AREA)
{
//WORD randarea = rand()%MaxOption;
WORD randarea = MaxOption-1; //µ·È²(³·)À» ±âº»°ªÀ¸·Î ¹Ù²Û´Ù.
pCombo->SelectComboText(randarea);
ReplaceCharMakeInfo(i, randarea);
}
else
{
pCombo->SelectComboText(0);
ReplaceCharMakeInfo(i, 0);
}
}
}
// for(int i=0;i<CE_MAX;++i)
// ReplaceCharMakeInfo(i, 0);
m_CharMakeInfo.Height = 1;
m_CharMakeInfo.Width = 1;
}
BOOL cCharMakeManager::ReplaceCharMakeInfo(int idx, WORD wValue )
{
PTRLISTPOS pos = m_UserSelectOption[idx].FindIndex( wValue );
if( !pos ) return FALSE;
CM_OPTION* option = (CM_OPTION*)m_UserSelectOption[idx].GetAt(pos);
if( !option ) return FALSE;
DWORD value = option->dwData;
switch(idx)
{
/*
case CE_JOB:
{
if( m_CharMakeInfo.JobType == value ) return FALSE;
m_CharMakeInfo.JobType = (BYTE)value;
if( HELPERMGR->IsCompleteInit() )
HELPERMGR->ChangeSpeechDlg( option->dwHelperData );
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->Job = (BYTE)value;
}
break;
*/
case CE_SEX:
{
if( m_CharMakeInfo.SexType == value ) return FALSE;
m_CharMakeInfo.SexType = (BYTE)value;
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->Gender = (BYTE)value;
for(int i=0; i<CE_MAX;++i)
{
if(i != CE_SEX && i != CE_AREA)
ReplaceCharMakeInfo(i, 0);
}
ComboBoxResetAll();
CHARMAKE->GetCharMakeDialog()->ChangeComboStatus((unsigned short)value);
// CreateNewCharacter(); // ¼ºº°ÀÌ ¹Ù²î¸é »õ·Î »ý¼ºÇÑ´Ù.
if( m_pNewPlayer ) //Á¸ÀçÇϸé Á¦°Å ÇÑ´Ù.
{
OBJECTMGR->AddGarbageObject( (CObject*)m_pNewPlayer );
m_pNewPlayer = NULL;
}
}
return FALSE; // »õ·Î »ý¼ºÇÒ °æ¿ì´Â AddCharacterPartChange ¸¦ ÇÏÁö ¾Ê´Â´Ù.
case CE_MHAIR:
case CE_WMHAIR:
{
if( m_CharMakeInfo.HairType == value ) return FALSE;
m_CharMakeInfo.HairType = (BYTE)value;
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->HairType = (BYTE)value;
return TRUE;
}
break;
case CE_MFACE:
case CE_WMFACE:
{
if( m_CharMakeInfo.FaceType == value ) return FALSE;
m_CharMakeInfo.FaceType = (BYTE)value;
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->FaceType = (BYTE)value;
return TRUE;
}
break;
case CE_WEAR:
{
if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress] == value ) return FALSE;
m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress] = (WORD)value;
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Dress] = (WORD)value;
return TRUE;
}
break;
case CE_BOOT:
{
if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes] == value ) return FALSE;
m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes] = (WORD)value;
if( m_pNewPlayer )
m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Shoes] = (WORD)value;
return TRUE;
}
break;
case CE_WEAPON:
{
if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon] == value ) return FALSE;
m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon] = (WORD)value;
// if( HELPERMGR->IsCompleteInit() )
if( m_bInit )
HELPERMGR->ChangeSpeechDlg( option->dwHelperData, FALSE );
if( m_pNewPlayer )
{
m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Weapon] = (WORD)value;
m_pNewPlayer->ChangeMotion(eMotion_Battle_Gum_Standard + wValue, 1);
m_pNewPlayer->ChangeBaseMotion(eMotion_Battle_Gum_Standard + wValue);
}
return TRUE;
}
break;
case CE_AREA:
{
m_CharMakeInfo.StartArea = (BYTE)value;
}
break;
}
return FALSE;
}
void cCharMakeManager::CreateNewCharacter()
{
VECTOR3 pos;
m_fAngle = 0;
pos.x = 24483;
pos.y = 5910;
pos.z = 8230;
BASEOBJECT_INFO sBaseInfo;
CHARACTER_TOTALINFO sTotalInfo;
memset(&sBaseInfo, 0, sizeof(BASEOBJECT_INFO));
memset(&sTotalInfo, 0, sizeof(CHARACTER_TOTALINFO));
sBaseInfo.dwObjectID = 1;
strcpy( sBaseInfo.ObjectName, "NewCharacter" );
sBaseInfo.ObjectState = 1;
// sTotalInfo.Job = m_CharMakeInfo.JobType;
sTotalInfo.HairType = m_CharMakeInfo.HairType;
sTotalInfo.FaceType = m_CharMakeInfo.FaceType;
sTotalInfo.Gender = m_CharMakeInfo.SexType;
sTotalInfo.WearedItemIdx[eWearedItem_Dress] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress];
sTotalInfo.WearedItemIdx[eWearedItem_Shoes] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes];
sTotalInfo.WearedItemIdx[eWearedItem_Weapon] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon];
sTotalInfo.Height = m_CharMakeInfo.Height;
sTotalInfo.Width = m_CharMakeInfo.Width;
sTotalInfo.bVisible = TRUE;
m_pNewPlayer = OBJECTMGR->AddPlayer(&sBaseInfo,NULL,&sTotalInfo);
m_pNewPlayer->GetEngineObject()->ApplyHeightField(FALSE);
m_pNewPlayer->SetOverInfoOption(0);
// m_pNewPlayer->SetPosition(&pos);
// m_pNewPlayer->SetAngle(m_fAngle); // ¹æÇâ µ¹¸®±â
MOVEMGR->SetPosition( m_pNewPlayer, &pos );
MOVEMGR->SetAngle( m_pNewPlayer, m_fAngle, 0 );
m_pNewPlayer->ChangeMotion(eMotion_Battle_Gum_Standard ,1);
m_pNewPlayer->ChangeBaseMotion(eMotion_Battle_Gum_Standard);
}
void cCharMakeManager::NewCharacterRotate( int x )
{
if( !m_pNewPlayer ) return;
m_fAngle -= x*CHARROTATE_RATE*30;
if( m_fAngle >= 360 )
m_fAngle = 0;
// m_pNewPlayer->SetAngle( m_fAngle );
MOVEMGR->SetAngle( m_pNewPlayer, m_fAngle, 0 );
}
void cCharMakeManager::ApplyScale()
{
m_CharMakeInfo.Height = 0.9 + m_pHeight->GetCurRate()*0.2;
m_CharMakeInfo.Width = 0.9 + m_pWidth->GetCurRate()*0.2;
//½ºÄÉÀÏ
VECTOR3 scale;
SetVector3(&scale,
m_CharMakeInfo.Width,
m_CharMakeInfo.Height,
m_CharMakeInfo.Width);
m_pNewPlayer->GetEngineObject()->SetScale(&scale);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -