1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-21 12:06:49 +02:00

Merge pull request #3546 from IvanSavenko/fix_freeze_on_start

Fix freeze on map start
This commit is contained in:
Ivan Savenko 2024-01-23 15:07:20 +02:00 committed by GitHub
commit 46c4f39eb8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 161 additions and 154 deletions

View File

@ -1,3 +1,22 @@
# 1.4.4 -> 1.4.5
### Stability
* Fixed crash on creature spellcasting
* Fixed crash on unit entering magical obstacles such as quicksands
* Fixed freeze on map loading on some systems
### Random Maps Generator
* Fixed placement of guards sometimes resulting into open connection into third zone
* Fixed rare crash on multithreaded access during placement of artifacts or wandering monsters
### Map Editor
* Fixed inspector using wrong editor for some values
# 1.4.3 -> 1.4.4
### General
* Fixed crash on generation of random maps
# 1.4.2 -> 1.4.3 # 1.4.2 -> 1.4.3
### General ### General

View File

@ -10,8 +10,8 @@ android {
applicationId "is.xyz.vcmi" applicationId "is.xyz.vcmi"
minSdk 19 minSdk 19
targetSdk 33 targetSdk 33
versionCode 1441 versionCode 1450
versionName "1.4.4" versionName "1.4.5"
setProperty("archivesBaseName", "vcmi") setProperty("archivesBaseName", "vcmi")
} }

View File

@ -21,10 +21,6 @@
#include <SDL_events.h> #include <SDL_events.h>
#ifdef VCMI_APPLE
# include <dispatch/dispatch.h>
#endif
void InputSourceText::handleEventTextInput(const SDL_TextInputEvent & text) void InputSourceText::handleEventTextInput(const SDL_TextInputEvent & text)
{ {
GH.events().dispatchTextInput(text.text); GH.events().dispatchTextInput(text.text);
@ -37,11 +33,8 @@ void InputSourceText::handleEventTextEditing(const SDL_TextEditingEvent & text)
void InputSourceText::startTextInput(const Rect & whereInput) void InputSourceText::startTextInput(const Rect & whereInput)
{ {
GH.dispatchMainThread([whereInput]()
#ifdef VCMI_APPLE {
dispatch_async(dispatch_get_main_queue(), ^{
#endif
Rect rectInScreenCoordinates = GH.screenHandler().convertLogicalPointsToWindow(whereInput); Rect rectInScreenCoordinates = GH.screenHandler().convertLogicalPointsToWindow(whereInput);
SDL_Rect textInputRect = CSDL_Ext::toSDL(rectInScreenCoordinates); SDL_Rect textInputRect = CSDL_Ext::toSDL(rectInScreenCoordinates);
@ -51,24 +44,16 @@ void InputSourceText::startTextInput(const Rect & whereInput)
{ {
SDL_StartTextInput(); SDL_StartTextInput();
} }
#ifdef VCMI_APPLE
}); });
#endif
} }
void InputSourceText::stopTextInput() void InputSourceText::stopTextInput()
{ {
#ifdef VCMI_APPLE GH.dispatchMainThread([]()
dispatch_async(dispatch_get_main_queue(), ^{ {
#endif
if (SDL_IsTextInputActive() == SDL_TRUE) if (SDL_IsTextInputActive() == SDL_TRUE)
{ {
SDL_StopTextInput(); SDL_StopTextInput();
} }
#ifdef VCMI_APPLE
}); });
#endif
} }

View File

