Internationalization and icon tweaks

added better support for localization
added a somewhat spotty German translation
tweaked some of the updated icons
This commit is contained in:
Cubitect 2023-05-23 22:38:44 +02:00
parent 09e6bfd1e2
commit b25dd9be71
25 changed files with 4829 additions and 310 deletions

View File

@ -199,9 +199,6 @@ FORMS += \
src/structuredialog.ui
TRANSLATIONS += \
rc/lang/en_US.ts
RESOURCES += \
rc/icons.qrc \
rc/style.qrc \
@ -209,7 +206,10 @@ RESOURCES += \
rc/lang.qrc
# ----- translations -----
# ----- translations (pluralization) -----
TRANSLATIONS += \
rc/lang/en_US.ts
translations: {
# automatically run lupdate for pluralization default translation

View File

@ -35,7 +35,6 @@
<file>icons/treasure.png</file>
<file>icons/treasure_d.png</file>
<file>icons/zombie.png</file>
<file>icons/zombie_d.png</file>
<file>icons/grid.png</file>
<file>icons/grid_d.png</file>
<file>icons/slime_d.png</file>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

After

Width:  |  Height:  |  Size: 487 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 B

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 B

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 B

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 B

View File

@ -1,5 +1,6 @@
<RCC>
<qresource prefix="/">
<file>lang/en_US.qm</file>
<file>lang/de_DE.qm</file>
</qresource>
</RCC>

BIN
rc/lang/de_DE.qm Normal file

Binary file not shown.

4424
rc/lang/de_DE.ts Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en">
<TS version="2.1" language="en">
<context>
<name>ConfigDialog</name>
<message numerus="yes">
<location filename="../../src/configdialog.cpp" line="111"/>
<location filename="../../src/configdialog.cpp" line="137"/>
<source>[%n biome(s)] %1</source>
<translation>
<numerusform>[%n biome] %1</numerusform>
@ -15,7 +15,7 @@
<context>
<name>FormConditions</name>
<message numerus="yes">
<location filename="../../src/formconditions.cpp" line="255"/>
<location filename="../../src/formconditions.cpp" line="260"/>
<source>Cut %n condition(s)</source>
<translation>
<numerusform>Cut %n condition</numerusform>
@ -23,8 +23,8 @@
</translation>
</message>
<message numerus="yes">
<location filename="../../src/formconditions.cpp" line="260"/>
<location filename="../../src/formconditions.cpp" line="278"/>
<location filename="../../src/formconditions.cpp" line="265"/>
<location filename="../../src/formconditions.cpp" line="283"/>
<source>Copy %n condition(s)</source>
<translation>
<numerusform>Copy %n condition</numerusform>
@ -32,7 +32,7 @@
</translation>
</message>
<message numerus="yes">
<location filename="../../src/formconditions.cpp" line="266"/>
<location filename="../../src/formconditions.cpp" line="271"/>
<source>Paste %n condition(s)</source>
<translation>
<numerusform>Paste %n condition</numerusform>
@ -40,7 +40,7 @@
</translation>
</message>
<message numerus="yes">
<location filename="../../src/formconditions.cpp" line="271"/>
<location filename="../../src/formconditions.cpp" line="276"/>
<source>Remove %n condition(s)</source>
<translation>
<numerusform>Remove %n condition</numerusform>
@ -62,7 +62,7 @@
<context>
<name>FormSearchControl</name>
<message numerus="yes">
<location filename="../../src/formsearchcontrol.cpp" line="340"/>
<location filename="../../src/formsearchcontrol.cpp" line="443"/>
<source>Paste %n seed(s) from clipboard</source>
<translation>
<numerusform>Paste %n seed from clipboard</numerusform>
@ -70,29 +70,10 @@
</translation>
</message>
</context>
<context>
<name>QuadListDialog</name>
<message numerus="yes">
<location filename="../../src/quadlistdialog.cpp" line="159"/>
<source>%n quad-hut(s)</source>
<translation>
<numerusform>%n quad-hut</numerusform>
<numerusform>%n quad-huts</numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../../src/quadlistdialog.cpp" line="160"/>
<source>%n quad-monument(s)</source>
<translation>
<numerusform>%n quad-monument</numerusform>
<numerusform>%n quad-monuments</numerusform>
</translation>
</message>
</context>
<context>
<name>SearchMaster</name>
<message numerus="yes">
<location filename="../../src/searchthread.cpp" line="156"/>
<location filename="../../src/searchthread.cpp" line="165"/>
<source>Biome condition with ID %1 includes %n biome(s) that do not generate in MC %2.</source>
<translation>
<numerusform>Biome condition with ID %1 includes %n biome that does not generate in MC %2.</numerusform>
@ -100,7 +81,7 @@
</translation>
</message>
<message numerus="yes">
<location filename="../../src/searchthread.cpp" line="540"/>
<location filename="../../src/searchthread.cpp" line="560"/>
<source>Failed to stop %n worker thread(s).
Keep waiting for threads to stop?</source>
<translation>

View File

@ -430,7 +430,7 @@ ConditionDialog::ConditionDialog(FormConditions *parent, Config *config, int mcv
setClimateLimits(climaterange[0], cond.limok, true);
setClimateLimits(climaterange[1], cond.limex, false);
ui->comboHeightRange->setCurrentIndex(cond.flags & Condition::FLG_INRANGE ? 0 : 1);
ui->comboHeightRange->setCurrentIndex(cond.flags & Condition::FLG_IN_RANGE ? 0 : 1);
}
on_lineSquare_editingFinished();
@ -1029,7 +1029,7 @@ void ConditionDialog::on_buttonOk_clicked()
if (ui->checkMatchAny->isChecked())
c.flags |= Condition::FLG_MATCH_ANY;
if (ui->comboHeightRange->currentIndex() == 0)
c.flags |= Condition::FLG_INRANGE;
c.flags |= Condition::FLG_IN_RANGE;
c.varflags = c.varstart = 0;
if (ui->checkStartPieces->isChecked())
@ -1098,10 +1098,11 @@ void ConditionDialog::on_comboBoxCat_currentIndexChanged(int idx)
continue;
slot++;
QVariant vidx = QVariant::fromValue((int)(ft - g_filterinfo.list));
QString txt = QApplication::translate("Filter", ft->name);
if (ft->icon)
ui->comboBoxType->insertItem(slot, QIcon(ft->icon), ft->name, vidx);
ui->comboBoxType->insertItem(slot, QIcon(ft->icon), txt, vidx);
else
ui->comboBoxType->insertItem(slot, QApplication::translate("Filter", ft->name), vidx);
ui->comboBoxType->insertItem(slot, txt, vidx);
if (mc < ft->mcmin || mc > ft->mcmax)
ui->comboBoxType->setItemData(slot, false, Qt::UserRole-1); // deactivate

View File

@ -2,6 +2,7 @@
#include "cutil.h"
#include <QThread>
#include <QCoreApplication>
void ExtGenConfig::reset()
@ -282,6 +283,7 @@ void Config::reset()
gridMultiplier = 0;
mapCacheSize = 256;
mapThreads = 0;
lang = "en_US";
biomeColorPath = "";
separator = ";";
quote = "";
@ -300,6 +302,7 @@ void Config::load(QSettings& settings)
gridMultiplier = settings.value("config/gridMultiplier", gridMultiplier).toInt();
mapCacheSize = settings.value("config/mapCacheSize", mapCacheSize).toInt();
mapThreads = settings.value("config/mapThreads", mapThreads).toInt();
lang = settings.value("config/lang", lang).toString();
biomeColorPath = settings.value("config/biomeColorPath", biomeColorPath).toString();
separator = settings.value("config/separator", separator).toString();
quote = settings.value("config/quote", quote).toString();
@ -318,6 +321,7 @@ void Config::save(QSettings& settings)
settings.setValue("config/gridMultiplier", gridMultiplier);
settings.setValue("config/mapCacheSize", mapCacheSize);
settings.setValue("config/mapThreads", mapThreads);
settings.setValue("config/lang", lang);
settings.setValue("config/biomeColorPath", biomeColorPath);
settings.setValue("config/separator", separator);
settings.setValue("config/quote", quote);

View File

@ -172,6 +172,7 @@ struct Config
int gridMultiplier;
int mapCacheSize;
int mapThreads;
QString lang;
QString biomeColorPath;
QString separator;
QString quote;

View File

@ -9,6 +9,8 @@
#include <QThread>
#include <QFileInfo>
#include <QFileDialog>
#include <QDirIterator>
#include <QLocale>
#include <QMessageBox>
@ -32,6 +34,20 @@ ConfigDialog::ConfigDialog(QWidget *parent, Config *config)
ui->lineMatching->setValidator(new QIntValidator(1, 99999999, ui->lineMatching));
ui->spinThreads->setRange(1, QThread::idealThreadCount());
QString rclang = ":/lang";
QDirIterator it(rclang, QDirIterator::Subdirectories);
while (it.hasNext())
{
QString fnam = it.next();
if(!fnam.endsWith(".qm"))
continue;
QString code = QFileInfo(fnam).baseName();
QLocale locale(code);
QString text = QLocale::languageToString(locale.language());
text += " (" + QLocale::countryToString(locale.country()) + ")";
ui->comboLang->addItem(text, code);
}
initConfig(config);
}
@ -55,6 +71,7 @@ void ConfigDialog::initConfig(Config *config)
ui->comboGridMult->setCurrentText(config->gridMultiplier ? QString::number(config->gridMultiplier) : tr("None"));
ui->spinCacheSize->setValue(config->mapCacheSize);
ui->spinThreads->setValue(config->mapThreads ? config->mapThreads : QThread::idealThreadCount());
ui->comboLang->setCurrentIndex(ui->comboLang->findData(config->lang));
ui->lineSep->setText(config->separator);
int idx = config->quote == "\'" ? 1 : config->quote== "\"" ? 2 : 0;
ui->comboQuote->setCurrentIndex(idx);
@ -75,6 +92,7 @@ Config ConfigDialog::getConfig()
conf.gridMultiplier = ui->comboGridMult->currentText().toInt();
conf.mapCacheSize = ui->spinCacheSize->value();
conf.mapThreads = ui->spinThreads->value();
conf.lang = ui->comboLang->currentData().toString();
conf.separator = ui->lineSep->text();
int idx = ui->comboQuote->currentIndex();
conf.quote = idx == 1 ? "\'" : idx == 2 ? "\"" : "";

