Skip to content

Commit

Permalink
Merge pull request ddnet#8961 from KebsCS/pr-teleport-numbers
Browse files Browse the repository at this point in the history
Change editor teleport number behavior
  • Loading branch information
Robyt3 authored Oct 10, 2024
2 parents 56737cc + a2fedd0 commit f2090d6
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 102 deletions.
29 changes: 17 additions & 12 deletions src/game/editor/editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1320,6 +1320,7 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
const char *pButtonName = nullptr;
CUi::FPopupMenuFunction pfnPopupFunc = nullptr;
int Rows = 0;
int ExtraWidth = 0;
if(pS == m_Map.m_pSwitchLayer)
{
pButtonName = "Switch";
Expand All @@ -1342,7 +1343,8 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
{
pButtonName = "Tele";
pfnPopupFunc = PopupTele;
Rows = 3;
Rows = m_TeleNumbers.size() + 1;
ExtraWidth = 50;
}

if(pButtonName != nullptr)
Expand All @@ -1357,7 +1359,7 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
static SPopupMenuId s_PopupModifierId;
if(!Ui()->IsPopupOpen(&s_PopupModifierId))
{
Ui()->DoPopupMenu(&s_PopupModifierId, Button.x, Button.y + Button.h, 120, 10.0f + Rows * 13.0f, this, pfnPopupFunc);
Ui()->DoPopupMenu(&s_PopupModifierId, Button.x, Button.y + Button.h, 120 + ExtraWidth, 10.0f + Rows * 13.0f, this, pfnPopupFunc);
}
}
TB_Bottom.VSplitLeft(5.0f, nullptr, &TB_Bottom);
Expand Down Expand Up @@ -8113,7 +8115,7 @@ void CEditor::Render()
return pLayer->m_Type == LAYERTYPE_TILES && std::static_pointer_cast<CLayerTiles>(pLayer)->m_Tele;
});
if(HasTeleTiles)
str_copy(m_aTooltip, "Use shift+mousewheel up/down to adjust the tele numbers. Use ctrl+f to change all tele numbers to the first unused number.");
str_copy(m_aTooltip, "Use shift+mousewheel up/down to adjust the tele number. Use ctrl+f to change current tele number to the first unused number.");

if(Input()->ShiftIsPressed())
{
Expand Down Expand Up @@ -9067,9 +9069,6 @@ void CEditor::AdjustBrushSpecialTiles(bool UseNextFree, int Adjust)
// Only handle tele, switch and tune layers
if(pLayerTiles->m_Tele)
{
int NextFreeTeleNumber = FindNextFreeTeleNumber();
int NextFreeCPNumber = FindNextFreeTeleNumber(true);

std::shared_ptr<CLayerTele> pTeleLayer = std::static_pointer_cast<CLayerTele>(pLayer);
for(int y = 0; y < pTeleLayer->m_Height; y++)
{
Expand All @@ -9081,13 +9080,19 @@ void CEditor::AdjustBrushSpecialTiles(bool UseNextFree, int Adjust)

if(UseNextFree)
{
if(IsTeleTileCheckpoint(pTeleLayer->m_pTiles[i].m_Index))
pTeleLayer->m_pTeleTile[i].m_Number = NextFreeCPNumber;
else
pTeleLayer->m_pTeleTile[i].m_Number = NextFreeTeleNumber;
pTeleLayer->m_pTeleTile[i].m_Number = FindNextFreeTeleNumber(pTeleLayer->m_pTiles[i].m_Index);
}
else
AdjustNumber(pTeleLayer->m_pTeleTile[i].m_Number);

if(IsTeleTileNumberUsedAny(pTeleLayer->m_pTiles[i].m_Index) &&
m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index] != pTeleLayer->m_pTeleTile[i].m_Number)
{
if(UseNextFree || Adjust != 0)
m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index] = pTeleLayer->m_pTeleTile[i].m_Number;
else if(!UseNextFree && Adjust == 0)
pTeleLayer->m_pTeleTile[i].m_Number = m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index];
}
}
}
}
Expand Down Expand Up @@ -9147,12 +9152,12 @@ int CEditor::FindNextFreeSwitchNumber()
return Number;
}

