diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index d32dce5c5..0ae8cb99d 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -1599,7 +1599,7 @@ void M_StartupSkillMenu(FGameStartup *gs) if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) { DListMenuDescriptor *ld = static_cast(*desc); - int x = (int)ld->mXpos; + int posx = (int)ld->mXpos; int y = (int)ld->mYpos; // Delete previous contents @@ -1653,6 +1653,30 @@ void M_StartupSkillMenu(FGameStartup *gs) } } + for (unsigned int i = 0; i < MenuSkills.Size(); i++) + { + FSkillInfo &skill = *MenuSkills[i]; + DMenuItemBase *li = nullptr; + + FString *pItemText = nullptr; + if (gs->PlayerClass != nullptr) + { + pItemText = skill.MenuNamesForPlayerClass.CheckKey(gs->PlayerClass); + } + + if (skill.PicName.Len() != 0 && pItemText == nullptr) + { + FTextureID tex = GetMenuTexture(skill.PicName); + if (skill.MenuName.IsEmpty() || TexMan.OkForLocalization(tex, skill.MenuName)) + continue; + } + const char *c = pItemText ? pItemText->GetChars() : skill.MenuName.GetChars(); + if (*c == '$') c = GStrings(c + 1); + int textwidth = ld->mFont->StringWidth(c); + int textright = posx + textwidth; + if (posx + textright > 320) posx = std::max(0, 320 - textright); + } + unsigned firstitem = ld->mItems.Size(); for(unsigned int i = 0; i < MenuSkills.Size(); i++) { @@ -1673,11 +1697,11 @@ void M_StartupSkillMenu(FGameStartup *gs) { FTextureID tex = GetMenuTexture(skill.PicName); if (skill.MenuName.IsEmpty() || TexMan.OkForLocalization(tex, skill.MenuName)) - li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i]); + li = CreateListMenuItemPatch(posx, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i]); } if (li == nullptr) { - li = CreateListMenuItemText(x, y, ld->mLinespacing, skill.Shortcut, + li = CreateListMenuItemText(posx, y, ld->mLinespacing, skill.Shortcut, pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, SkillIndices[i]); } ld->mItems.Push(li); diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index f3bdbd567..6bcf36c7f 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -1314,6 +1314,7 @@ FString &FString::operator=(const wchar_t *copyStr) std::wstring WideString(const char *cin) { + if (!cin) return L""; const uint8_t *in = (const uint8_t*)cin; // This is a bit tricky because we need to support both UTF-8 and legacy content in ISO-8859-1 // and thanks to user-side string manipulation it can be that a text mixes both. diff --git a/src/version.h b/src/version.h index 832737a7f..f85508c66 100644 --- a/src/version.h +++ b/src/version.h @@ -41,15 +41,15 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "3.8pre" +#define VERSIONSTR "4.1pre" // The version as seen in the Windows resource -#define RC_FILEVERSION 3,7,9999,0 -#define RC_PRODUCTVERSION 3,7,9999,0 +#define RC_FILEVERSION 4,0,9999,0 +#define RC_PRODUCTVERSION 4,0,9999,0 #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. -#define VER_MAJOR 3 -#define VER_MINOR 8 +#define VER_MAJOR 4 +#define VER_MINOR 1 #define VER_REVISION 0 // This should always refer to the GZDoom version a derived port is based on and not reflect the derived port's version number! diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index ff6186974..c6f8a72e1 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -1717,8 +1717,8 @@ Options,MNU_OPTIONS,,,,,Optionen,Opciones,,Options,,Opzioni,Opções,Настр Game Files,MNU_GAMEFILES,,,,,Spieldateien,Archivos del Juego,,Fichiers de jeu,,File di gioco,Jogos salvos,Файлы игры,Фајлови игре Info,MNU_INFO,,,,,Informationen,Información,,Info,,Informazioni,Info,Информация,Подаци Quit Game,MNU_QUITGAME,,,,,Spiel verlassen,Salir del juego,,Quitter le jeu,,Esci dal gioco,Sair,Выход,Заврши игру -Choose Skill Level:,MNU_CHOOSESKILL,"DE, ES, FR had to be shortened to fit the available space",,,,Schwierigkeitsgrad:,Elige nivel de dificultad:,,Difficulté:,,Scegli il livello di difficoltà:,Escolha Dificuldade:,Уровень сложности:,Изаберите ниво тежине: -I'm too young to die.,SKILL_BABY,,,,,Ich bin zu jung zum Sterben.,Soy muy joven para morir.,,Trop jeune pour mourir!,,Sono troppo giovane per morire.,Facil,Мне рано умирать.,Премлад сам да умрем +Choose Skill Level:,MNU_CHOOSESKILL,This text is extremely space limited!,,,,Schwierigkeitsgrad:,Elige nivel de dificultad:,,Difficulté:,,Livello di difficoltà:,Escolha Dificuldade:,Уровень сложности:,Изаберите ниво тежине: +I'm too young to die.,SKILL_BABY,,,,,Ich bin zu jung zum Sterben.,Soy muy joven para morir.,,Trop jeune pour mourir!,,Troppo giovane per morire.,Facil,Мне рано умирать.,Премлад сам да умрем "Hey, not too rough.",SKILL_EASY,,,,,"He, nicht so ruppig.","Oye, no tan rudo.",,"Hé, pas trop fort!",,"Ehi, non troppo duro!",Medio,"Эй, не так грубо.","Хеј, не претерано грубо" Hurt me plenty.,SKILL_NORMAL,,,,,Tu mir weh.,Lastímame suficiente.,,Fais-moi mal!,,Fammi molto male.,Dificil,Сделай мне больно.,Повреди ме кол'ко можеш Ultra-Violence.,SKILL_HARD,,,,,Volle Gewalt.,Ultra-Violencia.,,Ultra-Violence!,,Ultra-violenza.,Desafio,Ультранасилие.,Ултра-насилно @@ -2014,14 +2014,14 @@ Show time,ALTHUDMNU_SHOWTIME,,,,,Zeige Zeit,Mostrar tiempo,,Afficher temps nivea Time color,ALTHUDMNU_TIMECOLOR,,,Time colour,,Zeiot-Farbe,Color del tiempo,,Couleur du timer,,Colore del tempo,,Цвет времени, Show network latency,ALTHUDMNU_SHOWLAG,,,,,Zeige Netzwerk-Latenz,Mostrar latencia de red,,Afficher latence réseau,,Mostra la latenza del network,,Отображение задержки сети, Ammo display order,ALTHUDMNU_AMMOORDER,,,,,Munitionsreihenfolge,Orden vista de munición,,Ordre d'affichage des munitions,,Ordine mostra delle munizioni,,Порядок отображения боеприпасов, -Red ammo display below %,ALTHUDMNU_AMMORED,,,,,Rot für Munition unter %,Porcent. de munición en rojo,,Compteur de munitions rouge sous,,Contatore delle munizioni di colore rosso sotto,,Кр. отображение боеприпасов под %, -Yellow ammo display below %,ALTHUDMNU_AMMOYELLOW,,,,,Gelb für Munition unter %,Porcent. de munición en amarillo,,Compteur de munitions jaune sous,,Contatore delle munizioni di colore giallo sotto,,Жл. отображение боеприпасов под %, -Red health display below,ALTHUDMNU_HEALTHRED,,,,,Rot für Gesundheit unter %,Porcent. de salud en rojo,,Compteur de santé rouge sous,,Contatore della salute di colore rosso sotto,,Красное отображение здоровья под, -Yellow health display below,ALTHUDMNU_HEALTHYELLOW,,,,,Gelb für Gesundheit unter %,Porcent. de salud en amarillo,,Compteur de santé jaune sous,,Contatore della salute di colore giallo sotto,,Жёлтое отображение здоровья под, -Green health display below,ALTHUDMNU_HEALTHGREEN,,,,,Grün für Gesundheit unter %,Porcent. de salud en verde,,Compteur de santé vert sous,,Contatore della salute di colore verde sotto,,Зел. отображение здоровья под, -Red armor display below,ALTHUDMNU_ARMORRED,,,Red armour display below,,Rot für Panzerung unter %,Porcent. de blindaje en rojo,,Compteur d' armure rouge sous,,Contatore dell'armatura di colore rosso sotto,,Красное отображение броня под, -Yellow armor display below,ALTHUDMNU_ARMORYELLOW,,,Yellow armour display below,,Gelb für Panzerung unter %,Porcent. de blindaje en amarillo,,Compteur d' armure jaune sous,,Contatore dell'armatura di colore giallo sotto,,Жёлтое отображение броня под, -Green armor display below,ALTHUDMNU_ARMORGREEN,,,Green armour display below,,Grün für Panzerung unter %,Porcent. de blindaje en verde,,Compteur d' armure bleu sous,,Contatore dell'armatura di colore verde sotto,,Зел. отображение броня под, +Red ammo display below %,ALTHUDMNU_AMMORED,,,,,Rot für Munition unter %,Porcent. de munición en rojo,,Compteur de munitions rouge sous,,Contatore delle munizioni di colore rosso sotto,,"Отображение боеприпасов красным ниже, %", +Yellow ammo display below %,ALTHUDMNU_AMMOYELLOW,,,,,Gelb für Munition unter %,Porcent. de munición en amarillo,,Compteur de munitions jaune sous,,Contatore delle munizioni di colore giallo sotto,,"Отображение боеприпасов жёлтым ниже, %", +Red health display below,ALTHUDMNU_HEALTHRED,,,,,Rot für Gesundheit unter %,Porcent. de salud en rojo,,Compteur de santé rouge sous,,Contatore della salute di colore rosso sotto,,"Отображение здоровья красным ниже, %", +Yellow health display below,ALTHUDMNU_HEALTHYELLOW,,,,,Gelb für Gesundheit unter %,Porcent. de salud en amarillo,,Compteur de santé jaune sous,,Contatore della salute di colore giallo sotto,,"Отображение здоровья жёлтым ниже, %", +Green health display below,ALTHUDMNU_HEALTHGREEN,,,,,Grün für Gesundheit unter %,Porcent. de salud en verde,,Compteur de santé vert sous,,Contatore della salute di colore verde sotto,,"Отображение здоровья зелёным ниже, %", +Red armor display below,ALTHUDMNU_ARMORRED,,,Red armour display below,,Rot für Panzerung unter %,Porcent. de blindaje en rojo,,Compteur d' armure rouge sous,,Contatore dell'armatura di colore rosso sotto,,"Отображение брони красным ниже, %", +Yellow armor display below,ALTHUDMNU_ARMORYELLOW,,,Yellow armour display below,,Gelb für Panzerung unter %,Porcent. de blindaje en amarillo,,Compteur d' armure jaune sous,,Contatore dell'armatura di colore giallo sotto,,"Отображение брони жёлтым ниже, %", +Green armor display below,ALTHUDMNU_ARMORGREEN,,,Green armour display below,,Grün für Panzerung unter %,Porcent. de blindaje en verde,,Compteur d' armure bleu sous,,Contatore dell'armatura di colore verde sotto,,"Отображение брони зелёным ниже, %", Alternative Automap HUD,ALTHUDMNU_AUTOMAPHUD,,,,,Alternatives Automap HUD,HUD alternativo del automapa,,ATH Alternatif pour carte,,HUD automappa alternativo,,Альт. HUD на автокарте, Map title color,ALTHUDMNU_TITLECOLOR,,,Map title colour,,Farbe für Levelnamen,Color del título del mapa,,Couleur titre du niveau,,Colore titolo mappa,,Цвет названия уровня, Map time color,ALTHUDMNU_MAPTIMECOLOR,,,Map time colour,,Farbe für Level-Zeit,Color del tiempo del mapa,,Couleur temps du niveau,,Colore tempo mappa,,Цвет времени для уровней, @@ -2291,11 +2291,11 @@ Select configuration,ADVSNDMNU_SELCONFIG,,,,,Konfiguration wählen,Seleccionar c Global,ADVSNDMNU_GLOBAL,,,,,,Global,,,,Globale,,Общие, Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,, Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,,Globales Freeverb,Freeverb Global,,Freeverb Global,,Freeverb globale,,Глобальный Freeverb, -Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,,Erweitertes Resampling,Resampleo Avanzado,,Resampling Avancé,,Resampling avanzato,,Продвинутый ресемплинг, +Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,,Erweitertes Resampling,Resampleo Avanzado,,Resampling Avancé,,Resampling avanzato,,Продвинутый ресэмплинг, OPL Bank,ADVSNDMNU_OPLBANK,,,,,,Banco OPL,,Banque OPL,,,,Банк OPL, OPL Emulator Core,ADVSNDMNU_ADLOPLCORES,,,,,OPL Emulatorkern,Núcleos de Emulador OPL,,Cœur Emulateur OPL,,,,Ядро эмуляции OPL, Run emulator at PCM rate,ADVSNDMNU_RUNPCMRATE,,,,,Emulator benutzt PCM Samplerate,Ejecutar emulador a velocidad PCM,,Emulateur utilise cadence PCM,,Esegui l'emulatore con rate PCM,,Использовать с частотой PCM, -Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,,Anzahl OPL Chips,Número de chips OPL emulados,,Puces OPL émulées,,Numero di chip OPL emulati,,Количество эмулируемых чипов OPL, +Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,,Anzahl OPL Chips,Número de chips OPL emulados,,Puces OPL émulées,,Numero di chip OPL emulati,,Количество эмулируемых OPL-чипов, Volume model,ADVSNDMNU_VLMODEL,,,,,Lautstärkemodell,Modelo de Volumen,,Modèle de Volume,,Modello di volume,,Модель громкости, Number of emulated OPN chips,ADVSNDMNU_OPNNUMCHIPS,,,,,Anzahl OPN Chips,Número de chip OPN emulados,,Puces OPN émulées,,Numero di chip OPN emulati,,Количество эмулируемых чипов OPN, Use custom WOPL bank,ADVSNDMNU_ADLCUSTOMBANK,,,,,Benutzerdefinierte WOPL Bank,Utilizar banco WOPL personalizado,,Utiliser Banque WOPL perso,,Usa WOPL bank personalizzato,,Использовать собственный банк WOPL, @@ -2778,7 +2778,7 @@ Warning: The Vulkan renderer is highly experimental!,VK_WARNING,,,,,Achtung: Der These options will require a restart to take effect.,VK_RESTART,,,,,Diese Option erfordert einen Neustart!,Estas opciones requieren reiniciar para tener efecto.,,Ces options nécessitent un redémarrage.,,Queste opzioni richiedono il riavvio per avere effetto.,,Для применения изменений требуется рестарт., Select Vulkan Device,VKMNU_DEVICESELECT,This is not yet implemented - but it is planned,,,,Vulkan Gerät auswählen,Seleccionar Dispositivo Vulkan,,Sélectionner périphérique Vulkan,,Seleziona il Dispositivo Vulkan,,Выберите устройство Vulkan, Press any key or click anywhere in the window to quit.,TXT_QUITENDOOM,,,,,Drücke eine Taste oder klicke mit der Maus ins Fenster zum Beenden.,Presiona una tecla o haz click en cualquier lugar de la ventana para salir.,Presiona una tecla o da click en cualquier lugar de la ventana para salir.,Appuyez sur une touche ou cliquez pour quitter.,,Premi un qualunque tasto o fai un click ovunque nella finestra per uscire.,,Нажмите любую клавишу или кликните по окну чтобы выйти., -No vertical thrust from explosions,CMPTMNU_EXPLODE1,,,,,Keine vertikale Bewegung durch Explosionen,No causar empuje vertical en explosiones,,Explosions sans propulsion verticale,,Nessuna spinta verticale dalle esplosioni,,Без вертикальной тяги от взрывов, +No vertical thrust from explosions,CMPTMNU_EXPLODE1,,,,,Keine vertikale Bewegung durch Explosionen,No causar empuje vertical en explosiones,,Explosions sans propulsion verticale,,Nessuna spinta verticale dalle esplosioni,,Взрывы не отбрасывают вверх/вниз, Use original Doom explosion behavior,CMPTMNU_EXPLODE2,,,Use original Doom explosion behaviour,,Benutze Original Doom Explosionsverhalten,Usar comportamiento de explosiones del DOOM original,,Utiliser comportement Doom original,,Usa l'originale comportamento dell'esplosione di Doom,,Использовать модель взрывов из оригинального Doom., Screen Blend Options,HUDMNU_FLASH,,,,,Überblendoptionen,,,Options de blending écran,,Opzioni Blending dello Schermo,,Настройки смешивания экрана, Postprocessing,GLMNU_POSTPROCESS,,,,,,Postprocesado,,,,,,Постобработка,