View File

@ -145,14 +145,7 @@
<string>Interface</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Biome color customization:</string>
</property>
</widget>
</item>
<item row="2" column="4">
<item row="3" column="4">
<widget class="QPushButton" name="buttonClear">
<property name="maximumSize">
<size>
@ -166,133 +159,57 @@
</property>
</widget>
</item>
<item row="2" column="2" colspan="2">
<widget class="QPushButton" name="buttonBiomeColor">
<property name="text">
<string>[none]</string>
</property>
</widget>
</item>
<item row="9" column="0" colspan="5">
<widget class="QCheckBox" name="checkSmooth">
<property name="toolTip">
<string>Simulate innertia for the map view</string>
</property>
<property name="text">
<string>Smooth map motion</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_6">
<property name="toolTip">
<string>Use a fixed grid in blocks instead of outlining the generated map tiles
Leave blank for the default behaviour</string>
</property>
<property name="text">
<string>Custom grid spacing:</string>
</property>
</widget>
</item>
<item row="0" column="2" colspan="3">
<widget class="QComboBox" name="comboStyle">
<property name="iconSize">
<size>
<width>0</width>
<height>16</height>
</size>
</property>
<item>
<property name="text">
<string>System</string>
</property>
</item>
<item>
<property name="text">
<string>Dark</string>
</property>
</item>
</widget>
</item>
<item row="8" column="0" colspan="5">
<widget class="QCheckBox" name="checkBBoxes">
<property name="text">
<string>Outline known bounding boxes</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Maximum structure zoom:</string>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="9" column="0" colspan="5">
<widget class="QCheckBox" name="checkBBoxes">
<property name="text">
<string>Outline known bounding boxes</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Custom grid multiplier:</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>GUI style:</string>
<item row="7" column="2" colspan="3">
<widget class="QSpinBox" name="spinCacheSize">
<property name="suffix">
<string> MB</string>
</property>
<property name="minimum">
<number>16</number>
</property>
<property name="maximum">
<number>8192</number>
</property>
<property name="singleStep">
<number>16</number>
</property>
<property name="value">
<number>256</number>
</property>
</widget>
</item>
<item row="1" column="2" colspan="3">
<widget class="QPushButton" name="buttonBiomeColorEditor">
<item row="10" column="0" colspan="5">
<widget class="QCheckBox" name="checkSmooth">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Simulate inertia for the map view&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit biome colors...</string>
<string>Smooth map motion</string>
</property>
</widget>
</item>
<item row="3" column="2" colspan="3">
<widget class="QPushButton" name="buttonStructVisEdit">
<property name="text">
<string>Edit map visibility limits...</string>
</property>
</widget>
</item>
<item row="4" column="2" colspan="3">
<widget class="QLineEdit" name="lineGridSpacing"/>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Map cache size:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="buttonColorHelp">
<property name="maximumSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">border: none;</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../rc/icons.qrc">
<normaloff>:/icons/info.png</normaloff>:/icons/info.png</iconset>
</property>
<property name="iconSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
</widget>
</item>
<item row="5" column="2" colspan="3">
<item row="6" column="2" colspan="3">
<widget class="QComboBox" name="comboGridMult">
<property name="enabled">
<bool>false</bool>
@ -324,35 +241,128 @@ Leave blank for the default behaviour</string>
</item>
</widget>
</item>
<item row="6" column="2" colspan="3">
<widget class="QSpinBox" name="spinCacheSize">
<property name="suffix">
<string> MB</string>
</property>
<property name="minimum">
<number>16</number>
</property>
<property name="maximum">
<number>8192</number>
</property>
<property name="singleStep">
<number>16</number>
</property>
<property name="value">
<number>256</number>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<item row="8" column="0" colspan="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Threads for map:</string>
</property>
</widget>
</item>
<item row="7" column="2" colspan="3">
<item row="0" column="2" colspan="3">
<widget class="QComboBox" name="comboStyle">
<property name="iconSize">
<size>
<width>0</width>
<height>16</height>
</size>
</property>
<item>
<property name="text">
<string>System</string>
</property>
</item>
<item>
<property name="text">
<string>Dark</string>
</property>
</item>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="buttonColorHelp">
<property name="maximumSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">border: none;</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../rc/icons.qrc">
<normaloff>:/icons/info.png</normaloff>:/icons/info.png</iconset>
</property>
<property name="iconSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
</widget>
</item>
<item row="4" column="2" colspan="3">
<widget class="QPushButton" name="buttonStructVisEdit">
<property name="text">
<string>Edit map visibility limits...</string>
</property>
</widget>
</item>
<item row="5" column="2" colspan="3">
<widget class="QLineEdit" name="lineGridSpacing"/>
</item>
<item row="2" column="2" colspan="3">
<widget class="QPushButton" name="buttonBiomeColorEditor">
<property name="text">
<string>Edit biome colors...</string>
</property>
</widget>
</item>
<item row="3" column="2" colspan="2">
<widget class="QPushButton" name="buttonBiomeColor">
<property name="text">
<string>[none]</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_6">
<property name="toolTip">
<string>Use a fixed grid in blocks instead of outlining the generated map tiles
Leave blank for the default behaviour</string>
</property>
<property name="text">
<string>Custom grid spacing:</string>
</property>
</widget>
</item>
<item row="8" column="2" colspan="3">
<widget class="QSpinBox" name="spinThreads"/>
</item>
<item row="7" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Map cache size:</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Biome color customization:</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>GUI style:</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Language:</string>
</property>
</widget>
</item>
<item row="1" column="2" colspan="3">
<widget class="QComboBox" name="comboLang"/>
</item>
</layout>
</widget>
</item>