int CEditor::FindNextFreeTeleNumber(bool IsCheckpoint)
int CEditor::FindNextFreeTeleNumber(int Index)
{
int Number = -1;
for(int i = 1; i <= 255; i++)
{
if(!m_Map.m_pTeleLayer->ContainsElementWithId(i, IsCheckpoint))
if(!m_Map.m_pTeleLayer->ContainsElementWithId(i, Index))
{
Number = i;
break;
Expand Down
26 changes: 20 additions & 6 deletions src/game/editor/editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,15 @@ class CEditorMap
void MakeTuneLayer(const std::shared_ptr<CLayer> &pLayer);
};

struct CProperty
class CProperty
{
public:
CProperty(const char *pName, int Value, int Type, int Min, int Max) :
m_pName(pName), m_Value(Value), m_Type(Type), m_Min(Min), m_Max(Max) {}

CProperty(std::nullptr_t) :
m_pName(nullptr), m_Value(0), m_Type(0), m_Min(0), m_Max(0) {}

const char *m_pName;
int m_Value;
int m_Type;
Expand Down Expand Up @@ -442,8 +449,16 @@ class CEditor : public IEditor

// DDRace

m_TeleNumber = 1;
m_TeleCheckpointNumber = 1;
m_ViewTeleNumber = 1;
m_TeleNumbers = {
{TILE_TELEINEVIL, 1},
{TILE_TELEINWEAPON, 1},
{TILE_TELEINHOOK, 1},
{TILE_TELEIN, 1},
{TILE_TELEOUT, 1},
{TILE_TELECHECK, 1},
{TILE_TELECHECKOUT, 1}};

m_SwitchNum = 1;
m_TuningNum = 1;
m_SwitchDelay = 0;
Expand Down Expand Up @@ -1142,9 +1157,8 @@ class CEditor : public IEditor
IGraphics::CTextureHandle GetSwitchTexture();
IGraphics::CTextureHandle GetTuneTexture();

unsigned char m_TeleNumber;
unsigned char m_TeleCheckpointNumber;
unsigned char m_ViewTeleNumber;
std::map<int, unsigned char> m_TeleNumbers;

unsigned char m_TuningNum;

Expand All @@ -1158,7 +1172,7 @@ class CEditor : public IEditor

void AdjustBrushSpecialTiles(bool UseNextFree, int Adjust = 0);
int FindNextFreeSwitchNumber();
int FindNextFreeTeleNumber(bool IsCheckpoint = false);
int FindNextFreeTeleNumber(int Index);

// Undo/Redo
CEditorHistory m_EditorHistory;
Expand Down
31 changes: 13 additions & 18 deletions src/game/editor/mapitems/layer_tele.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, vec2 WorldPos)
int sx = ConvertX(WorldPos.x);
int sy = ConvertY(WorldPos.y);
if(str_comp(pTeleLayer->m_aFileName, m_pEditor->m_aFileName))
m_pEditor->m_TeleNumber = pTeleLayer->m_TeleNum;
m_pEditor->m_TeleNumbers = pTeleLayer->m_TeleNumbers;

bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pTeleLayer);

Expand All @@ -99,30 +99,27 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, vec2 WorldPos)
m_pTeleTile[Index].m_Type,
m_pTiles[Index].m_Index};

if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index)) && pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index != TILE_AIR)
unsigned char TgtIndex = pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index;
if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(TgtIndex)) && TgtIndex != TILE_AIR)
{
bool IsCheckpoint = IsTeleTileCheckpoint(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index);
if(!IsCheckpoint && !IsTeleTileNumberUsed(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index, false))
bool IsCheckpoint = IsTeleTileCheckpoint(TgtIndex);
if(!IsCheckpoint && !IsTeleTileNumberUsed(TgtIndex, false))
{
// Tele tile number is unused. Set a known value which is not 0,
// as tiles with number 0 would be ignored by previous versions.
m_pTeleTile[Index].m_Number = 255;
}
else if(!IsCheckpoint && m_pEditor->m_TeleNumber != pTeleLayer->m_TeleNum)
else if(m_pEditor->m_TeleNumbers[TgtIndex] != pTeleLayer->m_TeleNumbers[TgtIndex])
{
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumber;
}
else if(IsCheckpoint && m_pEditor->m_TeleCheckpointNumber != pTeleLayer->m_TeleCheckpointNum)
{
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleCheckpointNumber;
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumbers[TgtIndex];
}
else if(pTeleLayer->m_pTeleTile[y * pTeleLayer->m_Width + x].m_Number)
{
m_pTeleTile[Index].m_Number = pTeleLayer->m_pTeleTile[y * pTeleLayer->m_Width + x].m_Number;
}
else
{
if((!IsCheckpoint && !m_pEditor->m_TeleNumber) || (IsCheckpoint && !m_pEditor->m_TeleCheckpointNumber))
if(!m_pEditor->m_TeleNumbers[TgtIndex])
{
m_pTeleTile[Index].m_Number = 0;
m_pTeleTile[Index].m_Type = 0;
Expand All @@ -138,7 +135,7 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, vec2 WorldPos)
}
else
{
m_pTeleTile[Index].m_Number = IsCheckpoint ? m_pEditor->m_TeleCheckpointNumber : m_pEditor->m_TeleNumber;
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumbers[TgtIndex];
}
}

