Selaa lähdekoodia

Merge pull request #4686 from godric3/map_editor_timed_events_objects_removal

Add map editor ui to set objects to remove on timed event
Dydzio 1 vuosi sitten
vanhempi
sitoutus
f64c6df05c

+ 0 - 18
lib/gameState/CGameState.cpp

@@ -210,7 +210,6 @@ void CGameState::init(const IMapService * mapService, StartInfo * si, Load::Prog
 	buildBonusSystemTree();
 	initVisitingAndGarrisonedHeroes();
 	initFogOfWar();
-	initTimedEventsRemovableObjects();
 
 	for(auto & elem : teams)
 	{
@@ -952,23 +951,6 @@ void CGameState::initMapObjects()
 	map->calculateGuardingGreaturePositions(); //calculate once again when all the guards are placed and initialized
 }
 
-void CGameState::initTimedEventsRemovableObjects()
-{
-	for(auto & timedEvent : map->events)
-	{
-		for(int3 coordinate : timedEvent.deletedObjectsCoordinates)
-		{
-			if(isInTheMap(coordinate))
-			{
-				for(const CGObjectInstance * object : getBlockingObjs(coordinate))
-				{
-					timedEvent.deletedObjectsInstances.push_back(object->id);
-				}
-			}
-		}
-	}
-}
-
 void CGameState::placeHeroesInTowns()
 {
 	for(auto & player : players)

+ 0 - 1
lib/gameState/CGameState.h

@@ -196,7 +196,6 @@ private:
 	void initTowns();
 	void initTownNames();
 	void initMapObjects();
-	void initTimedEventsRemovableObjects();
 	void initVisitingAndGarrisonedHeroes();
 	void initCampaign();
 

+ 1 - 1
lib/mapObjects/CGTownInstance.cpp

@@ -376,7 +376,7 @@ void CGTownInstance::onHeroLeave(const CGHeroInstance * h) const
 
 std::string CGTownInstance::getObjectName() const
 {
-	return getNameTranslated() + ", " + town->faction->getNameTranslated();
+	return getNameTranslated() + ", " + (ID == Obj::RANDOM_TOWN ? "Random town" : getFaction().toEntity(VLC)->getNameTranslated());
 }
 
 bool CGTownInstance::townEnvisagesBuilding(BuildingSubID::EBuildingSubID subId) const

+ 2 - 18
lib/mapping/CMap.cpp

@@ -104,24 +104,8 @@ void CMapEvent::serializeJson(JsonSerializeFormat & handler)
 	handler.serializeInt("nextOccurrence", nextOccurrence);
 	resources.serializeJson(handler, "resources");
 
-	JsonNode deletedObjectsJson;
-
-	for (const auto & entry : deletedObjectsCoordinates)
-	{
-		JsonNode values;
-		JsonNode valueX;
-		JsonNode valueY;
-		JsonNode valueZ;
-		valueX.Float() = static_cast<int>(entry.x);
-		valueY.Float() = static_cast<int>(entry.y);
-		valueZ.Float() = static_cast<int>(entry.z);
-		values.Vector().push_back(valueX);
-		values.Vector().push_back(valueY);
-		values.Vector().push_back(valueZ);
-		deletedObjectsJson.Vector().push_back(values);
-	}
-
-	handler.serializeRaw("deletedObjectsCoordinates", deletedObjectsJson, std::nullopt);
+	auto deletedObjects = handler.enterArray("deletedObjectsInstances");
+	deletedObjects.serializeArray(deletedObjectsInstances);
 }
 
 void CCastleEvent::serializeJson(JsonSerializeFormat & handler)

+ 2 - 1
mapeditor/mapeditorroles.h

@@ -16,5 +16,6 @@ enum MapEditorRoles
 	TownEventRole = Qt::UserRole + 1,
 	PlayerIDRole,
 	BuildingIDRole,
-	SpellIDRole
+	SpellIDRole,
+	ObjectInstanceIDRole
 };

+ 11 - 11
mapeditor/mapsettings/eventsettings.cpp

@@ -55,23 +55,23 @@ TResources resourcesFromVariant(const QVariant & v)
 	return TResources(vJson);
 }
 
