Browse Source

Merge remote-tracking branch 'upstream/develop' into develop

Xilmi 1 year ago
parent
commit
cf8888987d

+ 28 - 28
Mods/vcmi/config/vcmi/czech.json

@@ -3,20 +3,20 @@
 	"vcmi.adventureMap.monsterThreat.levels.0"  : "Bez námahy",
 	"vcmi.adventureMap.monsterThreat.levels.1"  : "Velmi slabá",
 	"vcmi.adventureMap.monsterThreat.levels.2"  : "Slabá",
-	"vcmi.adventureMap.monsterThreat.levels.3"  : "Trochu slabší",
-	"vcmi.adventureMap.monsterThreat.levels.4"  : "Podobná",
-	"vcmi.adventureMap.monsterThreat.levels.5"  : "Trochu silnější",
+	"vcmi.adventureMap.monsterThreat.levels.3"  : "O něco slabší",
+	"vcmi.adventureMap.monsterThreat.levels.4"  : "Rovnocenná",
+	"vcmi.adventureMap.monsterThreat.levels.5"  : "O něco silnější",
 	"vcmi.adventureMap.monsterThreat.levels.6"  : "Silná",
 	"vcmi.adventureMap.monsterThreat.levels.7"  : "Velmi silná",
 	"vcmi.adventureMap.monsterThreat.levels.8"  : "Výzva",
-	"vcmi.adventureMap.monsterThreat.levels.9"  : "Převažující",
-	"vcmi.adventureMap.monsterThreat.levels.10" : "Smrtelná",
-	"vcmi.adventureMap.monsterThreat.levels.11" : "Nemožná",
-	"vcmi.adventureMap.monsterLevel"            : "\n\nÚroveň %LEVEL %TOWN %ATTACK_TYPE jednotka",
-	"vcmi.adventureMap.monsterMeleeType"        : "útok zblízka",
-	"vcmi.adventureMap.monsterRangedType"       : "útok na dálku",
-	"vcmi.adventureMap.search.hover"            : "Prohledat mapový objekt",
-	"vcmi.adventureMap.search.help"             : "Vyberte objekt na mapě pro prohledání.",
+	"vcmi.adventureMap.monsterThreat.levels.9"  : "Převaha",
+	"vcmi.adventureMap.monsterThreat.levels.10" : "Smrtící",
+	"vcmi.adventureMap.monsterThreat.levels.11" : "Nehratelná",
+	"vcmi.adventureMap.monsterLevel"            : "\n\nÚroveň %LEVEL, %TOWN\nJednotka %ATTACK_TYPE",
+	"vcmi.adventureMap.monsterMeleeType"        : "útočí zblízka",
+	"vcmi.adventureMap.monsterRangedType"       : "útočí na dálku",
+	"vcmi.adventureMap.search.hover"            : "Prohledat objekt",
+	"vcmi.adventureMap.search.help"             : "Vyberte objekt na mapě k prohledání.",
 
 	"vcmi.adventureMap.confirmRestartGame"     : "Jste si jisti, že chcete restartovat hru?",
 	"vcmi.adventureMap.noTownWithMarket"       : "Nejsou dostupné žádne tržnice!",
@@ -61,7 +61,7 @@
 	"vcmi.radialWheel.moveDown" : "Posunout níže",
 	"vcmi.radialWheel.moveBottom" : "Přesunout dolů",
 
-	"vcmi.spellBook.search" : "hledat...",
+	"vcmi.spellBook.search" : "Hledat kouzlo",
 
 	"vcmi.spellResearch.canNotAfford" : "Nemáte dostatek prostředků k nahrazení {%SPELL1} za {%SPELL2}. Stále však můžete toto kouzlo zrušit a pokračovat ve výzkumu kouzel.",
 	"vcmi.spellResearch.comeAgain" : "Výzkum už byl dnes proveden. Vraťte se zítra.",
@@ -86,7 +86,7 @@
 	"vcmi.lobby.sortDate" : "Řadit mapy dle data změny",
 	"vcmi.lobby.backToLobby" : "Vrátit se do lobby",
 	"vcmi.lobby.author" : "Autor",
