/* * Descent 3 * Copyright (C) 2024 Parallax Software * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // MegacellKeypad.cpp : implementation file // #include "stdafx.h" #include "editor.h" #include "MegacellKeypad.h" #include "megacell.h" #include "terrain.h" #include "terraindialog.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMegacellKeypad dialog int CMegacellKeypad::m_Instances = 0; CMegacellKeypad::CMegacellKeypad(CWnd *pParent /*=NULL*/) : CKeypadDialog(CMegacellKeypad::IDD, pParent) { //{{AFX_DATA_INIT(CMegacellKeypad) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CMegacellKeypad::DoDataExchange(CDataExchange *pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMegacellKeypad) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMegacellKeypad, CDialog) //{{AFX_MSG_MAP(CMegacellKeypad) ON_WM_DESTROY() ON_WM_SIZE() ON_WM_VSCROLL() ON_WM_HSCROLL() ON_BN_CLICKED(IDC_NEXT_MEGA_SET, OnNextMegaSet) ON_BN_CLICKED(IDC_PREV_MEGA_SET, OnPrevMegaSet) ON_WM_PAINT() ON_BN_CLICKED(IDC_FILL_WITH_MEGACELL, OnFillWithMegacell) ON_BN_CLICKED(IDC_RANDOMIZE_MEGACELL_CHECK, OnRandomizeMegacellCheck) ON_BN_CLICKED(IDC_SELECT_FROM_MEGACELL, OnSelectFromMegacell) ON_BN_CLICKED(IDC_UNIFY_MEGACELL, OnUnifyMegacell) ON_WM_HELPINFO() ON_EN_KILLFOCUS(IDC_X_GRANULAR_EDIT, OnKillfocusXGranularEdit) ON_EN_KILLFOCUS(IDC_Y_GRANULAR_EDIT, OnKillfocusYGranularEdit) ON_BN_CLICKED(IDC_HIGHLIGHT_BORDERS, OnHighlightBorders) ON_BN_CLICKED(IDC_MEGACELL_SKYDOME, OnMegacellSkydome) ON_BN_CLICKED(IDC_MEGACELL_SKYBAND, OnMegacellSkyband) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMegacellKeypad message handlers void CMegacellKeypad::OnDestroy() { CDialog::OnDestroy(); if (m_Instances > 0) m_Instances--; } BOOL CMegacellKeypad::OnInitDialog() { CDialog::OnInitDialog(); ((CButton *)GetDlgItem(IDC_RANDOMIZE_MEGACELL_CHECK))->SetCheck(D3EditState.randomize_megacell); m_Instances++; m_xgran = 1; m_ygran = 1; UpdateDialog(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMegacellKeypad::OnSize(UINT nType, int cx, int cy) { CKeypadDialog::OnSize(nType, cx, cy); // Add your code here, sweetie. } void CMegacellKeypad::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) { // TODO: Add your message handler code here and/or call default CKeypadDialog::OnVScroll(nSBCode, nPos, pScrollBar); } void CMegacellKeypad::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) { // TODO: Add your message handler code here and/or call default CKeypadDialog::OnHScroll(nSBCode, nPos, pScrollBar); } void CMegacellKeypad::OnNextMegaSet() { D3EditState.current_megacell = GetNextMegacell(D3EditState.current_megacell); m_xgran = m_ygran = 1; UpdateDialog(); } void CMegacellKeypad::OnPrevMegaSet() { D3EditState.current_megacell = GetPrevMegacell(D3EditState.current_megacell); m_xgran = m_ygran = 1; UpdateDialog(); } void CMegacellKeypad::OnPaint() { CPaintDC dc(this); // device context for painting // This is added so we don't paint this dialog when it's inactive. if (!m_Active) return; UpdateDialog(); } void CMegacellKeypad::UpdateDialog() { if (Num_megacells < 1) return; int n = D3EditState.current_megacell; char str[255]; CEdit *ebox; if (!Megacells[n].used) { n = GetNextMegacell(n); D3EditState.current_megacell = n; } ebox = (CEdit *)GetDlgItem(IDC_MEGACELL_NAME_STATIC); sprintf(str, "Megacell name: %s", Megacells[n].name); ebox->SetWindowText(str); ebox = (CEdit *)GetDlgItem(IDC_MEGA_WIDTH_STATIC); sprintf(str, "Width: %d", Megacells[n].width); ebox->SetWindowText(str); ebox = (CEdit *)GetDlgItem(IDC_MEGA_HEIGHT_STATIC); sprintf(str, "Height: %d", Megacells[n].height); ebox->SetWindowText(str); ebox = (CEdit *)GetDlgItem(IDC_X_GRANULAR_EDIT); sprintf(str, "%d", m_xgran); ebox->SetWindowText(str); ebox = (CEdit *)GetDlgItem(IDC_Y_GRANULAR_EDIT); sprintf(str, "%d", m_ygran); ebox->SetWindowText(str); UpdateMegaSetView(); } void CMegacellKeypad::UpdateMegaSetView() { int n = D3EditState.current_megacell; CWnd *texwnd; RECT rect; int x, y, bm_handle, w, h; int megawidth = Megacells[n].width; int megaheight = Megacells[n].height; int i, t; Desktop_surf->attach_to_window((unsigned)m_hWnd); texwnd = GetDlgItem(IDC_MEGACELL_SET_VIEW); texwnd->GetWindowRect(&rect); ScreenToClient(&rect); w = rect.right - rect.left; h = rect.bottom - rect.top; Desktop_surf->clear(rect.left, rect.top, w, h); if (megawidth > 0) { int texwidth = w / megawidth; int texheight = h / megaheight; // Don't have to clear if we're overwriting the whole area! for (i = 0; i < megaheight; i++) { for (t = 0; t < megawidth; t++) { m_TextureSurf.create(texwidth, texheight, BPP_16); bm_handle = GetTextureBitmap(Megacells[n].texture_handles[i * MAX_MEGACELL_WIDTH + t], 0); m_TextureSurf.load(bm_handle); x = 1 + rect.left + (t * texwidth); y = 1 + rect.top + (i * texheight); Desktop_surf->blt(x, y, &m_TextureSurf); m_TextureSurf.free(); } } } Desktop_surf->attach_to_window((unsigned)NULL); } void CMegacellKeypad::OnFillWithMegacell() { return; } void CMegacellKeypad::OnRandomizeMegacellCheck() { // TODO: Add your control notification handler code here D3EditState.randomize_megacell = (((CButton *)GetDlgItem(IDC_RANDOMIZE_MEGACELL_CHECK))->GetCheck() != 0); } // Selects all the cells that has textures from the currently selected megacell void CMegacellKeypad::OnSelectFromMegacell() {} // Fill only the selected cells with this megacell void CMegacellKeypad::OnUnifyMegacell() {} BOOL CMegacellKeypad::OnHelpInfo(HELPINFO *pHelpInfo) { // TODO: Add your message handler code here and/or call default WinHelp(HID_MEGACELLTAB, HELP_CONTEXT); return TRUE; // return CDialog::OnHelpInfo(pHelpInfo); } void CMegacellKeypad::OnKillfocusXGranularEdit() { CEdit *ebox; char name[20]; int n = D3EditState.current_megacell; int val; ebox = (CEdit *)GetDlgItem(IDC_X_GRANULAR_EDIT); ebox->GetWindowText(name, 20); val = atoi(name); if (val < 1) val = 1; if (val > Megacells[n].width) val = Megacells[n].width; m_xgran = val; UpdateDialog(); } void CMegacellKeypad::OnKillfocusYGranularEdit() { CEdit *ebox; char name[20]; int n = D3EditState.current_megacell; int val; ebox = (CEdit *)GetDlgItem(IDC_Y_GRANULAR_EDIT); ebox->GetWindowText(name, 20); val = atoi(name); if (val < 1) val = 1; if (val > Megacells[n].height) val = Megacells[n].height; m_ygran = val; UpdateDialog(); } void CMegacellKeypad::OnHighlightBorders() {} void CMegacellKeypad::OnMegacellSkydome() {} void CMegacellKeypad::OnMegacellSkyband() {}