|  | @@ -16,6 +16,8 @@
 | 
	
		
			
				|  |  |  #include <QFile>
 | 
	
		
			
				|  |  |  #include <QMessageBox>
 | 
	
		
			
				|  |  |  #include <QFileInfo>
 | 
	
		
			
				|  |  | +#include <QDialog>
 | 
	
		
			
				|  |  | +#include <QListWidget>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "../lib/VCMIDirs.h"
 | 
	
		
			
				|  |  |  #include "../lib/VCMI_Lib.h"
 | 
	
	
		
			
				|  | @@ -222,6 +224,8 @@ MainWindow::MainWindow(QWidget* parent) :
 | 
	
		
			
				|  |  |  	ui->toolFill->setIcon(QIcon{":/icons/tool-fill.png"});
 | 
	
		
			
				|  |  |  	ui->toolSelect->setIcon(QIcon{":/icons/tool-select.png"});
 | 
	
		
			
				|  |  |  	ui->actionOpen->setIcon(QIcon{":/icons/document-open.png"});
 | 
	
		
			
				|  |  | +	ui->actionOpenRecent->setIcon(QIcon{":/icons/document-open-recent.png"});
 | 
	
		
			
				|  |  | +	ui->menuOpenRecent->setIcon(QIcon{":/icons/document-open-recent.png"});
 | 
	
		
			
				|  |  |  	ui->actionSave->setIcon(QIcon{":/icons/document-save.png"});
 | 
	
		
			
				|  |  |  	ui->actionNew->setIcon(QIcon{":/icons/document-new.png"});
 | 
	
		
			
				|  |  |  	ui->actionLevel->setIcon(QIcon{":/icons/toggle-underground.png"});
 | 
	
	
		
			
				|  | @@ -265,6 +269,8 @@ MainWindow::MainWindow(QWidget* parent) :
 | 
	
		
			
				|  |  |  	scenePreview = new QGraphicsScene(this);
 | 
	
		
			
				|  |  |  	ui->objectPreview->setScene(scenePreview);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	connect(ui->actionOpenRecentMore, &QAction::triggered, this, &MainWindow::on_actionOpenRecent_triggered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	//loading objects
 | 
	
		
			
				|  |  |  	loadObjectsTree();
 | 
	
		
			
				|  |  |  	
 | 
	
	
		
			
				|  | @@ -412,9 +418,21 @@ bool MainWindow::openMap(const QString & filenameSelect)
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	filename = filenameSelect;
 | 
	
		
			
				|  |  |  	initializeMap(controller.map()->version != EMapFormat::VCMI);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	updateRecentMenu(filenameSelect);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void MainWindow::updateRecentMenu(const QString & filenameSelect) {
 | 
	
		
			
				|  |  | +	QSettings s(Ui::teamName, Ui::appName);
 | 
	
		
			
				|  |  | +	QStringList recentFiles = s.value(recentlyOpenedFilesSetting).toStringList();
 | 
	
		
			
				|  |  | +	recentFiles.removeAll(filenameSelect);
 | 
	
		
			
				|  |  | +	recentFiles.prepend(filenameSelect);
 | 
	
		
			
				|  |  | +	constexpr int maxRecentFiles = 10;
 | 
	
		
			
				|  |  | +	s.setValue(recentlyOpenedFilesSetting, QStringList(recentFiles.mid(0, maxRecentFiles)));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void MainWindow::on_actionOpen_triggered()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	if(!getAnswerAboutUnsavedChanges())
 | 
	
	
		
			
				|  | @@ -429,6 +447,91 @@ void MainWindow::on_actionOpen_triggered()
 | 
	
		
			
				|  |  |  	openMap(filenameSelect);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void MainWindow::on_actionOpenRecent_triggered()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	QSettings s(Ui::teamName, Ui::appName);
 | 
	
		
			
				|  |  | +	QStringList recentFiles = s.value(recentlyOpenedFilesSetting).toStringList();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	class RecentFileDialog : public QDialog
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	public:
 | 
	
		
			
				|  |  | +		RecentFileDialog(const QStringList& recentFiles, QWidget *parent)
 | 
	
		
			
				|  |  | +			: QDialog(parent), layout(new QVBoxLayout(this)), listWidget(new QListWidget(this))
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			setWindowTitle(tr("Recently Opened Files"));
 | 
	
		
			
				|  |  | +			setMinimumWidth(600);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			connect(listWidget, &QListWidget::itemActivated, this, [this](QListWidgetItem *item)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				accept();
 | 
	
		
			
				|  |  | +			});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			for (const QString &file : recentFiles)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				QListWidgetItem *item = new QListWidgetItem(file);
 | 
	
		
			
				|  |  | +				listWidget->addItem(item);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Select most recent items by default.
 | 
	
		
			
				|  |  | +			// This enables a "CTRL+R => Enter"-workflow instead of "CTRL+R => 'mouse click on first item'"
 | 
	
		
			
				|  |  | +			if(listWidget->count() > 0)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				listWidget->item(0)->setSelected(true);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			layout->setSizeConstraint(QLayout::SetMaximumSize);
 | 
	
		
			
				|  |  | +			layout->addWidget(listWidget);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		QString getSelectedFilePath() const
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			return listWidget->currentItem()->text();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	private:
 | 
	
		
			
				|  |  | +		QVBoxLayout * layout;
 | 
	
		
			
				|  |  | +		QListWidget * listWidget;
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	RecentFileDialog d(recentFiles, this);
 | 
	
		
			
				|  |  | +	if(d.exec() == QDialog::Accepted && getAnswerAboutUnsavedChanges())
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		openMap(d.getSelectedFilePath());
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void MainWindow::on_menuOpenRecent_aboutToShow()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// Clear all actions except "More...", lest the list will grow with each
 | 
	
		
			
				|  |  | +	// showing of the list
 | 
	
		
			
				|  |  | +	for (QAction* action : ui->menuOpenRecent->actions()) {
 | 
	
		
			
				|  |  | +		if (action != ui->actionOpenRecentMore) {
 | 
	
		
			
				|  |  | +			ui->menuOpenRecent->removeAction(action);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	QSettings s(Ui::teamName, Ui::appName);
 | 
	
		
			
				|  |  | +	QStringList recentFiles = s.value(recentlyOpenedFilesSetting).toStringList();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Dynamically populate menuOpenRecent with one action per file.
 | 
	
		
			
				|  |  | +	for (const QString & file : recentFiles) {
 | 
	
		
			
				|  |  | +		QAction *action = new QAction(file, this);
 | 
	
		
			
				|  |  | +		ui->menuOpenRecent->insertAction(ui->actionOpenRecentMore, action);
 | 
	
		
			
				|  |  | +		connect(action, &QAction::triggered, this, [this, file]() {
 | 
	
		
			
				|  |  | +			if(!getAnswerAboutUnsavedChanges())
 | 
	
		
			
				|  |  | +				return;
 | 
	
		
			
				|  |  | +			openMap(file);
 | 
	
		
			
				|  |  | +		});
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Finally add a separator between recent entries and "More..."
 | 
	
		
			
				|  |  | +	if(recentFiles.size() > 0) {
 | 
	
		
			
				|  |  | +		ui->menuOpenRecent->insertSeparator(ui->actionOpenRecentMore);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void MainWindow::saveMap()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	if(!controller.map())
 | 
	
	
		
			
				|  | @@ -534,7 +637,7 @@ void MainWindow::roadOrRiverButtonClicked(ui8 type, bool isRoad)
 | 
	
		
			
				|  |  |  	controller.commitRoadOrRiverChange(mapLevel, type, isRoad);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void MainWindow::addGroupIntoCatalog(const std::string & groupName, bool staticOnly)
 | 
	
		
			
				|  |  | +void MainWindow::addGroupIntoCatalog(const QString & groupName, bool staticOnly)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	auto knownObjects = VLC->objtypeh->knownObjects();
 | 
	
		
			
				|  |  |  	for(auto ID : knownObjects)
 | 
	
	
		
			
				|  | @@ -546,13 +649,13 @@ void MainWindow::addGroupIntoCatalog(const std::string & groupName, bool staticO
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void MainWindow::addGroupIntoCatalog(const std::string & groupName, bool useCustomName, bool staticOnly, int ID)
 | 
	
		
			
				|  |  | +void MainWindow::addGroupIntoCatalog(const QString & groupName, bool useCustomName, bool staticOnly, int ID)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	QStandardItem * itemGroup = nullptr;
 | 
	
		
			
				|  |  | -	auto itms = objectsModel.findItems(QString::fromStdString(groupName));
 | 
	
		
			
				|  |  | +	auto itms = objectsModel.findItems(groupName);
 | 
	
		
			
				|  |  |  	if(itms.empty())
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		itemGroup = new QStandardItem(QString::fromStdString(groupName));
 | 
	
		
			
				|  |  | +		itemGroup = new QStandardItem(groupName);
 | 
	
		
			
				|  |  |  		objectsModel.appendRow(itemGroup);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	else
 | 
	
	
		
			
				|  | @@ -684,138 +787,158 @@ void MainWindow::loadObjectsTree()
 | 
	
		
			
				|  |  |  	ui->treeView->setSelectionMode(QAbstractItemView::SingleSelection);
 | 
	
		
			
				|  |  |  	connect(ui->treeView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(treeViewSelected(const QModelIndex &, const QModelIndex &)));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	//groups
 | 
	
		
			
				|  |  | +	enum GroupCat { TOWNS, OBJECTS, HEROES, ARTIFACTS, RESOURCES, BANKS, DWELLINGS, GROUNDS, TELEPORTS, MINES, TRIGGERS, MONSTERS, QUESTS, WOG_OBJECTS, OBSTACLES, OTHER };
 | 
	
		
			
				|  |  | +	QMap<GroupCat, QString> groups = {
 | 
	
		
			
				|  |  | +		{ TOWNS,       tr("Towns")       },
 | 
	
		
			
				|  |  | +		{ OBJECTS,     tr("Objects")     },
 | 
	
		
			
				|  |  | +		{ HEROES,      tr("Heroes")      },
 | 
	
		
			
				|  |  | +		{ ARTIFACTS,   tr("Artifacts")   },
 | 
	
		
			
				|  |  | +		{ RESOURCES,   tr("Resources")   },
 | 
	
		
			
				|  |  | +		{ BANKS,       tr("Banks")       },
 | 
	
		
			
				|  |  | +		{ DWELLINGS,   tr("Dwellings")   },
 | 
	
		
			
				|  |  | +		{ GROUNDS,     tr("Grounds")     },
 | 
	
		
			
				|  |  | +		{ TELEPORTS,   tr("Teleports")   },
 | 
	
		
			
				|  |  | +		{ MINES,       tr("Mines")       },
 | 
	
		
			
				|  |  | +		{ TRIGGERS,    tr("Triggers")    },
 | 
	
		
			
				|  |  | +		{ MONSTERS,    tr("Monsters")    },
 | 
	
		
			
				|  |  | +		{ QUESTS,      tr("Quests")      },
 | 
	
		
			
				|  |  | +		{ WOG_OBJECTS, tr("Wog Objects") },
 | 
	
		
			
				|  |  | +		{ OBSTACLES,   tr("Obstacles")   },
 | 
	
		
			
				|  |  | +		{ OTHER,       tr("Other")       },
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	//adding objects
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TOWNS", false, false, Obj::TOWN);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TOWNS", false, false, Obj::RANDOM_TOWN);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TOWNS", true, false, Obj::SHIPYARD);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TOWNS", true, false, Obj::GARRISON);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TOWNS", true, false, Obj::GARRISON2);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::ARENA);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::BUOY);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::CARTOGRAPHER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SWAN_POND);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::COVER_OF_DARKNESS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::CORPSE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::FAERIE_RING);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::FOUNTAIN_OF_FORTUNE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::FOUNTAIN_OF_YOUTH);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::GARDEN_OF_REVELATION);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::HILL_FORT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::IDOL_OF_FORTUNE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::LIBRARY_OF_ENLIGHTENMENT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::LIGHTHOUSE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SCHOOL_OF_MAGIC);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MAGIC_SPRING);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MAGIC_WELL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MERCENARY_CAMP);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MERMAID);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MYSTICAL_GARDEN);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::OASIS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::LEAN_TO);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::OBELISK);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::REDWOOD_OBSERVATORY);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::PILLAR_OF_FIRE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::STAR_AXIS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::RALLY_FLAG);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::WATERING_HOLE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SCHOLAR);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SHRINE_OF_MAGIC_INCANTATION);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SHRINE_OF_MAGIC_GESTURE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SHRINE_OF_MAGIC_THOUGHT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SIRENS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::STABLES);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::TAVERN);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::TEMPLE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::DEN_OF_THIEVES);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::LEARNING_STONE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::TREE_OF_KNOWLEDGE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::WAGON);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SCHOOL_OF_WAR);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::WAR_MACHINE_FACTORY);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::WARRIORS_TOMB);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::WITCH_HUT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::SANCTUARY);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBJECTS", true, false, Obj::MARLETTO_TOWER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("HEROES", true, false, Obj::PRISON);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("HEROES", false, false, Obj::HERO);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("HEROES", false, false, Obj::RANDOM_HERO);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("HEROES", false, false, Obj::HERO_PLACEHOLDER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("HEROES", false, false, Obj::BOAT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", true, false, Obj::ARTIFACT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", false, false, Obj::RANDOM_ART);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", false, false, Obj::RANDOM_TREASURE_ART);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", false, false, Obj::RANDOM_MINOR_ART);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", false, false, Obj::RANDOM_MAJOR_ART);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", false, false, Obj::RANDOM_RELIC_ART);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", true, false, Obj::SPELL_SCROLL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("ARTIFACTS", true, false, Obj::PANDORAS_BOX);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::RANDOM_RESOURCE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", false, false, Obj::RESOURCE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::SEA_CHEST);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::TREASURE_CHEST);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::CAMPFIRE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::SHIPWRECK_SURVIVOR);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("RESOURCES", true, false, Obj::FLOTSAM);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::CREATURE_BANK);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::DRAGON_UTOPIA);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::CRYPT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::DERELICT_SHIP);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::PYRAMID);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("BANKS", true, false, Obj::SHIPWRECK);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", true, false, Obj::CREATURE_GENERATOR1);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", true, false, Obj::CREATURE_GENERATOR2);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", true, false, Obj::CREATURE_GENERATOR3);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", true, false, Obj::CREATURE_GENERATOR4);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", true, false, Obj::REFUGEE_CAMP);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", false, false, Obj::RANDOM_DWELLING);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", false, false, Obj::RANDOM_DWELLING_LVL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("DWELLINGS", false, false, Obj::RANDOM_DWELLING_FACTION);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::CURSED_GROUND1);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::MAGIC_PLAINS1);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::CLOVER_FIELD);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::CURSED_GROUND2);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::EVIL_FOG);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::FAVORABLE_WINDS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::FIERY_FIELDS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::HOLY_GROUNDS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::LUCID_POOLS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::MAGIC_CLOUDS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::MAGIC_PLAINS2);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::ROCKLANDS);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("GROUNDS", true, false, Obj::HOLE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TELEPORTS", true, false, Obj::MONOLITH_ONE_WAY_ENTRANCE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TELEPORTS", true, false, Obj::MONOLITH_ONE_WAY_EXIT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TELEPORTS", true, false, Obj::MONOLITH_TWO_WAY);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TELEPORTS", true, false, Obj::SUBTERRANEAN_GATE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TELEPORTS", true, false, Obj::WHIRLPOOL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MINES", true, false, Obj::MINE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MINES", false, false, Obj::ABANDONED_MINE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MINES", true, false, Obj::WINDMILL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MINES", true, false, Obj::WATER_WHEEL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TRIGGERS", true, false, Obj::EVENT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TRIGGERS", true, false, Obj::GRAIL);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TRIGGERS", true, false, Obj::SIGN);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("TRIGGERS", true, false, Obj::OCEAN_BOTTLE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", false, false, Obj::MONSTER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L1);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L2);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L3);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L4);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L5);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L6);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("MONSTERS", true, false, Obj::RANDOM_MONSTER_L7);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::SEER_HUT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::BORDER_GATE);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::QUEST_GUARD);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::HUT_OF_MAGI);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::EYE_OF_MAGI);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::BORDERGUARD);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("QUESTS", true, false, Obj::KEYMASTER);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("wog object", true, false, Obj::WOG_OBJECT);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OBSTACLES", true);
 | 
	
		
			
				|  |  | -	addGroupIntoCatalog("OTHER", false);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TOWNS], false, false, Obj::TOWN);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TOWNS], false, false, Obj::RANDOM_TOWN);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TOWNS], true, false, Obj::SHIPYARD);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TOWNS], true, false, Obj::GARRISON);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TOWNS], true, false, Obj::GARRISON2);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::ARENA);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::BUOY);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::CARTOGRAPHER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SWAN_POND);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::COVER_OF_DARKNESS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::CORPSE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::FAERIE_RING);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::FOUNTAIN_OF_FORTUNE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::FOUNTAIN_OF_YOUTH);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::GARDEN_OF_REVELATION);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::HILL_FORT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::IDOL_OF_FORTUNE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::LIBRARY_OF_ENLIGHTENMENT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::LIGHTHOUSE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SCHOOL_OF_MAGIC);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MAGIC_SPRING);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MAGIC_WELL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MERCENARY_CAMP);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MERMAID);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MYSTICAL_GARDEN);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::OASIS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::LEAN_TO);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::OBELISK);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::REDWOOD_OBSERVATORY);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::PILLAR_OF_FIRE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::STAR_AXIS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::RALLY_FLAG);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::WATERING_HOLE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SCHOLAR);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SHRINE_OF_MAGIC_INCANTATION);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SHRINE_OF_MAGIC_GESTURE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SHRINE_OF_MAGIC_THOUGHT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SIRENS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::STABLES);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::TAVERN);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::TEMPLE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::DEN_OF_THIEVES);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::LEARNING_STONE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::TREE_OF_KNOWLEDGE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::WAGON);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SCHOOL_OF_WAR);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::WAR_MACHINE_FACTORY);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::WARRIORS_TOMB);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::WITCH_HUT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::SANCTUARY);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBJECTS], true, false, Obj::MARLETTO_TOWER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[HEROES], true, false, Obj::PRISON);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[HEROES], false, false, Obj::HERO);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[HEROES], false, false, Obj::RANDOM_HERO);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[HEROES], false, false, Obj::HERO_PLACEHOLDER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[HEROES], false, false, Obj::BOAT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], true, false, Obj::ARTIFACT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], false, false, Obj::RANDOM_ART);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], false, false, Obj::RANDOM_TREASURE_ART);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], false, false, Obj::RANDOM_MINOR_ART);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], false, false, Obj::RANDOM_MAJOR_ART);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], false, false, Obj::RANDOM_RELIC_ART);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], true, false, Obj::SPELL_SCROLL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[ARTIFACTS], true, false, Obj::PANDORAS_BOX);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::RANDOM_RESOURCE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], false, false, Obj::RESOURCE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::SEA_CHEST);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::TREASURE_CHEST);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::CAMPFIRE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::SHIPWRECK_SURVIVOR);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[RESOURCES], true, false, Obj::FLOTSAM);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::CREATURE_BANK);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::DRAGON_UTOPIA);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::CRYPT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::DERELICT_SHIP);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::PYRAMID);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[BANKS], true, false, Obj::SHIPWRECK);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], true, false, Obj::CREATURE_GENERATOR1);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], true, false, Obj::CREATURE_GENERATOR2);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], true, false, Obj::CREATURE_GENERATOR3);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], true, false, Obj::CREATURE_GENERATOR4);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], true, false, Obj::REFUGEE_CAMP);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], false, false, Obj::RANDOM_DWELLING);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], false, false, Obj::RANDOM_DWELLING_LVL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[DWELLINGS], false, false, Obj::RANDOM_DWELLING_FACTION);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::CURSED_GROUND1);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::MAGIC_PLAINS1);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::CLOVER_FIELD);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::CURSED_GROUND2);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::EVIL_FOG);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::FAVORABLE_WINDS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::FIERY_FIELDS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::HOLY_GROUNDS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::LUCID_POOLS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::MAGIC_CLOUDS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::MAGIC_PLAINS2);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::ROCKLANDS);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[GROUNDS], true, false, Obj::HOLE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TELEPORTS], true, false, Obj::MONOLITH_ONE_WAY_ENTRANCE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TELEPORTS], true, false, Obj::MONOLITH_ONE_WAY_EXIT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TELEPORTS], true, false, Obj::MONOLITH_TWO_WAY);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TELEPORTS], true, false, Obj::SUBTERRANEAN_GATE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TELEPORTS], true, false, Obj::WHIRLPOOL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MINES], true, false, Obj::MINE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MINES], false, false, Obj::ABANDONED_MINE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MINES], true, false, Obj::WINDMILL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MINES], true, false, Obj::WATER_WHEEL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TRIGGERS], true, false, Obj::EVENT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TRIGGERS], true, false, Obj::GRAIL);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TRIGGERS], true, false, Obj::SIGN);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[TRIGGERS], true, false, Obj::OCEAN_BOTTLE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], false, false, Obj::MONSTER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L1);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L2);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L3);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L4);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L5);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L6);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[MONSTERS], true, false, Obj::RANDOM_MONSTER_L7);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::SEER_HUT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::BORDER_GATE);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::QUEST_GUARD);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::HUT_OF_MAGI);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::EYE_OF_MAGI);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::BORDERGUARD);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[QUESTS], true, false, Obj::KEYMASTER);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[WOG_OBJECTS], true, false, Obj::WOG_OBJECT);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OBSTACLES], true);
 | 
	
		
			
				|  |  | +	addGroupIntoCatalog(groups[OTHER], false);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	catch(const std::exception &)
 | 
	
		
			
				|  |  |  	{
 |