-	"vcmi.lobby.handicap" : "Handicap",
+	"vcmi.lobby.handicap" : "Postih",
 	"vcmi.lobby.handicap.resource" : "Dává hráčům odpovídající zdroje navíc k běžným startovním zdrojům. Jsou povoleny záporné hodnoty, ale jsou omezeny na celkovou hodnotu 0 (hráč nikdy nezačíná se zápornými zdroji).",
 	"vcmi.lobby.handicap.income" : "Mění různé příjmy hráče podle procent. Výsledek je zaokrouhlen nahoru.",
 	"vcmi.lobby.handicap.growth" : "Mění rychlost růstu jednotel v městech vlastněných hráčem. Výsledek je zaokrouhlen nahoru.",
@@ -215,7 +215,7 @@
 	"vcmi.systemOptions.resolutionButton.hover" : "Rozlišení: %wx%h",
 	"vcmi.systemOptions.resolutionButton.help"  : "{Vybrat rozlišení}\n\nZmění rozlišení herní obrazovky.",
 	"vcmi.systemOptions.resolutionMenu.hover"   : "Vybrat rozlišení",
-	"vcmi.systemOptions.resolutionMenu.help"    : "Změnit rozlišení herní obrazovky.",
+	"vcmi.systemOptions.resolutionMenu.help"    : "Změní rozlišení herní obrazovky.",
 	"vcmi.systemOptions.scalingButton.hover"   : "Škálování rozhraní: %p%",
 	"vcmi.systemOptions.scalingButton.help"    : "{Škálování rozhraní}\n\nZmění škálování herního rozhraní",
 	"vcmi.systemOptions.scalingMenu.hover"     : "Vybrat škálování rozhraní",
@@ -244,14 +244,14 @@
 	"vcmi.adventureOptions.forceMovementInfo.help" : "{Vždy zobrazit cenu pohybu}\n\nVždy zobrazit informace o bodech pohybu v panelu informací. (Místo zobrazení pouze při stisknuté klávese ALT).",
 	"vcmi.adventureOptions.showGrid.hover" : "Zobrazit mřížku",
 	"vcmi.adventureOptions.showGrid.help" : "{Zobrazit mřížku}\n\nZobrazit překrytí mřížkou, zvýrazňuje hranice mezi dlaždicemi mapy světa.",
-	"vcmi.adventureOptions.borderScroll.hover" : "Posouvání okraji",
-	"vcmi.adventureOptions.borderScroll.help" : "{Posouvání okraji}\n\nPosouvat mapu světa, když je kurzor na okraji obrazovky. Může být zakázáno držením klávesy CTRL.",
+	"vcmi.adventureOptions.borderScroll.hover" : "Posouvání okrajem obrazovky",
+	"vcmi.adventureOptions.borderScroll.help" : "{Posouvání okrajem obrazovky}\n\nPosouvat mapu světa, když je kurzor na okraji obrazovky. Může být zakázáno držením klávesy CTRL.",
 	"vcmi.adventureOptions.infoBarCreatureManagement.hover" : "Správa jednotek v informačním panelu",
 	"vcmi.adventureOptions.infoBarCreatureManagement.help" : "{Správa jednotek v informačním panelu}\n\nUmožňuje přeskupovat jednotky v informačním panelu namísto procházení standardních informací.",
-	"vcmi.adventureOptions.leftButtonDrag.hover" : "Posouvání mapy levým kliknutím",
-	"vcmi.adventureOptions.leftButtonDrag.help" : "{Posouvání mapy levým kliknutím}\n\nPosouvání mapy tažením myši se stisknutým levým tlačítkem.",
-	"vcmi.adventureOptions.rightButtonDrag.hover" : "Přetahování pravým tlačítkem",
-	"vcmi.adventureOptions.rightButtonDrag.help" : "{Přetahování pravým tlačítkem}\n\nKdyž je povoleno, pohyb myší se stisknutým pravým tlačítkem bude posouvat pohled na mapě dobrodružství.",
+	"vcmi.adventureOptions.leftButtonDrag.hover" : "Posun levým tlač.",
+	"vcmi.adventureOptions.leftButtonDrag.help" : "{Posun levým tlačítkem}\n\nPosouvání mapy tažením myši se stisknutým levým tlačítkem.",
+	"vcmi.adventureOptions.rightButtonDrag.hover" : "Posun pravým tlač.",
+	"vcmi.adventureOptions.rightButtonDrag.help" : "{Posun pravým tlačítkem}\n\nKdyž je povoleno, pohyb myší se stisknutým pravým tlačítkem bude posouvat pohled na mapě dobrodružství.",
 	"vcmi.adventureOptions.smoothDragging.hover" : "Plynulé posouvání mapy",
 	"vcmi.adventureOptions.smoothDragging.help" : "{Plynulé posouvání mapy}\n\nPokud je tato možnost aktivována, posouvání mapy bude plynulé.",
 	"vcmi.adventureOptions.skipAdventureMapAnimations.hover" : "Přeskočit efekty mizení",
