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>
325 lines
7.8 KiB
C++
325 lines
7.8 KiB
C++
// PageGCMDSOutfitSet.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "worldcreator.h"
|
|
#include "PageGCMDSOutfitSet.h"
|
|
|
|
#include "SimpleParser.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPageGCMDSOutfitSet property page
|
|
|
|
IMPLEMENT_DYNCREATE(CPageGCMDSOutfitSet, CPropertyPage)
|
|
|
|
CPageGCMDSOutfitSet::CPageGCMDSOutfitSet() : CPropertyPage(CPageGCMDSOutfitSet::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CPageGCMDSOutfitSet)
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_rpGCMDS = NULL;
|
|
}
|
|
|
|
CPageGCMDSOutfitSet::~CPageGCMDSOutfitSet()
|
|
{
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPageGCMDSOutfitSet)
|
|
DDX_Control(pDX, IDC_CHECK_LINK, m_ctrlLink);
|
|
DDX_Control(pDX, IDC_TREE_OUTFITSET, m_ctrlOutfitSetTree);
|
|
DDX_Control(pDX, IDC_LIST_MESHTEXTURE, m_ctrlMeshTexture);
|
|
DDX_Control(pDX, IDC_COMBO_OUTFITSLOT, m_ctrlOutfitSlot);
|
|
DDX_Control(pDX, IDC_COMBO_OUTFIT, m_ctrlOutfit);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPageGCMDSOutfitSet, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CPageGCMDSOutfitSet)
|
|
ON_BN_CLICKED(IDC_CHECK_LINK, OnCheckLink)
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_OUTFITSET, OnSelchangedTreeOutfitset)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPageGCMDSOutfitSet message handlers
|
|
|
|
BOOL CPageGCMDSOutfitSet::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) );
|
|
m_ctrlOutfitSetTree.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL );
|
|
|
|
DWORD dwExtStyle;
|
|
dwExtStyle = m_ctrlMeshTexture.GetExtendedStyle();
|
|
dwExtStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;
|
|
m_ctrlMeshTexture.SetExtendedStyle( dwExtStyle );
|
|
m_ctrlMeshTexture.InsertColumn( 0, "Mesh", LVCFMT_LEFT, 110 );
|
|
m_ctrlMeshTexture.InsertColumn( 1, "Texture", LVCFMT_LEFT, 110 );
|
|
|
|
ToggleByLinkState();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::UpdateDataByGCMDS( CZ3DGCMDS* pGCMDS )
|
|
{
|
|
if( NULL == pGCMDS )
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_rpGCMDS = pGCMDS;
|
|
|
|
UpdateOufitSetList( pGCMDS );
|
|
UpdateLinkComboBox( pGCMDS );
|
|
UpdateOutfitSetProperty( NULL );
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::UpdateLinkComboBox( CZ3DGCMDS* pGCMDS )
|
|
{
|
|
m_ctrlOutfitSlot.ResetContent();
|
|
m_ctrlOutfit.ResetContent();
|
|
|
|
std::vector<Z3DTOK>* pSlot;
|
|
std::vector<long>* pSlotOC;
|
|
pGCMDS->RetrieveOutfitSlot( pSlot, pSlotOC );
|
|
for( int i = 0; i < pSlot->size(); ++i )
|
|
{
|
|
m_ctrlOutfitSlot.InsertString( -1, g_TokSlotName.GetString( (*pSlot)[i] ) );
|
|
}
|
|
|
|
std::map<Z3DTOK, Z3DOUTFITINFO*>* pMap;
|
|
std::map<Z3DTOK, Z3DOUTFITINFO*>::iterator it;
|
|
pGCMDS->RetrieveOutfitList( pMap );
|
|
for( it = pMap->begin(); it != pMap->end(); ++it )
|
|
{
|
|
m_ctrlOutfit.InsertString( -1, g_TokOutfitName.GetString( it->first ) );
|
|
}
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::UpdateOufitSetList( CZ3DGCMDS* pGCMDS )
|
|
{
|
|
CSimpleParser parser;
|
|
CString strIndexFileName(pGCMDS->GetNameString());
|
|
strIndexFileName += "_outfit_index.txt";
|
|
|
|
if( false == parser.OpenFile( strIndexFileName, NULL ) )
|
|
{
|
|
FILE* fp = fopen( strIndexFileName, "wt" );
|
|
if( NULL == fp )
|
|
{
|
|
return;
|
|
}
|
|
|
|
fclose( fp ); // just creating empty file
|
|
parser.OpenFile( strIndexFileName, NULL );
|
|
}
|
|
|
|
m_ctrlOutfitSetTree.DeleteAllItems();
|
|
|
|
char* szToken;
|
|
HTREEITEM hParent = NULL; // root
|
|
HTREEITEM hItem;
|
|
std::map<Z3DTOK, Z3DOUTFITINFO*>* pmap;
|
|
|
|
pGCMDS->RetrieveOutfitList( pmap );
|
|
std::map<Z3DTOK, Z3DOUTFITINFO*> mapTok2OutfitInfo( *pmap );
|
|
std::map<Z3DTOK, Z3DOUTFITINFO*>::iterator it;
|
|
|
|
while( szToken = parser.GetNextToken() )
|
|
{
|
|
if( 0 == stricmp( szToken, "*" ) ) // begin with asterisk -> group name
|
|
{
|
|
szToken = parser.GetNextToken();
|
|
|
|
hItem = m_ctrlOutfitSetTree.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_ctrlOutfitSetTree.GetParentItem( hParent );
|
|
}
|
|
else
|
|
{
|
|
Z3DTOK tok = g_TokOutfitName.GetTOK( szToken );
|
|
it = mapTok2OutfitInfo.find( tok );
|
|
if( mapTok2OutfitInfo.end() != it )
|
|
{
|
|
hItem = m_ctrlOutfitSetTree.InsertItem(
|
|
TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
|
|
szToken, 1, 1, 0, 0, (LPARAM)(it->second), hParent, TVI_LAST );
|
|
|
|
mapTok2OutfitInfo.erase( it );
|
|
}
|
|
}
|
|
}
|
|
|
|
for( it = mapTok2OutfitInfo.begin(); it != mapTok2OutfitInfo.end(); ++it )
|
|
{
|
|
hItem = m_ctrlOutfitSetTree.InsertItem(
|
|
TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
|
|
g_TokOutfitName.GetString(it->first), 1, 1, 0, 0, (LPARAM)(it->second),
|
|
NULL, TVI_LAST );
|
|
}
|
|
|
|
parser.Close();
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::UpdateOutfitSetProperty( Z3DOUTFITINFO* pOutfitInfo )
|
|
{
|
|
m_ctrlMeshTexture.DeleteAllItems();
|
|
m_ctrlOutfitSlot.SetCurSel( -1 );
|
|
m_ctrlOutfit.SetCurSel( -1 );
|
|
|
|
if( NULL == pOutfitInfo )
|
|
{
|
|
m_ctrlLink.SetCheck( 0 );
|
|
ToggleByLinkState();
|
|
|
|
return;
|
|
}
|
|
|
|
for( int i = 0; i < pOutfitInfo->lCount; ++i )
|
|
{
|
|
m_ctrlMeshTexture.InsertItem( i, g_TokFileName.GetString( pOutfitInfo->pTokMeshName[i] ) );
|
|
m_ctrlMeshTexture.SetItemText( i, 1, g_TokFileName.GetString( pOutfitInfo->pTokTextureName[i] ) );
|
|
}
|
|
|
|
if( NULL_TOK == pOutfitInfo->tokLinkSlot )
|
|
{
|
|
m_ctrlOutfit.SetCurSel( -1 );
|
|
m_ctrlOutfitSlot.SetCurSel( -1 );
|
|
|
|
m_ctrlLink.SetCheck( 0 );
|
|
}
|
|
else
|
|
{
|
|
int nIdx = m_ctrlOutfitSlot.FindStringExact(-1, g_TokSlotName.GetString(pOutfitInfo->tokLinkSlot) );
|
|
m_ctrlOutfitSlot.SetCurSel( nIdx );
|
|
|
|
nIdx = m_ctrlOutfit.FindStringExact(-1, g_TokOutfitName.GetString(pOutfitInfo->tokLinkOutfit) );
|
|
m_ctrlOutfit.SetCurSel( nIdx );
|
|
|
|
m_ctrlLink.SetCheck( 1 );
|
|
}
|
|
|
|
ToggleByLinkState();
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::ToggleByLinkState()
|
|
{
|
|
if( 1 == m_ctrlLink.GetCheck() )
|
|
{
|
|
m_ctrlOutfitSlot.EnableWindow( TRUE );
|
|
m_ctrlOutfit.EnableWindow( TRUE );
|
|
}
|
|
else
|
|
{
|
|
m_ctrlOutfitSlot.EnableWindow( FALSE );
|
|
m_ctrlOutfit.EnableWindow( FALSE );
|
|
}
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::OnCheckLink()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
ToggleByLinkState();
|
|
}
|
|
|
|
static void PrintIndent( const int n, FILE* fp )
|
|
{
|
|
for( int i = 0; i < n; ++i )
|
|
{
|
|
fprintf( fp, "\t" );
|
|
}
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::Save()
|
|
{
|
|
if( NULL == m_rpGCMDS )
|
|
{
|
|
return;
|
|
}
|
|
|
|
FILE* fp;
|
|
CString strIndexFileName(m_rpGCMDS->GetNameString());
|
|
strIndexFileName += "_outfit_index.txt";
|
|
|
|
fp = fopen( strIndexFileName, "wt" );
|
|
if( NULL == fp )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int nIndent = 0;
|
|
HTREEITEM hItem = m_ctrlOutfitSetTree.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_ctrlOutfitSetTree.GetItem( &tvitem );
|
|
if( 0 == tvitem.lParam ) // group name
|
|
{
|
|
PrintIndent( nIndent, fp );
|
|
fprintf( fp, "*%s\n", szTmp );
|
|
++nIndent;
|
|
hParent = hItem;
|
|
hItem = m_ctrlOutfitSetTree.GetChildItem( hItem );
|
|
}
|
|
else // item name
|
|
{
|
|
PrintIndent( nIndent, fp );
|
|
fprintf( fp, "%s\n", szTmp );
|
|
hItem = m_ctrlOutfitSetTree.GetNextSiblingItem( hItem );
|
|
}
|
|
}
|
|
|
|
if( NULL == hItem )
|
|
{
|
|
if( NULL != hParent )
|
|
{
|
|
// move up 1 level
|
|
hItem = m_ctrlOutfitSetTree.GetNextSiblingItem( hParent );
|
|
hParent = m_ctrlOutfitSetTree.GetParentItem( hParent );
|
|
PrintIndent( --nIndent, fp );
|
|
fprintf( fp, ";\n\n" );
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose(fp);
|
|
}
|
|
|
|
void CPageGCMDSOutfitSet::OnSelchangedTreeOutfitset(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
UpdateOutfitSetProperty( (Z3DOUTFITINFO*)(pNMTreeView->itemNew.lParam) );
|
|
|
|
*pResult = 0;
|
|
}
|