summaryrefslogtreecommitdiff
path: root/src/T2MainWindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/T2MainWindow.cpp601
1 files changed, 601 insertions, 0 deletions
diff --git a/src/T2MainWindow.cpp b/src/T2MainWindow.cpp
new file mode 100644
index 0000000..4f590ab
--- /dev/null
+++ b/src/T2MainWindow.cpp
@@ -0,0 +1,601 @@
+#include "CT2App.h"
+#include "GlobalFunc.h"
+#include "T2MainWindow.h"
+#include "T2MsgWindow.h"
+#include "T2SoundPlayer.h"
+#include "T2ToolWindow.h"
+#include "T2TowerDoc.h"
+#include "T2TowerMainView.h"
+#include "T2WorldDef.h"
+#include "UT2Coordinate.h"
+
+#line 22
+IMPLEMENT_DYNCREATE(T2MainWindow, CFrameWnd)
+
+BEGIN_MESSAGE_MAP(T2MainWindow, CFrameWnd)
+ ON_WM_CREATE()
+ ON_WM_DESTROY()
+ ON_WM_CLOSE()
+ ON_WM_SIZE()
+ ON_WM_VSCROLL()
+ ON_WM_HSCROLL()
+ ON_WM_ERASEBKGND()
+ ON_WM_ACTIVATE()
+ ON_WM_ACTIVATEAPP()
+ ON_COMMAND(0x8018, OnCmdDebugEvent)
+ ON_UPDATE_COMMAND_UI(0x8018, OnUpdateCmdDebugEvent)
+ ON_COMMAND(0x8023, OnCmdDebugMode)
+END_MESSAGE_MAP()
+
+T2MainWindow::T2MainWindow() {
+ _EC = 0;
+ _F0 = 0;
+ mSoundPlayer = NULL;
+ mDirectSound = NULL;
+ mToolWindow = NULL;
+ mMsgWindow = NULL;
+ mCtrlPalette = NULL;
+
+ ((CT2App *) AfxGetApp())->mMainWindow = this;
+}
+
+/*virtual*/ T2MainWindow::~T2MainWindow() {
+ if (mSoundPlayer) {
+ delete mSoundPlayer;
+ Sounds = NULL;
+ }
+
+ DeinitSound();
+}
+
+void T2MainWindow::InitSound() {
+ mDirectSound = NULL;
+
+ if (DirectSoundCreate(NULL, &mDirectSound, NULL) != S_OK) {
+ DeinitSound();
+ return;
+ }
+
+#ifdef _WIN32
+ DSCAPS caps;
+ memset(&caps, 0, sizeof(DSCAPS));
+ caps.dwSize = sizeof(DSCAPS);
+
+ HRESULT result = mDirectSound->GetCaps(&caps);
+#line 80
+ _ASSERT(result == S_OK);
+
+ if (mDirectSound->SetCooperativeLevel(GetSafeHwnd(), DSSCL_NORMAL) != S_OK) {
+ DeinitSound();
+ return;
+ }
+
+ DSBUFFERDESC bufferDesc;
+ memset(&bufferDesc, 0, sizeof(DSBUFFERDESC));
+ bufferDesc.dwSize = sizeof(DSBUFFERDESC);
+ bufferDesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
+
+ LPDIRECTSOUNDBUFFER buffer = NULL;
+
+ if (mDirectSound->CreateSoundBuffer(&bufferDesc, &buffer, NULL) != S_OL) {
+ DeinitSound();
+ }
+#endif
+}
+
+void T2MainWindow::DeinitSound() {
+ if (mDirectSound) {
+#ifdef _WIN32
+ mDirectSound->Release();
+#endif
+ mDirectSound = NULL;
+ }
+}
+
+/*virtual*/ BOOL T2MainWindow::PreCreateWindow(CREATESTRUCT& cs) {
+ cs.style |= WS_TABSTOP | WS_GROUP | WS_VSCROLL;
+ return CFrameWnd::PreCreateWindow(cs);
+}
+
+afx_msg int T2MainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) {
+#line 123
+ // mDbgStepRun = DEBUG_NEW DbgStepRun;
+ // mDbgIPS = DEBUG_NEW DbgIPS;
+
+ if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
+ return -1;
+
+ InitSound();
+#line 130
+ mSoundPlayer = DEBUG_NEW T2SoundPlayer(this, mDirectSound);
+
+ SetWindowRgn(CreateRectRgn(100, 100, 100, 100), true);
+ return 0;
+}
+
+afx_msg void T2MainWindow::OnDestroy() {
+ gT2App->mMainWindow = NULL;
+ // ffCalledFromDestroy();
+
+ CFrameWnd::OnDestroy();
+
+ // mDbgStepRun->DestroyWindow();
+ // delete mDbgStepRun;
+ // mDbgIPS->DestroyWindow();
+ // delete mDbgIPS;
+}
+
+void T2MainWindow::Setup() {
+ RECT windowRect;
+ GetWindowRect(&windowRect);
+ SetWindowRgn(CreateRectRgn(0, 0, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top), true);
+
+ mWndClassA = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, NULL, (HBRUSH) GetStockObject(WHITE_BRUSH));
+
+ RECT rect;
+ SetRect(&rect, 100, 100, 300, 300);
+ mToolWindow = ((CT2App *) AfxGetApp())->mToolWindow;
+ mToolWindow->Create(mWndClassA, "Tools", WS_SYSMENU | WS_CAPTION | WS_CLIPCHILDREN | WS_VISIBLE | WS_POPUP, rect, this, NULL, WS_EX_TOOLWINDOW);
+
+ mWndClassB = AfxRegisterWndClass(0, NULL, (HBRUSH) GetStockObject(WHITE_BRUSH));
+
+ SetRect(&rect, 0, 0, 520, 50);
+ // ...
+ // more stuff here.
+}
+
+void T2MainWindow::Teardown() {
+ delete mToolWindow;
+ delete mMsgWindow;
+ delete mCtrlPalette;
+
+ mToolWindow = NULL;
+ mMsgWindow = NULL;
+ mCtrlPalette = NULL;
+}
+
+/*virtual*/ void T2MainWindow::AssertValid() const {
+ CFrameWnd::AssertValid();
+}
+
+/*virtual*/ void T2MainWindow::Dump(CDumpContext& dc) const {
+ CFrameWnd::Dump(dc);
+}
+
+afx_msg void T2MainWindow::OnSize(UINT nType, int cx, int cy) {
+ T2TowerMainView *theView = (T2TowerMainView *) GetActiveView();
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (!_EC) {
+ CFrameWnd::OnSize(nType, cx, cy);
+ } else if (theView) {
+ CRect rect;
+ GetClientRect(rect);
+ rect.top += 16;
+ rect.left += 16;
+ theView->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
+ }
+
+ x4144FA();
+
+ if (theView)
+ theView->tmv_vf144();
+}
+
+void T2MainWindow::x414445() {
+ T2TowerMainView *theView = (T2TowerMainView *) GetActiveView();
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ x4144FA();
+
+ CRect rect;
+ GetWindowRect(rect);
+ int width = rect.Width();
+ int height = rect.Height();
+
+ if (width && height && theTowerDoc && theView && theTowerDoc->mWorldDef) {
+ theView->tmv_vf138(theTowerDoc->mWorldDef->mInitPos, 0x102);
+ _F0 = 1;
+ theView->ShowWindow(SW_SHOW);
+ }
+}
+
+void T2MainWindow::x4144FA() {
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+ T2TowerMainView *theView = (T2TowerMainView *) GetActiveView();
+
+ if (theTowerDoc && theView && theTowerDoc->mWorldDef) {
+ RECT clientRect;
+ GetClientRect(&clientRect);
+
+ RECT unitRect;
+ SetRect(&unitRect, 0, 0, theTowerDoc->mWorldDef->GetWidth(), theTowerDoc->mWorldDef->GetHeight());
+ UT2Coordinate::UnitToQD(unitRect, theTowerDoc->mZoomLevel, true);
+
+ SCROLLINFO info;
+ info.cbSize = sizeof(SCROLLINFO);
+ info.fMask = SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL;
+ info.nMin = 0;
+
+ info.nMax = unitRect.bottom;
+ info.nPage = clientRect.bottom;
+ SetScrollInfo(SB_VERT, &info);
+
+ info.nMax = unitRect.right;
+ info.nPage = clientRect.right;
+ SetScrollInfo(SB_HORZ, &info);
+
+ InvalidateRect(NULL);
+ }
+}
+
+afx_msg void T2MainWindow::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (theTowerDoc) {
+ RECT clientRect;
+ GetClientRect(&clientRect);
+
+ int scrollLimit = GetScrollLimit(SB_VERT);
+ int origScrollPos = GetScrollPos(SB_VERT);
+ int scrollPos = origScrollPos;
+
+ switch (nSBCode) {
+ case SB_BOTTOM:
+ scrollPos = scrollLimit;
+ break;
+ case SB_LINEDOWN:
+ scrollPos += UT2Coordinate::UnitVSize(theTowerDoc->mZoomLevel);
+ break;
+ case SB_LINEUP:
+ scrollPos -= UT2Coordinate::UnitVSize(theTowerDoc->mZoomLevel);
+ break;
+ case SB_PAGEDOWN:
+ scrollPos += clientRect.bottom / 2;
+ break;
+ case SB_PAGEUP:
+ scrollPos -= clientRect.bottom / 2;
+ break;
+ case SB_THUMBTRACK:
+ scrollPos = nPos;
+ break;
+ case SB_TOP:
+ scrollPos = 0;
+ break;
+ }
+
+ if (scrollPos < 0)
+ scrollPos = 0;
+ else if (scrollPos > scrollLimit)
+ scrollPos = scrollLimit;
+
+ SetScrollPos(SB_VERT, scrollPos);
+
+ CRect myClientRect;
+ GetClientRect(myClientRect);
+ myClientRect.left = 1;
+
+ CView *activeView = GetActiveView();
+
+ CRect activeClientRect;
+ activeView->GetClientRect(activeClientRect);
+ activeView->MapWindowPoints(this, activeClientRect);
+
+ myClientRect.top = activeClientRect.top;
+
+ ScrollWindow(0, scrollPos - origScrollPos, myClientRect, myClientRect);
+ UpdateWindow();
+
+ T2TowerMainView *theView = (T2TowerMainView *) GetActiveView();
+ if (theView) {
+ theView->tmv_vf130(scrollPos);
+ theView->tmv_vf120();
+ }
+ }
+}
+
+afx_msg void T2MainWindow::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (theTowerDoc) {
+ RECT clientRect;
+ GetClientRect(&clientRect);
+
+ int scrollLimit = GetScrollLimit(SB_HORZ);
+ int origScrollPos = GetScrollPos(SB_HORZ);
+ int scrollPos = origScrollPos;
+
+ switch (nSBCode) {
+ case SB_RIGHT:
+ scrollPos = scrollLimit;
+ break;
+ case SB_LINERIGHT:
+ scrollPos += UT2Coordinate::UnitHSize(theTowerDoc->mZoomLevel);
+ break;
+ case SB_LINELEFT:
+ scrollPos -= UT2Coordinate::UnitHSize(theTowerDoc->mZoomLevel);
+ break;
+ case SB_PAGERIGHT:
+ scrollPos += clientRect.right / 2;
+ break;
+ case SB_PAGELEFT:
+ scrollPos -= clientRect.right / 2;
+ break;
+ case SB_THUMBTRACK:
+ scrollPos = nPos;
+ break;
+ case SB_LEFT:
+ scrollPos = 0;
+ break;
+ }
+
+ if (scrollPos < 0)
+ scrollPos = 0;
+ else if (scrollPos > scrollLimit)
+ scrollPos = scrollLimit;
+
+ SetScrollPos(SB_HORZ, scrollPos);
+
+ CRect myClientRect;
+ GetClientRect(myClientRect);
+ myClientRect.top = 1;
+
+ CView *activeView = GetActiveView();
+
+ CRect activeClientRect;
+ activeView->GetClientRect(activeClientRect);
+ activeView->MapWindowPoints(this, activeClientRect);
+
+ myClientRect.top = activeClientRect.top;
+
+ ScrollWindow(scrollPos - origScrollPos, 0, myClientRect, myClientRect);
+ UpdateWindow();
+
+ T2TowerMainView *theView = (T2TowerMainView *) GetActiveView();
+ if (theView) {
+ theView->tmv_vf134(scrollPos);
+ theView->tmv_vf120();
+ }
+ }
+}
+
+afx_msg BOOL T2MainWindow::OnEraseBkgnd(CDC* pDC) {
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (!theTowerDoc || !theTowerDoc->mWorldDef || !theTowerDoc->Get22C()) {
+ CRect clientRect;
+ GetClientRect(clientRect);
+
+ CBrush brush(GetSysColor(COLOR_BTNFACE));
+ pDC->FillRect(clientRect, &brush);
+
+ return true;
+ }
+
+ int save = pDC->SaveDC();
+
+ CRect clientRect;
+ GetClientRect(clientRect);
+
+ CBrush brush(GetSysColor(COLOR_BTNFACE));
+ pDC->FillRect(clientRect, &brush);
+
+ CPen shadowPen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));
+ CPen highlightPen(PS_SOLID, 0, GetSysColor(COLOR_BTNHIGHLIGHT));
+
+ CFont bigFont;
+ bigFont.CreateFont(-14, 0, 900, 900, FW_BOLD, false, false, false, SHIFTJIS_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DRAFT_QUALITY, FIXED_PITCH, "\x82\x6C\x82\x72 \x83\x53\x83\x56\x83\x62\x83\x4E");
+
+ CFont smallFont;
+ smallFont.CreateFont(-14, 0, 0, 0, FW_BOLD, false, false, false, SHIFTJIS_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DRAFT_QUALITY, FIXED_PITCH, "\x82\x6C\x82\x72 \x83\x53\x83\x56\x83\x62\x83\x4E");
+
+ pDC->SelectObject(shadowPen);
+ pDC->MoveTo(clientRect.right, 0);
+ pDC->LineTo(0, 0);
+ pDC->LineTo(0, clientRect.bottom);
+
+ pDC->SetBkMode(TRANSPARENT);
+
+ CView *theView = GetActiveView();
+
+ if (_F0 && theTowerDoc && theView) {
+ CRect viewRect;
+ theView->GetClientRect(viewRect);
+ theView->MapWindowPoints(this, viewRect);
+
+ T2TowerMainView *theTowerMainView = (T2TowerMainView *) theView;
+ viewRect.left += theTowerMainView->m84;
+ viewRect.right += theTowerMainView->m84;
+ viewRect.top += theTowerMainView->m88;
+ viewRect.bottom += theTowerMainView->m88;
+
+ pDC->SelectObject(shadowPen);
+ pDC->MoveTo(viewRect.left - 1, 0);
+ pDC->LineTo(viewRect.left - 1, viewRect.top - 1);
+ pDC->LineTo(-1, viewRect.top - 1);
+
+ pDC->ExcludeClipRect(0, 0, viewRect.left, viewRect.top);
+
+ SCROLLINFO scrollInfoH;
+ SCROLLINFO scrollInfoV;
+ GetScrollInfo(SB_HORZ, &scrollInfoH);
+ GetScrollInfo(SB_VERT, &scrollInfoV);
+
+ pDC->SetWindowOrg(scrollInfoH.nPos, 0);
+
+ CRect anotherRect;
+ int hRange = scrollInfoH.nMax - scrollInfoH.nMin;
+
+ pDC->SelectObject(smallFont);
+
+ int i;
+ int x;
+ int y;
+ char str[4];
+ POINT textPos;
+
+ for (i = 0; i < 10; i++) {
+ x = viewRect.left + (hRange * i) / 10;
+ anotherRect.SetRect(x, 1, viewRect.left + (hRange * (i + 1)) / 10, 16);
+
+ pDC->SelectObject(shadowPen);
+ pDC->MoveTo(x - 1, 1);
+ pDC->LineTo(x - 1, 16);
+
+ pDC->SelectObject(highlightPen);
+ pDC->MoveTo(x, 1);
+ pDC->LineTo(x, 16);
+
+ str[0] = "\x82\x60"[0];
+ str[1] = "\x82\x60"[1] + i;
+ str[2] = 0;
+
+ textPos.y = 2;
+ textPos.x = ((anotherRect.left + anotherRect.right) / 2) - (pDC->GetTextExtent(str, 2).cx / 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNHIGHLIGHT));
+ pDC->TextOut(textPos.x + 1, textPos.y + 1, str, 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW));
+ pDC->TextOut(textPos.x - 1, textPos.y - 1, str, 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
+ pDC->TextOut(textPos.x, textPos.y, str, 2);
+ }
+
+ x = viewRect.left + hRange;
+ anotherRect.SetRect(x, 1, viewRect.left + (hRange * 11) / 10, 16);
+
+ pDC->SelectObject(shadowPen);
+ pDC->MoveTo(x - 1, 1);
+ pDC->LineTo(x - 1, 16);
+
+ pDC->SelectObject(highlightPen);
+ pDC->MoveTo(x, 1);
+ pDC->LineTo(x, 16);
+
+ pDC->SetWindowOrg(0, scrollInfoV.nPos);
+ int vRange = scrollInfoV.nMax - scrollInfoV.nMin;
+ int height = theTowerDoc->mWorldDef->GetHeight();
+
+ pDC->SelectObject(bigFont);
+
+ for (i = 0; i <= height; i++) {
+ y = viewRect.top + (vRange * i) / height;
+ anotherRect.SetRect(0, y, 14, viewRect.top + (vRange * (i + 1)) / height);
+
+ pDC->SelectObject(shadowPen);
+ pDC->MoveTo(1, y - 1);
+ pDC->LineTo(16, y - 1);
+
+ pDC->SelectObject(highlightPen);
+ pDC->MoveTo(1, y);
+ pDC->LineTo(16, y);
+ }
+
+ BOOL showAllNumbers = (theTowerDoc->towerDoc_vf108() == 0);
+
+ for (i = 0; i <= height; i++) {
+ y = viewRect.top + (vRange * i) / height;
+ anotherRect.SetRect(0, y, 14, viewRect.top + (vRange * (i + 1)) / height);
+
+ int number = theTowerDoc->mWorldDef->mGroundLine - i;
+ BOOL show = showAllNumbers;
+
+ if (number > 1 && (number % 5 == 0))
+ show = true;
+ if (number == 1)
+ show = true;
+ if (number < 1 && ((number - 1) % 5 == 0))
+ show = true;
+
+ if (show) {
+ if (number >= 1)
+ wsprintf(str, "%d", number);
+ else
+ wsprintf(str, "B%d", 1 - number);
+
+ int textLen = strlen(str);
+
+ textPos.x = 2;
+ textPos.y = ((anotherRect.top + anotherRect.bottom) / 2) - (pDC->GetTextExtent(str, 2).cx / 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNHIGHLIGHT));
+ pDC->TextOut(textPos.x + 1, textPos.y + 1, str, 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW));
+ pDC->TextOut(textPos.x - 1, textPos.y - 1, str, 2);
+
+ pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
+ pDC->TextOut(textPos.x, textPos.y, str, 2);
+ }
+ }
+ }
+
+ pDC->RestoreDC(save);
+ return false;
+}
+
+afx_msg void T2MainWindow::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {
+ CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
+}
+
+afx_msg void T2MainWindow::OnActivateApp(BOOL bActive, HTASK hTask) {
+ CWnd::OnActivateApp(bActive, hTask);
+
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (theTowerDoc && theTowerDoc->mWorldDef) {
+ CDC *pDC = GetDC();
+ pDC->SaveDC();
+ pDC->SelectPalette(theTowerDoc->mWorldDef->GetPalette(), false);
+ pDC->RealizePalette();
+ pDC->RestoreDC(-1);
+ ReleaseDC(pDC);
+
+ InvalidateRect(NULL);
+
+ T2TowerMainView *theTowerMainView = theTowerDoc->GetTowerMainView();
+ if (theTowerMainView)
+ theTowerMainView->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW);
+
+ DWORD processID;
+ GetWindowThreadProcessId(this, &processID);
+
+ CWnd *window = GetDesktopWindow()->GetWindow(GW_CHILD);
+ while (window) {
+ DWORD checkProcessID;
+ GetWindowThreadProcessId(window, &checkProcessID);
+
+ if (processID == checkProcessID)
+ window->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW);
+
+ window = window->GetWindow(GW_HWNDNEXT);
+ }
+ }
+}
+
+afx_msg void T2MainWindow::OnCmdDebugEvent() {
+ // TODO: DbgEventList
+}
+
+afx_msg void T2MainWindow::OnUpdateCmdDebugEvent(CCmdUI *pCmdUI) {
+ pCmdUI->Enable();
+}
+
+afx_msg void T2MainWindow::OnClose() {
+ T2TowerDoc *theTowerDoc = (T2TowerDoc *) GetActiveDocument();
+
+ if (theTowerDoc->towerDoc_vf1A4())
+ return;
+
+ CFrameWnd::OnClose();
+}
+
+afx_msg void T2MainWindow::OnCmdDebugMode() {
+ HMENU oldMenu = GetMenu(this);
+ HMENU newMenu = LoadMenu(AfxGetInstanceHandle(), 130);
+ m_hMenuDefault = newMenu;
+ SetMenu(this, newMenu);
+ DestroyMenu(oldMenu);
+}