@@ -288,8 +288,8 @@
 	"vcmi.battleOptions.showStickyHeroInfoWindows.help": "{Zobrazit okno statistik hrdinů}\n\nTrvale zapne okno statistiky hrdinů, které ukazuje hlavní schopnosti a magickou energii.",
 	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Přeskočit úvodní hudbu",
 	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Přeskočit úvodní hudbu}\n\nPovolí akce při úvodní hudbě přehrávané při začátku každé bitvy.",
-	"vcmi.battleOptions.endWithAutocombat.hover": "Ukončit bitvu",
-	"vcmi.battleOptions.endWithAutocombat.help": "{Ukončit bitvu}\n\nAutomatický boj okamžitě dohraje bitvu do konce.",
+	"vcmi.battleOptions.endWithAutocombat.hover": "Přeskočit bitvu",
+	"vcmi.battleOptions.endWithAutocombat.help": "{Přeskočit bitvu}\n\nAutomatický boj okamžitě dohraje bitvu do konce.",
 	"vcmi.battleOptions.showQuickSpell.hover": "Zobrazit rychlý panel kouzel",
 	"vcmi.battleOptions.showQuickSpell.help": "{Zobrazit rychlý panel kouzel}\n\nZobrazí panel pro rychlý výběr kouzel.",
 
@@ -308,7 +308,7 @@
 	"vcmi.battleWindow.damageEstimation.kills" : "%d zahyne",
 	"vcmi.battleWindow.damageEstimation.kills.1" : "%d zahyne",
 	
-	"vcmi.battleWindow.damageRetaliation.will" : "Provede odvetu",
+	"vcmi.battleWindow.damageRetaliation.will" : "Provede odvetu ",
 	"vcmi.battleWindow.damageRetaliation.may" : "Může provést odvetu",
 	"vcmi.battleWindow.damageRetaliation.never" : "Neprovede odvetu.",
 	"vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).",
@@ -318,7 +318,7 @@
 	"vcmi.battleWindow.accurateShot.resultDescription.0" : "%d %s bylo zabito přesnými zásahy!",
 	"vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s byl zabit přesným zásahem!",
 	"vcmi.battleWindow.accurateShot.resultDescription.2" : "%d %s bylo zabito přesnými zásahy!",
-	"vcmi.battleWindow.endWithAutocombat" : "Opravdu chcete ukončit bitvu s automatickým bojem?",
+	"vcmi.battleWindow.endWithAutocombat" : "Opravdu chcete dokončit bitvu automatickým bojem?",
 
 	"vcmi.battleResultsWindow.applyResultsLabel" : "Použít výsledek bitvy",
 
@@ -344,7 +344,7 @@
 	"vcmi.townStructure.bank.borrow" : "Vstupujete do banky. Bankéř vás spatří a říká: \"Máme pro vás speciální nabídku. Můžete si vzít půjčku 2500 zlata na 5 dní. Každý den budete muset splácet 500 zlata.\"",
 	"vcmi.townStructure.bank.payBack" : "Vstupujete do banky. Bankéř vás spatří a říká: \"Již jste si vzali půjčku. Nejprve ji splaťte, než si vezmete další.\"",
 
-	"vcmi.logicalExpressions.anyOf"  : "Něco z následujících:",
+	"vcmi.logicalExpressions.anyOf"  : "Nějaké z následujících:",
 	"vcmi.logicalExpressions.allOf"  : "Všechny následující:",
 	"vcmi.logicalExpressions.noneOf" : "Žádné z následujících:",
 
@@ -381,7 +381,7 @@
 	"vcmi.randomMapTab.widgets.roadTypesLabel"       : "Druhy cest",
 
 	"vcmi.optionsTab.turnOptions.hover" : "Možnosti tahu",
-	"vcmi.optionsTab.turnOptions.help" : "Vyberte odpočítávadlo tahů a nastavení souběžných tahů",
+	"vcmi.optionsTab.turnOptions.help" : "Vyberte odpočítávadlo a nastavení souběžných tahů",
 
 	"vcmi.optionsTab.chessFieldBase.hover" : "Základní časovač",
 	"vcmi.optionsTab.chessFieldTurn.hover" : "Časovač tahu",
