////////////////////////////////////////////////////////////////////// // This file is part of Remere's Map Editor ////////////////////////////////////////////////////////////////////// // Remere's Map Editor 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. // // Remere's Map Editor 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 . ////////////////////////////////////////////////////////////////////// #include "main.h" #include "settings.h" #include "brush.h" #include "gui.h" #include "palette_npc.h" #include "npc_brush.h" #include "spawn_npc_brush.h" #include "materials.h" // ============================================================================ // Npc palette BEGIN_EVENT_TABLE(NpcPalettePanel, PalettePanel) EVT_CHOICE(PALETTE_NPC_TILESET_CHOICE, NpcPalettePanel::OnTilesetChange) EVT_LISTBOX(PALETTE_NPC_LISTBOX, NpcPalettePanel::OnListBoxChange) EVT_TOGGLEBUTTON(PALETTE_NPC_BRUSH_BUTTON, NpcPalettePanel::OnClickNpcBrushButton) EVT_TOGGLEBUTTON(PALETTE_SPAWN_NPC_BRUSH_BUTTON, NpcPalettePanel::OnClickSpawnNpcBrushButton) EVT_SPINCTRL(PALETTE_SPAWN_NPC_TIME, NpcPalettePanel::OnChangeSpawnNpcTime) EVT_SPINCTRL(PALETTE_SPAWN_NPC_SIZE, NpcPalettePanel::OnChangeSpawnNpcSize) END_EVENT_TABLE() NpcPalettePanel::NpcPalettePanel(wxWindow* parent, wxWindowID id) : PalettePanel(parent, id), handling_event(false) { wxSizer* topsizer = newd wxBoxSizer(wxVERTICAL); wxSizer* sidesizer = newd wxStaticBoxSizer(wxVERTICAL, this, "Npcs"); tileset_choice = newd wxChoice(this, PALETTE_NPC_TILESET_CHOICE, wxDefaultPosition, wxDefaultSize, (int)0, (const wxString*)nullptr); sidesizer->Add(tileset_choice, 0, wxEXPAND); npc_list = newd SortableListBox(this, PALETTE_NPC_LISTBOX); sidesizer->Add(npc_list, 1, wxEXPAND); topsizer->Add(sidesizer, 1, wxEXPAND); // Brush selection sidesizer = newd wxStaticBoxSizer(newd wxStaticBox(this, wxID_ANY, "Brushes", wxDefaultPosition, wxSize(150, 200)), wxVERTICAL); //sidesizer->Add(180, 1, wxEXPAND); wxFlexGridSizer* grid = newd wxFlexGridSizer(3, 10, 10); grid->AddGrowableCol(1); grid->Add(newd wxStaticText(this, wxID_ANY, "Spawntime")); npc_spawntime_spin = newd wxSpinCtrl(this, PALETTE_SPAWN_NPC_TIME, i2ws(g_settings.getInteger(Config::DEFAULT_SPAWN_NPC_TIME)), wxDefaultPosition, wxSize(50, 20), wxSP_ARROW_KEYS, 0, 3600, g_settings.getInteger(Config::DEFAULT_SPAWN_NPC_TIME)); grid->Add(npc_spawntime_spin, 0, wxEXPAND); npc_brush_button = newd wxToggleButton(this, PALETTE_NPC_BRUSH_BUTTON, "Place Npc"); grid->Add(npc_brush_button, 0, wxEXPAND); grid->Add(newd wxStaticText(this, wxID_ANY, "Spawn size")); spawn_npc_size_spin = newd wxSpinCtrl(this, PALETTE_SPAWN_NPC_SIZE, i2ws(1), wxDefaultPosition, wxSize(50, 20), wxSP_ARROW_KEYS, 1, g_settings.getInteger(Config::MAX_SPAWN_NPC_RADIUS), g_settings.getInteger(Config::CURRENT_SPAWN_NPC_RADIUS)); grid->Add(spawn_npc_size_spin, 0, wxEXPAND); spawn_npc_brush_button = newd wxToggleButton(this, PALETTE_SPAWN_NPC_BRUSH_BUTTON, "Place Spawn"); grid->Add(spawn_npc_brush_button, 0, wxEXPAND); sidesizer->Add(grid, 0, wxEXPAND); topsizer->Add(sidesizer, 0, wxEXPAND); SetSizerAndFit(topsizer); OnUpdate(); } NpcPalettePanel::~NpcPalettePanel() { //// } PaletteType NpcPalettePanel::GetType() const { return TILESET_NPC; } void NpcPalettePanel::SelectFirstBrush() { SelectNpcBrush(); } Brush* NpcPalettePanel::GetSelectedBrush() const { if(npc_brush_button->GetValue()) { if(npc_list->GetCount() == 0) { return nullptr; } Brush* brush = reinterpret_cast(npc_list->GetClientData(npc_list->GetSelection())); if(brush && brush->isNpc()) { g_gui.SetSpawnNpcTime(npc_spawntime_spin->GetValue()); return brush; } } else if(spawn_npc_brush_button->GetValue()) { g_settings.setInteger(Config::CURRENT_SPAWN_NPC_RADIUS, spawn_npc_size_spin->GetValue()); g_settings.setInteger(Config::DEFAULT_SPAWN_NPC_TIME, npc_spawntime_spin->GetValue()); return g_gui.spawn_npc_brush; } return nullptr; } bool NpcPalettePanel::SelectBrush(const Brush* whatbrush) { if(!whatbrush) return false; if(whatbrush->isNpc()) { int current_index = tileset_choice->GetSelection(); if(current_index != wxNOT_FOUND) { const TilesetCategory* tsc = reinterpret_cast(tileset_choice->GetClientData(current_index)); // Select first house for(BrushVector::const_iterator iter = tsc->brushlist.begin(); iter != tsc->brushlist.end(); ++iter) { if(*iter == whatbrush) { SelectNpc(whatbrush->getName()); return true; } } } // Not in the current display, search the hidden one's for(size_t i = 0; i < tileset_choice->GetCount(); ++i) { if(current_index != (int)i) { const TilesetCategory* tsc = reinterpret_cast(tileset_choice->GetClientData(i)); for(BrushVector::const_iterator iter = tsc->brushlist.begin(); iter != tsc->brushlist.end(); ++iter) { if(*iter == whatbrush) { SelectTileset(i); SelectNpc(whatbrush->getName()); return true; } } } } } else if(whatbrush->isSpawnNpc()) { SelectSpawnNpcBrush(); return true; } return false; } int NpcPalettePanel::GetSelectedBrushSize() const { return spawn_npc_size_spin->GetValue(); } void NpcPalettePanel::OnUpdate() { tileset_choice->Clear(); g_materials.createNpcTileset(); for(TilesetContainer::const_iterator iter = g_materials.tilesets.begin(); iter != g_materials.tilesets.end(); ++iter) { const TilesetCategory* tsc = iter->second->getCategory(TILESET_NPC); if(tsc && tsc->size() > 0) { tileset_choice->Append(wxstr(iter->second->name), const_cast(tsc)); } else if(iter->second->name == "NPCs") { Tileset* ts = const_cast(iter->second); TilesetCategory* rtsc = ts->getCategory(TILESET_NPC); tileset_choice->Append(wxstr(ts->name), rtsc); } } SelectTileset(0); } void NpcPalettePanel::OnUpdateBrushSize(BrushShape shape, int size) { return spawn_npc_size_spin->SetValue(size); } void NpcPalettePanel::OnSwitchIn() { g_gui.ActivatePalette(GetParentPalette()); g_gui.SetBrushSize(spawn_npc_size_spin->GetValue()); } void NpcPalettePanel::SelectTileset(size_t index) { ASSERT(tileset_choice->GetCount() >= index); npc_list->Clear(); if(tileset_choice->GetCount() == 0) { // No tilesets :( npc_brush_button->Enable(false); } else { const TilesetCategory* tsc = reinterpret_cast(tileset_choice->GetClientData(index)); // Select first house for(BrushVector::const_iterator iter = tsc->brushlist.begin(); iter != tsc->brushlist.end(); ++iter) { npc_list->Append(wxstr((*iter)->getName()), *iter); } npc_list->Sort(); SelectNpc(0); tileset_choice->SetSelection(index); } } void NpcPalettePanel::SelectNpc(size_t index) { // Save the old g_settings ASSERT(npc_list->GetCount() >= index); if(npc_list->GetCount() > 0) { npc_list->SetSelection(index); } SelectNpcBrush(); } void NpcPalettePanel::SelectNpc(std::string name) { if(npc_list->GetCount() > 0) { if(!npc_list->SetStringSelection(wxstr(name))) { npc_list->SetSelection(0); } } SelectNpcBrush(); } void NpcPalettePanel::SelectNpcBrush() { if(npc_list->GetCount() > 0) { npc_brush_button->Enable(true); npc_brush_button->SetValue(true); spawn_npc_brush_button->SetValue(false); } else { npc_brush_button->Enable(false); SelectSpawnNpcBrush(); } } void NpcPalettePanel::SelectSpawnNpcBrush() { //g_gui.house_exit_brush->setHouse(house); npc_brush_button->SetValue(false); spawn_npc_brush_button->SetValue(true); } void NpcPalettePanel::OnTilesetChange(wxCommandEvent& event) { SelectTileset(event.GetSelection()); g_gui.ActivatePalette(GetParentPalette()); g_gui.SelectBrush(); } void NpcPalettePanel::OnListBoxChange(wxCommandEvent& event) { SelectNpc(event.GetSelection()); g_gui.ActivatePalette(GetParentPalette()); g_gui.SelectBrush(); } void NpcPalettePanel::OnClickNpcBrushButton(wxCommandEvent& event) { SelectNpcBrush(); g_gui.ActivatePalette(GetParentPalette()); g_gui.SelectBrush(); } void NpcPalettePanel::OnClickSpawnNpcBrushButton(wxCommandEvent& event) { SelectSpawnNpcBrush(); g_gui.ActivatePalette(GetParentPalette()); g_gui.SelectBrush(); } void NpcPalettePanel::OnChangeSpawnNpcTime(wxSpinEvent& event) { g_gui.ActivatePalette(GetParentPalette()); g_gui.SetSpawnNpcTime(event.GetPosition()); } void NpcPalettePanel::OnChangeSpawnNpcSize(wxSpinEvent& event) { if(!handling_event) { handling_event = true; g_gui.ActivatePalette(GetParentPalette()); g_gui.SetBrushSize(event.GetPosition()); handling_event = false; } }