Skip to content

Commit 95b0a2b

Browse files
committed
1 parent 4c2b960 commit 95b0a2b

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed

game/gamemap.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ class GameMap : public QObject, public FileSerializable, public oxygine::Actor,
134134
* @brief rotate90Y
135135
*/
136136
void rotateY90();
137+
/**
138+
* @brief rotate90
139+
*/
140+
void rotate90();
137141

138142
/**
139143
* @brief getTerrain smart pointer

mapsupport/refactorMap.cpp

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,3 +724,122 @@ void GameMap::rotateY()
724724
centerMap(getMapWidth() / 2, getMapHeight() / 2);
725725
Mainapp::getInstance()->continueRendering();
726726
}
727+
728+
void GameMap::rotate90()
729+
{
730+
Mainapp::getInstance()->pauseRendering();
731+
qint32 currentHeigth = getMapHeight();
732+
qint32 currentWidth = getMapWidth();
733+
// upper left quarter gets rotated to upper right
734+
for (qint32 y = 0; y < currentHeigth / 2; y++)
735+
{
736+
for (qint32 x = 0; x < currentWidth / 2; x++)
737+
{
738+
spTerrain sourceTerrain = m_fields[y][x];
739+
qint32 targetX = currentWidth - y - 1;
740+
qint32 targetY = x;
741+
if (onMap(x, y))
742+
{
743+
spTerrain targetTerrain = m_fields[targetY][targetX];
744+
targetTerrain->detach();
745+
targetTerrain = Terrain::createTerrain(sourceTerrain->getTerrainID(), targetX, targetY, sourceTerrain->getBaseTerrainID(), this);
746+
m_rowSprites[targetY]->addChild(targetTerrain);
747+
m_fields[targetY][targetX] = targetTerrain;
748+
targetTerrain->setPosition(targetX * m_imagesize, targetY * m_imagesize);
749+
750+
spBuilding pCurrentBuilding = sourceTerrain->getSpBuilding();
751+
if (sourceTerrain->getBuilding() != nullptr)
752+
{
753+
spBuilding pBuilding = MemoryManagement::create<Building>(pCurrentBuilding->getBuildingID(), this);
754+
pBuilding->setOwner(pCurrentBuilding->getOwner());
755+
targetTerrain->setBuilding(pBuilding);
756+
}
757+
758+
spUnit pCurrentUnit = sourceTerrain->getSpUnit();
759+
if (pCurrentUnit.get() != nullptr)
760+
{
761+
spUnit pUnit = MemoryManagement::create<Unit>(pCurrentUnit->getUnitID(), pCurrentUnit->getOwner(), false, this);
762+
targetTerrain->setUnit(pUnit);
763+
pUnit->setAiMode(pCurrentUnit->getAiMode());
764+
}
765+
}
766+
}
767+
}
768+
769+
// upper left quarter gets rotated to lower left
770+
for (qint32 y = 0; y < currentHeigth / 2; y++)
771+
{
772+
for (qint32 x = 0; x < currentWidth / 2; x++)
773+
{
774+
spTerrain sourceTerrain = m_fields[y][x];
775+
qint32 targetX = y;
776+
qint32 targetY = currentHeigth - x - 1;
777+
if (onMap(x, y))
778+
{
779+
spTerrain targetTerrain = m_fields[targetY][targetX];
780+
targetTerrain->detach();
781+
targetTerrain = Terrain::createTerrain(sourceTerrain->getTerrainID(), targetX, targetY, sourceTerrain->getBaseTerrainID(), this);
782+
m_rowSprites[targetY]->addChild(targetTerrain);
783+
m_fields[targetY][targetX] = targetTerrain;
784+
targetTerrain->setPosition(targetX * m_imagesize, targetY * m_imagesize);
785+
786+
spBuilding pCurrentBuilding = sourceTerrain->getSpBuilding();
787+
if (sourceTerrain->getBuilding() != nullptr)
788+
{
789+
spBuilding pBuilding = MemoryManagement::create<Building>(pCurrentBuilding->getBuildingID(), this);
790+
pBuilding->setOwner(pCurrentBuilding->getOwner());
791+
targetTerrain->setBuilding(pBuilding);
792+
}
793+
794+
spUnit pCurrentUnit = sourceTerrain->getSpUnit();
795+
if (pCurrentUnit.get() != nullptr)
796+
{
797+
spUnit pUnit = MemoryManagement::create<Unit>(pCurrentUnit->getUnitID(), pCurrentUnit->getOwner(), false, this);
798+
targetTerrain->setUnit(pUnit);
799+
pUnit->setAiMode(pCurrentUnit->getAiMode());
800+
}
801+
}
802+
}
803+
}
804+
805+
// upper left quarter gets rotated to lower right
806+
for (qint32 y = 0; y < currentHeigth / 2; y++)
807+
{
808+
for (qint32 x = 0; x < currentWidth / 2; x++)
809+
{
810+
spTerrain sourceTerrain = m_fields[y][x];
811+
qint32 targetX = currentWidth - x - 1;
812+
qint32 targetY = currentHeigth - y - 1;
813+
if (onMap(x, y))
814+
{
815+
spTerrain targetTerrain = m_fields[targetY][targetX];
816+
targetTerrain->detach();
817+
targetTerrain = Terrain::createTerrain(sourceTerrain->getTerrainID(), targetX, targetY, sourceTerrain->getBaseTerrainID(), this);
818+
m_rowSprites[targetY]->addChild(targetTerrain);
819+
m_fields[targetY][targetX] = targetTerrain;
820+
targetTerrain->setPosition(targetX * m_imagesize, targetY * m_imagesize);
821+
822+
spBuilding pCurrentBuilding = sourceTerrain->getSpBuilding();
823+
if (sourceTerrain->getBuilding() != nullptr)
824+
{
825+
spBuilding pBuilding = MemoryManagement::create<Building>(pCurrentBuilding->getBuildingID(), this);
826+
pBuilding->setOwner(pCurrentBuilding->getOwner());
827+
targetTerrain->setBuilding(pBuilding);
828+
}
829+
830+
spUnit pCurrentUnit = sourceTerrain->getSpUnit();
831+
if (pCurrentUnit.get() != nullptr)
832+
{
833+
spUnit pUnit = MemoryManagement::create<Unit>(pCurrentUnit->getUnitID(), pCurrentUnit->getOwner(), false, this);
834+
targetTerrain->setUnit(pUnit);
835+
pUnit->setAiMode(pCurrentUnit->getAiMode());
836+
}
837+
}
838+
}
839+
}
840+
841+
842+
updateSprites(-1, -1, true);
843+
centerMap(getMapWidth() / 2, getMapHeight() / 2);
844+
Mainapp::getInstance()->continueRendering();
845+
}

menue/editormenue.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ EditorMenue::EditorMenue()
114114
m_Topbar->addItem(tr("Rotate map X 90°"), "ROTATEX90", 1, tr("Rotates the upper left quarter into the upper right quarter of the map and rotates the lower right quarter into the lower left quarter of the map "));
115115
m_Topbar->addItem(tr("Rotate map Y 180°"), "ROTATEY", 1, tr("Flips and rotates the map at the y-axis. Using the top half of the map. The bottom half of the map is changed."));
116116
m_Topbar->addItem(tr("Rotate map Y 90°"), "ROTATEY90", 1, tr("Rotates the upper left quarter into the lower left quarter of the map and rotates the lower right quarter into the upper right quarter of the map "));
117+
m_Topbar->addItem(tr("Rotate map 90°"), "ROTATE90", 1, tr("Rotates the upper left quarter into all other quarters."));
117118
m_Topbar->addItem(tr("Random map"), "RANDOMMAP", 1, tr("Creates a new random map."));
118119
m_Topbar->addItem(tr("Toggle grid ") + SelectKey::getKeycodeText(Settings::getInstance()->getKey_toggleGridLayout()), "TOGGLEGRID", 1, tr("Shows or hides a grid layout."));
119120
m_Topbar->addItem(tr("Toggle cross Strg+M"), "TOGGLEMIDDLECROSS", 1, tr("Shows or hides the cross marking the middle of the map."));
@@ -398,6 +399,7 @@ void EditorMenue::clickedTopbar(QString itemID)
398399
MenuItem("ROTATEY", &EditorMenue::rotateY),
399400
MenuItem("ROTATEX90", &EditorMenue::rotateX90),
400401
MenuItem("ROTATEY90", &EditorMenue::rotateY90),
402+
MenuItem("ROTATE90", &EditorMenue::rotate90),
401403
MenuItem("RANDOMMAP", &EditorMenue::showRandomMap),
402404
MenuItem("PLACESELECTION", &EditorMenue::changePlaceSelection),
403405
MenuItem("DELETEUNITS", &EditorMenue::deleteUnits),
@@ -786,6 +788,13 @@ void EditorMenue::rotateY90()
786788
pGameMap->rotateY90();
787789
}
788790

791+
void EditorMenue::rotate90()
792+
{
793+
createTempFile();
794+
spGameMap pGameMap = m_pMap;
795+
pGameMap->rotate90();
796+
}
797+
789798
void EditorMenue::showRandomMap()
790799
{
791800
spDialogRandomMap pDialogRandomMap = MemoryManagement::create<DialogRandomMap>(tr("Do you want to create a random map and discard all current changes?"));

menue/editormenue.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,10 @@ public slots:
324324
* @brief rotateY90
325325
*/
326326
void rotateY90();
327+
/**
328+
* @brief rotate90
329+
*/
330+
void rotate90();
327331
/**
328332
* @brief showRandomMap
329333
*/

0 commit comments

Comments
 (0)