Files
Client/GameTools/WORLDCREATOR/PageHouseContainer.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

377 lines
10 KiB
C++
Raw Blame History

// PageHouseContainer.cpp : implementation file
//
#include "stdafx.h"
#include "WorldCreator.h"
#include "PageHouseContainer.h"
#include "DlgEditName.h"
#include "MainFrm.h"
#include "WorldCreatorView.h"
#include "HeightFieldScene.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPageHouseContainer property page
IMPLEMENT_DYNCREATE(CPageHouseContainer, CPropertyPage)
CPageHouseContainer::CPageHouseContainer() : CPropertyPage(CPageHouseContainer::IDD)
{
//{{AFX_DATA_INIT(CPageHouseContainer)
m_bAddHouse = FALSE;
//}}AFX_DATA_INIT
}
CPageHouseContainer::~CPageHouseContainer()
{
for(int i=0;i<m_HouseTreeNode.num;i++)
{
delete m_HouseTreeNode[i];
}
}
void CPageHouseContainer::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPageHouseContainer)
DDX_Control(pDX, IDC_TREE_HOUSEOBJECT, m_HouseObjectTree);
DDX_Check(pDX, IDC_CHECKADD, m_bAddHouse);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPageHouseContainer, CPropertyPage)
//{{AFX_MSG_MAP(CPageHouseContainer)
ON_NOTIFY(NM_RCLICK, IDC_TREE_HOUSEOBJECT, OnRclickTreeHouseobject)
ON_COMMAND(MENU_HOUSE_RENAME, OnHouseRename)
ON_COMMAND(MENU_HOUSE_LOAD, OnHouseLoad)
ON_COMMAND(MENU_HOUSE_ADDCATE, OnHouseAddcate)
ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_HOUSEOBJECT, OnBegindragTreeHouseobject)
ON_COMMAND(MENU_HOUSEDELETE, OnHousedelete)
ON_NOTIFY(NM_CLICK, IDC_TREE_HOUSEOBJECT, OnClickTreeHouseobject)
ON_BN_CLICKED(IDC_CHECKADD, OnCheckadd)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_HOUSEOBJECT, OnSelchangedTreeHouseobject)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPageHouseContainer message handlers
void CPageHouseContainer::OnRclickTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
GetCursorPos(&point);
HTREEITEM treeitem=m_HouseObjectTree.GetSelectedItem();
if(treeitem==NULL)
return;
CMenu menu;
menu.LoadMenu(IDR_MENU_HOUSEOBJECT);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
*pResult = 0;
}
void CPageHouseContainer::OnHouseRename()
{
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
CString SelectName=m_HouseObjectTree.GetItemText(SelectedItem);
CDlgEditName dlgEditName;
dlgEditName.m_EditName=SelectName;
dlgEditName.DoModal();
if(dlgEditName.m_EditName=="")
return;
if(isAlreadyExist(dlgEditName.m_EditName))
return;
for(int i=0;i<m_HouseTreeNode.num;i++)
{
if(m_HouseTreeNode[i]->m_strHouseName==SelectName)
{
m_HouseTreeNode[i]->m_strHouseName=dlgEditName.m_EditName;
}
if(m_HouseTreeNode[i]->m_strParentHouseName==SelectName)
{
m_HouseTreeNode[i]->m_strParentHouseName=dlgEditName.m_EditName;
}
}
UpdateHouseTree();
}
BOOL CPageHouseContainer::OnInitDialog()
{
CPropertyPage::OnInitDialog();
HouseTreeNode *RootNode=new HouseTreeNode;
RootNode->m_strHouseName="<EFBFBD>ǹ<EFBFBD>";
m_HouseTreeNode.Add(RootNode);
UpdateHouseTree();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPageHouseContainer::OnHouseLoad()
{
// TODO: Add your command handler code here
CDlgHouseLoad dlgHouseLoad;
if(dlgHouseLoad.DoModal()!=IDOK)
return;
if(dlgHouseLoad.m_strOutname=="" && dlgHouseLoad.m_strBSPName=="")
return;
HouseTreeNode *Node=new HouseTreeNode;
Node->m_strOutName=dlgHouseLoad.m_strOutname;
Node->m_strMedName=dlgHouseLoad.m_strMedname;
Node->m_strInName=dlgHouseLoad.m_strInname;
Node->m_strBspName=dlgHouseLoad.m_strBSPName;
if(dlgHouseLoad.m_HouseName=="")
{
Node->m_strHouseName=dlgHouseLoad.m_strOutname;
if(dlgHouseLoad.m_strOutname=="")
{
Node->m_strHouseName=dlgHouseLoad.m_strBSPName;
}
}
else
{
Node->m_strHouseName=dlgHouseLoad.m_HouseName;
}
if(isAlreadyExist(Node->m_strHouseName))
return;
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
CString ParentName=m_HouseObjectTree.GetItemText(SelectedItem);
Node->m_strParentHouseName=ParentName;
m_HouseTreeNode.Add(Node);
UpdateHouseTree();
}
void CPageHouseContainer::OnHouseAddcate()
{
// TODO: Add your command handler code here
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
CString ParentName=m_HouseObjectTree.GetItemText(SelectedItem);
HouseTreeNode *SubCate=new HouseTreeNode;
CDlgEditName dlgEditName;
dlgEditName.DoModal();
if(dlgEditName.m_EditName=="")
return;
if(isAlreadyExist(dlgEditName.m_EditName))
return;
m_AgoExpand=dlgEditName.m_EditName;
SubCate->m_strHouseName=dlgEditName.m_EditName;
SubCate->m_strParentHouseName=ParentName;
m_HouseTreeNode.Add(SubCate);
UpdateHouseTree();
}
void CPageHouseContainer::UpdateHouseTree()
{
m_HouseObjectTree.DeleteAllItems();
RecurAddTreeItem(NULL,"");
}
void CPageHouseContainer::RecurAddTreeItem(HTREEITEM TreeItem, CString strTreeName)
{
HTREEITEM ParentItem;
int cTreeItem;
for(cTreeItem=0;cTreeItem<m_HouseTreeNode.num;cTreeItem++)
{
if(m_HouseTreeNode[cTreeItem]->m_strParentHouseName==strTreeName)
{
if(TreeItem==NULL)
{
ParentItem=m_HouseObjectTree.InsertItem(m_HouseTreeNode[cTreeItem]->m_strHouseName);
RecurAddTreeItem(ParentItem,m_HouseTreeNode[cTreeItem]->m_strHouseName);
}
else
{
ParentItem=m_HouseObjectTree.InsertItem(m_HouseTreeNode[cTreeItem]->m_strHouseName,TreeItem);
RecurAddTreeItem(ParentItem,m_HouseTreeNode[cTreeItem]->m_strHouseName);
}
if(m_AgoExpand==m_HouseTreeNode[cTreeItem]->m_strHouseName)
{
m_HouseObjectTree.Expand(ParentItem,TVE_EXPAND);
}
}
}
}
BOOL CPageHouseContainer::isAlreadyExist(CString strHouseName)
{
for(int i=0;i<m_HouseTreeNode.num;i++)
{
if(m_HouseTreeNode[i]->m_strHouseName==strHouseName)
return TRUE;
}
return FALSE;
}
void CPageHouseContainer::OnBegindragTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
SelectHouseObject();
av->ChangeMouseInterface(1);
CSceneManager::m_PickHouseScene=NULL;
*pResult = 0;
}
void CPageHouseContainer::OnHousedelete()
{
// TODO: Add your command handler code here
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
CString DelName=m_HouseObjectTree.GetItemText(SelectedItem);
for(int i=0;i<m_HouseTreeNode.num;i++)
{
if(m_HouseTreeNode[i]->m_strHouseName==DelName)
m_HouseTreeNode.DelIndex(i);
}
RecurDelTreeItem(DelName);
UpdateHouseTree();
}
void CPageHouseContainer::RecurDelTreeItem(CString strDelNode)
{
for(int i=0;i<m_HouseTreeNode.num;i++)
{
if(m_HouseTreeNode[i]->m_strParentHouseName==strDelNode)
{
RecurDelTreeItem(m_HouseTreeNode[i]->m_strHouseName);
m_HouseTreeNode.DelIndex(i);
}
}
}
void CPageHouseContainer::SelectHouseObject()
{
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
m_strHouseName=m_HouseObjectTree.GetItemText(SelectedItem);
for(int i=0;i<m_HouseTreeNode.num;i++)
{
if(m_HouseTreeNode[i]->m_strHouseName==m_strHouseName)
{
m_strInName=m_HouseTreeNode[i]->m_strInName;
m_strMedName=m_HouseTreeNode[i]->m_strMedName;
m_strOutName=m_HouseTreeNode[i]->m_strOutName;
m_strBspName=m_HouseTreeNode[i]->m_strBspName;
}
}
}
void CPageHouseContainer::AddHouse(float fXp, float fYp, float fZp)
{
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
av->m_SceneManager->m_MapStorage.AddHouseMap(fXp,fYp,fZp,m_strOutName.LockBuffer(),m_strMedName.LockBuffer(),m_strInName.LockBuffer(),m_strBspName.LockBuffer());
//CMapStorage::AddHouseMap(fXp,fYp,fZp,m_strOutName.LockBuffer(),m_strMedName.LockBuffer(),m_strInName.LockBuffer());
}
void CPageHouseContainer::OnClickTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
SelectHouseObject();
*pResult = 0;
}
void CPageHouseContainer::Save(FILE *fp)
{
char SaveName[MAX_NAMEBUFFER];
fwrite(&m_HouseTreeNode.num,sizeof(int),1,fp);
for(int cHouse=0;cHouse<m_HouseTreeNode.num;cHouse++)
{
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strHouseName.LockBuffer());
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strOutName.LockBuffer());
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strMedName.LockBuffer());
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strInName.LockBuffer());
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strParentHouseName.LockBuffer());
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
}
}
void CPageHouseContainer::Load(FILE *fp,int iType)
{
if(!iType)
DeleteTreeData();
char ReadName[MAX_NAMEBUFFER];
int cHouseTree;
fread(&cHouseTree,sizeof(int),1,fp);
for(int cHouse=0;cHouse<cHouseTree;cHouse++)
{
HouseTreeNode *AddNode=new HouseTreeNode;
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
AddNode->m_strHouseName=ReadName;
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
AddNode->m_strOutName=ReadName;
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
AddNode->m_strMedName=ReadName;
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
AddNode->m_strInName=ReadName;
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
AddNode->m_strParentHouseName=ReadName;
if(cHouse == 0 && iType != 0) // <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŵ
{
delete AddNode;
continue;
}
else
{
m_HouseTreeNode.Add(AddNode);
}
}
}
void CPageHouseContainer::DeleteTreeData()
{
m_HouseObjectTree.DeleteAllItems();
for(int i=0;i<m_HouseTreeNode.num;i++)
{
delete m_HouseTreeNode[i];
}
m_HouseTreeNode.num=0;
}
void CPageHouseContainer::OnCheckadd()
{
// TODO: Add your control notification handler code here
m_bAddHouse = (m_bAddHouse == TRUE) ? FALSE : TRUE;
UpdateData(FALSE);
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
if((m_bAddHouse == TRUE)) // RBSP <20>߰<EFBFBD>
{
SelectHouseObject();
av->ChangeMouseInterface(1);
}
else {
av->ChangeMouseInterface(-1);
}
}
void CPageHouseContainer::OnSelchangedTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
SelectHouseObject();
*pResult = 0;
}