Restructure repository to include all source folders
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>
This commit is contained in:
354
GameTools/WORLDCREATOR/PageGCMDSListContainer.cpp
Normal file
354
GameTools/WORLDCREATOR/PageGCMDSListContainer.cpp
Normal file
@@ -0,0 +1,354 @@
|
||||
// PageGCMDSListContainer.cpp : implementation file
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "worldcreator.h"
|
||||
#include "PageGCMDSListContainer.h"
|
||||
#include "SimpleParser.h"
|
||||
#include "Z3DGeneralChrModel.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CPageGCMDSListContainer property page
|
||||
|
||||
IMPLEMENT_DYNCREATE(CPageGCMDSListContainer, CPropertyPage)
|
||||
|
||||
CPageGCMDSListContainer::CPageGCMDSListContainer() : CPropertyPage(CPageGCMDSListContainer::IDD)
|
||||
{
|
||||
//{{AFX_DATA_INIT(CPageGCMDSListContainer)
|
||||
// NOTE: the ClassWizard will add member initialization here
|
||||
//}}AFX_DATA_INIT
|
||||
|
||||
m_pDlgChrOutfit = NULL;
|
||||
m_pDlgEditGCMDS = NULL;
|
||||
m_bEditGCMDSMode = false;
|
||||
|
||||
m_pChrModel = NULL;
|
||||
}
|
||||
|
||||
CPageGCMDSListContainer::~CPageGCMDSListContainer()
|
||||
{
|
||||
SAFE_DELETE( m_pDlgChrOutfit );
|
||||
|
||||
SAFE_DELETE( m_pChrModel );
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CPropertyPage::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(CPageGCMDSListContainer)
|
||||
DDX_Control(pDX, IDC_TREEGCMDSLIST, m_TreeGCMDSList);
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(CPageGCMDSListContainer, CPropertyPage)
|
||||
//{{AFX_MSG_MAP(CPageGCMDSListContainer)
|
||||
ON_WM_DESTROY()
|
||||
ON_NOTIFY(NM_DBLCLK, IDC_TREEGCMDSLIST, OnDblclkTreegcmdslist)
|
||||
ON_NOTIFY(TVN_KEYDOWN, IDC_TREEGCMDSLIST, OnKeydownTreegcmdslist)
|
||||
ON_WM_PARENTNOTIFY()
|
||||
ON_MESSAGE(WM_CHILD_CLOSE, OnChildClose)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CPageGCMDSListContainer message handlers
|
||||
|
||||
BOOL CPageGCMDSListContainer::OnInitDialog()
|
||||
{
|
||||
CPropertyPage::OnInitDialog();
|
||||
|
||||
// TODO: Add extra initialization here
|
||||
m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) );
|
||||
m_TreeGCMDSList.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL );
|
||||
|
||||
CWorldCreatorApp* pApp = (CWorldCreatorApp*)AfxGetApp();
|
||||
CString strTmp;
|
||||
strTmp.Format( "%s\\GCMDSIndex.txt", pApp->m_strAppPath );
|
||||
LoadGCMDSIndex( strTmp );
|
||||
|
||||
m_pDlgChrOutfit = new CDlgChrOutfit;
|
||||
m_pDlgChrOutfit->Create(this);
|
||||
m_pDlgChrOutfit->SetWindowPos( NULL, 0, 640, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
|
||||
|
||||
m_pDlgEditGCMDS = new CDlgEditGCMDS;
|
||||
m_pDlgEditGCMDS->Create(this);
|
||||
m_pDlgEditGCMDS->SetWindowPos( NULL, 0, 200, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
// EXCEPTION: OCX Property Pages should return FALSE
|
||||
}
|
||||
|
||||
bool CPageGCMDSListContainer::LoadGCMDSIndex(const char *szFilename)
|
||||
{
|
||||
CSimpleParser parser;
|
||||
std::vector<const char*> vecGCMDSName;
|
||||
|
||||
if( false == parser.OpenFile( szFilename, NULL ) )
|
||||
{
|
||||
FILE* fp = fopen( szFilename, "wt" );
|
||||
if( NULL == fp )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
fclose( fp ); // just creating empty file
|
||||
}
|
||||
|
||||
m_TreeGCMDSList.DeleteAllItems();
|
||||
|
||||
char* szToken;
|
||||
HTREEITEM hParent = NULL; // root
|
||||
HTREEITEM hItem;
|
||||
/*CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||||
CWorldCreatorView* pView = pMainFrame->GetActiveView();
|
||||
CCharacterControl& rChrControl = pView->m_ChrManager;*/
|
||||
|
||||
CZ3DGeneralChrModel::_RetrieveCMDSNameList( vecGCMDSName );
|
||||
|
||||
|
||||
while( szToken = parser.GetNextToken() )
|
||||
{
|
||||
if( 0 == stricmp( szToken, "*" ) ) // begin with asterisk -> group name
|
||||
{
|
||||
szToken = parser.GetNextToken();
|
||||
|
||||
hItem = m_TreeGCMDSList.InsertItem(
|
||||
TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
|
||||
szToken, 0, 0, 0, 0, 0, hParent, TVI_LAST );
|
||||
hParent = hItem;
|
||||
}
|
||||
else if( 0 == stricmp( ";", szToken ) )
|
||||
{
|
||||
hParent = m_TreeGCMDSList.GetParentItem( hParent );
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<const char*>::iterator it;
|
||||
|
||||
for( it = vecGCMDSName.begin(); it != vecGCMDSName.end(); it++ )
|
||||
{
|
||||
if( 0 == stricmp( *it, szToken ) )
|
||||
{
|
||||
vecGCMDSName.erase( it );
|
||||
|
||||
hItem = m_TreeGCMDSList.InsertItem(
|
||||
TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
|
||||
szToken, 1, 1, 0, 0, 1, hParent, TVI_LAST );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( int i = 0; i < vecGCMDSName.size(); ++i )
|
||||
{
|
||||
hItem = m_TreeGCMDSList.InsertItem(
|
||||
TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
|
||||
vecGCMDSName[i], 1, 1, 0, 0, 1, NULL, TVI_LAST );
|
||||
}
|
||||
|
||||
//m_TreeGCMDSList.SortChildren( NULL );
|
||||
|
||||
|
||||
parser.Close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::OnDestroy()
|
||||
{
|
||||
CPropertyPage::OnDestroy();
|
||||
|
||||
// TODO: Add your message handler code here
|
||||
CWorldCreatorApp* pApp = (CWorldCreatorApp*)AfxGetApp();
|
||||
CString strTmp;
|
||||
strTmp.Format( "%s\\GCMDSIndex.txt", pApp->m_strAppPath );
|
||||
|
||||
SaveGCMDSIndex( strTmp );
|
||||
|
||||
m_pDlgChrOutfit->DestroyWindow();
|
||||
}
|
||||
|
||||
|
||||
static void PrintIndent( const int n, FILE* fp )
|
||||
{
|
||||
for( int i = 0; i < n; ++i )
|
||||
{
|
||||
fprintf( fp, "\t" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CPageGCMDSListContainer::SaveGCMDSIndex(const char *szFilename)
|
||||
{
|
||||
FILE* fp;
|
||||
|
||||
fp = fopen( szFilename, "wt" );
|
||||
|
||||
if( NULL == fp )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int nIndent = 0;
|
||||
HTREEITEM hItem = m_TreeGCMDSList.GetChildItem( NULL );
|
||||
HTREEITEM hParent = NULL;
|
||||
char szTmp[300];
|
||||
TVITEM tvitem;
|
||||
tvitem.mask = TVIF_PARAM | TVIF_TEXT;
|
||||
tvitem.pszText = szTmp;
|
||||
tvitem.cchTextMax = 300;
|
||||
|
||||
while( !(NULL == hItem && hParent == NULL) )
|
||||
{
|
||||
if( hItem )
|
||||
{
|
||||
tvitem.hItem = hItem;
|
||||
m_TreeGCMDSList.GetItem( &tvitem );
|
||||
if( 0 == tvitem.lParam ) // group name
|
||||
{
|
||||
PrintIndent( nIndent, fp );
|
||||
fprintf( fp, "*%s\n", szTmp );
|
||||
++nIndent;
|
||||
hParent = hItem;
|
||||
hItem = m_TreeGCMDSList.GetChildItem( hItem );
|
||||
}
|
||||
else if( 1 == tvitem.lParam ) // file name
|
||||
{
|
||||
PrintIndent( nIndent, fp );
|
||||
fprintf( fp, "%s\n", szTmp );
|
||||
hItem = m_TreeGCMDSList.GetNextSiblingItem( hItem );
|
||||
}
|
||||
}
|
||||
|
||||
if( NULL == hItem )
|
||||
{
|
||||
if( NULL != hParent )
|
||||
{
|
||||
// move up 1 level
|
||||
hItem = m_TreeGCMDSList.GetNextSiblingItem( hParent );
|
||||
hParent = m_TreeGCMDSList.GetParentItem( hParent );
|
||||
PrintIndent( --nIndent, fp );
|
||||
fprintf( fp, ";\n" );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::OnDblclkTreegcmdslist(NMHDR* pNMHDR, LRESULT* pResult)
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
BeginGCMDSEdit();
|
||||
|
||||
*pResult = 0;
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::OnKeydownTreegcmdslist(NMHDR* pNMHDR, LRESULT* pResult)
|
||||
{
|
||||
TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
|
||||
// TODO: Add your control notification handler code here
|
||||
|
||||
if( VK_RETURN == pTVKeyDown->wVKey )
|
||||
{
|
||||
BeginGCMDSEdit();
|
||||
}
|
||||
|
||||
*pResult = 0;
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::BeginGCMDSEdit()
|
||||
{
|
||||
TVITEM tvitem;
|
||||
char szTmp[300];
|
||||
|
||||
POINT pt;
|
||||
::GetCursorPos( &pt );
|
||||
m_TreeGCMDSList.ScreenToClient( &pt );
|
||||
UINT uFlag = TVHT_ONITEM;
|
||||
tvitem.hItem = m_TreeGCMDSList.HitTest( CPoint(pt), &uFlag );
|
||||
//tvitem.hItem = m_TreeGCMDSList.GetSelectedItem();
|
||||
if( NULL == tvitem.hItem )
|
||||
{
|
||||
return;
|
||||
}
|
||||
tvitem.mask = TVIF_TEXT | TVIF_PARAM;
|
||||
tvitem.pszText = szTmp;
|
||||
tvitem.cchTextMax = 300;
|
||||
|
||||
m_TreeGCMDSList.GetItem( &tvitem );
|
||||
if( 0 == tvitem.lParam ) // lParam == 0 -> group name
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_pDlgEditGCMDS->SetGCMDSFile( tvitem.pszText );
|
||||
|
||||
m_bEditGCMDSMode = true;
|
||||
m_pDlgEditGCMDS->ShowWindow(SW_SHOW);
|
||||
m_TreeGCMDSList.EnableWindow( FALSE );
|
||||
|
||||
|
||||
//CMainFrame *mf = (CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||||
//CWorldCreatorView* av = (CWorldCreatorView*)mf->GetActiveView();
|
||||
//av->m_ChrManager.
|
||||
CZ3DCharacterModel::GetTotalCharacterCount();
|
||||
|
||||
m_pChrModel = new CZ3DEditorGeneralChrModel;
|
||||
m_pChrModel->Init( tvitem.pszText );
|
||||
}
|
||||
|
||||
void CPageGCMDSListContainer::EndGCMDSEdit()
|
||||
{
|
||||
SAFE_DELETE( m_pChrModel );
|
||||
m_bEditGCMDSMode = false;
|
||||
m_pDlgEditGCMDS->ShowWindow(SW_HIDE);
|
||||
m_TreeGCMDSList.EnableWindow( TRUE );
|
||||
}
|
||||
|
||||
BOOL CPageGCMDSListContainer::OnSetActive()
|
||||
{
|
||||
// TODO: Add your specialized code here and/or call the base class
|
||||
m_pDlgChrOutfit->ShowWindow(SW_SHOW);
|
||||
|
||||
if( m_bEditGCMDSMode )
|
||||
{
|
||||
m_pDlgEditGCMDS->ShowWindow(SW_SHOW);
|
||||
}
|
||||
|
||||
return CPropertyPage::OnSetActive();
|
||||
}
|
||||
|
||||
BOOL CPageGCMDSListContainer::OnKillActive()
|
||||
{
|
||||
// TODO: Add your specialized code here and/or call the base class
|
||||
m_pDlgChrOutfit->ShowWindow(SW_HIDE);
|
||||
m_pDlgEditGCMDS->ShowWindow(SW_HIDE);
|
||||
|
||||
return CPropertyPage::OnKillActive();
|
||||
}
|
||||
|
||||
LRESULT CPageGCMDSListContainer::OnChildClose(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if( (CDlgEditGCMDS*)wParam == m_pDlgEditGCMDS )
|
||||
{
|
||||
EndGCMDSEdit();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user