Reworked the Front Layer after reworking the front layer a similar bug was found, but this time fixed on double save, so i added a work around that double saves ( I'm not proud of this T.T )

Signed-off-by: GreYFoXGTi <GreYFoXGTi@GMaiL.CoM>
This commit is contained in:
GreYFoXGTi 2010-08-27 07:19:10 +02:00
parent b3736dded4
commit fd7c0c39ac
7 changed files with 126 additions and 9 deletions

View file

@ -590,6 +590,7 @@ static void CallbackSaveMap(const char *pFileName, void *pUser)
}
CEditor *pEditor = static_cast<CEditor*>(pUser);
if(pEditor->Save(pFileName))
if(pEditor->Save(pFileName))
str_copy(pEditor->m_aFileName, pFileName, sizeof(pEditor->m_aFileName));
}
@ -1134,12 +1135,14 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar)
//UI()->ClipEnable(&view);
}
// render the game, tele and speedup above everything else
// render the game, tele, speedup and front above everything else
if(m_Map.m_pGameGroup->m_Visible)
{
m_Map.m_pGameGroup->MapScreen();
if(m_Map.m_pGameLayer->m_Visible)
m_Map.m_pGameLayer->Render();
if(m_Map.m_pFrontLayer && m_Map.m_pFrontLayer->m_Visible)
m_Map.m_pFrontLayer->Render();
if(m_Map.m_pTeleLayer && m_Map.m_pTeleLayer->m_Visible)
m_Map.m_pTeleLayer->Render();
if(m_Map.m_pSpeedupLayer && m_Map.m_pSpeedupLayer->m_Visible)
@ -3016,6 +3019,13 @@ void CEditorMap::MakeSpeedupLayer(CLayer *pLayer)
m_pSpeedupLayer->m_TexId = m_pEditor->ms_EntitiesTexture;
}
void CEditorMap::MakeFrontLayer(CLayer *pLayer)
{
m_pFrontLayer = (CLayerFront *)pLayer;
m_pFrontLayer->m_pEditor = m_pEditor;
m_pFrontLayer->m_TexId = m_pEditor->ms_EntitiesTexture;
}
void CEditorMap::MakeGameGroup(CLayerGroup *pGroup)
{
m_pGameGroup = pGroup;
@ -3034,6 +3044,7 @@ void CEditorMap::Clean()
m_pGameLayer = 0x0;
m_pTeleLayer = 0x0;
m_pSpeedupLayer = 0x0;
m_pFrontLayer = 0x0;
m_pGameGroup = 0x0;
}
@ -3060,10 +3071,12 @@ void CEditorMap::CreateDefault(int EntitiesTexture)
pQuad->m_aColors[2].b = pQuad->m_aColors[3].b = 255;
pGroup->AddLayer(pLayer);
// add game layer
// add game layer and front
MakeGameGroup(NewGroup());
MakeGameLayer(new CLayerGame(50, 50));
MakeFrontLayer(new CLayerFront(50, 50));
m_pGameGroup->AddLayer(m_pGameLayer);
m_pGameGroup->AddLayer(m_pFrontLayer);
m_pTeleLayer = 0x0;
m_pSpeedupLayer = 0x0;
}

View file