@@ -404,7 +404,7 @@
 	"vcmi.optionsTab.simturnsMax.help" : "Hrát souběžně po určený počet dní nebo do setkání s jiným hráčem",
 	"vcmi.optionsTab.simturnsAI.help" : "{Souběžné tahy AI}\nExperimentální volba. Dovoluje AI hráčům hrát souběžně s lidskými hráči, když jsou souběžné tahy povoleny.",
 
-	"vcmi.optionsTab.turnTime.select"     : "Vyberte šablonu nastavení časovače",
+	"vcmi.optionsTab.turnTime.select"     : "Šablona nastavení časovače",
 	"vcmi.optionsTab.turnTime.unlimited"  : "Neomezený čas tahu",
 	"vcmi.optionsTab.turnTime.classic.1"  : "Klasický časovač: 1 minuta",
 	"vcmi.optionsTab.turnTime.classic.2"  : "Klasický časovač: 2 minuty",
@@ -419,7 +419,7 @@
 	"vcmi.optionsTab.turnTime.chess.2"    : "Šachová: 02:00 + 01:00 + 00:15 + 00:00",
 	"vcmi.optionsTab.turnTime.chess.1"    : "Šachová: 01:00 + 01:00 + 00:00 + 00:00",
 
-	"vcmi.optionsTab.simturns.select"         : "Vyberte šablonu souběžných tahů",
+	"vcmi.optionsTab.simturns.select"         : "Šablona souběžných tahů",
 	"vcmi.optionsTab.simturns.none"           : "Bez souběžných tahů",
 	"vcmi.optionsTab.simturns.tillContactMax" : "Souběžně: Do setkání",
 	"vcmi.optionsTab.simturns.tillContact1"   : "Souběžně: 1 týden, přerušit při setkání",

+ 7 - 4
Mods/vcmi/config/vcmi/swedish.json

@@ -15,6 +15,8 @@
 	"vcmi.adventureMap.monsterLevel"            : "\n\nNivå: %LEVEL - Faktion: %TOWN",
 	"vcmi.adventureMap.monsterMeleeType"        : "närstrid",
 	"vcmi.adventureMap.monsterRangedType"       : "fjärrstrid",
+	"vcmi.adventureMap.search.hover"            : "Sök kartobjekt",
+	"vcmi.adventureMap.search.help"             : "Välj objekt för att söka på kartan.",
 
 	"vcmi.adventureMap.confirmRestartGame"               : "Är du säker på att du vill starta om spelet?",
 	"vcmi.adventureMap.noTownWithMarket"                 : "Det finns inga tillgängliga marknadsplatser!",
@@ -356,8 +358,9 @@
 	"vcmi.heroWindow.sortBackpackBySlot.help"   : "Sorterar artefakter i ryggsäcken efter utrustad plats.",
 	"vcmi.heroWindow.sortBackpackByClass.hover" : "Sortera efter klass",
 	"vcmi.heroWindow.sortBackpackByClass.help"  : "Sorterar artefakter i ryggsäcken efter artefaktklass (skatt, mindre, större, relik)",
+	"vcmi.heroWindow.fusingArtifact.fusing"     : "Du har alla komponenterna som behövs för en sammanslagning av %s. Vill du utföra sammanslagningen? {Alla komponenter kommer att förbrukas vid sammanslagningen.}",
 
-	"vcmi.tavernWindow.inviteHero"  : "Bjud in hjälte",
+	"vcmi.tavernWindow.inviteHero" : "Bjud in hjälte",
 
 	"vcmi.commanderWindow.artifactMessage" : "Vill du återlämna denna artefakt till hjälten?",
 
@@ -574,7 +577,7 @@
 	"core.bonus.ENEMY_ATTACK_REDUCTION.name"             : "Avfärda attack (${val}%)",
 	"core.bonus.ENEMY_ATTACK_REDUCTION.description"      : "Ignorerar ${val}% av angriparens attack.",
 	"core.bonus.ENEMY_DEFENCE_REDUCTION.name"            : "Förbigå försvar (${val}%)",