-QVariant toVariant(std::vector<int3> positions)
+QVariant toVariant(std::vector<ObjectInstanceID> objects)
 {
 	QVariantList result;
-	for(int3 position : positions)
+	for(auto obj : objects)
 	{
-		result.push_back(QVariant::fromValue<int3>(position));
+		result.push_back(QVariant::fromValue(obj.num));
 	}
 	return result;
 }
 
-std::vector<int3> deletedObjectsPositionsFromVariant(const QVariant & v)
+std::vector<ObjectInstanceID> deletedObjectsIdsFromVariant(const QVariant & v)
 {
-	std::vector<int3> result;
-	for (auto positionAsVariant : v.toList())
+	std::vector<ObjectInstanceID> result;
+	for(auto idAsVariant : v.toList())
 	{
-		int3 position = positionAsVariant.value<int3>();
-		result.push_back(position);
+		auto id = idAsVariant.value<int>();
+		result.push_back(ObjectInstanceID(id));
 	}
 
 	return result;
@@ -88,7 +88,7 @@ QVariant toVariant(const CMapEvent & event)
 	result["firstOccurrence"] = QVariant::fromValue(event.firstOccurrence);
 	result["nextOccurrence"] = QVariant::fromValue(event.nextOccurrence);
 	result["resources"] = toVariant(event.resources);
-	result["deletedObjectsPositions"] = toVariant(event.deletedObjectsCoordinates);
+	result["deletedObjectsInstances"] = toVariant(event.deletedObjectsInstances);
 	return QVariant(result);
 }
 
@@ -104,7 +104,7 @@ CMapEvent eventFromVariant(CMapHeader & mapHeader, const QVariant & variant)
 	result.firstOccurrence = v.value("firstOccurrence").toInt();
 	result.nextOccurrence = v.value("nextOccurrence").toInt();
 	result.resources = resourcesFromVariant(v.value("resources"));
-	result.deletedObjectsCoordinates = deletedObjectsPositionsFromVariant(v.value("deletedObjectsPositions"));
+	result.deletedObjectsInstances = deletedObjectsIdsFromVariant(v.value("deletedObjectsInstances"));
 	return result;
 }
 
@@ -161,6 +161,6 @@ void EventSettings::on_timedEventRemove_clicked()
 
 void EventSettings::on_eventsList_itemActivated(QListWidgetItem *item)
 {
-	new TimedEvent(item, parentWidget());
+	new TimedEvent(*controller, item, parentWidget());
 }
 

+ 66 - 4
mapeditor/mapsettings/timedevent.cpp

@@ -11,13 +11,15 @@
 #include "timedevent.h"
 #include "ui_timedevent.h"
 #include "eventsettings.h"
+#include "../mapeditorroles.h"
 #include "../../lib/constants/EntityIdentifiers.h"
 #include "../../lib/constants/StringConstants.h"
 
-TimedEvent::TimedEvent(QListWidgetItem * t, QWidget *parent) :
+TimedEvent::TimedEvent(MapController & c, QListWidgetItem * t, QWidget *parent) : 
+	controller(c),
 	QDialog(parent),
-	target(t),
-	ui(new Ui::TimedEvent)
+	ui(new Ui::TimedEvent),
+	target(t)
 {
 	ui->setupUi(this);
 
@@ -51,7 +53,14 @@ TimedEvent::TimedEvent(QListWidgetItem * t, QWidget *parent) :
 		nval->setFlags(nval->flags() | Qt::ItemIsEditable);
 		ui->resources->setItem(i, 1, nval);
 	}
-
+	auto deletedObjectInstances = params.value("deletedObjectsInstances").toList();
+	for(auto const & idAsVariant : deletedObjectInstances)
+	{
+		auto id = ObjectInstanceID(idAsVariant.toInt());
+		auto obj = controller.map()->objects[id];
+		if(obj)
+			insertObjectToDelete(obj);
+	}
 	show();
 }
 
@@ -89,10 +98,63 @@ void TimedEvent::on_TimedEvent_finished(int result)
 	}
 	descriptor["resources"] = res;
 
