diff -Nru teeworlds-0.6.3+dfsg/bam.lua teeworlds-0.6.4+dfsg/bam.lua --- teeworlds-0.6.3+dfsg/bam.lua 2014-11-19 22:08:23.000000000 +0000 +++ teeworlds-0.6.4+dfsg/bam.lua 2016-11-13 15:41:35.000000000 +0000 @@ -144,7 +144,7 @@ settings.cc.Output = Intermediate_Output if config.compiler.driver == "cl" then - settings.cc.flags:Add("/wd4244") + settings.cc.flags:Add("/wd4244", "/wd4577") else settings.cc.flags:Add("-Wall", "-fno-exceptions") if family == "windows" then diff -Nru teeworlds-0.6.3+dfsg/data/languages/belarusian.txt teeworlds-0.6.4+dfsg/data/languages/belarusian.txt --- teeworlds-0.6.3+dfsg/data/languages/belarusian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/belarusian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Цела +Borderless window +== Акно без рамкі + Call vote == Галасаваць @@ -223,6 +226,9 @@ Game over == Гульня скончана +Game paused +== Гульня спынена + Game type == Тып гульні @@ -241,6 +247,9 @@ Hammer == Молат +Handle rendering async from updates +== Асінхронны рэндэрынг + Has people playing == Не пусты сервер @@ -466,6 +475,9 @@ Reset to defaults == Скінуць налады +Respawn +== Адраджэнне + Rifle == Бласцер @@ -526,6 +538,9 @@ Show name plates == Паказваць нікі гульцоў +Show only chat messages from friends +== Паказваць паведамлення толькі ад сяброў + Show only supported == Паказваць толькі падтрымоўваныя дазволы экрана @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Ёсць незахаваная карта ў рэдактары, Вы можаце захаваць яе перад тым, як выйсці. +Threaded rendering +== Струменны рэндэрынг + +Threaded sound loading +== Струменная загрузка гуку + Time limit == Ліміт часу @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/bosnian.txt teeworlds-0.6.4+dfsg/data/languages/bosnian.txt --- teeworlds-0.6.3+dfsg/data/languages/bosnian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/bosnian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/brazilian_portuguese.txt teeworlds-0.6.4+dfsg/data/languages/brazilian_portuguese.txt --- teeworlds-0.6.3+dfsg/data/languages/brazilian_portuguese.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/brazilian_portuguese.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Corpo +Borderless window +== Janela sem borda + Call vote == Votar @@ -223,6 +226,9 @@ Game over == Fim do jogo +Game paused +== Jogo pausado + Game type == Tipo de jogo @@ -241,6 +247,9 @@ Hammer == Martelo +Handle rendering async from updates +== Lidar com renderização assíncrona de atualizações + Has people playing == Há pessoas jogando @@ -323,7 +332,7 @@ == Esquerda Move player to spectators -== Mover jogador para espectadores +== Mover jogador para observador Move right == Direita @@ -466,6 +475,9 @@ Reset to defaults == Resetar configurações +Respawn +== Reaparecer + Rifle == Laser @@ -526,6 +538,9 @@ Show name plates == Mostrar apelidos +Show only chat messages from friends +== Mostrar apenas mensagens de chat de amigos + Show only supported == Mostrar apenas modos suportados @@ -554,10 +569,10 @@ == Observar anterior Spectator mode -== Modo espectador +== Modo observador Spectators -== Espectadores +== Observadores Standard gametype == Tipo de jogo padrão @@ -572,7 +587,7 @@ == Filtrar tipo de jogo exato Sudden Death -== Morte Súbita +== Morte súbita Switch weapon on pickup == Equipar arma ao pegá-la @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Existe um mapa não salvo no editor, você pode querer salvá-lo antes de sair do jogo. +Threaded rendering +== Renderização em paralelo + +Threaded sound loading +== Carregamento de som em paralelo + Time limit == Limite de tempo @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/bulgarian.txt teeworlds-0.6.4+dfsg/data/languages/bulgarian.txt --- teeworlds-0.6.3+dfsg/data/languages/bulgarian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/bulgarian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -2,28 +2,28 @@ ##### translated strings ##### %d Bytes -== %d Байтове +== %d Байта %d of %d servers, %d players -== %d/%d сървъри, %d играчи +== %d от %d сървъра, %d играчи %d%% loaded == %d%% заредено %ds left -== остават %d сек. +== Остава(т) %d сек %i minute left -== %i минута остава +== Остава %i минута %i minutes left -== %i минути остават +== Остават %i минути %i second left -== %i секунда остава +== Остава %i секунда %i seconds left -== %i секунди остават +== Остават %i секунди %s wins! == %s печели! @@ -32,13 +32,13 @@ == -Страница %d- Abort -== Прекрати +== Отмяна Add -== Добави +== Добавяне Add Friend -== Добави Приятел +== Добавяне на приятел Address == Адрес @@ -50,40 +50,43 @@ == Прозрачност Always show name plates -== Винаги показвай лентите с имената +== Винаги да се показват лент. с им. Are you sure that you want to delete the demo? -== Сигуен ли си че искаш да изтриеш това демо? +== Сигурни ли сте, че искате да изтриете записа? Are you sure that you want to quit? -== Сигурен ли си че искаш да напуснеш? +== Сигурни ли сте, че искате да напуснете? Are you sure that you want to remove the player from your friends list? -== Сигурен ли си че искаш да премахнеш този играч от листа с приятели? +== Сигурни ли сте, че искате да премахнете този играч от списъка с приятели? As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server. -== Тъй като стартираш играта за първи път, моля въведи своя ник отдолу. Препоръчително е да провериш и нагласиш настройките по ваш свой избор преди да започнеш игра. +== Тъй като стартирате играта за първи път, моля, въведете своя псевдоним по-долу. Препоръчително е да проверите и нагласите настройките, преди да започнете игра. Automatically record demos -== Записвай демота автоматично +== Автоматично създаване на записи Automatically take game over screenshot == Автоматична снимка в края на играта Blue team -== Отбор Сини +== Син отбор Blue team wins! -== Отбор Сини печели! +== Синият отбор печели! Body == Тяло +Borderless window +== Прозорец без рамка + Call vote -== Гласувай +== Гласуване Change settings -== Промени настройките +== Промяна на настройките Chat == Чат @@ -95,37 +98,37 @@ == Клиент Close -== Затвори +== Затваряне Compatible version == Съвместима версия Connect -== Впиши +== Свързване Connecting to -== Свързвам се с +== Свързване с Connection Problems... -== Проблеми с Връзката... +== Проблеми с връзката... Console == Конзола Controls -== Контроли +== Управление Count players only -== Брой на играчите +== Броене само на играчите Country == Държава Crc: -== Crc: +== Контролна сума: Created: -== Създаден: +== Създадено: Current == Текущ @@ -134,55 +137,55 @@ == Текуща версия: %s Custom colors -== Произволни цветове +== Потребителски цветове Delete -== Изтрий +== Изтриване Delete demo -== Изтрий демото +== Изтриване на записа Demo details -== Детайли за демото +== Подробности за записа Demofile: %s -== Демофайл: %s +== Файл със запис: %s Demos -== Демота +== Записи Disconnect -== Отпиши +== Разкачане Disconnected -== Отписан +== Разкачен Display Modes -== Режими на Показване +== Налични режими Downloading map -== Свалям карта +== Изтегляне на карта Draw! -== Равни! +== Равенство! Dynamic Camera -== Динамична Камера +== Динамична камера Emoticon -== Емотикони +== Емотиконка Enter -== Влез +== Влизане Error == Грешка Error loading demo -== Грешка при зареждане на демо файл +== Грешка при зареждане на запис FSAA samples -== FSAA семпли +== FSAA проби Favorite == Любим @@ -203,31 +206,34 @@ == Папка Force vote -== Форсирай вот +== Насилено гласуване Free-View -== Свободен Изглед +== Свободен изглед Friends == Приятели Fullscreen -== Цял Екран +== На цял екран Game == Игра Game info -== Игра +== Информация за играта Game over -== Играта свърши +== Край на играта + +Game paused +== Играта е на пауза Game type == Тип игра Game types: -== Тип иги: +== Типове игри: General == Основни @@ -241,47 +247,50 @@ Hammer == Чук +Handle rendering async from updates +== Изчертаването да бъде асинхронно от обновяването + Has people playing -== Не показвай празни +== Да има играчи High Detail -== Висока Детайлност +== Голяма детайлност Hook -== Верига +== Кука Host address == Адрес на сървъра Hue -== Оттенък +== Тон Info -== Инфо +== Инф. Internet == Интернет Invalid Demo -== Невалидно Демо +== Невалиден запис Join blue -== Влез син +== Присъединяване към сините Join game -== Влез +== Присъединяване Join red -== Влез червен +== Присъединяване към червените Jump == Скок Kick player -== Кикни играч +== Изритване на играч LAN -== ЛАН +== Лок. мр. Language == Език @@ -290,13 +299,13 @@ == Дължина: Lht. -== Яркост +== Ярк. Loading -== Зареждам +== Зареждане MOTD -== MOTD +== Съобщение на деня Map == Карта @@ -305,43 +314,43 @@ == Карта: Max Screenshots -== Максимум Снимки +== Макс. бр. снимки Max demos -== Максимум Демота +== Макс. бр. записи Maximum ping: -== Макс. пинг: +== Макс. време за отговор: Miscellaneous -== Допълнителни +== Разни Mouse sens. -== Мишка +== Чувств. на мишката Move left -== На ляво +== Наляво Move player to spectators -== Премести играча в наблюдатели +== Преместване на играча към наблюдателите Move right -== На дясно +== Надясно Movement == Движение Mute when not active -== Изключвай звука когато играта е неактивна +== Заглушаване на звука когато играта е неактивна Name == Име Name plates size -== Размер на лентата с имената +== Размер на лентите с имената Netversion: -== Версия: +== Мрежова версия: New name: == Ново име: @@ -350,49 +359,49 @@ == Новини Next weapon -== След. оръжие +== Следв. оръжие Nickname -== Ник +== Псевдоним No == Не No password -== Без парола +== Няма парола No servers found == Няма намерени сървъри No servers match your filter criteria -== Няма сървъри съответстващи твоите настройки +== Няма сървъри, отговарящи на критериите Ok == Добре Open -== Отвори +== Отваряне Parent Folder -== Предишна Папка +== Родителска папка Password == Парола Password incorrect -== Грешна Парола +== Грешна парола Ping -== Пинг +== Вр. за отг. Pistol == Пистолет Play -== Възпроизведи +== Играене Play background music -== Пусни музика за фон +== Изпълнение на фоновата музика Player == Играч @@ -401,7 +410,7 @@ == Страна на играча: Player options -== Настройки на Играча +== Настройки на играча Players == Играчи @@ -410,19 +419,19 @@ == Моля уравновесете отборите! Prev. weapon -== Пред. оръжие +== Предх. оръжие Quality Textures -== Качествени Текстури +== Качествени текстури Quick search: -== Бързо Търсене: +== Бързо търсене: Quit == Изход Quit anyway? -== Излезни все пак? +== Изход въпреки това? REC %3d:%02d == Записани %3d:%02d @@ -431,64 +440,67 @@ == Причина: Record demo -== Запиши демо +== Започване на запис Red team -== Отбор Червени +== Червен отбор Red team wins! -== Отбор Червени печели! +== Червеният отбор печели! Refresh -== Обнови +== Опресняване Refreshing master servers -== Обновновявам мастър-сървърите +== Обновяване на главните сървъри Remote console -== Сървър Конзола +== Отдалечена конзола Remove -== Премахни +== Премахване Remove friend -== Премахни приятел +== Премахване на приятеля Rename -== Преименувай +== Преименуване Rename demo -== Преименувай демо +== Преименуване на записа Reset filter -== Рестартирай филтрите +== Нулиране на филтрите Reset to defaults -== Рестартирай настройките +== По подразбиране + +Respawn +== Прераждане Rifle -== Лазер +== Винтовка Round == Рунд Sample rate -== Честота +== Честота на дискр. Sat. -== Контраст +== Нас. Score -== Точки +== Резултат Score board -== Резултат +== Табло с резултати Score limit -== Лимит на точките +== Ограничение на точките Scoreboard -== Резултат +== Табло с резултати Screenshot == Снимка @@ -497,16 +509,16 @@ == Адрес на сървъра: Server details -== Детайли за Сървъра +== Подр. за сървъра Server filter == Филтър на сървъра Server info -== Инфо +== Информация за сървъра Server not full -== Не показвай пълните +== Сървърът да не е пълен Settings == Настройки @@ -515,43 +527,49 @@ == Пушка Show chat -== Показвай чата +== Показване на чата Show friends only -== Покажи приятели +== Показване само на приятелите Show ingame HUD -== Показвай детайли в играта +== Показване на интерфейса в играта Show name plates -== Показвай лентите с имената +== Показване на лентите с имената + +Show only chat messages from friends +== Показване само на съобщ. от приятели Show only supported -== Показвай само съвместимите +== Показване само на съвместимите Size: -== Размер +== Размер: Skins -== Модели +== Облици Sound == Звук Sound error -== Грешка в звука +== Звукова грешка Sound volume == Сила на звука Spectate -== Наблюдавай +== Наблюдаване Spectate next -== Наблюдавай след. +== Наблюдаване на следв. + +Spectate previous +== Наблюдаване на пред. Spectator mode -== Наблюдател +== Режим на наблюдаване Spectators == Наблюдатели @@ -560,19 +578,19 @@ == Стандартен тип игри Standard map -== Стандартна карта +== Стандартни карти Stop record -== Спри записа +== Спиране на записването Strict gametype filter -== Стриктен геймтайп филтър +== Строг филтър за тип игра Sudden Death -== Внезапна Смърт +== Внезапна смърт Switch weapon on pickup -== Сменяй оръжието при взимане +== Сменяне на оръжието при вземане Team == Отбор @@ -581,28 +599,34 @@ == Отборен чат Teeworlds %s is out! Download it at www.teeworlds.com! -== Излезна Teeworlds %s! Свали новата версия от www.teeworlds.com! +== Излезе Teeworlds %s! Изтеглете я от www.teeworlds.com! Texture Compression -== Компресиране на Текстурите +== Компресия на текстурите The audio device couldn't be initialised. -== Аудио устройството не може да бъде стартирано. +== Звуковото устройство не може да бъде стартирано. The server is running a non-standard tuning on a pure game type. -== Този сървър използва нестандартен тунинг на стандартен тип ига. +== Този сървър използва нестандартни настройки на стандартен тип игра. There's an unsaved map in the editor, you might want to save it before you quit the game. -== Има незапазена карта в редактора, ако напуснете картата няма да бъде запазена. +== Има незапазена карта в редактора. Ако напуснете играта, картата няма да бъде запазена. + +Threaded rendering +== Многонишково изчертаване + +Threaded sound loading +== Многонишково зареждане на звука Time limit -== Лимит на Времето +== Ограничение на времето Time limit: %d min -== Лимит на Времето: %d мин +== Ограничение на времето: %d мин Try again -== Опитай пак +== Повторен опит Type == Тип @@ -611,34 +635,34 @@ == Тип: UI Color -== Цвят на Интерфейса +== Звят на потр. интерфейс Unable to delete the demo -== Изтриването неуспешно +== Неуспешно изтриване на записа Unable to rename the demo -== Преименуването неуспешно +== Неуспешно преименуване на записа Use sounds -== Използвай Звук +== Използване на звуци Use team colors for name plates -== Използвай цветове в лентите +== Използване на отборните цветове в лентите с имената V-Sync -== Вертикална Синхронизация +== Вертикална синхронизация Version == Версия Version: -== Версия: +== Версия Vote command: -== Вот команда: +== Команда за гласуване: Vote description: -== Вот дефиниция: +== Описание на гласуването: Vote no == Против @@ -653,36 +677,24 @@ == Разгрявка Weapon -== Оръжия +== Оръжие Welcome to Teeworlds -== Добре дошли в Teeworlds! +== Добре дошли в Teeworlds Yes == Да You must restart the game for all settings to take effect. -== Трябва да рестартираш играта за да поемат ефект новите настройки. +== Трябва да рестартирате играта, за да се приложат новите настройки. Your skin -== Твоят модел +== Вашият облик no limit -== Без лимит +== няма ограничение ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - -Spectate previous -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/chuvash.txt teeworlds-0.6.4+dfsg/data/languages/chuvash.txt --- teeworlds-0.6.3+dfsg/data/languages/chuvash.txt 1970-01-01 00:00:00.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/chuvash.txt 2016-11-13 15:41:35.000000000 +0000 @@ -0,0 +1,700 @@ + +##### translated strings ##### + +%d Bytes +== %d байт + +%d of %d servers, %d players +== %d серв. %d тупнă, %d çын + +%d%% loaded +== %d%% тиенĕ + +%ds left +== %d сек. + +%i minute left +== %i мин. + +%i minutes left +== %i мин. + +%i second left +== %i сек. + +%i seconds left +== %i сек. + +%s wins! +== %s çĕнтерчĕ! + +-Page %d- +== -Страница %d- + +Abort +== Каялла + +Add +== Хуш + +Add Friend +== Юлташа хуш + +Address +== Адрес + +All +== Пурте + +Alpha +== Тăрă + +Always show name plates +== Вылякансен ятсене кăтартма + +Are you sure that you want to delete the demo? +== Эсир демо парахасшăн-и? + +Are you sure that you want to quit? +== Эсир тухасшăн-и? + +Are you sure that you want to remove the player from your friends list? +== Юшташу списокра тĕплесшĕн-и? + +As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server. +== Пĕрремĕш вăйă умĕнче, хăвăн ята аяларах çыр. Ĕнерленӳсене тереслер, улăштар. + +Automatically record demos +== Демосене автоматикăла çыр + +Automatically take game over screenshot +== Вăйăн пайта çут-ӳкерчĕк ту + +Blue team +== Кăвак ушкăн + +Blue team wins! +== Кăвак ушкăн çĕнтерчĕ! + +Body +== Ӳт + +Call vote +== Сасăла + +Change settings +== Йĕркелӳсене урăхлатма + +Chat +== Калаçу + +Clan +== Кланĕ + +Client +== Клиент + +Close +== Хупма + +Compatible version +== Пĕрле ĕçлекен верси + +Connect +== Çых + +Connecting to +== Çыхăну + +Connection Problems... +== Çыхăну проблемасем + +Console +== Консоль + +Controls +== Пăхăнтару + +Count players only +== Çынсене анчах шутлама + +Country +== Çĕрĕн ялавĕ + +Crc: +== Crc: + +Created: +== Хайланă: + +Current +== Хальхи + +Current version: %s +== Хальхи версие: %s + +Custom colors +== Усă кураканăн тĕсĕсем + +Delete +== Шăлса тасатма + +Delete demo +== Демо шăлса тасатма + +Demo details +== Демо тĕплĕсем + +Demofile: %s +== Демо: %s + +Demos +== Демосем + +Disconnect +== Çыхăну чарма + +Disconnected +== Çыхăну чарăнчĕ + +Display Modes +== Экран режимсем + +Downloading map +== Карта илӳ + +Draw! +== Никам та çĕнтермерĕ! + +Dynamic Camera +== Куçакан камера + +Emoticon +== Кăмăл-туйăмсем + +Enter +== Кĕрӳ + +Error +== Йăнăш + +Error loading demo +== Демо илĕвĕн йăнăш + +FSAA samples +== FSAA якату + +Favorite +== Суйланни + +Favorites +== Суйланнисем + +Feet +== Урасем + +Filter +== Фильтр + +Fire +== Пĕрӳ + +Folder +== Папка + +Force vote +== Вăйлăт + +Free-View +== Ирĕклĕ обзор + +Friends +== Юлташсем + +Fullscreen +== Тулли экран + +Game +== Вăйă + +Game info +== Вăйă пĕлтерӳ + +Game over +== Вăйа вĕçленчĕ + +Game type +== Вăйăн тĕс + +Game types: +== Вăйăн тĕсĕсем + +General +== Тĕп + +Graphics +== Ӳкерӳ + +Grenade +== Гранатомёт + +Hammer +== Мăлатук + +Has people playing +== Вылякан пур + +High Detail +== Лайăх ӳкерӳ + +Hook +== Çекĕл + +Host address +== Сервер адресĕ + +Hue +== Тĕс сĕмĕ + +Info +== Пĕлтерӳ + +Internet +== Интернет + +Invalid Demo +== Тĕрĕс мар демо + +Join blue +== Кăваксемпе! + +Join game +== Выляма + +Join red +== Хĕрлĕсемпе! + +Jump +== Сик + +Kick player +== Вылякана бан + +LAN +== LAN + +Language +== Чĕлхе + +Length: +== Вăрăмăш + +Lht. +== Çутăллăх + +Loading +== Кĕт, тархасшăн + +MOTD +== MOTD + +Map +== Карта + +Map: +== Карта: + +Max Screenshots +== Ӳкерчĕксен чи пысăк хисепĕ + +Max demos +== Чи пысăк демо хисепĕ + +Maximum ping: +== Чи пысăк пинг: + +Miscellaneous +== Хушнисем + +Mouse sens. +== Шăшин туйăмлăх + +Move left +== Сулахаялла + +Move player to spectators +== Пăхакансем çине куçарма + +Move right +== Сылтăмалла + +Movement +== Куçăм + +Mute when not active +== Тивмен чух сасăна шăплантар + +Name +== Ят + +Name plates size +== Пысăкăш + +Netversion: +== Версия: + +New name: +== Çĕн ят + +News +== Хыпарсем + +Next weapon +== Тепĕр хĕç-пăшал + +Nickname +== Ят + +No +== Çук + +No password +== Вăрттăн сăмахсăр + +No servers found +== Серверсем çук + +No servers match your filter criteria +== Фильтр майлă серверсем çук + +Ok +== Çапла + +Open +== Уçма + +Parent Folder +== Аслă каталог + +Password +== Вăрттăн сăмах + +Password incorrect +== Тĕрĕс мар вăрттăн сăмах + +Ping +== Пинг + +Pistol +== Пистолет + +Play +== Пăхма + +Play background music +== Кĕвви + +Player +== Вылякан + +Player country: +== Çĕршыв: + +Player options +== Опцисем + +Players +== Çынсем + +Please balance teams! +== Вылякан ушкăнĕсене шайлаштар! + +Prev. weapon +== Малтанхи хĕç-пăшал + +Quality Textures +== Лайăх текстурасем + +Quick search: +== Хăвăрт шырав: + +Quit +== Туху + +Quit anyway? +== Туху? + +REC %3d:%02d +== REC %3d:%02d + +Reason: +== Сăлтав: + +Record demo +== Демо çыр + +Red team +== Хĕрлĕ ушкăн + +Red team wins! +== Хĕрлĕ ушкăн çĕнтерчĕ! + +Refresh +== Каллех вула + +Refreshing master servers +== Мастер-серверсен каллех вулу + +Remote console +== Сервер консолĕ + +Remove +== Тасат + +Remove friend +== Юлташа тасат + +Rename +== Çĕнĕ ят + +Rename demo +== Демо çĕнĕ ят + +Reset filter +== Фильтрсене тасат + +Reset to defaults +== Йĕркелӳ тасат + +Rifle +== Бластер + +Round +== Раунд + +Sample rate +== Тăтăшлăх + +Sat. +== Контраст + +Score +== Паллă + +Score board +== Паллăсен хăмми + +Score limit +== Паллă лимичĕ + +Scoreboard +== Паллăсен хăмми + +Screenshot +== Экран ӳкерӳ + +Server address: +== Сервер адресĕ + +Server details +== Сервер тĕплĕсем + +Server filter +== Серверсен фильтр + +Server info +== Пĕлтерӳ + +Server not full +== Сервер тулли мар + +Settings +== Йĕркелӳсем + +Shotgun +== Йĕтре пăшал + +Show chat +== Калаçӳ кăтартма + +Show friends only +== Юлташсемпе анчах + +Show ingame HUD +== Вăйă çинчи HUD кăтартма + +Show name plates +== Вылякансен ят кăтартма + +Show only supported +== Ĕçлекен экран режимĕсем анчах + +Size: +== Пыçăкăш: + +Skins +== Сăнсем + +Sound +== Сасă + +Sound error +== Сасă йăнăш + +Sound volume +== Сасă янравлăш + +Spectate +== Пăхма + +Spectate next +== Тепĕрне пăхма + +Spectate previous +== Малтанхине пăхма + +Spectator mode +== Пăхакан + +Spectators +== Пăхакансем + +Standard gametype +== Стандартлă вăйă тĕсĕ + +Standard map +== Стандартлă карта + +Stop record +== Чарма + +Strict gametype filter +== Хытă вăйă тĕс фильтрĕ + +Sudden Death +== Хăвăрт вилӳ + +Switch weapon on pickup +== Хĕç-пăшал илнĕ чух улăштарма + +Team +== Ушкăн + +Team chat +== Ушкăнри калаçу + +Teeworlds %s is out! Download it at www.teeworlds.com! +== Тухрĕ Teeworlds %s! Кунта: www.teeworlds.com! + +Texture Compression +== Текстур хĕсӳ + +The audio device couldn't be initialised. +== Аудио ярма пултараймасть + +The server is running a non-standard tuning on a pure game type. +== Серверта стардартлă мар опцисемпе таса вăйă тĕсĕрĕ + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Редакторта упраман карта пур. Туху умĕн ăна упрама пултарать + +Time limit +== Вăхăт лимичĕ + +Time limit: %d min +== Вăхăт лимичĕ: %d мин + +Try again +== Тепĕр хут + +Type +== Тĕс + +Type: +== Тĕс: + +UI Color +== Интерфейс тĕсĕ + +Unable to delete the demo +== Демо тĕплеме пултараймасть + +Unable to rename the demo +== Демо ячĕ улăштарма пулмасть + +Use sounds +== Сасă уса курма + +Use team colors for name plates +== Ушкăн тĕсĕсем ятсем валли + +V-Sync +== Вертикаллĕ синхронизаци + +Version +== Версие + +Version: +== Версие: + +Vote command: +== Суйлав хушу: + +Vote description: +== Суйлав пирки: + +Vote no +== Хирĕç + +Vote yes +== Çинчен + +Voting +== Суйлав + +Warmup +== Карăну + +Weapon +== Хĕç-пăшал + +Welcome to Teeworlds +== Ырă сунса кĕтетпĕр Teeworlds-ра! + +Yes +== Çапла + +You must restart the game for all settings to take effect. +== Режим улăштарма валли вăйă сӳнтер тата каллер яр + +Your skin +== Санăн сăн + +no limit +== Лимитсăр + +##### needs translation ##### + +Borderless window +== + +Game paused +== + +Handle rendering async from updates +== + +Respawn +== + +Show only chat messages from friends +== + +Threaded rendering +== + +Threaded sound loading +== + +##### old translations ##### + diff -Nru teeworlds-0.6.3+dfsg/data/languages/czech.txt teeworlds-0.6.4+dfsg/data/languages/czech.txt --- teeworlds-0.6.3+dfsg/data/languages/czech.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/czech.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/danish.txt teeworlds-0.6.4+dfsg/data/languages/danish.txt --- teeworlds-0.6.3+dfsg/data/languages/danish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/danish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/dutch.txt teeworlds-0.6.4+dfsg/data/languages/dutch.txt --- teeworlds-0.6.3+dfsg/data/languages/dutch.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/dutch.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Lichaam +Borderless window +== Randloos scherm + Call vote == Stem @@ -244,6 +247,9 @@ Hammer == Hamer +Handle rendering async from updates +== Behandelen renderen async van updates + Has people playing == Mensen in server @@ -607,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Er is een onopgeslagen kaart in de editor, misschien wil je deze opslaan voordat je stopt. +Threaded rendering +== Renderen draadmodule + +Threaded sound loading +== Laden geluidslijn + Time limit == Tijdslimiet @@ -684,4 +696,5 @@ ##### needs translation ##### -##### old translations ##### \ No newline at end of file +##### old translations ##### + diff -Nru teeworlds-0.6.3+dfsg/data/languages/finnish.txt teeworlds-0.6.4+dfsg/data/languages/finnish.txt --- teeworlds-0.6.3+dfsg/data/languages/finnish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/finnish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/french.txt teeworlds-0.6.4+dfsg/data/languages/french.txt --- teeworlds-0.6.3+dfsg/data/languages/french.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/french.txt 2016-11-13 15:41:35.000000000 +0000 @@ -68,7 +68,7 @@ == Enregistrer automatiquement une démo Automatically take game over screenshot -== Sauvegarder les résultats à la fin de la partie +== Prendre une capture d'écran des résultats Blue team == Équipe bleue @@ -79,6 +79,9 @@ Body == Corps +Borderless window +== Fenêtre sans bordure + Call vote == Voter @@ -223,6 +226,9 @@ Game over == Fin de la partie +Game paused +== Jeu en pause + Game type == Type de jeu @@ -241,6 +247,9 @@ Hammer == Maillet +Handle rendering async from updates +== Rendre sans attendre les mises à jour + Has people playing == Au moins un joueur @@ -466,6 +475,9 @@ Reset to defaults == Réinitialiser +Respawn +== Réapparaître + Rifle == Laser @@ -526,6 +538,9 @@ Show name plates == Montrer les pseudonymes +Show only chat messages from friends +== Afficher seulement les message des amis + Show only supported == Ne montrer que les résolutions supportées @@ -539,10 +554,10 @@ == Son Sound error -== Erreur de son +== Erreur audio Sound volume -== Volume du son +== Volume audio Spectate == Regarder @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Il y a une carte non-enregistrée dans l'éditeur, vous voulez peut-être l'enregistrer avant de quitter le jeu. +Threaded rendering +== Rendu en parallèle + +Threaded sound loading +== Chargement des sons en paralèlle + Time limit == Temps limite @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/german.txt teeworlds-0.6.4+dfsg/data/languages/german.txt --- teeworlds-0.6.3+dfsg/data/languages/german.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/german.txt 2016-11-13 15:41:35.000000000 +0000 @@ -1,3 +1,4 @@ + ##### translated strings ##### %d Bytes @@ -78,6 +79,9 @@ Body == Körper +Borderless window +== Randloses Fenster + Call vote == Abstimmen @@ -121,7 +125,7 @@ == Land Crc: -== Prüfsumme: +== Prüfsumme(CRC32): Created: == Erstellt: @@ -243,6 +247,9 @@ Hammer == Hammer +Handle rendering async from updates +== spielunabhängige Bilddarstellung + Has people playing == Server nicht leer @@ -325,7 +332,7 @@ == Nach links Move player to spectators -== Spieler zu Zuschauer machen +== Spieler zum Zuschauer machen Move right == Nach rechts @@ -355,7 +362,7 @@ == Nächste Waffe Nickname -== Spitzname +== Spielername No == Nein @@ -451,7 +458,7 @@ == Remotekonsole Remove -== Löschen +== Entfernen Remove friend == Freund entfernen @@ -484,7 +491,7 @@ == Sätt. Score -== Score +== Punktestand Score board == Punktetafel @@ -523,10 +530,10 @@ == Chat anzeigen Show friends only -== Nur Freunde zeigen +== Nur Freunde anzeigen Show ingame HUD -== Spielanzeigen +== Spielanzeigen darstellen Show name plates == Zeige Namen @@ -601,10 +608,16 @@ == Das Audiosystem konnte nicht gestartet werden. The server is running a non-standard tuning on a pure game type. -== Der Server läuft nicht mit Standardeinstellungen. +== Der Server läuft nicht mit standardmäßigen Tuning-Einstellungen auf einem Vanilla-Spieltypen. There's an unsaved map in the editor, you might want to save it before you quit the game. -== Im Editor ist noch eine ungespeicherte Karte. Vielleicht möchtest du sie speichern. +== Im Editor ist noch eine ungespeicherte Karte. Vielleicht möchtest du sie speichern, bevor du das Spiel beendest. + +Threaded rendering +== Parallele Darstellung des Bildes zum Spiel + +Threaded sound loading +== Paralleles Laden der Audiodateien zum Spiel Time limit == Zeitlimit @@ -673,7 +686,7 @@ == Ja You must restart the game for all settings to take effect. -== Du musst das Spiel neustarten um die Änderungen zu übernehmen. +== Du musst das Spiel neustarten, um die Änderungen zu übernehmen. Your skin == Dein Skin @@ -683,4 +696,5 @@ ##### needs translation ##### -##### old translations ##### \ No newline at end of file +##### old translations ##### + diff -Nru teeworlds-0.6.3+dfsg/data/languages/hungarian.txt teeworlds-0.6.4+dfsg/data/languages/hungarian.txt --- teeworlds-0.6.3+dfsg/data/languages/hungarian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/hungarian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -657,12 +657,18 @@ ##### needs translation ##### +Borderless window +== + Demofile: %s == Game paused == +Handle rendering async from updates +== + Play background music == @@ -684,5 +690,11 @@ Strict gametype filter == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/index.txt teeworlds-0.6.4+dfsg/data/languages/index.txt --- teeworlds-0.6.3+dfsg/data/languages/index.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/index.txt 2016-11-13 15:41:35.000000000 +0000 @@ -16,6 +16,10 @@ == Български == 100 +chuvash +== Чăвашла +== 643 + czech == Česky == 203 @@ -72,6 +76,10 @@ == Русский == 643 +sakha +== Саха тыла +== 643 + serbian == Srpski == 688 diff -Nru teeworlds-0.6.3+dfsg/data/languages/italian.txt teeworlds-0.6.4+dfsg/data/languages/italian.txt --- teeworlds-0.6.3+dfsg/data/languages/italian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/italian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Corpo +Borderless window +== Finestra senza bordi + Call vote == Vota @@ -223,6 +226,9 @@ Game over == Partita finita +Game paused +== Gioco in pausa + Game type == Tipo @@ -241,6 +247,9 @@ Hammer == Martello +Handle rendering async from updates +== Rendering asincrono + Has people playing == Con giocatori @@ -466,6 +475,9 @@ Reset to defaults == Reimposta +Respawn +== Rinasci + Rifle == Laser @@ -526,6 +538,9 @@ Show name plates == Mostra nomi +Show only chat messages from friends +== Mostra solo messaggi mandati da amici + Show only supported == Mostra solo supportati @@ -584,7 +599,7 @@ == Chat di squadra Teeworlds %s is out! Download it at www.teeworlds.com! -== È uscito Teeworld %s! Scaricalo su www.teeworlds.com! +== È uscito Teeworlds %s! Scaricalo su www.teeworlds.com! Texture Compression == Compressione texture @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == C'è una mappa non salvata nell'editor, probabilmente vuoi salvarla prima di uscire. +Threaded rendering +== Rendering in processo separato + +Threaded sound loading +== Audio in processo separato + Time limit == Limite di tempo @@ -614,7 +635,7 @@ == Tipo: UI Color -== Color interfaccia +== Colore interfaccia Unable to delete the demo == Impossibile eliminare la demo @@ -675,17 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### - -== ## translated strings ##### - diff -Nru teeworlds-0.6.3+dfsg/data/languages/kyrgyz.txt teeworlds-0.6.4+dfsg/data/languages/kyrgyz.txt --- teeworlds-0.6.3+dfsg/data/languages/kyrgyz.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/kyrgyz.txt 2016-11-13 15:41:35.000000000 +0000 @@ -1,3 +1,4 @@ + ##### translated strings ##### %d Bytes @@ -25,13 +26,13 @@ == %i секунда калды! %s wins! -== %s утту! +== %s жеңди! -Page %d- -== -Барак %d- +== -%d бет- Abort -== Жокко чыгаруу +== Баш тартуу Add == Кошуу @@ -49,64 +50,67 @@ == Тунук. Always show name plates -== Ат көрнөкчөлөрдү дайыма көрсөтүү +== Оюнчулардын ысымын дайыма көрсөтүү Are you sure that you want to delete the demo? -== Сиз чын эле демонун өчүрүлүшүн каалайсызбы? +== Сиз демону чын эле өчүргүңүз келеби? Are you sure that you want to quit? -== Сиз чын эле оюндан чыгууну каалайсызбы? +== Сиз оюндан чын эле чыккыңыз келеби? Are you sure that you want to remove the player from your friends list? -== Сиз чын эле бул оюнчуну достор тизмеңизден өчүргүңүз келеби? +== Сиз бул оюнчуну достор тизмесинен чын эле өчүргүңүз келеби? As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server. -== Бул оюндун биринчи жүргүзүлүшү болгону үчүн, төмөн жакка такма атыңызды киргизиңиз. Серверге туташуу алдында ырастоолорду текшериңиз. +== Оюндун биринчи жүргүзүлүшү болгондуктан, лакабыңызды төмөн жакка киргизиңиз. Серверге кошулуудан мурун баптоолоруңузду жөнгө салып алыңыз. Automatically record demos -== Демону автоматтуу түрдө жаздыруу +== Демолорду автоматтуу түрдө жаздыруу Automatically take game over screenshot -== Оюн натыйжаларын сүрөткө тартуу +== Оюндун жыйынтыгын авто. түрдө сүрөткө тартуу Blue team -== Көктөр +== Көк команда Blue team wins! -== Көктөр утту! +== Көк команда жеңди! Body == Дене +Borderless window +== Чек арасыз терезе + Call vote -== Добуш берүү +== Добуш баштоо Change settings -== Ырастоолорду өзгөртүү +== Баптоолорду өзгөртүү Chat == Маек Clan -== Кланы +== Клан Client -== Клиент +== Кардар Close -== Чыгуу +== Жабуу Compatible version -== Батышуучу версия +== Сыйымдуу нуска Connect -== Туташуу +== Кошулуу Connecting to -== Туташтырылууда +== Кошулууда Connection Problems... -== Байланыш көйгөйлөрү... +== Байланыш маселелери... Console == Консоль @@ -115,7 +119,7 @@ == Башкаруу Count players only -== Оюнчуларды гана саноо +== Оюнч. гана эсепке алуу Country == Өлкө @@ -124,16 +128,16 @@ == Crc: Created: -== Жаратылганы: +== Жаратылган күнү: Current -== Кезектегиси +== Учурдагы Current version: %s -== Кезектеги версиясы: %s +== Учурдагы нуска: %s Custom colors -== Өз түстөрүңүз +== Бапталуучу түстөр Delete == Өчүрүү @@ -142,34 +146,34 @@ == Демону өчүрүү Demo details -== Демо деталдары +== Демо тууралуу Demofile: %s -== Демофайлы: %s +== Демо: %s Demos == Демолор Disconnect -== Өчүрүү +== Байл. токтотуу Disconnected -== Өчүрүлдү +== Байланышты токтотулду Display Modes == Көрсөтүү режимдери Downloading map -== Карта жүктөөлүүдө +== Карта жүктөлүүдө Draw! -== Тең! +== Тең чыгуу! Dynamic Camera == Динамикалык камера Emoticon -== Эмоциялар +== Быйтыкча Enter == Кирүү @@ -178,13 +182,13 @@ == Ката Error loading demo -== Демону жүктөө учурундагы ката +== Демону жүктөөдө ката кетти FSAA samples == FSAA сэмплдери Favorite -== Тандалма +== Тандалмага кошуу Favorites == Тандалмалар @@ -196,16 +200,16 @@ == Фильтр Fire -== Атуу +== Ок атуу Folder -== Папка +== Мукаба Force vote -== Тездетүү +== Добушту мажбурлоо Free-View -== Эркин сереп +== Эркин кароо Friends == Достор @@ -217,16 +221,19 @@ == Оюн Game info -== Оюн жөнүндө +== Оюн тууралуу Game over == Оюн бүттү +Game paused +== Оюн паузага коюлду + Game type == Оюн түрү Game types: -== Оюн түрү: +== Оюн түрлөрү: General == Негизги @@ -240,11 +247,14 @@ Hammer == Барскан +Handle rendering async from updates +== Handle rendering async from updates + Has people playing -== Бош эмес сервер +== Оюнчулары бар сервер High Detail -== Жогорку деталдаштыруу +== Жогору деталдаштыруу Hook == Илмек @@ -262,22 +272,22 @@ == Интернет Invalid Demo -== Жарабаган демо +== Туура эмес демо Join blue -== Көктөргө +== Көккө кирүү Join game -== Ойноо +== Оюнга кирүү Join red -== Кызылдарга +== Кызылга кир. Jump == Секирүү Kick player -== Оюнчуну чыгаруу +== Оюнчуну серверден кетирүү LAN == LAN @@ -286,10 +296,10 @@ == Тил Length: -== Узундугу: +== Узактыгы: Lht. -== Ач. түс. +== Ачык. Loading == Жүктөлүүдө @@ -298,61 +308,61 @@ == Күндүн билдирүүсү Map -== Картасы +== Карта Map: -== Картасы: +== Карта: Max Screenshots -== Сүрөттөрдүн жогорку чеги +== Сүрөттөрдүн жогорку саны Max demos -== Демолордун жогорку чеги +== Демолордун жогорку саны Maximum ping: -== Пингдин ж. чеги: +== Эң жогорку пинг: Miscellaneous == Кошумча Mouse sens. -== Чычкан сезгич. +== Чычкандын сез. Move left == Солго басуу Move player to spectators -== Оюнчуну байкоочуларга ташуу +== Оюнчуну көрүүчүгө которуу Move right == Оңго басуу Movement -== Аракет +== Кыймыл Mute when not active -== Активдүү эмес кезде үндү өчүрүү +== Активдүү эмес учурунда үндү өчүрүү Name -== Аты +== Ысым Name plates size -== Ат көрнөкчөлөрдүн өлчөмү +== Ысымдын өлчөмү Netversion: -== Версиясы: +== Нускасы: New name: -== Жаңы аты: +== Жаңы ысым: News == Жаңылыктар Next weapon -== Кийин. курал +== Кийинки курал Nickname -== Такма атыңыз +== Лакап No == Жок @@ -361,55 +371,55 @@ == Сырсөзсүз No servers found -== Серверлер табылган жок +== Серверлер табылбады No servers match your filter criteria -== Сиздин фильтриңизге жарай турган серверлер жок +== Сиздин фильтриңизге шайкеш келген серверлер жок Ok -== ОК +== Жарайт Open == Ачуу Parent Folder -== Ата-энелик каталог +== Ата-энелик мукаба Password -== Сырсөзү +== Сырсөз Password incorrect == Сырсөз Ping -== Пинги +== Пинг Pistol == Тапанча Play -== Көрүү +== Ойнотуу Play background music -== Фон музыкасын ойнотуу +== Фондогу музыканы ойнотуу Player == Оюнчу Player country: -== Өлкөсү: +== Өлкө: Player options -== Оюнчу опциялары +== Оюнчунун параметрлери Players == Оюнчулар Please balance teams! -== Команадаларды баланстаңыз! +== Командаларды теңдеңиздер! Prev. weapon -== Мурун. курал +== Мурунку курал Quality Textures == Сапаттуу текстуралар @@ -421,10 +431,10 @@ == Чыгуу Quit anyway? -== Чыгуу? +== Баары бир чыгасызбы? REC %3d:%02d -== ЖАЗДЫРУУ %3d:%02d +== REC %3d:%02d Reason: == Себеби: @@ -433,19 +443,19 @@ == Демо жаздыруу Red team -== Кызылдар +== Кызыл команда Red team wins! -== Кызылдар утту! +== Кызыл команда жеңди! Refresh == Жаңылоо Refreshing master servers -== Мастер-серверлер тизмесин жаңылоо +== Башкы-серверлер жаңыланууда Remote console -== Алыскы консоль +== Узакташкан консоль Remove == Өчүрүү @@ -454,31 +464,34 @@ == Досту өчүрүү Rename -== Атын өзгөртүү +== Жаңыча атоо Rename demo -== Демо атын өзгөртүү +== Демону жаңыча атоо Reset filter -== Фильтрлерди түшүрүү +== Фильтрди калыбына к. Reset to defaults -== Жарыяланбаска түшүрүү +== Адепки калыбына келтирүү + +Respawn +== Кайрадан жаралуу Rifle -== Бластер +== Лазер Round -== Раунду +== Раунд Sample rate -== Жыштыгы +== Жыштык Sat. -== Канык. +== Каныккан. Score -== Упайы +== Упайлар Score board == Табло @@ -490,13 +503,13 @@ == Табло Screenshot -== Сүрөт +== Скриншот Server address: -== Сервер дареги: +== Сервердин дареги: Server details -== Сервер деталдары +== Сервер тууралуу Server filter == Сервер фильтри @@ -505,10 +518,10 @@ == Маалымат Server not full -== Сервер толук эмес +== Бош оруну бар сервер Settings -== Ырастоолор +== Баптоолор Shotgun == Мылтык @@ -517,16 +530,19 @@ == Маекти көрсөтүү Show friends only -== Достор менен гана +== Досторду гана көрсөтүү Show ingame HUD == Оюн ичиндеги HUD'ни көрсөтүү Show name plates -== Оюнчулардын аттарын көрсөтүү +== Оюнчулардын ысымын көрсөтүү + +Show only chat messages from friends +== Достордун гана маек билдирүүлөрүн көрсөтүү Show only supported -== Колдолгонду гана көрсөтүү +== Колдогонун гана көрсөтүү Size: == Өлчөмү: @@ -541,22 +557,22 @@ == Үн катасы Sound volume -== Үн көлөмү +== Үн бийиктиги Spectate -== Байкоо +== Көрүүчү реж. Spectate next -== Кийин. байкоо +== Кийинкини көрүү Spectate previous -== Мурун. байкоо +== Мурункуну көрүү Spectator mode -== Байкоочу +== Көрүүчү режими Spectators -== Байкоочулар +== Көрүүчүлөр Standard gametype == Стандарттуу оюн түрү @@ -568,10 +584,10 @@ == Токтотуу Strict gametype filter -== Оюн түрүнүн так фильтри +== Оюн түрүн текши издөө Sudden Death -== Тез өлүм +== Күтүүсүз өлүм Switch weapon on pickup == Көтөрүлгөн куралга которуу @@ -580,22 +596,28 @@ == Команда Team chat -== Команда маеги +== Команданын маеги Teeworlds %s is out! Download it at www.teeworlds.com! -== Teeworlds %s чыкты! www.teeworlds.com сайтынан жүктөп алыңыз! +== Teeworlds %s чыкты! www.teeworlds.com дон жүктөп алыңыздар! Texture Compression -== Текстура кысылышы +== Текстуралык кысуу The audio device couldn't be initialised. -== Аудио түзмөгүн инициализациялап алууга мүмкүн эмес. +== Аудио түзмөгүн иштетүү мүмкүн эмес. The server is running a non-standard tuning on a pure game type. -== Бул сервер стандартту эмес ырастоолор менен таза оюн түрүндө иштеп жатат. +== Бул сервер стандартту эмес баптоолору менен стандарттуу оюн түрүндө жүргүзүлгөн There's an unsaved map in the editor, you might want to save it before you quit the game. -== Редактордо сакталбаган карта бар, аны оюндан чыгаар алдында сактасаңыз болот. +== Редактордо сакталбаган карта калды, оюндар чыгуудан мурун сактай аласыз. + +Threaded rendering +== Агымдуу визуалдаштыруу + +Threaded sound loading +== Агымдуу үн жүктөө Time limit == Убакыт чеги @@ -604,7 +626,7 @@ == Убакыт чеги: %d мин. Try again -== ОК +== Кайталоо Type == Түрү @@ -616,31 +638,31 @@ == Интерфейс түсү Unable to delete the demo -== Демону өчүрүү мүмкүн эмес +== Демону өчүрүүгө мүмкүн эмес Unable to rename the demo -== Демо атын өзгөртүү мүмкүн эмес +== Демону жаңыча атоого мүмкүн эмес Use sounds == Үндөрдү колдонуу Use team colors for name plates -== Аттар үчүн команданын түсүн колдонуу +== Ысымдарга команданын түсүн колдонуу V-Sync -== Тик синхрондоштуруусу +== Вертикалдык синхрондоштуруу Version -== Версиясы +== Нускасы Version: -== Версиясы: +== Нускасы: Vote command: -== Добуш коммандасы: +== Добуш командасы: Vote description: -== Добуш баяндамасы: +== Добуштун сүрөттөөсү: Vote no == Каршы @@ -652,7 +674,7 @@ == Добуш берүү Warmup -== Даярдануу +== Камданыңыздар Weapon == Курал @@ -664,7 +686,7 @@ == Ооба You must restart the game for all settings to take effect. -== Өзгөртүүлөрдү колдонуу үчүн оюнду кайта жүргүзүңүз. +== Өзгөртүүлөр күчүнө кирүү үчүн, оюнду кайтадан иштетиш керек. Your skin == Териңиз @@ -672,15 +694,7 @@ no limit == чексиз -Game paused -== Оюн бир азга токтотулду - -Respawn -== Кайра жаралуу - -Show only chat messages from friends -== Достордун гана маек билдирүүлөрүн көрсөтүү - ##### needs translation ##### ##### old translations ##### + diff -Nru teeworlds-0.6.3+dfsg/data/languages/norwegian.txt teeworlds-0.6.4+dfsg/data/languages/norwegian.txt --- teeworlds-0.6.3+dfsg/data/languages/norwegian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/norwegian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Kropp +Borderless window +== Vindu uten kanter + Call vote == Stem @@ -223,6 +226,9 @@ Game over == Spill avsluttet +Game paused +== Pause spill + Game type == Spilltype @@ -241,11 +247,14 @@ Hammer == Hammer +Handle rendering async from updates +== Håndtere rendring async fra oppdateringer + Has people playing -== Har folk som spiller +== Har spillere High Detail -== Ekstra detaljer +== Høye detaljer Hook == Gripe tang @@ -266,13 +275,13 @@ == Ugyldig Demo Join blue -== Bli med blå +== Join blå Join game -== Bli med i spillet +== Join spillet Join red -== Bli med rød +== Join rød Jump == Hopp @@ -431,7 +440,7 @@ == Grunn: Record demo -== Ta opp demo +== Record demo Red team == Rødt lag @@ -466,6 +475,9 @@ Reset to defaults == Tilbakestill standardinstillinger +Respawn +== Respawn + Rifle == Laser @@ -526,6 +538,9 @@ Show name plates == Vis navnskilt +Show only chat messages from friends +== Vis bare chat meldinger fra venner + Show only supported == Vis kompatible @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Det er en ulagret bane i baneredigereren, du vil kanskje lagre den før du avslutter. +Threaded rendering +== Threaded rendering + +Threaded sound loading +== Threaded sound loading + Time limit == Tidsbegrensning @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/polish.txt teeworlds-0.6.4+dfsg/data/languages/polish.txt --- teeworlds-0.6.3+dfsg/data/languages/polish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/polish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,15 +675,27 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### utracić swojej pracy! diff -Nru teeworlds-0.6.3+dfsg/data/languages/portuguese.txt teeworlds-0.6.4+dfsg/data/languages/portuguese.txt --- teeworlds-0.6.3+dfsg/data/languages/portuguese.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/portuguese.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/romanian.txt teeworlds-0.6.4+dfsg/data/languages/romanian.txt --- teeworlds-0.6.3+dfsg/data/languages/romanian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/romanian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -26,7 +26,7 @@ == %i secunde rămase %s wins! -== %s câștigă! +== %s a câștigat! -Page %d- == -Pagina %d- @@ -50,10 +50,10 @@ == Alfa Always show name plates -== Afișează întotdeauna pseudonimele +== Afișează întotdeauna etichetele Are you sure that you want to delete the demo? -== Sigur vrei să ștergi demo-ul? +== Sigur vrei să ștergi demonstrația? Are you sure that you want to quit? == Sigur vrei să ieși? @@ -65,7 +65,7 @@ == Aceasta fiind prima lansare a jocului, te rog introdu-ți pseudonimul mai jos. E recomandat să verifici setările și să le ajustezi cum vrei înainte să intri pe un server. Automatically record demos -== Înregistrează automat demo-uri +== Înregistrează automat demonstrații Automatically take game over screenshot == Fă automat o captură de ecran la final @@ -79,6 +79,9 @@ Body == Corp +Borderless window +== Fereastră fără margini + Call vote == Votează @@ -89,10 +92,10 @@ == Chat Clan -== Clanul +== Clan Client -== Clientul +== Client Close == Închide @@ -179,7 +182,7 @@ == Eroare Error loading demo -== Eroare la încărcarea demo-ului +== Eroare la încărcarea demonstrației FSAA samples == Eșantioane FSAA @@ -212,7 +215,7 @@ == Prieteni Fullscreen -== Ecrat complet +== Afișare pe tot ecranul Game == Joc @@ -223,6 +226,9 @@ Game over == Final de joc +Game paused +== Joc în pauză + Game type == Tip de joc @@ -236,11 +242,14 @@ == Grafică Grenade -== Grenade +== Grenadă Hammer == Ciocan +Handle rendering async from updates +== Randează asincron față de actualizări + Has people playing == Are jucători activi @@ -254,7 +263,7 @@ == Adresa gazdei Hue -== Tentă +== Nuanță Info == Informații @@ -308,7 +317,7 @@ == Număr maxim de capturi de ecran Max demos -== Număr maxim de demo-uri +== Număr maxim de demonstrații Maximum ping: == Ping maxim: @@ -317,16 +326,16 @@ == Diverse Mouse sens. -== Sensib. maus +== Viteză maus Move left -== Mută la stânga +== Stânga Move player to spectators == Mută jucătorul la spectatori Move right -== Mută la dreapta +== Dreapta Movement == Mișcare @@ -338,7 +347,7 @@ == Nume Name plates size -== Dimensiune nume placă +== Dimensiunea etichetei Netversion: == Cod rețea: @@ -362,10 +371,10 @@ == Fără parolă No servers found -== Nici un server găsit +== Niciun server găsit No servers match your filter criteria -== Nici un server nu corespunde criteriilor +== Niciun server nu corespunde criteriilor Ok == Bine @@ -458,7 +467,7 @@ == Redenumește Rename demo -== Redenumește demo-ul +== Redenumește demonstrația Reset filter == Filtru implicit @@ -466,6 +475,9 @@ Reset to defaults == Setări implicite +Respawn +== Renaște + Rifle == Carabină @@ -524,7 +536,10 @@ == Arată scorul în joc Show name plates -== Arată pseudonimele +== Arată etichetele cu pseudonime + +Show only chat messages from friends +== Arată doar mesajele prietenilor Show only supported == Arată doar modurile suportate @@ -593,11 +608,17 @@ == Dispozitivul audio nu a putut fi inițializat. The server is running a non-standard tuning on a pure game type. -== Serverul folosește parametri ne-standard într-un joc standard. +== Serverul nu folosește parametri standard într-un joc standard. There's an unsaved map in the editor, you might want to save it before you quit the game. == Există o hartă nesalvată în editor. Probabil vrei să o salvezi înainte să ieși din joc. +Threaded rendering +== Randare grafică în paralel + +Threaded sound loading +== Încărcare sunete în paralel + Time limit == Timp limită @@ -617,16 +638,16 @@ == Culoare meniu Unable to delete the demo -== Nu pot șterge demo-ul +== Nu pot șterge demonstrația Unable to rename the demo -== Nu pot redenumi demo-ul +== Nu pot redenumi demonstrația Use sounds -== Folosește sunetul +== Folosește sunete Use team colors for name plates -== Folosește culorile echipelor pe etichetele de nume +== Folosește culorile echipelor pe etichete V-Sync == Sincronizare verticală (V-Sync) @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/russian.txt teeworlds-0.6.4+dfsg/data/languages/russian.txt --- teeworlds-0.6.3+dfsg/data/languages/russian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/russian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Тело +Borderless window +== Окно без рамки + Call vote == Голосовать @@ -223,6 +226,9 @@ Game over == Игра окончена +Game paused +== Игра остановлена + Game type == Тип игры @@ -241,6 +247,9 @@ Hammer == Молот +Handle rendering async from updates +== Обрабатывать прорисовку асинхронно из обновлений + Has people playing == Не пустой сервер @@ -466,6 +475,9 @@ Reset to defaults == Сбросить настройки +Respawn +== Возрождение + Rifle == Бластер @@ -526,6 +538,9 @@ Show name plates == Показывать имена игроков +Show only chat messages from friends +== Показывать сообщения только от друзей + Show only supported == Показывать только поддерживаемые разрешения экрана @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Есть несохранённая карта в редакторе, Вы можете сохранить её перед тем, как выйти. +Threaded rendering +== Потоковая прорисовка + +Threaded sound loading +== Потоковая загрузка звука + Time limit == Лимит времени @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/sakha.txt teeworlds-0.6.4+dfsg/data/languages/sakha.txt --- teeworlds-0.6.3+dfsg/data/languages/sakha.txt 1970-01-01 00:00:00.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/sakha.txt 2016-11-13 15:41:35.000000000 +0000 @@ -0,0 +1,700 @@ + +##### translated strings ##### + +%d Bytes +== %d байт + +%d of %d servers, %d players +== %d-тан %d сервер, %d оонньооччу + +%d%% loaded +== %d%% хачайданна + +%ds left +== %d сөк. хаалла + +%i minute left +== %i мүнүүтэ хаалла! + +%i minutes left +== %i мүнүүтэ хаалла! + +%i second left +== %i сөкүүндэ хаалла! + +%i seconds left +== %i сөкүүндэ хаалла! + +%s wins! +== %s кыайда! + +-Page %d- +== -%d страница- + +Abort +== Уурат + +Add +== Эп + +Add Friend +== Доҕоргун эп + +Address +== Аадырыс + +All +== Барыта + +Alpha +== Дьэҥкирэ + +Always show name plates +== Оонньооччулар ааттарын наар көрдөрөр + +Are you sure that you want to delete the demo? +== Демоны сотторорго сөбүлэһэҕит дуо? + +Are you sure that you want to quit? +== Кырдьык тахсыаххытын баҕараҕыт дуо? + +Are you sure that you want to remove the player from your friends list? +== Оонньооччуну доҕордоргут испииһигиттэн кырдьык соттороҕут дуо? + +As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server. +== Бастакы оонньуургут быһыытынан, ааккытын баһаалыста манна суруйуҥ. Оонньуоххут иннинэ онньуу туруорууларын көрөр сүбэлэнэр. + +Automatically record demos +== Демоны автоматическайдык уһул + +Automatically take game over screenshot +== Оонньуу бүтүүтү скриншоттаа + +Blue team +== Күөхтэр + +Blue team wins! +== Күөхтэр кыайдылар! + +Body +== Эттик + +Borderless window +== Араамката суох түннүк + +Call vote +== Куоластаа + +Change settings +== Туруорууларын уларыт + +Chat +== Чат + +Clan +== Клан + +Client +== Клиент + +Close +== Таҕыс + +Compatible version +== Түбэсиһэр версия + +Connect +== Холбон + +Connecting to +== Холбонобут + +Connection Problems... +== Сибээс быһылынна... + +Console +== Консоль + +Controls +== Салайыы + +Count players only +== Ооннь. эрэ аах + +Country +== Дойдугут былааҕа + +Crc: +== Crc: + +Created: +== Оҥоһулунна: + +Current +== Билиҥҥи + +Current version: %s +== Билиҥҥи версия: %s + +Custom colors +== Бэйэҥ өҥнөрүн + +Delete +== Соттор + +Delete demo +== Демоны соттор + +Demo details +== Детали демо + +Demofile: %s +== Демо: %s + +Demos +== Демо + +Disconnect +== Сибээһи быс + +Disconnected +== Сибээс быһылынна + +Display Modes +== Экран разрешенията + +Downloading map +== Хачайданар карта + +Draw! +== Ким да кыайбата! + +Dynamic Camera +== Хамсыыр камера + +Emoticon +== Эмоциялар + +Enter +== Киир + +Error +== Сыыһа + +Error loading demo +== Демо сатаан аһыллыбата + +FSAA samples +== FSAA сэмпллара + +Favorite +== Сөбүлүүр + +Favorites +== Сөбүлүүр + +Feet +== Атахтар + +Filter +== Фильтр + +Fire +== Ытыы + +Folder +== Папка + +Force vote +== Куоластат + +Free-View +== Көҥүл көрөр + +Friends +== Доҕордор + +Fullscreen +== Полноэкраннай режим + +Game +== Оонньуу + +Game info +== Оонньуу туһунан + +Game over +== Оонньуу бүттэ + +Game paused +== Оонньуу тохтоото + +Game type +== Ооньуу көрүҥэ + +Game types: +== Оонньуу көрүҥэ: + +General +== Бастыҥ + +Graphics +== Графика + +Grenade +== Гранатомёт + +Hammer +== Өтүйэ + +Handle rendering async from updates +== Рендериҥы саҥардааһынтан туспа оҥор + +Has people playing +== Оонньооччулардаах + +High Detail +== Үрдук хаачыстыбалаах + +Hook +== Тордуох + +Host address +== Сервер аадырыһа + +Hue +== Өҥүн быһыыта + +Info +== Информация + +Internet +== Интернет + +Invalid Demo +== Сатаммат демо + +Join blue +== Күөхтэргэ + +Join game +== Киир + +Join red +== Кыһылларга + +Jump +== Ыстан + +Kick player +== Кикайдаа + +LAN +== LAN + +Language +== Тыл + +Length: +== Устата + +Lht. +== Сырдыга + +Loading +== Бэлэмнээһин + +MOTD +== MOTD + +Map +== Карта + +Map: +== Карта: + +Max Screenshots +== Скриншот макс. ахсаана + +Max demos +== Демо макс. ахсаана + +Maximum ping: +== Пинг макс.: + +Miscellaneous +== Өссө + +Mouse sens. +== Мышка билимтиэтэ + +Move left +== Хаҥас хаам + +Move player to spectators +== Көрөөччү гын + +Move right +== Уҥа хаам + +Movement +== Хаамар + +Mute when not active +== Тыаһын бүөлээ паузаҕа + +Name +== Аат + +Name plates size +== Размера + +Netversion: +== Версия: + +New name: +== Саҥа аат + +News +== Сонун + +Next weapon +== Аныг. саа + +Nickname +== Аат + +No +== Суох + +No password +== Пөрүөлэ суох + +No servers found +== Сервер көстубэтэ + +No servers match your filter criteria +== Фильтрдаммыт сервер көстубэтэ + +Ok +== ОК + +Open +== Ас + +Parent Folder +== Төрүт директория + +Password +== Пөрүөл + +Password incorrect +== Сыыһа пөрүөл + +Ping +== Пинг + +Pistol +== Бэстэлиэт + +Play +== Көр + +Play background music +== Тас музыканы иһит + +Player +== Оонньооччу + +Player country: +== Дойдута: + +Player options +== Оонньооччулар опциялара + +Players +== Ооннь. + +Please balance teams! +== Командалары баланстааҥ! + +Prev. weapon +== Инники саа + +Quality Textures +== Үчүгэй текстуралар + +Quick search: +== Түргэнник көрдөө: + +Quit +== Таҕыс + +Quit anyway? +== Син биир тахсаҕыт? + +REC %3d:%02d +== REC %3d:%02d + +Reason: +== Сылтах: + +Record demo +== Демоны уһул + +Red team +== Кыһыллар + +Red team wins! +== Кыһыллар кыайдылар! + +Refresh +== Саҥардат + +Refreshing master servers +== Мастер-сервер испииһэгин саҥардабыт + +Remote console +== Сервер консола + +Remove +== Соттор + +Remove friend +== Доҕоргун соттор + +Rename +== Аатынык ааттаа + +Rename demo +== Демоны атыннык ааттаа + +Reset filter +== Фильтры сбростаа + +Reset to defaults +== Туруоруулары сбростаа + +Respawn +== Хаттан төрүүр + +Rifle +== Бластер + +Round +== Раунд + +Sample rate +== Тыас частотата + +Sat. +== Контраһа + +Score +== Очко + +Score board +== Табло + +Score limit +== Очко лимита + +Scoreboard +== Табло + +Screenshot +== Скриншот + +Server address: +== Сервер аадырыһа + +Server details +== Сервер опциялара + +Server filter +== Сервер фильтра + +Server info +== Информация + +Server not full +== Толорута суох сервер + +Settings +== Туруоруулар + +Shotgun +== Саа + +Show chat +== Чаты көрдөр + +Show friends only +== Доҕордоргун эрэ көрдөр + +Show ingame HUD +== Оонньуу интерфейһын көрдөр + +Show name plates +== Оонньооччулар ааттарын көрдөр + +Show only chat messages from friends +== Доҕордоргут эрэ суруктарын көрдөр + +Show only supported +== Барсар эрэ разрешенияны көрдөр + +Size: +== Кээмэй: + +Skins +== Тириилэр + +Sound +== Тыас + +Sound error +== Тыастар сыыһалара + +Sound volume +== Тыас улахана + +Spectate +== Көр + +Spectate next +== Аныг. көр + +Spectate previous +== Инникини кор + +Spectator mode +== Көрөөччү буол + +Spectators +== Көрөөччүлэр + +Standard gametype +== Стандартнай ооннь. көрүҥэ + +Standard map +== Стандартнай карта + +Stop record +== Устан бүт + +Strict gametype filter +== Ооннь. көр. строго фильтрдаа + +Sudden Death +== Түргэн өлүү + +Switch weapon on pickup +== Сааны булан ылар буол + +Team +== Команда + +Team chat +== Команда чата + +Teeworlds %s is out! Download it at www.teeworlds.com! +== Teeworlds %s таҕыста! www.teeworlds.com хачайдааҥ! + +Texture Compression +== Текстураны кыччат + +The audio device couldn't be initialised. +== Тыас сэбэ сатаан бэлэмнэммэтэ + +The server is running a non-standard tuning on a pure game type. +== Сервер станд. онньуу көрүҥҥэ атын опциялары кытта үлэлиир. + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Редакторга суруллабатах карта баар, оонньууттан тахсыа иликкитинэ суруйуҥ. + +Threaded rendering +== Потоковай рендеринг + +Threaded sound loading +== Потоковая тыас бэлэмниитэ + +Time limit +== Оонньуу бириэмэтэ + +Time limit: %d min +== Оонньуу бириэмэтэ: %d + +Try again +== ОК + +Type +== Көрүҥ + +Type: +== Көрүҥ: + +UI Color +== Интерфейс өҥө + +Unable to delete the demo +== Демо сатаан сотуллабата + +Unable to rename the demo +== Демо аатын сатаан уларыйбата + +Use sounds +== Тыаһы холбоо + +Use team colors for name plates +== Оонньоочу аатыгар команда өҥүнэн гын + +V-Sync +== Вертикальнай синхронизация + +Version +== Версия + +Version: +== Версия: + +Vote command: +== Куоластыыр команда: + +Vote description: +== Куолас сылтаҕа: + +Vote no +== Сөбүлэспэт + +Vote yes +== Сөп диир + +Voting +== Куоластыыр + +Warmup +== Разминка + +Weapon +== Саа + +Welcome to Teeworlds +== Teeworlds оонньуу, баһаалыста! + +Yes +== Сөп + +You must restart the game for all settings to take effect. +== Саһа туруоруулары холбоору оонньууну хаттаан холбоон. + +Your skin +== Эһиги тириигит + +no limit +== лимита суох + +##### needs translation ##### + +##### old translations ##### + diff -Nru teeworlds-0.6.3+dfsg/data/languages/serbian.txt teeworlds-0.6.4+dfsg/data/languages/serbian.txt --- teeworlds-0.6.3+dfsg/data/languages/serbian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/serbian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/slovak.txt teeworlds-0.6.4+dfsg/data/languages/slovak.txt --- teeworlds-0.6.3+dfsg/data/languages/slovak.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/slovak.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/spanish.txt teeworlds-0.6.4+dfsg/data/languages/spanish.txt --- teeworlds-0.6.3+dfsg/data/languages/spanish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/spanish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -79,6 +79,9 @@ Body == Cuerpo +Borderless window +== Ventana sin bordes + Call vote == Votar @@ -223,6 +226,9 @@ Game over == Fin de la partida +Game paused +== Juego pausado + Game type == Modo @@ -241,6 +247,9 @@ Hammer == Martillo +Handle rendering async from updates +== Manejo de renderizado asincrono de actualizaciones + Has people playing == Hay gente jugando @@ -466,6 +475,9 @@ Reset to defaults == Resetar por defecto +Respawn +== Reaparecer + Rifle == Láser @@ -526,6 +538,9 @@ Show name plates == Mostrar apodos +Show only chat messages from friends +== Solo mostrar mensajes de chat de amigos + Show only supported == Mostrar únicamente modos soportados @@ -598,6 +613,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == Tienes un mapa sin guardar en el editor, quizá quieras guardarlo antes de salir. +Threaded rendering +== Renderizado multi-hilo + +Threaded sound loading +== Carga de audio en paralelo + Time limit == Tiempo límite @@ -675,14 +696,5 @@ ##### needs translation ##### -Game paused -== - -Respawn -== - -Show only chat messages from friends -== - ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/swedish.txt teeworlds-0.6.4+dfsg/data/languages/swedish.txt --- teeworlds-0.6.3+dfsg/data/languages/swedish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/swedish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -675,14 +675,26 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Respawn == Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations ##### diff -Nru teeworlds-0.6.3+dfsg/data/languages/turkish.txt teeworlds-0.6.4+dfsg/data/languages/turkish.txt --- teeworlds-0.6.3+dfsg/data/languages/turkish.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/turkish.txt 2016-11-13 15:41:35.000000000 +0000 @@ -672,9 +672,15 @@ ##### needs translation ##### +Borderless window +== + Game paused == +Handle rendering async from updates +== + Player country: == @@ -684,6 +690,12 @@ Show only chat messages from friends == +Threaded rendering +== + +Threaded sound loading +== + ##### old translations #####  diff -Nru teeworlds-0.6.3+dfsg/data/languages/ukrainian.txt teeworlds-0.6.4+dfsg/data/languages/ukrainian.txt --- teeworlds-0.6.3+dfsg/data/languages/ukrainian.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/data/languages/ukrainian.txt 2016-11-13 15:41:35.000000000 +0000 @@ -522,6 +522,9 @@ Automatically take game over screenshot == +Borderless window +== + Change settings == @@ -561,6 +564,9 @@ Game paused == +Handle rendering async from updates +== + Kick player == @@ -660,6 +666,12 @@ There's an unsaved map in the editor, you might want to save it before you quit the game. == +Threaded rendering +== + +Threaded sound loading +== + Type: == diff -Nru teeworlds-0.6.3+dfsg/datasrc/datatypes.py teeworlds-0.6.4+dfsg/datasrc/datatypes.py --- teeworlds-0.6.3+dfsg/datasrc/datatypes.py 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/datasrc/datatypes.py 2016-11-13 15:41:35.000000000 +0000 @@ -147,7 +147,7 @@ def Set(self, value): self.value = value def EmitDefinition(self, name): - return ["%f"%self.value] + return ["%ff"%self.value] #return ["%d /* %s */"%(self.value, self._target_name)] class String(BaseType): diff -Nru teeworlds-0.6.3+dfsg/debian/changelog teeworlds-0.6.4+dfsg/debian/changelog --- teeworlds-0.6.3+dfsg/debian/changelog 2016-08-14 08:47:58.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/changelog 2016-11-17 19:57:15.000000000 +0000 @@ -1,3 +1,15 @@ +teeworlds (0.6.4+dfsg-1) unstable; urgency=high + + * New upstream release. + - Fixes possible remote code execution on the client. (Closes: #844546) + * Refresh new-wavpack.patch + * Drop patches that have been fixed upstream: + - fix-gcc6-rename-round.patch + - fix-gcc6-var-types.patch + - reset-nethash.patch + + -- Felix Geyer Thu, 17 Nov 2016 20:57:15 +0100 + teeworlds (0.6.3+dfsg-3) unstable; urgency=medium * Reset nethash to the one of pristine 0.6.3. diff -Nru teeworlds-0.6.3+dfsg/debian/copyright teeworlds-0.6.4+dfsg/debian/copyright --- teeworlds-0.6.3+dfsg/debian/copyright 2016-04-25 18:37:16.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/copyright 2016-11-14 20:36:30.000000000 +0000 @@ -11,12 +11,7 @@ other/sdl/lib32 other/sdl/lib64 src/engine/external - datasrc/__pycache__ - objs/base - objs/engine - objs/game - src/game/generated/*.cpp - src/game/generated/*.h + datasrc/*.pyc Files: * Copyright: 2007-2011 Magnus Auvinen diff -Nru teeworlds-0.6.3+dfsg/debian/files teeworlds-0.6.4+dfsg/debian/files --- teeworlds-0.6.3+dfsg/debian/files 1970-01-01 00:00:00.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/files 2016-11-17 19:49:04.000000000 +0000 @@ -0,0 +1 @@ +teeworlds_0.6.4+dfsg-1_20161117T194904z-c19aa2f5.buildinfo games optional diff -Nru teeworlds-0.6.3+dfsg/debian/patches/fix-gcc6-rename-round.patch teeworlds-0.6.4+dfsg/debian/patches/fix-gcc6-rename-round.patch --- teeworlds-0.6.3+dfsg/debian/patches/fix-gcc6-rename-round.patch 2016-07-01 17:24:31.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/patches/fix-gcc6-rename-round.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -From bdd4b8c2b0ce4be986cb51a1dbc5d05db9a76867 Mon Sep 17 00:00:00 2001 -From: SushiTee -Date: Mon, 9 Dec 2013 14:00:24 +0100 -Subject: [PATCH] fixed compiling using visual studio 2013 by renaming the - round function - ---- - src/base/math.h | 2 +- - src/game/collision.h | 4 ++-- - src/game/editor/layer_tiles.cpp | 2 +- - src/game/gamecore.cpp | 16 ++++++++-------- - src/game/server/entity.cpp | 4 ++-- - 5 files changed, 14 insertions(+), 14 deletions(-) - -diff --git a/src/base/math.h b/src/base/math.h -index d58dbf1..07b0639 100644 ---- a/src/base/math.h -+++ b/src/base/math.h -@@ -20,7 +20,7 @@ inline float sign(float f) - return f<0.0f?-1.0f:1.0f; - } - --inline int round(float f) -+inline int round_to_int(float f) - { - if(f > 0) - return (int)(f+0.5f); -diff --git a/src/game/collision.h b/src/game/collision.h -index d16f2d5..cad75bb 100644 ---- a/src/game/collision.h -+++ b/src/game/collision.h -@@ -25,9 +25,9 @@ class CCollision - - CCollision(); - void Init(class CLayers *pLayers); -- bool CheckPoint(float x, float y) { return IsTileSolid(round(x), round(y)); } -+ bool CheckPoint(float x, float y) { return IsTileSolid(round_to_int(x), round_to_int(y)); } - bool CheckPoint(vec2 Pos) { return CheckPoint(Pos.x, Pos.y); } -- int GetCollisionAt(float x, float y) { return GetTile(round(x), round(y)); } -+ int GetCollisionAt(float x, float y) { return GetTile(round_to_int(x), round_to_int(y)); } - int GetWidth() { return m_Width; }; - int GetHeight() { return m_Height; }; - int IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision); -diff --git a/src/game/editor/layer_tiles.cpp b/src/game/editor/layer_tiles.cpp -index 032f391..0cdd760 100644 ---- a/src/game/editor/layer_tiles.cpp -+++ b/src/game/editor/layer_tiles.cpp -@@ -248,7 +248,7 @@ void CLayerTiles::BrushFlipY() - - void CLayerTiles::BrushRotate(float Amount) - { -- int Rotation = (round(360.0f*Amount/(pi*2))/90)%4; // 0=0, 1=90, 2=180, 3=270 -+ int Rotation = (round_to_int(360.0f*Amount/(pi*2))/90)%4; // 0=0, 1=90, 2=180, 3=270 - if(Rotation < 0) - Rotation +=4; - -diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp -index d43492a..a325a53 100644 ---- a/src/game/gamecore.cpp -+++ b/src/game/gamecore.cpp -@@ -401,17 +401,17 @@ void CCharacterCore::Move() - - void CCharacterCore::Write(CNetObj_CharacterCore *pObjCore) - { -- pObjCore->m_X = round(m_Pos.x); -- pObjCore->m_Y = round(m_Pos.y); -+ pObjCore->m_X = round_to_int(m_Pos.x); -+ pObjCore->m_Y = round_to_int(m_Pos.y); - -- pObjCore->m_VelX = round(m_Vel.x*256.0f); -- pObjCore->m_VelY = round(m_Vel.y*256.0f); -+ pObjCore->m_VelX = round_to_int(m_Vel.x*256.0f); -+ pObjCore->m_VelY = round_to_int(m_Vel.y*256.0f); - pObjCore->m_HookState = m_HookState; - pObjCore->m_HookTick = m_HookTick; -- pObjCore->m_HookX = round(m_HookPos.x); -- pObjCore->m_HookY = round(m_HookPos.y); -- pObjCore->m_HookDx = round(m_HookDir.x*256.0f); -- pObjCore->m_HookDy = round(m_HookDir.y*256.0f); -+ pObjCore->m_HookX = round_to_int(m_HookPos.x); -+ pObjCore->m_HookY = round_to_int(m_HookPos.y); -+ pObjCore->m_HookDx = round_to_int(m_HookDir.x*256.0f); -+ pObjCore->m_HookDy = round_to_int(m_HookDir.y*256.0f); - pObjCore->m_HookedPlayer = m_HookedPlayer; - pObjCore->m_Jumped = m_Jumped; - pObjCore->m_Direction = m_Direction; -diff --git a/src/game/server/entity.cpp b/src/game/server/entity.cpp -index 788c3f4..3b47e02 100644 ---- a/src/game/server/entity.cpp -+++ b/src/game/server/entity.cpp -@@ -51,6 +51,6 @@ int CEntity::NetworkClipped(int SnappingClient, vec2 CheckPos) - - bool CEntity::GameLayerClipped(vec2 CheckPos) - { -- return round(CheckPos.x)/32 < -200 || round(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 || -- round(CheckPos.y)/32 < -200 || round(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false; -+ return round_to_int(CheckPos.x)/32 < -200 || round_to_int(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 || -+ round_to_int(CheckPos.y)/32 < -200 || round_to_int(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false; - } diff -Nru teeworlds-0.6.3+dfsg/debian/patches/fix-gcc6-var-types.patch teeworlds-0.6.4+dfsg/debian/patches/fix-gcc6-var-types.patch --- teeworlds-0.6.3+dfsg/debian/patches/fix-gcc6-var-types.patch 2016-07-01 17:26:38.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/patches/fix-gcc6-var-types.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -From 52053d003d21f395573d430250a56f8f7410625d Mon Sep 17 00:00:00 2001 -From: oy -Date: Mon, 13 Jun 2016 09:27:09 +0200 -Subject: [PATCH] fixed some warnings - ---- - bam.lua | 2 +- - datasrc/datatypes.py | 2 +- - src/engine/client/client.cpp | 2 +- - src/mastersrv/mastersrv.cpp | 2 +- - src/tools/crapnet.cpp | 2 +- - 5 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/bam.lua b/bam.lua -index 11ac7b9..3ac85f3 100644 ---- a/bam.lua -+++ b/bam.lua -@@ -144,7 +144,7 @@ function build(settings) - settings.cc.Output = Intermediate_Output - - if config.compiler.driver == "cl" then -- settings.cc.flags:Add("/wd4244") -+ settings.cc.flags:Add("/wd4244", "/wd4577") - else - settings.cc.flags:Add("-Wall", "-fno-exceptions") - if family == "windows" then -diff --git a/datasrc/datatypes.py b/datasrc/datatypes.py -index 5441e37..f4ab825 100644 ---- a/datasrc/datatypes.py -+++ b/datasrc/datatypes.py -@@ -147,7 +147,7 @@ def __init__(self, value): - def Set(self, value): - self.value = value - def EmitDefinition(self, name): -- return ["%f"%self.value] -+ return ["%ff"%self.value] - #return ["%d /* %s */"%(self.value, self._target_name)] - - class String(BaseType): -diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp -index 2bf3d48..c5e1475 100644 ---- a/src/engine/client/client.cpp -+++ b/src/engine/client/client.cpp -@@ -935,7 +935,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket) - { - NETADDR Addr; - -- static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; -+ static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; - - // copy address - if(!mem_comp(IPV4Mapping, pAddrs[i].m_aIp, sizeof(IPV4Mapping))) -diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp -index 1098123..eee3050 100644 ---- a/src/mastersrv/mastersrv.cpp -+++ b/src/mastersrv/mastersrv.cpp -@@ -117,7 +117,7 @@ void BuildPackets() - } - else - { -- static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; -+ static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; - - mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, IPV4Mapping, sizeof(IPV4Mapping)); - m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[12] = pCurrent->m_Address.ip[0]; -diff --git a/src/tools/crapnet.cpp b/src/tools/crapnet.cpp -index 95a4d15..9979d00 100644 ---- a/src/tools/crapnet.cpp -+++ b/src/tools/crapnet.cpp -@@ -42,7 +42,7 @@ static int m_ConfigInterval = 10; // seconds between different pingconfigs - static int m_ConfigLog = 0; - static int m_ConfigReorder = 0; - --void Run(int Port, NETADDR Dest) -+void Run(unsigned short Port, NETADDR Dest) - { - NETADDR Src = {NETTYPE_IPV4, {0,0,0,0}, Port}; - NETSOCKET Socket = net_udp_create(Src); diff -Nru teeworlds-0.6.3+dfsg/debian/patches/new-wavpack.patch teeworlds-0.6.4+dfsg/debian/patches/new-wavpack.patch --- teeworlds-0.6.3+dfsg/debian/patches/new-wavpack.patch 2013-05-04 13:07:27.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/patches/new-wavpack.patch 2016-11-14 20:42:00.000000000 +0000 @@ -58,7 +58,7 @@ dbg_msg("sound/wv", "loaded %s", pFilename); @@ -527,7 +525,5 @@ void CSound::StopAll() - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); } -IOHANDLE CSound::ms_File = 0; diff -Nru teeworlds-0.6.3+dfsg/debian/patches/reset-nethash.patch teeworlds-0.6.4+dfsg/debian/patches/reset-nethash.patch --- teeworlds-0.6.3+dfsg/debian/patches/reset-nethash.patch 2016-08-14 08:29:03.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/patches/reset-nethash.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -Description: Reset nethash to the one of pristine 0.6.3. - We haven't done any functional changes. -Author: Felix Geyer -Bug-Debian: https://bugs.debian.org/834285 - -diff --git a/scripts/cmd5.py b/scripts/cmd5.py ---- a/scripts/cmd5.py -+++ b/scripts/cmd5.py -@@ -30,6 +30,6 @@ for filename in sys.argv[1:]: - - hash = hashlib.md5(f).hexdigest().lower()[16:] - #TODO 0.7: improve nethash creation --if hash == "3dc531e4296de555": -+if hash == "3dc531e4296de555" or hash == "e42d81cd67b8c7bc": - hash = "626fce9a778df4d4" - print('#define GAME_NETVERSION_HASH "%s"' % hash) diff -Nru teeworlds-0.6.3+dfsg/debian/patches/series teeworlds-0.6.4+dfsg/debian/patches/series --- teeworlds-0.6.3+dfsg/debian/patches/series 2016-08-14 08:27:55.000000000 +0000 +++ teeworlds-0.6.4+dfsg/debian/patches/series 2016-11-17 19:39:19.000000000 +0000 @@ -2,6 +2,3 @@ new-wavpack.patch set-data-dir.patch pass-build-flags.patch -fix-gcc6-rename-round.patch -fix-gcc6-var-types.patch -reset-nethash.patch diff -Nru teeworlds-0.6.3+dfsg/license.txt teeworlds-0.6.4+dfsg/license.txt --- teeworlds-0.6.3+dfsg/license.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/license.txt 2016-11-13 15:41:35.000000000 +0000 @@ -1,4 +1,4 @@ -Copyright (C) 2007-2012 Magnus Auvinen +Copyright (C) 2007-2016 Magnus Auvinen This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff -Nru teeworlds-0.6.3+dfsg/other/freetype/VERSION teeworlds-0.6.4+dfsg/other/freetype/VERSION --- teeworlds-0.6.3+dfsg/other/freetype/VERSION 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/other/freetype/VERSION 2016-11-13 15:41:35.000000000 +0000 @@ -1 +1 @@ -2.4.8 +2.6 diff -Nru teeworlds-0.6.3+dfsg/other/sdl/README-SDL.txt teeworlds-0.6.4+dfsg/other/sdl/README-SDL.txt --- teeworlds-0.6.3+dfsg/other/sdl/README-SDL.txt 1970-01-01 00:00:00.000000000 +0000 +++ teeworlds-0.6.4+dfsg/other/sdl/README-SDL.txt 2016-11-13 15:41:35.000000000 +0000 @@ -0,0 +1,13 @@ + +Please distribute this file with the SDL runtime environment: + +The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library +designed to make it easy to write multi-media software, such as games and +emulators. + +The Simple DirectMedia Layer library source code is available from: +http://www.libsdl.org/ + +This library is distributed under the terms of the GNU LGPL license: +http://www.gnu.org/copyleft/lesser.html + diff -Nru teeworlds-0.6.3+dfsg/other/sdl/VERSION teeworlds-0.6.4+dfsg/other/sdl/VERSION --- teeworlds-0.6.3+dfsg/other/sdl/VERSION 1970-01-01 00:00:00.000000000 +0000 +++ teeworlds-0.6.4+dfsg/other/sdl/VERSION 2016-11-13 15:41:35.000000000 +0000 @@ -0,0 +1 @@ +1.2.15 diff -Nru teeworlds-0.6.3+dfsg/readme.txt teeworlds-0.6.4+dfsg/readme.txt --- teeworlds-0.6.3+dfsg/readme.txt 2014-11-19 22:08:21.000000000 +0000 +++ teeworlds-0.6.4+dfsg/readme.txt 2016-11-13 15:41:35.000000000 +0000 @@ -1,4 +1,4 @@ -Copyright (c) 2012 Magnus Auvinen +Copyright (c) 2016 Magnus Auvinen This software is provided 'as-is', without any express or implied diff -Nru teeworlds-0.6.3+dfsg/scripts/cmd5.py teeworlds-0.6.4+dfsg/scripts/cmd5.py --- teeworlds-0.6.3+dfsg/scripts/cmd5.py 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/scripts/cmd5.py 2016-11-13 15:41:35.000000000 +0000 @@ -30,6 +30,6 @@ hash = hashlib.md5(f).hexdigest().lower()[16:] #TODO 0.7: improve nethash creation -if hash == "3dc531e4296de555": +if hash == "e42d81cd67b8c7bc": hash = "626fce9a778df4d4" print('#define GAME_NETVERSION_HASH "%s"' % hash) diff -Nru teeworlds-0.6.3+dfsg/scripts/refactor_count.py teeworlds-0.6.4+dfsg/scripts/refactor_count.py --- teeworlds-0.6.3+dfsg/scripts/refactor_count.py 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/scripts/refactor_count.py 2016-11-13 15:41:35.000000000 +0000 @@ -25,7 +25,7 @@ "int64", "dbg_assert", "dbg_msg", "dbg_break", "dbg_logger_stdout", "dbg_logger_debugger", "dbg_logger_file", "mem_alloc", "mem_zero", "mem_free", "mem_copy", "mem_move", "mem_comp", "mem_stats", "total_allocations", "allocated", - "thread_create", "thread_sleep", "lock_wait", "lock_create", "lock_release", "lock_destroy", "swap_endian", + "thread_init", "thread_sleep", "lock_wait", "lock_create", "lock_unlock", "lock_destroy", "swap_endian", "io_open", "io_read", "io_read", "io_write", "io_flush", "io_close", "io_seek", "io_skip", "io_tell", "io_length", "str_comp", "str_length", "str_quickhash", "str_format", "str_copy", "str_comp_nocase", "str_sanitize", "str_append", "str_comp_num", "str_find_nocase", "str_sanitize_strong", "str_uppercase", "str_toint", "str_tofloat", diff -Nru teeworlds-0.6.3+dfsg/src/base/math.h teeworlds-0.6.4+dfsg/src/base/math.h --- teeworlds-0.6.3+dfsg/src/base/math.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/base/math.h 2016-11-13 15:41:35.000000000 +0000 @@ -20,7 +20,7 @@ return f<0.0f?-1.0f:1.0f; } -inline int round(float f) +inline int round_to_int(float f) { if(f > 0) return (int)(f+0.5f); diff -Nru teeworlds-0.6.3+dfsg/src/base/system.c teeworlds-0.6.4+dfsg/src/base/system.c --- teeworlds-0.6.3+dfsg/src/base/system.c 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/base/system.c 2016-11-13 15:41:35.000000000 +0000 @@ -370,7 +370,7 @@ return 0; } -void *thread_create(void (*threadfunc)(void *), void *u) +void *thread_init(void (*threadfunc)(void *), void *u) { #if defined(CONF_FAMILY_UNIX) pthread_t id; @@ -474,7 +474,7 @@ mem_free(lock); } -int lock_try(LOCK lock) +int lock_trylock(LOCK lock) { #if defined(CONF_FAMILY_UNIX) return pthread_mutex_trylock((LOCKINTERNAL *)lock); @@ -496,7 +496,7 @@ #endif } -void lock_release(LOCK lock) +void lock_unlock(LOCK lock) { #if defined(CONF_FAMILY_UNIX) pthread_mutex_unlock((LOCKINTERNAL *)lock); @@ -852,7 +852,7 @@ return 0; } -static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen) +static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen, int use_random_port) { int sock, e; @@ -882,27 +882,46 @@ #endif /* bind the socket */ - e = bind(sock, addr, sockaddrlen); - if(e != 0) + while(1) { + /* pick random port */ + if(use_random_port) + { + int port = htons(rand()%16384+49152); /* 49152 to 65535 */ + if(domain == AF_INET) + ((struct sockaddr_in *)(addr))->sin_port = port; + else + ((struct sockaddr_in6 *)(addr))->sin6_port = port; + } + + e = bind(sock, addr, sockaddrlen); + if(e == 0) + break; + else + { #if defined(CONF_FAMILY_WINDOWS) - char buf[128]; - int error = WSAGetLastError(); - if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0) - buf[0] = 0; - dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf); -#else - dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno)); + char buf[128]; + int error = WSAGetLastError(); + if(error == WSAEADDRINUSE && use_random_port) + continue; + if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0) + buf[0] = 0; + dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf); +#else + if(errno == EADDRINUSE && use_random_port) + continue; + dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno)); #endif - priv_net_close_socket(sock); - return -1; + priv_net_close_socket(sock); + return -1; + } } /* return the newly created socket */ return sock; } -NETSOCKET net_udp_create(NETADDR bindaddr) +NETSOCKET net_udp_create(NETADDR bindaddr, int use_random_port) { NETSOCKET sock = invalid_socket; NETADDR tmpbindaddr = bindaddr; @@ -917,7 +936,7 @@ /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV4; netaddr_to_sockaddr_in(&tmpbindaddr, &addr); - socket = priv_net_create_socket(AF_INET, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr)); + socket = priv_net_create_socket(AF_INET, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr), use_random_port); if(socket >= 0) { sock.type |= NETTYPE_IPV4; @@ -939,7 +958,7 @@ /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV6; netaddr_to_sockaddr_in6(&tmpbindaddr, &addr); - socket = priv_net_create_socket(AF_INET6, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr)); + socket = priv_net_create_socket(AF_INET6, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr), use_random_port); if(socket >= 0) { sock.type |= NETTYPE_IPV6; @@ -1076,7 +1095,7 @@ /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV4; netaddr_to_sockaddr_in(&tmpbindaddr, &addr); - socket = priv_net_create_socket(AF_INET, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr)); + socket = priv_net_create_socket(AF_INET, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), 0); if(socket >= 0) { sock.type |= NETTYPE_IPV4; @@ -1092,7 +1111,7 @@ /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV6; netaddr_to_sockaddr_in6(&tmpbindaddr, &addr); - socket = priv_net_create_socket(AF_INET6, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr)); + socket = priv_net_create_socket(AF_INET6, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), 0); if(socket >= 0) { sock.type |= NETTYPE_IPV6; @@ -1947,24 +1966,24 @@ } else if((*buf&0xE0) == 0xC0) /* 110xxxxx */ { - ch = (*buf++ & 0x3F) << 6; if(!(*buf)) break; + ch = (*buf++ & 0x3F) << 6; if(!(*buf) || (*buf&0xC0) != 0x80) break; ch += (*buf++ & 0x3F); - if(ch == 0) ch = -1; + if(ch < 0x80 || ch > 0x7FF) ch = -1; } else if((*buf & 0xF0) == 0xE0) /* 1110xxxx */ { - ch = (*buf++ & 0x1F) << 12; if(!(*buf)) break; - ch += (*buf++ & 0x3F) << 6; if(!(*buf)) break; + ch = (*buf++ & 0x1F) << 12; if(!(*buf) || (*buf&0xC0) != 0x80) break; + ch += (*buf++ & 0x3F) << 6; if(!(*buf) || (*buf&0xC0) != 0x80) break; ch += (*buf++ & 0x3F); - if(ch == 0) ch = -1; + if(ch < 0x800 || ch > 0xFFFF) ch = -1; } else if((*buf & 0xF8) == 0xF0) /* 11110xxx */ { - ch = (*buf++ & 0x0F) << 18; if(!(*buf)) break; - ch += (*buf++ & 0x3F) << 12; if(!(*buf)) break; - ch += (*buf++ & 0x3F) << 6; if(!(*buf)) break; + ch = (*buf++ & 0x0F) << 18; if(!(*buf) || (*buf&0xC0) != 0x80) break; + ch += (*buf++ & 0x3F) << 12; if(!(*buf) || (*buf&0xC0) != 0x80) break; + ch += (*buf++ & 0x3F) << 6; if(!(*buf) || (*buf&0xC0) != 0x80) break; ch += (*buf++ & 0x3F); - if(ch == 0) ch = -1; + if(ch < 0x10000 || ch > 0x10FFFF) ch = -1; } else { diff -Nru teeworlds-0.6.3+dfsg/src/base/system.h teeworlds-0.6.4+dfsg/src/base/system.h --- teeworlds-0.6.3+dfsg/src/base/system.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/base/system.h 2016-11-13 15:41:35.000000000 +0000 @@ -352,7 +352,7 @@ void thread_sleep(int milliseconds); /* - Function: thread_create + Function: thread_init Creates a new thread. Parameters: @@ -360,7 +360,7 @@ user - Pointer to pass to the thread. */ -void *thread_create(void (*threadfunc)(void *), void *user); +void *thread_init(void (*threadfunc)(void *), void *user); /* Function: thread_wait @@ -403,9 +403,9 @@ LOCK lock_create(); void lock_destroy(LOCK lock); -int lock_try(LOCK lock); +int lock_trylock(LOCK lock); void lock_wait(LOCK lock); -void lock_release(LOCK lock); +void lock_unlock(LOCK lock); /* Group: Semaphores */ @@ -566,12 +566,13 @@ Parameters: bindaddr - Address to bind the socket to. + use_random_port - use a random port Returns: On success it returns an handle to the socket. On failure it returns NETSOCKET_INVALID. */ -NETSOCKET net_udp_create(NETADDR bindaddr); +NETSOCKET net_udp_create(NETADDR bindaddr, int use_random_port); /* Function: net_udp_send diff -Nru teeworlds-0.6.3+dfsg/src/base/tl/threading.h teeworlds-0.6.4+dfsg/src/base/tl/threading.h --- teeworlds-0.6.3+dfsg/src/base/tl/threading.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/base/tl/threading.h 2016-11-13 15:41:35.000000000 +0000 @@ -84,7 +84,7 @@ LOCK var; void take() { lock_wait(var); } - void release() { lock_release(var); } + void release() { lock_unlock(var); } public: lock() diff -Nru teeworlds-0.6.3+dfsg/src/base/vmath.h teeworlds-0.6.4+dfsg/src/base/vmath.h --- teeworlds-0.6.3+dfsg/src/base/vmath.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/base/vmath.h 2016-11-13 15:41:35.000000000 +0000 @@ -15,7 +15,7 @@ union { T y,v; }; vector2_base() {} - vector2_base(float nx, float ny) + vector2_base(T nx, T ny) { x = nx; y = ny; @@ -26,7 +26,7 @@ vector2_base operator +(const vector2_base &v) const { return vector2_base(x+v.x, y+v.y); } vector2_base operator *(const T v) const { return vector2_base(x*v, y*v); } vector2_base operator *(const vector2_base &v) const { return vector2_base(x*v.x, y*v.y); } - vector2_base operator /(const T v) const { return vector3_base(x/v, y/v); } + vector2_base operator /(const T v) const { return vector2_base(x/v, y/v); } vector2_base operator /(const vector2_base &v) const { return vector2_base(x/v.x, y/v.y); } const vector2_base &operator =(const vector2_base &v) { x = v.x; y = v.y; return *this; } @@ -98,7 +98,7 @@ union { T z,b,v,l; }; vector3_base() {} - vector3_base(float nx, float ny, float nz) + vector3_base(T nx, T ny, T nz) { x = nx; y = ny; @@ -177,7 +177,7 @@ union { T w,a; }; vector4_base() {} - vector4_base(float nx, float ny, float nz, float nw) + vector4_base(T nx, T ny, T nz, T nw) { x = nx; y = ny; diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/backend_sdl.cpp teeworlds-0.6.4+dfsg/src/engine/client/backend_sdl.cpp --- teeworlds-0.6.3+dfsg/src/engine/client/backend_sdl.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/backend_sdl.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -40,7 +40,7 @@ { m_Shutdown = false; m_pProcessor = pProcessor; - m_pThread = thread_create(ThreadFunc, this); + m_pThread = thread_init(ThreadFunc, this); m_BufferDone.signal(); } @@ -221,7 +221,7 @@ // resample if needed if(pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGBA || pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGB) { - int MaxTexSize; + int MaxTexSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxTexSize); if(Width > MaxTexSize || Height > MaxTexSize) { diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/client.cpp teeworlds-0.6.4+dfsg/src/engine/client/client.cpp --- teeworlds-0.6.3+dfsg/src/engine/client/client.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/client.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -894,7 +894,7 @@ Packet.m_pData = VERSIONSRV_GETMAPLIST; Packet.m_DataSize = sizeof(VERSIONSRV_GETMAPLIST); Packet.m_Flags = NETSENDFLAG_CONNLESS; - m_NetClient.Send(&Packet); + m_ContactClient.Send(&Packet); } // map version list @@ -935,7 +935,7 @@ { NETADDR Addr; - static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; + static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; // copy address if(!mem_comp(IPV4Mapping, pAddrs[i].m_aIp, sizeof(IPV4Mapping))) @@ -1026,7 +1026,7 @@ if(Sys) { // system message - if(Msg == NETMSG_MAP_CHANGE) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_CHANGE) { const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES); int MapCrc = Unpacker.GetInt(); @@ -1089,7 +1089,7 @@ } } } - else if(Msg == NETMSG_MAP_DATA) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_DATA) { int Last = Unpacker.GetInt(); int MapCRC = Unpacker.GetInt(); @@ -1143,7 +1143,7 @@ } } } - else if(Msg == NETMSG_CON_READY) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_CON_READY) { GameClient()->OnConnected(); } @@ -1152,7 +1152,7 @@ CMsgPacker Msg(NETMSG_PING_REPLY); SendMsgEx(&Msg, 0); } - else if(Msg == NETMSG_RCON_CMD_ADD) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_ADD) { const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC); @@ -1160,13 +1160,13 @@ if(Unpacker.Error() == 0) m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp); } - else if(Msg == NETMSG_RCON_CMD_REM) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_REM) { const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(Unpacker.Error() == 0) m_pConsole->DeregisterTemp(pName); } - else if(Msg == NETMSG_RCON_AUTH_STATUS) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_AUTH_STATUS) { int Result = Unpacker.GetInt(); if(Unpacker.Error() == 0) @@ -1178,7 +1178,7 @@ if(Old != 0 && m_UseTempRconCommands == 0) m_pConsole->DeregisterTempAll(); } - else if(Msg == NETMSG_RCON_LINE) + else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_LINE) { const char *pLine = Unpacker.GetString(); if(Unpacker.Error() == 0) @@ -1239,7 +1239,7 @@ pData = (const char *)Unpacker.GetRaw(PartSize); - if(Unpacker.Error()) + if(Unpacker.Error() || NumParts < 1 || NumParts > CSnapshot::MAX_PARTS || Part < 0 | Part >= NumParts || PartSize < 0 || PartSize > MAX_SNAPSHOT_PACKSIZE) return; if(GameTick >= m_CurrentRecvTick) @@ -1400,11 +1400,14 @@ } else { - // game message - if(m_DemoRecorder.IsRecording()) - m_DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0) + { + // game message + if(m_DemoRecorder.IsRecording()) + m_DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); - GameClient()->OnMessage(Msg, &Unpacker); + GameClient()->OnMessage(Msg, &Unpacker); + } } } @@ -1434,14 +1437,20 @@ } } - // process packets + // process non-connless packets CNetChunk Packet; while(m_NetClient.Recv(&Packet)) { + if(Packet.m_ClientID != -1) + ProcessServerPacket(&Packet); + } + + // process connless packets data + m_ContactClient.Update(); + while(m_ContactClient.Recv(&Packet)) + { if(Packet.m_ClientID == -1) ProcessConnlessPacket(&Packet); - else - ProcessServerPacket(&Packet); } } @@ -1657,7 +1666,7 @@ { if(m_VersionInfo.m_State == CVersionInfo::STATE_INIT) { - Engine()->HostLookup(&m_VersionInfo.m_VersionServeraddr, g_Config.m_ClVersionServer, m_NetClient.NetType()); + Engine()->HostLookup(&m_VersionInfo.m_VersionServeraddr, g_Config.m_ClVersionServer, m_ContactClient.NetType()); m_VersionInfo.m_State = CVersionInfo::STATE_START; } else if(m_VersionInfo.m_State == CVersionInfo::STATE_START) @@ -1676,7 +1685,7 @@ Packet.m_DataSize = sizeof(VERSIONSRV_GETVERSION); Packet.m_Flags = NETSENDFLAG_CONNLESS; - m_NetClient.Send(&Packet); + m_ContactClient.Send(&Packet); m_VersionInfo.m_State = CVersionInfo::STATE_READY; } } @@ -1704,7 +1713,7 @@ m_pStorage = Kernel()->RequestInterface(); // - m_ServerBrowser.SetBaseInfo(&m_NetClient, m_pGameClient->NetVersion()); + m_ServerBrowser.SetBaseInfo(&m_ContactClient, m_pGameClient->NetVersion()); m_Friends.Init(); } @@ -1758,9 +1767,15 @@ mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; } - if(!m_NetClient.Open(BindAddr, 0)) + if(!m_NetClient.Open(BindAddr, BindAddr.port ? 0 : NETCREATE_FLAG_RANDOMPORT)) { - dbg_msg("client", "couldn't open socket"); + dbg_msg("client", "couldn't open socket(net)"); + return; + } + BindAddr.port = 0; + if(!m_ContactClient.Open(BindAddr, 0)) + { + dbg_msg("client", "couldn't open socket(contact)"); return; } } @@ -1772,7 +1787,7 @@ Input()->Init(); // start refreshing addresses while we load - MasterServer()->RefreshAddresses(m_NetClient.NetType()); + MasterServer()->RefreshAddresses(m_ContactClient.NetType()); // init the editor m_pEditor->Init(); @@ -1893,7 +1908,7 @@ m_EditorActive = false; Update(); - + if(!g_Config.m_GfxAsyncRender || m_pGraphics->IsIdle()) { m_RenderFrames++; diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/client.h teeworlds-0.6.4+dfsg/src/engine/client/client.h --- teeworlds-0.6.3+dfsg/src/engine/client/client.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/client.h 2016-11-13 15:41:35.000000000 +0000 @@ -72,6 +72,7 @@ }; class CNetClient m_NetClient; + class CNetClient m_ContactClient; class CDemoPlayer m_DemoPlayer; class CDemoRecorder m_DemoRecorder; class CServerBrowser m_ServerBrowser; diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/serverbrowser.cpp teeworlds-0.6.4+dfsg/src/engine/client/serverbrowser.cpp --- teeworlds-0.6.3+dfsg/src/engine/client/serverbrowser.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/serverbrowser.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -55,7 +55,7 @@ m_aFilterGametypeString[0] = 0; // the token is to keep server refresh separated from each other - m_CurrentToken = 1; + m_CurrentLanToken = 1; m_ServerlistType = 0; m_BroadcastTime = 0; @@ -86,8 +86,8 @@ CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; // make sure empty entries are listed last - return (a->m_GotInfo && b->m_GotInfo) || (!a->m_GotInfo && !b->m_GotInfo) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 : - a->m_GotInfo ? true : false; + return (a->m_InfoState == CServerEntry::STATE_READY && b->m_InfoState == CServerEntry::STATE_READY) || (a->m_InfoState != CServerEntry::STATE_READY && b->m_InfoState != CServerEntry::STATE_READY) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 : + a->m_InfoState == CServerEntry::STATE_READY; } bool CServerBrowser::SortCompareMap(int Index1, int Index2) const @@ -369,21 +369,21 @@ RemoveRequest(pEntry); }*/ - pEntry->m_GotInfo = 1; + pEntry->m_InfoState = CServerEntry::STATE_READY; } CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr) { int Hash = Addr.ip[0]; - CServerEntry *pEntry = 0; - int i; // create new pEntry - pEntry = (CServerEntry *)m_ServerlistHeap.Allocate(sizeof(CServerEntry)); + CServerEntry *pEntry = (CServerEntry *)m_ServerlistHeap.Allocate(sizeof(CServerEntry)); mem_zero(pEntry, sizeof(CServerEntry)); // set the info pEntry->m_Addr = Addr; + pEntry->m_InfoState = CServerEntry::STATE_INVALID; + pEntry->m_CurrentToken = rand()%CServerEntry::MAX_TOKEN; pEntry->m_Info.m_NetAddr = Addr; pEntry->m_Info.m_Latency = 999; @@ -391,7 +391,7 @@ str_copy(pEntry->m_Info.m_aName, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aName)); // check if it's a favorite - for(i = 0; i < m_NumFavoriteServers; i++) + for(int i = 0; i < m_NumFavoriteServers; i++) { if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0) pEntry->m_Info.m_Favorite = 1; @@ -446,13 +446,13 @@ } else if(Type == IServerBrowser::SET_TOKEN) { - if(Token != m_CurrentToken) + if(m_ServerlistType == IServerBrowser::TYPE_LAN && Token != m_CurrentLanToken) return; pEntry = Find(Addr); - if(!pEntry) + if(!pEntry && m_ServerlistType == IServerBrowser::TYPE_LAN) pEntry = Add(Addr); - if(pEntry) + if(pEntry && ((pEntry->m_InfoState == CServerEntry::STATE_PENDING && Token == pEntry->m_CurrentToken) || m_ServerlistType == IServerBrowser::TYPE_LAN)) { SetInfo(pEntry, *pInfo); if(m_ServerlistType == IServerBrowser::TYPE_LAN) @@ -478,7 +478,7 @@ m_NumRequests = 0; // next token - m_CurrentToken = (m_CurrentToken+1)&0xff; + m_CurrentLanToken = (m_CurrentLanToken+1)&0xff; // m_ServerlistType = Type; @@ -490,7 +490,7 @@ int i; mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); - Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken; + Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentLanToken; /* do the broadcast version */ Packet.m_ClientID = -1; @@ -534,7 +534,7 @@ } mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); - Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken; + Buffer[sizeof(SERVERBROWSE_GETINFO)] = pEntry ? pEntry->m_CurrentToken : m_CurrentLanToken; Packet.m_ClientID = -1; Packet.m_Address = Addr; @@ -545,7 +545,10 @@ m_pNetClient->Send(&Packet); if(pEntry) + { pEntry->m_RequestTime = time_get(); + pEntry->m_InfoState = CServerEntry::STATE_PENDING; + } } void CServerBrowser::Request(const NETADDR &Addr) const diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/serverbrowser.h teeworlds-0.6.4+dfsg/src/engine/client/serverbrowser.h --- teeworlds-0.6.3+dfsg/src/engine/client/serverbrowser.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/serverbrowser.h 2016-11-13 15:41:35.000000000 +0000 @@ -11,9 +11,18 @@ class CServerEntry { public: + enum + { + STATE_INVALID=0, + STATE_PENDING, + STATE_READY, + MAX_TOKEN=0xFF + }; + NETADDR m_Addr; int64 m_RequestTime; - int m_GotInfo; + int m_InfoState; + int m_CurrentToken; // the token is to keep server refresh separated from each other CServerInfo m_Info; CServerEntry *m_pNextIp; // ip hashed list @@ -83,7 +92,7 @@ char m_aFilterGametypeString[128]; // the token is to keep server refresh separated from each other - int m_CurrentToken; + int m_CurrentLanToken; int m_ServerlistType; int64 m_BroadcastTime; diff -Nru teeworlds-0.6.3+dfsg/src/engine/client/sound.cpp teeworlds-0.6.4+dfsg/src/engine/client/sound.cpp --- teeworlds-0.6.3+dfsg/src/engine/client/sound.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/client/sound.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -171,7 +171,7 @@ // release the lock - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); { // clamp accumulated values @@ -259,7 +259,7 @@ { lock_wait(m_SoundLock); m_SoundVolume = WantedVolume; - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); } return 0; @@ -476,7 +476,7 @@ m_aVoices[VoiceID].m_Y = (int)y; } - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); return VoiceID; } @@ -506,7 +506,7 @@ m_aVoices[i].m_pSample = 0; } } - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); } void CSound::StopAll() @@ -524,7 +524,7 @@ } m_aVoices[i].m_pSample = 0; } - lock_release(m_SoundLock); + lock_unlock(m_SoundLock); } IOHANDLE CSound::ms_File = 0; diff -Nru teeworlds-0.6.3+dfsg/src/engine/server/server.cpp teeworlds-0.6.4+dfsg/src/engine/server/server.cpp --- teeworlds-0.6.3+dfsg/src/engine/server/server.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/server/server.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -815,7 +815,7 @@ // system message if(Msg == NETMSG_INFO) { - if(m_aClients[ClientID].m_State == CClient::STATE_AUTH) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_AUTH) { const char *pVersion = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(str_comp(pVersion, GameServer()->NetVersion()) != 0) @@ -841,7 +841,7 @@ } else if(Msg == NETMSG_REQUEST_MAP_DATA) { - if(m_aClients[ClientID].m_State < CClient::STATE_CONNECTING) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) == 0 || m_aClients[ClientID].m_State < CClient::STATE_CONNECTING) return; int Chunk = Unpacker.GetInt(); @@ -878,7 +878,7 @@ } else if(Msg == NETMSG_READY) { - if(m_aClients[ClientID].m_State == CClient::STATE_CONNECTING) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_CONNECTING) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); @@ -893,7 +893,7 @@ } else if(Msg == NETMSG_ENTERGAME) { - if(m_aClients[ClientID].m_State == CClient::STATE_READY && GameServer()->IsClientReady(ClientID)) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_READY && GameServer()->IsClientReady(ClientID)) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); @@ -961,7 +961,7 @@ { const char *pCmd = Unpacker.GetString(); - if(Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "ClientID=%d rcon='%s'", ClientID, pCmd); @@ -981,7 +981,7 @@ Unpacker.GetString(); // login name, not used pPw = Unpacker.GetString(CUnpacker::SANITIZE_CC); - if(Unpacker.Error() == 0) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Unpacker.Error() == 0) { if(g_Config.m_SvRconPassword[0] == 0 && g_Config.m_SvRconModPassword[0] == 0) { @@ -1069,7 +1069,7 @@ else { // game message - if(m_aClients[ClientID].m_State >= CClient::STATE_READY) + if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State >= CClient::STATE_READY) GameServer()->OnMessage(Msg, &Unpacker, ClientID); } } diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/config_variables.h teeworlds-0.6.4+dfsg/src/engine/shared/config_variables.h --- teeworlds-0.6.3+dfsg/src/engine/shared/config_variables.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/config_variables.h 2016-11-13 15:41:35.000000000 +0000 @@ -44,8 +44,8 @@ MACRO_CONFIG_INT(BrFilterPureMap, br_filter_pure_map, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard maps in browser") MACRO_CONFIG_INT(BrFilterCompatversion, br_filter_compatversion, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-compatible servers in browser") -MACRO_CONFIG_INT(BrSort, br_sort, 0, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") -MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") +MACRO_CONFIG_INT(BrSort, br_sort, 4, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") +MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(BrMaxRequests, br_max_requests, 25, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Number of requests to use when refreshing server browser") MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size") diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/econ.cpp teeworlds-0.6.4+dfsg/src/engine/shared/econ.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/econ.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/econ.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -135,10 +135,9 @@ m_NetConsole.Send(ClientID, aMsg); if(m_aClients[ClientID].m_AuthTries >= MAX_AUTH_TRIES) { - if(!g_Config.m_EcBantime) - m_NetConsole.Drop(ClientID, "Too many authentication tries"); - else + if(g_Config.m_EcBantime) m_NetConsole.NetBan()->BanAddr(m_NetConsole.ClientAddr(ClientID), g_Config.m_EcBantime*60, "Too many authentication tries"); + m_NetConsole.Drop(ClientID, "Too many authentication tries"); } } } diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/engine.cpp teeworlds-0.6.4+dfsg/src/engine/shared/engine.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/engine.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/engine.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -1,5 +1,6 @@ /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ +#include // srand #include @@ -57,6 +58,7 @@ CEngine(const char *pAppname) { + srand(time_get()); dbg_logger_stdout(); dbg_logger_debugger(); diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/jobs.cpp teeworlds-0.6.4+dfsg/src/engine/shared/jobs.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/jobs.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/jobs.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -30,7 +30,7 @@ else pPool->m_pLastJob = 0; } - lock_release(pPool->m_Lock); + lock_unlock(pPool->m_Lock); // do the job if we have one if(pJob) @@ -49,7 +49,7 @@ { // start threads for(int i = 0; i < NumThreads; i++) - thread_create(WorkerThread, this); + thread_init(WorkerThread, this); return 0; } @@ -69,7 +69,7 @@ if(!m_pFirstJob) m_pFirstJob = pJob; - lock_release(m_Lock); + lock_unlock(m_Lock); return 0; } diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/network_client.cpp teeworlds-0.6.4+dfsg/src/engine/shared/network_client.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/network_client.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/network_client.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -7,7 +7,7 @@ { // open socket NETSOCKET Socket; - Socket = net_udp_create(BindAddr); + Socket = net_udp_create(BindAddr, (Flags&NETCREATE_FLAG_RANDOMPORT) ? 1 : 0); if(!Socket.type) return false; @@ -83,7 +83,8 @@ } else { - if(m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr)) + if(m_Connection.State() != NET_CONNSTATE_OFFLINE && m_Connection.State() != NET_CONNSTATE_ERROR && net_addr_comp(m_Connection.PeerAddress(), &Addr) == 0 + && m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr)) m_RecvUnpacker.Start(&Addr, &m_Connection, 0); } } diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/network_conn.cpp teeworlds-0.6.4+dfsg/src/engine/shared/network_conn.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/network_conn.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/network_conn.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -13,6 +13,7 @@ { m_Sequence = 0; m_Ack = 0; + m_PeerAck = 0; m_RemoteClosed = 0; m_State = NET_CONNSTATE_OFFLINE; @@ -186,9 +187,13 @@ else SendControl(NET_CTRLMSG_CLOSE, 0, 0); - m_ErrorString[0] = 0; - if(pReason) - str_copy(m_ErrorString, pReason, sizeof(m_ErrorString)); + if(pReason != m_ErrorString) + { + if(pReason) + str_copy(m_ErrorString, pReason, sizeof(m_ErrorString)); + else + m_ErrorString[0] = 0; + } } Reset(); @@ -196,6 +201,19 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr) { + // check if actual ack value is valid(own sequence..latest peer ack) + if(m_Sequence >= m_PeerAck) + { + if(pPacket->m_Ack < m_PeerAck || pPacket->m_Ack > m_Sequence) + return 0; + } + else + { + if(pPacket->m_Ack < m_PeerAck && pPacket->m_Ack > m_Sequence) + return 0; + } + m_PeerAck = pPacket->m_Ack; + int64 Now = time_get(); // check if resend is requested diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/network.cpp teeworlds-0.6.4+dfsg/src/engine/shared/network.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/network.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/network.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -80,7 +80,7 @@ // fill in the info pChunk->m_ClientID = m_ClientID; pChunk->m_Address = m_Addr; - pChunk->m_Flags = 0; + pChunk->m_Flags = Header.m_Flags; pChunk->m_DataSize = Header.m_Size; pChunk->m_pData = pData; return 1; diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/network.h teeworlds-0.6.4+dfsg/src/engine/shared/network.h --- teeworlds-0.6.3+dfsg/src/engine/shared/network.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/network.h 2016-11-13 15:41:35.000000000 +0000 @@ -36,7 +36,9 @@ NETSTATE_ONLINE, NETBANTYPE_SOFT=1, - NETBANTYPE_DROP=2 + NETBANTYPE_DROP=2, + + NETCREATE_FLAG_RANDOMPORT=1 }; @@ -136,6 +138,7 @@ private: unsigned short m_Sequence; unsigned short m_Ack; + unsigned short m_PeerAck; unsigned m_State; int m_Token; diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/network_server.cpp teeworlds-0.6.4+dfsg/src/engine/shared/network_server.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/network_server.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/network_server.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -14,7 +14,7 @@ mem_zero(this, sizeof(*this)); // open socket - m_Socket = net_udp_create(BindAddr); + m_Socket = net_udp_create(BindAddr, 0); if(!m_Socket.type) return false; @@ -76,7 +76,10 @@ if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ERROR) { if(Now - m_aSlots[i].m_Connection.ConnectTime() < time_freq() && NetBan()) - NetBan()->BanAddr(ClientAddr(i), 60, "Stressing network"); + { + if(NetBan()->BanAddr(ClientAddr(i), 60, "Stressing network") == -1) + Drop(i, m_aSlots[i].m_Connection.ErrorString()); + } else Drop(i, m_aSlots[i].m_Connection.ErrorString()); } @@ -163,7 +166,7 @@ { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Only %d players with the same IP are allowed", m_MaxClientsPerIP); - CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, sizeof(aBuf)); + CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, str_length(aBuf) + 1); return 0; } } diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/snapshot.cpp teeworlds-0.6.4+dfsg/src/engine/shared/snapshot.cpp --- teeworlds-0.6.3+dfsg/src/engine/shared/snapshot.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/snapshot.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -330,6 +330,8 @@ return -1; Type = *pData++; + if(Type < 0) + return -1; ID = *pData++; if(m_aItemSizes[Type]) ItemSize = m_aItemSizes[Type]; @@ -355,7 +357,7 @@ FromIndex = pFrom->GetItemIndex(Key); if(FromIndex != -1) { - // we got an update so we need pTo apply the diff + // we got an update so we need to apply the diff UndiffItem((int *)pFrom->GetItem(FromIndex)->Data(), pData, pNewData, ItemSize/4); m_aSnapshotDataUpdates[m_SnapshotCurrent]++; } @@ -509,10 +511,10 @@ return 0; } -int CSnapshotBuilder::Finish(void *SpnapData) +int CSnapshotBuilder::Finish(void *pSpnapData) { // flattern and make the snapshot - CSnapshot *pSnap = (CSnapshot *)SpnapData; + CSnapshot *pSnap = (CSnapshot *)pSpnapData; int OffsetSize = sizeof(int)*m_NumItems; pSnap->m_DataSize = m_DataSize; pSnap->m_NumItems = m_NumItems; diff -Nru teeworlds-0.6.3+dfsg/src/engine/shared/snapshot.h teeworlds-0.6.4+dfsg/src/engine/shared/snapshot.h --- teeworlds-0.6.3+dfsg/src/engine/shared/snapshot.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/engine/shared/snapshot.h 2016-11-13 15:41:35.000000000 +0000 @@ -31,7 +31,8 @@ public: enum { - MAX_SIZE=64*1024 + MAX_PARTS = 64, + MAX_SIZE = MAX_PARTS*1024 }; void Clear() { m_DataSize = 0; m_NumItems = 0; } @@ -107,7 +108,7 @@ void PurgeAll(); void PurgeUntil(int Tick); void Add(int Tick, int64 Tagtime, int DataSize, void *pData, int CreateAlt); - int Get(int Tick, int64 *Tagtime, CSnapshot **pData, CSnapshot **ppAltData); + int Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapshot **ppAltData); }; class CSnapshotBuilder @@ -131,7 +132,7 @@ CSnapshotItem *GetItem(int Index); int *GetItemData(int Key); - int Finish(void *Snapdata); + int Finish(void *pSnapdata); }; diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/chat.cpp teeworlds-0.6.4+dfsg/src/game/client/components/chat.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/chat.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/chat.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -33,6 +33,7 @@ m_aLines[i].m_aName[0] = 0; } + m_Mode = MODE_NONE; m_Show = false; m_InputUpdate = false; m_ChatStringOffset = 0; diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/hud.cpp teeworlds-0.6.4+dfsg/src/game/client/components/hud.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/hud.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/hud.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -68,6 +68,18 @@ float FontSize = 20.0f; float w = TextRender()->TextWidth(0, FontSize,pText, -1); TextRender()->Text(0, 150.0f*Graphics()->ScreenAspect()+-w/2.0f, 50.0f, FontSize, pText, -1); + + if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) + { + char Buf[256]; + int Seconds = m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer/SERVER_TICK_SPEED; + if(Seconds < 5) + str_format(Buf, sizeof(Buf), "%d.%d", Seconds, (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer*10/SERVER_TICK_SPEED)%10); + else + str_format(Buf, sizeof(Buf), "%d", Seconds); + w = TextRender()->TextWidth(0, FontSize, Buf, -1); + TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 75, FontSize, Buf, -1); + } } } @@ -240,7 +252,7 @@ void CHud::RenderWarmupTimer() { // render warmup timer - if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) + if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) && m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) { char Buf[256]; float FontSize = 20.0f; diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/items.cpp teeworlds-0.6.4+dfsg/src/game/client/components/items.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/items.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/items.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -15,10 +15,6 @@ #include "items.h" -void CItems::OnReset() -{ - m_NumExtraProjectiles = 0; -} void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID) { @@ -306,25 +302,5 @@ } } } - - // render extra projectiles - for(int i = 0; i < m_NumExtraProjectiles; i++) - { - if(m_aExtraProjectiles[i].m_StartTick < Client()->GameTick()) - { - m_aExtraProjectiles[i] = m_aExtraProjectiles[m_NumExtraProjectiles-1]; - m_NumExtraProjectiles--; - } - else - RenderProjectile(&m_aExtraProjectiles[i], 0); - } } -void CItems::AddExtraProjectile(CNetObj_Projectile *pProj) -{ - if(m_NumExtraProjectiles != MAX_EXTRA_PROJECTILES) - { - m_aExtraProjectiles[m_NumExtraProjectiles] = *pProj; - m_NumExtraProjectiles++; - } -} diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/items.h teeworlds-0.6.4+dfsg/src/game/client/components/items.h --- teeworlds-0.6.3+dfsg/src/game/client/components/items.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/items.h 2016-11-13 15:41:35.000000000 +0000 @@ -6,24 +6,13 @@ class CItems : public CComponent { - enum - { - MAX_EXTRA_PROJECTILES=32, - }; - - CNetObj_Projectile m_aExtraProjectiles[MAX_EXTRA_PROJECTILES]; - int m_NumExtraProjectiles; - void RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID); void RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent); void RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData); void RenderLaser(const struct CNetObj_Laser *pCurrent); public: - virtual void OnReset(); virtual void OnRender(); - - void AddExtraProjectile(CNetObj_Projectile *pProj); }; #endif diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/mapimages.cpp teeworlds-0.6.4+dfsg/src/game/client/components/mapimages.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/mapimages.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/mapimages.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -34,7 +34,7 @@ m_aTextures[i] = 0; CMapItemImage *pImg = (CMapItemImage *)pMap->GetItem(Start+i, 0, 0); - if(pImg->m_External) + if(pImg->m_External || (pImg->m_Version > 1 && pImg->m_Format != CImageInfo::FORMAT_RGB && pImg->m_Format != CImageInfo::FORMAT_RGBA)) { char Buf[256]; char *pName = (char *)pMap->GetData(pImg->m_ImageName); @@ -44,9 +44,8 @@ else { void *pData = pMap->GetData(pImg->m_ImageData); - m_aTextures[i] = Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, CImageInfo::FORMAT_RGBA, pData, CImageInfo::FORMAT_RGBA, 0); + m_aTextures[i] = Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, pImg->m_Version == 1 ? CImageInfo::FORMAT_RGBA : pImg->m_Format, pData, CImageInfo::FORMAT_RGBA, 0); pMap->UnloadData(pImg->m_ImageData); } } } - diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/menus_demo.cpp teeworlds-0.6.4+dfsg/src/game/client/components/menus_demo.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/menus_demo.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/menus_demo.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -349,7 +349,7 @@ if(Item.m_Rect.y+Item.m_Rect.h > gs_ListBoxOriginalView.y) { - if(Item.m_HitRect.y < Item.m_HitRect.y) // clip the selection + if(Item.m_HitRect.y < gs_ListBoxOriginalView.y) // clip the selection { Item.m_HitRect.h -= gs_ListBoxOriginalView.y-Item.m_HitRect.y; Item.m_HitRect.y = gs_ListBoxOriginalView.y; diff -Nru teeworlds-0.6.3+dfsg/src/game/client/components/players.cpp teeworlds-0.6.4+dfsg/src/game/client/components/players.cpp --- teeworlds-0.6.3+dfsg/src/game/client/components/players.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/components/players.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -274,7 +274,12 @@ bool WantOtherDir = (Player.m_Direction == -1 && Vel.x > 0) || (Player.m_Direction == 1 && Vel.x < 0); // evaluate animation - float WalkTime = fmod(absolute(Position.x), 100.0f)/100.0f; + const float WalkTimeMagic = 100.0f; + float WalkTime = + ((Position.x >= 0) + ? fmod(Position.x, WalkTimeMagic) + : WalkTimeMagic - fmod(-Position.x, WalkTimeMagic)) + / WalkTimeMagic; CAnimState State; State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0); diff -Nru teeworlds-0.6.3+dfsg/src/game/client/gameclient.cpp teeworlds-0.6.4+dfsg/src/game/client/gameclient.cpp --- teeworlds-0.6.3+dfsg/src/game/client/gameclient.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/client/gameclient.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -477,25 +477,7 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker) { // special messages - if(MsgId == NETMSGTYPE_SV_EXTRAPROJECTILE) - { - int Num = pUnpacker->GetInt(); - - for(int k = 0; k < Num; k++) - { - CNetObj_Projectile Proj; - for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) - ((int *)&Proj)[i] = pUnpacker->GetInt(); - - if(pUnpacker->Error()) - return; - - g_GameClient.m_pItems->AddExtraProjectile(&Proj); - } - - return; - } - else if(MsgId == NETMSGTYPE_SV_TUNEPARAMS) + if(MsgId == NETMSGTYPE_SV_TUNEPARAMS) { // unpack the new tuning CTuningParams NewTuning; diff -Nru teeworlds-0.6.3+dfsg/src/game/collision.h teeworlds-0.6.4+dfsg/src/game/collision.h --- teeworlds-0.6.3+dfsg/src/game/collision.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/collision.h 2016-11-13 15:41:35.000000000 +0000 @@ -25,9 +25,9 @@ CCollision(); void Init(class CLayers *pLayers); - bool CheckPoint(float x, float y) { return IsTileSolid(round(x), round(y)); } + bool CheckPoint(float x, float y) { return IsTileSolid(round_to_int(x), round_to_int(y)); } bool CheckPoint(vec2 Pos) { return CheckPoint(Pos.x, Pos.y); } - int GetCollisionAt(float x, float y) { return GetTile(round(x), round(y)); } + int GetCollisionAt(float x, float y) { return GetTile(round_to_int(x), round_to_int(y)); } int GetWidth() { return m_Width; }; int GetHeight() { return m_Height; }; int IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision); diff -Nru teeworlds-0.6.3+dfsg/src/game/editor/editor.cpp teeworlds-0.6.4+dfsg/src/game/editor/editor.cpp --- teeworlds-0.6.3+dfsg/src/game/editor/editor.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/editor/editor.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -164,35 +164,42 @@ void CEditorImage::AnalyseTileFlags() { - mem_zero(m_aTileFlags, sizeof(m_aTileFlags)); - - int tw = m_Width/16; // tilesizes - int th = m_Height/16; - if ( tw == th ) + if(m_Format == CImageInfo::FORMAT_RGB) + { + for(int i = 0; i < 256; ++i) + m_aTileFlags[i] = TILEFLAG_OPAQUE; + } + else { - unsigned char *pPixelData = (unsigned char *)m_pData; + mem_zero(m_aTileFlags, sizeof(m_aTileFlags)); - int TileID = 0; - for(int ty = 0; ty < 16; ty++) - for(int tx = 0; tx < 16; tx++, TileID++) - { - bool Opaque = true; - for(int x = 0; x < tw; x++) - for(int y = 0; y < th; y++) - { - int p = (ty*tw+y)*m_Width + tx*tw+x; - if(pPixelData[p*4+3] < 250) + int tw = m_Width/16; // tilesizes + int th = m_Height/16; + if(tw == th) + { + unsigned char *pPixelData = (unsigned char *)m_pData; + + int TileID = 0; + for(int ty = 0; ty < 16; ty++) + for(int tx = 0; tx < 16; tx++, TileID++) + { + bool Opaque = true; + for(int x = 0; x < tw; x++) + for(int y = 0; y < th; y++) { - Opaque = false; - break; + int p = (ty*tw+y)*m_Width + tx*tw+x; + if(pPixelData[p*4+3] < 250) + { + Opaque = false; + break; + } } - } - if(Opaque) - m_aTileFlags[TileID] |= TILEFLAG_OPAQUE; - } + if(Opaque) + m_aTileFlags[TileID] |= TILEFLAG_OPAQUE; + } + } } - } void CEditor::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser) @@ -613,7 +620,7 @@ if(UI()->ActiveItem() == pID) { - if(!UI()->MouseButton(0)) + if(!UI()->MouseButton(0) || Input()->KeyDown(KEY_ESCAPE)) { m_LockMouse = false; UI()->SetActiveItem(0); diff -Nru teeworlds-0.6.3+dfsg/src/game/editor/io.cpp teeworlds-0.6.4+dfsg/src/game/editor/io.cpp --- teeworlds-0.6.3+dfsg/src/game/editor/io.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/editor/io.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -255,7 +255,7 @@ pImg->AnalyseTileFlags(); CMapItemImage Item; - Item.m_Version = 1; + Item.m_Version = CMapItemImage::CURRENT_VERSION; Item.m_Width = pImg->m_Width; Item.m_Height = pImg->m_Height; @@ -264,7 +264,11 @@ if(pImg->m_External) Item.m_ImageData = -1; else - Item.m_ImageData = df.AddData(Item.m_Width*Item.m_Height*4, pImg->m_pData); + { + int PixelSize = pImg->m_Format == CImageInfo::FORMAT_RGB ? 3 : 4; + Item.m_ImageData = df.AddData(Item.m_Width*Item.m_Height*PixelSize, pImg->m_pData); + } + Item.m_Format = pImg->m_Format; df.AddItem(MAPITEMTYPE_IMAGE, i, sizeof(Item), &Item); } @@ -470,7 +474,7 @@ CEditorImage *pImg = new CEditorImage(m_pEditor); pImg->m_External = pItem->m_External; - if(pItem->m_External) + if(pItem->m_External || (pItem->m_Version > 1 && pItem->m_Format != CImageInfo::FORMAT_RGB && pItem->m_Format != CImageInfo::FORMAT_RGBA)) { char aBuf[256]; str_format(aBuf, sizeof(aBuf),"mapres/%s.png", pName); @@ -489,12 +493,13 @@ { pImg->m_Width = pItem->m_Width; pImg->m_Height = pItem->m_Height; - pImg->m_Format = CImageInfo::FORMAT_RGBA; + pImg->m_Format = pItem->m_Version == 1 ? CImageInfo::FORMAT_RGBA : pItem->m_Format; + int PixelSize = pImg->m_Format == CImageInfo::FORMAT_RGB ? 3 : 4; // copy image data void *pData = DataFile.GetData(pItem->m_ImageData); - pImg->m_pData = mem_alloc(pImg->m_Width*pImg->m_Height*4, 1); - mem_copy(pImg->m_pData, pData, pImg->m_Width*pImg->m_Height*4); + pImg->m_pData = mem_alloc(pImg->m_Width*pImg->m_Height*PixelSize, 1); + mem_copy(pImg->m_pData, pData, pImg->m_Width*pImg->m_Height*PixelSize); pImg->m_TexID = m_pEditor->Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, pImg->m_Format, pImg->m_pData, CImageInfo::FORMAT_AUTO, 0); } diff -Nru teeworlds-0.6.3+dfsg/src/game/editor/layer_tiles.cpp teeworlds-0.6.4+dfsg/src/game/editor/layer_tiles.cpp --- teeworlds-0.6.3+dfsg/src/game/editor/layer_tiles.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/editor/layer_tiles.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -248,7 +248,7 @@ void CLayerTiles::BrushRotate(float Amount) { - int Rotation = (round(360.0f*Amount/(pi*2))/90)%4; // 0=0, 1=90, 2=180, 3=270 + int Rotation = (round_to_int(360.0f*Amount/(pi*2))/90)%4; // 0=0, 1=90, 2=180, 3=270 if(Rotation < 0) Rotation +=4; diff -Nru teeworlds-0.6.3+dfsg/src/game/editor/popups.cpp teeworlds-0.6.4+dfsg/src/game/editor/popups.cpp --- teeworlds-0.6.3+dfsg/src/game/editor/popups.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/editor/popups.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -75,10 +75,16 @@ r.Margin(4.0f, &r); if(s_UiPopups[i].m_pfnFunc(this, r)) + { g_UiNumPopups--; + UI()->SetActiveItem(0); + } if(Input()->KeyDown(KEY_ESCAPE)) + { g_UiNumPopups--; + UI()->SetActiveItem(0); + } } } diff -Nru teeworlds-0.6.3+dfsg/src/game/gamecore.cpp teeworlds-0.6.4+dfsg/src/game/gamecore.cpp --- teeworlds-0.6.3+dfsg/src/game/gamecore.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/gamecore.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -401,17 +401,17 @@ void CCharacterCore::Write(CNetObj_CharacterCore *pObjCore) { - pObjCore->m_X = round(m_Pos.x); - pObjCore->m_Y = round(m_Pos.y); + pObjCore->m_X = round_to_int(m_Pos.x); + pObjCore->m_Y = round_to_int(m_Pos.y); - pObjCore->m_VelX = round(m_Vel.x*256.0f); - pObjCore->m_VelY = round(m_Vel.y*256.0f); + pObjCore->m_VelX = round_to_int(m_Vel.x*256.0f); + pObjCore->m_VelY = round_to_int(m_Vel.y*256.0f); pObjCore->m_HookState = m_HookState; pObjCore->m_HookTick = m_HookTick; - pObjCore->m_HookX = round(m_HookPos.x); - pObjCore->m_HookY = round(m_HookPos.y); - pObjCore->m_HookDx = round(m_HookDir.x*256.0f); - pObjCore->m_HookDy = round(m_HookDir.y*256.0f); + pObjCore->m_HookX = round_to_int(m_HookPos.x); + pObjCore->m_HookY = round_to_int(m_HookPos.y); + pObjCore->m_HookDx = round_to_int(m_HookDir.x*256.0f); + pObjCore->m_HookDy = round_to_int(m_HookDir.y*256.0f); pObjCore->m_HookedPlayer = m_HookedPlayer; pObjCore->m_Jumped = m_Jumped; pObjCore->m_Direction = m_Direction; diff -Nru teeworlds-0.6.3+dfsg/src/game/mapitems.h teeworlds-0.6.4+dfsg/src/game/mapitems.h --- teeworlds-0.6.3+dfsg/src/game/mapitems.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/mapitems.h 2016-11-13 15:41:35.000000000 +0000 @@ -99,7 +99,7 @@ int m_License; } ; -struct CMapItemImage +struct CMapItemImage_v1 { int m_Version; int m_Width; @@ -109,6 +109,12 @@ int m_ImageData; } ; +struct CMapItemImage : public CMapItemImage_v1 +{ + enum { CURRENT_VERSION=2 }; + int m_Format; +}; + struct CMapItemGroup_v1 { int m_Version; diff -Nru teeworlds-0.6.3+dfsg/src/game/server/entities/character.cpp teeworlds-0.6.4+dfsg/src/game/server/entities/character.cpp --- teeworlds-0.6.3+dfsg/src/game/server/entities/character.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/server/entities/character.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -333,17 +333,6 @@ (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GunLifetime), 1, 0, 0, -1, WEAPON_GUN); - // pack the Projectile and send it to the client Directly - CNetObj_Projectile p; - pProj->FillInfo(&p); - - CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); - Msg.AddInt(1); - for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) - Msg.AddInt(((int *)&p)[i]); - - Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); - GameServer()->CreateSound(m_Pos, SOUND_GUN_FIRE); } break; @@ -351,9 +340,6 @@ { int ShotSpread = 2; - CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); - Msg.AddInt(ShotSpread*2+1); - for(int i = -ShotSpread; i <= ShotSpread; ++i) { float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f}; @@ -367,17 +353,8 @@ vec2(cosf(a), sinf(a))*Speed, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime), 1, 0, 0, -1, WEAPON_SHOTGUN); - - // pack the Projectile and send it to the client Directly - CNetObj_Projectile p; - pProj->FillInfo(&p); - - for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) - Msg.AddInt(((int *)&p)[i]); } - Server()->SendMsg(&Msg, 0,m_pPlayer->GetCID()); - GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE); } break; @@ -390,16 +367,6 @@ (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GrenadeLifetime), 1, true, 0, SOUND_GRENADE_EXPLODE, WEAPON_GRENADE); - // pack the Projectile and send it to the client Directly - CNetObj_Projectile p; - pProj->FillInfo(&p); - - CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); - Msg.AddInt(1); - for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) - Msg.AddInt(((int *)&p)[i]); - Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); - GameServer()->CreateSound(m_Pos, SOUND_GRENADE_FIRE); } break; diff -Nru teeworlds-0.6.3+dfsg/src/game/server/entity.cpp teeworlds-0.6.4+dfsg/src/game/server/entity.cpp --- teeworlds-0.6.3+dfsg/src/game/server/entity.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/server/entity.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -51,6 +51,6 @@ bool CEntity::GameLayerClipped(vec2 CheckPos) { - return round(CheckPos.x)/32 < -200 || round(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 || - round(CheckPos.y)/32 < -200 || round(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false; + return round_to_int(CheckPos.x)/32 < -200 || round_to_int(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 || + round_to_int(CheckPos.y)/32 < -200 || round_to_int(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false; } diff -Nru teeworlds-0.6.3+dfsg/src/game/server/gamecontext.cpp teeworlds-0.6.4+dfsg/src/game/server/gamecontext.cpp --- teeworlds-0.6.3+dfsg/src/game/server/gamecontext.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/server/gamecontext.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -1067,11 +1067,7 @@ void CGameContext::ConPause(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; - - if(pSelf->m_pController->IsGameOver()) - return; - - pSelf->m_World.m_Paused ^= 1; + pSelf->m_pController->TogglePause(); } void CGameContext::ConChangeMap(IConsole::IResult *pResult, void *pUserData) diff -Nru teeworlds-0.6.3+dfsg/src/game/server/gamecontroller.cpp teeworlds-0.6.4+dfsg/src/game/server/gamecontroller.cpp --- teeworlds-0.6.3+dfsg/src/game/server/gamecontroller.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/server/gamecontroller.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -18,6 +18,7 @@ // DoWarmup(g_Config.m_SvWarmup); + m_UnpauseTimer = 0; m_GameOverTick = -1; m_SuddenDeath = 0; m_RoundStartTick = Server()->Tick(); @@ -376,6 +377,30 @@ m_Warmup = Seconds*Server()->TickSpeed(); } +void IGameController::TogglePause() +{ + if(IsGameOver()) + return; + + if(GameServer()->m_World.m_Paused) + { + // unpause + if(g_Config.m_SvUnpauseTimer > 0) + m_UnpauseTimer = g_Config.m_SvUnpauseTimer*Server()->TickSpeed(); + else + { + GameServer()->m_World.m_Paused = false; + m_UnpauseTimer = 0; + } + } + else + { + // pause + GameServer()->m_World.m_Paused = true; + m_UnpauseTimer = 0; + } +} + bool IGameController::IsFriendlyFire(int ClientID1, int ClientID2) { if(ClientID1 == ClientID2) @@ -412,7 +437,7 @@ void IGameController::Tick() { // do warmup - if(m_Warmup) + if(!GameServer()->m_World.m_Paused && m_Warmup) { m_Warmup--; if(!m_Warmup) @@ -429,6 +454,12 @@ m_RoundCount++; } } + else if(GameServer()->m_World.m_Paused && m_UnpauseTimer) + { + --m_UnpauseTimer; + if(!m_UnpauseTimer) + GameServer()->m_World.m_Paused = false; + } // game is Paused if(GameServer()->m_World.m_Paused) @@ -561,7 +592,7 @@ if(GameServer()->m_World.m_Paused) pGameInfoObj->m_GameStateFlags |= GAMESTATEFLAG_PAUSED; pGameInfoObj->m_RoundStartTick = m_RoundStartTick; - pGameInfoObj->m_WarmupTimer = m_Warmup; + pGameInfoObj->m_WarmupTimer = GameServer()->m_World.m_Paused ? m_UnpauseTimer : m_Warmup; pGameInfoObj->m_ScoreLimit = g_Config.m_SvScorelimit; pGameInfoObj->m_TimeLimit = g_Config.m_SvTimelimit; diff -Nru teeworlds-0.6.3+dfsg/src/game/server/gamecontroller.h teeworlds-0.6.4+dfsg/src/game/server/gamecontroller.h --- teeworlds-0.6.3+dfsg/src/game/server/gamecontroller.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/server/gamecontroller.h 2016-11-13 15:41:35.000000000 +0000 @@ -54,6 +54,7 @@ int m_aTeamscore[2]; int m_Warmup; + int m_UnpauseTimer; int m_RoundCount; int m_GameFlags; @@ -72,6 +73,7 @@ virtual void DoWincheck(); void DoWarmup(int Seconds); + void TogglePause(); void StartRound(); void EndRound(); diff -Nru teeworlds-0.6.3+dfsg/src/game/variables.h teeworlds-0.6.4+dfsg/src/game/variables.h --- teeworlds-0.6.3+dfsg/src/game/variables.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/variables.h 2016-11-13 15:41:35.000000000 +0000 @@ -57,6 +57,7 @@ // server MACRO_CONFIG_INT(SvWarmup, sv_warmup, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds to do warmup before round starts") +MACRO_CONFIG_INT(SvUnpauseTimer, sv_unpause_timer, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds till the game continues") MACRO_CONFIG_STR(SvMotd, sv_motd, 900, "", CFGFLAG_SERVER, "Message of the day to display for the clients") MACRO_CONFIG_INT(SvTeamdamage, sv_teamdamage, 0, 0, 1, CFGFLAG_SERVER, "Team damage") MACRO_CONFIG_STR(SvMaprotation, sv_maprotation, 768, "", CFGFLAG_SERVER, "Maps to rotate between") diff -Nru teeworlds-0.6.3+dfsg/src/game/version.h teeworlds-0.6.4+dfsg/src/game/version.h --- teeworlds-0.6.3+dfsg/src/game/version.h 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/game/version.h 2016-11-13 15:41:35.000000000 +0000 @@ -3,7 +3,7 @@ #ifndef GAME_VERSION_H #define GAME_VERSION_H #include "generated/nethash.cpp" -#define GAME_VERSION "0.6.3" +#define GAME_VERSION "0.6.4" #define GAME_NETVERSION "0.6 " GAME_NETVERSION_HASH -static const char GAME_RELEASE_VERSION[8] = {'0', '.', '6', '.', '2', 0}; +static const char GAME_RELEASE_VERSION[8] = {'0', '.', '6', '.', '4', 0}; #endif diff -Nru teeworlds-0.6.3+dfsg/src/mastersrv/mastersrv.cpp teeworlds-0.6.4+dfsg/src/mastersrv/mastersrv.cpp --- teeworlds-0.6.3+dfsg/src/mastersrv/mastersrv.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/mastersrv/mastersrv.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -117,7 +117,7 @@ } else { - static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; + static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, IPV4Mapping, sizeof(IPV4Mapping)); m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[12] = pCurrent->m_Address.ip[0]; diff -Nru teeworlds-0.6.3+dfsg/src/tools/crapnet.cpp teeworlds-0.6.4+dfsg/src/tools/crapnet.cpp --- teeworlds-0.6.3+dfsg/src/tools/crapnet.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/tools/crapnet.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -42,10 +42,10 @@ static int m_ConfigLog = 0; static int m_ConfigReorder = 0; -void Run(int Port, NETADDR Dest) +void Run(unsigned short Port, NETADDR Dest) { NETADDR Src = {NETTYPE_IPV4, {0,0,0,0}, Port}; - NETSOCKET Socket = net_udp_create(Src); + NETSOCKET Socket = net_udp_create(Src, 0); char aBuffer[1024*2]; int ID = 0; diff -Nru teeworlds-0.6.3+dfsg/src/tools/packetgen.cpp teeworlds-0.6.4+dfsg/src/tools/packetgen.cpp --- teeworlds-0.6.3+dfsg/src/tools/packetgen.cpp 2014-11-19 22:08:22.000000000 +0000 +++ teeworlds-0.6.4+dfsg/src/tools/packetgen.cpp 2016-11-13 15:41:35.000000000 +0000 @@ -11,7 +11,7 @@ for(int i = 0; i < NUM_SOCKETS; i++) { NETADDR BindAddr = {NETTYPE_IPV4, {0}, 0}; - aSockets[i] = net_udp_create(BindAddr); + aSockets[i] = net_udp_create(BindAddr, 0); } while(1)