@ -265,6 +265,7 @@ public:
class CLayerGame *m_pGameLayer;
class CLayerTele *m_pTeleLayer;
class CLayerSpeedup *m_pSpeedupLayer;
class CLayerFront *m_pFrontLayer;
CLayerGroup *m_pGameGroup;
CEnvelope *NewEnvelope(int Channels)
@ -321,6 +322,7 @@ public:
void MakeTeleLayer(CLayer *pLayer);
void MakeSpeedupLayer(CLayer *pLayer);
void MakeFrontLayer(CLayer *pLayer);
};
@ -387,6 +389,7 @@ public:
int m_Game;
int m_Tele;
int m_Speedup;
int m_Front;
int m_Image;
int m_Width;
int m_Height;
@ -455,6 +458,15 @@ public:
virtual void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect);
};
class CLayerFront : public CLayerTiles
{
public:
CLayerFront(int w, int h);
virtual void Resize(int NewW, int NewH);
virtual void BrushDraw(CLayer *pBrush, float wx, float wy);
};
class CEditor : public IEditor
{
class IInput *m_pInput;

View file

@ -286,6 +286,8 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName)
Item.m_Flags = 2;
else if(pLayer->m_Speedup)
Item.m_Flags = 4;
else if(pLayer->m_Front)
Item.m_Flags = 8;
else
Item.m_Flags = pLayer->m_Game;
Item.m_Image = pLayer->m_Image;
@ -305,6 +307,14 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName)
Item.m_Speedup = df.AddData(pLayer->m_Width*pLayer->m_Height*sizeof(CSpeedupTile), ((CLayerSpeedup *)pLayer)->m_pSpeedupTile);
delete[] Tiles;
}
else if(pLayer->m_Front)
{
CTile *Tiles = new CTile[pLayer->m_Width*pLayer->m_Height];
mem_zero(Tiles, pLayer->m_Width*pLayer->m_Height*sizeof(CTile));
Item.m_Data = df.AddData(pLayer->m_Width*pLayer->m_Height*sizeof(CTile), Tiles);
Item.m_Front = df.AddData(pLayer->m_Width*pLayer->m_Height*sizeof(CTile), pLayer->m_pTiles);//Thanks Sushi Tee
delete[] Tiles;
}
else
Item.m_Data = df.AddData(pLayer->m_Width*pLayer->m_Height*sizeof(CTile), pLayer->m_pTiles);
df.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item);
@ -522,6 +532,11 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName)
pTiles = new CLayerSpeedup(pTilemapItem->m_Width, pTilemapItem->m_Height);
MakeSpeedupLayer(pTiles);
}
else if(pTilemapItem->m_Flags&8)
{
pTiles = new CLayerFront(pTilemapItem->m_Width, pTilemapItem->m_Height);
MakeFrontLayer(pTiles);
}
else
{
pTiles = new CLayerTiles(pTilemapItem->m_Width, pTilemapItem->m_Height);
@ -579,6 +594,13 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName)
DataFile.UnloadData(pTilemapItem->m_Speedup);
}
else if(pTiles->m_Front)
{
void *pFrontData = DataFile.GetData(pTilemapItem->m_Front);
mem_copy(((CLayerFront*)pTiles)->m_pTiles, pFrontData, pTiles->m_Width*pTiles->m_Height*sizeof(CTile));
DataFile.UnloadData(pTilemapItem->m_Front);
}
}
else if(pLayerItem->m_Type == LAYERTYPE_QUADS)
{

View file

@ -22,6 +22,7 @@ CLayerTiles::CLayerTiles(int w, int h)
m_Game = 0;
m_Tele = 0;
m_Speedup = 0;
m_Front = 0;
m_pTiles = new CTile[m_Width*m_Height];
mem_zero(m_pTiles, m_Width*m_Height*sizeof(CTile));
@ -242,7 +243,7 @@ void CLayerTiles::BrushDraw(CLayer *pBrush, float wx, float wy)
if(fx<0 || fx >= m_Width || fy < 0 || fy >= m_Height)
continue;
// dont allow tele in and out tiles... same with speedup tile
// dont allow tele in and out tiles... same with speedup tile in game layer
if(m_pEditor->GetSelectedLayer(0) == m_pEditor->m_Map.m_pGameLayer && (l->m_pTiles[y*l->m_Width+x].m_Index == TILE_TELEIN || l->m_pTiles[y*l->m_Width+x].m_Index == TILE_TELEOUT || l->m_pTiles[y*l->m_Width+x].m_Index == TILE_BOOST))
continue;
@ -302,6 +303,10 @@ void CLayerTiles::Resize(int NewW, int NewH)
// resize speedup layer if available
if(m_Game && m_pEditor->m_Map.m_pSpeedupLayer && (m_pEditor->m_Map.m_pSpeedupLayer->m_Width != NewW || m_pEditor->m_Map.m_pSpeedupLayer->m_Height != NewH))
m_pEditor->m_Map.m_pSpeedupLayer->Resize(NewW, NewH);
// resize front layer
if(m_Game && m_pEditor->m_Map.m_pFrontLayer && (m_pEditor->m_Map.m_pFrontLayer->m_Width != NewW || m_pEditor->m_Map.m_pFrontLayer->m_Height != NewH))
m_pEditor->m_Map.m_pFrontLayer->Resize(NewW, NewH);
}
@ -311,7 +316,7 @@ int CLayerTiles::RenderProperties(CUIRect *pToolBox)
pToolBox->HSplitBottom(12.0f, pToolBox, &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)
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)
InGameGroup = false;
static int s_ColclButton = 0;
if(m_pEditor->DoButton_Editor(&s_ColclButton, Localize("Clear collision"), InGameGroup?0:-1, &Button, 0, Localize("Removes collision from this layer")))
@ -362,7 +367,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) // remove the image from the selection if this is the game layer
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) // remove the image from the selection if this is the game/tele/speedup/front layer
aProps[2].m_pName = 0;
static int s_aIds[NUM_PROPS] = {0};
@ -642,3 +647,45 @@ void CLayerSpeedup::FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect)
}
}
}
CLayerFront::CLayerFront(int w, int h)
: CLayerTiles(w, h)
{
m_pTypeName = "Front";
m_Front = 1;
}
void CLayerFront::Resize(int NewW, int NewH)
{
// resize tile data
CLayerTiles::Resize(NewW, NewH);
// resize gamelayer too
if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH)
m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH);
}
void CLayerFront::BrushDraw(CLayer *pBrush, float wx, float wy)
{
if(m_Readonly)
return;
//
CLayerTiles *l = (CLayerTiles *)pBrush;
int sx = ConvertX(wx);
int sy = ConvertY(wy);
for(int y = 0; y < l->m_Height; y++)
for(int x = 0; x < l->m_Width; x++)
{
int fx = x+sx;
int fy = y+sy;
if(fx<0 || fx >= m_Width || fy < 0 || fy >= m_Height)
continue;
// dont allow tele in and out tiles... same with speedup tile in front
if(m_pEditor->GetSelectedLayer(0) == m_pEditor->m_Map.m_pFrontLayer && (l->m_pTiles[y*l->m_Width+x].m_Index == TILE_TELEIN || l->m_pTiles[y*l->m_Width+x].m_Index == TILE_TELEOUT || l->m_pTiles[y*l->m_Width+x].m_Index == TILE_BOOST))
continue;
m_pTiles[fy*m_Width+fx] = l->m_pTiles[y*l->m_Width+x];
}
}

