From 877842e413daf830114939dc6915d225c40197c3 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Sat, 8 Jun 2013 22:44:53 +0200 Subject: Fixed MessageIn::getUnreadLength It should not return large numbers after reading past the end of a message. This can cause infinite loops in several places in the client when a message happened to be shorter than expected. --- src/net/manaserv/messagein.h | 5 ++++- src/net/tmwa/messagein.h | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/net/manaserv/messagein.h b/src/net/manaserv/messagein.h index 89ae5ed8..1edc4fe7 100644 --- a/src/net/manaserv/messagein.h +++ b/src/net/manaserv/messagein.h @@ -52,7 +52,10 @@ class MessageIn /** * Returns the length of unread data. */ - unsigned int getUnreadLength() const { return mLength - mPos; } + unsigned int getUnreadLength() const + { + return (mPos < mLength) ? mLength - mPos : 0; + } /** * Reads an unsigned 8-bit integer from the message. diff --git a/src/net/tmwa/messagein.h b/src/net/tmwa/messagein.h index 48121187..2f66ca28 100644 --- a/src/net/tmwa/messagein.h +++ b/src/net/tmwa/messagein.h @@ -50,7 +50,10 @@ class MessageIn /** * Returns the length of unread data. */ - unsigned int getUnreadLength() const { return mLength - mPos; } + unsigned int getUnreadLength() const + { + return (mPos < mLength) ? mLength - mPos : 0; + } /** * Reads an unsigned 8-bit integer from the message. -- cgit v1.2.3-60-g2f50 From e9acfcfc6bd78f90c5eee6a0ffa0a924e6d61a27 Mon Sep 17 00:00:00 2001 From: Kenny690 Date: Sat, 15 Jun 2013 11:00:23 +0200 Subject: Updated russian translation --- po/ru.po | 837 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 407 insertions(+), 430 deletions(-) diff --git a/po/ru.po b/po/ru.po index dd117c6d..6f344fef 100644 --- a/po/ru.po +++ b/po/ru.po @@ -2,41 +2,39 @@ # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the mana package. # FIRST AUTHOR , 2008. +# Kenny690 , 2013. # msgid "" msgstr "" "Project-Id-Version: mana\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-08 16:46+0100\n" -"PO-Revision-Date: 2011-02-23 01:02+0500\n" -"Last-Translator: Mpa4Hu \n" -"Language-Team: Russian \n" +"PO-Revision-Date: 2013-06-15 14:34+0600\n" +"Last-Translator: Kenny690 \n" +"Language-Team: русский \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Launchpad-Export-Date: 2010-03-05 19:28+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/main.cpp:45 msgid " to the mana client." -msgstr "" +msgstr " mana клиента ." #: ../src/main.cpp:44 msgid " used to set custom parameters" -msgstr "" +msgstr " Используется для свободной настройки" #: ../src/main.cpp:62 msgid " --chat-log-dir : Chat log dir to use" -msgstr "" +msgstr " --chat-log-dir : Директория для сохранения чата" #: ../src/main.cpp:61 msgid " --localdata-dir : Directory to use as local data directory" -msgstr "" -" --localdata-dir : Директория для использования в качестве локальных " -"данных" +msgstr " --localdata-dir : Директория для сохранения локальных данных" #: ../src/main.cpp:65 msgid " --no-opengl : Disable OpenGL for this session" @@ -48,15 +46,15 @@ msgstr " --screenshot-dir : Директория для скриншотов #: ../src/main.cpp:56 msgid " --update-host : Use this update host" -msgstr " --update-host : Use this update host" +msgstr " --update-host : Используйте для обновления хоста" #: ../src/main.cpp:50 msgid " -C --config-dir : Configuration directory to use" -msgstr " -C --config-dir : конфигурация директории" +msgstr " -C --config-dir : конфигурация используемой директории" #: ../src/main.cpp:57 msgid " -D --default : Choose default character server and character" -msgstr " -D --default : Выберите сервер и персонажа по умолчанию" +msgstr " -D --default : Выберать сервер и персонажа по умолчанию" #: ../src/main.cpp:52 msgid " -P --password : Login with this password" @@ -64,7 +62,7 @@ msgstr " -P --password : Войти с этим паролем" #: ../src/main.cpp:51 msgid " -U --username : Login with this username" -msgstr " -U --username : Войти с именем пользователя" +msgstr " -U --username : Войти с эти именем пользователя" #: ../src/main.cpp:53 msgid " -c --character : Login with this character" @@ -80,7 +78,7 @@ msgstr " -h --help : Отображает этот текст" #: ../src/main.cpp:55 msgid " -p --port : Login server port" -msgstr " -p --port : порт сервера" +msgstr " -p --port : Порт сервера" #: ../src/main.cpp:54 msgid " -s --server : Login server name or IP" @@ -88,16 +86,16 @@ msgstr " -s --server : Имя сервера или IP" #: ../src/main.cpp:59 msgid " -u --skip-update : Skip the update downloads" -msgstr " -u --skip-update : пропустить скачивание обновлений" +msgstr " -u --skip-update : Пропустить скачивание обновлений" #: ../src/main.cpp:48 msgid " -v --version : Display the version" -msgstr " -v --version : показать версию" +msgstr " -v --version : Показать версию" #: ../src/net/manaserv/partyhandler.cpp:126 #, c-format msgid " on invitation from %s" -msgstr "" +msgstr " приглашен пользователем %s" #: ../src/gui/updaterwindow.cpp:421 msgid "##1 It is strongly recommended that" @@ -105,26 +103,26 @@ msgstr "##1 Настоятельно рекомендуется" #: ../src/gui/updaterwindow.cpp:419 msgid "##1 The update process is incomplete." -msgstr "##1 Процесс обновления не завершен!" +msgstr "##1 Процесс обновления не завершен." #: ../src/gui/updaterwindow.cpp:423 msgid "##1 you try again later." -msgstr "##1 попробуйте позднее." +msgstr "##1 попробовать позднее." #: ../src/net/tmwa/generalhandler.cpp:245 -#, fuzzy, no-c-format +#, no-c-format msgid "% Accuracy" msgstr "% Точность" #: ../src/net/tmwa/generalhandler.cpp:249 -#, fuzzy, no-c-format +#, no-c-format msgid "% Critical" msgstr "% Критический" #: ../src/net/tmwa/generalhandler.cpp:247 -#, fuzzy, no-c-format +#, no-c-format msgid "% Evade" -msgstr "% Уварот" +msgstr "% Уворот" #: ../src/gui/debugwindow.cpp:59 #, c-format @@ -139,22 +137,22 @@ msgstr "%d FPS (OpenGL)" #: ../src/client.cpp:1160 ../src/client.cpp:1188 #, c-format msgid "%s doesn't exist and can't be created! Exiting." -msgstr "" +msgstr "%s не существует и не может быть создан! Выход." #: ../src/net/manaserv/chathandler.cpp:314 #, c-format msgid "%s entered the channel." -msgstr "%s вступил в канал" +msgstr "%s вошел в канал." #: ../src/gui/socialwindow.cpp:601 #, c-format msgid "%s has invited you to join the %s party." -msgstr "%s приглашает присоединиться к %s группе." +msgstr "%s приглашает присоединиться к группе \"%s\"." #: ../src/gui/socialwindow.cpp:558 #, c-format msgid "%s has invited you to join the guild %s." -msgstr "%s приглашает присоединиться в гильдию к %s ." +msgstr "%s приглашает присоединиться в гильдию \"%s\"." #: ../src/gui/socialwindow.cpp:596 #, c-format @@ -164,27 +162,27 @@ msgstr "%s приглашает вас к себе в группу." #: ../src/net/manaserv/chathandler.cpp:345 #, c-format msgid "%s has kicked %s." -msgstr "" +msgstr "%s кикнул %s" #: ../src/net/tmwa/partyhandler.cpp:247 #, c-format msgid "%s has left your party." -msgstr "%s вышел из группы" +msgstr "%s вышел из группы." #: ../src/net/manaserv/chathandler.cpp:335 #, c-format msgid "%s has set mode %s on user %s." -msgstr "" +msgstr "%s использовал %s на пользователе %s" #: ../src/net/tmwa/partyhandler.cpp:120 #, c-format msgid "%s is already a member of a party." -msgstr "%s уже является членом группы" +msgstr "%s уже является членом группы." #: ../src/net/manaserv/partyhandler.cpp:157 -#, fuzzy, c-format +#, c-format msgid "%s is already in a party." -msgstr "%s уже является членом группы" +msgstr "%s уже является членом группы." #: ../src/net/tmwa/partyhandler.cpp:369 #, c-format @@ -197,14 +195,14 @@ msgid "%s is now a member of your party." msgstr "%s теперь является членом вашей группы." #: ../src/net/manaserv/partyhandler.cpp:128 -#, fuzzy, c-format +#, c-format msgid "%s joined the party%s." -msgstr "%s теперь в группе." +msgstr "%s присоединился к группе %s." #: ../src/net/manaserv/chathandler.cpp:319 #, c-format msgid "%s left the channel." -msgstr "" +msgstr "%s покинул канал." #: ../src/net/tmwa/partyhandler.cpp:124 #, c-format @@ -220,7 +218,7 @@ msgstr "%s отклонил ваше приглашение." #: ../src/net/tmwa/tradehandler.cpp:110 #, c-format msgid "%s wants to trade with you, do you accept?" -msgstr "%s хочет торговатся с вами, вы принимаете?" +msgstr "%s хочет поторговаться с вами, вы принимаете?" #: ../src/gui/widgets/chattab.cpp:190 #, c-format @@ -253,11 +251,11 @@ msgstr "-- Помощь --" #: ../src/commandhandler.cpp:200 msgid "/announce > Global announcement (GM only)" -msgstr "/announce > Глобальное извещение (доступно только админу)" +msgstr "/announce > Глобальное извещение (доступно только для GM)" #: ../src/commandhandler.cpp:181 msgid "/away > Tell the other whispering players you're away from keyboard." -msgstr "" +msgstr "/away > Сказать всем шепчущимся игрокам, что вы отошли." #: ../src/commandhandler.cpp:172 msgid "/clear > Clears this window" @@ -265,7 +263,7 @@ msgstr "/clear > Очищает это окно" #: ../src/gui/widgets/whispertab.cpp:74 msgid "/close > Close the whisper tab" -msgstr "/close > Закрыть вкладку перешептывания" +msgstr "/close > Закрыть вкладку перешептывания." #: ../src/commandhandler.cpp:190 msgid "/createparty > Create a new party" @@ -273,7 +271,7 @@ msgstr "/createparty > Создать группу" #: ../src/net/tmwa/gui/partytab.cpp:64 msgid "/exp > Show/change party experience sharing options" -msgstr "/exp > Показать/Скрыть текущее состояние распределения опыта в группе" +msgstr "/exp > Показать/скрыть текущее состояние распределения опыта в группе." #: ../src/commandhandler.cpp:166 msgid "/help > Display this help" @@ -281,15 +279,15 @@ msgstr "/help > Отображает этот текст" #: ../src/net/tmwa/gui/guildtab.cpp:61 ../src/net/tmwa/gui/partytab.cpp:59 msgid "/help > Display this help." -msgstr "/help > Показать сию справку" +msgstr "/help > Показать эту справку" #: ../src/gui/widgets/whispertab.cpp:72 msgid "/ignore > Ignore the other player" -msgstr "/ignore > Игнорировать игрока" +msgstr "/ignore > Игнорировать другого игрока" #: ../src/commandhandler.cpp:184 msgid "/ignore > ignore a player" -msgstr "/ignore > игнорировать игрока" +msgstr "/ignore > Игнорировать игрока" #: ../src/net/tmwa/gui/guildtab.cpp:62 msgid "/invite > Invite a player to your guild" @@ -302,7 +300,7 @@ msgstr "/invite > Пригласить игрока в вашу группу" #: ../src/net/tmwa/gui/partytab.cpp:63 msgid "/item > Show/change party item sharing options" msgstr "" -"/item > Показать/Скрыть текущее состояние распределения предметов в группе" +"/item > Показать/cкрыть текущее состояние распределения предметов в группе" #: ../src/commandhandler.cpp:188 msgid "/join > Join or create a channel" @@ -310,15 +308,15 @@ msgstr "/join > Создать или присоединиться к канал #: ../src/gui/widgets/channeltab.cpp:52 msgid "/kick > Kick a user from the channel" -msgstr "/kick > Вышвырнуть пользователя с канала" +msgstr "/kick > Кикнуть пользователя с канала" #: ../src/net/tmwa/gui/guildtab.cpp:64 msgid "/kick > Kick some one from the guild you are in" -msgstr "/kick > Вышвырнуть кого-либо из вашей текущей гильдии" +msgstr "/kick > Кикнуть кого-либо из вашей текущей гильдии" #: ../src/net/tmwa/gui/partytab.cpp:62 msgid "/kick > Kick some one from the party you are in" -msgstr "/kick > Вышвырнуть кого-либо из вашей текущей группы" +msgstr "/kick > Кикнуть кого-либо из вашей текущей группы" #: ../src/net/tmwa/gui/guildtab.cpp:63 msgid "/leave > Leave the guild you are in" @@ -330,7 +328,7 @@ msgstr "/leave > Покинуть текущую группу" #: ../src/commandhandler.cpp:187 msgid "/list > Display all public channels" -msgstr "/list > Показать список каналов" +msgstr "/list > Показать список публичных каналов" #: ../src/commandhandler.cpp:170 msgid "/me > Tell something about yourself" @@ -351,16 +349,16 @@ msgstr "Пригласить пользователя на канал" #: ../src/commandhandler.cpp:197 msgid "/present > Get list of players present (sent to chat log, if logging)" msgstr "" -"/present > Показывает список игроков он-лайн (посылается в окно чата, если " +"/present > Показывает список игроков онлайн (посылается в окно чата, если " "включен лог)" #: ../src/commandhandler.cpp:179 msgid "/q > Alias of query" -msgstr "/q> Вариант query" +msgstr "/q> Псевдоним запроса" #: ../src/commandhandler.cpp:177 msgid "/query > Makes a tab for private messages with another user" -msgstr "/query> Создает вкладку для чата с пользователем." +msgstr "/query> Создает вкладку для приватного чата с пользователем." #: ../src/gui/widgets/channeltab.cpp:50 msgid "/quit > Leave a channel" @@ -372,7 +370,7 @@ msgstr "/record > Записывать чат во внешний файл" #: ../src/commandhandler.cpp:195 msgid "/toggle > Determine whether toggles the chat log" -msgstr "" +msgstr "/toggle > Определяет переключает ли чат." #: ../src/gui/widgets/channeltab.cpp:49 msgid "/topic > Set the topic of the current channel" @@ -380,7 +378,7 @@ msgstr "/topic > Задать тему текущего канала" #: ../src/gui/widgets/whispertab.cpp:73 msgid "/unignore > Stop ignoring the other player" -msgstr "/unignore > Прекратить игнорировать игрока" +msgstr "/unignore > Прекратить игнорировать другого игрока" #: ../src/commandhandler.cpp:185 msgid "/unignore > stop ignoring a player" @@ -404,7 +402,7 @@ msgstr "/whisper > Вариант команды msg" #: ../src/commandhandler.cpp:169 msgid "/who > Display number of online users" -msgstr "/who > Отображает количество пользователей он-лайн" +msgstr "/who > Отображает количество пользователей онлайн" #: ../src/gui/outfitwindow.cpp:66 msgid "<" @@ -415,20 +413,24 @@ msgid "" " can be one of \"1\", \"yes\", \"true\" to enable experience " "sharing, or \"0\", \"no\", \"false\" to disable experience sharing." msgstr "" +" Может быть только \"1\", \"yes\", \"true\" чтобы включить передачу " +"опыта или \"0\", \"no\", \"false\" для прекращения передачи опыта." #: ../src/net/tmwa/gui/partytab.cpp:87 msgid "" " can be one of \"1\", \"yes\", \"true\" to enable item sharing, or " "\"0\", \"no\", \"false\" to disable item sharing." msgstr "" +" может быть только \"1\", \"yes\", \"true\" для включения передачи " +"предметов, или \"0\", \"no\", \"false\" для отключения передачи предметов." #: ../src/commandhandler.cpp:308 msgid "" " can be one of \"1\", \"yes\", \"true\" to turn the toggle on, or " "\"0\", \"no\", \"false\" to turn the toggle off." msgstr "" -"<режим> может быть \"1\", \"yes\", \"true\" дабы включить опцию или \"0\", " -"\"no\", \"false\" чтобы выключить." +" может быть \"1\", \"yes\", \"true\" для включения опции или \"0\", " +"\"no\", \"false\" для выключения." #: ../src/gui/outfitwindow.cpp:67 msgid ">" @@ -447,14 +449,13 @@ msgid "Accept Party Invite" msgstr "Принять приглашение в группу" #: ../src/gui/socialwindow.cpp:463 -#, fuzzy msgid "Accepted guild invite" -msgstr "Принять приглашение в гильдию" +msgstr "Принятое приглашение в гильдию" #: ../src/gui/socialwindow.cpp:444 #, c-format msgid "Accepted party invite from %s." -msgstr "Принято приглашение от %s." +msgstr "Принято приглашение в группу от %s." #: ../src/game.cpp:709 msgid "Accepting incoming trade requests" @@ -462,12 +463,11 @@ msgstr "Принимать предложения о торговле" #: ../src/net/manaserv/tradehandler.cpp:95 msgid "Accepting incoming trade requests." -msgstr "Входящих запросов торговли принимаются." +msgstr "Принимать предложения о торговле." #: ../src/net/tmwa/charserverhandler.cpp:103 msgid "Access denied. Most likely, there are too many players on this server." -msgstr "" -"Отказано в доступе. Скорее всего, слишком много игроков на этом сервере." +msgstr "Отказано в доступе. Скорее всего, на сервере слишком много игроков." #: ../src/gui/charselectdialog.cpp:120 msgid "Account and Character Management" @@ -483,21 +483,21 @@ msgstr "Учётная запись заблокирована" #: ../src/net/tmwa/loginhandler.cpp:162 msgid "Account expired." -msgstr "" +msgstr "Учётной записи просрочена." #: ../src/net/manaserv/loginhandler.cpp:129 #: ../src/net/manaserv/loginhandler.cpp:160 msgid "Account not connected. Please login first." -msgstr "" +msgstr "Аккаунт не подключен. Пожалуйста, сперва залогиньтесь." #: ../src/net/tmwa/loginhandler.cpp:86 msgid "Account was not found. Please re-login." -msgstr "" +msgstr "Аккаунт не найден. Пожалуйста залогиньтесь снова." #: ../src/gui/changeemaildialog.cpp:49 ../src/gui/changepassworddialog.cpp:52 #, c-format msgid "Account: %s" -msgstr "Учётная запись: %s" +msgstr "Аккаунт: %s" #: ../src/gui/inventorywindow.cpp:107 ../src/gui/popupmenu.cpp:378 msgid "Activate" @@ -508,13 +508,12 @@ msgid "Add" msgstr "Добавить" #: ../src/gui/serverdialog.cpp:211 -#, fuzzy msgid "Add custom Server..." -msgstr "Собственный сервер" +msgstr "Добавить свой сервер" #: ../src/gui/popupmenu.cpp:175 msgid "Add name to chat" -msgstr "Добавить в чат" +msgstr "Добавить имя в чат" #: ../src/gui/popupmenu.cpp:194 ../src/gui/popupmenu.cpp:399 msgid "Add to chat" @@ -522,7 +521,7 @@ msgstr "Добавить в чат" #: ../src/gui/customserverdialog.cpp:55 msgid "Address:" -msgstr "" +msgstr "Адрес:" #: ../src/net/manaserv/attributes.cpp:179 #: ../src/net/tmwa/generalhandler.cpp:231 @@ -530,9 +529,9 @@ msgid "Agility" msgstr "Ловкость" #: ../src/net/manaserv/attributes.cpp:186 -#, fuzzy, c-format +#, c-format msgid "Agility %+.1f" -msgstr "Ловкость %+d" +msgstr "Ловкость %+.1f" #: ../src/net/tmwa/generalhandler.cpp:103 #, c-format @@ -561,7 +560,7 @@ msgstr "Разрешить торговлю" #: ../src/gui/setup_players.cpp:226 msgid "Allow whispers" -msgstr "Разрешить шептание" +msgstr "Разрешить шепот" #: ../src/net/manaserv/loginhandler.cpp:95 #: ../src/net/manaserv/loginhandler.cpp:280 @@ -573,9 +572,8 @@ msgid "Already recording." msgstr "Запись уже ведётся." #: ../src/gui/setup_video.cpp:191 -#, fuzzy msgid "Ambient FX:" -msgstr "Эффекты окружающей среды" +msgstr "Эффекты окружающей среды:" #: ../src/net/tmwa/inventoryhandler.h:84 msgid "Ammo" @@ -589,7 +587,7 @@ msgstr "Неизвестный член хотел сказать: %s" #: ../src/net/manaserv/beinghandler.cpp:289 #: ../src/net/tmwa/playerhandler.cpp:113 msgid "Annihilated." -msgstr "Уничтожены." +msgstr "Аннигилированы." #: ../src/gui/setup.cpp:52 msgid "Apply" @@ -604,8 +602,8 @@ msgid "" "Applying change to OpenGL requires restart. In case OpenGL messes up your " "game graphics, restart the game with the command line option \"--no-opengl\"." msgstr "" -"Применение изменений в OpenGL требует перезапуски. В случае, если OpenGL не " -"будет работать, перезагрузите игру с параметром командной строки \"--no-" +"Переход к OpenGL требует перезагрузки. В случае, если из-за OpenGL " +"изображение портится, перезагрузите игру из командной строки с опцией \"--no-" "opengl\"." #: ../src/gui/charselectdialog.cpp:73 @@ -615,7 +613,7 @@ msgstr "Вы уверены, что хотите удалить этого пе #: ../src/gui/socialwindow.cpp:164 #, c-format msgid "Are you sure you want to leave guild %s?" -msgstr "Вы действительно хотите покинуть %s?" +msgstr "Вы действительно хотите покинуть гильдию %s?" #: ../src/gui/socialwindow.cpp:243 #, c-format @@ -624,7 +622,7 @@ msgstr "Вы действительно хотите покинуть групп #: ../src/net/tmwa/inventoryhandler.h:66 msgid "Arms" -msgstr "" +msgstr "Руки" #: ../src/gui/setup_keyboard.cpp:89 msgid "Assign" @@ -634,6 +632,7 @@ msgstr "Назначить" #, c-format msgid "At least one statis out of the permitted range: (%u - %u)." msgstr "" +"По крайней мере один статический объект вышел из дозволенной зоны: (%u - %u)" #: ../src/keyboardconfig.cpp:45 ../src/net/tmwa/generalhandler.cpp:238 msgid "Attack" @@ -651,7 +650,7 @@ msgstr "Атаковать %s" #: ../src/gui/chatwindow.cpp:334 msgid "Attendance written to record log." -msgstr "" +msgstr "Посещаемость записана в журнал." #: ../src/gui/setup_audio.cpp:47 msgid "Audio" @@ -663,37 +662,36 @@ msgstr "Ошибка авторизации." #: ../src/localplayer.cpp:1071 msgid "Away" -msgstr "" +msgstr "Отошел" #: ../src/gui/popupmenu.cpp:101 #, c-format msgid "Befriend %s" -msgstr "" +msgstr "Стать другом %s" #: ../src/resources/userpalette.cpp:91 msgid "Being" -msgstr "" +msgstr "Местонахождения" #: ../src/gui/debugwindow.cpp:136 -#, fuzzy msgid "Being collision radius" -msgstr "Радиус прокрутки" +msgstr "Радиус местонахождения" #: ../src/gui/debugwindow.cpp:138 msgid "Being path" -msgstr "" +msgstr "Путь до местонахождения" #: ../src/gui/debugwindow.cpp:137 msgid "Being positions" -msgstr "" +msgstr "Позиция местонахождения" #: ../src/net/tmwa/playerhandler.cpp:125 msgid "Bereft of life, you rest in peace." -msgstr "" +msgstr "Лишенный жизни, покойся с миром." #: ../src/playerrelations.cpp:358 ../src/playerrelations.cpp.orig:344 msgid "Blink name" -msgstr "" +msgstr "Название вспышки" #: ../src/gui/setup_colors.cpp:140 msgid "Blue:" @@ -705,7 +703,7 @@ msgstr "Пузырьки с названиями" #: ../src/gui/setup_interface.cpp:90 msgid "Bubbles, no names" -msgstr "Пузырьки, без названий" +msgstr "Пузырьки без названий" #: ../src/gui/buydialog.cpp:50 ../src/gui/buydialog.cpp:79 #: ../src/gui/buyselldialog.cpp:47 @@ -734,8 +732,8 @@ msgid "" "Cannot create a whisper tab for nick \"%s\"! It either already exists, or is " "you." msgstr "" -"Невозможно создать вкладку для личного общения с игроком \"%s\"! Или вкладка " -"уже создана, или этот игрок вы сами." +"Невозможно создать вкладку для приватного общения с игроком \"%s\"! Или " +"вкладка уже создана, или этот игрок: вы." #: ../src/gui/socialwindow.cpp:620 msgid "Cannot create party. You are already in a party" @@ -747,19 +745,19 @@ msgstr "Невозможно повысить умение!" #: ../src/gui/widgets/whispertab.cpp:53 msgid "Cannot send empty chat!" -msgstr "Низзя послать пустое сообщение!" +msgstr "Нельзя послать пустое сообщение!" #: ../src/commandhandler.cpp:400 msgid "Cannot send empty whispers!" -msgstr "Нельзя отправлять пустые сообщения!" +msgstr "Нельзя отправлять пустые личные сообщения!" #: ../src/net/tmwa/specialhandler.cpp:160 msgid "Cannot shout!" -msgstr "" +msgstr "Нельзя кричать!" #: ../src/net/tmwa/charserverhandler.cpp:107 msgid "Cannot use this ID." -msgstr "Низзя использовать данный ID." +msgstr "Нельзя использовать данный ID." #: ../src/gui/tradewindow.cpp:103 msgid "Change" @@ -801,7 +799,8 @@ msgstr "Переключение на OpenGL" #: ../src/gui/widgets/channeltab.cpp:83 msgid "Channel operators can kick and op other users from the channel." msgstr "" -"Операторы канала могут вышвыривать пользователей и делать их операторами." +"Операторы канала могут кикнуть или сделать операторами других пользователей " +"канала." #: ../src/net/tmwa/chathandler.cpp:265 ../src/net/tmwa/chathandler.cpp:271 #: ../src/net/tmwa/chathandler.cpp:276 ../src/net/tmwa/chathandler.cpp:281 @@ -833,7 +832,7 @@ msgstr "Данные персонажа слишком высоки." #: ../src/net/manaserv/charhandler.cpp:164 msgid "Character's stats are too low." -msgstr "Данные персонажа слишком низки" +msgstr "Данные персонажа слишком низки." #: ../src/gui/chatwindow.cpp:92 msgid "Chat" @@ -852,13 +851,12 @@ msgid "Choose" msgstr "Выбрать" #: ../src/gui/worldselectdialog.cpp:77 -#, fuzzy msgid "Choose World" -msgstr "Выберите сервер" +msgstr "Выберите Мир" #: ../src/gui/serverdialog.cpp:188 msgid "Choose Your Server" -msgstr "Выберите сервер" +msgstr "Выберите Сервер" #: ../src/gui/socialwindow.cpp:541 msgid "Choose your guild's name." @@ -876,11 +874,12 @@ msgstr "Очистить запись" msgid "" "Client registration is not allowed. Please contact server administration." msgstr "" +"Регистрация клиентов не разрешена. Пожалуйста, проконтактируйте " +"администратора." #: ../src/net/tmwa/loginhandler.cpp:172 -#, fuzzy msgid "Client too old." -msgstr "Версия клиента устарела." +msgstr "Клиент устарел." #: ../src/net/manaserv/loginhandler.cpp:274 #: ../src/net/manaserv/loginhandler.cpp:311 @@ -893,7 +892,7 @@ msgstr "Закрыть" #: ../src/gui/debugwindow.cpp:135 msgid "Collision tiles" -msgstr "" +msgstr "Тайлы с коллизией." #: ../src/gui/setup_colors.cpp:52 msgid "Colors" @@ -904,14 +903,12 @@ msgid "Command: /announce " msgstr "Команда: /announce <сообщение>" #: ../src/commandhandler.cpp:273 -#, fuzzy msgid "Command: /away" -msgstr "Команда: /who" +msgstr "Команда: /away" #: ../src/commandhandler.cpp:270 -#, fuzzy msgid "Command: /away " -msgstr "Команда: /w <ник> <сообщение>" +msgstr "Команда: /away <причина ухода>" #: ../src/commandhandler.cpp:227 msgid "Command: /clear" @@ -927,11 +924,11 @@ msgstr "Комманда: /createparty <имя_группы>" #: ../src/net/tmwa/gui/partytab.cpp:100 msgid "Command: /exp" -msgstr "" +msgstr "Команда: /exp" #: ../src/net/tmwa/gui/partytab.cpp:95 msgid "Command: /exp " -msgstr "" +msgstr "Команда: /exp <политика>" #: ../src/commandhandler.cpp:208 msgid "Command: /help" @@ -947,19 +944,19 @@ msgstr "Команда: /ignore" #: ../src/commandhandler.cpp:232 msgid "Command: /ignore " -msgstr "Комманда: /ignore <пользователь>" +msgstr "Команда: /ignore <пользователь>" #: ../src/net/tmwa/gui/guildtab.cpp:73 ../src/net/tmwa/gui/partytab.cpp:73 msgid "Command: /invite " -msgstr "Комманда: /invite <игрок>" +msgstr "Команда: /invite <ник>" #: ../src/net/tmwa/gui/partytab.cpp:90 msgid "Command: /item" -msgstr "" +msgstr "Команда: /item" #: ../src/net/tmwa/gui/partytab.cpp:85 msgid "Command: /item " -msgstr "" +msgstr "Команда: /item <политика>" #: ../src/commandhandler.cpp:238 msgid "Command: /join " @@ -967,11 +964,11 @@ msgstr "Команда: /join <канал>" #: ../src/gui/widgets/channeltab.cpp:88 msgid "Command: /kick " -msgstr "Комманда: /kick <имя персонажа>" +msgstr "Команда: /kick <имя персонажа>" #: ../src/net/tmwa/gui/guildtab.cpp:80 ../src/net/tmwa/gui/partytab.cpp:80 msgid "Command: /leave" -msgstr "Комманда: /leave" +msgstr "Команда: /leave" #: ../src/commandhandler.cpp:244 msgid "Command: /list" @@ -979,23 +976,23 @@ msgstr "Команда: /list" #: ../src/commandhandler.cpp:249 msgid "Command: /me " -msgstr "Комманда: /me <сообщение>" +msgstr "Команда: /me <сообщение>" #: ../src/commandhandler.cpp:254 msgid "Command: /msg " -msgstr "Комманда: /msg <имя персонажа> <сообщение>" +msgstr "Команда: /msg <имя персонажа> <сообщение>" #: ../src/gui/widgets/channeltab.cpp:79 msgid "Command: /op " -msgstr "Комманда: /op <имя>" +msgstr "Команда: /op <имя>" #: ../src/commandhandler.cpp:283 msgid "Command: /party " -msgstr "Комманда: /party <имя>" +msgstr "Команда: /party <имя>" #: ../src/commandhandler.cpp:290 msgid "Command: /present" -msgstr "Комманда: /present" +msgstr "Команда: /present" #: ../src/commandhandler.cpp:264 msgid "Command: /q " @@ -1007,7 +1004,7 @@ msgstr "Команда: /query <имя персонажа>" #: ../src/gui/widgets/channeltab.cpp:72 msgid "Command: /quit" -msgstr "Комманда: /quit" +msgstr "Команда: /quit" #: ../src/commandhandler.cpp:300 msgid "Command: /record" @@ -1023,19 +1020,19 @@ msgstr "Команда: /toggle" #: ../src/commandhandler.cpp:305 msgid "Command: /toggle " -msgstr "Комманда: /toggle <режим>" +msgstr "Команда: /toggle <режим>" #: ../src/gui/widgets/channeltab.cpp:67 msgid "Command: /topic " -msgstr "Комманда: /topic <сообщение>" +msgstr "Команда: /topic <сообщение>" #: ../src/commandhandler.cpp:316 ../src/gui/widgets/whispertab.cpp:95 msgid "Command: /unignore " -msgstr "Комманда: /unignore <имя_игрока>" +msgstr "Команда: /unignore <имя_игрока>" #: ../src/gui/widgets/channeltab.cpp:62 msgid "Command: /users" -msgstr "Комманды: /users" +msgstr "Команда: /users" #: ../src/commandhandler.cpp:256 msgid "Command: /w " @@ -1105,16 +1102,16 @@ msgstr "Соединение..." #: ../src/net/tmwa/network.cpp:405 msgid "Connection to server terminated. " -msgstr "Подключение к карт прекращено" +msgstr "Подключение к серверу прекращено." #: ../src/keyboardconfig.cpp:84 msgid "Copy Outfit" -msgstr "" +msgstr "Скопировать наряд" #: ../src/gui/statuswindow.cpp:260 -#, fuzzy, c-format +#, c-format msgid "Correction points: %d" -msgstr "Очков навыков: %d" +msgstr "Очков корректировки: %d" #: ../src/game.cpp:937 msgid "Could Not Load Map" @@ -1125,9 +1122,8 @@ msgid "Could not create party." msgstr "Не удалось создать группу." #: ../src/net/tmwa/guildhandler.cpp:296 -#, fuzzy msgid "Could not invite user to guild." -msgstr "Не удалось пригласить пользователя в гильдию." +msgstr "Невозможно пригласить пользователя в гильдию." #: ../src/net/tmwa/specialhandler.cpp:157 msgid "Could not join party!" @@ -1135,7 +1131,7 @@ msgstr "Невозможно присоединиться к группе!" #: ../src/net/tmwa/specialhandler.cpp:211 msgid "Could not steal anything..." -msgstr "Нечего не удалось украсть..." +msgstr "Ничего не удалось украсть..." #: ../src/gui/charcreatedialog.cpp:85 ../src/gui/charselectdialog.cpp:416 #: ../src/gui/socialwindow.cpp:330 @@ -1157,7 +1153,7 @@ msgstr "Создать группу" #: ../src/gui/socialwindow.cpp:503 #, c-format msgid "Creating guild called %s." -msgstr "Создаетса гилдия %s." +msgstr "Создание гильдии под названием %s." #: ../src/gui/socialwindow.cpp:496 msgid "Creating guild failed, please choose a shorter name." @@ -1166,11 +1162,11 @@ msgstr "Создание гильдии не удалось, пожалуйст #: ../src/gui/socialwindow.cpp:526 #, c-format msgid "Creating party called %s." -msgstr "Создание группи %s." +msgstr "Создание группы %s." #: ../src/gui/socialwindow.cpp:519 msgid "Creating party failed, please choose a shorter name." -msgstr "Создание группи не удалось, пожалуйста, выберите более короткое имя." +msgstr "Создание группы не удалось, пожалуйста, выберите более короткое имя." #: ../src/resources/userpalette.cpp:105 msgid "Critical Hit" @@ -1224,7 +1220,6 @@ msgid "Delete" msgstr "Удалить" #: ../src/gui/customserverdialog.cpp:58 -#, fuzzy msgid "Description:" msgstr "Описание: %s" @@ -1234,9 +1229,9 @@ msgid "Dexterity" msgstr "Ловкость" #: ../src/net/manaserv/attributes.cpp:199 -#, fuzzy, c-format +#, c-format msgid "Dexterity %+.1f" -msgstr "Ловкость %+d" +msgstr "Ловкость %+.1f" #: ../src/net/tmwa/generalhandler.cpp:106 #, c-format @@ -1254,16 +1249,16 @@ msgstr "Отключить прозрачность (режим низкой н #: ../src/gui/popupmenu.cpp:106 #, c-format msgid "Disregard %s" -msgstr "" +msgstr "Игнорировать %s" #: ../src/gui/setup_players.cpp:66 msgid "Disregarded" -msgstr "" +msgstr "Проигнорирован" #: ../src/net/manaserv/beinghandler.cpp:287 #: ../src/net/tmwa/playerhandler.cpp:109 msgid "Do you want your possessions identified?" -msgstr "" +msgstr "Вы хотите, чтобы вашу собственность идентифицировали?" #: ../src/gui/setup_audio.cpp:43 msgid "Download music" @@ -1272,7 +1267,7 @@ msgstr "Скачать музыку" #: ../src/gui/serverdialog.cpp:404 #, c-format msgid "Downloading server list...%2.2f%%" -msgstr "Загрузка список серверов...%2.2f%%" +msgstr "Загрузка списка серверов...%2.2f%%" #: ../src/gui/inventorywindow.cpp:381 ../src/gui/popupmenu.cpp:385 msgid "Drop" @@ -1289,15 +1284,15 @@ msgstr "Дублированный логин." #: ../src/client.cpp:941 msgid "Email Change" -msgstr "Сменить E-MAIL" +msgstr "Сменить email." #: ../src/net/manaserv/loginhandler.cpp:320 msgid "Email address already exists." -msgstr "E-mail уже зарегистрирован." +msgstr "Email адрес уже зарегистрирован." #: ../src/client.cpp:942 msgid "Email changed successfully!" -msgstr "E-mail успешно изменена!" +msgstr "E-mail успешно изменен!" #: ../src/gui/register.cpp:100 msgid "Email:" @@ -1323,12 +1318,11 @@ msgstr "Эмоция не удалась!" #: ../src/net/tmwa/network.cpp:146 msgid "Empty address given to Network::connect()!" -msgstr "" +msgstr "Дан пустой адрес к Network::connect()!" #: ../src/gui/setup_players.cpp:234 -#, fuzzy msgid "Enable Chat log" -msgstr "Низзя продать!" +msgstr "Включить запись чата" #: ../src/gui/setup_joystick.cpp:39 msgid "Enable joystick" @@ -1340,7 +1334,7 @@ msgstr "Разрешить/Запретить торговлю" #: ../src/net/manaserv/chathandler.cpp:229 msgid "End of channel list." -msgstr "" +msgstr "Конец списка каналов." #: ../src/gui/changepassworddialog.cpp:110 msgid "Enter the old password first." @@ -1357,7 +1351,7 @@ msgstr "Надеть" #: ../src/net/tmwa/playerhandler.cpp:507 msgid "Equip arrows first." -msgstr "Сначала оденьте стрелы" +msgstr "Сначала экипируйте стрелы." #: ../src/gui/equipmentwindow.cpp:54 ../src/gui/windowmenu.cpp:58 msgid "Equipment" @@ -1365,7 +1359,7 @@ msgstr "Снаряжение" #: ../src/keyboardconfig.cpp:73 msgid "Equipment Window" -msgstr "Окно екипировки" +msgstr "Окно экипировки" #: ../src/client.cpp:1042 ../src/gui/changeemaildialog.cpp:156 #: ../src/gui/changepassworddialog.cpp:149 ../src/gui/charcreatedialog.cpp:194 @@ -1383,18 +1377,22 @@ msgid "Error creating guild." msgstr "Ошибка создания гильдии" #: ../src/client.cpp:1326 -#, fuzzy, c-format +#, c-format msgid "" "Error creating updates directory!\n" "(%s)" -msgstr "Ошибка при создании директории обновления!" +msgstr "" +"Ошибка при создании директории обновления!\n" +"(%s)" #: ../src/client.cpp:1334 -#, fuzzy, c-format +#, c-format msgid "" "Error creating updates directory!\n" "(%s/%s)" -msgstr "Ошибка при создании директории обновления!" +msgstr "" +"Ошибка при создании директории обновления!\n" +"(%s/%s)" #: ../src/net/manaserv/chathandler.cpp:211 msgid "Error joining channel." @@ -1415,55 +1413,58 @@ msgstr "Сообщение об изменении опыта" #: ../src/gui/statuswindow.cpp:126 msgid "Exp:" -msgstr "Exp:" +msgstr "Опыт:" #: ../src/net/tmwa/gui/partytab.cpp:170 ../src/net/tmwa/partyhandler.cpp:179 msgid "Experience sharing disabled." -msgstr "" +msgstr "Передача опыта выключена." #: ../src/net/tmwa/gui/partytab.cpp:167 ../src/net/tmwa/partyhandler.cpp:173 msgid "Experience sharing enabled." -msgstr "" +msgstr "Передача опыта включена." #: ../src/net/tmwa/gui/partytab.cpp:173 ../src/net/tmwa/partyhandler.cpp:185 msgid "Experience sharing not possible." -msgstr "" +msgstr "Передача опыта невозможна." #: ../src/net/tmwa/gui/partytab.cpp:176 msgid "Experience sharing unknown." -msgstr "" +msgstr "Передача опыта неизвестна." #: ../src/gui/setup_video.cpp:171 msgid "FPS limit:" -msgstr "FPS Предел:" +msgstr "Лимит FPS:" #: ../src/net/tmwa/tradehandler.cpp:211 msgid "Failed adding item for unknown reason." -msgstr "" +msgstr "Добавление предмета провалилось по неизвестным причинам." #: ../src/net/tmwa/tradehandler.cpp:207 msgid "Failed adding item. Trade partner has no free slot." -msgstr "" +msgstr "Добавление предмета провалилось. Партнёр не имеет свободных слотов." #: ../src/net/tmwa/tradehandler.cpp:202 msgid "Failed adding item. Trade partner is over weighted." -msgstr "" +msgstr "Добавление предмета провалилось. Партнёр перегружен." #: ../src/gui/tradewindow.cpp:262 msgid "Failed adding item. You can not overlap one kind of item on the window." msgstr "" +"Добавление предмета провалилось. Вы не можете перекрыть один тип объекта на " +"окне." #: ../src/net/tmwa/charserverhandler.cpp:134 msgid "Failed to create character. Most likely the name is already taken." -msgstr "Невозможно создать персонажа. Скорее всего, таке имя уже используется." +msgstr "" +"Создание персонажа провалилось. Скорее всего, такое имя уже используется." #: ../src/net/tmwa/charserverhandler.cpp:151 msgid "Failed to delete character." -msgstr "Невозможно удалить персонажа" +msgstr "Удаление персонажа провалилось." #: ../src/net/manaserv/guildhandler.cpp:209 msgid "Failed to promote member." -msgstr "" +msgstr "Активизирование участника провалилось." #: ../src/gui/npcpostdialog.cpp:99 msgid "Failed to send as sender or letter invalid." @@ -1484,12 +1485,12 @@ msgstr "" msgid "" "Failed to switch to windowed mode and restoration of old mode also failed!" msgstr "" -"Не удалось перейти в окновой режим и восстановить старый режим тоже не " +"Не удалось перейти в оконный режим и восстановить старый режим тоже не " "удалось!" #: ../src/net/tmwa/inventoryhandler.cpp:287 msgid "Failed to use item." -msgstr "" +msgstr "Не удалось использовать предмет." #: ../src/client.cpp:962 msgid "Farewell, come back any time..." @@ -1497,7 +1498,7 @@ msgstr "Прощайте, возвращайтесь в любое время... #: ../src/net/tmwa/inventoryhandler.h:72 msgid "Feet" -msgstr "" +msgstr "Ноги" #: ../src/gui/charcreatedialog.cpp:88 ../src/gui/register.cpp:91 msgid "Female" @@ -1508,9 +1509,8 @@ msgid "Finishing recording." msgstr "Запись завершена." #: ../src/gui/setup_interface.cpp:130 -#, fuzzy msgid "Font size:" -msgstr "Размер шрифта" +msgstr "Размер шрифта:" #: ../src/commandhandler.cpp:204 msgid "For more information, type /help ." @@ -1552,7 +1552,7 @@ msgstr "Глобальное объявление:" #: ../src/net/tmwa/generalhandler.cpp:209 msgid "Got disconnected from server!" -msgstr "Отключено от сервера!" +msgstr "Отключен от сервера!" #: ../src/gui/setup_colors.cpp:125 msgid "Green:" @@ -1560,7 +1560,7 @@ msgstr "Зеленый:" #: ../src/gui/debugwindow.cpp:134 msgid "Grid" -msgstr "" +msgstr "Сетка" #: ../src/gui/setup_interface.cpp:129 msgid "Gui opacity" @@ -1573,12 +1573,11 @@ msgstr "Гильдия" #: ../src/gui/socialwindow.cpp:139 #, c-format msgid "Guild %s quit requested." -msgstr "" +msgstr "Выход из гильдия %s запрошен." #: ../src/resources/userpalette.cpp:98 -#, fuzzy msgid "Guild Members" -msgstr "Гильдия" +msgstr "Участники гильдия" #: ../src/gui/socialwindow.cpp:540 msgid "Guild Name" @@ -1603,7 +1602,7 @@ msgstr "HP %+d" #: ../src/gui/statuswindow.cpp:121 msgid "HP:" -msgstr "ЖО:" +msgstr "Жизнь:" #: ../src/gui/charcreatedialog.cpp:78 msgid "Hair color:" @@ -1615,15 +1614,15 @@ msgstr "Стрижка:" #: ../src/net/tmwa/inventoryhandler.h:80 msgid "Hand 1/2" -msgstr "" +msgstr "Рука 1/2" #: ../src/net/tmwa/inventoryhandler.h:82 msgid "Hand 2/2" -msgstr "" +msgstr "Рука 2/2" #: ../src/net/tmwa/inventoryhandler.h:68 msgid "Head" -msgstr "" +msgstr "Голова" #: ../src/gui/helpwindow.cpp:37 msgid "Help" @@ -1654,11 +1653,11 @@ msgstr "Если <канал> не существует, он будет соз #: ../src/gui/widgets/channeltab.cpp:81 ../src/gui/widgets/channeltab.cpp:90 #: ../src/net/tmwa/gui/guildtab.cpp:75 ../src/net/tmwa/gui/partytab.cpp:75 msgid "If the has spaces in it, enclose it in double quotes (\")." -msgstr "Если ник содержит пробелы, заключите его в кавычки (\")." +msgstr "Если <ник> содержит пробелы, заключите его в кавычки (\")." #: ../src/net/tmwa/playerhandler.cpp:126 msgid "If you weren't so animated, you'd be pushing up the daisies." -msgstr "" +msgstr "Если вы не были анимированы нормальны, вы будете стоять вверх ногами." #: ../src/gui/widgets/channeltab.cpp:74 msgid "If you're the last person in the channel, it will be deleted." @@ -1667,7 +1666,7 @@ msgstr "Если вы - последний пользователь канала #: ../src/gui/popupmenu.cpp:109 #, c-format msgid "Ignore %s" -msgstr "Игнорировано %s" +msgstr "Игнорировать %s" #: ../src/keyboardconfig.cpp:104 msgid "Ignore input 1" @@ -1679,7 +1678,7 @@ msgstr "Игнорировать ввод 2" #: ../src/gui/setup_players.cpp:67 msgid "Ignored" -msgstr "Игнорировано" +msgstr "Проигнорировано" #: ../src/game.cpp:704 msgid "Ignoring incoming trade requests" @@ -1687,7 +1686,7 @@ msgstr "Игнорировать предложения о торговле" #: ../src/net/manaserv/tradehandler.cpp:97 msgid "Ignoring incoming trade requests." -msgstr "Входящих запросов торговли игнарируютса." +msgstr "Игнорировать предложения о торговле." #: ../src/gui/debugwindow.cpp:235 ../src/net/manaserv/charhandler.cpp:212 #: ../src/net/tmwa/charserverhandler.cpp:146 @@ -1712,9 +1711,9 @@ msgid "Intelligence" msgstr "Интеллект" #: ../src/net/manaserv/attributes.cpp:225 -#, fuzzy, c-format +#, c-format msgid "Intelligence %+.1f" -msgstr "Интеллект %+d" +msgstr "Интеллект %+.1f" #: ../src/net/tmwa/generalhandler.cpp:105 #, c-format @@ -1727,12 +1726,11 @@ msgstr "Интеллект:" #: ../src/gui/setup_interface.cpp:120 msgid "Interface" -msgstr "" +msgstr "Интерфейс" #: ../src/net/manaserv/charhandler.cpp:269 -#, fuzzy msgid "Invalid character slot selected." -msgstr "Персонаж удален" +msgstr "Выбран неверный слот персонажа." #: ../src/net/manaserv/charhandler.cpp:158 msgid "Invalid gender." @@ -1751,9 +1749,8 @@ msgid "Invalid name." msgstr "Неверное имя." #: ../src/net/manaserv/charhandler.cpp:173 -#, fuzzy msgid "Invalid slot number." -msgstr "Неверное имя." +msgstr "Неверный номер слота." #: ../src/client.cpp:1294 #, c-format @@ -1769,9 +1766,8 @@ msgid "Inventory Window" msgstr "Окно инвентаря" #: ../src/localplayer.cpp:916 -#, fuzzy msgid "Inventory is full." -msgstr "Инвентарь" +msgstr "Инвентарь заполнен." #: ../src/gui/socialwindow.cpp:331 msgid "Invite" @@ -1794,17 +1790,18 @@ msgstr "Приглашение отправлено." #: ../src/gui/socialwindow.cpp:126 #, c-format msgid "Invited user %s to guild %s." -msgstr "Пригласить игрока %s в гильдию %s." +msgstr "Пользователь %s приглашен в гильдию %s." #: ../src/gui/socialwindow.cpp:207 ../src/net/tmwa/partyhandler.cpp:331 #, c-format msgid "Invited user %s to party." -msgstr "Пользователь %s приглашен в группу" +msgstr "Пользователь %s приглашен в группу" #: ../src/net/tmwa/partyhandler.cpp:336 #, c-format msgid "Inviting failed, because you can't see a player called %s." -msgstr "Приглашение не удалось, потому что вы не можете видеть игрока %s." +msgstr "" +"Приглашение не удалось, потому что вы не видите игрока, которого зовёте %s." #: ../src/keyboardconfig.cpp:58 ../src/keyboardconfig.cpp:59 #: ../src/keyboardconfig.cpp:60 ../src/keyboardconfig.cpp:61 @@ -1814,44 +1811,43 @@ msgstr "Приглашение не удалось, потому что вы н #: ../src/keyboardconfig.cpp:68 ../src/keyboardconfig.cpp:69 #, c-format msgid "Item Shortcut %d" -msgstr "Комбинация клавиш предмета %d" +msgstr "Горячая клавиша предмета %d" #: ../src/keyboardconfig.cpp:77 msgid "Item Shortcut Window" -msgstr "Окно комбинаций клавиш предметов" +msgstr "Окно горячих клавиш на предметах" #: ../src/localplayer.cpp:919 msgid "Item belongs to someone else." -msgstr "" +msgstr "Предмет принадлежит кому-то другому." #: ../src/localplayer.cpp:915 msgid "Item is too far away" -msgstr "" +msgstr "Предмет находится слишком далеко" #: ../src/localplayer.cpp:914 msgid "Item is too heavy." -msgstr "" +msgstr "Предмет слишком тяжелый." #: ../src/net/tmwa/gui/partytab.cpp:135 ../src/net/tmwa/partyhandler.cpp:203 msgid "Item sharing disabled." -msgstr "" +msgstr "Передача предметов отключена." #: ../src/net/tmwa/gui/partytab.cpp:132 ../src/net/tmwa/partyhandler.cpp:197 msgid "Item sharing enabled." -msgstr "" +msgstr "Передача предметов включена." #: ../src/net/tmwa/gui/partytab.cpp:138 ../src/net/tmwa/partyhandler.cpp:209 msgid "Item sharing not possible." -msgstr "" +msgstr "Передача предметов невозможна." #: ../src/net/tmwa/gui/partytab.cpp:141 msgid "Item sharing unknown." -msgstr "" +msgstr "Передача предметов неизвестна." #: ../src/client.cpp:787 -#, fuzzy msgid "ItemDB: Error while loading " -msgstr "Ошибка во время загрузки %s" +msgstr "ItemDB: Ошибка загрузки." #: ../src/gui/statuswindow.cpp:163 msgid "Job:" @@ -1866,11 +1862,14 @@ msgstr "Профессия: %d" msgid "" "Joining party failed, because the invitation has timed out on the server." msgstr "" +"Присоединение к группе провалилось, так как срок приглашения истёк на " +"сервере." #: ../src/net/manaserv/partyhandler.cpp:102 -#, fuzzy msgid "Joining party failed, because the inviter has left the game." -msgstr "Создание группи не удалось, пожалуйста, выберите более короткое имя." +msgstr "" +"Присоединение к группе провалилось, так как приглашавший вас пользователь " +"вышел из игры." #: ../src/gui/setup_joystick.cpp:41 msgid "Joystick" @@ -1886,19 +1885,19 @@ msgstr "Клавиатура" #: ../src/net/tmwa/adminhandler.cpp:64 msgid "Kick failed!" -msgstr "" +msgstr "Кик не удался." #: ../src/gui/popupmenu.cpp:167 msgid "Kick monster" -msgstr "Вышвырнуть монстра" +msgstr "Кикнуть монстра" #: ../src/gui/popupmenu.cpp:145 msgid "Kick player" -msgstr "" +msgstr "Кикнуть игрока" #: ../src/net/tmwa/adminhandler.cpp:66 msgid "Kick succeeded!" -msgstr "" +msgstr "Кик успешно произведён!" #: ../src/gui/setup_interface.cpp:62 msgid "Large" @@ -1918,7 +1917,7 @@ msgstr "Покинуть группу?" #: ../src/net/tmwa/inventoryhandler.h:70 msgid "Legs" -msgstr "" +msgstr "Ноги" #: ../src/gui/statuswindow.cpp:117 ../src/gui/statuswindow.cpp:219 #: ../src/gui/statuswindow.cpp:267 @@ -1928,22 +1927,19 @@ msgstr "Уровень: %d" #: ../src/net/manaserv/chathandler.cpp:217 msgid "Listing channels." -msgstr "Запрос на присоединение к каналу." +msgstr "Листинг каналов." #: ../src/resources/userpalette.cpp:109 -#, fuzzy msgid "Local Player Critical Hit" -msgstr "Критический удар" +msgstr "Локальный игрок совершает критический удар" #: ../src/resources/userpalette.cpp:107 -#, fuzzy msgid "Local Player Hits Monster" -msgstr "Удары игрока по монстру" +msgstr "Локальный игрок бьёт монстра" #: ../src/resources/userpalette.cpp:111 -#, fuzzy msgid "Local Player Miss" -msgstr "Сохранить список игроков" +msgstr "Локальный игрок пропал" #: ../src/gui/setup_interface.cpp:108 msgid "Log NPC dialogue" @@ -1959,12 +1955,12 @@ msgstr "Вход" #: ../src/net/manaserv/loginhandler.cpp:286 msgid "Login attempt too soon after previous attempt." -msgstr "" +msgstr "Попытка логина произошла слишком рано с периода прошлой попытки." #: ../src/net/manaserv/beinghandler.cpp:290 #: ../src/net/tmwa/playerhandler.cpp:115 msgid "Looks like you got your head handed to you." -msgstr "" +msgstr "Похоже что вам передали вашу голову." #: ../src/net/tmwa/generalhandler.cpp:236 msgid "Luck" @@ -2007,9 +2003,8 @@ msgid "MP:" msgstr "Мана:" #: ../src/net/tmwa/chathandler.cpp:230 -#, fuzzy msgid "MVP player." -msgstr "Игрок" +msgstr "MVP Игрок." #: ../src/gui/charcreatedialog.cpp:87 ../src/gui/register.cpp:90 msgid "Male" @@ -2028,7 +2023,7 @@ msgstr "Карта: %s" #: ../src/gui/statuswindow.cpp:395 ../src/gui/statuswindow.cpp:473 #: ../src/gui/statuswindow.cpp:507 msgid "Max" -msgstr "Макс" +msgstr "Максимальный" #: ../src/gui/setup_interface.cpp:61 msgid "Medium" @@ -2036,7 +2031,7 @@ msgstr "Средний" #: ../src/gui/socialwindow.cpp:153 msgid "Member Invite to Guild" -msgstr "Приглашение игрока в гильдию" +msgstr "Пригласить пользователя в гильдию" #: ../src/gui/socialwindow.cpp:232 msgid "Member Invite to Party" @@ -2044,7 +2039,7 @@ msgstr "Пригласить пользователя в группу" #: ../src/net/manaserv/guildhandler.cpp:204 msgid "Member was promoted successfully." -msgstr "" +msgstr "Пользователь был успешно приведён." #: ../src/net/tmwa/playerhandler.cpp:254 ../src/net/tmwa/playerhandler.cpp:294 msgid "Message" @@ -2060,7 +2055,7 @@ msgstr "Теперь сообщение закрывает чат." #: ../src/keyboardconfig.cpp:75 msgid "Minimap Window" -msgstr "Окно мини-карты" +msgstr "Окно миникарты" #: ../src/gui/debugwindow.cpp:101 #, c-format @@ -2073,7 +2068,7 @@ msgstr "Промахи" #: ../src/gui/serverdialog.cpp:212 msgid "Modify..." -msgstr "" +msgstr "Модифицирование..." #: ../src/gui/statuswindow.cpp:118 ../src/gui/statuswindow.cpp:212 #: ../src/gui/statuswindow.cpp:244 @@ -2082,9 +2077,8 @@ msgid "Money: %s" msgstr "Деньги: %s" #: ../src/resources/userpalette.cpp:104 -#, fuzzy msgid "Monster Hits Player" -msgstr "Удары монстра по игроку" +msgstr "Монстр бьёт игрока" #: ../src/resources/userpalette.cpp:96 msgid "Monsters" @@ -2092,7 +2086,7 @@ msgstr "Монстры" #: ../src/gui/debugwindow.cpp:139 msgid "Mouse path" -msgstr "" +msgstr "Путь мыши" #: ../src/keyboardconfig.cpp:42 msgid "Move Down" @@ -2142,9 +2136,8 @@ msgid "Name: %s" msgstr "Имя: %s" #: ../src/net/tmwa/inventoryhandler.h:78 -#, fuzzy msgid "Necklace" -msgstr "Ожерелья" +msgstr "Ожерелье" #: ../src/gui/ministatuswindow.cpp:244 msgid "Need" @@ -2152,11 +2145,11 @@ msgstr "Необходимо" #: ../src/gui/widgets/channeltab.cpp:121 msgid "Need a user to kick!" -msgstr "" +msgstr "Необходим пользователь, чтобы кикнуть его." #: ../src/gui/widgets/channeltab.cpp:114 msgid "Need a user to op!" -msgstr "" +msgstr "Необходим пользователь, чтобы сделать его оператором!" #: ../src/game.cpp:364 msgid "Network Error" @@ -2192,20 +2185,19 @@ msgstr "Нет" #: ../src/commandhandler.cpp:407 msgid "No was given." -msgstr "" +msgstr "Не записан <ник>" #: ../src/net/manaserv/charhandler.cpp:143 msgid "No empty slot." -msgstr "" +msgstr "Нет свободных слотов." #: ../src/net/manaserv/charhandler.cpp:266 msgid "No gameservers are available." -msgstr "" +msgstr "Нет доступных игровых серверов." #: ../src/gui/itempopup.cpp:135 -#, fuzzy msgid "No item" -msgstr "Неизвестный предмет" +msgstr "Нет предмета" #: ../src/net/tmwa/generalhandler.cpp:135 msgid "No servers available." @@ -2221,16 +2213,17 @@ msgid "" "No, kids. Your character did not really die. It... err... went to a better " "place." msgstr "" -"Нет, дети. Ваш персонаж не умирает. Он ... ммм ... пошел к лучшей жызни." +"Нет, дети. Ваш персонаж не умер, на самом деле. Он... Эм... Ушел в место по-" +"лучше." #: ../src/gui/setup_video.cpp:200 ../src/gui/setup_video.cpp:407 #: ../src/gui/setup_video.cpp:481 msgid "None" -msgstr "ни один" +msgstr "Ни один" #: ../src/gui/debugwindow.cpp:142 msgid "Normal" -msgstr "" +msgstr "Нормальный" #: ../src/gui/recorder.cpp:92 msgid "Not currently recording." @@ -2243,7 +2236,7 @@ msgstr "Не авторизован." #: ../src/net/tmwa/buysellhandler.cpp:109 msgid "Nothing to sell." -msgstr "Нечего продавать..." +msgstr "Нечего продавать." #: ../src/gui/setup_audio.cpp:94 msgid "Notice" @@ -2289,9 +2282,8 @@ msgid "Options:" msgstr "Опции:" #: ../src/resources/userpalette.cpp:103 -#, fuzzy msgid "Other Player Hits Monster" -msgstr "Удары игрока по монстру" +msgstr "Другой игрок бьёт монстра" #: ../src/resources/userpalette.cpp:92 msgid "Other Players' Names" @@ -2301,43 +2293,40 @@ msgstr "Имена других игроков" #: ../src/gui/outfitwindow.cpp:154 #, c-format msgid "Outfit: %d" -msgstr "" +msgstr "Наряд: %d" #: ../src/gui/inventorywindow.cpp:110 ../src/gui/outfitwindow.cpp:51 msgid "Outfits" -msgstr "" +msgstr "Наряды" #: ../src/keyboardconfig.cpp:82 -#, fuzzy msgid "Outfits Window" -msgstr "Окно статуса" +msgstr "Окно нарядов" #: ../src/gui/setup_interface.cpp:128 msgid "Overhead text:" -msgstr "" +msgstr "Текст сверху:" #: ../src/resources/userpalette.cpp:93 msgid "Own Name" msgstr "Собственное имя" #: ../src/gui/setup_video.cpp:459 -#, fuzzy msgid "Particle Effect Settings Changed." -msgstr "Эффекты частиц" +msgstr "Опции эффектов частиц были изменены." #: ../src/resources/userpalette.cpp:99 msgid "Particle Effects" msgstr "Эффекты частиц" #: ../src/gui/debugwindow.cpp:107 -#, fuzzy, c-format +#, c-format msgid "Particle count: %d" -msgstr "Эффекты частиц" +msgstr "Число частиц: %d" #: ../src/gui/setup_video.cpp:192 -#, fuzzy msgid "Particle detail:" -msgstr "Качество частиц" +msgstr "Качество частиц:" #: ../src/gui/setup_video.cpp:169 msgid "Particle effects" @@ -2350,28 +2339,29 @@ msgstr "Группа" #: ../src/gui/socialwindow.cpp:218 #, c-format msgid "Party %s quit requested." -msgstr "" +msgstr "Группа %s отставила запрос." #: ../src/resources/userpalette.cpp:97 -#, fuzzy msgid "Party Members" -msgstr "Группа" +msgstr "Участники Группы" #: ../src/gui/socialwindow.cpp:625 msgid "Party Name" -msgstr "имя группы" +msgstr "Имя группы" #: ../src/net/manaserv/partyhandler.cpp:152 msgid "" "Party invitation rejected by server, because of too many invitations in a " "short time." msgstr "" +"Приглашение в группу было отменено сервером, так как было послано слишком " +"много приглашений в короткое время." #: ../src/net/manaserv/partyhandler.cpp:75 #, c-format msgid "" "Party invite failed, because no player called %s is within the visual range." -msgstr "" +msgstr "Приглашение в группу провалилось, так как игрока %s нет в поле зрения." #: ../src/commandhandler.cpp:448 ../src/net/tmwa/gui/partytab.cpp:109 msgid "Party name is missing." @@ -2426,12 +2416,11 @@ msgstr "Игрок уже игнорируется!" #: ../src/commandhandler.cpp:553 msgid "Player could not be ignored!" -msgstr "Игрок не может быть игнорирован!" +msgstr "Игрок не может быть проигнорирован!" #: ../src/commandhandler.cpp:575 -#, fuzzy msgid "Player could not be unignored!" -msgstr "Низзя прошептать: пользователь игнорирует шептание..." +msgstr "Невозможно перестать игнорировать пользователя!" #: ../src/net/manaserv/charhandler.cpp:212 msgid "Player deleted." @@ -2443,11 +2432,11 @@ msgstr "Игрок больше не игнорируется!" #: ../src/commandhandler.cpp:551 msgid "Player successfully ignored!" -msgstr "Игрок успешно игнорирован!" +msgstr "Игрок успешно проигнорирован!" #: ../src/commandhandler.cpp:568 msgid "Player wasn't ignored!" -msgstr "Игрок не было игнорирован!" +msgstr "Игрок не был проигнорирован!" #: ../src/gui/setup_players.cpp:236 msgid "Players" @@ -2459,29 +2448,26 @@ msgid "Players in this channel:" msgstr "Игроки в этом канале:" #: ../src/gui/customserverdialog.cpp:156 -#, fuzzy msgid "Please at least type both the address and the port of the server." -msgstr "Следует указать адрес и порт сервера." +msgstr "Пожалуйста, укажите хотя бы вместе адрес и порт сервера." #: ../src/gui/charcreatedialog.cpp:106 ../src/gui/charcreatedialog.cpp:264 #, c-format msgid "Please distribute %d points" -msgstr "Распределите очки (%d)" +msgstr "Пожалуйста, распределите очки (%d)" #: ../src/gui/charcreatedialog.cpp:269 #, c-format msgid "Please remove %d points" -msgstr "Снимите очки (%d)" +msgstr "Пожалуйста, снимите очки (%d)" #: ../src/gui/serverdialog.cpp:331 -#, fuzzy msgid "Please select a custom server." -msgstr "Пожалуйста, укажите имя." +msgstr "Пожалуйста, выберите свой сервер." #: ../src/gui/serverdialog.cpp:287 -#, fuzzy msgid "Please select a server." -msgstr "Пожалуйста, укажите имя." +msgstr "Пожалуйста, выберите сервер." #: ../src/commandhandler.cpp:461 ../src/commandhandler.cpp:538 #: ../src/commandhandler.cpp:560 @@ -2501,13 +2487,13 @@ msgid "Preparing download" msgstr "Подготовка к загрузке" #: ../src/gui/chatwindow.cpp:316 -#, fuzzy, c-format +#, c-format msgid "Present: %s; %d players are present." -msgstr "%d игроков он-лайн." +msgstr "Сейчас: %s; %d игроков онлайн." #: ../src/net/manaserv/beinghandler.cpp:296 msgid "Press OK to respawn." -msgstr "" +msgstr "Нажмите OK для перерождения." #: ../src/gui/setup_joystick.cpp:37 ../src/gui/setup_joystick.cpp:78 msgid "Press the button to start calibration" @@ -2525,7 +2511,7 @@ msgstr "Цена: %s / Всего: %s" #: ../src/playerrelations.cpp:342 ../src/playerrelations.cpp.orig:328 msgid "Print '...'" -msgstr "" +msgstr "Вывести '...'" #: ../src/gui/tradewindow.cpp:53 msgid "Propose trade" @@ -2538,7 +2524,7 @@ msgstr "Пульсирующий" #: ../src/gui/setup_players.cpp:230 msgid "Put all whispers in tabs" -msgstr "Личные сообщения во вкладках" +msgstr "Распределить личные сообщения во вкладки." #: ../src/gui/buydialog.cpp:80 ../src/gui/quitdialog.cpp:40 #: ../src/gui/quitdialog.cpp:42 ../src/gui/quitdialog.cpp:43 @@ -2579,12 +2565,11 @@ msgstr "Регистрация приостановлена" #: ../src/net/tmwa/loginhandler.cpp:165 msgid "Rejected from server." -msgstr "отклонены от сервера." +msgstr "Отклонен от сервера." #: ../src/gui/socialwindow.cpp:468 -#, fuzzy msgid "Rejected guild invite." -msgstr "Пользователь отклонил приглашение в гильдию." +msgstr "Приглашение в гильдию отклонено." #: ../src/gui/socialwindow.cpp:450 #, c-format @@ -2602,7 +2587,7 @@ msgstr "Запомнить имя пользователя" #: ../src/net/manaserv/tradehandler.cpp:115 #: ../src/net/tmwa/tradehandler.cpp:109 msgid "Request for Trade" -msgstr "" +msgstr "Запрос на торговлю" #: ../src/net/tmwa/gamehandler.cpp:96 msgid "Request to quit denied!" @@ -2635,7 +2620,7 @@ msgstr "Для вступления в силу выбранных настро #: ../src/gui/setup_video.cpp:441 msgid "Restart your client for the change to take effect." -msgstr "Перезегрузите игру дабы изменения вступили в силу" +msgstr "Перезагрузите игру дабы изменения вступили в силу." #: ../src/gui/inventorywindow.cpp:133 ../src/gui/popupmenu.cpp:397 msgid "Retrieve" @@ -2647,17 +2632,15 @@ msgstr "Теперь Return переключает чат." #: ../src/commandhandler.cpp:479 msgid "Return toggles chat." -msgstr "Enter переключает вас на окно чата." +msgstr "Return переключает вас на окно чата." #: ../src/net/tmwa/inventoryhandler.h:74 -#, fuzzy msgid "Ring 1/2" -msgstr "Кольца" +msgstr "Кольцо 1/2" #: ../src/net/tmwa/inventoryhandler.h:76 -#, fuzzy msgid "Ring 2/2" -msgstr "Кольца" +msgstr "Кольцо 2/2" #: ../src/gui/setup_joystick.cpp:84 msgid "Rotate the stick" @@ -2666,7 +2649,7 @@ msgstr "Вращайте рукоять" #: ../src/net/manaserv/beinghandler.cpp:288 #: ../src/net/tmwa/playerhandler.cpp:111 msgid "Sadly, no trace of you was ever found..." -msgstr "К сожалению, никаких ваших остатков не было найдено ..." +msgstr "К сожалению ваши остатки больше не были найдены..." #: ../src/game.cpp:332 msgid "Saving screenshot failed!" @@ -2694,7 +2677,7 @@ msgstr "Прокрутить чат вверх" #: ../src/gui/inventorywindow.cpp:88 msgid "Search:" -msgstr "" +msgstr "Поиск:" #: ../src/net/tmwa/specialhandler.cpp:184 msgid "Seems you need more money... ;-)" @@ -2702,7 +2685,7 @@ msgstr "Кажется, вам нужно больше денег... ;-)" #: ../src/keyboardconfig.cpp:102 msgid "Select OK" -msgstr "Выбрать Ok" +msgstr "Выбрать OK" #: ../src/gui/worldselectdialog.cpp:71 msgid "Select World" @@ -2730,7 +2713,7 @@ msgstr "Сколько предметов продать." #: ../src/net/manaserv/charhandler.cpp:224 msgid "Selection out of range." -msgstr "Выбор вне зоне достижения" +msgstr "Выбор вне зоны достижения" #: ../src/gui/buyselldialog.cpp:47 ../src/gui/selldialog.cpp:50 #: ../src/gui/selldialog.cpp:77 @@ -2743,11 +2726,11 @@ msgstr "Отправить" #: ../src/net/tmwa/loginhandler.cpp:182 msgid "Server overpopulated." -msgstr "" +msgstr "Сервер переполнен." #: ../src/net/net.cpp:164 msgid "Server protocol unsupported" -msgstr "" +msgstr "Не поддерживаемый протокол сервера" #: ../src/gui/customserverdialog.cpp:57 msgid "Server type:" @@ -2774,9 +2757,8 @@ msgid "Shop" msgstr "Магазин" #: ../src/gui/windowmenu.cpp:70 -#, fuzzy msgid "Shortcuts" -msgstr "Клавиша" +msgstr "Горячие клавиши" #: ../src/commandhandler.cpp:505 ../src/commandhandler.cpp:514 msgid "Show IP: Off" @@ -2799,14 +2781,12 @@ msgid "Show own name" msgstr "Показать собственное имя" #: ../src/gui/setup_interface.cpp:109 -#, fuzzy msgid "Show pickup notification:" -msgstr "Показать уведомление о подборе предмета" +msgstr "Показать уведомление о подборе предметов" #: ../src/gui/debugwindow.cpp:133 -#, fuzzy msgid "Show:" -msgstr "Показ IP: Включен" +msgstr "Показать:" #: ../src/keyboardconfig.cpp:55 msgid "Sit" @@ -2833,7 +2813,7 @@ msgstr "Окно навыков" #: ../src/gui/skilldialog.cpp:275 #, c-format msgid "Skill points available: %d" -msgstr "" +msgstr "Доступные очки навыков: %d" #: ../src/gui/skilldialog.cpp:215 ../src/gui/windowmenu.cpp:62 msgid "Skills" @@ -2853,12 +2833,11 @@ msgstr "Улыбнуться" #: ../src/gui/socialwindow.cpp:312 ../src/gui/windowmenu.cpp:68 msgid "Social" -msgstr "" +msgstr "Группы" #: ../src/keyboardconfig.cpp:80 -#, fuzzy msgid "Social Window" -msgstr "Окно навыков" +msgstr "Окно групп" #: ../src/net/tmwa/generalhandler.cpp:139 msgid "Someone else is trying to use this account." @@ -2870,36 +2849,32 @@ msgstr "Звук" #: ../src/gui/setup_audio.cpp:106 msgid "Sound Engine" -msgstr "" +msgstr "Звуковой движок" #: ../src/gui/debugwindow.cpp:143 -#, fuzzy msgid "Special 1" -msgstr "Специальные" +msgstr "Специальные 1" #: ../src/gui/debugwindow.cpp:144 -#, fuzzy msgid "Special 2" -msgstr "Специальные" +msgstr "Специальные 2" #: ../src/gui/debugwindow.cpp:145 -#, fuzzy msgid "Special 3" -msgstr "Специальные" +msgstr "Специальные 3" #: ../src/gui/specialswindow.cpp:79 ../src/gui/windowmenu.cpp:66 msgid "Specials" msgstr "Специальные" #: ../src/gui/debugwindow.cpp:141 -#, fuzzy msgid "Specials:" -msgstr "Специальные" +msgstr "Специальные:" #: ../src/gui/setup_colors.cpp:90 ../src/gui/setup_colors.cpp:91 #: ../src/gui/setup_colors.cpp:334 msgid "Spectrum" -msgstr "спектр" +msgstr "Спектр" #: ../src/net/tmwa/generalhandler.cpp:145 msgid "Speed hack detected." @@ -2911,7 +2886,7 @@ msgstr "Разделить" #: ../src/localplayer.cpp:917 msgid "Stack is too big." -msgstr "" +msgstr "Стек слишком большой." #: ../src/gui/recorder.cpp:105 msgid "Starting to record..." @@ -2939,7 +2914,7 @@ msgstr "Прекратить атаку" #: ../src/gui/recorder.h:40 msgid "Stop recording" -msgstr "" +msgstr "Прекратить запись" #: ../src/gui/inventorywindow.cpp:60 msgid "Storage" @@ -2955,9 +2930,9 @@ msgid "Strength" msgstr "Сила" #: ../src/net/manaserv/attributes.cpp:173 -#, fuzzy, c-format +#, c-format msgid "Strength %+.1f" -msgstr "Сила %+d" +msgstr "Сила %+.1f" #: ../src/net/tmwa/generalhandler.cpp:102 #, c-format @@ -2985,9 +2960,8 @@ msgid "Switch server" msgstr "Сменить сервер" #: ../src/gui/debugwindow.cpp:239 -#, fuzzy msgid "Switches" -msgstr "Сменить сервер" +msgstr "Переключения" #: ../src/gui/setup_video.cpp:334 msgid "Switching to Full Screen" @@ -3041,35 +3015,35 @@ msgstr "Соединение с сервером потеряно." #: ../src/gui/changeemaildialog.cpp:141 msgid "The email address entries mismatch." -msgstr "Введенный E-mail адреса не совпадают." +msgstr "Введенные email адреса не совпадают." #: ../src/net/manaserv/loginhandler.cpp:163 msgid "The new email address already exists." -msgstr "Введенный E-mail адрес уже зарегистрирован." +msgstr "Введенный email адрес уже зарегистрирован." #: ../src/gui/changeemaildialog.cpp:127 #, c-format msgid "The new email address needs to be at least %d characters long." -msgstr "Новый E-MAIL адрес должен содержать не менее %d символов." +msgstr "Новый email адрес должен содержать не менее %d символов." #: ../src/gui/changeemaildialog.cpp:134 #, c-format msgid "The new email address needs to be less than %d characters long." -msgstr "Новый E-MAIL адрес не должно содержать более %d символов." +msgstr "Новый email адрес не должен содержать более %d символов." #: ../src/gui/changepassworddialog.cpp:130 msgid "The new password entries mismatch." -msgstr "Пароли не совпадают" +msgstr "Пароли не совпадают." #: ../src/gui/changepassworddialog.cpp:116 #, c-format msgid "The new password needs to be at least %d characters long." -msgstr "Новый пароль должен быть не менше %d символов." +msgstr "Новый пароль должен имеет более %d символов." #: ../src/gui/changepassworddialog.cpp:123 #, c-format msgid "The new password needs to be less than %d characters long." -msgstr "Новый пароль должен быть меньше, чем %d символов." +msgstr "Новый пароль должен состоять из менее, чем %d символов." #: ../src/gui/register.cpp:182 ../src/gui/unregisterdialog.cpp:117 #, c-format @@ -3097,7 +3071,7 @@ msgstr "Этот аккаунт уже авторизован." #: ../src/net/tmwa/gui/guildtab.cpp:81 msgid "This command causes the player to leave the guild." -msgstr "Эта комманда заставляет игрока покинуть группу." +msgstr "Эта комманда заставляет игрока покинуть гильдию." #: ../src/net/tmwa/gui/partytab.cpp:81 msgid "This command causes the player to leave the party." @@ -3105,20 +3079,19 @@ msgstr "Эта комманда заставляет игрока покинут #: ../src/net/tmwa/gui/partytab.cpp:96 msgid "This command changes the party's experience sharing policy." -msgstr "" +msgstr "Эта команда меняет политику распределения опыта." #: ../src/net/tmwa/gui/partytab.cpp:86 msgid "This command changes the party's item sharing policy." -msgstr "" +msgstr "Эта команда меняет политику распределения предметов." #: ../src/commandhandler.cpp:274 -#, fuzzy msgid "This command clears the away status and message." -msgstr "Задает тему для <сообщение>." +msgstr "Эта команда очищает AFK статус и сообщение." #: ../src/commandhandler.cpp:228 msgid "This command clears the chat log of previous chat." -msgstr "Эта команда очищает лог чата." +msgstr "Эта команда очищает лог предыдущего чата." #: ../src/gui/widgets/whispertab.cpp:85 msgid "This command closes the current whisper tab." @@ -3126,7 +3099,7 @@ msgstr "Закрывает вкладку перешептывания" #: ../src/commandhandler.cpp:279 msgid "This command creates a new party called ." -msgstr "Эта комманда создает группу под названием <имя_группы>." +msgstr "Эта команда создает группу под названием <имя_группы>." #: ../src/commandhandler.cpp:209 msgid "This command displays a list of all commands available." @@ -3146,15 +3119,15 @@ msgstr "Эта команда показывает число пользоват #: ../src/net/tmwa/gui/partytab.cpp:101 msgid "This command displays the party's current experience sharing policy." -msgstr "" +msgstr "Эта команда показывает текущую политику распределения опыта в группе." #: ../src/net/tmwa/gui/partytab.cpp:91 msgid "This command displays the party's current item sharing policy." -msgstr "" +msgstr "Эта команда показывает текущую политику передачи предметов в группе." #: ../src/commandhandler.cpp:312 msgid "This command displays the return toggle status." -msgstr "" +msgstr "Эта команда показывает статус клавиши \"Enter\"." #: ../src/commandhandler.cpp:301 msgid "This command finishes a recording session." @@ -3165,8 +3138,8 @@ msgid "" "This command gets a list of players within hearing and sends it to either " "the record log if recording, or the chat log otherwise." msgstr "" -"Комманда получпет список всех игроков, которых вы слышите и посылает его " -"либо в лог-файл (если включена такая опция), либо в окно чата." +"Команда получает список всех игроков, которых вы слышите и посылает его либо " +"в лог-файл (если включена такая опция), либо в окно чата." #: ../src/commandhandler.cpp:233 msgid "This command ignores the given player regardless of current relations." @@ -3175,31 +3148,32 @@ msgstr "" #: ../src/gui/widgets/whispertab.cpp:90 msgid "This command ignores the other player regardless of current relations." -msgstr "Эта команда не игнорирует игрока вне зависимости от текущих отношений." +msgstr "" +"Эта команда игнорирует другого игрока вне зависимости от текущих отношений." #: ../src/commandhandler.cpp:284 ../src/net/tmwa/gui/partytab.cpp:74 msgid "This command invites to party with you." -msgstr "Эта команда приглашает <имя персонажа> к вам в группу." +msgstr "Эта команда приглашает <имя_персонажа> к вам в группу." #: ../src/net/tmwa/gui/guildtab.cpp:74 msgid "This command invites to the guild you're in." -msgstr "Эта команда приглашает <имя персонажа> к вам в гильдию." +msgstr "Эта команда приглашает <имя_персонажа> к вам в гильдию." #: ../src/gui/widgets/channeltab.cpp:73 msgid "This command leaves the current channel." -msgstr "Комманда покидает текущий канал" +msgstr "Эта команда покидает текущий канал" #: ../src/gui/widgets/channeltab.cpp:80 msgid "This command makes a channel operator." -msgstr "Эта комманда делает <пользователь> оператором канала." +msgstr "Эта команда делает <пользователь> оператором канала." #: ../src/gui/widgets/channeltab.cpp:89 msgid "This command makes leave the channel." -msgstr "" +msgstr "Эта команда заставляет <пользователя> покинуть чат." #: ../src/commandhandler.cpp:239 msgid "This command makes you enter ." -msgstr "Команда для входа на <канал>." +msgstr "Эта команда нужна для входа на <канал>." #: ../src/commandhandler.cpp:222 msgid "This command sends the message to all players currently online." @@ -3207,18 +3181,18 @@ msgstr "Эта команда посылает <сообщение> всем и #: ../src/commandhandler.cpp:257 msgid "This command sends the text to ." -msgstr "Эта команда посылает текст <сообщение> пользователю ." +msgstr "Эта команда посылает текст <сообщение> <пользователю>." #: ../src/gui/widgets/channeltab.cpp:68 msgid "This command sets the topic to ." -msgstr "Задает тему для <сообщение>." +msgstr "Эта команда задает тему для <сообщения>." #: ../src/commandhandler.cpp:306 msgid "" "This command sets whether the return key should toggle the chat log, or " "whether the chat log turns off automatically." msgstr "" -"Эта комманда устанавливает, будет ли нажатие клавиши Enter переключать лог " +"Эта команда устанавливает, будет ли нажатие клавиши Enter переключать лог " "чата или же он (лог) будет выключен автоматически." #: ../src/commandhandler.cpp:245 @@ -3227,7 +3201,7 @@ msgstr "Эта команда показывает список всех кан #: ../src/gui/widgets/channeltab.cpp:63 msgid "This command shows the users in this channel." -msgstr "Эта комманда показывает пользователей канала" +msgstr "Эта команда показывает пользователей канала" #: ../src/commandhandler.cpp:298 msgid "This command starts recording the chat log to the file ." @@ -3236,12 +3210,12 @@ msgstr "Эта команда начнет протоколирование ок #: ../src/commandhandler.cpp:317 msgid "This command stops ignoring the given player if they are being ignored" msgstr "" -"Эта команда останавливает игнорирование данного игрока, если они игнорируетса" +"Эта команда останавливает игнорирование данного игрока, если он игнорируется" #: ../src/gui/widgets/whispertab.cpp:96 msgid "This command stops ignoring the other player if they are being ignored." msgstr "" -"Эта команда прекращает игнорировать других игроков, если они игнорируютса." +"Эта команда прекращает игнорировать других игроков, если они игнорируются." #: ../src/commandhandler.cpp:250 msgid "This command tell others you are (doing) ." @@ -3249,12 +3223,12 @@ msgstr "Эта команда покажет другим игрокам, что #: ../src/commandhandler.cpp:271 msgid "This command tells you're away from keyboard with the given reason." -msgstr "" +msgstr "Эта команда говорит, что вы отошли с данной вами причиной." #: ../src/commandhandler.cpp:265 msgid "This command tries to make a tab for whispers betweenyou and ." msgstr "" -"Эта команда создаст закладку для личного общения между вами и <имя игрока>." +"Эта команда создаст закладку для личного общения между вами и <имя_игрока>." #: ../src/gui/setup_colors.cpp:47 msgid "This is what the color looks like" @@ -3265,10 +3239,12 @@ msgid "" "This server is missing needed world data. Please contact the administrator" "(s)." msgstr "" +"Этот сервер потерял необходимую информацию о мире. Пожалуйста " +"проконтактируйте администратора(ов)." #: ../src/net/tmwa/loginhandler.cpp:185 msgid "This user name is already taken." -msgstr "Этот аккаунт уже зарегистрирован" +msgstr "Это имя пользователя уже используется." #: ../src/gui/setup_interface.cpp:59 msgid "Tiny" @@ -3287,11 +3263,11 @@ msgstr "Переключится на чат" #: ../src/net/manaserv/guildhandler.cpp:260 #, c-format msgid "Topic: %s" -msgstr "" +msgstr "Тема: %s" #: ../src/net/tmwa/inventoryhandler.h:64 msgid "Torso" -msgstr "" +msgstr "Торс" #: ../src/gui/tradewindow.cpp:73 ../src/gui/tradewindow.cpp:74 msgid "Trade" @@ -3357,7 +3333,7 @@ msgstr "Прозрачность включена" #: ../src/localplayer.cpp:913 msgid "Tried to pick up nonexistent item." -msgstr "" +msgstr "Попытался поднять несуществующий предмет." #: ../src/commandhandler.cpp:334 msgid "Type /help for a list of commands." @@ -3377,11 +3353,11 @@ msgstr "Тип:" #: ../src/net/tmwa/buysellhandler.cpp:123 msgid "Unable to buy." -msgstr "Низзя купить!" +msgstr "Нельзя купить." #: ../src/net/tmwa/inventoryhandler.cpp:405 msgid "Unable to equip." -msgstr "Низзя екипировать!" +msgstr "Нельзя экипировать." #: ../src/net/tmwa/network.cpp:335 msgid "Unable to resolve host \"" @@ -3389,11 +3365,11 @@ msgstr "Невозможно подключиться к хосту \"" #: ../src/net/tmwa/buysellhandler.cpp:131 msgid "Unable to sell." -msgstr "Низзя продать!" +msgstr "Нельзя продать." #: ../src/net/tmwa/inventoryhandler.cpp:417 msgid "Unable to unequip." -msgstr "Низзя разекипировать" +msgstr "Нельзя снять." #: ../src/gui/setup_keyboard.cpp:93 msgid "Unassign" @@ -3406,35 +3382,33 @@ msgstr "Снять" #: ../src/gui/outfitwindow.cpp:70 msgid "Unequip first" -msgstr "Сначало снемите" +msgstr "Сначала снимите." #: ../src/net/manaserv/charhandler.cpp:272 #, c-format msgid "Unhandled character select error message %i." -msgstr "" +msgstr "Ошибка при необработанном выборе игрока %i." #: ../src/net/tmwa/tradehandler.cpp:154 msgid "Unhandled trade cancel packet." -msgstr "" +msgstr "Необработанный пакет отмены торговли." #: ../src/gui/popupmenu.cpp:115 ../src/gui/popupmenu.cpp:124 #, c-format msgid "Unignore %s" -msgstr "" +msgstr "Перестать игнорировать %s" #: ../src/net/net.cpp:141 -#, fuzzy msgid "Unknown Server Type! Exiting." -msgstr "Вещь неизвестного типа" +msgstr "Неизвестный тип сервера! Выход." #: ../src/net/manaserv/chathandler.cpp:350 msgid "Unknown channel event." msgstr "Неизвестная события канала." #: ../src/net/tmwa/charserverhandler.cpp:110 -#, fuzzy msgid "Unknown char-server failure." -msgstr "Неизвестный предмет" +msgstr "Неизвестный символ. Сервер провалился." #: ../src/commandhandler.cpp:136 ../src/commandhandler.cpp:333 msgid "Unknown command." @@ -3442,7 +3416,7 @@ msgstr "Неизвестная команда." #: ../src/net/tmwa/generalhandler.cpp:151 msgid "Unknown connection error." -msgstr "Неизвестный Глюк авторизации." +msgstr "Неизвестная ошибка подключения" #: ../src/net/manaserv/charhandler.cpp:227 #, c-format @@ -3461,12 +3435,12 @@ msgstr "Неизвестная ошибка." #: ../src/net/tmwa/guildhandler.cpp:316 msgid "Unknown guild invite response." -msgstr "" +msgstr "Неизвестный запрос на приглашение в гильдию." #: ../src/net/tmwa/partyhandler.cpp:132 #, c-format msgid "Unknown invite response for %s." -msgstr "" +msgstr "Неизвестный запрос на приглашение в гильдию для %s." #: ../src/resources/itemdb.cpp:69 msgid "Unknown item" @@ -3474,12 +3448,12 @@ msgstr "Неизвестный предмет" #: ../src/localplayer.cpp:920 msgid "Unknown problem picking up item." -msgstr "" +msgstr "Неизвестная проблема при поднятии предмета." #: ../src/gui/charselectdialog.cpp:145 ../src/gui/unregisterdialog.cpp:47 #: ../src/gui/unregisterdialog.cpp:55 msgid "Unregister" -msgstr "Удалить регистрацию" +msgstr "Удалить аккаунт" #: ../src/client.cpp:961 msgid "Unregister Successful" @@ -3487,7 +3461,7 @@ msgstr "Удаление аккаунта прошла успешно" #: ../src/net/tmwa/loginhandler.cpp:156 msgid "Unregistered ID." -msgstr "Незарегестрированый ID." +msgstr "Незарегистрированный ID." #: ../src/gui/skilldialog.cpp:230 msgid "Up" @@ -3514,9 +3488,8 @@ msgid "Username already exists." msgstr "Пользователь с таким именем уже существует." #: ../src/net/tmwa/loginhandler.cpp:188 -#, fuzzy msgid "Username permanently erased." -msgstr "Пользователь с таким именем уже существует." +msgstr "Пользователь перманентно удалён." #: ../src/gui/setup_video.cpp:184 msgid "Video" @@ -3532,9 +3505,9 @@ msgid "Vitality" msgstr "Выносливость" #: ../src/net/manaserv/attributes.cpp:212 -#, fuzzy, c-format +#, c-format msgid "Vitality %+.1f" -msgstr "Выносливость %+d" +msgstr "Выносливость %+.1f" #: ../src/net/tmwa/generalhandler.cpp:104 #, c-format @@ -3543,7 +3516,7 @@ msgstr "Выносливость %+d" #: ../src/net/tmwa/charserverhandler.cpp:273 msgid "Vitality:" -msgstr "Живучесть:" +msgstr "Выносливость:" #: ../src/gui/npcdialog.cpp:49 msgid "Waiting for server" @@ -3555,7 +3528,7 @@ msgstr "Ожидание ответа от сервера..." #: ../src/net/tmwa/specialhandler.cpp:208 msgid "Warp failed..." -msgstr "" +msgstr "Деформация провалилась..." #: ../src/net/manaserv/beinghandler.cpp:277 #: ../src/net/tmwa/playerhandler.cpp:97 @@ -3564,7 +3537,7 @@ msgstr "Мы с сожалением сообщаем, что ваш персо #: ../src/keyboardconfig.cpp:83 msgid "Wear Outfit" -msgstr "" +msgstr "Одеть наряд" #: ../src/gui/inventorywindow.cpp:112 msgid "Weight:" @@ -3587,12 +3560,12 @@ msgstr "Шептать %s" #: ../src/net/tmwa/chathandler.cpp:87 #, c-format msgid "Whisper could not be sent, %s is offline." -msgstr "Низзя прошептать: %s оффлайн" +msgstr "Нельзя прошептать: %s оффлайн" #: ../src/net/tmwa/chathandler.cpp:96 #, c-format msgid "Whisper could not be sent, ignored by %s." -msgstr "Низзя прошептать: %s игнорирует шептание..." +msgstr "Нельзя прошептать: %s игнорирует шептание..." #: ../src/gui/chatwindow.cpp:504 #, c-format @@ -3610,18 +3583,17 @@ msgid "Who would you like to invite to party %s?" msgstr "Кого бы вы хотели пригласить в группу %s?" #: ../src/net/manaserv/attributes.cpp:231 -#, fuzzy msgid "Willpower" -msgstr "Сила волиr:" +msgstr "Сила воли:" #: ../src/net/manaserv/attributes.cpp:238 -#, fuzzy, c-format +#, c-format msgid "Willpower %+.1f" -msgstr "Сила волиr:" +msgstr "Сила воли: %+.1f" #: ../src/net/manaserv/loginhandler.cpp:92 msgid "Wrong magic_token." -msgstr "" +msgstr "Неправильный магический символ." #: ../src/net/tmwa/loginhandler.cpp:159 msgid "Wrong password." @@ -3633,7 +3605,7 @@ msgstr "Неверное имя пользователя или пароль." #: ../src/net/manaserv/loginhandler.cpp:314 msgid "Wrong username, password or email address." -msgstr "Неверное имя пользователя, пароль или адрес E-mail." +msgstr "Неверное имя пользователя, пароль или адрес email." #: ../src/gui/confirmdialog.cpp:42 msgid "Yes" @@ -3645,12 +3617,13 @@ msgstr "Вы умерли" #: ../src/net/tmwa/playerhandler.cpp:132 msgid "You are an ex-player." -msgstr "Вы бывшый игрок." +msgstr "Вы уже бывший игрок." #: ../src/net/tmwa/playerhandler.cpp:255 msgid "" "You are carrying more than half your weight. You are unable to regain health." msgstr "" +"Вы несёте больше половины возможного веса. Регенерация жизни недоступна." #: ../src/net/manaserv/beinghandler.cpp:276 #: ../src/net/tmwa/playerhandler.cpp:96 @@ -3698,12 +3671,12 @@ msgstr "Вы были приглашены присоединиться к гр #: ../src/gui/socialwindow.cpp:584 msgid "You have been invited you to join a party." -msgstr "Вы были приглашены вступить в группу." +msgstr "Вы были приглашены в группу." #: ../src/net/tmwa/loginhandler.cpp:168 msgid "" "You have been permanently banned from the game. Please contact the GM team." -msgstr "Вы были заблокированы от игры. Пожалуйста, свяжитесь с командой GM." +msgstr "Вы были перманентно забанены. Пожалуйста, свяжитесь с командой GM." #: ../src/net/tmwa/loginhandler.cpp:175 #, c-format @@ -3711,12 +3684,12 @@ msgid "" "You have been temporarily banned from the game until %s.\n" "Please contact the GM team via the forums." msgstr "" -"Вы были заблокированы от игры до %s.\n" -"Пожалуйста, свяжитесь с командой GM с помощю форума" +"Вы были временно забанены до %s.\n" +"Пожалуйста, свяжитесь с командой GM с помощью форума" #: ../src/net/tmwa/playerhandler.cpp:122 msgid "You have ceased to be." -msgstr "" +msgstr "Вы прекратили своё существование." #: ../src/net/tmwa/partyhandler.cpp:237 msgid "You have left the party." @@ -3724,7 +3697,7 @@ msgstr "Вы покинули группу." #: ../src/net/tmwa/specialhandler.cpp:178 msgid "You have no memos!" -msgstr "" +msgstr "У вас нет заметок!" #: ../src/net/tmwa/specialhandler.cpp:169 msgid "You have not yet reached a high enough lvl!" @@ -3737,27 +3710,28 @@ msgstr "" #: ../src/gui/setup_video.cpp:367 ../src/gui/setup_video.cpp:375 msgid "You must restart to apply changes." -msgstr "Вы должны перезагрузитса, чтобы изменения вступили в силу." +msgstr "Вы должны перезагрузиться, чтобы изменения вступили в силу." #: ../src/net/tmwa/specialhandler.cpp:193 msgid "You need another blue gem!" -msgstr "" +msgstr "Вам нужен другой синий драгоценный камень!" #: ../src/net/tmwa/specialhandler.cpp:190 msgid "You need another red gem!" -msgstr "" +msgstr "Вам нужен другой красный драгоценный камень!" #: ../src/gui/logindialog.cpp:129 msgid "You need to use the website to register an account for this server." msgstr "" -"Вам необходимо использовать веб-сайт, чтобы зарегистрировать новый аккаунт" +"Вам необходимо использовать веб-сайт, чтобы зарегистрировать новый аккаунт " +"для этого сервера." #: ../src/localplayer.cpp:938 #, c-format msgid "You picked up %d [@@%d|%s@@]." msgid_plural "You picked up %d [@@%d|%s@@]." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Вы подобрали %d [@@%d|%s@@]." +msgstr[1] "Вы подобрали %d [@@%d|%s@@]." #: ../src/net/tmwa/playerhandler.cpp:328 #, c-format @@ -3768,15 +3742,15 @@ msgstr "Вы получили %s." #: ../src/net/tmwa/playerhandler.cpp:117 msgid "" "You screwed up again, dump your body down the tubes and get you another one." -msgstr "" +msgstr "Ты снова облажался, выбросил своё тело в трубу и взял другое." #: ../src/net/manaserv/loginhandler.cpp:323 msgid "You took too long with the captcha or your response was incorrect." -msgstr "" +msgstr "Вы слишком долго разибрали капчу, либо ваш запрос был неверным." #: ../src/net/tmwa/playerhandler.cpp:124 msgid "You're a stiff." -msgstr "" +msgstr "Ты труп." #: ../src/net/tmwa/specialhandler.cpp:196 msgid "You're carrying to much to do this!" @@ -3784,37 +3758,40 @@ msgstr "Вы несёте слишком много, чтобы сделать #: ../src/net/tmwa/playerhandler.cpp:120 msgid "You're not dead yet. You're just resting." -msgstr "" +msgstr "Вы ещё не умерли. Просто отдыхаете." #: ../src/net/tmwa/playerhandler.cpp:128 msgid "You're off the twig." -msgstr "" +msgstr "Вы упали с ветки." #: ../src/net/tmwa/playerhandler.cpp:133 msgid "You're pining for the fjords." -msgstr "" +msgstr "Вы тоскует по фьордам." #: ../src/net/tmwa/playerhandler.cpp:123 msgid "You've expired and gone to meet your maker." -msgstr "" +msgstr "Ваш срок окончился и вы встретили своего создателя." #: ../src/net/tmwa/playerhandler.cpp:129 msgid "You've kicked the bucket." -msgstr "" +msgstr "Вы приказали долго жить." #: ../src/net/tmwa/playerhandler.cpp:130 msgid "" "You've shuffled off your mortal coil, run down the curtain and joined the " "bleedin' choir invisibile." msgstr "" +"Вы осознали суть экзистенции, не выдержали тленности бытия, её " +"несправедливости и иррациональности и в порыве безысходности решили привести " +"себя к фатальному финалу." #: ../src/net/tmwa/guildhandler.cpp:311 msgid "Your guild is full." -msgstr "Ваша гильдия полна." +msgstr "Ваша гильдия заполнена." #: ../src/net/tmwa/playerhandler.cpp:127 msgid "Your metabolic processes are now history." -msgstr "" +msgstr "Ваши метаболические процессы - уже просто история." #: ../src/gui/charcreatedialog.cpp:195 msgid "Your name needs to be at least 4 characters." @@ -3825,15 +3802,15 @@ msgstr "Имя должно содержать не менее четырех с msgid "" "Your plan of breaking your enemies weapon by bashing it with your throat " "failed." -msgstr "" +msgstr "Ваш план по перелому вражеского оружия своим горлом провалился." #: ../src/main.cpp:43 msgid "[mana-file] : The mana file is an XML file (.mana)" -msgstr "" +msgstr "[mana-файл] : Файл mana - это XML файл (.mana)" #: ../src/gui/setup_interface.cpp:113 msgid "as particle" -msgstr "" +msgstr "как частица" #: ../src/gui/setup_video.cpp:136 ../src/gui/setup_video.cpp:150 msgid "high" @@ -3849,11 +3826,11 @@ msgstr "низ." #: ../src/main.cpp:42 msgid "mana [options] [mana-file]" -msgstr "" +msgstr "mana [опции] [mana-файл]" #: ../src/gui/setup_video.cpp:151 msgid "max" -msgstr "максимальное" +msgstr "максимально" #: ../src/gui/setup_video.cpp:149 msgid "medium" -- cgit v1.2.3-60-g2f50 From f9245fbc9ae41c6c0fac5626558ec8db8100527f Mon Sep 17 00:00:00 2001 From: Erik Schilling Date: Sat, 15 Jun 2013 11:05:17 +0200 Subject: Added Kenny690 to the AUTHORS file --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 83a31805..89ffa991 100644 --- a/AUTHORS +++ b/AUTHORS @@ -64,6 +64,7 @@ Eugenio Favalli (Italian) Jonathan Kolberg (German) Jumpy (French) jurkan (German) +Kenny690 Kess Vargavind (Swedish) Leif Kildelund (Danish) Matthias Hartmann (German) -- cgit v1.2.3-60-g2f50 From 8906aa33b8365a7731c5345004531d855a61b67a Mon Sep 17 00:00:00 2001 From: Kenny690 Date: Sat, 15 Jun 2013 18:15:47 +0600 Subject: Fixed minor issues in the russian translation --- po/ru.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/ru.po b/po/ru.po index 6f344fef..3029ba80 100644 --- a/po/ru.po +++ b/po/ru.po @@ -22,7 +22,7 @@ msgstr "" #: ../src/main.cpp:45 msgid " to the mana client." -msgstr " mana клиента ." +msgstr " клиента mana." #: ../src/main.cpp:44 msgid " used to set custom parameters" @@ -162,7 +162,7 @@ msgstr "%s приглашает вас к себе в группу." #: ../src/net/manaserv/chathandler.cpp:345 #, c-format msgid "%s has kicked %s." -msgstr "%s кикнул %s" +msgstr "%s кикнул %s." #: ../src/net/tmwa/partyhandler.cpp:247 #, c-format @@ -172,7 +172,7 @@ msgstr "%s вышел из группы." #: ../src/net/manaserv/chathandler.cpp:335 #, c-format msgid "%s has set mode %s on user %s." -msgstr "%s использовал %s на пользователе %s" +msgstr "%s использовал %s на пользователе %s." #: ../src/net/tmwa/partyhandler.cpp:120 #, c-format -- cgit v1.2.3-60-g2f50 From 03149ffff48047657e8474eb5b681d7d804195a3 Mon Sep 17 00:00:00 2001 From: Stefan Dombrowski Date: Sun, 8 Sep 2013 18:47:32 +0200 Subject: Fixing packet length of CMSG_NPC_STR_RESPONSE The CMSG_NPC_STR_RESPONSE packet transmits a string of variable length. --- src/net/tmwa/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index 3a02deba..14cfe65f 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -77,7 +77,7 @@ uint16_t packet_lengths[0x220] = { 11, 7,VAR, 67, 12, 18,114, 6, 3, 6, 26, 26, 26, 26, 2, 3, // #0x01C0 2, 14, 10,VAR, 22, 22, 4, 2, 13, 97, 0, 9, 9, 29, 6, 28, - 8, 14, 10, 35, 6, 8, 4, 11, 54, 53, 60, 2,VAR, 47, 33, 6, + 8, 14, 10, 35, 6,VAR, 4, 11, 54, 53, 60, 2,VAR, 47, 33, 6, 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2,VAR,VAR, VAR,VAR, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56,VAR, 4, 5, 10, // #0x0200 -- cgit v1.2.3-60-g2f50 From d9dc702115d705c39a39fb1f2290f5feb8dc19c9 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 10:58:47 +0100 Subject: Updated website URL to https --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20695d1b..c049d6d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,6 @@ IF(WIN32) SET(CPACK_NSIS_DISPLAY_NAME "Mana") SET(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/data/icons/mana.ico") SET(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/setup_welcome.bmp") - SET(CPACK_NSIS_URL_INFO_ABOUT "http://www.manasource.org") + SET(CPACK_NSIS_URL_INFO_ABOUT "https://www.manasource.org") ENDIF() INCLUDE(CPack) -- cgit v1.2.3-60-g2f50 From 418ffcadb0a5334ebe621369c14d6c3dd651acce Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 11:00:22 +0100 Subject: Fixed compilation issues and use of deprecated C++ features * Fixed compiler errors due to dynamic exception specifications * Replace std::auto_ptr with std::unique_ptr * Replace std::mem_fun with std::mem_fn * Prefix for_each with std:: (apparently not needed before) * Just use lambda instead of std::bind2nd * Removed usages of std::unary_function --- src/event.cpp | 24 ++++++++++++------------ src/event.h | 24 ++++++++++++------------ src/gui/setup.cpp | 6 ++++-- src/gui/tradewindow.h | 2 +- src/gui/widgets/button.cpp | 2 +- src/gui/widgets/dropdown.cpp | 2 +- src/gui/widgets/playerbox.cpp | 2 +- src/gui/widgets/progressbar.cpp | 2 +- src/gui/widgets/scrollarea.cpp | 6 +++--- src/gui/widgets/tab.cpp | 2 +- src/gui/widgets/textfield.cpp | 2 +- src/net/manaserv/messagehandler.h | 2 +- src/net/tmwa/messagehandler.h | 2 +- src/resources/theme.cpp | 4 ++-- src/utils/dtor.h | 6 ++---- 15 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/event.cpp b/src/event.cpp index 45e65fff..73099cc3 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -37,7 +37,7 @@ Event::~Event() // Integers -void Event::setInt(const std::string &key, int value) throw (BadEvent) +void Event::setInt(const std::string &key, int value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -45,7 +45,7 @@ void Event::setInt(const std::string &key, int value) throw (BadEvent) mData[key] = new IntData(value); } -int Event::getInt(const std::string &key) const throw (BadEvent) +int Event::getInt(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) @@ -66,7 +66,7 @@ bool Event::hasInt(const std::string &key) const // Strings -void Event::setString(const std::string &key, const std::string &value) throw (BadEvent) +void Event::setString(const std::string &key, const std::string &value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -74,7 +74,7 @@ void Event::setString(const std::string &key, const std::string &value) throw (B mData[key] = new StringData(value); } -const std::string &Event::getString(const std::string &key) const throw (BadEvent) +const std::string &Event::getString(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) @@ -96,7 +96,7 @@ bool Event::hasString(const std::string &key) const // Floats -void Event::setFloat(const std::string &key, double value) throw (BadEvent) +void Event::setFloat(const std::string &key, double value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -104,7 +104,7 @@ void Event::setFloat(const std::string &key, double value) throw (BadEvent) mData[key] = new FloatData(value); } -double Event::getFloat(const std::string &key) const throw (BadEvent) +double Event::getFloat(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) @@ -125,7 +125,7 @@ bool Event::hasFloat(const std::string &key) const // Booleans -void Event::setBool(const std::string &key, bool value) throw (BadEvent) +void Event::setBool(const std::string &key, bool value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -133,7 +133,7 @@ void Event::setBool(const std::string &key, bool value) throw (BadEvent) mData[key] = new BoolData(value); } -bool Event::getBool(const std::string &key) const throw (BadEvent) +bool Event::getBool(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) @@ -154,7 +154,7 @@ bool Event::hasBool(const std::string &key) const // Items -void Event::setItem(const std::string &key, Item *value) throw (BadEvent) +void Event::setItem(const std::string &key, Item *value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -162,7 +162,7 @@ void Event::setItem(const std::string &key, Item *value) throw (BadEvent) mData[key] = new ItemData(value); } -Item *Event::getItem(const std::string &key) const throw (BadEvent) +Item *Event::getItem(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) @@ -183,7 +183,7 @@ bool Event::hasItem(const std::string &key) const // Actors -void Event::setActor(const std::string &key, ActorSprite *value) throw (BadEvent) +void Event::setActor(const std::string &key, ActorSprite *value) { if (mData.find(key) != mData.end()) throw KEY_ALREADY_EXISTS; @@ -191,7 +191,7 @@ void Event::setActor(const std::string &key, ActorSprite *value) throw (BadEvent mData[key] = new ActorData(value); } -ActorSprite *Event::getActor(const std::string &key) const throw (BadEvent) +ActorSprite *Event::getActor(const std::string &key) const { VariableMap::const_iterator it = mData.find(key); if (it == mData.end()) diff --git a/src/event.h b/src/event.h index f33e4c70..b785b16f 100644 --- a/src/event.h +++ b/src/event.h @@ -132,12 +132,12 @@ public: /** * Sets the given variable to the given integer, if it isn't already set. */ - void setInt(const std::string &key, int value) throw (BadEvent); + void setInt(const std::string &key, int value); /** * Returns the given variable if it is set and an integer. */ - int getInt(const std::string &key) const throw (BadEvent); + int getInt(const std::string &key) const; /** * Returns the given variable if it is set and an integer, returning the @@ -156,12 +156,12 @@ public: /** * Sets the given variable to the given string, if it isn't already set. */ - void setString(const std::string &key, const std::string &value) throw (BadEvent); + void setString(const std::string &key, const std::string &value); /** * Returns the given variable if it is set and a string. */ - const std::string &getString(const std::string &key) const throw (BadEvent); + const std::string &getString(const std::string &key) const; /** * Returns the given variable if it is set and a string, returning the @@ -182,12 +182,12 @@ public: * Sets the given variable to the given floating-point, if it isn't already * set. */ - void setFloat(const std::string &key, double value) throw (BadEvent); + void setFloat(const std::string &key, double value); /** * Returns the given variable if it is set and a floating-point. */ - double getFloat(const std::string &key) const throw (BadEvent); + double getFloat(const std::string &key) const; /** * Returns the given variable if it is set and a floating-point, returning @@ -206,12 +206,12 @@ public: /** * Sets the given variable to the given boolean, if it isn't already set. */ - void setBool(const std::string &key, bool value) throw (BadEvent); + void setBool(const std::string &key, bool value); /** * Returns the given variable if it is set and a boolean. */ - bool getBool(const std::string &key) const throw (BadEvent); + bool getBool(const std::string &key) const; /** * Returns the given variable if it is set and a boolean, returning the @@ -230,12 +230,12 @@ public: /** * Sets the given variable to the given Item, if it isn't already set. */ - void setItem(const std::string &key, Item *value) throw (BadEvent); + void setItem(const std::string &key, Item *value); /** * Returns the given variable if it is set and an Item. */ - Item *getItem(const std::string &key) const throw (BadEvent); + Item *getItem(const std::string &key) const; /** * Returns the given variable if it is set and an Item, returning the @@ -254,12 +254,12 @@ public: /** * Sets the given variable to the given actor, if it isn't already set. */ - void setActor(const std::string &key, ActorSprite *value) throw (BadEvent); + void setActor(const std::string &key, ActorSprite *value); /** * Returns the given variable if it is set and an actor. */ - ActorSprite *getActor(const std::string &key) const throw (BadEvent); + ActorSprite *getActor(const std::string &key) const; /** * Returns the given variable if it is set and an actor, returning the diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index f378572b..930408ac 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -38,6 +38,8 @@ #include "utils/dtor.h" #include "utils/gettext.h" +#include + extern Window *statusWindow; Setup::Setup(): @@ -103,12 +105,12 @@ void Setup::action(const gcn::ActionEvent &event) if (event.getId() == "Apply") { setVisible(false); - for_each(mTabs.begin(), mTabs.end(), std::mem_fun(&SetupTab::apply)); + for_each(mTabs.begin(), mTabs.end(), std::mem_fn(&SetupTab::apply)); } else if (event.getId() == "Cancel") { setVisible(false); - for_each(mTabs.begin(), mTabs.end(), std::mem_fun(&SetupTab::cancel)); + for_each(mTabs.begin(), mTabs.end(), std::mem_fn(&SetupTab::cancel)); } else if (event.getId() == "Reset Windows") { diff --git a/src/gui/tradewindow.h b/src/gui/tradewindow.h index 59ddcbdc..20da4574 100644 --- a/src/gui/tradewindow.h +++ b/src/gui/tradewindow.h @@ -117,7 +117,7 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener */ void setStatus(Status s); - typedef const std::auto_ptr InventoryPtr; + typedef const std::unique_ptr InventoryPtr; InventoryPtr mMyInventory; InventoryPtr mPartnerInventory; diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp index 4a31fa63..9247f67a 100644 --- a/src/gui/widgets/button.cpp +++ b/src/gui/widgets/button.cpp @@ -182,7 +182,7 @@ Button::~Button() { for (int mode = 0; mode < BUTTON_COUNT; ++mode) { - for_each(mButton[mode].grid, mButton[mode].grid + 9, + std::for_each(mButton[mode].grid, mButton[mode].grid + 9, dtor()); } delete[] mButton; diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index e90f6073..101afaef 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -102,7 +102,7 @@ DropDown::~DropDown() buttons[1][0]->decRef(); buttons[1][1]->decRef(); - for_each(skin.grid, skin.grid + 9, dtor()); + std::for_each(skin.grid, skin.grid + 9, dtor()); } delete mScrollArea; diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp index 5c5976c1..4f341af0 100644 --- a/src/gui/widgets/playerbox.cpp +++ b/src/gui/widgets/playerbox.cpp @@ -75,7 +75,7 @@ PlayerBox::~PlayerBox() if (instances == 0) { - for_each(background.grid, background.grid + 9, dtor()); + std::for_each(background.grid, background.grid + 9, dtor()); } } diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp index 27b194ff..4695f5ab 100644 --- a/src/gui/widgets/progressbar.cpp +++ b/src/gui/widgets/progressbar.cpp @@ -88,7 +88,7 @@ ProgressBar::~ProgressBar() if (mInstances == 0) { - for_each(mBorder.grid, mBorder.grid + 9, dtor()); + std::for_each(mBorder.grid, mBorder.grid + 9, dtor()); } } diff --git a/src/gui/widgets/scrollarea.cpp b/src/gui/widgets/scrollarea.cpp index d5e824e1..c95adeaa 100644 --- a/src/gui/widgets/scrollarea.cpp +++ b/src/gui/widgets/scrollarea.cpp @@ -66,9 +66,9 @@ ScrollArea::~ScrollArea() if (instances == 0) { - for_each(background.grid, background.grid + 9, dtor()); - for_each(vMarker.grid, vMarker.grid + 9, dtor()); - for_each(vMarkerHi.grid, vMarkerHi.grid + 9, dtor()); + std::for_each(background.grid, background.grid + 9, dtor()); + std::for_each(vMarker.grid, vMarker.grid + 9, dtor()); + std::for_each(vMarkerHi.grid, vMarkerHi.grid + 9, dtor()); buttons[UP][0]->decRef(); buttons[UP][1]->decRef(); diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp index 17b7108f..c8ed2141 100644 --- a/src/gui/widgets/tab.cpp +++ b/src/gui/widgets/tab.cpp @@ -76,7 +76,7 @@ Tab::~Tab() { for (int mode = 0; mode < TAB_COUNT; mode++) { - for_each(tabImg[mode].grid, tabImg[mode].grid + 9, dtor()); + std::for_each(tabImg[mode].grid, tabImg[mode].grid + 9, dtor()); } } } diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index ec57f1c7..e7c279b2 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -84,7 +84,7 @@ TextField::~TextField() instances--; if (instances == 0) - for_each(skin.grid, skin.grid + 9, dtor()); + std::for_each(skin.grid, skin.grid + 9, dtor()); } void TextField::updateAlpha() diff --git a/src/net/manaserv/messagehandler.h b/src/net/manaserv/messagehandler.h index 6e0221cb..8949d34e 100644 --- a/src/net/manaserv/messagehandler.h +++ b/src/net/manaserv/messagehandler.h @@ -41,7 +41,7 @@ class MessageHandler : public Net::MessageHandler virtual void handleMessage(MessageIn &msg) = 0; }; -typedef const std::auto_ptr MessageHandlerPtr; +typedef const std::unique_ptr MessageHandlerPtr; } // namespace ManaServ diff --git a/src/net/tmwa/messagehandler.h b/src/net/tmwa/messagehandler.h index 2b1f5b7e..b598f896 100644 --- a/src/net/tmwa/messagehandler.h +++ b/src/net/tmwa/messagehandler.h @@ -49,7 +49,7 @@ class MessageHandler : public Net::MessageHandler Network *mNetwork; }; -typedef const std::auto_ptr MessageHandlerPtr; +typedef const std::unique_ptr MessageHandlerPtr; } diff --git a/src/resources/theme.cpp b/src/resources/theme.cpp index 96927ac8..1490dbf5 100644 --- a/src/resources/theme.cpp +++ b/src/resources/theme.cpp @@ -84,8 +84,8 @@ void Skin::updateAlpha(float minimumOpacityAllowed) const float alpha = std::max(minimumOpacityAllowed, config.getFloatValue("guialpha")); - for_each(mBorder.grid, mBorder.grid + 9, - std::bind2nd(std::mem_fun(&Image::setAlpha), alpha)); + std::for_each(mBorder.grid, mBorder.grid + 9, + [=] (Image *img) { img->setAlpha(alpha); }); mCloseImage->setAlpha(alpha); mStickyImageUp->setAlpha(alpha); diff --git a/src/utils/dtor.h b/src/utils/dtor.h index 223b73ed..76c68725 100644 --- a/src/utils/dtor.h +++ b/src/utils/dtor.h @@ -23,18 +23,16 @@ #define UTILS_DTOR_H #include -#include #include template -struct dtor : public std::unary_function +struct dtor { void operator()(T &ptr) { delete ptr; } }; template -struct dtor > : -public std::unary_function , void> +struct dtor> { void operator()(std::pair &pair) { delete pair.second; } }; -- cgit v1.2.3-60-g2f50 From 3c1b2d1c2a5bca25de5c2523c7ddde4c9dcdacde Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 11:29:12 +0100 Subject: Fixed a few coding errors the compiler complained about --- src/guild.cpp | 2 +- src/party.cpp | 2 +- src/utils/stringutils.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/guild.cpp b/src/guild.cpp index 2beee4f5..714ca010 100644 --- a/src/guild.cpp +++ b/src/guild.cpp @@ -169,7 +169,7 @@ void Guild::setRights(short rights) bool Guild::isMember(GuildMember *member) const { - if (member->mGuild > 0 && member->mGuild != this) + if (member->mGuild != nullptr && member->mGuild != this) return false; MemberList::const_iterator itr = mMembers.begin(), diff --git a/src/party.cpp b/src/party.cpp index 344bbdad..126a63c1 100644 --- a/src/party.cpp +++ b/src/party.cpp @@ -168,7 +168,7 @@ void Party::setRights(short rights) bool Party::isMember(PartyMember *member) const { - if (member->mParty > 0 && member->mParty != this) + if (member->mParty != nullptr && member->mParty != this) return false; MemberList::const_iterator itr = mMembers.begin(), diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index 4f27d41b..05f1bf7b 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -136,7 +136,7 @@ int compareStrI(const std::string &a, const std::string &b) std::string::const_iterator itB = b.begin(); std::string::const_iterator endB = b.end(); - for (; itA < endA, itB < endB; ++itA, ++itB) + for (; itA < endA && itB < endB; ++itA, ++itB) { int comp = tolower(*itA) - tolower(*itB); if (comp) -- cgit v1.2.3-60-g2f50 From 35cb994948858219a125f648c464ff2c0178bd73 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 11:31:51 +0100 Subject: Removed undefined '__EXPORT__' There should be no need to export the functions explicitly, given that they are compiled as part of the executable. --- src/utils/physfsrwops.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/utils/physfsrwops.h b/src/utils/physfsrwops.h index 406fba6f..8008b224 100644 --- a/src/utils/physfsrwops.h +++ b/src/utils/physfsrwops.h @@ -40,7 +40,7 @@ extern "C" { * @return A valid SDL_RWops structure on success, NULL on error. Specifics * of the error can be gleaned from PHYSFS_getLastError(). */ -__EXPORT__ SDL_RWops *PHYSFSRWOPS_openRead(const char *fname); +SDL_RWops *PHYSFSRWOPS_openRead(const char *fname); /** * Open a platform-independent filename for writing, and make it accessible @@ -52,7 +52,7 @@ __EXPORT__ SDL_RWops *PHYSFSRWOPS_openRead(const char *fname); * @return A valid SDL_RWops structure on success, NULL on error. Specifics * of the error can be gleaned from PHYSFS_getLastError(). */ -__EXPORT__ SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname); +SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname); /** * Open a platform-independent filename for appending, and make it accessible @@ -64,7 +64,7 @@ __EXPORT__ SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname); * @return A valid SDL_RWops structure on success, NULL on error. Specifics * of the error can be gleaned from PHYSFS_getLastError(). */ -__EXPORT__ SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname); +SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname); /** * Make a SDL_RWops from an existing PhysicsFS file handle. You should @@ -76,7 +76,7 @@ __EXPORT__ SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname); * @return A valid SDL_RWops structure on success, NULL on error. Specifics * of the error can be gleaned from PHYSFS_getLastError(). */ -__EXPORT__ SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_File *handle); +SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_File *handle); #ifdef __cplusplus } @@ -85,4 +85,3 @@ __EXPORT__ SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_File *handle); #endif /* include-once blocker */ /* end of physfsrwops.h ... */ - -- cgit v1.2.3-60-g2f50 From 1ebf213faba82e93510ab689ea9a7ce92033a56a Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 12:04:27 +0100 Subject: Fixed potential crash on exit --- src/client.cpp | 3 +-- src/resources/settingsmanager.cpp | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 92c8c63a..b7dca379 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -761,8 +761,7 @@ int Client::exec() // Load XML databases CharDB::load(); - if (itemDb) - delete itemDb; + delete itemDb; switch (Net::getNetworkType()) { diff --git a/src/resources/settingsmanager.cpp b/src/resources/settingsmanager.cpp index 940ebb59..a26fae9d 100644 --- a/src/resources/settingsmanager.cpp +++ b/src/resources/settingsmanager.cpp @@ -85,7 +85,8 @@ namespace SettingsManager NPCDB::unload(); SpecialDB::unload(); MonsterDB::unload(); - itemDb->unload(); + if (itemDb) + itemDb->unload(); hairDB.unload(); Attributes::unload(); } @@ -209,4 +210,3 @@ namespace SettingsManager } } - -- cgit v1.2.3-60-g2f50 From 3967120df0371a8e1a0ceb10230bfa6cb77ce6ef Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 12:26:18 +0100 Subject: Removed project files for Qt Creator Qt Creator can just open the CMakeLists.txt these days. --- .gitignore | 4 +- mana.config | 1 - mana.creator | 1 - mana.files | 584 ------------------------------------------------------ mana.includes | 3 - update-creator.sh | 8 - 6 files changed, 2 insertions(+), 599 deletions(-) delete mode 100644 mana.config delete mode 100644 mana.creator delete mode 100644 mana.files delete mode 100644 mana.includes delete mode 100755 update-creator.sh diff --git a/.gitignore b/.gitignore index 83dbf8b3..e97a6c84 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,7 @@ packaging/windows/upx/* data/music/*.ogg # files created by Qt Creator -mana.creator.user* +CMakeLists.txt.user* # files created by gtags GPATH @@ -53,4 +53,4 @@ Xcode/mana.xcodeproj/xcuserdata Xcode/mana.xcodeproj/project.xcworkspace/xcuserdata Xcode/mana-10.7.xcodeproj/xcuserdata Xcode/mana-10.7.xcodeproj/project.xcworkspace/xcuserdata -.DS_Store \ No newline at end of file +.DS_Store diff --git a/mana.config b/mana.config deleted file mode 100644 index 63f90c97..00000000 --- a/mana.config +++ /dev/null @@ -1 +0,0 @@ -#define USE_OPENGL diff --git a/mana.creator b/mana.creator deleted file mode 100644 index e94cbbd3..00000000 --- a/mana.creator +++ /dev/null @@ -1 +0,0 @@ -[General] diff --git a/mana.files b/mana.files deleted file mode 100644 index 16a0a9a6..00000000 --- a/mana.files +++ /dev/null @@ -1,584 +0,0 @@ -CMakeLists.txt -data/CMakeLists.txt -data/fonts/CMakeLists.txt -data/graphics/CMakeLists.txt -data/graphics/gui/CMakeLists.txt -data/graphics/gui/colors.xml -data/graphics/gui/speechbubble.xml -data/graphics/gui/window.xml -data/graphics/images/CMakeLists.txt -data/graphics/sprites/CMakeLists.txt -data/graphics/sprites/error.xml -data/help/CMakeLists.txt -data/help/about.txt -data/help/changes.txt -data/help/commands.txt -data/help/header.txt -data/help/index.txt -data/help/support.txt -data/help/windows.txt -data/icons/CMakeLists.txt -data/sfx/CMakeLists.txt -data/sfx/system/CMakeLists.txt -docs/HACKING.txt -docs/example.mana -docs/items.txt -docs/packages.txt -docs/progression.txt -libs/enet/CMakeLists.txt -libs/enet/callbacks.c -libs/enet/compress.c -libs/enet/design.txt -libs/enet/host.c -libs/enet/include/enet/callbacks.h -libs/enet/include/enet/enet.h -libs/enet/include/enet/list.h -libs/enet/include/enet/protocol.h -libs/enet/include/enet/time.h -libs/enet/include/enet/types.h -libs/enet/include/enet/unix.h -libs/enet/include/enet/utility.h -libs/enet/include/enet/win32.h -libs/enet/list.c -libs/enet/packet.c -libs/enet/peer.c -libs/enet/protocol.c -libs/enet/unix.c -libs/enet/win32.c -packaging/windows/portable.xml -packaging/windows/readme.txt -po/CMakeLists.txt -src/CMakeLists.txt -src/SDLMain.h -src/actor.cpp -src/actor.h -src/actorsprite.cpp -src/actorsprite.h -src/actorspritemanager.cpp -src/actorspritemanager.h -src/animatedsprite.cpp -src/animatedsprite.h -src/animationparticle.cpp -src/animationparticle.h -src/avatar.cpp -src/avatar.h -src/being.cpp -src/being.h -src/channel.cpp -src/channel.h -src/channelmanager.cpp -src/channelmanager.h -src/chatlogger.cpp -src/chatlogger.h -src/client.cpp -src/client.h -src/commandhandler.cpp -src/commandhandler.h -src/compoundsprite.cpp -src/compoundsprite.h -src/configuration.cpp -src/configuration.h -src/defaults.cpp -src/defaults.h -src/effectmanager.cpp -src/effectmanager.h -src/emoteshortcut.cpp -src/emoteshortcut.h -src/equipment.h -src/event.cpp -src/event.h -src/eventlistener.cpp -src/eventlistener.h -src/flooritem.cpp -src/flooritem.h -src/game.cpp -src/game.h -src/graphics.cpp -src/graphics.h -src/gui/beingpopup.cpp -src/gui/beingpopup.h -src/gui/buydialog.cpp -src/gui/buydialog.h -src/gui/buyselldialog.cpp -src/gui/buyselldialog.h -src/gui/changeemaildialog.cpp -src/gui/changeemaildialog.h -src/gui/changepassworddialog.cpp -src/gui/changepassworddialog.h -src/gui/charcreatedialog.cpp -src/gui/charcreatedialog.h -src/gui/charselectdialog.cpp -src/gui/charselectdialog.h -src/gui/chatwindow.cpp -src/gui/chatwindow.h -src/gui/confirmdialog.cpp -src/gui/confirmdialog.h -src/gui/connectiondialog.cpp -src/gui/connectiondialog.h -src/gui/customserverdialog.cpp -src/gui/customserverdialog.h -src/gui/debugwindow.cpp -src/gui/debugwindow.h -src/gui/emotepopup.cpp -src/gui/emotepopup.h -src/gui/equipmentwindow.cpp -src/gui/equipmentwindow.h -src/gui/focushandler.cpp -src/gui/focushandler.h -src/gui/gui.cpp -src/gui/gui.h -src/gui/helpwindow.cpp -src/gui/helpwindow.h -src/gui/inventorywindow.cpp -src/gui/inventorywindow.h -src/gui/itemamountwindow.cpp -src/gui/itemamountwindow.h -src/gui/itempopup.cpp -src/gui/itempopup.h -src/gui/logindialog.cpp -src/gui/logindialog.h -src/gui/minimap.cpp -src/gui/minimap.h -src/gui/ministatuswindow.cpp -src/gui/ministatuswindow.h -src/gui/npcdialog.cpp -src/gui/npcdialog.h -src/gui/npcpostdialog.cpp -src/gui/npcpostdialog.h -src/gui/okdialog.cpp -src/gui/okdialog.h -src/gui/outfitwindow.cpp -src/gui/outfitwindow.h -src/gui/palette.cpp -src/gui/palette.h -src/gui/popupmenu.cpp -src/gui/popupmenu.h -src/gui/quitdialog.cpp -src/gui/quitdialog.h -src/gui/recorder.cpp -src/gui/recorder.h -src/gui/register.cpp -src/gui/register.h -src/gui/sdlinput.cpp -src/gui/sdlinput.h -src/gui/selldialog.cpp -src/gui/selldialog.h -src/gui/serverdialog.cpp -src/gui/serverdialog.h -src/gui/setup.cpp -src/gui/setup.h -src/gui/setup_audio.cpp -src/gui/setup_audio.h -src/gui/setup_colors.cpp -src/gui/setup_colors.h -src/gui/setup_interface.cpp -src/gui/setup_interface.h -src/gui/setup_joystick.cpp -src/gui/setup_joystick.h -src/gui/setup_keyboard.cpp -src/gui/setup_keyboard.h -src/gui/setup_players.cpp -src/gui/setup_players.h -src/gui/setup_video.cpp -src/gui/setup_video.h -src/gui/shortcutwindow.cpp -src/gui/shortcutwindow.h -src/gui/skilldialog.cpp -src/gui/skilldialog.h -src/gui/socialwindow.cpp -src/gui/socialwindow.h -src/gui/specialswindow.cpp -src/gui/specialswindow.h -src/gui/speechbubble.cpp -src/gui/speechbubble.h -src/gui/statuswindow.cpp -src/gui/statuswindow.h -src/gui/textdialog.cpp -src/gui/textdialog.h -src/gui/textpopup.cpp -src/gui/textpopup.h -src/gui/tradewindow.cpp -src/gui/tradewindow.h -src/gui/truetypefont.cpp -src/gui/truetypefont.h -src/gui/unregisterdialog.cpp -src/gui/unregisterdialog.h -src/gui/updaterwindow.cpp -src/gui/updaterwindow.h -src/gui/viewport.cpp -src/gui/viewport.h -src/gui/widgets/avatarlistbox.cpp -src/gui/widgets/avatarlistbox.h -src/gui/widgets/browserbox.cpp -src/gui/widgets/browserbox.h -src/gui/widgets/button.cpp -src/gui/widgets/button.h -src/gui/widgets/channeltab.cpp -src/gui/widgets/channeltab.h -src/gui/widgets/chattab.cpp -src/gui/widgets/chattab.h -src/gui/widgets/checkbox.cpp -src/gui/widgets/checkbox.h -src/gui/widgets/container.cpp -src/gui/widgets/container.h -src/gui/widgets/desktop.cpp -src/gui/widgets/desktop.h -src/gui/widgets/dropdown.cpp -src/gui/widgets/dropdown.h -src/gui/widgets/emoteshortcutcontainer.cpp -src/gui/widgets/emoteshortcutcontainer.h -src/gui/widgets/flowcontainer.cpp -src/gui/widgets/flowcontainer.h -src/gui/widgets/icon.cpp -src/gui/widgets/icon.h -src/gui/widgets/inttextfield.cpp -src/gui/widgets/inttextfield.h -src/gui/widgets/itemcontainer.cpp -src/gui/widgets/itemcontainer.h -src/gui/widgets/itemlinkhandler.cpp -src/gui/widgets/itemlinkhandler.h -src/gui/widgets/itemshortcutcontainer.cpp -src/gui/widgets/itemshortcutcontainer.h -src/gui/widgets/label.cpp -src/gui/widgets/label.h -src/gui/widgets/layout.cpp -src/gui/widgets/layout.h -src/gui/widgets/layouthelper.cpp -src/gui/widgets/layouthelper.h -src/gui/widgets/linkhandler.h -src/gui/widgets/listbox.cpp -src/gui/widgets/listbox.h -src/gui/widgets/passwordfield.cpp -src/gui/widgets/passwordfield.h -src/gui/widgets/playerbox.cpp -src/gui/widgets/playerbox.h -src/gui/widgets/popup.cpp -src/gui/widgets/popup.h -src/gui/widgets/progressbar.cpp -src/gui/widgets/progressbar.h -src/gui/widgets/progressindicator.cpp -src/gui/widgets/progressindicator.h -src/gui/widgets/radiobutton.cpp -src/gui/widgets/radiobutton.h -src/gui/widgets/resizegrip.cpp -src/gui/widgets/resizegrip.h -src/gui/widgets/scrollarea.cpp -src/gui/widgets/scrollarea.h -src/gui/widgets/setuptab.cpp -src/gui/widgets/setuptab.h -src/gui/widgets/shopitems.cpp -src/gui/widgets/shopitems.h -src/gui/widgets/shoplistbox.cpp -src/gui/widgets/shoplistbox.h -src/gui/widgets/shortcutcontainer.cpp -src/gui/widgets/shortcutcontainer.h -src/gui/widgets/slider.cpp -src/gui/widgets/slider.h -src/gui/widgets/spacer.cpp -src/gui/widgets/spacer.h -src/gui/widgets/tab.cpp -src/gui/widgets/tab.h -src/gui/widgets/tabbedarea.cpp -src/gui/widgets/tabbedarea.h -src/gui/widgets/table.cpp -src/gui/widgets/table.h -src/gui/widgets/tablemodel.cpp -src/gui/widgets/tablemodel.h -src/gui/widgets/textbox.cpp -src/gui/widgets/textbox.h -src/gui/widgets/textfield.cpp -src/gui/widgets/textfield.h -src/gui/widgets/textpreview.cpp -src/gui/widgets/textpreview.h -src/gui/widgets/vertcontainer.cpp -src/gui/widgets/vertcontainer.h -src/gui/widgets/whispertab.cpp -src/gui/widgets/whispertab.h -src/gui/widgets/window.cpp -src/gui/widgets/window.h -src/gui/widgets/windowcontainer.cpp -src/gui/widgets/windowcontainer.h -src/gui/windowmenu.cpp -src/gui/windowmenu.h -src/gui/worldselectdialog.cpp -src/gui/worldselectdialog.h -src/guichanfwd.h -src/guild.cpp -src/guild.h -src/imageparticle.cpp -src/imageparticle.h -src/imagesprite.cpp -src/imagesprite.h -src/inventory.cpp -src/inventory.h -src/item.cpp -src/item.h -src/itemshortcut.cpp -src/itemshortcut.h -src/joystick.cpp -src/joystick.h -src/keyboardconfig.cpp -src/keyboardconfig.h -src/localplayer.cpp -src/localplayer.h -src/log.cpp -src/log.h -src/main.cpp -src/main.h -src/map.cpp -src/map.h -src/net/adminhandler.h -src/net/charhandler.cpp -src/net/charhandler.h -src/net/chathandler.h -src/net/download.cpp -src/net/download.h -src/net/gamehandler.h -src/net/generalhandler.h -src/net/guildhandler.h -src/net/inventoryhandler.h -src/net/logindata.h -src/net/loginhandler.h -src/net/manaserv/adminhandler.cpp -src/net/manaserv/adminhandler.h -src/net/manaserv/beinghandler.cpp -src/net/manaserv/beinghandler.h -src/net/manaserv/buysellhandler.cpp -src/net/manaserv/buysellhandler.h -src/net/manaserv/charhandler.cpp -src/net/manaserv/charhandler.h -src/net/manaserv/chathandler.cpp -src/net/manaserv/chathandler.h -src/net/manaserv/connection.cpp -src/net/manaserv/connection.h -src/net/manaserv/defines.h -src/net/manaserv/effecthandler.cpp -src/net/manaserv/effecthandler.h -src/net/manaserv/gamehandler.cpp -src/net/manaserv/gamehandler.h -src/net/manaserv/generalhandler.cpp -src/net/manaserv/generalhandler.h -src/net/manaserv/guildhandler.cpp -src/net/manaserv/guildhandler.h -src/net/manaserv/internal.cpp -src/net/manaserv/internal.h -src/net/manaserv/inventoryhandler.cpp -src/net/manaserv/inventoryhandler.h -src/net/manaserv/itemhandler.cpp -src/net/manaserv/itemhandler.h -src/net/manaserv/loginhandler.cpp -src/net/manaserv/loginhandler.h -src/net/manaserv/manaserv_protocol.h -src/net/manaserv/messagehandler.cpp -src/net/manaserv/messagehandler.h -src/net/manaserv/messagein.cpp -src/net/manaserv/messagein.h -src/net/manaserv/messageout.cpp -src/net/manaserv/messageout.h -src/net/manaserv/network.cpp -src/net/manaserv/network.h -src/net/manaserv/npchandler.cpp -src/net/manaserv/npchandler.h -src/net/manaserv/partyhandler.cpp -src/net/manaserv/partyhandler.h -src/net/manaserv/playerhandler.cpp -src/net/manaserv/playerhandler.h -src/net/manaserv/specialhandler.cpp -src/net/manaserv/specialhandler.h -src/net/manaserv/tradehandler.cpp -src/net/manaserv/tradehandler.h -src/net/messagehandler.h -src/net/net.cpp -src/net/net.h -src/net/npchandler.h -src/net/partyhandler.h -src/net/playerhandler.h -src/net/serverinfo.h -src/net/specialhandler.h -src/net/tmwa/adminhandler.cpp -src/net/tmwa/adminhandler.h -src/net/tmwa/beinghandler.cpp -src/net/tmwa/beinghandler.h -src/net/tmwa/buysellhandler.cpp -src/net/tmwa/buysellhandler.h -src/net/tmwa/charserverhandler.cpp -src/net/tmwa/charserverhandler.h -src/net/tmwa/chathandler.cpp -src/net/tmwa/chathandler.h -src/net/tmwa/gamehandler.cpp -src/net/tmwa/gamehandler.h -src/net/tmwa/generalhandler.cpp -src/net/tmwa/generalhandler.h -src/net/tmwa/gui/guildtab.cpp -src/net/tmwa/gui/guildtab.h -src/net/tmwa/gui/partytab.cpp -src/net/tmwa/gui/partytab.h -src/net/tmwa/guildhandler.cpp -src/net/tmwa/guildhandler.h -src/net/tmwa/inventoryhandler.cpp -src/net/tmwa/inventoryhandler.h -src/net/tmwa/itemhandler.cpp -src/net/tmwa/itemhandler.h -src/net/tmwa/loginhandler.cpp -src/net/tmwa/loginhandler.h -src/net/tmwa/messagehandler.cpp -src/net/tmwa/messagehandler.h -src/net/tmwa/messagein.cpp -src/net/tmwa/messagein.h -src/net/tmwa/messageout.cpp -src/net/tmwa/messageout.h -src/net/tmwa/network.cpp -src/net/tmwa/network.h -src/net/tmwa/npchandler.cpp -src/net/tmwa/npchandler.h -src/net/tmwa/partyhandler.cpp -src/net/tmwa/partyhandler.h -src/net/tmwa/playerhandler.cpp -src/net/tmwa/playerhandler.h -src/net/tmwa/protocol.h -src/net/tmwa/specialhandler.cpp -src/net/tmwa/specialhandler.h -src/net/tmwa/token.h -src/net/tmwa/tradehandler.cpp -src/net/tmwa/tradehandler.h -src/net/tradehandler.h -src/net/worldinfo.h -src/openglgraphics.cpp -src/openglgraphics.h -src/particle.cpp -src/particle.h -src/particlecontainer.cpp -src/particlecontainer.h -src/particleemitter.cpp -src/particleemitter.h -src/particleemitterprop.h -src/party.cpp -src/party.h -src/playerinfo.cpp -src/playerinfo.h -src/playerrelations.cpp -src/playerrelations.h -src/position.cpp -src/position.h -src/properties.h -src/resources/action.cpp -src/resources/action.h -src/resources/ambientlayer.cpp -src/resources/ambientlayer.h -src/resources/animation.cpp -src/resources/animation.h -src/resources/attributes.cpp -src/resources/attributes.h -src/resources/beinginfo.cpp -src/resources/beinginfo.h -src/resources/dye.cpp -src/resources/dye.h -src/resources/emotedb.cpp -src/resources/emotedb.h -src/resources/hairdb.cpp -src/resources/hairdb.h -src/resources/image.cpp -src/resources/image.h -src/resources/imageset.cpp -src/resources/imageset.h -src/resources/imagewriter.cpp -src/resources/imagewriter.h -src/resources/itemdb.cpp -src/resources/itemdb.h -src/resources/iteminfo.cpp -src/resources/iteminfo.h -src/resources/mapreader.cpp -src/resources/mapreader.h -src/resources/monsterdb.cpp -src/resources/monsterdb.h -src/resources/music.cpp -src/resources/music.h -src/resources/npcdb.cpp -src/resources/npcdb.h -src/resources/resource.cpp -src/resources/resource.h -src/resources/resourcemanager.cpp -src/resources/resourcemanager.h -src/resources/settingsmanager.cpp -src/resources/settingsmanager.h -src/resources/soundeffect.cpp -src/resources/soundeffect.h -src/resources/specialdb.cpp -src/resources/specialdb.h -src/resources/spritedef.cpp -src/resources/spritedef.h -src/resources/theme.cpp -src/resources/theme.h -src/resources/userpalette.cpp -src/resources/userpalette.h -src/resources/wallpaper.cpp -src/resources/wallpaper.h -src/rotationalparticle.cpp -src/rotationalparticle.h -src/shopitem.cpp -src/shopitem.h -src/simpleanimation.cpp -src/simpleanimation.h -src/sound.cpp -src/sound.h -src/sprite.h -src/statuseffect.cpp -src/statuseffect.h -src/text.cpp -src/text.h -src/textmanager.cpp -src/textmanager.h -src/textparticle.cpp -src/textparticle.h -src/textrenderer.h -src/tileset.h -src/units.cpp -src/units.h -src/utils/base64.cpp -src/utils/base64.h -src/utils/copynpaste.cpp -src/utils/copynpaste.h -src/utils/dtor.h -src/utils/gettext.h -src/utils/mathutils.h -src/utils/mkdir.cpp -src/utils/mkdir.h -src/utils/mutex.h -src/utils/path.cpp -src/utils/path.h -src/utils/physfsrwops.c -src/utils/physfsrwops.h -src/utils/sha256.cpp -src/utils/sha256.h -src/utils/specialfolder.cpp -src/utils/specialfolder.h -src/utils/stringutils.cpp -src/utils/stringutils.h -src/utils/xml.cpp -src/utils/xml.h -src/utils/zlib.cpp -src/utils/zlib.h -src/variabledata.h -src/vector.cpp -src/vector.h -src/winver.h -tools/adler32.c -tools/dyecmd/CMakeLists.txt -tools/dyecmd/src/CMakeLists.txt -tools/dyecmd/src/dye.cpp -tools/dyecmd/src/dye.h -tools/dyecmd/src/dyecmd.cpp -tools/dyecmd/src/imagewriter.cpp -tools/dyecmd/src/imagewriter.h -tools/tmxcopy/base64.cpp -tools/tmxcopy/base64.h -tools/tmxcopy/map.cpp -tools/tmxcopy/readme.txt -tools/tmxcopy/tmx_random_fill.cpp -tools/tmxcopy/tmxcollide.cpp -tools/tmxcopy/tmxcopy.cpp -tools/tmxcopy/tostring.h -tools/tmxcopy/xmlutils.cpp -tools/tmxcopy/xmlutils.h -tools/tmxcopy/zlibutils.cpp -tools/tmxcopy/zlibutils.h diff --git a/mana.includes b/mana.includes deleted file mode 100644 index eca337e1..00000000 --- a/mana.includes +++ /dev/null @@ -1,3 +0,0 @@ -src -/usr/include/libxml2 -/usr/include/SDL diff --git a/update-creator.sh b/update-creator.sh deleted file mode 100755 index 259dcc21..00000000 --- a/update-creator.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -git ls-files \*.cpp \ - \*.c \ - \*.h \ - \*.txt \ - \*.xml \ - \*.mana \ - > mana.files -- cgit v1.2.3-60-g2f50 From ee0439f5d1832dbf5460a2e4bf1408b4ae4678bc Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 2 Jan 2011 18:03:16 +0200 Subject: Add error for non tradable items. --- src/net/tmwa/tradehandler.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp index 40e37594..a02056a4 100644 --- a/src/net/tmwa/tradehandler.cpp +++ b/src/net/tmwa/tradehandler.cpp @@ -207,6 +207,11 @@ void TradeHandler::handleMessage(MessageIn &msg) SERVER_NOTICE(_("Failed adding item. Trade " "partner has no free slot.")) break; + case 3: + // Add item failed - non tradable item + SERVER_NOTICE(_("Failed adding item. You " + "cant trade this item.")) + break; default: SERVER_NOTICE(_("Failed adding item for " "unknown reason.")) -- cgit v1.2.3-60-g2f50 From 8fdbae08d7f269c72889f89b56493071a2279350 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Wed, 24 Jan 2024 14:16:19 +0100 Subject: Increased client version to 20 It is unclear whether there are any protocol differences that should be dealt with at this point, but without this the login fails with "Client too old." error. --- src/net/tmwa/loginhandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/tmwa/loginhandler.cpp b/src/net/tmwa/loginhandler.cpp index 51c757cc..77b545fd 100644 --- a/src/net/tmwa/loginhandler.cpp +++ b/src/net/tmwa/loginhandler.cpp @@ -298,7 +298,7 @@ void LoginHandler::sendLoginRegister(const std::string &username, const std::string &password) { MessageOut outMsg(0x0064); - outMsg.writeInt32(0); // client version + outMsg.writeInt32(20); // client version outMsg.writeString(username, 24); outMsg.writeString(password, 24); -- cgit v1.2.3-60-g2f50 From 2c51c98625b225cecfb9628c30d62d4e30f7e3e1 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 15:41:57 +0100 Subject: Ported to SDL2 --- CMakeLists.txt | 4 +- src/CMakeLists.txt | 53 ++--- src/client.cpp | 121 +++++----- src/client.h | 13 +- src/compoundsprite.cpp | 18 +- src/game.cpp | 4 +- src/graphics.cpp | 367 +++++++++++++++++------------ src/graphics.h | 99 +++++--- src/gui/gui.cpp | 18 ++ src/gui/gui.h | 2 + src/gui/sdlinput.cpp | 120 ++++++---- src/gui/sdlinput.h | 22 +- src/gui/setup_keyboard.cpp | 4 +- src/gui/setup_video.cpp | 34 +-- src/gui/truetypefont.cpp | 4 +- src/gui/viewport.cpp | 2 +- src/gui/widgets/desktop.cpp | 24 +- src/gui/widgets/emoteshortcutcontainer.cpp | 2 +- src/gui/widgets/itemshortcutcontainer.cpp | 2 +- src/gui/widgets/textfield.cpp | 43 +--- src/gui/widgets/textfield.h | 6 + src/gui/windowmenu.cpp | 2 +- src/joystick.cpp | 2 +- src/keyboardconfig.cpp | 6 +- src/keyboardconfig.h | 2 +- src/net/download.cpp | 2 +- src/net/tmwa/network.cpp | 2 +- src/openglgraphics.cpp | 75 ++++-- src/openglgraphics.h | 9 +- src/resources/ambientlayer.cpp | 22 +- src/resources/image.cpp | 291 +++-------------------- src/resources/image.h | 58 +---- src/sound.cpp | 3 +- src/utils/copynpaste.cpp | 310 +----------------------- src/utils/copynpaste.h | 10 +- 35 files changed, 656 insertions(+), 1100 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c049d6d4..6d0d62ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -CMAKE_POLICY(VERSION 2.6) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) +CMAKE_POLICY(VERSION 2.8.12) PROJECT(MANA) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c0b3081..7aa6cdcb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,9 +1,10 @@ -FIND_PACKAGE(SDL REQUIRED) -FIND_PACKAGE(SDL_image REQUIRED) -FIND_PACKAGE(SDL_mixer REQUIRED) -FIND_PACKAGE(SDL_net REQUIRED) -FIND_PACKAGE(SDL_ttf REQUIRED) -FIND_PACKAGE(SDL_gfx REQUIRED) +include(FindPkgConfig) +pkg_check_modules(SDL2 REQUIRED sdl2>=2.0.1) +pkg_check_modules(SDL2IMAGE REQUIRED SDL2_image) +pkg_check_modules(SDL2MIXER REQUIRED SDL2_mixer) +pkg_check_modules(SDL2NET REQUIRED SDL2_net) +pkg_check_modules(SDL2TTF REQUIRED SDL2_ttf) +pkg_check_modules(SDL2GFX REQUIRED SDL2_gfx) FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(PhysFS REQUIRED) @@ -69,8 +70,7 @@ ELSEIF (CMAKE_SYSTEM_NAME STREQUAL SunOS) SET(EXTRA_LIBRARIES intl) ENDIF() -SET(GUICHAN_COMPONENTS "SDL") -FIND_PACKAGE(Guichan REQUIRED ${GUICHAN_COMPONENTS}) +FIND_PACKAGE(Guichan REQUIRED) IF (WITH_OPENGL) FIND_PACKAGE(OpenGL REQUIRED) @@ -87,12 +87,12 @@ ENDIF (USE_X11) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} - ${SDL_INCLUDE_DIR} - ${SDLIMAGE_INCLUDE_DIR} - ${SDLMIXER_INCLUDE_DIR} - ${SDLNET_INCLUDE_DIR} - ${SDLTTF_INCLUDE_DIR} - ${SDLGFX_INCLUDE_DIR} + ${SDL2_INCLUDE_DIRS} + ${SDL2IMAGE_INCLUDE_DIRS} + ${SDL2MIXER_INCLUDE_DIRS} + ${SDL2NET_INCLUDE_DIRS} + ${SDL2TTF_INCLUDE_DIRS} + ${SDL2GFX_INCLUDE_DIRS} ${PNG_INCLUDE_DIR} ${PHYSFS_INCLUDE_DIR} ${CURL_INCLUDE_DIR} @@ -116,19 +116,6 @@ IF (MINGW) " -O coff -o ") ENDIF() -# Fix some stuff that gets not hidden by mainline modules -MARK_AS_ADVANCED(PHYSFS_INCLUDE_DIR) -MARK_AS_ADVANCED(PHYSFS_LIBRARY) -MARK_AS_ADVANCED(SDLIMAGE_INCLUDE_DIR) -MARK_AS_ADVANCED(SDLIMAGE_LIBRARY) -MARK_AS_ADVANCED(SDLMAIN_LIBRARY) -MARK_AS_ADVANCED(SDLMIXER_INCLUDE_DIR) -MARK_AS_ADVANCED(SDLMIXER_LIBRARY) -MARK_AS_ADVANCED(SDLNET_INCLUDE_DIR) -MARK_AS_ADVANCED(SDLNET_LIBRARY) -MARK_AS_ADVANCED(SDL_INCLUDE_DIR) -MARK_AS_ADVANCED(SDL_LIBRARY) - SET(SRCS gui/widgets/avatarlistbox.cpp gui/widgets/avatarlistbox.h @@ -677,12 +664,12 @@ ENDIF(ENABLE_MANASERV) TARGET_LINK_LIBRARIES(mana ${INTERNAL_LIBRARIES} - ${SDLGFX_LIBRARIES} - ${SDL_LIBRARY} - ${SDLIMAGE_LIBRARY} - ${SDLMIXER_LIBRARY} - ${SDLNET_LIBRARY} - ${SDLTTF_LIBRARY} + ${SDL2_LIBRARIES} + ${SDL2GFX_LIBRARIES} + ${SDL2IMAGE_LIBRARIES} + ${SDL2MIXER_LIBRARIES} + ${SDL2NET_LIBRARIES} + ${SDL2TTF_LIBRARIES} ${PNG_LIBRARIES} ${PHYSFS_LIBRARY} ${CURL_LIBRARIES} diff --git a/src/client.cpp b/src/client.cpp index b7dca379..4030b042 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -241,11 +241,6 @@ Client::Client(const Options &options): } atexit(SDL_Quit); - SDL_EnableUNICODE(1); - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - - SDL_WM_SetCaption(branding.getValue("appName", "Mana").c_str(), NULL); - ResourceManager *resman = ResourceManager::getInstance(); if (!resman->setWriteDir(mLocalDataDir)) @@ -254,8 +249,6 @@ Client::Client(const Options &options): "Exiting.", mLocalDataDir.c_str())); } - Image::SDLsetEnableAlphaCache(config.getValue("alphaCache", true)); - #if defined __APPLE__ CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); @@ -300,6 +293,39 @@ Client::Client(const Options &options): // Add the local data directory to PhysicsFS search path resman->addToSearchPath(mLocalDataDir, false); + bool useOpenGL = !mOptions.noOpenGL && (config.getValue("opengl", 1) == 1); + + // Set up the transparency option for low CPU when not using OpenGL. + if (!useOpenGL && (config.getValue("disableTransparency", 0) == 1)) + Image::SDLdisableTransparency(); + +#ifdef USE_OPENGL + // Setup image loading for the right image format + Image::setLoadAsOpenGL(useOpenGL); + + // Create the graphics context + graphics = useOpenGL ? new OpenGLGraphics : new Graphics; +#else + // Create the graphics context + graphics = new Graphics; +#endif + + const int width = config.getIntValue("screenwidth"); + const int height = config.getIntValue("screenheight"); + const bool fullscreen = config.getBoolValue("screen"); + + // Try to set the desired video mode + if (!graphics->setVideoMode(width, height, fullscreen)) + { + logger->error(strprintf("Couldn't set %dx%d video mode: %s", + width, height, SDL_GetError())); + } + + SDL_SetWindowTitle(graphics->getTarget(), + branding.getValue("appName", "Mana").c_str()); + + Image::setRenderer(graphics->getRenderer()); + std::string iconFile = branding.getValue("appIcon", "icons/mana"); #ifdef _WIN32 iconFile += ".ico"; @@ -325,42 +351,10 @@ Client::Client(const Options &options): mIcon = IMG_Load(iconFile.c_str()); if (mIcon) { - SDL_SetAlpha(mIcon, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); - SDL_WM_SetIcon(mIcon, NULL); + SDL_SetWindowIcon(graphics->getTarget(), mIcon); } #endif - bool useOpenGL = !mOptions.noOpenGL && (config.getValue("opengl", 1) == 1); - - // Set up the transparency option for low CPU when not using OpenGL. - if (!useOpenGL && (config.getValue("disableTransparency", 0) == 1)) - Image::SDLdisableTransparency(); - -#ifdef USE_OPENGL - - // Setup image loading for the right image format - Image::setLoadAsOpenGL(useOpenGL); - - // Create the graphics context - graphics = useOpenGL ? new OpenGLGraphics : new Graphics; -#else - // Create the graphics context - graphics = new Graphics; -#endif - - const int width = config.getIntValue("screenwidth"); - const int height = config.getIntValue("screenheight"); - const int bpp = 0; - const bool fullscreen = config.getBoolValue("screen"); - const bool hwaccel = config.getBoolValue("hwaccel"); - - // Try to set the desired video mode - if (!graphics->setVideoMode(width, height, bpp, fullscreen, hwaccel)) - { - logger->error(strprintf("Couldn't set %dx%dx%d video mode: %s", - width, height, bpp, SDL_GetError())); - } - // Initialize for drawing graphics->_beginDraw(); @@ -511,8 +505,12 @@ int Client::exec() case SDL_KEYDOWN: break; - case SDL_VIDEORESIZE: - handleVideoResize(event.resize.w, event.resize.h); + case SDL_WINDOWEVENT: + switch (event.window.event) { + case SDL_WINDOWEVENT_RESIZED: + handleVideoResize(event.window.data1, event.window.data2); + break; + } break; } @@ -1374,27 +1372,17 @@ void Client::accountLogin(LoginData *loginData) void Client::handleVideoResize(int width, int height) { - // Keep a minimum size. This isn't adhered to by the actual window, but - // it keeps some window positions from getting messed up. - width = std::max(640, width); - height = std::max(480, height); - if (graphics->getWidth() == width && graphics->getHeight() == height) return; - if (graphics->changeVideoMode(width, - height, - graphics->getBpp(), - false, - graphics->getHWAccel())) - { - videoResized(width, height); + graphics->videoResized(width, height); - // Since everything appears to have worked out, remember to store the - // new size in the configuration. - config.setValue("screenwidth", width); - config.setValue("screenheight", height); - } + videoResized(width, height); + + // Since everything appears to have worked out, remember to store the + // new size in the configuration. + config.setValue("screenwidth", width); + config.setValue("screenheight", height); } void Client::videoResized(int width, int height) @@ -1410,3 +1398,18 @@ void Client::videoResized(int width, int height) if (mGame) mGame->videoResized(width, height); } + +bool Client::isActive() +{ + return !(SDL_GetWindowFlags(graphics->getTarget()) & SDL_WINDOW_MINIMIZED); +} + +bool Client::hasInputFocus() +{ + return SDL_GetWindowFlags(graphics->getTarget()) & SDL_WINDOW_INPUT_FOCUS; +} + +bool Client::hasMouseFocus() +{ + return SDL_GetWindowFlags(graphics->getTarget()) & SDL_WINDOW_MOUSE_FOCUS; +} diff --git a/src/client.h b/src/client.h index 4ad5562d..28fd4445 100644 --- a/src/client.h +++ b/src/client.h @@ -29,7 +29,7 @@ #include #include -#include +#include #include @@ -214,14 +214,9 @@ public: */ void videoResized(int width, int height); - static bool isActive() - { return SDL_GetAppState() & SDL_APPACTIVE; } - - static bool hasInputFocus() - { return SDL_GetAppState() & SDL_APPINPUTFOCUS; } - - static bool hasMouseFocus() - { return SDL_GetAppState() & SDL_APPMOUSEFOCUS; } + static bool isActive(); + static bool hasInputFocus(); + static bool hasMouseFocus(); private: void initRootDir(); diff --git a/src/compoundsprite.cpp b/src/compoundsprite.cpp index cd07ca51..0f231535 100644 --- a/src/compoundsprite.cpp +++ b/src/compoundsprite.cpp @@ -20,7 +20,6 @@ #include "compoundsprite.h" -#include "game.h" #include "graphics.h" #include "map.h" @@ -223,6 +222,7 @@ int CompoundSprite::getDuration() const return duration; } +#if 0 static void updateValues(int &dimension, int &pos, int imgDimUL, int imgDimRD, int imgOffset) { // Handle going beyond the left/up @@ -238,11 +238,18 @@ static void updateValues(int &dimension, int &pos, int imgDimUL, int imgDimRD, i if (temp > dimension) dimension = temp; } - -#include "localplayer.h" +#endif void CompoundSprite::redraw() const { +#if 1 // TODO_SDL2: Does it make sense to implement CompoundSprite? + mWidth = mSprites.at(0)->getWidth(); + mHeight = mSprites.at(0)->getHeight(); + mOffsetX = 0; + mOffsetY = 0; + mNeedsRedraw = false; +#else + #ifdef USE_OPENGL // TODO OpenGL support if (Image::getLoadAsOpenGL()) @@ -295,7 +302,7 @@ void CompoundSprite::redraw() const int amask = 0xff000000; #endif - SDL_Surface *surface = SDL_CreateRGBSurface(SDL_HWSURFACE, mWidth, mHeight, + SDL_Surface *surface = SDL_CreateRGBSurface(0, mWidth, mHeight, 32, rmask, gmask, bmask, amask); if (!surface) @@ -322,7 +329,7 @@ void CompoundSprite::redraw() const delete graphics; - SDL_Surface *surfaceA = SDL_CreateRGBSurface(SDL_HWSURFACE, mWidth, mHeight, + SDL_Surface *surfaceA = SDL_CreateRGBSurface(0, mWidth, mHeight, 32, rmask, gmask, bmask, amask); SDL_SetAlpha(surface, 0, SDL_ALPHA_OPAQUE); @@ -338,4 +345,5 @@ void CompoundSprite::redraw() const SDL_FreeSurface(surfaceA); mNeedsRedraw = false; +#endif } diff --git a/src/game.cpp b/src/game.cpp index 222e56df..f71d8575 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -398,10 +398,10 @@ void Game::handleInput() { bool used = false; - if (event.type == SDL_VIDEORESIZE) + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) { // Let the client deal with this one (it'll pass down from there) - Client::instance()->handleVideoResize(event.resize.w, event.resize.h); + Client::instance()->handleVideoResize(event.window.data1, event.window.data2); } // Keyboard events (for discontinuous keys) else if (event.type == SDL_KEYDOWN) diff --git a/src/graphics.cpp b/src/graphics.cpp index ac3735f5..b4c65b0a 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -19,8 +19,6 @@ * along with this program. If not, see . */ -#include - #include "graphics.h" #include "log.h" @@ -28,103 +26,95 @@ #include "utils/gettext.h" -#include +#include -Graphics::Graphics(): - mWidth(0), - mHeight(0), - mBpp(0), - mFullscreen(false), - mHWAccel(false), - mBlitMode(BLIT_NORMAL) +Graphics::~Graphics() { + _endDraw(); } -Graphics::~Graphics() +void Graphics::setTarget(SDL_Window *target) { _endDraw(); + + mTarget = target; + + if (mTarget) + _beginDraw(); } -bool Graphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) +bool Graphics::setVideoMode(int w, int h, bool fs) { logger->log("Setting video mode %dx%d %s", w, h, fs ? "fullscreen" : "windowed"); - logger->log("Bits per pixel: %d", bpp); - - int displayFlags = SDL_ANYFORMAT; + int windowFlags = SDL_WINDOW_ALLOW_HIGHDPI; if (fs) - displayFlags |= SDL_FULLSCREEN; + windowFlags |= SDL_WINDOW_FULLSCREEN; else - displayFlags |= SDL_RESIZABLE; + windowFlags |= SDL_WINDOW_RESIZABLE; - if (hwaccel) - displayFlags |= SDL_HWSURFACE | SDL_DOUBLEBUF; - else - displayFlags |= SDL_SWSURFACE; + // TODO_SDL2: Support SDL_WINDOW_FULLSCREEN_DESKTOP - setTarget(SDL_SetVideoMode(w, h, bpp, displayFlags)); + SDL_Window *window = nullptr; + SDL_Renderer *renderer = nullptr; + SDL_CreateWindowAndRenderer(w, h, windowFlags, &window, &renderer); - if (!mTarget) + if (!window) return false; + SDL_SetWindowMinimumSize(window, 640, 480); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + + setTarget(window); + + mRenderer = renderer; mWidth = w; mHeight = h; - mBpp = bpp; mFullscreen = fs; - mHWAccel = hwaccel; - char videoDriverName[64]; - - if (SDL_VideoDriverName(videoDriverName, 64)) - logger->log("Using video driver: %s", videoDriverName); + if (const char *driver = SDL_GetCurrentVideoDriver()) + logger->log("Using video driver: %s", driver); else - logger->log("Using video driver: unknown"); - - const SDL_VideoInfo *vi = SDL_GetVideoInfo(); - - logger->log("Possible to create hardware surfaces: %s", - vi->hw_available ? "yes" : "no"); - logger->log("Window manager available: %s", - vi->wm_available ? "yes" : "no"); - logger->log("Accelerated hardware to hardware blits: %s", - vi->blit_hw ? "yes" : "no"); - logger->log("Accelerated hardware to hardware colorkey blits: %s", - vi->blit_hw_CC ? "yes" : "no"); - logger->log("Accelerated hardware to hardware alpha blits: %s", - vi->blit_hw_A ? "yes" : "no"); - logger->log("Accelerated software to hardware blits: %s", - vi->blit_sw ? "yes" : "no"); - logger->log("Accelerated software to hardware colorkey blits: %s", - vi->blit_sw_CC ? "yes" : "no"); - logger->log("Accelerated software to hardware alpha blits: %s", - vi->blit_sw_A ? "yes" : "no"); - logger->log("Accelerated color fills: %s", - vi->blit_fill ? "yes" : "no"); - logger->log("Available video memory: %d", vi->video_mem); + logger->log("Using video driver: not initialized"); + + SDL_RendererInfo info; + + if (SDL_GetRendererInfo(mRenderer, &info) == 0) { + logger->log("Using renderer: %s", info.name); + + logger->log("The renderer is a software fallback: %s", + (info.flags & SDL_RENDERER_SOFTWARE) ? "yes" : "no"); + logger->log("The renderer is hardware accelerated: %s", + (info.flags & SDL_RENDERER_ACCELERATED) ? "yes" : "no"); + logger->log("Vsync: %s", + (info.flags & SDL_RENDERER_PRESENTVSYNC) ? "on" : "off"); + logger->log("Renderer supports rendering to texture: %s", + (info.flags & SDL_RENDERER_TARGETTEXTURE) ? "yes" : "no"); + logger->log("Max texture size: %dx%d", + info.max_texture_width, info.max_texture_height); + } return true; } -bool Graphics::changeVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) +bool Graphics::changeVideoMode(int w, int h, bool fs) { // Just return success if we're already in this mode if (mWidth == w && mHeight == h && - mBpp == bpp && - mFullscreen == fs && - mHWAccel == hwaccel) + mFullscreen == fs) return true; _endDraw(); - bool success = setVideoMode(w, h, bpp, fs, hwaccel); + bool success = setVideoMode(w, h, fs); // If it didn't work, try to restore the previous mode. If that doesn't // work either, we're in big trouble and bail out. if (!success) { - if (!setVideoMode(mWidth, mHeight, mBpp, mFullscreen, mHWAccel)) { + if (!setVideoMode(mWidth, mHeight, mFullscreen)) { logger->error(_("Failed to change video mode and couldn't " "switch back to the previous mode!")); } @@ -135,6 +125,12 @@ bool Graphics::changeVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) return success; } +void Graphics::videoResized(int w, int h) +{ + mWidth = w; + mHeight = h; +} + int Graphics::getWidth() const { return mWidth; @@ -147,10 +143,10 @@ int Graphics::getHeight() const bool Graphics::drawImage(Image *image, int x, int y) { - if (image) - return drawImage(image, 0, 0, x, y, image->mBounds.w, image->mBounds.h); - else + if (!image) return false; + + return drawImage(image, 0, 0, x, y, image->mBounds.w, image->mBounds.h); } bool Graphics::drawRescaledImage(Image *image, int srcX, int srcY, @@ -160,15 +156,7 @@ bool Graphics::drawRescaledImage(Image *image, int srcX, int srcY, bool useColor) { // Check that preconditions for blitting are met. - if (!mTarget || !image) - return false; - if (!image->mSDLSurface) - return false; - - Image *tmpImage = image->SDLgetScaledImage(desiredWidth, desiredHeight); - bool returnValue = false; - - if (!tmpImage) + if (!mTarget || !image || !image->mTexture) return false; dstX += mClipStack.top().xOffset; @@ -183,76 +171,35 @@ bool Graphics::drawRescaledImage(Image *image, int srcX, int srcY, srcRect.x = srcX; srcRect.y = srcY; srcRect.w = width; srcRect.h = height; + dstRect.w = desiredWidth; + dstRect.h = desiredHeight; - returnValue = !(SDL_BlitSurface(tmpImage->mSDLSurface, &srcRect, - mTarget, &dstRect) < 0); - - tmpImage->decRef(Resource::DeleteImmediately); - - return returnValue; + return !(SDL_RenderCopy(mRenderer, image->mTexture, &srcRect, &dstRect) < 0); } bool Graphics::drawImage(Image *image, int srcX, int srcY, int dstX, int dstY, - int width, int height, bool) + int width, int height, bool useColor) { - // Check that preconditions for blitting are met. - if (!mTarget || !image || !image->mSDLSurface) + if (!image) return false; - dstX += mClipStack.top().xOffset; - dstY += mClipStack.top().yOffset; - - srcX += image->mBounds.x; - srcY += image->mBounds.y; - - SDL_Rect dstRect; - SDL_Rect srcRect; - dstRect.x = dstX; dstRect.y = dstY; - srcRect.x = srcX; srcRect.y = srcY; - srcRect.w = width; - srcRect.h = height; - - if (mBlitMode == BLIT_NORMAL) - return !(SDL_BlitSurface(image->mSDLSurface, &srcRect, mTarget, &dstRect) < 0); - else - return !(SDL_gfxBlitRGBA(image->mSDLSurface, &srcRect, mTarget, &dstRect) < 0); + return drawRescaledImage(image, + srcX, srcY, + dstX, dstY, + width, height, + width, height, useColor); } void Graphics::drawImagePattern(Image *image, int x, int y, int w, int h) { // Check that preconditions for blitting are met. - if (!mTarget || !image) - return; - if (!image->mSDLSurface) + if (!image) return; const int iw = image->getWidth(); const int ih = image->getHeight(); - if (iw == 0 || ih == 0) - return; - - for (int py = 0; py < h; py += ih) // Y position on pattern plane - { - int dh = (py + ih >= h) ? h - py : ih; - int srcY = image->mBounds.y; - int dstY = y + py + mClipStack.top().yOffset; - - for (int px = 0; px < w; px += iw) // X position on pattern plane - { - int dw = (px + iw >= w) ? w - px : iw; - int srcX = image->mBounds.x; - int dstX = x + px + mClipStack.top().xOffset; - - SDL_Rect dstRect; - SDL_Rect srcRect; - dstRect.x = dstX; dstRect.y = dstY; - srcRect.x = srcX; srcRect.y = srcY; - srcRect.w = dw; srcRect.h = dh; - - SDL_BlitSurface(image->mSDLSurface, &srcRect, mTarget, &dstRect); - } - } + drawRescaledImagePattern(image, x, y, w, h, iw, ih); } void Graphics::drawRescaledImagePattern(Image *image, @@ -261,50 +208,34 @@ void Graphics::drawRescaledImagePattern(Image *image, int scaledWidth, int scaledHeight) { // Check that preconditions for blitting are met. - if (!mTarget || !image) - return; - if (!image->mSDLSurface) + if (!mTarget || !image || !image->mTexture) return; if (scaledHeight == 0 || scaledWidth == 0) return; - Image *tmpImage = image->SDLgetScaledImage(scaledWidth, scaledHeight); - if (!tmpImage) - return; - - const int iw = tmpImage->getWidth(); - const int ih = tmpImage->getHeight(); - - if (iw == 0 || ih == 0) - { - tmpImage->decRef(Resource::DeleteImmediately); - return; - } - - for (int py = 0; py < h; py += ih) // Y position on pattern plane + for (int py = 0; py < h; py += scaledHeight) // Y position on pattern plane { - int dh = (py + ih >= h) ? h - py : ih; - int srcY = tmpImage->mBounds.y; + int dh = (py + scaledHeight >= h) ? h - py : scaledHeight; + int srcY = image->mBounds.y; int dstY = y + py + mClipStack.top().yOffset; - for (int px = 0; px < w; px += iw) // X position on pattern plane + for (int px = 0; px < w; px += scaledWidth) // X position on pattern plane { - int dw = (px + iw >= w) ? w - px : iw; - int srcX = tmpImage->mBounds.x; + int dw = (px + scaledWidth >= w) ? w - px : scaledWidth; + int srcX = image->mBounds.x; int dstX = x + px + mClipStack.top().xOffset; SDL_Rect dstRect; SDL_Rect srcRect; dstRect.x = dstX; dstRect.y = dstY; + dstRect.w = dw; dstRect.h = dh; srcRect.x = srcX; srcRect.y = srcY; srcRect.w = dw; srcRect.h = dh; - SDL_BlitSurface(tmpImage->mSDLSurface, &srcRect, mTarget, &dstRect); + SDL_RenderCopy(mRenderer, image->mTexture, &srcRect, &dstRect); } } - - tmpImage->decRef(Resource::DeleteImmediately); } void Graphics::drawImageRect(int x, int y, int w, int h, @@ -361,7 +292,7 @@ void Graphics::drawImageRect(int x, int y, int w, int h, void Graphics::updateScreen() { - SDL_Flip(mTarget); + SDL_RenderPresent(mRenderer); } SDL_Surface *Graphics::getScreenshot() @@ -377,10 +308,140 @@ SDL_Surface *Graphics::getScreenshot() #endif int amask = 0x00000000; - SDL_Surface *screenshot = SDL_CreateRGBSurface(SDL_SWSURFACE, mTarget->w, - mTarget->h, 24, rmask, gmask, bmask, amask); - - SDL_BlitSurface(mTarget, NULL, screenshot, NULL); + SDL_Surface *screenshot = SDL_CreateRGBSurface(0, mWidth, + mHeight, 24, rmask, gmask, bmask, amask); + SDL_RenderReadPixels(mRenderer, NULL, SDL_PIXELFORMAT_RGB888, screenshot->pixels, screenshot->pitch); return screenshot; } + +bool Graphics::pushClipArea(gcn::Rectangle area) +{ + bool result = gcn::Graphics::pushClipArea(area); + updateSDLClipRect(); + return result; +} + +void Graphics::popClipArea() +{ + gcn::Graphics::popClipArea(); + updateSDLClipRect(); +} + +void Graphics::updateSDLClipRect() +{ + if (mClipStack.empty()) + { + SDL_RenderSetClipRect(mRenderer, NULL); + return; + } + + const gcn::ClipRectangle &carea = mClipStack.top(); + SDL_Rect rect; + rect.x = carea.x; + rect.y = carea.y; + rect.w = carea.width; + rect.h = carea.height; + + SDL_RenderSetClipRect(mRenderer, &rect); +} + +void Graphics::drawPoint(int x, int y) +{ + if (mClipStack.empty()) + { + throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw funtion outside of _beginDraw() and _endDraw()?"); + } + + const gcn::ClipRectangle &top = mClipStack.top(); + + x += top.xOffset; + y += top.yOffset; + + if (!top.isPointInRect(x, y)) + return; + + SDL_SetRenderDrawColor(mRenderer, + (Uint8)(mColor.r), + (Uint8)(mColor.g), + (Uint8)(mColor.b), + (Uint8)(mColor.a)); + SDL_RenderDrawPoint(mRenderer, x, y); +} + +void Graphics::drawLine(int x1, int y1, int x2, int y2) +{ + if (mClipStack.empty()) + { + throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw funtion outside of _beginDraw() and _endDraw()?"); + } + + const gcn::ClipRectangle &top = mClipStack.top(); + + x1 += top.xOffset; + y1 += top.yOffset; + x2 += top.xOffset; + y2 += top.yOffset; + + SDL_SetRenderDrawColor(mRenderer, + (Uint8)(mColor.r), + (Uint8)(mColor.g), + (Uint8)(mColor.b), + (Uint8)(mColor.a)); + SDL_RenderDrawLine(mRenderer, x1, y1, x2, y2); +} + +void Graphics::drawRectangle(const gcn::Rectangle &rectangle) +{ + if (mClipStack.empty()) + { + throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw funtion outside of _beginDraw() and _endDraw()?"); + } + + const gcn::ClipRectangle &top = mClipStack.top(); + + SDL_Rect rect; + rect.x = rectangle.x + top.xOffset; + rect.y = rectangle.y + top.yOffset; + rect.w = rectangle.width; + rect.h = rectangle.height; + + SDL_SetRenderDrawColor(mRenderer, + (Uint8)(mColor.r), + (Uint8)(mColor.g), + (Uint8)(mColor.b), + (Uint8)(mColor.a)); + SDL_RenderDrawRect(mRenderer, &rect); +} + +void Graphics::fillRectangle(const gcn::Rectangle &rectangle) +{ + if (mClipStack.empty()) + { + throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw funtion outside of _beginDraw() and _endDraw()?"); + } + + const gcn::ClipRectangle &top = mClipStack.top(); + + gcn::Rectangle area = rectangle; + area.x += top.xOffset; + area.y += top.yOffset; + + if(!area.isIntersecting(top)) + { + return; + } + + SDL_Rect rect; + rect.x = area.x; + rect.y = area.y; + rect.w = area.width; + rect.h = area.height; + + SDL_SetRenderDrawColor(mRenderer, + (Uint8)(mColor.r), + (Uint8)(mColor.g), + (Uint8)(mColor.b), + (Uint8)(mColor.a)); + SDL_RenderFillRect(mRenderer, &rect); +} diff --git a/src/graphics.h b/src/graphics.h index dc3d249e..813d4200 100644 --- a/src/graphics.h +++ b/src/graphics.h @@ -22,13 +22,14 @@ #ifndef GRAPHICS_H #define GRAPHICS_H -#include +#include + +#include +#include class Image; class ImageRect; -struct SDL_Surface; - static const int defaultScreenWidth = 800; static const int defaultScreenHeight = 600; @@ -49,8 +50,9 @@ static const int defaultScreenHeight = 600; * Sections 0, 2, 6 and 8 will remain as is. 1, 3, 4, 5 and 7 will be * repeated to fit the size of the widget. */ -struct ImageRect +class ImageRect { +public: enum ImagePosition { UPPER_LEFT = 0, @@ -70,28 +72,36 @@ struct ImageRect /** * A central point of control for graphics. */ -class Graphics : public gcn::SDLGraphics +class Graphics : public gcn::Graphics { public: - enum BlitMode { - BLIT_NORMAL = 0, - BLIT_GFX - }; - - Graphics(); + Graphics() = default; virtual ~Graphics(); + /** + * Sets the target SDL_Window to draw to. This funtion also pushes a + * clip areas corresponding to the dimension of the target. + * + * @param target the target to draw to. + */ + virtual void setTarget(SDL_Window *target); + + SDL_Window *getTarget() const { return mTarget; } + SDL_Renderer *getRenderer() const { return mRenderer; } + /** * Try to create a window with the given settings. */ - virtual bool setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel); + virtual bool setVideoMode(int w, int h, bool fs); /** * Change the video mode. Can be used for switching to full screen, * changing resolution or adapting after window resize. */ - bool changeVideoMode(int w, int h, int bpp, bool fs, bool hwaccel); + bool changeVideoMode(int w, int h, bool fs); + + virtual void videoResized(int w, int h); /** * Blits an image onto the screen. @@ -176,12 +186,6 @@ class Graphics : public gcn::SDLGraphics drawImageRect(area.x, area.y, area.width, area.height, imgRect); } - void setBlitMode(BlitMode mode) - { mBlitMode = mode; } - - BlitMode getBlitMode() - { return mBlitMode; } - /** * Updates the screen. This is done by either copying the buffer to the * screen or swapping pages. @@ -198,23 +202,11 @@ class Graphics : public gcn::SDLGraphics */ int getHeight() const; - /** - * Returns the amount of bits per pixel that was requested (not the - * actual amount that's currently active). - */ - int getBpp() const { return mBpp; } - /** * Returns whether we're in a full screen mode. */ bool getFullscreen() const { return mFullscreen; } - /** - * Returns whether old-fashioned SDL-based hardware acceleration was - * requested (not whether it's currently active). - */ - bool getHWAccel() const { return mHWAccel; } - /** * Takes a screenshot and returns it as SDL surface. */ @@ -222,13 +214,46 @@ class Graphics : public gcn::SDLGraphics gcn::Font *getFont() const { return mFont; } + virtual bool pushClipArea(gcn::Rectangle area); + + virtual void popClipArea(); + + virtual void drawImage(const gcn::Image *image, + int srcX, + int srcY, + int dstX, + int dstY, + int width, + int height) {} // not used + + virtual void drawPoint(int x, int y); + + virtual void drawLine(int x1, int y1, int x2, int y2); + + virtual void drawRectangle(const gcn::Rectangle &rectangle); + + virtual void fillRectangle(const gcn::Rectangle &rectangle); + + virtual void setColor(const gcn::Color &color) + { + mColor = color; + } + + virtual const gcn::Color &getColor() const + { + return mColor; + } + protected: - int mWidth; - int mHeight; - int mBpp; - bool mFullscreen; - bool mHWAccel; - BlitMode mBlitMode; + void updateSDLClipRect(); + + int mWidth = 0; + int mHeight = 0; + bool mFullscreen = false; + gcn::Color mColor; + + SDL_Window *mTarget = nullptr; + SDL_Renderer *mRenderer = nullptr; }; extern Graphics *graphics; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 019d3002..64509e21 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -26,6 +26,7 @@ #include "gui/sdlinput.h" #include "gui/truetypefont.h" +#include "gui/widgets/textfield.h" #include "gui/widgets/window.h" #include "gui/widgets/windowcontainer.h" @@ -190,6 +191,12 @@ void Gui::logic() Palette::advanceGradients(); gcn::Gui::logic(); + + while (!guiInput->isTextQueueEmpty()) + { + TextInput textInput = guiInput->dequeueTextInput(); + handleTextInput(textInput); + } } void Gui::draw() @@ -264,3 +271,14 @@ void Gui::handleMouseMoved(const gcn::MouseInput &mouseInput) gcn::Gui::handleMouseMoved(mouseInput); mMouseInactivityTimer = 0; } + +void Gui::handleTextInput(const TextInput &textInput) +{ + if (auto focused = mFocusHandler->getFocused()) + { + if (auto textField = dynamic_cast(focused)) + { + textField->textInput(textInput); + } + } +} diff --git a/src/gui/gui.h b/src/gui/gui.h index 006987da..998b6ec8 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -26,6 +26,7 @@ #include +class TextInput; class Graphics; class GuiConfigListener; class ImageSet; @@ -114,6 +115,7 @@ class Gui : public gcn::Gui protected: void handleMouseMoved(const gcn::MouseInput &mouseInput); + void handleTextInput(const TextInput &textInput); private: GuiConfigListener *mConfigListener; diff --git a/src/gui/sdlinput.cpp b/src/gui/sdlinput.cpp index 4ccb7580..6eb58a36 100644 --- a/src/gui/sdlinput.cpp +++ b/src/gui/sdlinput.cpp @@ -106,6 +106,23 @@ gcn::MouseInput SDLInput::dequeueMouseInput() return mouseInput; } +bool SDLInput::isTextQueueEmpty() const +{ + return mTextInputQueue.empty(); +} + +TextInput SDLInput::dequeueTextInput() +{ + if (mTextInputQueue.empty()) + { + throw GCN_EXCEPTION("The queue is empty."); + } + + TextInput textInput(mTextInputQueue.front()); + mTextInputQueue.pop(); + return textInput; +} + void SDLInput::pushInput(SDL_Event event) { gcn::KeyInput keyInput; @@ -119,8 +136,8 @@ void SDLInput::pushInput(SDL_Event event) keyInput.setShiftPressed(event.key.keysym.mod & KMOD_SHIFT); keyInput.setControlPressed(event.key.keysym.mod & KMOD_CTRL); keyInput.setAltPressed(event.key.keysym.mod & KMOD_ALT); - keyInput.setMetaPressed(event.key.keysym.mod & KMOD_META); - keyInput.setNumericPad(event.key.keysym.sym >= SDLK_KP0 + keyInput.setMetaPressed(event.key.keysym.mod & KMOD_GUI); + keyInput.setNumericPad(event.key.keysym.sym >= SDLK_KP_0 && event.key.keysym.sym <= SDLK_KP_EQUALS); mKeyInputQueue.push(keyInput); @@ -132,8 +149,8 @@ void SDLInput::pushInput(SDL_Event event) keyInput.setShiftPressed(event.key.keysym.mod & KMOD_SHIFT); keyInput.setControlPressed(event.key.keysym.mod & KMOD_CTRL); keyInput.setAltPressed(event.key.keysym.mod & KMOD_ALT); - keyInput.setMetaPressed(event.key.keysym.mod & KMOD_META); - keyInput.setNumericPad(event.key.keysym.sym >= SDLK_KP0 + keyInput.setMetaPressed(event.key.keysym.mod & KMOD_GUI); + keyInput.setNumericPad(event.key.keysym.sym >= SDLK_KP_0 && event.key.keysym.sym <= SDLK_KP_EQUALS); mKeyInputQueue.push(keyInput); @@ -144,19 +161,7 @@ void SDLInput::pushInput(SDL_Event event) mouseInput.setX(event.button.x); mouseInput.setY(event.button.y); mouseInput.setButton(convertMouseButton(event.button.button)); - - if (event.button.button == SDL_BUTTON_WHEELDOWN) - { - mouseInput.setType(gcn::MouseInput::WHEEL_MOVED_DOWN); - } - else if (event.button.button == SDL_BUTTON_WHEELUP) - { - mouseInput.setType(gcn::MouseInput::WHEEL_MOVED_UP); - } - else - { - mouseInput.setType(gcn::MouseInput::PRESSED); - } + mouseInput.setType(gcn::MouseInput::PRESSED); mouseInput.setTimeStamp(SDL_GetTicks()); mMouseInputQueue.push(mouseInput); break; @@ -180,6 +185,35 @@ void SDLInput::pushInput(SDL_Event event) mMouseInputQueue.push(mouseInput); break; + case SDL_MOUSEWHEEL: + if (event.wheel.y) { +#if SDL_VERSION_ATLEAST(2, 26, 0) + mouseInput.setX(event.wheel.mouseX); + mouseInput.setY(event.wheel.mouseY); +#else + int x, y; + SDL_GetMouseState(&x, &y); + mouseInput.setX(x); + mouseInput.setY(y); +#endif + mouseInput.setButton(gcn::MouseInput::EMPTY); + mouseInput.setType(event.wheel.y > 0 ? gcn::MouseInput::WHEEL_MOVED_UP + : gcn::MouseInput::WHEEL_MOVED_DOWN); + mouseInput.setTimeStamp(SDL_GetTicks()); + mMouseInputQueue.push(mouseInput); + } + break; + + case SDL_TEXTINPUT: + mTextInputQueue.emplace(event.text.text); + break; + + // TODO_SDL2: This is now a window event + // case SDL_WINDOWEVENT: + // switch (event.window.event) { + // } + // break; +#if 0 case SDL_ACTIVEEVENT: /* * This occurs when the mouse leaves the window and the Gui-chan @@ -206,7 +240,7 @@ void SDLInput::pushInput(SDL_Event event) mMouseInWindow = true; } break; - +#endif } // end switch } @@ -228,9 +262,9 @@ int SDLInput::convertMouseButton(int button) int SDLInput::convertKeyCharacter(SDL_Event event) { - SDL_keysym keysym = event.key.keysym; + SDL_Keysym keysym = event.key.keysym; - int value = keysym.unicode; + int value = keysym.sym; switch (keysym.sym) { @@ -262,16 +296,10 @@ int SDLInput::convertKeyCharacter(SDL_Event event) value = Key::PAUSE; break; case SDLK_SPACE: - // Special characters like ~ (tilde) ends up - // with the keysym.sym SDLK_SPACE which - // without this check would be lost. The check - // is only valid on key down events in SDL. - if (event.type == SDL_KEYUP || keysym.unicode == ' ') - { - value = Key::SPACE; - } + value = Key::SPACE; break; case SDLK_ESCAPE: + case SDLK_AC_BACK: value = Key::ESCAPE; break; case SDLK_DELETE: @@ -289,7 +317,7 @@ int SDLInput::convertKeyCharacter(SDL_Event event) case SDLK_PAGEUP: value = Key::PAGE_UP; break; - case SDLK_PRINT: + case SDLK_PRINTSCREEN: value = Key::PRINT_SCREEN; break; case SDLK_PAGEDOWN: @@ -340,27 +368,21 @@ int SDLInput::convertKeyCharacter(SDL_Event event) case SDLK_F15: value = Key::F15; break; - case SDLK_NUMLOCK: + case SDLK_NUMLOCKCLEAR: value = Key::NUM_LOCK; break; case SDLK_CAPSLOCK: value = Key::CAPS_LOCK; break; - case SDLK_SCROLLOCK: + case SDLK_SCROLLLOCK: value = Key::SCROLL_LOCK; break; - case SDLK_RMETA: + case SDLK_RGUI: value = Key::RIGHT_META; break; - case SDLK_LMETA: + case SDLK_LGUI: value = Key::LEFT_META; break; - case SDLK_LSUPER: - value = Key::LEFT_SUPER; - break; - case SDLK_RSUPER: - value = Key::RIGHT_SUPER; - break; case SDLK_MODE: value = Key::ALT_GR; break; @@ -391,34 +413,34 @@ int SDLInput::convertKeyCharacter(SDL_Event event) { switch (keysym.sym) { - case SDLK_KP0: + case SDLK_KP_0: value = Key::INSERT; break; - case SDLK_KP1: + case SDLK_KP_1: value = Key::END; break; - case SDLK_KP2: + case SDLK_KP_2: value = Key::DOWN; break; - case SDLK_KP3: + case SDLK_KP_3: value = Key::PAGE_DOWN; break; - case SDLK_KP4: + case SDLK_KP_4: value = Key::LEFT; break; - case SDLK_KP5: + case SDLK_KP_5: value = 0; break; - case SDLK_KP6: + case SDLK_KP_6: value = Key::RIGHT; break; - case SDLK_KP7: + case SDLK_KP_7: value = Key::HOME; break; - case SDLK_KP8: + case SDLK_KP_8: value = Key::UP; break; - case SDLK_KP9: + case SDLK_KP_9: value = Key::PAGE_UP; break; default: diff --git a/src/gui/sdlinput.h b/src/gui/sdlinput.h index 90f70df3..09bb788e 100644 --- a/src/gui/sdlinput.h +++ b/src/gui/sdlinput.h @@ -61,13 +61,15 @@ #include -#include +#include #include #include #include #include +#include + namespace Key { enum @@ -122,6 +124,19 @@ namespace Key }; } +class TextInput +{ +public: + TextInput(const char *text) + : mText(text) + {} + + const std::string &getText() const { return mText; } + +private: + std::string mText; +}; + /** * SDL implementation of Input. */ @@ -160,6 +175,10 @@ public: virtual gcn::MouseInput dequeueMouseInput(); + bool isTextQueueEmpty() const; + + TextInput dequeueTextInput(); + protected: /** * Converts a mouse button from SDL to a Guichan mouse button @@ -181,6 +200,7 @@ protected: std::queue mKeyInputQueue; std::queue mMouseInputQueue; + std::queue mTextInputQueue; bool mMouseDown; bool mMouseInWindow; diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp index 5e29519b..b66ba3aa 100644 --- a/src/gui/setup_keyboard.cpp +++ b/src/gui/setup_keyboard.cpp @@ -178,8 +178,8 @@ void Setup_Keyboard::refreshAssignedKey(int index) caption = keyboard.getKeyCaption(index) + ": "; else { - char *temp = SDL_GetKeyName( - (SDLKey) keyboard.getKeyValue(index)); + const char *temp = SDL_GetKeyName( + (SDL_Scancode) keyboard.getKeyValue(index)); caption = strprintf("%-25s", (keyboard.getKeyCaption(index) + ": ").c_str()) + toString(temp); diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp index c4fe60a1..c9d1dbc9 100644 --- a/src/gui/setup_video.cpp +++ b/src/gui/setup_video.cpp @@ -26,7 +26,6 @@ #include "game.h" #include "graphics.h" #include "localplayer.h" -#include "log.h" #include "main.h" #include "particle.h" @@ -91,26 +90,21 @@ class ModeListModel : public gcn::ListModel ModeListModel::ModeListModel() { /* Get available fullscreen/hardware modes */ - SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); - - /* Check which modes are available */ - if (modes == (SDL_Rect **)0) - logger->log("No modes available"); - else if (modes == (SDL_Rect **)-1) - logger->log("All resolutions available"); - else + const int numModes = SDL_GetNumDisplayModes(0); + for (int i = 0; i < numModes; i++) { - for (int i = 0; modes[i]; ++i) - { - const int width = modes[i]->w; - const int height = modes[i]->h; + SDL_DisplayMode mode; + if (SDL_GetDisplayMode(0, i, &mode) != 0) + continue; - // Skip the unreasonably small modes - if (width < 640 || height < 480) - continue; + // Skip the unreasonably small modes + if (mode.w < 640 || mode.h < 480) + continue; - mVideoModes.push_back(toString(width) + "x" + toString(height)); - } + // TODO_SDL2: Modes now dinstinguish between pixel format and refresh rate as well + // TODO_SDL2: Fullscreen mode needs display selection + + mVideoModes.push_back(toString(mode.w) + "x" + toString(mode.h)); } } @@ -326,9 +320,7 @@ void Setup_Video::apply() { if (!graphics->changeVideoMode(screenWidth, screenHeight, - graphics->getBpp(), - fullscreen, - graphics->getHWAccel())) + fullscreen)) { std::stringstream errorMessage; if (fullscreen) diff --git a/src/gui/truetypefont.cpp b/src/gui/truetypefont.cpp index 620ba191..443adaa5 100644 --- a/src/gui/truetypefont.cpp +++ b/src/gui/truetypefont.cpp @@ -28,6 +28,7 @@ #include "utils/stringutils.h" +#include #include const unsigned int CACHE_SIZE = 256; @@ -53,9 +54,10 @@ class TextChunk void generate(TTF_Font *font) { SDL_Color sdlCol; - sdlCol.b = color.b; sdlCol.r = color.r; sdlCol.g = color.g; + sdlCol.b = color.b; + sdlCol.a = color.a; const char *str = getSafeUtf8String(text); SDL_Surface *surface = TTF_RenderUTF8_Blended( diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index e06c5f8d..b4ad1b1d 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -310,7 +310,7 @@ void Viewport::_followMouse() if (mPlayerFollowMouse && button & SDL_BUTTON(1)) { // We create a mouse event and send it to mouseDragged. - Uint8 *keys = SDL_GetKeyState(NULL); + const Uint8 *keys = SDL_GetKeyboardState(NULL); gcn::MouseEvent mouseEvent(NULL, (keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT]), false, diff --git a/src/gui/widgets/desktop.cpp b/src/gui/widgets/desktop.cpp index ce609891..07d1d887 100644 --- a/src/gui/widgets/desktop.cpp +++ b/src/gui/widgets/desktop.cpp @@ -86,14 +86,9 @@ void Desktop::draw(gcn::Graphics *graphics) if (mWallpaper) { - if (!Image::useOpenGL()) - g->drawImage(mWallpaper, - (getWidth() - mWallpaper->getWidth()) / 2, - (getHeight() - mWallpaper->getHeight()) / 2); - else - g->drawRescaledImage(mWallpaper, 0, 0, 0, 0, - mWallpaper->getWidth(), mWallpaper->getHeight(), - getWidth(), getHeight(), false); + g->drawRescaledImage(mWallpaper, 0, 0, 0, 0, + mWallpaper->getWidth(), mWallpaper->getHeight(), + getWidth(), getHeight(), false); } // Draw a thin border under the application version... @@ -125,19 +120,6 @@ void Desktop::setBestFittingWallpaper() mWallpaper->decRef(Resource::DeleteImmediately); mWallpaper = wallpaper; - - // In software mode we try to prescale the image for performance - if (!wallpaper->useOpenGL() && - (wallpaper->getWidth() != width || - wallpaper->getHeight() != height)) - { - if (Image *prescaled = wallpaper->SDLgetScaledImage(width, height)) - { - // Make sure the original can be freed - wallpaper->decRef(); - mWallpaper = prescaled; - } - } } else { diff --git a/src/gui/widgets/emoteshortcutcontainer.cpp b/src/gui/widgets/emoteshortcutcontainer.cpp index 3105a762..cdb2d3c4 100644 --- a/src/gui/widgets/emoteshortcutcontainer.cpp +++ b/src/gui/widgets/emoteshortcutcontainer.cpp @@ -92,7 +92,7 @@ void EmoteShortcutContainer::draw(gcn::Graphics *graphics) // Draw emote keyboard shortcut. const char *key = SDL_GetKeyName( - (SDLKey) keyboard.getKeyValue(keyboard.KEY_EMOTE_1 + i)); + (SDL_Scancode) keyboard.getKeyValue(keyboard.KEY_EMOTE_1 + i)); graphics->setColor(Theme::getThemeColor(Theme::TEXT)); g->drawText(key, emoteX + 2, emoteY + 2, gcn::Graphics::LEFT); diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp index f1690d43..396de3bd 100644 --- a/src/gui/widgets/itemshortcutcontainer.cpp +++ b/src/gui/widgets/itemshortcutcontainer.cpp @@ -86,7 +86,7 @@ void ItemShortcutContainer::draw(gcn::Graphics *graphics) // Draw item keyboard shortcut. const char *key = SDL_GetKeyName( - (SDLKey) keyboard.getKeyValue(keyboard.KEY_SHORTCUT_1 + i)); + (SDL_Scancode) keyboard.getKeyValue(keyboard.KEY_SHORTCUT_1 + i)); graphics->setColor(Theme::getThemeColor(Theme::TEXT)); g->drawText(key, itemX + 2, itemY + 2, gcn::Graphics::LEFT); diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index e7c279b2..c4c00ae4 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -36,6 +36,8 @@ #include +#include + #undef DELETE //Win32 compatibility hack int TextField::instances = 0; @@ -162,33 +164,7 @@ int TextField::getValue() const void TextField::keyPressed(gcn::KeyEvent &keyEvent) { - int val = keyEvent.getKey().getValue(); - - if (val >= 32) - { - int l; - if (val < 128) l = 1; // 0xxxxxxx - else if (val < 0x800) l = 2; // 110xxxxx 10xxxxxx - else if (val < 0x10000) l = 3; // 1110xxxx 10xxxxxx 10xxxxxx - else l = 4; // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - - char buf[4]; - for (int i = 0; i < l; ++i) - { - buf[i] = val >> (6 * (l - i - 1)); - if (i > 0) buf[i] = (buf[i] & 63) | 128; - } - - if (l > 1) buf[0] |= 255 << (8 - l); - - mText.insert(mCaretPosition, std::string(buf, buf + l)); - mCaretPosition += l; - } - - /* In UTF-8, 10xxxxxx is only used for inner parts of characters. So skip - them when processing key presses. */ - - switch (val) + switch (keyEvent.getKey().getValue()) { case Key::LEFT: { @@ -302,8 +278,9 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) return; break; - case 22: // Control code 22, SYNCHRONOUS IDLE, sent on Ctrl+v - handlePaste(); + case SDLK_v: + if (keyEvent.isControlPressed()) + handlePaste(); break; } @@ -311,6 +288,12 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) fixScroll(); } +void TextField::textInput(const TextInput &textInput) +{ + mText.insert(mCaretPosition, textInput.getText()); + mCaretPosition += textInput.getText().length(); +} + void TextField::autoComplete() { if (mAutoComplete && mText.size() > 0) @@ -383,7 +366,7 @@ void TextField::handlePaste() std::string text = getText(); std::string::size_type caretPos = getCaretPosition(); - if (RetrieveBuffer(text, caretPos)) { + if (insertFromClipboard(text, caretPos)) { setText(text); setCaretPosition(caretPos); } diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h index 94cada41..bf60cbc3 100644 --- a/src/gui/widgets/textfield.h +++ b/src/gui/widgets/textfield.h @@ -26,6 +26,7 @@ #include +class TextInput; class ImageRect; class TextField; @@ -115,6 +116,11 @@ class TextField : public gcn::TextField */ void keyPressed(gcn::KeyEvent &keyEvent); + /** + * Handle text input (should possibly be new event in Guichan). + */ + void textInput(const TextInput &textInput); + /** * Set the minimum value for a range */ diff --git a/src/gui/windowmenu.cpp b/src/gui/windowmenu.cpp index 12624bf1..9a53479e 100644 --- a/src/gui/windowmenu.cpp +++ b/src/gui/windowmenu.cpp @@ -170,7 +170,7 @@ static std::string createShortcutCaption(const std::string& text, if (key != KeyboardConfig::KEY_NO_VALUE) { caption += " ("; - caption += SDL_GetKeyName((SDLKey) keyboard.getKeyValue(key)); + caption += SDL_GetKeyName((SDL_Scancode) keyboard.getKeyValue(key)); caption += ")"; } return caption; diff --git a/src/joystick.cpp b/src/joystick.cpp index cc6e532b..a1da181c 100644 --- a/src/joystick.cpp +++ b/src/joystick.cpp @@ -37,7 +37,7 @@ void Joystick::init() joystickCount = SDL_NumJoysticks(); logger->log("%i joysticks/gamepads found", joystickCount); for (int i = 0; i < joystickCount; i++) - logger->log("- %s", SDL_JoystickName(i)); + logger->log("- %s", SDL_JoystickNameForIndex(i)); } Joystick::Joystick(int no): diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp index 30f27e9f..76168f66 100644 --- a/src/keyboardconfig.cpp +++ b/src/keyboardconfig.cpp @@ -101,8 +101,8 @@ static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = { {"keyChatNextTab", SDLK_RIGHTBRACKET, _("Next Chat Tab")}, {"keyOK", SDLK_SPACE, _("Select OK")}, {"keyQuit", SDLK_ESCAPE, _("Quit")}, - {"keyIgnoreInput1", SDLK_LSUPER, _("Ignore input 1")}, - {"keyIgnoreInput2", SDLK_RSUPER, _("Ignore input 2")} + {"keyIgnoreInput1", SDLK_LGUI, _("Ignore input 1")}, + {"keyIgnoreInput2", SDLK_RGUI, _("Ignore input 2")} }; void KeyboardConfig::init() @@ -233,5 +233,5 @@ bool KeyboardConfig::isKeyActive(int index) const void KeyboardConfig::refreshActiveKeys() { - mActiveKeys = SDL_GetKeyState(NULL); + mActiveKeys = SDL_GetKeyboardState(NULL); } diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h index 34aad4c4..03f39551 100644 --- a/src/keyboardconfig.h +++ b/src/keyboardconfig.h @@ -229,7 +229,7 @@ class KeyboardConfig KeyFunction mKey[KEY_TOTAL]; /**< Pointer to all the key data */ - uint8_t *mActiveKeys; /**< Stores a list of all the keys */ + const uint8_t *mActiveKeys; /**< Stores a list of all the keys */ std::string mBindError; }; diff --git a/src/net/download.cpp b/src/net/download.cpp index bccba7a3..61cdf114 100644 --- a/src/net/download.cpp +++ b/src/net/download.cpp @@ -124,7 +124,7 @@ bool Download::start() { logger->log("Starting download: %s", mUrl.c_str()); - mThread = SDL_CreateThread(downloadThread, this); + mThread = SDL_CreateThread(downloadThread, "Download", this); if (!mThread) { diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index 14cfe65f..ed564b46 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -159,7 +159,7 @@ bool Network::connect(ServerInfo server) mToSkip = 0; mState = CONNECTING; - mWorkerThread = SDL_CreateThread(networkThread, this); + mWorkerThread = SDL_CreateThread(networkThread, "Network", this); if (!mWorkerThread) { setError("Unable to create network worker thread"); diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index f30e866d..d831d9ff 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -61,7 +61,13 @@ OpenGLGraphics::~OpenGLGraphics() void OpenGLGraphics::setSync(bool sync) { + if (mSync == sync) + return; + mSync = sync; + + if (mContext) + SDL_GL_SetSwapInterval(sync ? 1 : 0); } void OpenGLGraphics::setReduceInputLag(bool reduceInputLag) @@ -69,44 +75,57 @@ void OpenGLGraphics::setReduceInputLag(bool reduceInputLag) mReduceInputLag = reduceInputLag; } -bool OpenGLGraphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) +bool OpenGLGraphics::setVideoMode(int w, int h, bool fs) { logger->log("Setting video mode %dx%d %s", w, h, fs ? "fullscreen" : "windowed"); - int displayFlags = SDL_ANYFORMAT | SDL_OPENGL; + // TODO_SDL2: Support SDL_WINDOW_ALLOW_HIGHDPI, but check handling of clip area - mWidth = w; - mHeight = h; - mBpp = bpp; - mFullscreen = fs; - mHWAccel = hwaccel; + int windowFlags = SDL_WINDOW_OPENGL; if (fs) { - displayFlags |= SDL_FULLSCREEN; + windowFlags |= SDL_WINDOW_FULLSCREEN; } else { // Resizing currently not supported on Windows, where it would require // reuploading all textures. #if !defined(_WIN32) - displayFlags |= SDL_RESIZABLE; + windowFlags |= SDL_WINDOW_RESIZABLE; #endif } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (!(mTarget = SDL_SetVideoMode(w, h, bpp, displayFlags))) + SDL_Window *window = SDL_CreateWindow("Mana", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + w, h, windowFlags); + if (!window) { + logger->log("Failed to create window: %s", SDL_GetError()); return false; + } + + SDL_SetWindowMinimumSize(window, 640, 480); + + SDL_GLContext glContext = SDL_GL_CreateContext(window); + if (!glContext) { + logger->log("Failed to create OpenGL context: %s", SDL_GetError()); + return false; + } + + mTarget = window; + mContext = glContext; + mWidth = w; + mHeight = h; + mFullscreen = fs; -#ifdef __APPLE__ if (mSync) { - const GLint VBL = 1; - CGLSetParameter(CGLGetCurrentContext(), kCGLCPSwapInterval, &VBL); + SDL_GL_SetSwapInterval(1); } -#endif // Setup OpenGL glViewport(0, 0, w, h); @@ -139,6 +158,18 @@ bool OpenGLGraphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) return true; } +void OpenGLGraphics::videoResized(int w, int h) +{ + _endDraw(); + + mWidth = w; + mHeight = h; + + glViewport(0, 0, w, h); + + _beginDraw(); +} + static inline void drawQuad(Image *image, int srcX, int srcY, int dstX, int dstY, int width, int height) @@ -610,7 +641,7 @@ void OpenGLGraphics::drawRescaledImagePattern(Image *image, void OpenGLGraphics::updateScreen() { - SDL_GL_SwapBuffers(); + SDL_GL_SwapWindow(mTarget); /* * glFinish flushes all OpenGL commands and makes sure they have been @@ -634,7 +665,7 @@ void OpenGLGraphics::_beginDraw() glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(0.0, (double)mTarget->w, (double)mTarget->h, 0.0, -1.0, 1.0); + glOrtho(0.0, (double)mWidth, (double)mHeight, 0.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -646,7 +677,7 @@ void OpenGLGraphics::_beginDraw() glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - pushClipArea(gcn::Rectangle(0, 0, mTarget->w, mTarget->h)); + pushClipArea(gcn::Rectangle(0, 0, mWidth, mHeight)); } void OpenGLGraphics::_endDraw() @@ -656,8 +687,8 @@ void OpenGLGraphics::_endDraw() SDL_Surface* OpenGLGraphics::getScreenshot() { - int h = mTarget->h; - int w = mTarget->w; + int w, h; + SDL_GL_GetDrawableSize(mTarget, &w, &h); GLint pack = 1; SDL_Surface *screenshot = SDL_CreateRGBSurface( @@ -708,6 +739,7 @@ bool OpenGLGraphics::pushClipArea(gcn::Rectangle area) transY = -mClipStack.top().yOffset; } + // Skip Graphics::popClipArea since we don't need to interact with SDL2 bool result = gcn::Graphics::pushClipArea(area); transX += mClipStack.top().xOffset; @@ -716,7 +748,7 @@ bool OpenGLGraphics::pushClipArea(gcn::Rectangle area) glPushMatrix(); glTranslatef(transX, transY, 0); glScissor(mClipStack.top().x, - mTarget->h - mClipStack.top().y - mClipStack.top().height, + mHeight - mClipStack.top().y - mClipStack.top().height, mClipStack.top().width, mClipStack.top().height); @@ -725,6 +757,7 @@ bool OpenGLGraphics::pushClipArea(gcn::Rectangle area) void OpenGLGraphics::popClipArea() { + // Skip Graphics::popClipArea since we don't need to interact with SDL2 gcn::Graphics::popClipArea(); if (mClipStack.empty()) @@ -732,7 +765,7 @@ void OpenGLGraphics::popClipArea() glPopMatrix(); glScissor(mClipStack.top().x, - mTarget->h - mClipStack.top().y - mClipStack.top().height, + mHeight - mClipStack.top().y - mClipStack.top().height, mClipStack.top().width, mClipStack.top().height); } diff --git a/src/openglgraphics.h b/src/openglgraphics.h index 63c32261..01bca360 100644 --- a/src/openglgraphics.h +++ b/src/openglgraphics.h @@ -37,8 +37,8 @@ class OpenGLGraphics : public Graphics ~OpenGLGraphics(); /** - * Sets whether vertical refresh syncing is enabled. Takes effect after - * the next call to setVideoMode(). Only implemented on MacOS for now. + * Sets whether vertical refresh syncing is enabled. Takes effect + * immediately. */ void setSync(bool sync); bool getSync() const { return mSync; } @@ -53,7 +53,9 @@ class OpenGLGraphics : public Graphics void setReduceInputLag(bool reduceInputLag); bool getReduceInputLag() const { return mReduceInputLag; } - bool setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel); + bool setVideoMode(int w, int h, bool fs); + + void videoResized(int w, int h); bool drawImage(Image *image, int srcX, int srcY, @@ -118,6 +120,7 @@ class OpenGLGraphics : public Graphics void drawQuadArrayii(int size); + SDL_GLContext mContext = nullptr; GLfloat *mFloatTexArray; GLint *mIntTexArray; GLint *mIntVertArray; diff --git a/src/resources/ambientlayer.cpp b/src/resources/ambientlayer.cpp index c31afbac..301927f8 100644 --- a/src/resources/ambientlayer.cpp +++ b/src/resources/ambientlayer.cpp @@ -33,25 +33,6 @@ AmbientLayer::AmbientLayer(Image *img, float parallax, mKeepRatio(keepRatio) { mImage->incRef(); - - if (keepRatio && !mImage->useOpenGL() - && defaultScreenWidth != 0 - && defaultScreenHeight != 0 - && graphics->getWidth() != defaultScreenWidth - && graphics->getHeight() != defaultScreenHeight) - { - // Rescale the overlay to keep the ratio as if we were on - // the default resolution... - Image *rescaledOverlay = mImage->SDLgetScaledImage( - (int) mImage->getWidth() / defaultScreenWidth * graphics->getWidth(), - (int) mImage->getHeight() / defaultScreenHeight * graphics->getHeight()); - - if (rescaledOverlay) - { - mImage->decRef(); - mImage = rescaledOverlay; - } - } } AmbientLayer::~AmbientLayer() @@ -86,7 +67,7 @@ void AmbientLayer::update(int timePassed, float dx, float dy) void AmbientLayer::draw(Graphics *graphics, int x, int y) { - if (!mImage->useOpenGL() || !mKeepRatio) + if (!mKeepRatio) graphics->drawImagePattern(mImage, (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY); else @@ -94,5 +75,4 @@ void AmbientLayer::draw(Graphics *graphics, int x, int y) (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY, (int) mImage->getWidth() / defaultScreenWidth * graphics->getWidth(), (int) mImage->getHeight() / defaultScreenHeight * graphics->getHeight()); - } diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 7e592198..6f2609b0 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -29,10 +29,8 @@ #endif #include "log.h" -#include "configuration.h" #include -#include #ifdef USE_OPENGL bool Image::mUseOpenGL = false; @@ -40,47 +38,38 @@ bool Image::mPowerOfTwoTextures = true; int Image::mTextureType = 0; int Image::mTextureSize = 0; #endif -bool Image::mEnableAlphaCache = false; // The low CPU mode is disabled per default bool Image::mDisableTransparency = false; -Image::Image(SDL_Surface *image, bool hasAlphaChannel, Uint8 *alphaChannel): +SDL_Renderer *Image::mRenderer; + +Image::Image(SDL_Texture *texture, int width, int height): mAlpha(1.0f), - mSDLSurface(image), - mAlphaChannel(alphaChannel), - mHasAlphaChannel(hasAlphaChannel) + mTexture(texture) { #ifdef USE_OPENGL mGLImage = 0; #endif - mUseAlphaCache = Image::mEnableAlphaCache; - mBounds.x = 0; mBounds.y = 0; + mBounds.w = width; + mBounds.h = height; - mLoaded = false; + mLoaded = mTexture != nullptr; - if (mSDLSurface) + if (!mLoaded) { - mBounds.w = mSDLSurface->w; - mBounds.h = mSDLSurface->h; - - mLoaded = true; - } - else logger->log( "Image::Image(SDL_Surface*): Couldn't load invalid Surface!"); + } } #ifdef USE_OPENGL Image::Image(GLuint glimage, int width, int height, int texWidth, int texHeight): mAlpha(1.0f), - mSDLSurface(0), - mAlphaChannel(0), - mHasAlphaChannel(true), - mUseAlphaCache(false), + mTexture(0), mGLImage(glimage), mTexWidth(texWidth), mTexHeight(texHeight) @@ -140,10 +129,8 @@ Resource *Image::load(SDL_RWops *rw, Dye const &dye) rgba.Gmask = 0x00FF0000; rgba.Gloss = 0; rgba.Gshift = 16; rgba.Bmask = 0x0000FF00; rgba.Bloss = 0; rgba.Bshift = 8; rgba.Amask = 0x000000FF; rgba.Aloss = 0; rgba.Ashift = 0; - rgba.colorkey = 0; - rgba.alpha = 255; - SDL_Surface *surf = SDL_ConvertSurface(tmpImage, &rgba, SDL_SWSURFACE); + SDL_Surface *surf = SDL_ConvertSurface(tmpImage, &rgba, 0); SDL_FreeSurface(tmpImage); Uint32 *pixels = static_cast< Uint32 * >(surf->pixels); @@ -173,34 +160,14 @@ Image *Image::load(SDL_Surface *tmpImage) return _SDLload(tmpImage); } -void Image::SDLcleanCache() -{ - ResourceManager *resman = ResourceManager::getInstance(); - - for (std::map::iterator - i = mAlphaCache.begin(), i_end = mAlphaCache.end(); - i != i_end; ++i) - { - if (mSDLSurface != i->second) - resman->scheduleDelete(i->second); - i->second = 0; - } - mAlphaCache.clear(); -} - void Image::unload() { mLoaded = false; - if (mSDLSurface) + if (mTexture) { - SDLcleanCache(); - // Free the image surface. - SDL_FreeSurface(mSDLSurface); - mSDLSurface = NULL; - - delete[] mAlphaChannel; - mAlphaChannel = NULL; + SDL_DestroyTexture(mTexture); + mTexture = NULL; } #ifdef USE_OPENGL @@ -221,27 +188,6 @@ bool Image::useOpenGL() #endif } -bool Image::hasAlphaChannel() -{ - if (!mLoaded) - return false; - -#ifdef USE_OPENGL - if (mUseOpenGL) - return true; -#endif - - return mHasAlphaChannel; -} - -SDL_Surface *Image::getByAlpha(float alpha) -{ - std::map::iterator it = mAlphaCache.find(alpha); - if (it != mAlphaCache.end()) - return (*it).second; - return 0; -} - void Image::setAlpha(float alpha) { if (!useOpenGL() && mDisableTransparency) @@ -253,188 +199,26 @@ void Image::setAlpha(float alpha) if (alpha < 0.0f || alpha > 1.0f) return; - if (mSDLSurface) - { - if (mUseAlphaCache) - { - SDL_Surface *surface = getByAlpha(mAlpha); - if (!surface) - { - if (mAlphaCache.size() > 100) - SDLcleanCache(); - - mAlphaCache[mAlpha] = mSDLSurface; - } - surface = getByAlpha(alpha); - if (surface) - { - mAlphaCache.erase(alpha); - mSDLSurface = surface; - mAlpha = alpha; - return; - } - else - { - mSDLSurface = Image::SDLduplicateSurface(mSDLSurface); - } - } - - mAlpha = alpha; - - if (!hasAlphaChannel()) - { - // Set the alpha value this image is drawn at - SDL_SetAlpha(mSDLSurface, SDL_SRCALPHA, (int) (255 * mAlpha)); - } - else - { - if (SDL_MUSTLOCK(mSDLSurface)) - SDL_LockSurface(mSDLSurface); - - // Precompute as much as possible - int maxHeight = std::min((mBounds.y + mBounds.h), mSDLSurface->h); - int maxWidth = std::min((mBounds.x + mBounds.w), mSDLSurface->w); - int i = 0; - - for (int y = mBounds.y; y < maxHeight; y++) - for (int x = mBounds.x; x < maxWidth; x++) - { - i = y * mSDLSurface->w + x; - // Only change the pixel if it was visible at load time... - Uint8 sourceAlpha = mAlphaChannel[i]; - if (sourceAlpha > 0) - { - Uint8 r, g, b, a; - SDL_GetRGBA(((Uint32*) mSDLSurface->pixels)[i], - mSDLSurface->format, - &r, &g, &b, &a); - - a = (Uint8) (sourceAlpha * mAlpha); - - // Here is the pixel we want to set - ((Uint32 *)(mSDLSurface->pixels))[i] = - SDL_MapRGBA(mSDLSurface->format, r, g, b, a); - } - } - - if (SDL_MUSTLOCK(mSDLSurface)) - SDL_UnlockSurface(mSDLSurface); - } - } - else - { - mAlpha = alpha; - } -} - -Image *Image::SDLgetScaledImage(int width, int height) -{ - if (width == 0 || height == 0) - return 0; + mAlpha = alpha; - // Increase our reference count and return ourselves in case of same size - if (width == getWidth() && height == getHeight()) + if (mTexture) { - incRef(); - return this; - } - - if (!mSDLSurface) - return 0; - - ResourceManager *resman = ResourceManager::getInstance(); - - // Generate a unique ID path for storing the scaled version in the - // resource manager. - std::string idPath = getIdPath(); - idPath += ":scaled:"; - idPath += toString(width); - idPath += "x"; - idPath += toString(height); - - // Try whether a scaled version is already available - Image *scaledImage = static_cast(resman->get(idPath)); - - if (!scaledImage) - { - // No scaled version with this size exists already, so create one - SDL_Surface *scaledSurface = zoomSurface(mSDLSurface, - (double) width / getWidth(), - (double) height / getHeight(), - 1); - - if (scaledSurface) - { - scaledImage = load(scaledSurface); - SDL_FreeSurface(scaledSurface); - - // Place the scaled image in the resource manager - resman->addResource(idPath, scaledImage); - } + SDL_SetTextureAlphaMod(mTexture, (Uint8) (255 * mAlpha)); } - - return scaledImage; } -SDL_Surface* Image::SDLduplicateSurface(SDL_Surface* tmpImage) +Image *Image::_SDLload(SDL_Surface *image) { - if (!tmpImage || !tmpImage->format) + if (!image || !mRenderer) return NULL; - return SDL_ConvertSurface(tmpImage, tmpImage->format, SDL_SWSURFACE); + SDL_Texture *texture = SDL_CreateTextureFromSurface(mRenderer, image); + return new Image(texture, image->w, image->h); } -Image *Image::_SDLload(SDL_Surface *tmpImage) +void Image::setRenderer(SDL_Renderer *renderer) { - if (!tmpImage) - return NULL; - - bool hasAlpha = false; - - // The alpha channel to be filled with alpha values - Uint8 *alphaChannel = new Uint8[tmpImage->w * tmpImage->h]; - - if (tmpImage->format->BitsPerPixel == 32) - { - // Figure out whether the image uses its alpha layer - for (int i = 0; i < tmpImage->w * tmpImage->h; ++i) - { - Uint8 r, g, b, a; - SDL_GetRGBA( - ((Uint32*) tmpImage->pixels)[i], - tmpImage->format, - &r, &g, &b, &a); - - if (a != 255) - hasAlpha = true; - - alphaChannel[i] = a; - } - } - - SDL_Surface *image; - - // Convert the surface to the current display format - if (hasAlpha) - image = SDL_DisplayFormatAlpha(tmpImage); - else - { - image = SDL_DisplayFormat(tmpImage); - - // We also delete the alpha channel since - // it's not used. - delete[] alphaChannel; - alphaChannel = NULL; - } - - if (!image) - { - logger->log("Error: Image convert failed."); - delete[] alphaChannel; - return NULL; - } - - return new Image(image, hasAlpha, alphaChannel); + mRenderer = renderer; } #ifdef USE_OPENGL @@ -489,7 +273,7 @@ Image *Image::_GLload(SDL_Surface *image) } // Make sure the alpha channel is not used, but copied to destination - SDL_SetAlpha(oldImage, 0, SDL_ALPHA_OPAQUE); + SDL_SetSurfaceBlendMode(oldImage, SDL_BLENDMODE_NONE); SDL_BlitSurface(oldImage, NULL, image, NULL); } @@ -583,38 +367,24 @@ Image *Image::getSubImage(int x, int y, int width, int height) mTexWidth, mTexHeight); #endif - return new SubImage(this, mSDLSurface, + return new SubImage(this, mTexture, mBounds.x + x, mBounds.y + y, width, height); } -void Image::SDLterminateAlphaCache() -{ - SDLcleanCache(); - mUseAlphaCache = false; -} - //============================================================================ // SubImage Class //============================================================================ -SubImage::SubImage(Image *parent, SDL_Surface *image, +SubImage::SubImage(Image *parent, SDL_Texture *texture, int x, int y, int width, int height): - Image(image), + Image(texture, width, height), mParent(parent) { if (mParent) { mParent->incRef(); - mParent->SDLterminateAlphaCache(); - mHasAlphaChannel = mParent->hasAlphaChannel(); - mAlphaChannel = mParent->SDLgetAlphaChannel(); - } - else - { - mHasAlphaChannel = false; - mAlphaChannel = 0; } // Set up the rectangle. @@ -622,7 +392,6 @@ SubImage::SubImage(Image *parent, SDL_Surface *image, mBounds.y = y; mBounds.w = width; mBounds.h = height; - mUseAlphaCache = false; } #ifdef USE_OPENGL @@ -644,10 +413,8 @@ SubImage::SubImage(Image *parent, GLuint image, SubImage::~SubImage() { - // Avoid destruction of the image - mSDLSurface = 0; - // Avoid possible destruction of its alpha channel - mAlphaChannel = 0; + // Avoid destruction of the texture + mTexture = nullptr; #ifdef USE_OPENGL mGLImage = 0; #endif diff --git a/src/resources/image.h b/src/resources/image.h index b762bf2a..efe2262e 100644 --- a/src/resources/image.h +++ b/src/resources/image.h @@ -37,8 +37,6 @@ #include #endif -#include - class Dye; class Position; @@ -129,12 +127,6 @@ class Image : public Resource */ Image *getSubImage(int x, int y, int width, int height); - /** - * Tells if the image has got an alpha channel - * @return true if it's true, false otherwise. - */ - bool hasAlphaChannel(); - // SDL only public functions /** @@ -146,31 +138,7 @@ class Image : public Resource static bool SDLisTransparencyDisabled() { return mDisableTransparency; } - /** - * Gets an scaled instance of an image. The returned image is managed - * by the ResourceManager. - * - * @param width The desired width of the scaled image. - * @param height The desired height of the scaled image. - * - * @return An Image resource, or 0 on failure. - */ - Image *SDLgetScaledImage(int width, int height); - - /** - * Get the alpha Channel of a SDL surface. - */ - Uint8 *SDLgetAlphaChannel() const - { return mAlphaChannel; } - - SDL_Surface* SDLduplicateSurface(SDL_Surface* tmpImage); - - void SDLcleanCache(); - - void SDLterminateAlphaCache(); - - static void SDLsetEnableAlphaCache(bool n) - { mEnableAlphaCache = n; } + static void setRenderer(SDL_Renderer *renderer); #ifdef USE_OPENGL @@ -204,30 +172,18 @@ class Image : public Resource // ----------------------- /** SDL Constructor */ - Image(SDL_Surface *image, bool hasAlphaChannel = false, - Uint8 *alphaChannel = NULL); + Image(SDL_Texture *texture, int width, int height); - /** SDL_Surface to SDL_Surface Image loader */ + /** SDL_Surface to SDL_Texture Image loader */ static Image *_SDLload(SDL_Surface *tmpImage); - SDL_Surface *getByAlpha(float alpha); - - SDL_Surface *mSDLSurface; - - /** Alpha Channel pointer used for 32bit based SDL surfaces */ - Uint8 *mAlphaChannel; - bool mHasAlphaChannel; - - /** Alpha cache: The cache stores a copy of the image - for specific requested opacities, hence, increasing - the image disply speed */ - std::map mAlphaCache; - bool mUseAlphaCache; - static bool mEnableAlphaCache; + SDL_Texture *mTexture; /** Stores whether the transparency is disabled */ static bool mDisableTransparency; + static SDL_Renderer *mRenderer; + // ----------------------- // OpenGL protected members // ----------------------- @@ -261,7 +217,7 @@ class Image : public Resource class SubImage : public Image { public: - SubImage(Image *parent, SDL_Surface *image, + SubImage(Image *parent, SDL_Texture *texture, int x, int y, int width, int height); #ifdef USE_OPENGL SubImage(Image *parent, GLuint image, int x, int y, diff --git a/src/sound.cpp b/src/sound.cpp index 1af1f136..2fc4f87f 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -112,7 +112,6 @@ void Sound::info() { SDL_version compiledVersion; const SDL_version *linkedVersion; - char driver[40] = "Unknown"; const char *format = "Unknown"; int rate = 0; Uint16 audioFormat = 0; @@ -121,7 +120,7 @@ void Sound::info() MIX_VERSION(&compiledVersion); linkedVersion = Mix_Linked_Version(); - SDL_AudioDriverName(driver, 40); + const char *driver = SDL_GetCurrentAudioDriver(); Mix_QuerySpec(&rate, &audioFormat, &channels); switch (audioFormat) diff --git a/src/utils/copynpaste.cpp b/src/utils/copynpaste.cpp index 2bb8fb49..ccb36d79 100644 --- a/src/utils/copynpaste.cpp +++ b/src/utils/copynpaste.cpp @@ -1,7 +1,6 @@ /* - * Retrieve string pasted depending on OS mechanisms. - * Copyright (C) 2001-2010 Wormux Team - * Copyright (C) 2010-2012 The Mana Developers + * Clipboard Interaction. + * Copyright (C) 2010-2024 The Mana Developers * * This file is part of The Mana Client. * @@ -19,301 +18,18 @@ * along with this program. If not, see . */ -/* - * IMPORTANT! - * - * This code was taken from Wormux svn trunk at Feb 25 2010. Please don't - * make any unnecessary modifications, and try to sync up modifications - * when possible. - */ - -#ifdef _MSC_VER -# include "msvc/config.h" -#elif defined(HAVE_CONFIG_H) -# include "config.h" -#endif - -#include -#include "copynpaste.h" - -#ifdef _WIN32 -bool RetrieveBuffer(std::string& text, std::string::size_type& pos) -{ - bool ret = false; - - if (!OpenClipboard(NULL)) - return false; - - HANDLE h = GetClipboardData(CF_UNICODETEXT); - if (h) - { - LPCWSTR data = (LPCWSTR)GlobalLock(h); +#include "utils/copynpaste.h" - if (data) - { - int len = WideCharToMultiByte(CP_UTF8, 0, data, -1, NULL, 0, NULL, NULL); - if (len > 0) - { - // Convert from UTF-16 to UTF-8 - void *temp = malloc(len); - if (WideCharToMultiByte(CP_UTF8, 0, data, -1, (LPSTR)temp, len, NULL, NULL)) - { - text.insert(pos, (char*)temp); - pos += len-1; - } - free(temp); - ret = true; - } - } - GlobalUnlock(h); - } - else - { - h = GetClipboardData(CF_TEXT); - - if (h) - { - const char *data = (char*)GlobalLock(h); - if (data) - { - text.insert(pos, data); - pos += strlen(data); - ret = true; - } - GlobalUnlock(h); - } - } - - CloseClipboard(); - return ret; -} -#elif defined(__APPLE__) +#include -#ifdef Status -#undef Status -#endif - -#include - -// Sorry for the very long code, all nicer OS X APIs are coded in Objective C and not C! -// Also it does very thorough error handling -bool GetDataFromPasteboard( PasteboardRef inPasteboard, char* flavorText /* out */, const int bufSize ) +bool insertFromClipboard(std::string &text, std::string::size_type &pos) { - OSStatus err = noErr; - PasteboardSyncFlags syncFlags; - ItemCount itemCount; - - syncFlags = PasteboardSynchronize( inPasteboard ); - - //require_action( syncFlags & kPasteboardModified, PasteboardOutOfSync, - // err = badPasteboardSyncErr ); - - err = PasteboardGetItemCount( inPasteboard, &itemCount ); - require_noerr( err, CantGetPasteboardItemCount ); - - for (UInt32 itemIndex = 1; itemIndex <= itemCount; itemIndex++) - { - PasteboardItemID itemID; - CFArrayRef flavorTypeArray; - CFIndex flavorCount; - - err = PasteboardGetItemIdentifier( inPasteboard, itemIndex, &itemID ); - require_noerr( err, CantGetPasteboardItemIdentifier ); - - err = PasteboardCopyItemFlavors( inPasteboard, itemID, &flavorTypeArray ); - require_noerr( err, CantCopyPasteboardItemFlavors ); - - flavorCount = CFArrayGetCount( flavorTypeArray ); - - for (CFIndex flavorIndex = 0; flavorIndex < flavorCount; flavorIndex++) - { - CFStringRef flavorType; - CFDataRef flavorData; - CFIndex flavorDataSize; - flavorType = (CFStringRef)CFArrayGetValueAtIndex(flavorTypeArray, flavorIndex); - - // we're only interested by text... - if (UTTypeConformsTo(flavorType, CFSTR("public.utf8-plain-text"))) - { - err = PasteboardCopyItemFlavorData( inPasteboard, itemID, - flavorType, &flavorData ); - require_noerr( err, CantCopyFlavorData ); - flavorDataSize = CFDataGetLength( flavorData ); - flavorDataSize = (flavorDataSize<254) ? flavorDataSize : 254; - - if (flavorDataSize+2 > bufSize) - { - fprintf(stderr, "Cannot copy clipboard, contents is too big!\n"); - return false; - } - - for (short dataIndex = 0; dataIndex <= flavorDataSize; dataIndex++) - { - char byte = *(CFDataGetBytePtr( flavorData ) + dataIndex); - flavorText[dataIndex] = byte; - } - - flavorText[flavorDataSize] = '\0'; - flavorText[flavorDataSize+1] = '\n'; - - CFRelease (flavorData); - return true; - } - - continue; - CantCopyFlavorData: fprintf(stderr, "Cannot copy clipboard, CantCopyFlavorData!\n"); - } - - CFRelease (flavorTypeArray); - continue; - - CantCopyPasteboardItemFlavors: fprintf(stderr, "Cannot copy clipboard, CantCopyPasteboardItemFlavors!\n"); continue; - CantGetPasteboardItemIdentifier: fprintf(stderr, "Cannot copy clipboard, CantGetPasteboardItemIdentifier!\n"); continue; - } - fprintf(stderr, "Cannot copy clipboard, found no acceptable flavour!\n"); - return false; - - CantGetPasteboardItemCount: fprintf(stderr, "Cannot copy clipboard, CantGetPasteboardItemCount!\n"); return false; - //PasteboardOutOfSync: fprintf(stderr, "Cannot copy clipboard, PasteboardOutOfSync!\n"); return false; -} - -bool getClipBoard(char* text /* out */, const int bufSize ) -{ - OSStatus err = noErr; - - PasteboardRef theClipboard; - err = PasteboardCreate( kPasteboardClipboard, &theClipboard ); - require_noerr( err, PasteboardCreateFailed ); - - if (!GetDataFromPasteboard(theClipboard, text, bufSize)) - { - fprintf(stderr, "Cannot copy clipboard, GetDataFromPasteboardFailed!\n"); - return false; - } - - CFRelease(theClipboard); - - return true; - - // ---- error handling - PasteboardCreateFailed: fprintf(stderr, "Cannot copy clipboard, PasteboardCreateFailed!\n"); - CFRelease(theClipboard); - return false; -} - -bool RetrieveBuffer(std::string& text, std::string::size_type& pos) -{ - const int bufSize = 512; - char buffer[bufSize]; - - if (getClipBoard(buffer, bufSize)) - { - text = buffer; - pos += strlen(buffer); - return true; - } - else - { - return false; - } -} - -#elif USE_X11 -static char* getSelection(Display *dpy, Window us, Atom selection) -{ - int max_events = 50; - Window owner = XGetSelectionOwner (dpy, selection); - int ret; - - //printf("XConvertSelection on %s\n", XGetAtomName(dpy, selection)); - if (owner == None) - { - //printf("No owner\n"); - return NULL; - } - XConvertSelection(dpy, selection, XA_STRING, XA_PRIMARY, us, CurrentTime); - XFlush(dpy); - - while (max_events--) - { - XEvent e; - - XNextEvent(dpy, &e); - if(e.type == SelectionNotify) - { - //printf("Received %s\n", XGetAtomName(dpy, e.xselection.selection)); - if(e.xselection.property == None) - { - //printf("Couldn't convert\n"); - return NULL; - } - - long unsigned len, left, dummy; - int format; - Atom type; - unsigned char *data = NULL; - - XGetWindowProperty(dpy, us, e.xselection.property, 0, 0, False, - AnyPropertyType, &type, &format, &len, &left, &data); - if (left < 1) - return NULL; - - ret = XGetWindowProperty(dpy, us, e.xselection.property, 0, left, False, - AnyPropertyType, &type, &format, &len, &dummy, &data); - if (ret != Success) - { - //printf("Failed to get property: %p on %lu\n", data, len); - return NULL; - } - - //printf(">>> Got %s: len=%lu left=%lu (event %i)\n", data, len, left, 50-max_events); - return (char*)data; - } - } - return NULL; -} - -bool RetrieveBuffer(std::string& text, std::string::size_type& pos) -{ - SDL_SysWMinfo info; - - //printf("Retrieving buffer...\n"); - SDL_VERSION(&info.version); - if ( SDL_GetWMInfo(&info) ) - { - Display *dpy = info.info.x11.display; - Window us = info.info.x11.window; - char *data = NULL; - - if (!data) - { - data = getSelection(dpy, us, XA_PRIMARY); - } - if (!data) - { - data = getSelection(dpy, us, XA_SECONDARY); - } - if (!data) - { - Atom XA_CLIPBOARD = XInternAtom(dpy, "CLIPBOARD", 0); - data = getSelection(dpy, us, XA_CLIPBOARD); - } - if (data) - { - // check cursor position - if (pos > text.size()) { - pos = text.size(); - } - - text.insert(pos, data); - pos += strlen(data); - XFree(data); - - return true; - } - } - return false; + char *buf = SDL_GetClipboardText(); + const size_t len = strlen(buf); + if (len > 0) { + text.insert(pos, buf); + pos += len; + } + SDL_free(buf); + return len > 0; } -#else -bool RetrieveBuffer(std::string&, std::string::size_type&) { return false; } -#endif diff --git a/src/utils/copynpaste.h b/src/utils/copynpaste.h index c2430e1c..b6aa0de0 100644 --- a/src/utils/copynpaste.h +++ b/src/utils/copynpaste.h @@ -1,7 +1,6 @@ /* - * Retrieve string pasted depending on OS mechanisms. - * Copyright (C) 2001-2010 Wormux Team - * Copyright (C) 2010-2012 The Mana Developers + * Clipboard Interaction. + * Copyright (C) 2010-2024 The Mana Developers * * This file is part of The Mana Client. * @@ -25,10 +24,7 @@ * Attempts to retrieve text from the clipboard buffer and inserts it in * \a text at position \pos. The characters are encoded in utf-8. * - * Implemented for Windows, X11 and Mac OS X. - * * @return true when successful or false when there * was a problem retrieving the clipboard buffer. */ -bool RetrieveBuffer(std::string& text, std::string::size_type& pos); - +bool insertFromClipboard(std::string &text, std::string::size_type &pos); -- cgit v1.2.3-60-g2f50 From 5307b022f652ad34a8b2ef35d674817b7da33759 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 15:44:38 +0100 Subject: Minor includes cleanup --- src/client.cpp | 5 ----- src/game.cpp | 2 -- src/gui/setup_video.cpp | 3 --- src/gui/socialwindow.cpp | 3 --- src/gui/widgets/textfield.cpp | 1 - src/sound.cpp | 1 - 6 files changed, 15 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 4030b042..ffea7a8a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -34,7 +34,6 @@ #endif #include "playerrelations.h" #include "sound.h" -#include "statuseffect.h" #include "units.h" #include "gui/changeemaildialog.h" @@ -66,12 +65,8 @@ #include "resources/chardb.h" #include "resources/hairdb.h" -#include "resources/emotedb.h" #include "resources/image.h" #include "resources/itemdb.h" -#include "resources/monsterdb.h" -#include "resources/specialdb.h" -#include "resources/npcdb.h" #include "resources/resourcemanager.h" #include "resources/theme.h" #include "resources/userpalette.h" diff --git a/src/game.cpp b/src/game.cpp index f71d8575..c934ed69 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -42,7 +42,6 @@ #include "sound.h" #include "gui/chatwindow.h" -#include "gui/confirmdialog.h" #include "gui/debugwindow.h" #include "gui/equipmentwindow.h" #include "gui/gui.h" @@ -70,7 +69,6 @@ #include "gui/widgets/itemshortcutcontainer.h" #include "net/gamehandler.h" -#include "net/generalhandler.h" #include "net/net.h" #include "net/playerhandler.h" diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp index c9d1dbc9..709a7685 100644 --- a/src/gui/setup_video.cpp +++ b/src/gui/setup_video.cpp @@ -26,7 +26,6 @@ #include "game.h" #include "graphics.h" #include "localplayer.h" -#include "main.h" #include "particle.h" #include "gui/okdialog.h" @@ -38,8 +37,6 @@ #include "gui/widgets/scrollarea.h" #include "gui/widgets/slider.h" #include "gui/widgets/spacer.h" -#include "gui/widgets/textfield.h" -#include "gui/widgets/dropdown.h" #include "utils/gettext.h" #include "utils/stringutils.h" diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp index 1b960d64..7e074470 100644 --- a/src/gui/socialwindow.cpp +++ b/src/gui/socialwindow.cpp @@ -33,8 +33,6 @@ #include "gui/widgets/avatarlistbox.h" #include "gui/widgets/browserbox.h" #include "gui/widgets/button.h" -#include "gui/widgets/container.h" -#include "gui/widgets/label.h" #include "gui/widgets/linkhandler.h" #include "gui/widgets/popup.h" #include "gui/widgets/scrollarea.h" @@ -47,7 +45,6 @@ #include "resources/theme.h" -#include "utils/dtor.h" #include "utils/gettext.h" #include "utils/stringutils.h" diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index c4c00ae4..35ce09c5 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -24,7 +24,6 @@ #include "configuration.h" #include "graphics.h" -#include "gui/palette.h" #include "gui/sdlinput.h" #include "resources/image.h" diff --git a/src/sound.cpp b/src/sound.cpp index 2fc4f87f..44f55cba 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -22,7 +22,6 @@ #include #include "configuration.h" -#include "game.h" #include "localplayer.h" #include "log.h" #include "sound.h" -- cgit v1.2.3-60-g2f50 From 985c00dbbc360f62be1f518b0b77771a019aaccf Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 15:45:12 +0100 Subject: Added assignment operator for Vector --- src/vector.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vector.h b/src/vector.h index d181f938..25f6c120 100644 --- a/src/vector.h +++ b/src/vector.h @@ -60,6 +60,14 @@ class Vector return x == 0.0f && y == 0.0f && z == 0.0f; } + Vector &operator=(const Vector &v) + { + x = v.x; + y = v.y; + z = v.z; + return *this; + } + /** * Scale vector operator. */ -- cgit v1.2.3-60-g2f50 From 7ff4843203eb67fbaa88737a31b891f99e2d1efd Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 15:45:39 +0100 Subject: Fixed parent for OkDialog in social window --- src/gui/socialwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp index 7e074470..437f9d01 100644 --- a/src/gui/socialwindow.cpp +++ b/src/gui/socialwindow.cpp @@ -615,7 +615,7 @@ void SocialWindow::showPartyCreate() { new OkDialog(_("Create Party"), _("Cannot create party. You are already in a party"), - this); + true, this); return; } -- cgit v1.2.3-60-g2f50 From dadefbcd103bd11bc74ca35a40d18dd2c1877f70 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 17:37:15 +0100 Subject: Removed X11 dependency It was only used for the clipboard, which is now interacted with through SDL 2. --- CMakeLists.txt | 3 --- src/CMakeLists.txt | 6 ------ 2 files changed, 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d0d62ab..9fbf4e1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,9 +39,6 @@ IF (WIN32) SET(LOCALEDIR ".") CONFIGURE_FILE(src/winver.h.in src/winver.h) ELSE (WIN32) - IF (NOT OSX AND NOT BEOS) - OPTION(USE_X11 "Use X11 Clipboard functionality" ON) - ENDIF () SET(PKG_DATADIR ${CMAKE_INSTALL_PREFIX}/share/mana CACHE PATH "Mana datadir") SET(LOCALEDIR ${CMAKE_INSTALL_PREFIX}/share/locale) SET(PKG_BINDIR ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "Mana bindir") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7aa6cdcb..b4227f65 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -79,12 +79,6 @@ IF (WITH_OPENGL) MESSAGE(STATUS "OpenGL support enabled") ENDIF (WITH_OPENGL) -IF (USE_X11) - FIND_PACKAGE(X11 REQUIRED) - INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR}) - SET(FLAGS "${FLAGS} -DUSE_X11") -ENDIF (USE_X11) - INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${SDL2_INCLUDE_DIRS} -- cgit v1.2.3-60-g2f50 From 8d06606835e3d01f537ebe96de8b216e64a1f969 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 25 Jan 2024 17:42:56 +0100 Subject: Always use C++11 and remove related compatibility option/code --- CMakeLists.txt | 7 ++++--- README.cmake | 2 +- src/CMakeLists.txt | 5 ----- src/cpp0x_compat/cstdint | 10 ---------- src/utils/mutex.h | 4 ---- 5 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 src/cpp0x_compat/cstdint diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fbf4e1b..6b0da2e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) -CMAKE_POLICY(VERSION 2.8.12) +CMAKE_MINIMUM_REQUIRED(VERSION 3.1) +CMAKE_POLICY(VERSION 3.1) PROJECT(MANA) @@ -7,6 +7,8 @@ IF (NOT VERSION) SET(VERSION 0.6.1) ENDIF() +set (CMAKE_CXX_STANDARD 11) + STRING(REPLACE "." " " _VERSION ${VERSION}) SEPARATE_ARGUMENTS(_VERSION) LIST(LENGTH _VERSION _LEN) @@ -31,7 +33,6 @@ FIND_PACKAGE(Gettext) OPTION(WITH_OPENGL "Enable OpenGL support" ON) OPTION(ENABLE_NLS "Enable building of tranlations" ON) OPTION(ENABLE_MANASERV "Enable Manaserv support" ON) -OPTION(ENABLE_CPP0X "Enable use of C++0x features" OFF) IF (WIN32) SET(PKG_DATADIR ".") diff --git a/README.cmake b/README.cmake index c9175fa5..b5691ff1 100644 --- a/README.cmake +++ b/README.cmake @@ -143,6 +143,6 @@ In your mana directory: $ export CC=/usr/bin/clang $ export CXX=/usr/bin/clang++ -$ cmake -DENABLE_CPP0X=OFF +$ cmake . $ make $ src/mana diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b4227f65..68cba816 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,11 +35,6 @@ ENDIF() SET(FLAGS "-DPACKAGE_VERSION=\\\"${VERSION}\\\"") SET(FLAGS "${FLAGS} -DPKG_DATADIR=\\\"${PKG_DATADIR}/\\\"") SET(FLAGS "${FLAGS} -DLOCALEDIR=\\\"${LOCALEDIR}/\\\"") -IF (ENABLE_CPP0X) - SET(FLAGS "${FLAGS} -std=c++0x -DENABLE_CPP0X=1") -ELSE() - INCLUDE_DIRECTORIES("cpp0x_compat") -ENDIF() IF (ENABLE_NLS) SET(FLAGS "${FLAGS} -DENABLE_NLS=1") diff --git a/src/cpp0x_compat/cstdint b/src/cpp0x_compat/cstdint deleted file mode 100644 index 05d56c6e..00000000 --- a/src/cpp0x_compat/cstdint +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Compatibility header used when the compiler doesn't support C++0x. - * - * While GCC 4.2.1 understands types like uint16_t by default, later versions - * are more strict so here are some typedefs for types used in our code. - */ - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; diff --git a/src/utils/mutex.h b/src/utils/mutex.h index f7f26233..d0120cfa 100644 --- a/src/utils/mutex.h +++ b/src/utils/mutex.h @@ -53,9 +53,7 @@ class MutexLocker { public: MutexLocker(Mutex *mutex); -#ifdef ENABLE_CPP0X MutexLocker(MutexLocker&&); -#endif ~MutexLocker(); private: @@ -95,13 +93,11 @@ inline MutexLocker::MutexLocker(Mutex *mutex): mMutex->lock(); } -#ifdef ENABLE_CPP0X inline MutexLocker::MutexLocker(MutexLocker&& rhs): mMutex(rhs.mMutex) { rhs.mMutex = NULL; } -#endif inline MutexLocker::~MutexLocker() { -- cgit v1.2.3-60-g2f50