From 4ecc284f759cb489aefd24d40b6c69e0723383ae Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Tue, 9 Mar 2010 00:43:46 +0000 Subject: [PATCH] Updated win32 solution and also made mgm files optional (not required) so that mega-glest will work with or without the new 8 player maps --- mk/linux/glest | 3 +- mk/windoze/Glest.suo | Bin 52224 -> 58368 bytes mk/windoze/g3d_viewer.vcproj | 16 +- mk/windoze/glest_editor.vcproj | 24 +- mk/windoze/glest_game.vcproj | 4 + .../menu/menu_state_custom_game.cpp | 5 +- source/glest_map_editor/main.cpp | 1771 +++++++++-------- .../include/platform/sdl/platform_util.h | 2 +- .../include/platform/win32/platform_util.h | 2 +- .../sources/platform/sdl/platform_util.cpp | 6 +- .../sources/platform/win32/platform_util.cpp | 6 +- 11 files changed, 924 insertions(+), 915 deletions(-) diff --git a/mk/linux/glest b/mk/linux/glest index 5c929cdc9..0977f231b 100755 --- a/mk/linux/glest +++ b/mk/linux/glest @@ -19,6 +19,7 @@ cd $GAMEDIR # export game library directory test -n "${LIBDIR}" && export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GAMEDIR}/${LIBDIR}" -./glest.bin > glest.log 2>&1 +#./glest.bin > glest.log 2>&1 +./glest.bin # ./glest > /tmp/`date +"%F_%k-%M-%S"`.glest.log 2>&1 diff --git a/mk/windoze/Glest.suo b/mk/windoze/Glest.suo index 7ce27957577908fe819b6853b7c1814bdb297ac9..5b51999fb90b1c7aeee63043645e8a102207c00f 100644 GIT binary patch literal 58368 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℘Q&dJ&it>T`_V?!`EwbDuM5_Udv z&)fOWxz=C8D607k*FX415<|c>h(l{{^kTl-X+^h5FC!1)sKj&*wjD zM{a}om#u)4b0LNL&pod9>an@w&)pTd4gG%)oK!*z_5Y)ATbTc)S%2gHq|ZQTa>t*& zk=%yypKt!R;*o{qKd0*R8J7R~`rm+u-meGej=wf8=LiJje*x}uzgVI9&+Tj<*E5g( z^XI*62XHsDg)LwBd{^D_vlp0XWlA~wa0&`#0}z_!5Pp~1;!Ft5IS~7K z?}DA*Wo;(oit_s)Gy@Pae(ymD4R@ZBRYM+z(0m<2b~fZ25Sm9JWZacC2%&i#VzcjA z#OE6o%WV=D#q{rMr>M)?aGYB+b>Zx2 z<{(EDmA>ncqn(f)7R&8B--cdd{hs(4a9F7R`v}~gqzC7Uf4x;_a)*HNXGvqNDb#=N fM}9z$&E @@ -192,7 +192,7 @@ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" > @@ -202,11 +202,11 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > diff --git a/mk/windoze/glest_editor.vcproj b/mk/windoze/glest_editor.vcproj index 737160028..6e4af51cb 100644 --- a/mk/windoze/glest_editor.vcproj +++ b/mk/windoze/glest_editor.vcproj @@ -40,7 +40,7 @@ @@ -201,7 +201,7 @@ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" > @@ -211,19 +211,19 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > diff --git a/mk/windoze/glest_game.vcproj b/mk/windoze/glest_game.vcproj index b2fd0d46c..ffef3c8c8 100644 --- a/mk/windoze/glest_game.vcproj +++ b/mk/windoze/glest_game.vcproj @@ -388,6 +388,10 @@ RelativePath="..\..\source\glest_game\graphics\renderer.h" > + + - -#include "conversion.h" - -using namespace Shared::Util; -using namespace std; - -namespace MapEditor { - -const string MainWindow::versionString = "v1.5.0-beta3"; -const string MainWindow::winHeader = "Glest Map Editor " + versionString + " - Built: " + __DATE__; - -// =============================================== -// class Global functions -// =============================================== - -wxString ToUnicode(const char* str) { - return wxString(str, wxConvUTF8); -} - -wxString ToUnicode(const string& str) { - return wxString(str.c_str(), wxConvUTF8); -} - -// =============================================== -// class MainWindow -// =============================================== - -MainWindow::MainWindow() - : wxFrame(NULL, -1, ToUnicode(winHeader), wxDefaultPosition, wxSize(800, 600)) { - - fileModified=false; - lastX=0; - lastY=0; - radius=1; - height=0; - surface=1; - object=0; - resource=0; - startLocation=1; - enabledGroup=ctHeight; - currentBrush=btHeight; - resourceUnderMouse=0; - objectUnderMouse=0; - - //gl canvas - int args[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER }; - glCanvas = new GlCanvas(this, args); - - //menus - menuBar = new wxMenuBar(); - - //file - menuFile = new wxMenu(); - menuFile->Append(wxID_OPEN); - menuFile->AppendSeparator(); - menuFile->Append(wxID_SAVE); - menuFile->Append(wxID_SAVEAS); - menuFile->AppendSeparator(); - menuFile->Append(wxID_EXIT); - menuBar->Append(menuFile, wxT("&File")); - - //edit - menuEdit = new wxMenu(); - menuEdit->Append(miEditUndo, wxT("&Undo\tCTRL+z")); - menuEdit->Append(miEditRedo, wxT("&Redo\tCTRL+y")); - menuEdit->Append(miEditReset, wxT("Rese&t")); - menuEdit->Append(miEditResetPlayers, wxT("Reset &Players")); - menuEdit->Append(miEditResize, wxT("Re&size")); - menuEdit->Append(miEditFlipX, wxT("Flip &X")); - menuEdit->Append(miEditFlipY, wxT("Flip &Y")); - menuEdit->Append(miEditRandomizeHeights, wxT("Randomize &Heights")); - menuEdit->Append(miEditRandomize, wxT("Randomi&ze")); - menuEdit->Append(miEditSwitchSurfaces, wxT("Switch Su&rfaces")); - menuEdit->Append(miEditInfo, wxT("&Info")); - menuEdit->Append(miEditAdvanced, wxT("&Advanced")); - menuBar->Append(menuEdit, wxT("&Edit")); - - //misc - menuMisc = new wxMenu(); - menuMisc->Append(miMiscResetZoomAndPos, wxT("&Reset zoom and pos")); - menuMisc->Append(miMiscAbout, wxT("&About")); - menuMisc->Append(miMiscHelp, wxT("&Help")); - menuBar->Append(menuMisc, wxT("&Misc")); - - //brush - menuBrush = new wxMenu(); - - // Glest height brush - menuBrushHeight = new wxMenu(); - for (int i = 0; i < heightCount; ++i) { - menuBrushHeight->AppendCheckItem(miBrushHeight + i + 1, ToUnicode(intToStr(i - heightCount / 2))); - } - menuBrushHeight->Check(miBrushHeight + (heightCount + 1) / 2, true); - menuBrush->Append(miBrushHeight, wxT("&Height"), menuBrushHeight); - - enabledGroup = ctHeight; - - // ZombiePirate height brush - menuBrushGradient = new wxMenu(); - for (int i = 0; i < heightCount; ++i) { - menuBrushGradient->AppendCheckItem(miBrushGradient + i + 1, ToUnicode(intToStr(i - heightCount / 2))); - } - menuBrush->Append(miBrushGradient, wxT("&Gradient"), menuBrushGradient); - - //surface - menuBrushSurface = new wxMenu(); - menuBrushSurface->AppendCheckItem(miBrushSurface + 1, wxT("&1 - Grass")); - menuBrushSurface->AppendCheckItem(miBrushSurface + 2, wxT("&2 - Secondary Grass")); - menuBrushSurface->AppendCheckItem(miBrushSurface + 3, wxT("&3 - Road")); - menuBrushSurface->AppendCheckItem(miBrushSurface + 4, wxT("&4 - Stone")); - menuBrushSurface->AppendCheckItem(miBrushSurface + 5, wxT("&5 - Ground")); - menuBrush->Append(miBrushSurface, wxT("&Surface"), menuBrushSurface); - - //objects - menuBrushObject = new wxMenu(); - menuBrushObject->AppendCheckItem(miBrushObject + 1, wxT("&0 - None (erase)")); - menuBrushObject->AppendCheckItem(miBrushObject+2, wxT("&1 - Tree (unwalkable/harvestable)")); - menuBrushObject->AppendCheckItem(miBrushObject+3, wxT("&2 - DeadTree/Cactuses/Thornbush (unwalkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+4, wxT("&3 - Stone (unwalkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+5, wxT("&4 - Bush/Grass/Fern (walkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+6, wxT("&5 - Water Object/Reed/Papyrus (walkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+7, wxT("&6 - C1 BigTree/DeadTree/OldPalm (unwalkable/not harvestable)")); - menuBrushObject->AppendCheckItem(miBrushObject+8, wxT("&7 - C2 Hanged/Impaled (unwalkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+9, wxT("&8 - C3 Statues (unwalkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+10, wxT("&9 - C4 Big Rock (Mountain) (unwalkable)")); - menuBrushObject->AppendCheckItem(miBrushObject+11, wxT("10 &- C5 Invisible Blocking Object (unwalkable)")); - menuBrush->Append(miBrushObject, wxT("&Object"), menuBrushObject); - - //resources - menuBrushResource = new wxMenu(); - menuBrushResource->AppendCheckItem(miBrushResource + 1, wxT("&0 - None")); - menuBrushResource->AppendCheckItem(miBrushResource+2, wxT("&1 - gold (unwalkable)")); - menuBrushResource->AppendCheckItem(miBrushResource+3, wxT("&2 - stone (unwalkable)")); - menuBrushResource->AppendCheckItem(miBrushResource+4, wxT("&3 - custom")); - menuBrushResource->AppendCheckItem(miBrushResource+5, wxT("&4 - custom")); - menuBrushResource->AppendCheckItem(miBrushResource+6, wxT("&5 - custom")); - menuBrush->Append(miBrushResource, wxT("&Resource"), menuBrushResource); - - //players - menuBrushStartLocation = new wxMenu(); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 1, wxT("&1 - Player 1")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 2, wxT("&2 - Player 2")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 3, wxT("&3 - Player 3")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 4, wxT("&4 - Player 4")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 5, wxT("&5 - Player 5 ")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 6, wxT("&6 - Player 6 ")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 7, wxT("&7 - Player 7 ")); - menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 8, wxT("&8 - Player 8 ")); - menuBrush->Append(miBrushStartLocation, wxT("&Player"), menuBrushStartLocation); - menuBar->Append(menuBrush, wxT("&Brush")); - - //radius - menuRadius = new wxMenu(); - for (int i = 1; i <= radiusCount; ++i) { - menuRadius->AppendCheckItem(miRadius + i, ToUnicode("&" + intToStr(i) + "\tALT+" + intToStr(i))); - } - menuRadius->Check(miRadius + 1, true); - menuBar->Append(menuRadius, wxT("&Radius")); - - SetMenuBar(menuBar); - - fileName = "New (unsaved) map"; - int status_widths[siCOUNT] = { - 10, // empty - -2, // File name - -1, // File type - -2, // Current Object - -2, // Brush Type - -2, // Brush 'Value' - -1, // Brush Radius - }; - CreateStatusBar(siCOUNT); - GetStatusBar()->SetStatusWidths(siCOUNT, status_widths); - - SetStatusText(wxT("File: ") + ToUnicode(fileName), siFILE_NAME); - SetStatusText(wxT(".gbm"), siFILE_TYPE); - SetStatusText(wxT("Object: None (Erase)"), siCURR_OBJECT); - SetStatusText(wxT("Brush: Height"), siBRUSH_TYPE); - SetStatusText(wxT("Value: 0"), siBRUSH_VALUE); - SetStatusText(wxT("Radius: 1"), siBRUSH_RADIUS); - -#ifndef WIN32 - timer = new wxTimer(this); - timer->Start(100); -#endif - glCanvas->SetFocus(); -} - -void MainWindow::init(string fname) { - glCanvas->SetCurrent(); - program = new Program(GetClientSize().x, GetClientSize().y); - - fileName = "New (unsaved) Map"; - if (!fname.empty() && fileExists(fname)) { - program->loadMap(fname); - currentFile = fname; - fileName = cutLastExt(lastFile(fname)); - } - SetTitle(ToUnicode(winHeader + "; " + currentFile)); - setDirty(false); - setExtension(); -} - -void MainWindow::onClose(wxCloseEvent &event) { - delete this; -} - -MainWindow::~MainWindow() { - delete program; - delete glCanvas; -} - -void MainWindow::setDirty(bool val) { - if (fileModified && val) { - return; - } - fileModified = val; - if (fileModified) { - SetStatusText(wxT("File: ") + ToUnicode(fileName) + wxT("*"), siFILE_NAME); - } else { - SetStatusText(wxT("File: ") + ToUnicode(fileName), siFILE_NAME); - } -} - -void MainWindow::setExtension() { - if (currentFile.empty()) { - return; - } - string extnsn = ext(currentFile); - if (extnsn == "gbm" || extnsn == "mgm") { - currentFile = cutLastExt(currentFile); - } - if (Program::getMap()->getMaxFactions() <= 4) { - SetStatusText(wxT(".gbm"), siFILE_TYPE); - currentFile += ".gbm"; - } else { - SetStatusText(wxT(".mgm"), siFILE_TYPE); - currentFile += ".mgm"; - } -} - -void MainWindow::onTimer(wxTimerEvent &event) { - wxPaintEvent paintEvent; - onPaint(paintEvent); - -} - -void MainWindow::onMouseDown(wxMouseEvent &event) { - if (event.LeftIsDown()) { - program->setUndoPoint(enabledGroup); - program->setRefAlt(event.GetX(), event.GetY()); - change(event.GetX(), event.GetY()); - if (!isDirty()) { - setDirty(true); - } - wxPaintEvent ev; - onPaint(ev); - } - event.Skip(); -} - -void MainWindow::onMouseMove(wxMouseEvent &event) { - int dif; - - int x = event.GetX(); - int y = event.GetY(); - - bool doPaint = true; - if (event.LeftIsDown()) { - change(x, y); - } else if (event.MiddleIsDown()) { - dif = (y - lastY); - if (dif != 0) { - program->incCellSize(dif / abs(dif)); - } - } else if (event.RightIsDown()) { - program->setOfset(x - lastX, y - lastY); - } else { - doPaint = false; - } - lastX = x; - lastY = y; - if (doPaint) { - wxPaintEvent ev; - onPaint(ev); - } - else { - int currResource = program->getResource(x,y); - if(currResource>0){ - SetStatusText(wxT("Resource: ") + ToUnicode(resource_descs[currResource]), siCURR_OBJECT); - resourceUnderMouse = currResource; - objectUnderMouse = 0; - } - else { - int currObject = program->getObject(x,y); - SetStatusText(wxT("Object: ") + ToUnicode(object_descs[currObject]), siCURR_OBJECT); - resourceUnderMouse = 0; - objectUnderMouse = currObject; - } - } - - event.Skip(); -} - -void MainWindow::onPaint(wxPaintEvent &event) { - program->renderMap(GetClientSize().x, GetClientSize().y); - glCanvas->SwapBuffers(); -} - -void MainWindow::onMenuFileLoad(wxCommandEvent &event) { - wxFileDialog fileDialog(this); - fileDialog.SetWildcard(wxT("Glest Map (*.gbm)|*.gbm|Mega Map (*.mgm)|*.mgm")); - if (fileDialog.ShowModal() == wxID_OK) { - currentFile = fileDialog.GetPath().ToAscii(); - program->loadMap(currentFile); - fileName = cutLastExt(lastFile(currentFile)); - setDirty(false); - setExtension(); - SetTitle(ToUnicode(winHeader + "; " + currentFile)); - } -} - -void MainWindow::onMenuFileSave(wxCommandEvent &event) { - if (currentFile.empty()) { - wxCommandEvent ev; - onMenuFileSaveAs(ev); - } else { - setExtension(); - program->saveMap(currentFile); - setDirty(false); - } -} - -void MainWindow::onMenuFileSaveAs(wxCommandEvent &event) { - wxFileDialog fileDialog(this, wxT("Select file"), wxT(""), wxT(""), wxT("*.gbm|*.mgm"), wxSAVE); - fileDialog.SetWildcard(wxT("Glest Map (*.gbm)|*.gbm|Mega Map (*.mgm)|*.mgm")); - if (fileDialog.ShowModal() == wxID_OK) { - currentFile = fileDialog.GetPath().ToAscii(); - setExtension(); - program->saveMap(currentFile); - fileName = cutLastExt(lastFile(currentFile)); - setDirty(false); - } - SetTitle(ToUnicode(winHeader + "; " + currentFile)); -} - -void MainWindow::onMenuFileExit(wxCommandEvent &event) { - Close(); -} - -void MainWindow::onMenuEditUndo(wxCommandEvent &event) { - std::cout << "Undo Pressed" << std::endl; - if (program->undo()) { - Refresh(); - setDirty(); - } -} - -void MainWindow::onMenuEditRedo(wxCommandEvent &event) { - std::cout << "Redo Pressed" << std::endl; - if (program->redo()) { - Refresh(); - setDirty(); - } -} - -void MainWindow::onMenuEditReset(wxCommandEvent &event) { - program->setUndoPoint(ctAll); - SimpleDialog simpleDialog; - simpleDialog.addValue("Altitude", "10"); - simpleDialog.addValue("Surface", "1"); - simpleDialog.addValue("Width", "64"); - simpleDialog.addValue("Height", "64"); - simpleDialog.show(); - - try { - program->reset( - strToInt(simpleDialog.getValue("Width")), - strToInt(simpleDialog.getValue("Height")), - strToInt(simpleDialog.getValue("Altitude")), - strToInt(simpleDialog.getValue("Surface"))); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - currentFile = ""; - fileName = "New (unsaved) map"; -} - -void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) { - SimpleDialog simpleDialog; - simpleDialog.addValue("Factions", intToStr(program->getMap()->getMaxFactions())); - simpleDialog.show(); - - try { - program->resetFactions(strToInt(simpleDialog.getValue("Factions"))); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - setDirty(); - setExtension(); -} - -void MainWindow::onMenuEditResize(wxCommandEvent &event) { - SimpleDialog simpleDialog; - simpleDialog.addValue("Altitude", "10"); - simpleDialog.addValue("Surface", "1"); - simpleDialog.addValue("Height", "64"); - simpleDialog.addValue("Width", "64"); - simpleDialog.show(); - - try { - program->resize( - strToInt(simpleDialog.getValue("Height")), - strToInt(simpleDialog.getValue("Width")), - strToInt(simpleDialog.getValue("Altitude")), - strToInt(simpleDialog.getValue("Surface"))); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - setDirty(); -} - -void MainWindow::onMenuEditFlipX(wxCommandEvent &event) { - program->flipX(); - setDirty(); -} - -void MainWindow::onMenuEditFlipY(wxCommandEvent &event) { - program->flipY(); - setDirty(); -} - -void MainWindow::onMenuEditRandomizeHeights(wxCommandEvent &event) { - program->randomizeMapHeights(); - setDirty(); -} - -void MainWindow::onMenuEditRandomize(wxCommandEvent &event) { - program->randomizeMap(); - setDirty(); -} - -void MainWindow::onMenuEditSwitchSurfaces(wxCommandEvent &event) { - SimpleDialog simpleDialog; - simpleDialog.addValue("Surface1", "1"); - simpleDialog.addValue("Surface2", "2"); - simpleDialog.show(); - - try { - program->switchMapSurfaces( - strToInt(simpleDialog.getValue("Surface1")), - strToInt(simpleDialog.getValue("Surface2"))); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - setDirty(); -} - -void MainWindow::onMenuEditInfo(wxCommandEvent &event) { - SimpleDialog simpleDialog; - simpleDialog.addValue("Title", program->getMap()->getTitle()); - simpleDialog.addValue("Desc", program->getMap()->getDesc()); - simpleDialog.addValue("Author", program->getMap()->getAuthor()); - - simpleDialog.show(); - - if (program->setMapTitle(simpleDialog.getValue("Title")) - || program->setMapDesc(simpleDialog.getValue("Desc")) - || program->setMapAuthor(simpleDialog.getValue("Author"))) { - if (!isDirty()) { - setDirty(true); - } - } -} - -void MainWindow::onMenuEditAdvanced(wxCommandEvent &event) { - SimpleDialog simpleDialog; - simpleDialog.addValue("Height Factor", intToStr(program->getMap()->getHeightFactor())); - simpleDialog.addValue("Water Level", intToStr(program->getMap()->getWaterLevel())); - - simpleDialog.show(); - - try { - program->setMapAdvanced( - strToInt(simpleDialog.getValue("Height Factor")), - strToInt(simpleDialog.getValue("Water Level"))); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - setDirty(); -} - -void MainWindow::onMenuMiscResetZoomAndPos(wxCommandEvent &event) { - program->resetOfset(); -} - -void MainWindow::onMenuMiscAbout(wxCommandEvent &event) { - wxMessageDialog( - NULL, - wxT("Glest Map Editor - Copyright 2004 The Glest Team\n(with improvements by others, 2010)."), - wxT("About")).ShowModal(); -} - -void MainWindow::onMenuMiscHelp(wxCommandEvent &event) { - wxMessageDialog( - NULL, - wxT("Left mouse click: draw\nRight mouse drag: move\nCenter mouse drag: zoom"), - wxT("Help")).ShowModal(); -} - -void MainWindow::onMenuBrushHeight(wxCommandEvent &e) { - uncheckBrush(); - menuBrushHeight->Check(e.GetId(), true); - height = e.GetId() - miBrushHeight - heightCount / 2 - 1; - enabledGroup = ctHeight; - currentBrush = btHeight; - SetStatusText(wxT("Brush: Height"), siBRUSH_TYPE); - SetStatusText(wxT("Value: ") + ToUnicode(intToStr(height)), siBRUSH_VALUE); -} - -void MainWindow::onMenuBrushGradient(wxCommandEvent &e) { - uncheckBrush(); - menuBrushGradient->Check(e.GetId(), true); - height = e.GetId() - miBrushGradient - heightCount / 2 - 1; - enabledGroup = ctGradient; - currentBrush = btGradient; - SetStatusText(wxT("Brush: Gradient"), siBRUSH_TYPE); - SetStatusText(wxT("Value: ") + ToUnicode(intToStr(height)), siBRUSH_VALUE); -} - - -void MainWindow::onMenuBrushSurface(wxCommandEvent &e) { - uncheckBrush(); - menuBrushSurface->Check(e.GetId(), true); - surface = e.GetId() - miBrushSurface; - enabledGroup = ctSurface; - currentBrush = btSurface; - SetStatusText(wxT("Brush: Surface"), siBRUSH_TYPE); - SetStatusText( - wxT("Value: ") + ToUnicode(intToStr(surface)) + wxT(" ") - + ToUnicode(surface_descs[surface - 1]), siBRUSH_VALUE); -} - -void MainWindow::onMenuBrushObject(wxCommandEvent &e) { - uncheckBrush(); - menuBrushObject->Check(e.GetId(), true); - object = e.GetId() - miBrushObject - 1; - enabledGroup = ctObject; - currentBrush = btObject; - SetStatusText(wxT("Brush: Object"), siBRUSH_TYPE); - SetStatusText( - wxT("Value: ") + ToUnicode(intToStr(object)) + wxT(" ") - + ToUnicode(object_descs[object]), siBRUSH_VALUE); -} - -void MainWindow::onMenuBrushResource(wxCommandEvent &e) { - uncheckBrush(); - menuBrushResource->Check(e.GetId(), true); - resource = e.GetId() - miBrushResource - 1; - enabledGroup = ctResource; - currentBrush = btResource; - SetStatusText(wxT("Brush: Resource"), siBRUSH_TYPE); - SetStatusText( - wxT("Value: ") + ToUnicode(intToStr(resource)) + wxT(" ") - + ToUnicode(resource_descs[resource]), siBRUSH_VALUE); -} - -void MainWindow::onMenuBrushStartLocation(wxCommandEvent &e) { - uncheckBrush(); - menuBrushStartLocation->Check(e.GetId(), true); - startLocation = e.GetId() - miBrushStartLocation; - enabledGroup = ctLocation; - currentBrush = btStartLocation; - SetStatusText(wxT("Brush: Start Locations"), siBRUSH_TYPE); - SetStatusText(wxT("Value: ") + ToUnicode(intToStr(startLocation)), siBRUSH_VALUE); -} - -void MainWindow::onMenuRadius(wxCommandEvent &e) { - uncheckRadius(); - menuRadius->Check(e.GetId(), true); - radius = e.GetId() - miRadius; - SetStatusText(wxT("Radius: ") + ToUnicode(intToStr(radius)), siBRUSH_RADIUS); -} - -void MainWindow::change(int x, int y) { - switch (enabledGroup) { - case ctHeight: - program->glestChangeMapHeight(x, y, height, radius); - break; - case ctSurface: - program->changeMapSurface(x, y, surface, radius); - break; - case ctObject: - program->changeMapObject(x, y, object, radius); - break; - case ctResource: - program->changeMapResource(x, y, resource, radius); - break; - case ctLocation: - program->changeStartLocation(x, y, startLocation - 1); - break; - case ctGradient: - program->pirateChangeMapHeight(x, y, height, radius); - break; - } -} - -void MainWindow::uncheckBrush() { - for (int i = 0; i < heightCount; ++i) { - menuBrushHeight->Check(miBrushHeight + i + 1, false); - } - for (int i = 0; i < heightCount; ++i) { - menuBrushGradient->Check(miBrushGradient + i + 1, false); - } - for (int i = 0; i < surfaceCount; ++i) { - menuBrushSurface->Check(miBrushSurface + i + 1, false); - } - for (int i = 0; i < objectCount; ++i) { - menuBrushObject->Check(miBrushObject + i + 1, false); - } - for (int i = 0; i < resourceCount; ++i) { - menuBrushResource->Check(miBrushResource + i + 1, false); - } - for (int i = 0; i < startLocationCount; ++i) { - menuBrushStartLocation->Check(miBrushStartLocation + i + 1, false); - } -} - -void MainWindow::uncheckRadius() { - for (int i = 1; i <= radiusCount; ++i) { - menuRadius->Check(miRadius + i, false); - } -} - - void MainWindow::onKeyDown(wxKeyEvent &e) { - if (currentBrush == btHeight || currentBrush == btGradient) { // 'height' brush - if (e.GetKeyCode() >= '0' && e.GetKeyCode() <= '5') { - height = e.GetKeyCode() - 48; // '0'-'5' == 0-5 - if (e.GetModifiers() == wxMOD_CONTROL) { // Ctrl means negative - height = -height ; - } - int id_offset = heightCount / 2 + height + 1; - if (currentBrush == btHeight) { - wxCommandEvent evt(wxEVT_NULL, miBrushHeight + id_offset); - onMenuBrushHeight(evt); - } else { - wxCommandEvent evt(wxEVT_NULL, miBrushGradient + id_offset); - onMenuBrushGradient(evt); - } - return; - } - } - if (currentBrush == btSurface) { // surface texture - if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '5') { - surface = e.GetKeyCode() - 48; // '1'-'5' == 1-5 - wxCommandEvent evt(wxEVT_NULL, miBrushSurface + surface); - onMenuBrushSurface(evt); - return; - } - } - if (currentBrush == btObject) { - bool valid = true; - if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '9') { - object = e.GetKeyCode() - 48; // '1'-'9' == 1-9 - } else if (e.GetKeyCode() == '0') { // '0' == 10 - object = 10; - } else if (e.GetKeyCode() == '-') { // '-' == 0 - object = 0; - } else { - valid = false; - } - if (valid) { - wxCommandEvent evt(wxEVT_NULL, miBrushObject + object + 1); - onMenuBrushObject(evt); - return; - } - } - if (currentBrush == btResource) { - if (e.GetKeyCode() >= '0' && e.GetKeyCode() <= '5') { - resource = e.GetKeyCode() - 48; // '0'-'5' == 0-5 - wxCommandEvent evt(wxEVT_NULL, miBrushResource + resource + 1); - onMenuBrushResource(evt); - return; - } - } - if (currentBrush == btStartLocation) { - if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '8') { - startLocation = e.GetKeyCode() - 48; // '1'-'8' == 0-7 - wxCommandEvent evt(wxEVT_NULL, miBrushStartLocation + startLocation); - onMenuBrushStartLocation(evt); - return; - } - } - if (e.GetKeyCode() == 'H') { - wxCommandEvent evt(wxEVT_NULL, miBrushHeight + height + heightCount / 2 + 1); - onMenuBrushHeight(evt); - } else if (e.GetKeyCode() == ' ') { - if( resourceUnderMouse != 0 ) - { - wxCommandEvent evt(wxEVT_NULL, miBrushResource + resourceUnderMouse + 1); - onMenuBrushResource(evt); - } - else - { - wxCommandEvent evt(wxEVT_NULL, miBrushObject + objectUnderMouse + 1); - onMenuBrushObject(evt); - } - } else if (e.GetKeyCode() == 'G') { - wxCommandEvent evt(wxEVT_NULL, miBrushGradient + height + heightCount / 2 + 1); - onMenuBrushGradient(evt); - } else if (e.GetKeyCode() == 'S') { - wxCommandEvent evt(wxEVT_NULL, miBrushSurface + surface); - onMenuBrushSurface(evt); - } else if (e.GetKeyCode() == 'O') { - wxCommandEvent evt(wxEVT_NULL, miBrushObject + object + 1); - onMenuBrushObject(evt); - } else if (e.GetKeyCode() == 'R') { - wxCommandEvent evt(wxEVT_NULL, miBrushResource + resource + 1); - onMenuBrushResource(evt); - } else if (e.GetKeyCode() == 'L') { - wxCommandEvent evt(wxEVT_NULL, miBrushStartLocation + startLocation + 1); - onMenuBrushStartLocation(evt); - } else { - e.Skip(); - } -} - -BEGIN_EVENT_TABLE(MainWindow, wxFrame) - - EVT_TIMER(-1, MainWindow::onTimer) - - EVT_CLOSE(MainWindow::onClose) - - // these are 'handled' by GlCanvas and funneled to these handlers - //EVT_LEFT_DOWN(MainWindow::onMouseDown) - //EVT_MOTION(MainWindow::onMouseMove) - //EVT_KEY_DOWN(MainWindow::onKeyDown) - - EVT_MENU(wxID_OPEN, MainWindow::onMenuFileLoad) - EVT_MENU(wxID_SAVE, MainWindow::onMenuFileSave) - EVT_MENU(wxID_SAVEAS, MainWindow::onMenuFileSaveAs) - EVT_MENU(wxID_EXIT, MainWindow::onMenuFileExit) - - EVT_MENU(miEditUndo, MainWindow::onMenuEditUndo) - EVT_MENU(miEditRedo, MainWindow::onMenuEditRedo) - EVT_MENU(miEditReset, MainWindow::onMenuEditReset) - EVT_MENU(miEditResetPlayers, MainWindow::onMenuEditResetPlayers) - EVT_MENU(miEditResize, MainWindow::onMenuEditResize) - EVT_MENU(miEditFlipX, MainWindow::onMenuEditFlipX) - EVT_MENU(miEditFlipY, MainWindow::onMenuEditFlipY) - EVT_MENU(miEditRandomizeHeights, MainWindow::onMenuEditRandomizeHeights) - EVT_MENU(miEditRandomize, MainWindow::onMenuEditRandomize) - EVT_MENU(miEditSwitchSurfaces, MainWindow::onMenuEditSwitchSurfaces) - EVT_MENU(miEditInfo, MainWindow::onMenuEditInfo) - EVT_MENU(miEditAdvanced, MainWindow::onMenuEditAdvanced) - - EVT_MENU(miMiscResetZoomAndPos, MainWindow::onMenuMiscResetZoomAndPos) - EVT_MENU(miMiscAbout, MainWindow::onMenuMiscAbout) - EVT_MENU(miMiscHelp, MainWindow::onMenuMiscHelp) - - EVT_MENU_RANGE(miBrushHeight + 1, miBrushHeight + heightCount, MainWindow::onMenuBrushHeight) - EVT_MENU_RANGE(miBrushGradient + 1, miBrushGradient + heightCount, MainWindow::onMenuBrushGradient) - EVT_MENU_RANGE(miBrushSurface + 1, miBrushSurface + surfaceCount, MainWindow::onMenuBrushSurface) - EVT_MENU_RANGE(miBrushObject + 1, miBrushObject + objectCount, MainWindow::onMenuBrushObject) - EVT_MENU_RANGE(miBrushResource + 1, miBrushResource + resourceCount, MainWindow::onMenuBrushResource) - EVT_MENU_RANGE(miBrushStartLocation + 1, miBrushStartLocation + startLocationCount, MainWindow::onMenuBrushStartLocation) - EVT_MENU_RANGE(miRadius, miRadius + radiusCount, MainWindow::onMenuRadius) -END_EVENT_TABLE() - -// ===================================================== -// class GlCanvas -// ===================================================== - -GlCanvas::GlCanvas(MainWindow * mainWindow, int* args) - : wxGLCanvas(mainWindow, -1, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas"), args) { - this->mainWindow = mainWindow; -} - -void GlCanvas::onMouseDown(wxMouseEvent &event) { - mainWindow->onMouseDown(event); -} - -void GlCanvas::onMouseMove(wxMouseEvent &event) { - mainWindow->onMouseMove(event); -} - - void GlCanvas::onKeyDown(wxKeyEvent &event) { - mainWindow->onKeyDown(event); - } - -BEGIN_EVENT_TABLE(GlCanvas, wxGLCanvas) - EVT_KEY_DOWN(GlCanvas::onKeyDown) - - EVT_LEFT_DOWN(GlCanvas::onMouseDown) - EVT_MOTION(GlCanvas::onMouseMove) -END_EVENT_TABLE() - -// =============================================== -// class SimpleDialog -// =============================================== - -void SimpleDialog::addValue(const string &key, const string &value) { - values.push_back(pair(key, value)); -} - -string SimpleDialog::getValue(const string &key) { - for (int i = 0; i < values.size(); ++i) { - if (values[i].first == key) { - return values[i].second; - } - } - return ""; -} - -void SimpleDialog::show() { - - Create(NULL, -1, wxT("Edit Values")); - - wxSizer *sizer = new wxFlexGridSizer(2); - - vector texts; - - for (Values::iterator it = values.begin(); it != values.end(); ++it) { - sizer->Add(new wxStaticText(this, -1, ToUnicode(it->first)), 0, wxALL, 5); - wxTextCtrl *text = new wxTextCtrl(this, -1, ToUnicode(it->second)); - sizer->Add(text, 0, wxALL, 5); - texts.push_back(text); - } - SetSizerAndFit(sizer); - - ShowModal(); - - for (int i = 0; i < texts.size(); ++i) { - values[i].second = texts[i]->GetValue().ToAscii(); - } -} - -// =============================================== -// class App -// =============================================== - -bool App::OnInit() { - string fileparam; - if(argc==2){ - fileparam = wxFNCONV(argv[1]); - } - - mainWindow = new MainWindow(); - mainWindow->Show(); - mainWindow->init(fileparam); - return true; -} - -int App::MainLoop() { - try { - return wxApp::MainLoop(); - } catch (const exception &e) { - wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); - } - return 0; -} - -int App::OnExit() { - return 0; -} - -}// end namespace - -IMPLEMENT_APP(MapEditor::App) +// ============================================================== +// This file is part of Glest (www.glest.org) +// +// Copyright (C) 2001-2008 Marti�o Figueroa +// +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version +// ============================================================== + + + +#include "main.h" + +#include + +#include "conversion.h" +#include + +using namespace Shared::Util; +using namespace std; + +namespace MapEditor { + +const string MainWindow::versionString = "v1.5.0-beta3"; +const string MainWindow::winHeader = "Glest Map Editor " + versionString + " - Built: " + __DATE__; + +// =============================================== +// class Global functions +// =============================================== + +wxString ToUnicode(const char* str) { + return wxString(str, wxConvUTF8); +} + +wxString ToUnicode(const string& str) { + return wxString(str.c_str(), wxConvUTF8); +} + +// =============================================== +// class MainWindow +// =============================================== + +MainWindow::MainWindow() + : wxFrame(NULL, -1, ToUnicode(winHeader), wxDefaultPosition, wxSize(800, 600)) { + + fileModified=false; + lastX=0; + lastY=0; + radius=1; + height=0; + surface=1; + object=0; + resource=0; + startLocation=1; + enabledGroup=ctHeight; + currentBrush=btHeight; + resourceUnderMouse=0; + objectUnderMouse=0; + + //gl canvas + int args[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER }; + glCanvas = new GlCanvas(this, args); + + //menus + menuBar = new wxMenuBar(); + + //file + menuFile = new wxMenu(); + menuFile->Append(wxID_OPEN); + menuFile->AppendSeparator(); + menuFile->Append(wxID_SAVE); + menuFile->Append(wxID_SAVEAS); + menuFile->AppendSeparator(); + menuFile->Append(wxID_EXIT); + menuBar->Append(menuFile, wxT("&File")); + + //edit + menuEdit = new wxMenu(); + menuEdit->Append(miEditUndo, wxT("&Undo\tCTRL+z")); + menuEdit->Append(miEditRedo, wxT("&Redo\tCTRL+y")); + menuEdit->Append(miEditReset, wxT("Rese&t")); + menuEdit->Append(miEditResetPlayers, wxT("Reset &Players")); + menuEdit->Append(miEditResize, wxT("Re&size")); + menuEdit->Append(miEditFlipX, wxT("Flip &X")); + menuEdit->Append(miEditFlipY, wxT("Flip &Y")); + menuEdit->Append(miEditRandomizeHeights, wxT("Randomize &Heights")); + menuEdit->Append(miEditRandomize, wxT("Randomi&ze")); + menuEdit->Append(miEditSwitchSurfaces, wxT("Switch Su&rfaces")); + menuEdit->Append(miEditInfo, wxT("&Info")); + menuEdit->Append(miEditAdvanced, wxT("&Advanced")); + menuBar->Append(menuEdit, wxT("&Edit")); + + //misc + menuMisc = new wxMenu(); + menuMisc->Append(miMiscResetZoomAndPos, wxT("&Reset zoom and pos")); + menuMisc->Append(miMiscAbout, wxT("&About")); + menuMisc->Append(miMiscHelp, wxT("&Help")); + menuBar->Append(menuMisc, wxT("&Misc")); + + //brush + menuBrush = new wxMenu(); + + // Glest height brush + menuBrushHeight = new wxMenu(); + for (int i = 0; i < heightCount; ++i) { + menuBrushHeight->AppendCheckItem(miBrushHeight + i + 1, ToUnicode(intToStr(i - heightCount / 2))); + } + menuBrushHeight->Check(miBrushHeight + (heightCount + 1) / 2, true); + menuBrush->Append(miBrushHeight, wxT("&Height"), menuBrushHeight); + + enabledGroup = ctHeight; + + // ZombiePirate height brush + menuBrushGradient = new wxMenu(); + for (int i = 0; i < heightCount; ++i) { + menuBrushGradient->AppendCheckItem(miBrushGradient + i + 1, ToUnicode(intToStr(i - heightCount / 2))); + } + menuBrush->Append(miBrushGradient, wxT("&Gradient"), menuBrushGradient); + + //surface + menuBrushSurface = new wxMenu(); + menuBrushSurface->AppendCheckItem(miBrushSurface + 1, wxT("&1 - Grass")); + menuBrushSurface->AppendCheckItem(miBrushSurface + 2, wxT("&2 - Secondary Grass")); + menuBrushSurface->AppendCheckItem(miBrushSurface + 3, wxT("&3 - Road")); + menuBrushSurface->AppendCheckItem(miBrushSurface + 4, wxT("&4 - Stone")); + menuBrushSurface->AppendCheckItem(miBrushSurface + 5, wxT("&5 - Ground")); + menuBrush->Append(miBrushSurface, wxT("&Surface"), menuBrushSurface); + + //objects + menuBrushObject = new wxMenu(); + menuBrushObject->AppendCheckItem(miBrushObject + 1, wxT("&0 - None (erase)")); + menuBrushObject->AppendCheckItem(miBrushObject+2, wxT("&1 - Tree (unwalkable/harvestable)")); + menuBrushObject->AppendCheckItem(miBrushObject+3, wxT("&2 - DeadTree/Cactuses/Thornbush (unwalkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+4, wxT("&3 - Stone (unwalkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+5, wxT("&4 - Bush/Grass/Fern (walkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+6, wxT("&5 - Water Object/Reed/Papyrus (walkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+7, wxT("&6 - C1 BigTree/DeadTree/OldPalm (unwalkable/not harvestable)")); + menuBrushObject->AppendCheckItem(miBrushObject+8, wxT("&7 - C2 Hanged/Impaled (unwalkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+9, wxT("&8 - C3 Statues (unwalkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+10, wxT("&9 - C4 Big Rock (Mountain) (unwalkable)")); + menuBrushObject->AppendCheckItem(miBrushObject+11, wxT("10 &- C5 Invisible Blocking Object (unwalkable)")); + menuBrush->Append(miBrushObject, wxT("&Object"), menuBrushObject); + + //resources + menuBrushResource = new wxMenu(); + menuBrushResource->AppendCheckItem(miBrushResource + 1, wxT("&0 - None")); + menuBrushResource->AppendCheckItem(miBrushResource+2, wxT("&1 - gold (unwalkable)")); + menuBrushResource->AppendCheckItem(miBrushResource+3, wxT("&2 - stone (unwalkable)")); + menuBrushResource->AppendCheckItem(miBrushResource+4, wxT("&3 - custom")); + menuBrushResource->AppendCheckItem(miBrushResource+5, wxT("&4 - custom")); + menuBrushResource->AppendCheckItem(miBrushResource+6, wxT("&5 - custom")); + menuBrush->Append(miBrushResource, wxT("&Resource"), menuBrushResource); + + //players + menuBrushStartLocation = new wxMenu(); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 1, wxT("&1 - Player 1")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 2, wxT("&2 - Player 2")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 3, wxT("&3 - Player 3")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 4, wxT("&4 - Player 4")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 5, wxT("&5 - Player 5 ")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 6, wxT("&6 - Player 6 ")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 7, wxT("&7 - Player 7 ")); + menuBrushStartLocation->AppendCheckItem(miBrushStartLocation + 8, wxT("&8 - Player 8 ")); + menuBrush->Append(miBrushStartLocation, wxT("&Player"), menuBrushStartLocation); + menuBar->Append(menuBrush, wxT("&Brush")); + + //radius + menuRadius = new wxMenu(); + for (int i = 1; i <= radiusCount; ++i) { + menuRadius->AppendCheckItem(miRadius + i, ToUnicode("&" + intToStr(i) + "\tALT+" + intToStr(i))); + } + menuRadius->Check(miRadius + 1, true); + menuBar->Append(menuRadius, wxT("&Radius")); + + SetMenuBar(menuBar); + + fileName = "New (unsaved) map"; + int status_widths[siCOUNT] = { + 10, // empty + -2, // File name + -1, // File type + -2, // Current Object + -2, // Brush Type + -2, // Brush 'Value' + -1, // Brush Radius + }; + CreateStatusBar(siCOUNT); + GetStatusBar()->SetStatusWidths(siCOUNT, status_widths); + + SetStatusText(wxT("File: ") + ToUnicode(fileName), siFILE_NAME); + SetStatusText(wxT(".gbm"), siFILE_TYPE); + SetStatusText(wxT("Object: None (Erase)"), siCURR_OBJECT); + SetStatusText(wxT("Brush: Height"), siBRUSH_TYPE); + SetStatusText(wxT("Value: 0"), siBRUSH_VALUE); + SetStatusText(wxT("Radius: 1"), siBRUSH_RADIUS); + +#ifndef WIN32 + timer = new wxTimer(this); + timer->Start(100); +#endif + glCanvas->SetFocus(); +} + +void MainWindow::init(string fname) { + glCanvas->SetCurrent(); + program = new Program(GetClientSize().x, GetClientSize().y); + + fileName = "New (unsaved) Map"; + if (!fname.empty() && fileExists(fname)) { + program->loadMap(fname); + currentFile = fname; + fileName = cutLastExt(lastFile(fname)); + } + SetTitle(ToUnicode(winHeader + "; " + currentFile)); + setDirty(false); + setExtension(); +} + +void MainWindow::onClose(wxCloseEvent &event) { + delete this; +} + +MainWindow::~MainWindow() { + delete program; + delete glCanvas; +} + +void MainWindow::setDirty(bool val) { + if (fileModified && val) { + return; + } + fileModified = val; + if (fileModified) { + SetStatusText(wxT("File: ") + ToUnicode(fileName) + wxT("*"), siFILE_NAME); + } else { + SetStatusText(wxT("File: ") + ToUnicode(fileName), siFILE_NAME); + } +} + +void MainWindow::setExtension() { + if (currentFile.empty()) { + return; + } + string extnsn = ext(currentFile); + if (extnsn == "gbm" || extnsn == "mgm") { + currentFile = cutLastExt(currentFile); + } + if (Program::getMap()->getMaxFactions() <= 4) { + SetStatusText(wxT(".gbm"), siFILE_TYPE); + currentFile += ".gbm"; + } else { + SetStatusText(wxT(".mgm"), siFILE_TYPE); + currentFile += ".mgm"; + } +} + +void MainWindow::onTimer(wxTimerEvent &event) { + wxPaintEvent paintEvent; + onPaint(paintEvent); + +} + +void MainWindow::onMouseDown(wxMouseEvent &event) { + if (event.LeftIsDown()) { + program->setUndoPoint(enabledGroup); + program->setRefAlt(event.GetX(), event.GetY()); + change(event.GetX(), event.GetY()); + if (!isDirty()) { + setDirty(true); + } + wxPaintEvent ev; + onPaint(ev); + } + event.Skip(); +} + +void MainWindow::onMouseMove(wxMouseEvent &event) { + int dif; + + int x = event.GetX(); + int y = event.GetY(); + + bool doPaint = true; + if (event.LeftIsDown()) { + change(x, y); + } else if (event.MiddleIsDown()) { + dif = (y - lastY); + if (dif != 0) { + program->incCellSize(dif / abs(dif)); + } + } else if (event.RightIsDown()) { + program->setOfset(x - lastX, y - lastY); + } else { + doPaint = false; + } + lastX = x; + lastY = y; + if (doPaint) { + wxPaintEvent ev; + onPaint(ev); + } + else { + int currResource = program->getResource(x,y); + if(currResource>0){ + SetStatusText(wxT("Resource: ") + ToUnicode(resource_descs[currResource]), siCURR_OBJECT); + resourceUnderMouse = currResource; + objectUnderMouse = 0; + } + else { + int currObject = program->getObject(x,y); + SetStatusText(wxT("Object: ") + ToUnicode(object_descs[currObject]), siCURR_OBJECT); + resourceUnderMouse = 0; + objectUnderMouse = currObject; + } + } + + event.Skip(); +} + +void MainWindow::onPaint(wxPaintEvent &event) { + program->renderMap(GetClientSize().x, GetClientSize().y); + glCanvas->SwapBuffers(); +} + +void MainWindow::onMenuFileLoad(wxCommandEvent &event) { + wxFileDialog fileDialog(this); + fileDialog.SetWildcard(wxT("Glest Map (*.gbm)|*.gbm|Mega Map (*.mgm)|*.mgm")); + if (fileDialog.ShowModal() == wxID_OK) { + currentFile = fileDialog.GetPath().ToAscii(); + program->loadMap(currentFile); + fileName = cutLastExt(lastFile(currentFile)); + setDirty(false); + setExtension(); + SetTitle(ToUnicode(winHeader + "; " + currentFile)); + } +} + +void MainWindow::onMenuFileSave(wxCommandEvent &event) { + if (currentFile.empty()) { + wxCommandEvent ev; + onMenuFileSaveAs(ev); + } else { + setExtension(); + program->saveMap(currentFile); + setDirty(false); + } +} + +void MainWindow::onMenuFileSaveAs(wxCommandEvent &event) { + wxFileDialog fileDialog(this, wxT("Select file"), wxT(""), wxT(""), wxT("*.gbm|*.mgm"), wxSAVE); + fileDialog.SetWildcard(wxT("Glest Map (*.gbm)|*.gbm|Mega Map (*.mgm)|*.mgm")); + if (fileDialog.ShowModal() == wxID_OK) { + currentFile = fileDialog.GetPath().ToAscii(); + setExtension(); + program->saveMap(currentFile); + fileName = cutLastExt(lastFile(currentFile)); + setDirty(false); + } + SetTitle(ToUnicode(winHeader + "; " + currentFile)); +} + +void MainWindow::onMenuFileExit(wxCommandEvent &event) { + Close(); +} + +void MainWindow::onMenuEditUndo(wxCommandEvent &event) { + std::cout << "Undo Pressed" << std::endl; + if (program->undo()) { + Refresh(); + setDirty(); + } +} + +void MainWindow::onMenuEditRedo(wxCommandEvent &event) { + std::cout << "Redo Pressed" << std::endl; + if (program->redo()) { + Refresh(); + setDirty(); + } +} + +void MainWindow::onMenuEditReset(wxCommandEvent &event) { + program->setUndoPoint(ctAll); + SimpleDialog simpleDialog; + simpleDialog.addValue("Altitude", "10"); + simpleDialog.addValue("Surface", "1"); + simpleDialog.addValue("Width", "64"); + simpleDialog.addValue("Height", "64"); + simpleDialog.show(); + + try { + program->reset( + strToInt(simpleDialog.getValue("Width")), + strToInt(simpleDialog.getValue("Height")), + strToInt(simpleDialog.getValue("Altitude")), + strToInt(simpleDialog.getValue("Surface"))); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + currentFile = ""; + fileName = "New (unsaved) map"; +} + +void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) { + SimpleDialog simpleDialog; + simpleDialog.addValue("Factions", intToStr(program->getMap()->getMaxFactions())); + simpleDialog.show(); + + try { + program->resetFactions(strToInt(simpleDialog.getValue("Factions"))); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + setDirty(); + setExtension(); +} + +void MainWindow::onMenuEditResize(wxCommandEvent &event) { + SimpleDialog simpleDialog; + simpleDialog.addValue("Altitude", "10"); + simpleDialog.addValue("Surface", "1"); + simpleDialog.addValue("Height", "64"); + simpleDialog.addValue("Width", "64"); + simpleDialog.show(); + + try { + program->resize( + strToInt(simpleDialog.getValue("Height")), + strToInt(simpleDialog.getValue("Width")), + strToInt(simpleDialog.getValue("Altitude")), + strToInt(simpleDialog.getValue("Surface"))); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + setDirty(); +} + +void MainWindow::onMenuEditFlipX(wxCommandEvent &event) { + program->flipX(); + setDirty(); +} + +void MainWindow::onMenuEditFlipY(wxCommandEvent &event) { + program->flipY(); + setDirty(); +} + +void MainWindow::onMenuEditRandomizeHeights(wxCommandEvent &event) { + program->randomizeMapHeights(); + setDirty(); +} + +void MainWindow::onMenuEditRandomize(wxCommandEvent &event) { + program->randomizeMap(); + setDirty(); +} + +void MainWindow::onMenuEditSwitchSurfaces(wxCommandEvent &event) { + SimpleDialog simpleDialog; + simpleDialog.addValue("Surface1", "1"); + simpleDialog.addValue("Surface2", "2"); + simpleDialog.show(); + + try { + program->switchMapSurfaces( + strToInt(simpleDialog.getValue("Surface1")), + strToInt(simpleDialog.getValue("Surface2"))); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + setDirty(); +} + +void MainWindow::onMenuEditInfo(wxCommandEvent &event) { + SimpleDialog simpleDialog; + simpleDialog.addValue("Title", program->getMap()->getTitle()); + simpleDialog.addValue("Desc", program->getMap()->getDesc()); + simpleDialog.addValue("Author", program->getMap()->getAuthor()); + + simpleDialog.show(); + + if (program->setMapTitle(simpleDialog.getValue("Title")) + || program->setMapDesc(simpleDialog.getValue("Desc")) + || program->setMapAuthor(simpleDialog.getValue("Author"))) { + if (!isDirty()) { + setDirty(true); + } + } +} + +void MainWindow::onMenuEditAdvanced(wxCommandEvent &event) { + SimpleDialog simpleDialog; + simpleDialog.addValue("Height Factor", intToStr(program->getMap()->getHeightFactor())); + simpleDialog.addValue("Water Level", intToStr(program->getMap()->getWaterLevel())); + + simpleDialog.show(); + + try { + program->setMapAdvanced( + strToInt(simpleDialog.getValue("Height Factor")), + strToInt(simpleDialog.getValue("Water Level"))); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + setDirty(); +} + +void MainWindow::onMenuMiscResetZoomAndPos(wxCommandEvent &event) { + program->resetOfset(); +} + +void MainWindow::onMenuMiscAbout(wxCommandEvent &event) { + wxMessageDialog( + NULL, + wxT("Glest Map Editor - Copyright 2004 The Glest Team\n(with improvements by others, 2010)."), + wxT("About")).ShowModal(); +} + +void MainWindow::onMenuMiscHelp(wxCommandEvent &event) { + wxMessageDialog( + NULL, + wxT("Left mouse click: draw\nRight mouse drag: move\nCenter mouse drag: zoom"), + wxT("Help")).ShowModal(); +} + +void MainWindow::onMenuBrushHeight(wxCommandEvent &e) { + uncheckBrush(); + menuBrushHeight->Check(e.GetId(), true); + height = e.GetId() - miBrushHeight - heightCount / 2 - 1; + enabledGroup = ctHeight; + currentBrush = btHeight; + SetStatusText(wxT("Brush: Height"), siBRUSH_TYPE); + SetStatusText(wxT("Value: ") + ToUnicode(intToStr(height)), siBRUSH_VALUE); +} + +void MainWindow::onMenuBrushGradient(wxCommandEvent &e) { + uncheckBrush(); + menuBrushGradient->Check(e.GetId(), true); + height = e.GetId() - miBrushGradient - heightCount / 2 - 1; + enabledGroup = ctGradient; + currentBrush = btGradient; + SetStatusText(wxT("Brush: Gradient"), siBRUSH_TYPE); + SetStatusText(wxT("Value: ") + ToUnicode(intToStr(height)), siBRUSH_VALUE); +} + + +void MainWindow::onMenuBrushSurface(wxCommandEvent &e) { + uncheckBrush(); + menuBrushSurface->Check(e.GetId(), true); + surface = e.GetId() - miBrushSurface; + enabledGroup = ctSurface; + currentBrush = btSurface; + SetStatusText(wxT("Brush: Surface"), siBRUSH_TYPE); + SetStatusText( + wxT("Value: ") + ToUnicode(intToStr(surface)) + wxT(" ") + + ToUnicode(surface_descs[surface - 1]), siBRUSH_VALUE); +} + +void MainWindow::onMenuBrushObject(wxCommandEvent &e) { + uncheckBrush(); + menuBrushObject->Check(e.GetId(), true); + object = e.GetId() - miBrushObject - 1; + enabledGroup = ctObject; + currentBrush = btObject; + SetStatusText(wxT("Brush: Object"), siBRUSH_TYPE); + SetStatusText( + wxT("Value: ") + ToUnicode(intToStr(object)) + wxT(" ") + + ToUnicode(object_descs[object]), siBRUSH_VALUE); +} + +void MainWindow::onMenuBrushResource(wxCommandEvent &e) { + uncheckBrush(); + menuBrushResource->Check(e.GetId(), true); + resource = e.GetId() - miBrushResource - 1; + enabledGroup = ctResource; + currentBrush = btResource; + SetStatusText(wxT("Brush: Resource"), siBRUSH_TYPE); + SetStatusText( + wxT("Value: ") + ToUnicode(intToStr(resource)) + wxT(" ") + + ToUnicode(resource_descs[resource]), siBRUSH_VALUE); +} + +void MainWindow::onMenuBrushStartLocation(wxCommandEvent &e) { + uncheckBrush(); + menuBrushStartLocation->Check(e.GetId(), true); + startLocation = e.GetId() - miBrushStartLocation; + enabledGroup = ctLocation; + currentBrush = btStartLocation; + SetStatusText(wxT("Brush: Start Locations"), siBRUSH_TYPE); + SetStatusText(wxT("Value: ") + ToUnicode(intToStr(startLocation)), siBRUSH_VALUE); +} + +void MainWindow::onMenuRadius(wxCommandEvent &e) { + uncheckRadius(); + menuRadius->Check(e.GetId(), true); + radius = e.GetId() - miRadius; + SetStatusText(wxT("Radius: ") + ToUnicode(intToStr(radius)), siBRUSH_RADIUS); +} + +void MainWindow::change(int x, int y) { + switch (enabledGroup) { + case ctHeight: + program->glestChangeMapHeight(x, y, height, radius); + break; + case ctSurface: + program->changeMapSurface(x, y, surface, radius); + break; + case ctObject: + program->changeMapObject(x, y, object, radius); + break; + case ctResource: + program->changeMapResource(x, y, resource, radius); + break; + case ctLocation: + program->changeStartLocation(x, y, startLocation - 1); + break; + case ctGradient: + program->pirateChangeMapHeight(x, y, height, radius); + break; + } +} + +void MainWindow::uncheckBrush() { + for (int i = 0; i < heightCount; ++i) { + menuBrushHeight->Check(miBrushHeight + i + 1, false); + } + for (int i = 0; i < heightCount; ++i) { + menuBrushGradient->Check(miBrushGradient + i + 1, false); + } + for (int i = 0; i < surfaceCount; ++i) { + menuBrushSurface->Check(miBrushSurface + i + 1, false); + } + for (int i = 0; i < objectCount; ++i) { + menuBrushObject->Check(miBrushObject + i + 1, false); + } + for (int i = 0; i < resourceCount; ++i) { + menuBrushResource->Check(miBrushResource + i + 1, false); + } + for (int i = 0; i < startLocationCount; ++i) { + menuBrushStartLocation->Check(miBrushStartLocation + i + 1, false); + } +} + +void MainWindow::uncheckRadius() { + for (int i = 1; i <= radiusCount; ++i) { + menuRadius->Check(miRadius + i, false); + } +} + + void MainWindow::onKeyDown(wxKeyEvent &e) { + if (currentBrush == btHeight || currentBrush == btGradient) { // 'height' brush + if (e.GetKeyCode() >= '0' && e.GetKeyCode() <= '5') { + height = e.GetKeyCode() - 48; // '0'-'5' == 0-5 + if (e.GetModifiers() == wxMOD_CONTROL) { // Ctrl means negative + height = -height ; + } + int id_offset = heightCount / 2 + height + 1; + if (currentBrush == btHeight) { + wxCommandEvent evt(wxEVT_NULL, miBrushHeight + id_offset); + onMenuBrushHeight(evt); + } else { + wxCommandEvent evt(wxEVT_NULL, miBrushGradient + id_offset); + onMenuBrushGradient(evt); + } + return; + } + } + if (currentBrush == btSurface) { // surface texture + if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '5') { + surface = e.GetKeyCode() - 48; // '1'-'5' == 1-5 + wxCommandEvent evt(wxEVT_NULL, miBrushSurface + surface); + onMenuBrushSurface(evt); + return; + } + } + if (currentBrush == btObject) { + bool valid = true; + if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '9') { + object = e.GetKeyCode() - 48; // '1'-'9' == 1-9 + } else if (e.GetKeyCode() == '0') { // '0' == 10 + object = 10; + } else if (e.GetKeyCode() == '-') { // '-' == 0 + object = 0; + } else { + valid = false; + } + if (valid) { + wxCommandEvent evt(wxEVT_NULL, miBrushObject + object + 1); + onMenuBrushObject(evt); + return; + } + } + if (currentBrush == btResource) { + if (e.GetKeyCode() >= '0' && e.GetKeyCode() <= '5') { + resource = e.GetKeyCode() - 48; // '0'-'5' == 0-5 + wxCommandEvent evt(wxEVT_NULL, miBrushResource + resource + 1); + onMenuBrushResource(evt); + return; + } + } + if (currentBrush == btStartLocation) { + if (e.GetKeyCode() >= '1' && e.GetKeyCode() <= '8') { + startLocation = e.GetKeyCode() - 48; // '1'-'8' == 0-7 + wxCommandEvent evt(wxEVT_NULL, miBrushStartLocation + startLocation); + onMenuBrushStartLocation(evt); + return; + } + } + if (e.GetKeyCode() == 'H') { + wxCommandEvent evt(wxEVT_NULL, miBrushHeight + height + heightCount / 2 + 1); + onMenuBrushHeight(evt); + } else if (e.GetKeyCode() == ' ') { + if( resourceUnderMouse != 0 ) + { + wxCommandEvent evt(wxEVT_NULL, miBrushResource + resourceUnderMouse + 1); + onMenuBrushResource(evt); + } + else + { + wxCommandEvent evt(wxEVT_NULL, miBrushObject + objectUnderMouse + 1); + onMenuBrushObject(evt); + } + } else if (e.GetKeyCode() == 'G') { + wxCommandEvent evt(wxEVT_NULL, miBrushGradient + height + heightCount / 2 + 1); + onMenuBrushGradient(evt); + } else if (e.GetKeyCode() == 'S') { + wxCommandEvent evt(wxEVT_NULL, miBrushSurface + surface); + onMenuBrushSurface(evt); + } else if (e.GetKeyCode() == 'O') { + wxCommandEvent evt(wxEVT_NULL, miBrushObject + object + 1); + onMenuBrushObject(evt); + } else if (e.GetKeyCode() == 'R') { + wxCommandEvent evt(wxEVT_NULL, miBrushResource + resource + 1); + onMenuBrushResource(evt); + } else if (e.GetKeyCode() == 'L') { + wxCommandEvent evt(wxEVT_NULL, miBrushStartLocation + startLocation + 1); + onMenuBrushStartLocation(evt); + } else { + e.Skip(); + } +} + +BEGIN_EVENT_TABLE(MainWindow, wxFrame) + + EVT_TIMER(-1, MainWindow::onTimer) + + EVT_CLOSE(MainWindow::onClose) + + // these are 'handled' by GlCanvas and funneled to these handlers + //EVT_LEFT_DOWN(MainWindow::onMouseDown) + //EVT_MOTION(MainWindow::onMouseMove) + //EVT_KEY_DOWN(MainWindow::onKeyDown) + + EVT_MENU(wxID_OPEN, MainWindow::onMenuFileLoad) + EVT_MENU(wxID_SAVE, MainWindow::onMenuFileSave) + EVT_MENU(wxID_SAVEAS, MainWindow::onMenuFileSaveAs) + EVT_MENU(wxID_EXIT, MainWindow::onMenuFileExit) + + EVT_MENU(miEditUndo, MainWindow::onMenuEditUndo) + EVT_MENU(miEditRedo, MainWindow::onMenuEditRedo) + EVT_MENU(miEditReset, MainWindow::onMenuEditReset) + EVT_MENU(miEditResetPlayers, MainWindow::onMenuEditResetPlayers) + EVT_MENU(miEditResize, MainWindow::onMenuEditResize) + EVT_MENU(miEditFlipX, MainWindow::onMenuEditFlipX) + EVT_MENU(miEditFlipY, MainWindow::onMenuEditFlipY) + EVT_MENU(miEditRandomizeHeights, MainWindow::onMenuEditRandomizeHeights) + EVT_MENU(miEditRandomize, MainWindow::onMenuEditRandomize) + EVT_MENU(miEditSwitchSurfaces, MainWindow::onMenuEditSwitchSurfaces) + EVT_MENU(miEditInfo, MainWindow::onMenuEditInfo) + EVT_MENU(miEditAdvanced, MainWindow::onMenuEditAdvanced) + + EVT_MENU(miMiscResetZoomAndPos, MainWindow::onMenuMiscResetZoomAndPos) + EVT_MENU(miMiscAbout, MainWindow::onMenuMiscAbout) + EVT_MENU(miMiscHelp, MainWindow::onMenuMiscHelp) + + EVT_MENU_RANGE(miBrushHeight + 1, miBrushHeight + heightCount, MainWindow::onMenuBrushHeight) + EVT_MENU_RANGE(miBrushGradient + 1, miBrushGradient + heightCount, MainWindow::onMenuBrushGradient) + EVT_MENU_RANGE(miBrushSurface + 1, miBrushSurface + surfaceCount, MainWindow::onMenuBrushSurface) + EVT_MENU_RANGE(miBrushObject + 1, miBrushObject + objectCount, MainWindow::onMenuBrushObject) + EVT_MENU_RANGE(miBrushResource + 1, miBrushResource + resourceCount, MainWindow::onMenuBrushResource) + EVT_MENU_RANGE(miBrushStartLocation + 1, miBrushStartLocation + startLocationCount, MainWindow::onMenuBrushStartLocation) + EVT_MENU_RANGE(miRadius, miRadius + radiusCount, MainWindow::onMenuRadius) +END_EVENT_TABLE() + +// ===================================================== +// class GlCanvas +// ===================================================== + +GlCanvas::GlCanvas(MainWindow * mainWindow, int* args) + : wxGLCanvas(mainWindow, -1, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas"), args) { + this->mainWindow = mainWindow; +} + +void GlCanvas::onMouseDown(wxMouseEvent &event) { + mainWindow->onMouseDown(event); +} + +void GlCanvas::onMouseMove(wxMouseEvent &event) { + mainWindow->onMouseMove(event); +} + + void GlCanvas::onKeyDown(wxKeyEvent &event) { + mainWindow->onKeyDown(event); + } + +BEGIN_EVENT_TABLE(GlCanvas, wxGLCanvas) + EVT_KEY_DOWN(GlCanvas::onKeyDown) + + EVT_LEFT_DOWN(GlCanvas::onMouseDown) + EVT_MOTION(GlCanvas::onMouseMove) +END_EVENT_TABLE() + +// =============================================== +// class SimpleDialog +// =============================================== + +void SimpleDialog::addValue(const string &key, const string &value) { + values.push_back(pair(key, value)); +} + +string SimpleDialog::getValue(const string &key) { + for (int i = 0; i < values.size(); ++i) { + if (values[i].first == key) { + return values[i].second; + } + } + return ""; +} + +void SimpleDialog::show() { + + Create(NULL, -1, wxT("Edit Values")); + + wxSizer *sizer = new wxFlexGridSizer(2); + + vector texts; + + for (Values::iterator it = values.begin(); it != values.end(); ++it) { + sizer->Add(new wxStaticText(this, -1, ToUnicode(it->first)), 0, wxALL, 5); + wxTextCtrl *text = new wxTextCtrl(this, -1, ToUnicode(it->second)); + sizer->Add(text, 0, wxALL, 5); + texts.push_back(text); + } + SetSizerAndFit(sizer); + + ShowModal(); + + for (int i = 0; i < texts.size(); ++i) { + values[i].second = texts[i]->GetValue().ToAscii(); + } +} + +// =============================================== +// class App +// =============================================== + +bool App::OnInit() { + string fileparam; + if(argc==2){ + fileparam = wxFNCONV(argv[1]); + } + + mainWindow = new MainWindow(); + mainWindow->Show(); + mainWindow->init(fileparam); + return true; +} + +int App::MainLoop() { + try { + return wxApp::MainLoop(); + } catch (const exception &e) { + wxMessageDialog(NULL, ToUnicode(e.what()), wxT("Exception"), wxOK | wxICON_ERROR).ShowModal(); + } + return 0; +} + +int App::OnExit() { + return 0; +} + +}// end namespace + +IMPLEMENT_APP(MapEditor::App) diff --git a/source/shared_lib/include/platform/sdl/platform_util.h b/source/shared_lib/include/platform/sdl/platform_util.h index 197aba335..bd1c7cc86 100644 --- a/source/shared_lib/include/platform/sdl/platform_util.h +++ b/source/shared_lib/include/platform/sdl/platform_util.h @@ -88,7 +88,7 @@ public: // Misc // ===================================================== -void findAll(const string &path, vector &results, bool cutExtension=false); +void findAll(const string &path, vector &results, bool cutExtension=false, bool errorOnNotFound=true); int32 getFolderTreeContentsCheckSumRecursively(const string &path, const string &filterFileExt, Checksum *recursiveChecksum); vector > getFolderTreeContentsCheckSumListRecursively(const string &path, const string &filterFileExt, vector > *recursiveMap); void createDirectoryPaths(string Path); diff --git a/source/shared_lib/include/platform/win32/platform_util.h b/source/shared_lib/include/platform/win32/platform_util.h index cd8321835..bc3adb88c 100644 --- a/source/shared_lib/include/platform/win32/platform_util.h +++ b/source/shared_lib/include/platform/win32/platform_util.h @@ -98,7 +98,7 @@ public: // Misc // ===================================================== -void findAll(const string &path, vector &results, bool cutExtension=false); +void findAll(const string &path, vector &results, bool cutExtension=false, bool errorOnNotFound=true); int32 getFolderTreeContentsCheckSumRecursively(const string &path, const string &filterFileExt, Checksum *recursiveChecksum); vector > getFolderTreeContentsCheckSumListRecursively(const string &path, const string &filterFileExt, vector > *recursiveMap); void createDirectoryPaths(string Path); diff --git a/source/shared_lib/sources/platform/sdl/platform_util.cpp b/source/shared_lib/sources/platform/sdl/platform_util.cpp index b860bd6f0..8c404cfe8 100644 --- a/source/shared_lib/sources/platform/sdl/platform_util.cpp +++ b/source/shared_lib/sources/platform/sdl/platform_util.cpp @@ -119,7 +119,7 @@ int64 Chrono::queryCounter(int multiplier) const { // ===================================== //finds all filenames like path and stores them in resultys -void findAll(const string &path, vector &results, bool cutExtension) { +void findAll(const string &path, vector &results, bool cutExtension, bool errorOnNotFound) { results.clear(); std::string mypath = path; @@ -131,6 +131,8 @@ void findAll(const string &path, vector &results, bool cutExtension) { mypath += "*"; } + if(Socket::enableDebugText) printf("In [%s::%s] scanning [%s]\n",__FILE__,__FUNCTION__,mypath.c_str()); + glob_t globbuf; int res = glob(mypath.c_str(), 0, 0, &globbuf); @@ -153,7 +155,7 @@ void findAll(const string &path, vector &results, bool cutExtension) { globfree(&globbuf); - if(results.size() == 0) { + if(results.size() == 0 && errorOnNotFound == true) { throw runtime_error("No files found in: " + mypath); } diff --git a/source/shared_lib/sources/platform/win32/platform_util.cpp b/source/shared_lib/sources/platform/win32/platform_util.cpp index a4d51cce9..849f764f3 100644 --- a/source/shared_lib/sources/platform/win32/platform_util.cpp +++ b/source/shared_lib/sources/platform/win32/platform_util.cpp @@ -163,7 +163,7 @@ void PlatformExceptionHandler::install(string dumpFileName){ // ===================================================== //finds all filenames like path and stores them in resultys -void findAll(const string &path, vector &results, bool cutExtension){ +void findAll(const string &path, vector &results, bool cutExtension, bool errorOnNotFound){ int i= 0; struct _finddata_t fi; @@ -184,11 +184,11 @@ void findAll(const string &path, vector &results, bool cutExtension){ } while(_findnext(handle, &fi)==0); } - else{ + else if(errorOnNotFound == true){ throw runtime_error("Error opening files: "+ path); } - if(i==0){ + if(i==0 && errorOnNotFound == true){ throw runtime_error("No files found: "+ path); }