View File

@ -23,6 +23,8 @@ class MainWindow;
class SeedTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit SeedTableModel(QObject *parent = nullptr) :
QAbstractTableModel(parent) {}

View File

@ -1,6 +1,5 @@
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QFontDatabase>
#include <QStandardPaths>
#include <QDir>
@ -60,10 +59,6 @@ int main(int argc, char *argv[])
}
}
QTranslator translator;
translator.load("en_US", ":/lang");
app.installTranslator(&translator);
//int fontid = QFontDatabase::addApplicationFont(":/fonts/test.ttf");
int fontid = QFontDatabase::addApplicationFont(":/fonts/DejaVuSans.ttf");
if (fontid >= 0)

View File

@ -33,13 +33,15 @@
#include <QStandardPaths>
#include <QDebug>
#include <QFile>
#include <QTranslator>
#include <QLibraryInfo>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, dock(new QDockWidget(tr("Map"), this))
, mapView(new MapView(this))
, ui()
, dock()
, mapView()
, formCond()
, formGen48()
, formControl()
@ -52,6 +54,15 @@ MainWindow::MainWindow(QWidget *parent)
, dimactions{}
, dimgroup()
{
QSettings settings(APP_STRING, APP_STRING);
QString lang = settings.value("config/lang", QLocale().name()).toString();
if (!loadTranslation(lang))
loadTranslation("en_US");
ui = new Ui::MainWindow;
dock = new QDockWidget(tr("Map"), this);
mapView = new MapView(this);
ui->setupUi(this);
dock->setWidget(mapView);
@ -272,6 +283,22 @@ void MainWindow::closeEvent(QCloseEvent *event)
QMainWindow::closeEvent(event);
}
bool MainWindow::loadTranslation(QString lang)
{
static QTranslator rc_translator;
static QTranslator qt_translator;
if (!rc_translator.load(lang, ":/lang"))
return false;
QLocale::setDefault(lang);
QString qt_locale = "qtbase_" + lang;
QString qt_trpath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
if (qt_translator.load(qt_locale, qt_trpath))
qApp->installTranslator(&qt_translator);
qApp->installTranslator(&rc_translator);
config.lang = lang;
return true;
}
QAction *MainWindow::addMapAction(int sopt, const char *iconpath, QString tip)
{
QIcon icon;
@ -1093,6 +1120,12 @@ void MainWindow::onUpdateConfig()
Config old = config;
config.load();
if (old.lang != config.lang)
{
QString msg = tr("The application will need to be restarted before all changes can take effect.");
QMessageBox::information(this, tr("Restart required"), msg);
}
getMapView()->setConfig(config);
if (old.uistyle != config.uistyle)
onStyleChanged(config.uistyle);

View File

@ -49,6 +49,8 @@ public:
virtual ~MainWindow();
virtual void closeEvent(QCloseEvent *event) override;
bool loadTranslation(QString lang);
QAction *addMapAction(int sopt, const char *iconpath, QString tip);
bool getSeed(WorldInfo *wi, bool applyrand = true);

View File

@ -343,15 +343,10 @@ void MapView::showContextMenu(const QPoint &pos)
grab(); // invokes an immediate paint call
}
VarPos vp = getActivePos();
QString seed = world ? QString::asprintf("%" PRId64, (int64_t)world->wi.seed) : "";
QString tp = QString::asprintf("/tp @p %d ~ %d", vp.p.x, vp.p.z);
QString coords = QString::asprintf("%d %d", vp.p.x, vp.p.z);
QString chunk = QString::asprintf("%d %d", vp.p.x >> 4, vp.p.z >> 4);
QString region = QString::asprintf("%d %d", vp.p.x >> 9, vp.p.z >> 9);
struct _cpy_dat { QString txt, cpy; };
std::vector<_cpy_dat> cpy_dat;
menu.addAction(tr("Go to coordinates..."), this, &MapView::onGoto, QKeySequence(Qt::CTRL + Qt::Key_G));
menu.addAction(tr("Copy seed: ")+seed, this, &MapView::copySeed, QKeySequence::Copy);
VarPos vp = getActivePos();
if (vp.type != -1)
{ // structure has a known size / location
@ -375,14 +370,34 @@ void MapView::showContextMenu(const QPoint &pos)
midy = 63;
}
}
QString tps = QString::asprintf("/tp @p %d %d %d", midx, midy, midz);
menu.addAction(tr("Copy tp: ")+tps, [=](){ this->copyText(tps); });
cpy_dat.push_back({ tr("Copy tp:"), QString::asprintf("/tp @p %d %d %d", midx, midy, midz) });
}
menu.addAction(tr("Copy tp: ")+tp, [=](){ this->copyText(tp); });
menu.addAction(tr("Copy block: ")+coords, [=](){ this->copyText(coords); });
menu.addAction(tr("Copy chunk: ")+chunk, [=](){ this->copyText(chunk); });
menu.addAction(tr("Copy region: ")+region, [=](){ this->copyText(region); });
// menu.addAction(tr("Animation"), this, &MapView::runAni);
cpy_dat.push_back({ tr("Copy tp:"), QString::asprintf("/tp @p %d ~ %d", vp.p.x, vp.p.z) });
cpy_dat.push_back({ tr("Copy coords:"), QString::asprintf("%d %d", vp.p.x, vp.p.z) });
cpy_dat.push_back({ tr("Copy chunk:"), QString::asprintf("%d %d", vp.p.x >> 4, vp.p.z >> 4) });
cpy_dat.push_back({ tr("Copy region:"), QString::asprintf("%d %d", vp.p.x >> 9, vp.p.z >> 9) });
int pad = 0;
for (auto& it : cpy_dat)
{
if (it.txt.length() > pad)
pad = it.txt.length();
}
pad += 1;
menu.addAction(tr("Go to coordinates..."), this, &MapView::onGoto, QKeySequence(Qt::CTRL + Qt::Key_G));
if (world)
{
QString txt = tr("Copy seed:").leftJustified(pad) + QString::asprintf("%" PRId64, (int64_t)world->wi.seed);
menu.addAction(txt, this, &MapView::copySeed, QKeySequence::Copy);
}
for (auto& it : cpy_dat)
{
QString txt = it.txt.leftJustified(pad) + it.cpy;
menu.addAction(txt, [=](){ this->copyText(it.cpy); });
}
//menu.addAction(tr("Animation"), this, &MapView::runAni);
menu.exec(mapToGlobal(pos));
}