-	"core.bonus.ENEMY_DEFENCE_REDUCTION.description"     : "Din attack ignorerar ${val}% av fiendens försvar.",
+	"core.bonus.ENEMY_DEFENCE_REDUCTION.description"     : "Attacker ignorerar ${val}% av fiendens försvar.",
 	"core.bonus.FIRE_IMMUNITY.name"                      : "Eld-immunitet",
 	"core.bonus.FIRE_IMMUNITY.description"               : "Immun mot alla eldmagi-trollformler.",
 	"core.bonus.FIRE_SHIELD.name"                        : "Eldsköld (${val}%)",
@@ -594,7 +597,7 @@
 	"core.bonus.GARGOYLE.name"                           : "Stenfigur",
 	"core.bonus.GARGOYLE.description"                    : "Kan varken upplivas eller läkas.",
 	"core.bonus.GENERAL_DAMAGE_REDUCTION.name"           : "Minska skada (${val}%)",
-	"core.bonus.GENERAL_DAMAGE_REDUCTION.description"    : "Reducerar skadan från inkommande attacker.",
+	"core.bonus.GENERAL_DAMAGE_REDUCTION.description"    : "Reducerar skadan från fiendens attacker.",
 	"core.bonus.HATE.name"                               : "Hatar: ${subtype.creature}",
 	"core.bonus.HATE.description"                        : "Gör ${val}% mer skada mot ${subtype.creature}.",
 	"core.bonus.HEALER.name"                             : "Helare",
@@ -644,7 +647,7 @@
 	"core.bonus.REVENGE.name"                            : "Hämndlysten",
 	"core.bonus.REVENGE.description"                     : "Vållar mer skada om den själv blivit skadad.",
 	"core.bonus.SHOOTER.name"                            : "Distans-attack",
-	"core.bonus.SHOOTER.description"                     : "Varelsen kan skjuta/attackera på avstånd.",
+	"core.bonus.SHOOTER.description"                     : "Skjuter/attackerar på avstånd.",
 	"core.bonus.SHOOTS_ALL_ADJACENT.name"                : "Skjuter alla i närheten",
 	"core.bonus.SHOOTS_ALL_ADJACENT.description"         : "Distans-attack drabbar alla inom räckhåll.",
 	"core.bonus.SOUL_STEAL.name"                         : "Själtjuv",

+ 1 - 1
client/eventsSDL/InputSourceKeyboard.cpp

@@ -111,7 +111,7 @@ void InputSourceKeyboard::handleEventKeyUp(const SDL_KeyboardEvent & key)
 	if(key.repeat != 0)
 		return; // ignore periodic event resends
 
-	std::string keyName = SDL_GetKeyName(key.keysym.sym);
+	std::string keyName = getKeyNameWithModifiers(SDL_GetKeyName(key.keysym.sym));
 	logGlobal->trace("keyboard: key '%s' released", keyName);
 
 	if (SDL_IsTextInputActive() == SDL_TRUE)

+ 1 - 1
client/lobby/CBonusSelection.cpp

@@ -99,7 +99,7 @@ CBonusSelection::CBonusSelection()
 	int availableSpace = videoButtonActive ? 225 : 285;
 	mapName = std::make_shared<CLabel>(481, 219, FONT_BIG, ETextAlignment::TOPLEFT, Colors::YELLOW, CSH->mi->getNameTranslated(), availableSpace );
 	labelMapDescription = std::make_shared<CLabel>(481, 253, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[496]);
-	mapDescription = std::make_shared<CTextBox>("", Rect(480, 278, 292, 108), 1);
+	mapDescription = std::make_shared<CTextBox>("", Rect(480, 278, 286, 108), 1);
 
 	labelChooseBonus = std::make_shared<CLabel>(475, 432, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[71]);
 	groupBonuses = std::make_shared<CToggleGroup>(std::bind(&IServerAPI::setCampaignBonus, CSH, _1));

+ 2 - 2
client/lobby/CLobbyScreen.cpp

@@ -188,7 +188,7 @@ void CLobbyScreen::toggleMode(bool host)
 		return;
 
 	auto buttonColor = host ? Colors::WHITE : Colors::ORANGE;
-	buttonSelect->setTextOverlay(CGI->generaltexth->allTexts[500], FONT_SMALL, buttonColor);
+	buttonSelect->setTextOverlay("  " + CGI->generaltexth->allTexts[500], FONT_SMALL, buttonColor);
 	buttonOptions->setTextOverlay(CGI->generaltexth->allTexts[501], FONT_SMALL, buttonColor);
 
 	if (buttonTurnOptions)