Expand Down Expand Up @@ -283,10 +280,8 @@ void CLayerTele::FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRe
// as tiles with number 0 would be ignored by previous versions.
m_pTeleTile[TgtIndex].m_Number = 255;
}
else if(!IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleNumber) || m_pEditor->m_TeleNumber != pLt->m_TeleNum))
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleNumber;
else if(IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleCheckpointNumber) || m_pEditor->m_TeleCheckpointNumber != pLt->m_TeleCheckpointNum))
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleCheckpointNumber;
else if((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index]) || m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index] != pLt->m_TeleNumbers[m_pTiles[TgtIndex].m_Index])
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index];
else
m_pTeleTile[TgtIndex].m_Number = pLt->m_pTeleTile[SrcIndex].m_Number;
}
Expand All @@ -303,13 +298,13 @@ void CLayerTele::FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRe
FlagModified(sx, sy, w, h);
}

bool CLayerTele::ContainsElementWithId(int Id, bool Checkpoint)
bool CLayerTele::ContainsElementWithId(int Id, int Index)
{
for(int y = 0; y < m_Height; ++y)
{
for(int x = 0; x < m_Width; ++x)
{
if(IsTeleTileNumberUsed(m_pTeleTile[y * m_Width + x].m_Type, Checkpoint) && m_pTeleTile[y * m_Width + x].m_Number == Id)
if(m_pTeleTile[y * m_Width + x].m_Type == Index && m_pTeleTile[y * m_Width + x].m_Number == Id)
{
return true;
}
Expand Down
5 changes: 2 additions & 3 deletions src/game/editor/mapitems/layer_tele.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ class CLayerTele : public CLayerTiles
~CLayerTele();

CTeleTile *m_pTeleTile;
unsigned char m_TeleNum;
unsigned char m_TeleCheckpointNum;
std::map<int, unsigned char> m_TeleNumbers;

void Resize(int NewW, int NewH) override;
void Shift(int Direction) override;
Expand All @@ -33,7 +32,7 @@ class CLayerTele : public CLayerTiles
void BrushFlipY() override;
void BrushRotate(float Amount) override;
void FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRect Rect) override;
virtual bool ContainsElementWithId(int Id, bool Checkpoint);
virtual bool ContainsElementWithId(int Id, int Index);
virtual void GetPos(int Number, int Offset, int &TeleX, int &TeleY);

int m_GotoTeleOffset;
Expand Down
12 changes: 5 additions & 7 deletions src/game/editor/mapitems/layer_tiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,17 +310,15 @@ int CLayerTiles::BrushGrab(std::shared_ptr<CLayerGroup> pBrush, CUIRect Rect)
for(int x = 0; x < r.w; x++)
{
pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x] = static_cast<CLayerTele *>(this)->m_pTeleTile[(r.y + y) * m_Width + (r.x + x)];
if(IsValidTeleTile(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type))
unsigned char TgtIndex = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type;
if(IsValidTeleTile(TgtIndex))
{
if(IsTeleTileNumberUsed(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type, false))
m_pEditor->m_TeleNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
else if(IsTeleTileNumberUsed(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type, true))
m_pEditor->m_TeleCheckpointNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
if(IsTeleTileNumberUsedAny(TgtIndex))
m_pEditor->m_TeleNumbers[TgtIndex] = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
}
}

pGrabbed->m_TeleNum = m_pEditor->m_TeleNumber;
pGrabbed->m_TeleCheckpointNum = m_pEditor->m_TeleCheckpointNumber;
pGrabbed->m_TeleNumbers = m_pEditor->m_TeleNumbers;

str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName);
}
Expand Down
Loading

0 comments on commit f2090d6

Please sign in to comment.