View file

@ -127,6 +127,24 @@ int CEditor::PopupGroup(CEditor *pEditor, CUIRect View)
}
}
if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pFrontLayer)
{
// new force layer
View.HSplitBottom(10.0f, &View, &Button);
View.HSplitBottom(12.0f, &View, &Button);
static int s_NewFrontLayerButton = 0;
if(pEditor->DoButton_Editor(&s_NewFrontLayerButton, "Add Front Layer", 0, &Button, 0, "Creates a new item layer"))
{
CLayer *l = new CLayerFront(pEditor->m_Map.m_pGameLayer->m_Width, pEditor->m_Map.m_pGameLayer->m_Height);
pEditor->m_Map.MakeFrontLayer(l);
pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->AddLayer(l);
pEditor->m_SelectedLayer = pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_lLayers.size()-1;
pEditor->m_Brush.Clear();
return 1;
}
}
// new tile layer
View.HSplitBottom(10.0f, &View, &Button);
View.HSplitBottom(12.0f, &View, &Button);
@ -218,8 +236,8 @@ int CEditor::PopupLayer(CEditor *pEditor, CUIRect View)
View.HSplitBottom(12.0f, &View, &Button);
static int s_DeleteButton = 0;
// don't allow deletion of game layer
if(pEditor->m_Map.m_pGameLayer != pEditor->GetSelectedLayer(0) &&
// don't allow deletion of game/front layer
if(pEditor->m_Map.m_pGameLayer != pEditor->GetSelectedLayer(0) && pEditor->m_Map.m_pFrontLayer != pEditor->GetSelectedLayer(0) &&
pEditor->DoButton_Editor(&s_DeleteButton, Localize("Delete layer"), 0, &Button, 0, Localize("Deletes the layer")))
{
if(pEditor->GetSelectedLayer(0) == pEditor->m_Map.m_pTeleLayer)
@ -250,7 +268,7 @@ int CEditor::PopupLayer(CEditor *pEditor, CUIRect View)
{0},
};
if(pEditor->m_Map.m_pGameLayer == pEditor->GetSelectedLayer(0) || pEditor->m_Map.m_pTeleLayer == pEditor->GetSelectedLayer(0) || pEditor->m_Map.m_pSpeedupLayer == pEditor->GetSelectedLayer(0)) // dont use Group and Detail from the selection if this is the game layer
if(pEditor->m_Map.m_pGameLayer == pEditor->GetSelectedLayer(0) || pEditor->m_Map.m_pTeleLayer == pEditor->GetSelectedLayer(0) || pEditor->m_Map.m_pSpeedupLayer == pEditor->GetSelectedLayer(0) || pEditor->m_Map.m_pFrontLayer == pEditor->GetSelectedLayer(0)) // dont use Group and Detail from the selection if this is the game layer
{
aProps[0].m_Type = PROPTYPE_NULL;
aProps[2].m_Type = PROPTYPE_NULL;

View file

@ -10,6 +10,7 @@ CLayers::CLayers()
m_pGameLayer = 0;
m_pTeleLayer = 0;
m_pSpeedupLayer = 0;
m_pFrontLayer = 0;
m_pMap = 0;
}
@ -51,6 +52,8 @@ void CLayers::Init(class IKernel *pKernel)
m_pTeleLayer = pTilemap;
if(pTilemap->m_Flags&4)
m_pSpeedupLayer = pTilemap;
if(pTilemap->m_Flags&8)
m_pFrontLayer = pTilemap;
}
}
}

View file

@ -14,6 +14,7 @@ class CLayers
CMapItemLayerTilemap *m_pGameLayer;
CMapItemLayerTilemap *m_pTeleLayer;
CMapItemLayerTilemap *m_pSpeedupLayer;
CMapItemLayerTilemap *m_pFrontLayer;
class IMap *m_pMap;
public:
@ -25,6 +26,7 @@ public:
CMapItemLayerTilemap *GameLayer() const { return m_pGameLayer; }
CMapItemLayerTilemap *TeleLayer() const { return m_pTeleLayer; }
CMapItemLayerTilemap *SpeedupLayer() const { return m_pSpeedupLayer; }
CMapItemLayerTilemap *FrontLayer() const { return m_pFrontLayer; }
CMapItemGroup *GetGroup(int Index) const;
CMapItemLayer *GetLayer(int Index) const;
};