@ -553,8 +553,7 @@ Point CGStatusBar::getBorderSize()
CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB, bool giveFocusToInput) CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB, bool giveFocusToInput)
: CLabel(Pos.x, Pos.y, font, ETextAlignment::CENTER), : CLabel(Pos.x, Pos.y, font, ETextAlignment::CENTER),
cb(CB), cb(CB)
CFocusable(std::make_shared<CKeyboardFocusListener>(this))
{ {
setRedrawParent(true); setRedrawParent(true);
pos.h = Pos.h; pos.h = Pos.h;
@ -570,7 +569,7 @@ CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(c
} }
CTextInput::CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath & bgName, const CFunctionList<void(const std::string &)> & CB) CTextInput::CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath & bgName, const CFunctionList<void(const std::string &)> & CB)
:cb(CB), CFocusable(std::make_shared<CKeyboardFocusListener>(this)) :cb(CB)
{ {
pos += Pos.topLeft(); pos += Pos.topLeft();
pos.h = Pos.h; pos.h = Pos.h;
@ -587,7 +586,6 @@ CTextInput::CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath
} }
CTextInput::CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf) CTextInput::CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf)
:CFocusable(std::make_shared<CKeyboardFocusListener>(this))
{ {
pos += Pos.topLeft(); pos += Pos.topLeft();
OBJ_CONSTRUCTION; OBJ_CONSTRUCTION;
@ -603,20 +601,15 @@ CTextInput::CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf)
#endif #endif
} }
std::atomic<int> CKeyboardFocusListener::usageIndex(0); std::atomic<int> CFocusable::usageIndex(0);
CKeyboardFocusListener::CKeyboardFocusListener(CTextInput * textInput) void CFocusable::focusGot()
:textInput(textInput)
{ {
} GH.startTextInput(pos);
void CKeyboardFocusListener::focusGot()
{
GH.startTextInput(textInput->pos);
usageIndex++; usageIndex++;
} }
void CKeyboardFocusListener::focusLost() void CFocusable::focusLost()
{ {
if(0 == --usageIndex) if(0 == --usageIndex)
{ {
@ -769,12 +762,6 @@ void CTextInput::numberFilter(std::string & text, const std::string & oldText, i
} }
CFocusable::CFocusable() CFocusable::CFocusable()
:CFocusable(std::make_shared<IFocusListener>())
{
}
CFocusable::CFocusable(std::shared_ptr<IFocusListener> focusListener)
: focusListener(focusListener)
{ {
focus = false; focus = false;
focusables.push_back(this); focusables.push_back(this);
@ -785,7 +772,7 @@ CFocusable::~CFocusable()
if(hasFocus()) if(hasFocus())
{ {
inputWithFocus = nullptr; inputWithFocus = nullptr;
focusListener->focusLost(); focusLost();
} }
focusables -= this; focusables -= this;
@ -799,13 +786,13 @@ bool CFocusable::hasFocus() const
void CFocusable::giveFocus() void CFocusable::giveFocus()
{ {
focus = true; focus = true;
focusListener->focusGot(); focusGot();
redraw(); redraw();
if(inputWithFocus) if(inputWithFocus)
{ {
inputWithFocus->focus = false; inputWithFocus->focus = false;
inputWithFocus->focusListener->focusLost(); inputWithFocus->focusLost();
inputWithFocus->redraw(); inputWithFocus->redraw();
} }
@ -837,7 +824,7 @@ void CFocusable::removeFocus()
if(this == inputWithFocus) if(this == inputWithFocus)
{ {
focus = false; focus = false;
focusListener->focusLost(); focusLost();
redraw(); redraw();
inputWithFocus = nullptr; inputWithFocus = nullptr;

View File

@ -163,25 +163,12 @@ public:
void clear() override; void clear() override;
void setEnteringMode(bool on) override; void setEnteringMode(bool on) override;
void setEnteredText(const std::string & text) override; void setEnteredText(const std::string & text) override;
};
class CFocusable;
class IFocusListener
{
public:
virtual void focusGot() {};
virtual void focusLost() {};
virtual ~IFocusListener() = default;
}; };
/// UIElement which can get input focus /// UIElement which can get input focus
class CFocusable : public virtual CIntObject class CFocusable : public virtual CIntObject
{ {
private: static std::atomic<int> usageIndex;
std::shared_ptr<IFocusListener> focusListener;
public: public:
bool focus; //only one focusable control can have focus at one moment bool focus; //only one focusable control can have focus at one moment
@ -190,27 +177,16 @@ public:
void removeFocus(); //remove focus void removeFocus(); //remove focus
bool hasFocus() const; bool hasFocus() const;
void focusGot();
void focusLost();
static std::list<CFocusable *> focusables; //all existing objs static std::list<CFocusable *> focusables; //all existing objs
static CFocusable * inputWithFocus; //who has focus now static CFocusable * inputWithFocus; //who has focus now
CFocusable(); CFocusable();
CFocusable(std::shared_ptr<IFocusListener> focusListener);
~CFocusable(); ~CFocusable();
}; };
class CTextInput;
class CKeyboardFocusListener : public IFocusListener
{
private:
static std::atomic<int> usageIndex;
CTextInput * textInput;
public:
CKeyboardFocusListener(CTextInput * textInput);
void focusGot() override;
void focusLost() override;
};
/// Text input box where players can enter text /// Text input box where players can enter text
class CTextInput : public CLabel, public CFocusable class CTextInput : public CLabel, public CFocusable
{ {

View File

@ -1,6 +1,6 @@
set(VCMI_VERSION_MAJOR 1) set(VCMI_VERSION_MAJOR 1)
set(VCMI_VERSION_MINOR 4) set(VCMI_VERSION_MINOR 4)
set(VCMI_VERSION_PATCH 4) set(VCMI_VERSION_PATCH 5)
add_definitions( add_definitions(
-DVCMI_VERSION_MAJOR=${VCMI_VERSION_MAJOR} -DVCMI_VERSION_MAJOR=${VCMI_VERSION_MAJOR}
-DVCMI_VERSION_MINOR=${VCMI_VERSION_MINOR} -DVCMI_VERSION_MINOR=${VCMI_VERSION_MINOR}

6
debian/changelog vendored
View File

@ -1,3 +1,9 @@
vcmi (1.4.5) jammy; urgency=medium
* New upstream release
-- Ivan Savenko <saven.ivan@gmail.com> Tue, 23 Jan 2024 12:00:00 +0200
vcmi (1.4.4) jammy; urgency=medium vcmi (1.4.4) jammy; urgency=medium
* New upstream release * New upstream release

View File

@ -76,6 +76,7 @@
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases> <releases>
<release version="1.4.5" date="2024-01-23" type="stable"/>
<release version="1.4.4" date="2024-01-20" type="stable"/> <release version="1.4.4" date="2024-01-20" type="stable"/>
<release version="1.4.3" date="2024-01-19" type="stable"/> <release version="1.4.3" date="2024-01-19" type="stable"/>
<release version="1.4.2" date="2023-12-25" type="stable"/> <release version="1.4.2" date="2023-12-25" type="stable"/>

View File

@ -38,6 +38,9 @@ bool CModEntry::isEnabled() const
if(!isInstalled()) if(!isInstalled())
return false; return false;
if (!isVisible())
return false;
return modSettings["active"].toBool(); return modSettings["active"].toBool();
} }

View File

@ -521,7 +521,7 @@ QStringList CModListView::findDependentMods(QString mod, bool excludeDisabled)
{ {
auto current = modModel->getMod(modName); auto current = modModel->getMod(modName);
if(!current.isInstalled()) if(!current.isInstalled() || !current.isVisible())
continue; continue;
if(current.getDependencies().contains(mod, Qt::CaseInsensitive)) if(current.getDependencies().contains(mod, Qt::CaseInsensitive))

View File

@ -6,84 +6,84 @@
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="22"/> <location filename="../aboutProject/aboutproject_moc.ui" line="22"/>
<source>VCMI on Discord</source> <source>VCMI on Discord</source>
<translation type="unfinished">VCMI en Discord</translation> <translation>VCMI en Discord</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="29"/> <location filename="../aboutProject/aboutproject_moc.ui" line="29"/>
<source>Have a question? Found a bug? Want to help? Join us!</source> <source>Have a question? Found a bug? Want to help? Join us!</source>
<translation type="unfinished">¿Tienes alguna pregunta? ¿Encontraste algún error? ¿Quieres ayudar? ¡Únete a nosotros!</translation> <translation>¿Tienes alguna pregunta? ¿Encontraste algún error? ¿Quieres ayudar? ¡Únete a nosotros!</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="36"/> <location filename="../aboutProject/aboutproject_moc.ui" line="36"/>
<source>VCMI on Github</source> <source>VCMI on Github</source>
<translation type="unfinished">VCMI en Github</translation> <translation>VCMI en Github</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="55"/> <location filename="../aboutProject/aboutproject_moc.ui" line="55"/>
<source>Our Community</source> <source>Our Community</source>
<translation type="unfinished"></translation> <translation>Nuestra comunidad</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="62"/> <location filename="../aboutProject/aboutproject_moc.ui" line="62"/>
<source>VCMI on Slack</source> <source>VCMI on Slack</source>
<translation type="unfinished">VCMI en Slack</translation> <translation>VCMI en Slack</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="98"/> <location filename="../aboutProject/aboutproject_moc.ui" line="98"/>
<source>Build Information</source> <source>Build Information</source>
<translation type="unfinished"></translation> <translation>Información de la versión</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="115"/> <location filename="../aboutProject/aboutproject_moc.ui" line="115"/>
<source>User data directory</source> <source>User data directory</source>
<translation type="unfinished">Directorio de datos del usuario</translation> <translation>Directorio de datos del usuario</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="122"/> <location filename="../aboutProject/aboutproject_moc.ui" line="122"/>
<location filename="../aboutProject/aboutproject_moc.ui" line="129"/> <location filename="../aboutProject/aboutproject_moc.ui" line="129"/>
<location filename="../aboutProject/aboutproject_moc.ui" line="193"/> <location filename="../aboutProject/aboutproject_moc.ui" line="193"/>
<source>Open</source> <source>Open</source>
<translation type="unfinished">Abrir</translation> <translation>Abrir</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="136"/> <location filename="../aboutProject/aboutproject_moc.ui" line="136"/>
<source>Check for updates</source> <source>Check for updates</source>
<translation type="unfinished"></translation> <translation>Comprobar actualizaciones</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="156"/> <location filename="../aboutProject/aboutproject_moc.ui" line="156"/>
<source>Game version</source> <source>Game version</source>
<translation type="unfinished"></translation> <translation>Versión del juego</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="163"/> <location filename="../aboutProject/aboutproject_moc.ui" line="163"/>
<source>Log files directory</source> <source>Log files directory</source>
<translation type="unfinished">Directorio de archivos de registro</translation> <translation>Directorio de archivos de registro</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="176"/> <location filename="../aboutProject/aboutproject_moc.ui" line="176"/>
<source>Data Directories</source> <source>Data Directories</source>
<translation type="unfinished">Directorios de datos</translation> <translation>Directorios de datos</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="213"/> <location filename="../aboutProject/aboutproject_moc.ui" line="213"/>
<source>Game data directory</source> <source>Game data directory</source>
<translation type="unfinished"></translation> <translation>Directorio de los datos del juego</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="220"/> <location filename="../aboutProject/aboutproject_moc.ui" line="220"/>
<source>Operating System</source> <source>Operating System</source>
<translation type="unfinished"></translation> <translation>Sistema operativo</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="273"/> <location filename="../aboutProject/aboutproject_moc.ui" line="273"/>
<source>Project homepage</source> <source>Project homepage</source>
<translation type="unfinished"></translation> <translation>Página web del proyecto</translation>
</message> </message>
<message> <message>
<location filename="../aboutProject/aboutproject_moc.ui" line="286"/> <location filename="../aboutProject/aboutproject_moc.ui" line="286"/>
<source>Report a bug</source> <source>Report a bug</source>
<translation type="unfinished"></translation> <translation>Informar de un error</translation>
</message> </message>
</context> </context>
<context> <context>
@ -121,7 +121,7 @@
<message> <message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/> <location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Maps</source> <source>Maps</source>
<translation type="unfinished"></translation> <translation>Mapas</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/> <location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
@ -180,7 +180,7 @@
<message> <message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/> <location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>Compatibility</source> <source>Compatibility</source>
<translation type="unfinished">Compatibilidad</translation> <translation>Compatibilidad</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="63"/> <location filename="../modManager/cmodlistmodel_moc.cpp" line="63"/>
@ -319,7 +319,7 @@
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="292"/> <location filename="../modManager/cmodlistview_moc.cpp" line="292"/>
<source>Size</source> <source>Size</source>
<translation type="unfinished"></translation> <translation>Tamaño</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="294"/> <location filename="../modManager/cmodlistview_moc.cpp" line="294"/>
@ -410,12 +410,12 @@
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="638"/> <location filename="../modManager/cmodlistview_moc.cpp" line="638"/>
<source>Downloading %s%. %p% (%v MB out of %m MB) finished</source> <source>Downloading %s%. %p% (%v MB out of %m MB) finished</source>
<translation type="unfinished"></translation> <translation>Descargando %s%. %p% (%v MB de %m MB) completado</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="665"/> <location filename="../modManager/cmodlistview_moc.cpp" line="665"/>
<source>Download failed</source> <source>Download failed</source>
<translation type="unfinished"></translation> <translation>Descarga fallida</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="666"/> <location filename="../modManager/cmodlistview_moc.cpp" line="666"/>
@ -424,30 +424,37 @@
Encountered errors: Encountered errors:
</source> </source>
<translation type="unfinished"></translation> <translation>No se han podido descargar todos los ficheros.
Errores encontrados:
</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="667"/> <location filename="../modManager/cmodlistview_moc.cpp" line="667"/>
<source> <source>
Install successfully downloaded?</source> Install successfully downloaded?</source>
<translation type="unfinished"></translation> <translation>
Instalar lo correctamente descargado?</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="812"/> <location filename="../modManager/cmodlistview_moc.cpp" line="812"/>
<source>Installing mod %1</source> <source>Installing mod %1</source>
<translation type="unfinished"></translation> <translation>Instalando mod %1</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="874"/> <location filename="../modManager/cmodlistview_moc.cpp" line="874"/>
<source>Operation failed</source> <source>Operation failed</source>
<translation type="unfinished"></translation> <translation>Operación fallida</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="875"/> <location filename="../modManager/cmodlistview_moc.cpp" line="875"/>
<source>Encountered errors: <source>Encountered errors:
</source> </source>
<translation type="unfinished"></translation> <translation>Errores encontrados:
</translation>
</message> </message>
<message> <message>
<location filename="../modManager/cmodlistview_moc.cpp" line="910"/> <location filename="../modManager/cmodlistview_moc.cpp" line="910"/>
@ -482,94 +489,94 @@ Install successfully downloaded?</source>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="230"/> <location filename="../settingsView/csettingsview_moc.ui" line="230"/>
<source>Interface Scaling</source> <source>Interface Scaling</source>
<translation type="unfinished"></translation> <translation>Escala de la interfaz</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="394"/> <location filename="../settingsView/csettingsview_moc.ui" line="394"/>
<source>Neutral AI in battles</source> <source>Neutral AI in battles</source>
<translation type="unfinished"></translation> <translation>IA neutral en batallas</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="169"/> <location filename="../settingsView/csettingsview_moc.ui" line="169"/>
<source>Enemy AI in battles</source> <source>Enemy AI in battles</source>
<translation type="unfinished"></translation> <translation>IA enemiga en batallas</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="176"/> <location filename="../settingsView/csettingsview_moc.ui" line="176"/>
<source>Additional repository</source> <source>Additional repository</source>
<translation type="unfinished"></translation> <translation>Repositorio adicional</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="210"/> <location filename="../settingsView/csettingsview_moc.ui" line="210"/>
<source>Adventure Map Allies</source> <source>Adventure Map Allies</source>
<translation type="unfinished"></translation> <translation>Aliados en el Mapa de aventuras</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="552"/> <location filename="../settingsView/csettingsview_moc.ui" line="552"/>
<source>Adventure Map Enemies</source> <source>Adventure Map Enemies</source>
<translation type="unfinished"></translation> <translation>Enemigos en el Mapa de aventuras</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="428"/> <location filename="../settingsView/csettingsview_moc.ui" line="428"/>
<source>Windowed</source> <source>Windowed</source>
<translation type="unfinished"></translation> <translation>Ventana</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="433"/> <location filename="../settingsView/csettingsview_moc.ui" line="433"/>
<source>Borderless fullscreen</source> <source>Borderless fullscreen</source>
<translation type="unfinished"></translation> <translation>Ventana completa sin bordes</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="438"/> <location filename="../settingsView/csettingsview_moc.ui" line="438"/>
<source>Exclusive fullscreen</source> <source>Exclusive fullscreen</source>
<translation type="unfinished"></translation> <translation>Pantalla completa</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="593"/> <location filename="../settingsView/csettingsview_moc.ui" line="593"/>
<source>Autosave limit (0 = off)</source> <source>Autosave limit (0 = off)</source>
<translation type="unfinished"></translation> <translation>Límite de autosaves (0 = sin límite)</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="401"/> <location filename="../settingsView/csettingsview_moc.ui" line="401"/>
<source>Friendly AI in battles</source> <source>Friendly AI in battles</source>
<translation type="unfinished"></translation> <translation>IA amistosa en batallas</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="370"/> <location filename="../settingsView/csettingsview_moc.ui" line="370"/>
<source>Framerate Limit</source> <source>Framerate Limit</source>
<translation type="unfinished"></translation> <translation>Límite de fotogramas</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="460"/> <location filename="../settingsView/csettingsview_moc.ui" line="460"/>
<source>Autosave prefix</source> <source>Autosave prefix</source>
<translation type="unfinished"></translation> <translation>Prefijo autoguardado</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="484"/> <location filename="../settingsView/csettingsview_moc.ui" line="484"/>
<source>empty = map name prefix</source> <source>empty = map name prefix</source>
<translation type="unfinished"></translation> <translation>Vacio = prefijo del mapa</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="607"/> <location filename="../settingsView/csettingsview_moc.ui" line="607"/>
<source>Refresh now</source> <source>Refresh now</source>
<translation type="unfinished"></translation> <translation>Actualizar</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="614"/> <location filename="../settingsView/csettingsview_moc.ui" line="614"/>
<source>Default repository</source> <source>Default repository</source>
<translation type="unfinished"></translation> <translation>Repositorio por defecto</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="624"/> <location filename="../settingsView/csettingsview_moc.ui" line="624"/>
<source>Renderer</source> <source>Renderer</source>
<translation type="unfinished"></translation> <translation>Render</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="246"/> <location filename="../settingsView/csettingsview_moc.ui" line="246"/>
<location filename="../settingsView/csettingsview_moc.ui" line="476"/> <location filename="../settingsView/csettingsview_moc.ui" line="476"/>
<location filename="../settingsView/csettingsview_moc.ui" line="544"/> <location filename="../settingsView/csettingsview_moc.ui" line="544"/>
<source>On</source> <source>On</source>
<translation>Encendido</translation> <translation>Activado</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="115"/> <location filename="../settingsView/csettingsview_moc.ui" line="115"/>
@ -584,7 +591,7 @@ Install successfully downloaded?</source>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="349"/> <location filename="../settingsView/csettingsview_moc.ui" line="349"/>
<source>Reserved screen area</source> <source>Reserved screen area</source>
<translation type="unfinished"></translation> <translation>Área de pantalla reservada</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="155"/> <location filename="../settingsView/csettingsview_moc.ui" line="155"/>
@ -614,7 +621,7 @@ Install successfully downloaded?</source>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="562"/> <location filename="../settingsView/csettingsview_moc.ui" line="562"/>
<source>VSync</source> <source>VSync</source>
<translation type="unfinished"></translation> <translation>Sincronización vertical</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="135"/> <location filename="../settingsView/csettingsview_moc.ui" line="135"/>
@ -640,7 +647,13 @@ Windowed - game will run inside a window that covers part of your screen
Borderless Windowed Mode - game will run in a window that covers entirely of your screen, using same resolution as your screen. Borderless Windowed Mode - game will run in a window that covers entirely of your screen, using same resolution as your screen.
Fullscreen Exclusive Mode - game will cover entirety of your screen and will use selected resolution.</source> Fullscreen Exclusive Mode - game will cover entirety of your screen and will use selected resolution.</source>
<translation type="unfinished"></translation> <translation>Selecciona el modo de visualización del juego
En ventana - el juego se ejecutará dentro de una ventana que forma parte de tu pantalla.
Ventana sin bordes - el juego se ejecutará en una ventana que cubre completamente tu pantalla, usando la misma resolución.
Pantalla completa - el juego cubrirá la totalidad de la pantalla y utilizará la resolución seleccionada.</translation>
</message> </message>
<message> <message>
<location filename="../settingsView/csettingsview_moc.ui" line="522"/> <location filename="../settingsView/csettingsview_moc.ui" line="522"/>
@ -698,27 +711,27 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
<message> <message>
<location filename="../lobby/chat_moc.ui" line="14"/> <location filename="../lobby/chat_moc.ui" line="14"/>
<source>Form</source> <source>Form</source>
<translation type="unfinished"></translation> <translation>Formulario</translation>
</message> </message>
<message> <message>
<location filename="../lobby/chat_moc.ui" line="40"/> <location filename="../lobby/chat_moc.ui" line="40"/>
<source>Users in lobby</source> <source>Users in lobby</source>
<translation type="unfinished"></translation> <translation>Usuarios en la sala</translation>
</message> </message>
<message> <message>
<location filename="../lobby/chat_moc.ui" line="50"/> <location filename="../lobby/chat_moc.ui" line="50"/>
<source>Global chat</source> <source>Global chat</source>
<translation type="unfinished"></translation> <translation>Chat general</translation>
</message> </message>
<message> <message>
<location filename="../lobby/chat_moc.ui" line="104"/> <location filename="../lobby/chat_moc.ui" line="104"/>
<source>type you message</source> <source>type you message</source>
<translation type="unfinished"></translation> <translation>Escribe tu mensaje</translation>
</message> </message>
<message> <message>
<location filename="../lobby/chat_moc.ui" line="111"/> <location filename="../lobby/chat_moc.ui" line="111"/>
<source>send</source> <source>send</source>
<translation type="unfinished"></translation> <translation>Enviar</translation>
</message> </message>
</context> </context>
<context> <context>
@ -792,12 +805,12 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="702"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="702"/>
<source>Interface Improvements</source> <source>Interface Improvements</source>
<translation type="unfinished"></translation> <translation>Mejora de la interfaz</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="772"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="772"/>
<source>Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles</source> <source>Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles</source>
<translation type="unfinished"></translation> <translation>Instalar mod que proporciona varias mejoras en la interfaz, como mejor interacción en los mapas aleatorios y más opciones en las batallas</translation>
</message> </message>
<message> <message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="127"/> <location filename="../firstLaunch/firstlaunch_moc.ui" line="127"/>
@ -921,7 +934,7 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="23"/> <location filename="../languages.cpp" line="23"/>
<source>Czech</source> <source>Czech</source>
<translation type="unfinished"></translation> <translation>Czech (Checo)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="24"/> <location filename="../languages.cpp" line="24"/>
@ -936,7 +949,7 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="26"/> <location filename="../languages.cpp" line="26"/>
<source>Finnish</source> <source>Finnish</source>
<translation type="unfinished"></translation> <translation>Finnish (Finlandés)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="27"/> <location filename="../languages.cpp" line="27"/>
@ -951,12 +964,12 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="29"/> <location filename="../languages.cpp" line="29"/>
<source>Hungarian</source> <source>Hungarian</source>
<translation type="unfinished"></translation> <translation>Hungarian (Húngaro)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="30"/> <location filename="../languages.cpp" line="30"/>
<source>Italian</source> <source>Italian</source>
<translation type="unfinished"></translation> <translation>Italian (Italiano)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="31"/> <location filename="../languages.cpp" line="31"/>
@ -971,7 +984,7 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="33"/> <location filename="../languages.cpp" line="33"/>
<source>Portuguese</source> <source>Portuguese</source>
<translation type="unfinished"></translation> <translation>Portuguese (Portugués)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="34"/> <location filename="../languages.cpp" line="34"/>
@ -986,12 +999,12 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="36"/> <location filename="../languages.cpp" line="36"/>
<source>Swedish</source> <source>Swedish</source>
<translation type="unfinished"></translation> <translation>Swedish (Sueco)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="37"/> <location filename="../languages.cpp" line="37"/>
<source>Turkish</source> <source>Turkish</source>
<translation type="unfinished"></translation> <translation>Turkish (Turco)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="38"/> <location filename="../languages.cpp" line="38"/>
@ -1001,7 +1014,7 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="39"/> <location filename="../languages.cpp" line="39"/>
<source>Vietnamese</source> <source>Vietnamese</source>
<translation type="unfinished"></translation> <translation>Vietnamese (Vietnamita)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="40"/> <location filename="../languages.cpp" line="40"/>
@ -1011,12 +1024,12 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../languages.cpp" line="41"/> <location filename="../languages.cpp" line="41"/>
<source>Other (Cyrillic Script)</source> <source>Other (Cyrillic Script)</source>
<translation type="unfinished"></translation> <translation>Otro (Escritura cirílica)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="42"/> <location filename="../languages.cpp" line="42"/>
<source>Other (West European)</source> <source>Other (West European)</source>
<translation type="unfinished"></translation> <translation>Otro (Europa del Este)</translation>
</message> </message>
<message> <message>
<location filename="../languages.cpp" line="64"/> <location filename="../languages.cpp" line="64"/>
@ -1151,7 +1164,7 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi
<message> <message>
<location filename="../mainwindow_moc.ui" line="207"/> <location filename="../mainwindow_moc.ui" line="207"/>
<source>Help</source> <source>Help</source>
<translation type="unfinished"></translation> <translation>Ayuda</translation>
</message> </message>
<message> <message>
<location filename="../mainwindow_moc.ui" line="276"/> <location filename="../mainwindow_moc.ui" line="276"/>

View File

@ -273,6 +273,10 @@ CBonusSystemNode::~CBonusSystemNode()
void CBonusSystemNode::attachTo(CBonusSystemNode & parent) void CBonusSystemNode::attachTo(CBonusSystemNode & parent)
{ {
// quick workaround to prevent multithreaded access to bonus system in RMG
static boost::mutex attachMutex;
boost::lock_guard<boost::mutex> lock(attachMutex);
assert(!vstd::contains(parents, &parent)); assert(!vstd::contains(parents, &parent));
parents.push_back(&parent); parents.push_back(&parent);

View File

@ -177,6 +177,21 @@ void ConnectionsPlacer::selfSideDirectConnection(const rmg::ZoneConnection & con
int3 potentialPos = zone.areaPossible().nearest(borderPos); int3 potentialPos = zone.areaPossible().nearest(borderPos);
assert(borderPos != potentialPos); assert(borderPos != potentialPos);
//Check if guard pos doesn't touch any 3rd zone. This would create unwanted passage to 3rd zone
bool adjacentZone = false;
map.foreach_neighbour(potentialPos, [this, &adjacentZone, otherZoneId](int3 & pos)
{
auto zoneId = map.getZoneID(pos);
if (zoneId != zone.getId() && zoneId != otherZoneId)
{
adjacentZone = true;
}
});
if (adjacentZone)
{
continue;
}
//Take into account distance to objects from both sides //Take into account distance to objects from both sides
float dist = std::min(map.getTileInfo(potentialPos).getNearestObjectDistance(), float dist = std::min(map.getTileInfo(potentialPos).getNearestObjectDistance(),
map.getTileInfo(borderPos).getNearestObjectDistance()); map.getTileInfo(borderPos).getNearestObjectDistance());

View File

@ -128,7 +128,6 @@ protected:
{ {
itemKey = keyItems[key]; itemKey = keyItems[key];
table->setItem(table->row(itemKey), 1, itemValue); table->setItem(table->row(itemKey), 1, itemValue);
if(delegate)
table->setItemDelegateForRow(table->row(itemKey), delegate); table->setItemDelegateForRow(table->row(itemKey), delegate);
} }
else else
@ -139,7 +138,6 @@ protected:
table->setRowCount(row + 1); table->setRowCount(row + 1);
table->setItem(row, 0, itemKey); table->setItem(row, 0, itemKey);
table->setItem(row, 1, itemValue); table->setItem(row, 1, itemValue);
if(delegate)
table->setItemDelegateForRow(row, delegate); table->setItemDelegateForRow(row, delegate);
++row; ++row;
} }