From 7c227c563d8464b422d5dbee3a638446eb85a481 Mon Sep 17 00:00:00 2001 From: 12pm <30786226+12pm@users.noreply.github.com> Date: Tue, 12 Mar 2019 02:35:29 +0100 Subject: [PATCH] Add auto game tiles to all possible layers, increase layer size if needed --- src/game/editor/layer_game.cpp | 2 +- src/game/editor/layer_tiles.cpp | 83 ++++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/game/editor/layer_game.cpp b/src/game/editor/layer_game.cpp index 6bab7f82d..afc1f7aa7 100644 --- a/src/game/editor/layer_game.cpp +++ b/src/game/editor/layer_game.cpp @@ -30,7 +30,7 @@ void CLayerGame::SetTile(int x, int y, CTile tile) if(!m_pEditor->m_Map.m_pFrontLayer) { CLayer *l = new CLayerFront(m_Width, m_Height); m_pEditor->m_Map.MakeFrontLayer(l); - m_pEditor->m_Map.m_lGroups[m_pEditor->m_SelectedGroup]->AddLayer(l); + m_pEditor->m_Map.m_pGameGroup->AddLayer(l); } CTile nohook = {TILE_NOHOOK}; CLayerTiles::SetTile(x, y, nohook); diff --git a/src/game/editor/layer_tiles.cpp b/src/game/editor/layer_tiles.cpp index 2e6257a08..ab3cc25c2 100644 --- a/src/game/editor/layer_tiles.cpp +++ b/src/game/editor/layer_tiles.cpp @@ -532,7 +532,7 @@ void CLayerTiles::Resize(int NewW, int NewH) // resize tune layer if available if(m_Game && m_pEditor->m_Map.m_pTuneLayer && (m_pEditor->m_Map.m_pTuneLayer->m_Width != NewW || m_pEditor->m_Map.m_pTuneLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pTuneLayer->Resize(NewW, NewH); + m_pEditor->m_Map.m_pTuneLayer->Resize(NewW, NewH); } void CLayerTiles::Shift(int Direction) @@ -622,11 +622,19 @@ int CLayerTiles::RenderProperties(CUIRect *pToolBox) { CUIRect Button; - bool InGameGroup = !find_linear(m_pEditor->m_Map.m_pGameGroup->m_lLayers.all(), this).empty(); - if(m_pEditor->m_Map.m_pGameLayer == this || m_pEditor->m_Map.m_pTeleLayer == this || m_pEditor->m_Map.m_pSpeedupLayer == this || m_pEditor->m_Map.m_pFrontLayer == this || m_pEditor->m_Map.m_pSwitchLayer == this || m_pEditor->m_Map.m_pTuneLayer == this) - InGameGroup = false; + bool IsGameLayer = ( + m_pEditor->m_Map.m_pGameLayer == this + || m_pEditor->m_Map.m_pTeleLayer == this + || m_pEditor->m_Map.m_pSpeedupLayer == this + || m_pEditor->m_Map.m_pFrontLayer == this + || m_pEditor->m_Map.m_pSwitchLayer == this + || m_pEditor->m_Map.m_pTuneLayer == this + ); - if(InGameGroup) + CLayerGroup *pGroup = m_pEditor->m_Map.m_lGroups[m_pEditor->m_SelectedGroup]; + + // Game tiles can only be constructed if the layer is relative to the game layer + if(!IsGameLayer && !(pGroup->m_OffsetX % 32) && !(pGroup->m_OffsetY % 32) && pGroup->m_ParallaxX == 100 && pGroup->m_ParallaxY == 100) { pToolBox->HSplitBottom(12.0f, pToolBox, &Button); static int s_ColclButton = 0; @@ -661,39 +669,60 @@ int CLayerTiles::RenderProperties(CUIRect *pToolBox) } if(Result > -1) { - if (Result != TILE_TELECHECKIN && Result != TILE_TELECHECKINEVIL) - { - CLayerTiles *gl = m_pEditor->m_Map.m_pGameLayer; + int OffsetX = -pGroup->m_OffsetX / 32; + int OffsetY = -pGroup->m_OffsetY / 32; - int w = min(gl->m_Width, m_Width); - int h = min(gl->m_Height, m_Height); - for(int y = 0; y < h; y++) - for(int x = 0; x < w; x++) - if(GetTile(x, y).m_Index) { - CTile result_tile = {(unsigned char)Result}; - gl->SetTile(x, y, result_tile); + if(Result != TILE_TELECHECKIN && Result != TILE_TELECHECKINEVIL) + { + CLayerTiles *pGLayer = m_pEditor->m_Map.m_pGameLayer; + + if(pGLayer->m_Width < m_Width + OffsetX || pGLayer->m_Height < m_Height + OffsetY) + { + int NewW = pGLayer->m_Width < m_Width + OffsetX ? m_Width + OffsetX : pGLayer->m_Width; + int NewH = pGLayer->m_Height < m_Height + OffsetY ? m_Height + OffsetY : pGLayer->m_Height; + pGLayer->Resize(NewW, NewH); + } + + for(int y = OffsetY < 0 ? -OffsetY : 0; y < m_Height; y++) + for(int x = OffsetX < 0 ? -OffsetX : 0; x < m_Width; x++) + if(GetTile(x, y).m_Index) + { + CTile ResultTile = {(unsigned char)Result}; + pGLayer->SetTile(x + OffsetX, y + OffsetY, ResultTile); } } - else if (m_pEditor->m_Map.m_pTeleLayer) + else { - CLayerTele *gl = m_pEditor->m_Map.m_pTeleLayer; + if(!m_pEditor->m_Map.m_pTeleLayer) + { + CLayer *pLayer = new CLayerTele(m_Width, m_Height); + m_pEditor->m_Map.MakeTeleLayer(pLayer); + m_pEditor->m_Map.m_pGameGroup->AddLayer(pLayer); + } - int w = min(gl->m_Width, m_Width); - int h = min(gl->m_Height, m_Height); - for(int y = 0; y < h; y++) - for(int x = 0; x < w; x++) - if(m_pTiles[y*m_Width+x].m_Index) + CLayerTele *pTLayer = m_pEditor->m_Map.m_pTeleLayer; + + if(pTLayer->m_Width < m_Width + OffsetX || pTLayer->m_Height < m_Height + OffsetY) + { + int NewW = pTLayer->m_Width < m_Width + OffsetX ? m_Width + OffsetX : pTLayer->m_Width; + int NewH = pTLayer->m_Height < m_Height + OffsetY ? m_Height + OffsetY : pTLayer->m_Height; + pTLayer->Resize(NewW, NewH); + } + + for(int y = OffsetY < 0 ? -OffsetY : 0; y < m_Height; y++) + for(int x = OffsetX < 0 ? -OffsetX : 0; x < m_Width; x++) + if(GetTile(x, y).m_Index) { - gl->m_pTiles[y*gl->m_Width+x].m_Index = TILE_AIR+Result; - gl->m_pTeleTile[y*gl->m_Width+x].m_Number = 1; - gl->m_pTeleTile[y*gl->m_Width+x].m_Type = TILE_AIR+Result; + pTLayer->m_pTiles[(y+OffsetY)*pTLayer->m_Width+x+OffsetX].m_Index = TILE_AIR+Result; + pTLayer->m_pTeleTile[(y+OffsetY)*pTLayer->m_Width+x+OffsetX].m_Number = 1; + pTLayer->m_pTeleTile[(y+OffsetY)*pTLayer->m_Width+x+OffsetX].m_Type = TILE_AIR+Result; } } return 1; } } - + if(m_pEditor->m_Map.m_pGameLayer != this) { if(m_Image >= 0 && m_Image < m_pEditor->m_Map.m_lImages.size() && m_pEditor->m_Map.m_lImages[m_Image]->m_AutoMapper.IsLoaded() && @@ -756,7 +785,7 @@ int CLayerTiles::RenderProperties(CUIRect *pToolBox) {0}, }; - if(m_pEditor->m_Map.m_pGameLayer == this || m_pEditor->m_Map.m_pTeleLayer == this || m_pEditor->m_Map.m_pSpeedupLayer == this || m_pEditor->m_Map.m_pFrontLayer == this || m_pEditor->m_Map.m_pSwitchLayer == this || m_pEditor->m_Map.m_pTuneLayer == this) // remove the image and color properties if this is the game/tele/speedup/front/switch layer + if(IsGameLayer) // remove the image and color properties if this is a game layer { aProps[PROP_IMAGE].m_pName = 0; aProps[PROP_COLOR].m_pName = 0;