View File

@ -1849,7 +1849,7 @@ L_noise_biome:
int ymax = cond->limok[NP_DEPTH][1];
float y;
mapApproxHeight(&y, nullptr, &env->g, &env->sn, rx1, rz1, 1, 1);
if (cond->flags & Condition::FLG_INRANGE)
if (cond->flags & Condition::FLG_IN_RANGE)
valid = y >= ymin && y <= ymax;
else
valid = y <= ymin || y >= ymax;

View File

@ -134,44 +134,46 @@ static const struct FilterList
"",
""
};
#define _(S) QT_TRANSLATE_NOOP("Filter", S)
list[F_LOGIC_OR] = FilterInfo{
CAT_HELPER, 0, 0, 0, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/helper.png",
_("OR logic gate"),
_("Evaluates as true when any of the conditions that reference it "
QT_TRANSLATE_NOOP("Filter", "OR logic gate"),
QT_TRANSLATE_NOOP("Filter",
"Evaluates as true when any of the conditions that reference it "
"(by relative location) are met. When no referencing conditions are "
"defined, it defaults to true.")
};
list[F_LOGIC_NOT] = FilterInfo{
CAT_HELPER, 0, 0, 0, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/helper.png",
_("NOT logic gate"),
_("Evaluates as true when none of the conditions that reference it "
QT_TRANSLATE_NOOP("Filter", "NOT logic gate"),
QT_TRANSLATE_NOOP("Filter",
"Evaluates as true when none of the conditions that reference it "
"(by relative location) are met. When no referencing conditions are "
"defined, it defaults to true.")
};
list[F_LUA] = FilterInfo{
CAT_HELPER, 0, 0, 0, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/helper.png",
_("Lua"),
_("Define custom conditions using Lua scripts.")
QT_TRANSLATE_NOOP("Filter", "Lua"),
QT_TRANSLATE_NOOP("Filter",
"Define custom conditions using Lua scripts.")
};
list[F_SCALE_TO_NETHER] = FilterInfo{
CAT_HELPER, 0, 0, 0, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/portal_lit.png",
_("Coordinate factor x/8"),
_("Divides relative location by 8, from Overworld to Nether.")
QT_TRANSLATE_NOOP("Filter", "Coordinate factor x/8"),
QT_TRANSLATE_NOOP("Filter",
"Divides relative location by 8, from Overworld to Nether.")
};
list[F_SCALE_TO_OVERWORLD] = FilterInfo{
CAT_HELPER, 0, 0, 0, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/portal_lit.png",
_("Coordinate factor x*8"),
_("Multiplies relative location by 8, from Nether to Overworld.")
QT_TRANSLATE_NOOP("Filter", "Coordinate factor x*8"),
QT_TRANSLATE_NOOP("Filter",
"Multiplies relative location by 8, from Nether to Overworld.")
};
const char *spiral_desc = _(
const char *spiral_desc = QT_TRANSLATE_NOOP("Filter",
"<html><head/><body>"
"Spiral iterator conditions can be used to move a testing position across "
"a given area using a certain step size. Other conditions that refer to it "
@ -182,59 +184,61 @@ static const struct FilterList
list[F_SPIRAL_1] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 1, 0, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:1"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:1"),
spiral_desc
};
list[F_SPIRAL_4] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 4, 2, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:4"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:4"),
spiral_desc
};
list[F_SPIRAL_16] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 16, 4, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:16"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:16"),
spiral_desc
};
list[F_SPIRAL_64] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 64, 6, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:64"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:64"),
spiral_desc
};
list[F_SPIRAL_256] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 256, 8, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:256"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:256"),
spiral_desc
};
list[F_SPIRAL_512] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 512, 9, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:512"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:512"),
spiral_desc
};
list[F_SPIRAL_1024] = FilterInfo{
CAT_HELPER, 0, 1, 1, 0, 0, 0, 1024, 10, 0, MC_UNDEF, MC_NEWEST, DIM_UNDEF, 0, disp++,
":icons/reference.png",
_("Spiral iterator 1:1024"),
QT_TRANSLATE_NOOP("Filter", "Spiral iterator 1:1024"),
spiral_desc
};
list[F_QH_IDEAL] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Swamp_Hut, 512, 9, 0, MC_1_4, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-hut (ideal)"),
_("The lower 48-bits provide potential for four swamp huts in "
QT_TRANSLATE_NOOP("Filter", "Quad-hut (ideal)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for four swamp huts in "
"spawning range, in one of the best configurations that exist.")
};
list[F_QH_CLASSIC] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Swamp_Hut, 512, 9, 0, MC_1_4, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-hut (classic)"),
_("The lower 48-bits provide potential for four swamp huts in "
QT_TRANSLATE_NOOP("Filter", "Quad-hut (classic)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for four swamp huts in "
"spawning range, in one of the \"classic\" configurations. "
"(Checks for huts in the nearest 2x2 chunk corners of each "
"region.)")
@ -243,8 +247,9 @@ static const struct FilterList
list[F_QH_NORMAL] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Swamp_Hut, 512, 9, 0, MC_1_4, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-hut (normal)"),
_("The lower 48-bits provide potential for four swamp huts in "
QT_TRANSLATE_NOOP("Filter", "Quad-hut (normal)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for four swamp huts in "
"spawning range, such that all of them are within 128 blocks "
"of a single AFK location, including a vertical tollerance "
"for a fall damage chute.")
@ -253,8 +258,9 @@ static const struct FilterList
list[F_QH_BARELY] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Swamp_Hut, 512, 9, 0, MC_1_4, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-hut (barely)"),
_("The lower 48-bits provide potential for four swamp huts in "
QT_TRANSLATE_NOOP("Filter", "Quad-hut (barely)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for four swamp huts in "
"spawning range, in any configuration, such that the bounding "
"boxes are within 128 blocks of a single AFK location.")
};
@ -262,8 +268,9 @@ static const struct FilterList
list[F_QM_95] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Monument, 512, 9, 0, MC_1_8, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-ocean-monument (>95%)"),
_("The lower 48-bits provide potential for 95% of the area of "
QT_TRANSLATE_NOOP("Filter", "Quad-ocean-monument (>95%)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for 95% of the area of "
"four ocean monuments to be within 128 blocks of an AFK "
"location.")
};
@ -271,8 +278,9 @@ static const struct FilterList
list[F_QM_90] = FilterInfo{
CAT_QUAD, 0, 1, 1, 0, 0, Monument, 512, 9, 0, MC_1_8, MC_NEWEST, 0, 0, disp++,
":icons/quad.png",
_("Quad-ocean-monument (>90%)"),
_("The lower 48-bits provide potential for 90% of the area of "
QT_TRANSLATE_NOOP("Filter", "Quad-ocean-monument (>90%)"),
QT_TRANSLATE_NOOP("Filter",
"The lower 48-bits provide potential for 90% of the area of "
"four ocean monuments to be within 128 blocks of an AFK "
"location.")
};
@ -280,45 +288,51 @@ static const struct FilterList
list[F_BIOME] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, L_VORONOI_1, 0, 1, 0, 0, MC_B1_7, MC_1_17, 0, 1, disp++, // disable for 1.18
":icons/map.png",
_("Biomes 1:1"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:1"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-).")
};
list[F_BIOME_4] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 4, 2, 0, MC_B1_7, MC_NEWEST, 0, 1, disp++,
":icons/map.png",
_("Biomes 1:4"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:4"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-).")
};
list[F_BIOME_16] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 16, 4, 0, MC_B1_7, MC_NEWEST, 0, 1, disp++,
":icons/map.png",
_("Biomes 1:16"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:16"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-).")
};
list[F_BIOME_64] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 64, 6, 0, MC_B1_7, MC_NEWEST, 0, 1, disp++,
":icons/map.png",
_("Biomes 1:64"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:64"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-).")
};
list[F_BIOME_256] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 256, 8, 0, MC_B1_7, MC_NEWEST, 0, 1, disp++,
":icons/map.png",
_("Biomes 1:256"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:256"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-).")
};
list[F_BIOME_4_RIVER] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, L_RIVER_MIX_4, 0, 4, 2, 0, MC_1_13, MC_1_17, 0, 0, disp++,
":icons/map.png",
_("Biomes 1:4 RIVER"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:4 RIVER"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-) "
"at layer RIVER with scale 1:4. "
"This layer does not generate ocean variants.")
@ -326,8 +340,9 @@ static const struct FilterList
list[F_BIOME_256_OTEMP] = FilterInfo{
CAT_BIOMES, 0, 1, 1, 0, L_OCEAN_TEMP_256, 0, 256, 8, 0, MC_1_13, MC_1_17, 0, 0, disp++,
":icons/map.png",
_("Biomes 1:256 O.TEMP"),
_("Allows only seeds with the included (+) biomes in the specified area and "
QT_TRANSLATE_NOOP("Filter", "Biomes 1:256 O.TEMP"),
QT_TRANSLATE_NOOP("Filter",
"Allows only seeds with the included (+) biomes in the specified area and "
"discard those that have biomes that are explicitly excluded (-) "
"at layer OCEAN TEMPERATURE with scale 1:256. "
"This generation layer depends only on the lower 48-bits of the seed.")
@ -335,204 +350,224 @@ static const struct FilterList
list[F_CLIMATE_NOISE] = FilterInfo{
CAT_BIOMES, 0, 1, 1, 0, 0, 0, 4, 2, 0, MC_1_18, MC_NEWEST, 0, 0, disp++,
":icons/map.png",
_("Climate parameters 1:4"),
_("Custom limits for the required and allowed climate noise parameters that "
QT_TRANSLATE_NOOP("Filter", "Climate parameters 1:4"),
QT_TRANSLATE_NOOP("Filter",
"Custom limits for the required and allowed climate noise parameters that "
"the specified area should cover.")
};
list[F_CLIMATE_MINMAX] = FilterInfo{
CAT_BIOMES, 0, 1, 1, 0, 0, 0, 4, 2, 0, MC_1_18, MC_NEWEST, 0, 0, disp++,
":icons/map.png",
_("Locate climate extreme 1:4"),
_("Finds the location where a climate parameter reaches its minimum or maximum.")
QT_TRANSLATE_NOOP("Filter", "Locate climate extreme 1:4"),
QT_TRANSLATE_NOOP("Filter",
"Finds the location where a climate parameter reaches its minimum or maximum.")
};
list[F_BIOME_CENTER] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 4, 2, 1, MC_B1_7, MC_NEWEST, 0, 1, disp++,
":icons/map.png",
_("Locate biome center 1:4"),
_("Finds the center position of a given biome.")
QT_TRANSLATE_NOOP("Filter", "Locate biome center 1:4"),
QT_TRANSLATE_NOOP("Filter",
"Finds the center position of a given biome.")
};
list[F_BIOME_CENTER_256] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 256, 8, 1, MC_B1_7, MC_1_17, 0, 1, disp++,
":icons/map.png",
_("Locate biome center 1:256"),
_("Finds the center position of a given biome. Based on the 1:256 biome layer.")
QT_TRANSLATE_NOOP("Filter", "Locate biome center 1:256"),
QT_TRANSLATE_NOOP("Filter",
"Finds the center position of a given biome. Based on the 1:256 biome layer.")
};
list[F_TEMPS] = FilterInfo{
CAT_BIOMES, 1, 1, 1, 0, 0, 0, 1024, 10, 0, MC_1_7, MC_1_17, 0, 0, disp++,
":icons/tempcat.png",
_("Temperature categories"),
_("Checks that the area has a minimum of all the required temperature categories.")
QT_TRANSLATE_NOOP("Filter", "Temperature categories"),
QT_TRANSLATE_NOOP("Filter",
"Checks that the area has a minimum of all the required temperature categories.")
};
list[F_BIOME_NETHER_1] = FilterInfo{
CAT_NETHER, 1, 1, 1, 0, 0, 0, 1, 0, 0, MC_1_16_1, 0, -1, 1, disp++, // disabled
":icons/nether.png",
_("Nether biomes 1:1 (disabled)"),
_("Nether biomes after voronoi scaling to 1:1.")
QT_TRANSLATE_NOOP("Filter", "Nether biomes 1:1 (disabled)"),
QT_TRANSLATE_NOOP("Filter",
"Nether biomes after voronoi scaling to 1:1.")
};
list[F_BIOME_NETHER_4] = FilterInfo{
CAT_NETHER, 0, 1, 1, 0, 0, 0, 4, 2, 0, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/nether.png",
_("Nether biomes 1:4"),
_("Nether biomes with normal noise sampling at scale 1:4.")
QT_TRANSLATE_NOOP("Filter", "Nether biomes 1:4"),
QT_TRANSLATE_NOOP("Filter",
"Nether biomes with normal noise sampling at scale 1:4.")
};
list[F_BIOME_NETHER_16] = FilterInfo{
CAT_NETHER, 0, 1, 1, 0, 0, 0, 16, 4, 0, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/nether.png",
_("Nether biomes 1:16"),
_("Nether biomes, but only sampled at scale 1:16.")
QT_TRANSLATE_NOOP("Filter", "Nether biomes 1:16"),
QT_TRANSLATE_NOOP("Filter",
"Nether biomes, but only sampled at scale 1:16.")
};
list[F_BIOME_NETHER_64] = FilterInfo{
CAT_NETHER, 0, 1, 1, 0, 0, 0, 64, 6, 0, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/nether.png",
_("Nether biomes 1:64"),
_("Nether biomes, but only sampled at scale 1:64.")
QT_TRANSLATE_NOOP("Filter", "Nether biomes 1:64"),
QT_TRANSLATE_NOOP("Filter",
"Nether biomes, but only sampled at scale 1:64.")
};
list[F_BIOME_NETHER_256] = FilterInfo{
CAT_NETHER, 0, 1, 1, 0, 0, 0, 256, 8, 0, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/nether.png",
_("Nether biomes 1:256"),
_("Nether biomes, but only sampled at scale 1:256.")
QT_TRANSLATE_NOOP("Filter", "Nether biomes 1:256"),
QT_TRANSLATE_NOOP("Filter",
"Nether biomes, but only sampled at scale 1:256.")
};
list[F_BIOME_END_1] = FilterInfo{
CAT_END, 1, 1, 1, 0, 0, 0, 1, 0, 0, MC_1_9, 0, +1, 1, disp++, // disabled
":icons/the_end.png",
_("End biomes 1:1 (disabled)"),
_("End biomes after voronoi scaling to 1:1.")
QT_TRANSLATE_NOOP("Filter", "End biomes 1:1 (disabled)"),
QT_TRANSLATE_NOOP("Filter",
"End biomes after voronoi scaling to 1:1.")
};
list[F_BIOME_END_4] = FilterInfo{
CAT_END, 0, 1, 1, 0, 0, 0, 4, 2, 0, MC_1_9, MC_NEWEST, +1, 0, disp++,
":icons/the_end.png",
_("End biomes 1:4"),
_("End biomes sampled at scale 1:4. Note this is just a simple upscale of 1:16.")
QT_TRANSLATE_NOOP("Filter", "End biomes 1:4"),
QT_TRANSLATE_NOOP("Filter",
"End biomes sampled at scale 1:4. Note this is just a simple upscale of 1:16.")
};
list[F_BIOME_END_16] = FilterInfo{
CAT_END, 0, 1, 1, 0, 0, 0, 16, 4, 0, MC_1_9, MC_NEWEST, +1, 0, disp++,
":icons/the_end.png",
_("End biomes 1:16"),
_("End biomes with normal sampling at scale 1:16. ")
QT_TRANSLATE_NOOP("Filter", "End biomes 1:16"),
QT_TRANSLATE_NOOP("Filter",
"End biomes with normal sampling at scale 1:16. ")
};
list[F_BIOME_END_64] = FilterInfo{
CAT_END, 0, 1, 1, 0, 0, 0, 64, 6, 0, MC_1_9, MC_NEWEST, +1, 0, disp++,
":icons/the_end.png",
_("End biomes 1:64"),
_("End biomes with lossy sampling at scale 1:64. ")
QT_TRANSLATE_NOOP("Filter", "End biomes 1:64"),
QT_TRANSLATE_NOOP("Filter",
"End biomes with lossy sampling at scale 1:64. ")
};
list[F_SPAWN] = FilterInfo{
CAT_OTHER, 1, 1, 1, 1, 0, 0, 1, 0, 0, MC_B1_8, MC_NEWEST, 0, 0, disp++,
":icons/spawn.png",
_("Spawn"),
QT_TRANSLATE_NOOP("Filter", "Spawn"),
""
};
list[F_SLIME] = FilterInfo{
CAT_OTHER, 0, 1, 1, 0, 0, 0, 16, 4, 1, MC_UNDEF, MC_NEWEST, 0, 0, disp++,
":icons/slime.png",
_("Slime chunk"),
QT_TRANSLATE_NOOP("Filter", "Slime chunk"),
""
};
list[F_HEIGHT] = FilterInfo{
CAT_OTHER, 0, 1, 0, 0, 0, 0, 4, 2, 0, MC_1_1, MC_NEWEST, 0, 0, disp++,
":icons/height.png",
_("Surface height"),
_("Check the approximate surface height at scale 1:4 at a single coordinate.")
QT_TRANSLATE_NOOP("Filter", "Surface height"),
QT_TRANSLATE_NOOP("Filter",
"Check the approximate surface height at scale 1:4 at a single coordinate.")
};
list[F_FIRST_STRONGHOLD] = FilterInfo{
CAT_OTHER, 0, 1, 1, 1, 0, 0, 1, 0, 0, MC_B1_8, MC_NEWEST, 0, 0, disp++,
":icons/stronghold.png",
_("First stronghold"),
_("Finds the approxmiate location of the first stronghold "
QT_TRANSLATE_NOOP("Filter", "First stronghold"),
QT_TRANSLATE_NOOP("Filter",
"Finds the approxmiate location of the first stronghold "
"(+/-112 blocks). Depends only on the 48-bit seed.")
};
list[F_STRONGHOLD] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, 0, 1, 0, 1, MC_B1_8, MC_NEWEST, 0, 0, disp++,
":icons/stronghold.png",
_("Stronghold"),
QT_TRANSLATE_NOOP("Filter", "Stronghold"),
""
};
list[F_VILLAGE] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Village, 1, 0, 1, MC_B1_8, MC_NEWEST, 0, 0, disp++,
":icons/village.png",
_("Village"),
QT_TRANSLATE_NOOP("Filter", "Village"),
""
};
list[F_MINESHAFT] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 0, 0, Mineshaft, 1, 0, 1, MC_B1_8, MC_NEWEST, 0, 0, disp++,
":icons/mineshaft.png",
_("Abandoned mineshaft"),
QT_TRANSLATE_NOOP("Filter", "Abandoned mineshaft"),
""
};
list[F_DESERT] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Desert_Pyramid, 1, 0, 1, MC_1_3, MC_NEWEST, 0, 0, disp++,
":icons/desert.png",
_("Desert pyramid"),
_("In version 1.18+, desert pyramids depend on surface height and may fail to "
QT_TRANSLATE_NOOP("Filter", "Desert pyramid"),
QT_TRANSLATE_NOOP("Filter",
"In version 1.18+, desert pyramids depend on surface height and may fail to "
"generate near caves/aquifers, rivers and oceans.")
};
list[F_JUNGLE] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Jungle_Temple, 1, 0, 1, MC_1_3, MC_NEWEST, 0, 0, disp++,
":icons/jungle.png",
_("Jungle temple"),
_("In version 1.18+, jungle temples depend on surface height and may fail to "
QT_TRANSLATE_NOOP("Filter", "Jungle temple"),
QT_TRANSLATE_NOOP("Filter",
"In version 1.18+, jungle temples depend on surface height and may fail to "
"generate near caves/aquifers, rivers and oceans.")
};
list[F_HUT] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Swamp_Hut, 1, 0, 1, MC_1_4, MC_NEWEST, 0, 0, disp++,
":icons/hut.png",
_("Swamp hut"),
QT_TRANSLATE_NOOP("Filter", "Swamp hut"),
""
};
list[F_MONUMENT] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Monument, 1, 0, 1, MC_1_8, MC_NEWEST, 0, 0, disp++,
":icons/monument.png",
_("Ocean monument"),
QT_TRANSLATE_NOOP("Filter", "Ocean monument"),
""
};
list[F_IGLOO] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Igloo, 1, 0, 1, MC_1_9, MC_NEWEST, 0, 0, disp++,
":icons/igloo.png",
_("Igloo"),
QT_TRANSLATE_NOOP("Filter", "Igloo"),
""
};
list[F_MANSION] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Mansion, 1, 0, 1, MC_1_11, MC_NEWEST, 0, 0, disp++,
":icons/mansion.png",
_("Woodland mansion"),
_("In version 1.18+, mansions depend on surface height and may fail to "
QT_TRANSLATE_NOOP("Filter", "Woodland mansion"),
QT_TRANSLATE_NOOP("Filter",
"In version 1.18+, mansions depend on surface height and may fail to "
"generate near caves/aquifers, rivers and oceans.")
};
list[F_RUINS] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Ocean_Ruin, 1, 0, 1, MC_1_13, MC_NEWEST, 0, 0, disp++,
":icons/ruins.png",
_("Ocean ruins"),
QT_TRANSLATE_NOOP("Filter", "Ocean ruins"),
""
};
list[F_SHIPWRECK] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Shipwreck, 1, 0, 1, MC_1_13, MC_NEWEST, 0, 0, disp++,
":icons/shipwreck.png",
_("Shipwreck"),
QT_TRANSLATE_NOOP("Filter", "Shipwreck"),
""
};
list[F_TREASURE] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Treasure, 1, 0, 1, MC_1_13, MC_NEWEST, 0, 0, disp++,
":icons/treasure.png",
_("Buried treasure"),
_("Buried treasures are always positioned near the center of a chunk "
QT_TRANSLATE_NOOP("Filter", "Buried treasure"),
QT_TRANSLATE_NOOP("Filter",
"Buried treasures are always positioned near the center of a chunk "
"rather than a chunk boarder. Make sure the testing area is set "
"accordingly.")
};
@ -540,76 +575,74 @@ static const struct FilterList
list[F_WELL] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Desert_Well, 1, 0, 1, MC_1_13, MC_NEWEST, 0, 0, disp++,
":icons/well.png",
_("Desert well"),
QT_TRANSLATE_NOOP("Filter", "Desert well"),
""
};
list[F_OUTPOST] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Outpost, 1, 0, 1, MC_1_14, MC_NEWEST, 0, 0, disp++,
":icons/outpost.png",
_("Pillager outpost"),
QT_TRANSLATE_NOOP("Filter", "Pillager outpost"),
""
};
list[F_ANCIENT_CITY] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Ancient_City, 1, 0, 1, MC_1_19, MC_NEWEST, 0, 0, disp++,
":icons/ancient_city.png",
_("Ancient city"),
QT_TRANSLATE_NOOP("Filter", "Ancient city"),
""
};
list[F_TRAILS] = FilterInfo{
CAT_STRUCT, 1, 1, 1, 1, 0, Trail_Ruin, 1, 0, 1, MC_1_20, MC_NEWEST, 0, 0, disp++,
":icons/trail.png",
_("Trail ruins"),
QT_TRANSLATE_NOOP("Filter", "Trail ruins"),
""
};
list[F_PORTAL] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, Ruined_Portal, 1, 0, 1, MC_1_16_1, MC_NEWEST, 0, 0, disp++,
":icons/portal.png",
_("Ruined portal (overworld)"),
QT_TRANSLATE_NOOP("Filter", "Ruined portal (overworld)"),
""
};
list[F_PORTALN] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, Ruined_Portal_N, 1, 0, 1, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/portal.png",
_("Ruined portal (nether)"),
QT_TRANSLATE_NOOP("Filter", "Ruined portal (nether)"),
""
};
list[F_FORTRESS] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, Fortress, 1, 0, 1, MC_1_0, MC_NEWEST, -1, 0, disp++,
":icons/fortress.png",
_("Nether fortress"),
QT_TRANSLATE_NOOP("Filter", "Nether fortress"),
""
};
list[F_BASTION] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, Bastion, 1, 0, 1, MC_1_16_1, MC_NEWEST, -1, 0, disp++,
":icons/bastion.png",
_("Bastion remnant"),
QT_TRANSLATE_NOOP("Filter", "Bastion remnant"),
""
};
list[F_ENDCITY] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, End_City, 1, 0, 1, MC_1_9, MC_NEWEST, +1, 0, disp++,
":icons/endcity.png",
_("End city"),
QT_TRANSLATE_NOOP("Filter", "End city"),
""
};
list[F_GATEWAY] = FilterInfo{
CAT_STRUCT, 0, 1, 1, 1, 0, End_Gateway, 1, 0, 1, MC_1_13, MC_NEWEST, +1, 0, disp++,
":icons/gateway.png",
_("End gateway"),
_("Checks only scattered return gateways. Does not include those generated "
QT_TRANSLATE_NOOP("Filter", "End gateway"),
QT_TRANSLATE_NOOP("Filter",
"Checks only scattered return gateways. Does not include those generated "
"when defeating the dragon.")
};
#undef _ // translation macro
}
}
g_filterinfo;
@ -632,7 +665,7 @@ struct /*__attribute__((packed))*/ Condition
enum { // condition flags
FLG_APPROX = 0x0001,
FLG_MATCH_ANY = 0x0010,
FLG_INRANGE = 0x0020,
FLG_IN_RANGE = 0x0020,
};
enum { // variant flags
VAR_WITH_START = 0x01, // restrict start piece index and biome