@@ -199,7 +199,7 @@ void CLobbyScreen::toggleMode(bool host)
 
 	if(buttonRMG)
 	{
-		buttonRMG->setTextOverlay(CGI->generaltexth->allTexts[740], FONT_SMALL, buttonColor);
+		buttonRMG->setTextOverlay("  " + CGI->generaltexth->allTexts[740], FONT_SMALL, buttonColor);
 		buttonRMG->block(!host);
 	}
 	buttonSelect->block(!host);

+ 2 - 2
client/lobby/CSelectionBase.cpp

@@ -187,8 +187,8 @@ InfoCard::InfoCard()
 		iconsVictoryCondition = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRVICT"), 0, 0, 24, 302);
 		iconsLossCondition = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRLOSS"), 0, 0, 24, 359);
 
-		labelVictoryConditionText = std::make_shared<CLabel>(60, 307, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
-		labelLossConditionText = std::make_shared<CLabel>(60, 366, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
+		labelVictoryConditionText = std::make_shared<CLabel>(60, 307, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, "", 290);
+		labelLossConditionText = std::make_shared<CLabel>(60, 366, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, "", 290);
 
 		labelDifficulty = std::make_shared<CLabel>(62, 472, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
 		labelDifficultyPercent = std::make_shared<CLabel>(311, 472, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);

+ 1 - 1
client/mainmenu/CMainMenu.cpp

@@ -540,7 +540,7 @@ CMultiPlayers::CMultiPlayers(const std::vector<std::string> & playerNames, ESele
 
 	std::string text = CGI->generaltexth->allTexts[446];
 	boost::replace_all(text, "\t", "\n");
-	textTitle = std::make_shared<CTextBox>(text, Rect(25, 20, 315, 50), 0, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE); //HOTSEAT	Please enter names
+	textTitle = std::make_shared<CTextBox>(text, Rect(25, 10, 315, 60), 0, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE); //HOTSEAT	Please enter names
 
 	for(int i = 0; i < inputNames.size(); i++)
 	{

+ 6 - 1
client/media/CMusicHandler.cpp

@@ -265,7 +265,12 @@ void MusicEntry::load(const AudioPath & musicURI)
 
 	try
 	{
-		auto * musicFile = MakeSDLRWops(CResourceHandler::get()->load(currentName));
+		std::unique_ptr<CInputStream> stream = CResourceHandler::get()->load(currentName);
+
+		if(musicURI.getName() == "BLADEFWCAMPAIGN") // handle defect MP3 file - ffprobe says: Skipping 52 bytes of junk at 0.
+			stream->seek(52);
+
+		auto * musicFile = MakeSDLRWops(std::move(stream));
 		music = Mix_LoadMUS_RW(musicFile, SDL_TRUE);
 	}
 	catch(std::exception & e)

+ 1 - 1
config/factions/rampart.json

@@ -199,7 +199,7 @@
 				"dwellingLvl3":   { "id" : 32, "requires" : [ "dwellingLvl1" ] },
 				"dwellingLvl4":   { "id" : 33, "requires" : [ "dwellingLvl3" ] },
 				"dwellingLvl5":   { "id" : 34, "requires" : [ "dwellingLvl3" ] },
-				"dwellingLvl6":   { "id" : 35, "requires" : [ "allOf", [ "dwellingLvl3" ], [ "dwellingLvl4" ] ] },
+				"dwellingLvl6":   { "id" : 35, "requires" : [ "allOf", [ "dwellingLvl4" ], [ "dwellingLvl5" ] ] },
 				"dwellingLvl7":   { "id" : 36, "requires" : [ "allOf", [ "dwellingLvl6" ], [ "mageGuild2" ] ] },
 
 				"dwellingUpLvl1": { "id" : 37, "upgrades" : "dwellingLvl1" },

+ 1 - 1
lib/CGameInfoCallback.cpp

@@ -484,7 +484,7 @@ std::vector<ConstTransitivePtr<CGObjectInstance>> CGameInfoCallback::getAllVisit
 {
 	std::vector<ConstTransitivePtr<CGObjectInstance>> ret;
 	for(auto & obj : gs->map->objects)
-		if(obj->isVisitable() && obj->ID != Obj::EVENT && isVisible(obj))
+		if(obj && obj->isVisitable() && obj->ID != Obj::EVENT && isVisible(obj))
 			ret.push_back(obj);
 
 	return ret;