+	QVariantList deletedObjects;
+	for(int i = 0; i < ui->deletedObjects->count(); ++i)
+	{
+		auto const & item = ui->deletedObjects->item(i);
+		auto data = item->data(MapEditorRoles::ObjectInstanceIDRole);
+		auto id = ObjectInstanceID(data.value<int>());
+		deletedObjects.push_back(QVariant::fromValue(id.num));
+	}
+	descriptor["deletedObjectsInstances"] = QVariant::fromValue(deletedObjects);
+
 	target->setData(Qt::UserRole, descriptor);
 	target->setText(ui->eventNameText->text());
 }
 
+void TimedEvent::on_addObjectToDelete_clicked()
+{
+	for(int lvl : {0, 1})
+	{
+		auto & l = controller.scene(lvl)->objectPickerView;
+		l.highlight<const CGObjectInstance>();
+		l.update();
+		QObject::connect(&l, &ObjectPickerLayer::selectionMade, this, &TimedEvent::onObjectPicked);
+	}
+	hide();
+	dynamic_cast<QWidget *>(parent()->parent()->parent()->parent()->parent()->parent()->parent())->hide();
+}
+
+void TimedEvent::on_removeObjectToDelete_clicked()
+{
+	delete ui->deletedObjects->takeItem(ui->deletedObjects->currentRow());
+}
+
+void TimedEvent::onObjectPicked(const CGObjectInstance * obj)
+{
+	show();
+	dynamic_cast<QWidget *>(parent()->parent()->parent()->parent()->parent()->parent()->parent())->show();
+
+	for(int lvl : {0, 1})
+	{
+		auto & l = controller.scene(lvl)->objectPickerView;
+		l.clear();
+		l.update();
+		QObject::disconnect(&l, &ObjectPickerLayer::selectionMade, this, &TimedEvent::onObjectPicked);
+	}
+
+	if(!obj) 
+		return;
+	insertObjectToDelete(obj);
+}
+
+void TimedEvent::insertObjectToDelete(const CGObjectInstance * obj)
+{
+	QString objectLabel = QString("%1, x: %2, y: %3, z: %4").arg(QString::fromStdString(obj->getObjectName())).arg(obj->pos.x).arg(obj->pos.y).arg(obj->pos.z);
+	auto * item = new QListWidgetItem(objectLabel);
+	item->setData(MapEditorRoles::ObjectInstanceIDRole, QVariant::fromValue(obj->id.num));
+	ui->deletedObjects->addItem(item);
+}
 
 void TimedEvent::on_pushButton_clicked()
 {

+ 14 - 3
mapeditor/mapsettings/timedevent.h

@@ -11,6 +11,8 @@
 
 #include <QDialog>
 
+#include "mapcontroller.h"
+
 namespace Ui {
 class TimedEvent;
 }
@@ -20,18 +22,27 @@ class TimedEvent : public QDialog
 	Q_OBJECT
 
 public:
-	explicit TimedEvent(QListWidgetItem *, QWidget *parent = nullptr);
+	explicit TimedEvent(MapController & map, QListWidgetItem *, QWidget * parent = nullptr);
 	~TimedEvent();
 
 private slots:
 
 	void on_TimedEvent_finished(int result);
 
+	void on_addObjectToDelete_clicked();
+
+	void on_removeObjectToDelete_clicked();
+
+	void onObjectPicked(const CGObjectInstance * obj);
+
+	void insertObjectToDelete(const CGObjectInstance * obj);
+
 	void on_pushButton_clicked();
 
-	void on_resources_itemDoubleClicked(QTableWidgetItem *item);
+	void on_resources_itemDoubleClicked(QTableWidgetItem * item);
 
 private:
-	Ui::TimedEvent *ui;
+	MapController & controller;
+	Ui::TimedEvent * ui;
 	QListWidgetItem * target;
 };

+ 30 - 2
mapeditor/mapsettings/timedevent.ui

@@ -9,8 +9,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>620</width>
-    <height>371</height>
+    <width>730</width>
+    <height>422</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -197,6 +197,34 @@
        </column>
       </widget>
      </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QLabel" name="deletedObjectsLabel">
+       <property name="text">
+        <string>Objects to delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="addObjectToDelete">
+       <property name="text">
+        <string>Add</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="removeObjectToDelete">
+       <property name="text">
+        <string>Remove</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QListWidget" name="deletedObjects"/>
+     </item>
      <item>
       <widget class="QPushButton" name="pushButton">
        <property name="text">