Merge branch 'master' of git://github.com/teeworlds/teeworlds into DDRace

Conflicts:
	bam.lua
	scripts/build.py
	scripts/make_release.py
	src/engine/server.h
	src/game/client/gameclient.cpp
	src/game/server/gamecontext.cpp
	src/game/server/gamecontext.h
	src/game/server/gamecontroller.cpp
	src/game/server/gamecontroller.h
	src/game/server/player.cpp
	src/game/version.h
This commit is contained in:
GreYFoX 2012-04-12 02:09:31 +02:00
commit cd4ba53bae
116 changed files with 1234 additions and 18022 deletions

2
.gitignore vendored
View file

@ -18,7 +18,7 @@ mastersrv*
packetgen*
teeworlds*
teeworlds_srv*
tileset_borderfix*
tileset_border*
versionsrv*
Debug

View file

@ -153,7 +153,10 @@ function build(settings, attributes)
if attributes.target == "buildbot" then
settings.link.flags:Add("-static-libstdc++")
end
if platform == "macosx" then
if family == "windows" then
-- disable visibility attribute support for gcc on windows
settings.cc.defines:Add("NO_VIZ")
elseif platform == "macosx" then
settings.cc.flags:Add("-mmacosx-version-min=10.5")
settings.link.flags:Add("-mmacosx-version-min=10.5")
elseif config.stackprotector.value == 1 then

View file

@ -1,679 +0,0 @@
##### 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 #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d bytes
%d of %d servers, %d players
== %d od %d server(a), %d igrač(a)
%d%% loaded
== Učitano %d%%
%ds left
== Još %ds
%i minute left
== Preostalo: %i min.
%i minutes left
== Preostalo: %i min.
%i second left
== Preostalo: %i sek.
%i seconds left
== Preostalo: %i sek.
%s wins!
== %s je pobijedio!
-Page %d-
== -Strana %d-
Abort
== Prekini
Add
== Dodaj
Add Friend
== Dodaj prijatelja
Address
== Adresa
All
== Svi
Alpha
== Provid.
Always show name plates
== Uvijek prikaži imena igrača
Are you sure that you want to delete the demo?
== Jeste li sigurni da želite obrisati demo-snimak?
Are you sure that you want to quit?
== Jeste li sigurni da želite izići?
Are you sure that you want to remove the player from your friends list?
== Da li ste sigurni da želite ukloniti igrača iz vaše liste prijatelja?
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.
== Pošto prvi put pokrećete igru, molimo da ispod unesete Vaš nadimak (nick). Preporučujemo da provjerite postavke i podesite ih prema Vašem ukusu prije nego se konektujete na server.
Automatically record demos
== Automatski demo-snimci
Automatically take game over screenshot
== Automatski screenshot po završetku igre
Blue team
== Plavi tim
Blue team wins!
== Plavi tim je pobijedio!
Body
== Tijelo
Call vote
== Glasanje
Change settings
== Izmijeni postavke
Chat
== Chat
Clan
== Klan
Client
== Klijent
Close
== Zatvori
Compatible version
== Kompatibilna verzija
Connect
== Konektuj
Connecting to
== Konektujem na
Connection Problems...
== Problemi sa konekcijom...
Console
== Konzola
Controls
== Kontrole
Count players only
== Izbroj samo igrače
Country
== Država
Crc:
== Crc:
Created:
== Kreirano:
Current
== Current
Current version: %s
== Trenutna verzija: %s
Custom colors
== Vlastite boje
Delete
== Obriši
Delete demo
== Brisanje demo-snimka
Demo details
== Podaci o demo-snimku
Demofile: %s
== Demo-snimak: %s
Demos
== Demo
Disconnect
== Diskonektuj
Disconnected
== Diskonektovan
Display Modes
== Rezolucija i način prikaza
Downloading map
== Preuzimam mapu
Draw!
== Neriješeno!
Dynamic Camera
== Dinamička kamera
Emoticon
== Emoticon
Enter
== Započni
Error
== Greška
Error loading demo
== Došlo je do greške pri učitavanju demo-snimka
FSAA samples
== FSAA samples
Favorite
== Omiljeni
Favorites
== Omiljeni
Feet
== Stopala
Filter
== Filter
Fire
== Pucanje
Folder
== Direktorij
Force vote
== Obavezno glasanje
Free-View
== Slobodan pogled
Friends
== Prijatelji
Fullscreen
== Čitav ekran
Game
== Igra
Game info
== O igri
Game over
== Igra je završena
Game type
== Tip igre
Game types:
== Tipovi igre:
General
== Opće
Graphics
== Grafika
Grenade
== Granate
Hammer
== Čekić
Has people playing
== Server nije prazan
High Detail
== Visoki detalji
Hook
== Lanac
Host address
== Adresa servera
Hue
== Nijans.
Info
== Info
Internet
== Internet
Invalid Demo
== Neispravan demo-snimak
Join blue
== U plavi tim
Join game
== Uključi se u igru
Join red
== U crveni tim
Jump
== Skok
Kick player
== Izbaci igrača iz igre
LAN
== LAN
Language
== Jezik
Length:
== Dužina:
Lht.
== Svjetl.
Loading
== Učitavam
MOTD
== Poruka dana
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Maksimalan broj screenshot-a
Max demos
== Maximalan broj demo-snimaka
Maximum ping:
== Maksimalan ping:
Miscellaneous
== Razno
Mouse sens.
== Osjetljivost miša
Move left
== Nalijevo
Move player to spectators
== Izbaci igrača u posmatrače
Move right
== Nadesno
Movement
== Kretanje
Mute when not active
== Bez zvuka prilikom neaktivnosti
Name
== Ime
Name plates size
== Veličina podloge za ime
Netversion:
== Net-verzija:
New name:
== Novo ime:
News
== Novosti
Next weapon
== Sljedeće oružje
Nickname
== Nadimak
No
== Ne
No password
== Bez lozinke
No servers found
== Nije pronađen nijedan server
No servers match your filter criteria
== Nijedan server ne odgovara zadatom kriteriju
Ok
== OK
Open
== Otvori
Parent Folder
== Prethodni direktorij
Password
== Lozinka
Password incorrect
== Pogrešna lozinka
Ping
== Ping
Pistol
== Pištolj
Play
== Pogledaj
Play background music
== Pozadinska muzika
Player
== Igrač
Player country:
== Država
Player options
== Postavke igrača
Players
== Igrači
Please balance teams!
== Molim uravnotežite timove!
Prev. weapon
== Prethodno oružje
Quality Textures
== Visokokvalitetne teksture
Quick search:
== Brza pretraga:
Quit
== Izlaz
Quit anyway?
== Izlaz?
REC %3d:%02d
== %3d:%02d
Reason:
== Razlog:
Record demo
== Snimi demo
Red team
== Crveni tim
Red team wins!
== Crveni tim je pobijedio!
Refresh
== Osvježi
Refreshing master servers
== Osvježavam glavne servere
Remote console
== Udaljena konzola
Remove
== Ukloni
Remove friend
== Ukloni prijatelja
Rename
== Preimenuj
Rename demo
== Preimenuj demo-snimak
Reset filter
== Poništi filter
Reset to defaults
== Vrati na početne postavke
Rifle
== Laser
Round
== Runda
Sample rate
== Frekvencija
Sat.
== Zasić.
Score
== Rezultat
Score board
== Bodovi
Score limit
== Max. bodova
Scoreboard
== Bodovi
Screenshot
== Screenshot
Server address:
== Adresa servera:
Server details
== Podaci o serveru
Server filter
== Filter servera
Server info
== O Serveru
Server not full
== Server nije pun
Settings
== Postavke
Shotgun
== Pumparica
Show chat
== Prikaži chat
Show friends only
== Prikaži prijatelje
Show ingame HUD
== Prikaži HUD
Show name plates
== Prikaži imena igrača
Show only supported
== Prikaži samo podržane
Size:
== Veličina:
Skins
== Izgled
Sound
== Zvuk
Sound error
== Problem sa zvukom
Sound volume
== Jačina zvuka
Spectate
== Posmatraj
Spectate next
== Posmatraj narednog
Spectate previous
== Posmatraj prethodnog
Spectator mode
== Posmatrački mod
Spectators
== Posmatrači
Standard gametype
== Standardni tip igre
Standard map
== Standardna mapa
Stop record
== Prekini snimanje
Strict gametype filter
== Striktan filter tipa igre
Sudden Death
== Iznenadna smrt
Switch weapon on pickup
== Aktiviraj novo oružje prilikom uzimanja
Team
== Tim
Team chat
== Timski chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworld %s je objavljen! Preuzmi ga na www.teeworlds.com!
Texture Compression
== Kompresija tekstura
The audio device couldn't be initialised.
== Audio-uređaj nije moguće pokrenuti.
The server is running a non-standard tuning on a pure game type.
== Server sadrži nestandardne postavke.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Mapa u editoru nije memorisana, možda je želite memorisati prije nego izađete iz igre.
Time limit
== Max. vremena
Time limit: %d min
== Max. vremena: %d min.
Try again
== Pokušaj ponovo
Type
== Tip
Type:
== Tip:
UI Color
== Boja menija
Unable to delete the demo
== Demo-snimak nije moguće obrisati
Unable to rename the demo
== Demo-snimak nije moguće preimenovati
Use sounds
== Aktiviraj zvuk
Use team colors for name plates
== Koristi timsku boju u prikazu imena
V-Sync
== V-Sync
Version
== Verzija
Version:
== Verzija:
Vote command:
== Komanda za glasanje:
Vote description:
== Opis glasanja:
Vote no
== Ne
Vote yes
== Da
Voting
== Glasanje
Warmup
== Zagrijavanje
Weapon
== Oružje
Welcome to Teeworlds
== Dobrodošli u Teeworlds
Yes
== Da
You must restart the game for all settings to take effect.
== Morate ponovo pokrenuti igru da bi sve postavke bile primijenjene.
Your skin
== Vaš izgled
no limit
== bez ograničenja
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d de %d servidores, %d jogadores
%d%% loaded
== %d%% carregado
%ds left
== Faltam %ds
%i minute left
== Falta %i minuto
%i minutes left
== Faltam %i minutos
%i second left
== Falta %i segundo
%i seconds left
== Faltam %i segundos
%s wins!
== %s vence!
-Page %d-
== -Página %d-
Abort
== Cancelar
Add
== Adicionar
Add Friend
== Adicionar amigo
Address
== Endereço
All
== Todos
Alpha
== Alpha
Always show name plates
== Sempre mostrar apelidos
Are you sure that you want to delete the demo?
== Tem certeza que deseja deletar o demo?
Are you sure that you want to quit?
== Você tem certeza que deseja sair?
Are you sure that you want to remove the player from your friends list?
== Tem certeza que deseja remover o jogador de sua lista de amigos?
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.
== Como esta é a primeira vez que você abre o jogo, por favor, coloque seu apelido abaixo. É recomendado que você verifique as configurações e então ajuste-as para suas preferências antes de entrar em um servidor.
Automatically record demos
== Gravar demos automaticamente
Automatically take game over screenshot
== Capturar tela final de jogo automaticamente
Blue team
== Time azul
Blue team wins!
== Vitória do time azul!
Body
== Corpo
Call vote
== Votar
Change settings
== Mudar configurações
Chat
== Chat
Clan
== Clã
Client
== Cliente
Close
== Fechar
Compatible version
== Versão compatível
Connect
== Conectar
Connecting to
== Conectando a
Connection Problems...
== Problemas de conexão...
Console
== Console
Controls
== Controles
Count players only
== Contar apenas jogadores
Country
== País
Crc:
== Crc:
Created:
== Criado:
Current
== Atual
Current version: %s
== Versão atual: %s
Custom colors
== Cores personalizadas
Delete
== Deletar
Delete demo
== Deletar demo
Demo details
== Detalhes do demo
Demofile: %s
== Demo: %s
Demos
== Demos
Disconnect
== Desconectar
Disconnected
== Desconectado
Display Modes
== Modos de exibição
Downloading map
== Baixando mapa
Draw!
== Empate!
Dynamic Camera
== Câmera dinâmica
Emoticon
== Emoticon
Enter
== Entrar
Error
== Erro
Error loading demo
== Erro ao carregar demo
FSAA samples
== Amostras FSAA
Favorite
== Favorito
Favorites
== Favoritos
Feet
== Pés
Filter
== Filtro
Fire
== Atirar
Folder
== Pasta
Force vote
== Forçar votação
Free-View
== Visualização livre
Friends
== Amigos
Fullscreen
== Tela cheia
Game
== Jogo
Game info
== Jogo
Game over
== Fim do jogo
Game type
== Tipo de jogo
Game types:
== Tipos de jogo:
General
== Geral
Graphics
== Gráficos
Grenade
== Granada
Hammer
== Martelo
Has people playing
== Há pessoas jogando
High Detail
== Mostrar detalhes
Hook
== Gancho
Host address
== Endereço do servidor
Hue
== Matiz
Info
== Informações
Internet
== Internet
Invalid Demo
== Demo inválido
Join blue
== Azul
Join game
== Entrar no jogo
Join red
== Vermelho
Jump
== Pular
Kick player
== Expulsar jogador
LAN
== LAN
Language
== Idioma
Length:
== Duração:
Lht.
== Luminos.
Loading
== Carregando
MOTD
== MOTD
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Máximo de capturas de tela
Max demos
== Máximo de demos
Maximum ping:
== Ping máximo:
Miscellaneous
== Diversos
Mouse sens.
== Sens. do mouse
Move left
== Esquerda
Move player to spectators
== Mover jogador para espectadores
Move right
== Direita
Movement
== Movimento
Mute when not active
== Silenciar quando inativo
Name
== Nome
Name plates size
== Tamanho dos apelidos
Netversion:
== Netversion
New name:
== Novo nome:
News
== Novidades
Next weapon
== Próxima arma
Nickname
== Apelido
No
== Não
No password
== Sem senha
No servers found
== Nenhum servidor encontrado
No servers match your filter criteria
== Nenhum servidor corresponde aos critérios do filtro
Ok
== Ok
Open
== Abrir
Parent Folder
== Diretório pai
Password
== Senha
Password incorrect
== Senha incorreta
Ping
== Ping
Pistol
== Pistola
Play
== Assistir
Play background music
== Tocar música de fundo
Player
== Jogador
Player country:
== País do jogador:
Player options
== Opções do jogador
Players
== Jogadores
Please balance teams!
== Favor balancear os times!
Prev. weapon
== Arma anterior
Quality Textures
== Texturas de qualidade
Quick search:
== Pesquisa rápida:
Quit
== Sair
Quit anyway?
== Sair mesmo assim?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Motivo:
Record demo
== Gravar demo
Red team
== Time vermelho
Red team wins!
== Vitória do time vermelho!
Refresh
== Atualizar
Refreshing master servers
== Atualizando servidores mestres
Remote console
== Console remoto
Remove
== Deletar
Remove friend
== Deletar amigo
Rename
== Renomear
Rename demo
== Renomear demo
Reset filter
== Resetar filtro
Reset to defaults
== Resetar configurações
Rifle
== Laser
Round
== Rodada
Sample rate
== Frequência do som
Sat.
== Saturação
Score
== Pontos
Score board
== Placar
Score limit
== Pontuação máx.
Scoreboard
== Placar
Screenshot
== Capturar tela
Server address:
== Endereço:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info
== Servidor
Server not full
== Servidor não lotado
Settings
== Configurações
Shotgun
== Espingarda
Show chat
== Mostrar chat
Show friends only
== Mostrar apenas amigos
Show ingame HUD
== Mostrar HUD do jogo
Show name plates
== Mostrar apelidos
Show only supported
== Mostrar apenas modos suportados
Size:
== Tamanho:
Skins
== Skins
Sound
== Som
Sound error
== Erro de som
Sound volume
== Volume do som
Spectate
== Observar
Spectate next
== Observar próximo
Spectate previous
== Observar anterior
Spectator mode
== Modo espectador
Spectators
== Espectadores
Standard gametype
== Tipo de jogo padrão
Standard map
== Mapa padrão
Stop record
== Parar a gravação
Strict gametype filter
== Filtrar tipo de jogo exato
Sudden Death
== Morte Súbita
Switch weapon on pickup
== Equipar arma ao pegá-la
Team
== Time
Team chat
== Chat do time
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s foi lançado! Baixe-o em www.teeworlds.com!
Texture Compression
== Compressão de textura
The audio device couldn't be initialised.
== O dispositivo de áudio não pôde ser inicializado.
The server is running a non-standard tuning on a pure game type.
== O servidor está rodando com modificações em um tipo de jogo oficial.
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.
Time limit
== Limite de tempo
Time limit: %d min
== Limite de tempo: %d minutos
Try again
== Tente de novo
Type
== Tipo
Type:
== Tipo:
UI Color
== Cor do menu
Unable to delete the demo
== Não foi possível deletar o demo
Unable to rename the demo
== Não foi possível renomear o demo
Use sounds
== Usar sons
Use team colors for name plates
== Usar cores dos times em apelidos
V-Sync
== V-Sync
Version
== Versão
Version:
== Versão
Vote command:
== Comando da votação:
Vote description:
== Descrição da votação:
Vote no
== Votar Não
Vote yes
== Votar Sim
Voting
== Votação
Warmup
== Aquecimento
Weapon
== Arma
Welcome to Teeworlds
== Bem-vindo ao Teeworlds!
Yes
== Sim
You must restart the game for all settings to take effect.
== Você deve reiniciar o jogo para que todas as alterações tenham efeito.
Your skin
== Sua skin
no limit
== sem limite
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### 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
== ЛАН
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
== Записани %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
== Показвай детайли в играта
Show name plates
== Показвай лентите с имената
Show only supported
== Показвай само съвместимите
Size:
== Размер
Skins
== Модели
Sound
== Звук
Sound error
== Грешка в звука
Sound volume
== Сила на звука
Spectate
== Наблюдавай
Spectate next
== Наблюдавай след.
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 #####
Spectate previous
==
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bajtů
%d of %d servers, %d players
== Serverů: %d z %d, Hráčů: %d
%d%% loaded
== %d%% načteno
%ds left
== zbývá %ds
%i minute left
== Zbývá minut: %i
%i minutes left
== Zbývá minut: %i
%i second left
== Zbývá sekund: %i
%i seconds left
== Zbývá sekund: %i
%s wins!
== Vítězí %s!
-Page %d-
== -Strana %d-
Abort
== Přerušit
Add
== Přidat
Add Friend
== Přidat do přátel
Address
== Adresa
All
== Všem
Alpha
== Alfa
Always show name plates
== Vždy zobrazovat
Are you sure that you want to delete the demo?
== Opravdu chcete smazat tento záznam?
Are you sure that you want to quit?
== Opravdu chcete ukončit Teeworlds?
Are you sure that you want to remove the player from your friends list?
== Chcete odebrat tohoto hráče ze seznamu přátel?
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.
== Jelikož je toto Vaše první spuštění hry, zadejte prosím svou přezdívku. Než začnete hrát, doporučujeme si upravit nastavení tak, aby Vám vyhovovalo.
Automatically record demos
== Automaticky nahrávat záznamy
Automatically take game over screenshot
== Na konci kola vyfotit obrazovku
Blue team
== Modří
Blue team wins!
== Modří vyhráli!
Body
== Tělo
Call vote
== Hlasovat
Change settings
== Změna nastavení
Chat
== Chat
Clan
== Herní klan
Client
== Klient
Close
== Zavřít
Compatible version
== Kompatibilní verze
Connect
== Připojit
Connecting to
== Připojuji na
Connection Problems...
== Chyba spojení...
Console
== Konzola
Controls
== Ovládání
Count players only
== Započítat hrající hráče
Country
== Národnost
Crc:
== Crc:
Created:
== Vytvořeno:
Current
== Aktuálně
Current version: %s
== Aktuální verze: %s
Custom colors
== Vlastní barvy
Delete
== Smazat
Delete demo
== Smazat záznam
Demo details
== Detaily záznamu:
Demofile: %s
== Soubor záznamu: %s
Demos
== Záznamy
Disconnect
== Odpojit
Disconnected
== Odpojeno
Display Modes
== Režimy zobrazení
Downloading map
== Stahování mapy
Draw!
== Remíza!
Dynamic Camera
== Pohyblivá kamera
Emoticon
== Emotikony
Enter
== Vstoupit
Error
== Chyba
Error loading demo
== Chyba načítání záznamu
FSAA samples
== FSAA vzorkování
Favorite
== Oblíbený
Favorites
== Oblíbené
Feet
== Nohy
Filter
== Filtr
Fire
== Střelba
Folder
== Složka
Force vote
== Zvolit
Free-View
== Volný pohled
Friends
== Přátelé
Fullscreen
== Celá obrazovka
Game
== Hra
Game info
== Hra
Game over
== Konec hry
Game type
== Herní mód
Game types:
== Herní mód:
General
== Hlavní
Graphics
== Video
Grenade
== Granátomet
Hammer
== Kladivo
Has people playing
== Hráči na serveru
High Detail
== Vysoké detaily
Hook
== Hák
Host address
== Adresa serveru
Hue
== Tón
Info
== Info
Internet
== Internet
Invalid Demo
== Neplatný záznam
Join blue
== Modří
Join game
== Do hry
Join red
== Červení
Jump
== Skok
Kick player
== Vyhodit hráče
LAN
== LAN
Language
== Jazyk
Length:
== Délka:
Lht.
== Jas
Loading
== Načítání
MOTD
== MOTD
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Maximální počet vyfocených obrazovek
Max demos
== Maximální počet záznamů
Maximum ping:
== Maximální ping:
Miscellaneous
== Ostatní
Mouse sens.
== Citlivost myši
Move left
== Pohyb doleva
Move player to spectators
== Poslat hráče pozorovat
Move right
== Pohyb doprava
Movement
== Pohyb
Mute when not active
== Při nečinnosti ztlumit zvuk
Name
== Jméno
Name plates size
== Velikost jmen
Netversion:
== Netversion:
New name:
== Nové jméno:
News
== Novinky
Next weapon
== Další zbraň
Nickname
== Přezdívka
No
== Ne
No password
== Bez hesla
No servers found
== Žádný server nenalezen
No servers match your filter criteria
== Žádný server neodpovídá požadavkům filtru
Ok
== OK
Open
== Otevřít
Parent Folder
== Nadřazená složka
Password
== Heslo
Password incorrect
== Špatné heslo
Ping
== Ping
Pistol
== Pistolka
Play
== Přehrát
Play background music
== Přehrávat hudbu na pozadí
Player
== Hráč
Player country:
== Národnost:
Player options
== Nastavení hráčů
Players
== Hráči
Please balance teams!
== Prosím vyrovnejte týmy!
Prev. weapon
== Předchozí zbraň
Quality Textures
== Kvalitní textury
Quick search:
== Vyhledávání:
Quit
== Konec
Quit anyway?
== Opravdu odejít?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Důvod:
Record demo
== Zaznamenat
Red team
== Červení
Red team wins!
== Červení vyhráli!
Refresh
== Obnovit
Refreshing master servers
== Aktualizování hlavních serverů
Remote console
== Vzdálená konzola
Remove
== Odstranit
Remove friend
== Odebrat přítele
Rename
== Přejmenovat
Rename demo
== Přejmenovat záznam
Reset filter
== Vymazat filtr
Reset to defaults
== Obnovit výchozí
Rifle
== Laser
Round
== Kolo
Sample rate
== Vzorkování:
Sat.
== Barva
Score
== Skóre
Score board
== Tabulka výsledků
Score limit
== Skóre limit
Scoreboard
== Tabulka výsledků
Screenshot
== Vyfotit obrazovku
Server address:
== Adresa serveru:
Server details
== Detaily serveru
Server filter
== Filtr serverů
Server info
== Informace
Server not full
== Možnost připojit se
Settings
== Nastavení
Shotgun
== Brokovnice
Show chat
== Zobrazit chat
Show friends only
== Zobrazit přátele
Show ingame HUD
== Zobrazit HUD
Show name plates
== Zobrazovat jména hráčů
Show only supported
== Zobrazit pouze podporované
Size:
== Velikost:
Skins
== Vzhledy
Sound
== Zvuk
Sound error
== Chyba zvuku
Sound volume
== Hlasitost
Spectate
== Pozorovat
Spectate next
== Pozorovat dalšího
Spectate previous
== Pozorovat minulého
Spectator mode
== Nastavit pozorování
Spectators
== Pozorovatelé
Standard gametype
== Základní herní módy
Standard map
== Základní mapy
Stop record
== Ukončit záznam
Strict gametype filter
== Pouze tento herní mód
Sudden Death
== Náhlá smrt
Switch weapon on pickup
== Přehazovat zbraň na nově sebranou
Team
== Týmu
Team chat
== Týmový chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Stáhněte si nové Teeworlds %s na www.teeworlds.com!
Texture Compression
== Komprimované textury
The audio device couldn't be initialised.
== Zvukové zařízení nelze inicializovat.
The server is running a non-standard tuning on a pure game type.
== Server používá nestandartní nastavení (tuning) pro základní módy.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== V editoru map je neuložená mapa, možná ji chcete před ukončením hry uložit.
Time limit
== Časový limit
Time limit: %d min
== Časový limit: %d min
Try again
== Zkusit znovu
Type
== Mód
Type:
== Typ:
UI Color
== Barvy uživatelského rozhraní
Unable to delete the demo
== Záznam se nepodařilo smazat
Unable to rename the demo
== Záznam nelze přejmenovat
Use sounds
== Povolit zvuk
Use team colors for name plates
== Obarvit jména hráčů podle týmu
V-Sync
== Vertikální synchronizace
Version
== Verze
Version:
== Verze:
Vote command:
== Příkaz:
Vote description:
== Popisek hlasování:
Vote no
== NE
Vote yes
== ANO
Voting
== Hlasování
Warmup
== Zahřívací kolo
Weapon
== Zbraně
Welcome to Teeworlds
== Vítejte v Teeworlds
Yes
== Ano
You must restart the game for all settings to take effect.
== Změna nastavení se projeví až po restartu hry.
Your skin
== Zvolený vzhled
no limit
== neomezeno
##### needs translation #####
##### old translations #####

View file

@ -1,678 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d af %d servere, %d spillere
%d%% loaded
== %d%% indlæst
%ds left
== %d sekunder tilbage
%i minute left
== %i minut tilbage
%i minutes left
== %i minutter tilbage
%i second left
== %i sekund tilbage
%i seconds left
== %i sekunder tilbage
%s wins!
== %s vinder!
-Page %d-
== -Side %d-
Abort
== Afbryd
Add
== Tilføj
Add Friend
== Tilføj ven
Address
== Adresse
All
== Alle
Alpha
== Alpha
Always show name plates
== Vis altid navneskilte
Are you sure that you want to delete the demo?
== Er du sikker på at du vil slette denne demo?
Are you sure that you want to quit?
== Er du sikker på at du vil afslutte?
Are you sure that you want to remove the player from your friends list?
== Er du sikker på at du vil fjerne denne spiller fra din venneliste?
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.
== Siden dette er første gang du starter spillet, så vær så venlig at skrive dit navn nedenunder. Det anbefales at du kigger på indstillingerne så du kan tilpasse dem inden du kobler dig på en server.
Automatically record demos
== Optag automatisk demoer
Automatically take game over screenshot
== Tag automatisk et game over screenshot
Blue team
== Blå hold
Blue team wins!
== Blåt hold vinder!
Body
== Krop
Call vote
== Lav afstemning
Change settings
== Ændre indstillinger
Chat
== Chat
Clan
== Klan
Client
== Klient
Close
== Luk
Compatible version
== Kompatibel version
Connect
== Tilslut
Connecting to
== Forbinder til
Connection Problems...
== Forbindelsesproblemer...
Console
== Konsol
Controls
== Taster
Count players only
== Tæl kun spillere
Country
== Land
Crc:
== Crc:
Created:
== Lavet:
Current
== Nuværende
Current version: %s
== Nuværende version: %s
Custom colors
== Brugerdefinerede farver
Delete
== Slet
Delete demo
== Slet demo
Demo details
== Demoinformation
Demos
== Demoer
Disconnect
== Frakoble
Disconnected
== Frakoblet
Display Modes
== Skærmopløsning
Downloading map
== Downloader bane
Draw!
== Uafgjort!
Dynamic Camera
== Dynamisk kamera
Emoticon
== Humørikoner
Enter
== Fortsæt
Error
== Fejl
Error loading demo
== Kunne ikke ikke indlæse demoen
FSAA samples
== FSAA samples
Favorite
== Favorit
Favorites
== Favoritter
Feet
== Fødder
Filter
== Filter
Fire
== Skyd
Folder
== Mappe
Force vote
== Tving afstemning
Free-View
== Free-View
Friends
== Venner
Fullscreen
== Fuldskærm
Game
== Spil
Game info
== Spil info
Game over
== Game over
Game type
== Spiltype
Game types:
== Spiltyper:
General
== Generelt
Graphics
== Grafik
Grenade
== Granatkaster
Hammer
== Hammer
Has people playing
== Har folk som spiller
High Detail
== Extra detaljer
Hook
== Krog
Host address
== Værtsadresse
Hue
== Farve
Info
== Info
Internet
== Internet
Invalid Demo
== Ugyldig demo
Join blue
== Spil for blå
Join game
== Start spil
Join red
== Spil for rød
Jump
== Hop
Kick player
== Udsmid spiller
LAN
== LAN
Language
== Sprog
Length:
== Længde
Lht.
== Lys
Loading
== Indlæser
MOTD
== MOTD
Map
== Kort
Map:
== Bane
Max Screenshots
== Max antal screenshots
Max demos
== Max antal demoer
Maximum ping:
== Højeste ping:
Miscellaneous
== Diverse
Mouse sens.
== Musfølsomhed
Move left
== Gå til venstre
Move player to spectators
== Flyt spilleren til tilskuerne
Move right
== Gå til højre
Movement
== Bevægelse
Mute when not active
== Ingen lyd når du ikke er aktiv
Name
== Navn
Name plates size
== Størrelse på navneskilte
Netversion:
== Netversion:
New name:
== Nyt navn:
News
== Nyheder
Next weapon
== Næste våben
Nickname
== Navn
No
== Nej
No password
== Ingen adgangskode
No servers found
== Ingen servere fundet
No servers match your filter criteria
== Ingen servere matcher din filterkriterier
Ok
== Ok
Open
== Åben
Parent Folder
== Overmappe
Password
== Adgangskode
Password incorrect
== Forkert adgangskode
Ping
== Ping
Pistol
== Pistol
Play
== Spil
Player
== Spiller
Player options
== Spillermuligheder
Players
== Spillere
Please balance teams!
== Balancer venligst holdet!
Prev. weapon
== Foregående våben
Quality Textures
== Kvalitetsteksturer
Quick search:
== Hurtig søg:
Quit
== Afslut
Quit anyway?
== Afslut alligevel?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Grund:
Record demo
== Optag demo
Red team
== Rødt hold
Red team wins!
== Rødt hold vinder!
Refresh
== Opdater
Refreshing master servers
== Opdaterer masterservere
Remote console
== Serverkonsol
Remove
== Fjern
Remove friend
== Fjern ven
Rename
== Omdøb navn
Rename demo
== Omdøb navn på demoen
Reset filter
== Nulstil filter
Reset to defaults
== Sæt til standard
Rifle
== Laser
Round
== Runde
Sample rate
== Sample frekvens
Sat.
== Mætning
Score
== Score
Score board
== Resultatliste
Score limit
== Score grænse
Scoreboard
== Resultatliste
Screenshot
== Skærmbillede
Server address:
== Serveradresse
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
Server not full
== Ikke fuld server
Settings
== Indstillinger
Shotgun
== Haglgevær
Show chat
== Vis chat
Show friends only
== Vis venner
Show ingame HUD
== Vis HUD i spillet
Show name plates
== Vis navneskilte
Show only supported
== Vis kun understøttede
Size:
== Størrelse:
Skins
== Udseende
Sound
== Lyd
Sound error
== Lyd fejl
Sound volume
== Lydstyrke
Spectate
== Kig på
Spectator mode
== Tilskuer mode
Spectators
== Tilskuer
Standard gametype
== Standard spilletype
Standard map
== Standard map
Stop record
== Stop optagelse
Sudden Death
== Sudden Death
Switch weapon on pickup
== Byt våben ved anskafning
Team
== Hold
Team chat
== Holdchat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworld %s er ude nu! Download den på www.teeworlds.com!
Texture Compression
== Teksturkompression
The audio device couldn't be initialised.
== Lydenheden kunne ikke startes
The server is running a non-standard tuning on a pure game type.
== Denne server kører på en ikke-standard tuning på en ren spilletype.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Der er en ikke-gemt bane i editoren, vil du gemme den før du afslutter?
Time limit
== Tidsbegrænsning
Time limit: %d min
== Tidsbegrænsning: %d min
Try again
== Forsøg igen
Type
== Type
Type:
== Type:
UI Color
== Brugergrænseflade farve
Unable to delete the demo
== Kunne ikke slette demoen
Unable to rename the demo
== Kunne ikke omdøbe demoen
Use sounds
== Anvend lydeffekter
Use team colors for name plates
== Anvend holdfarver til navneskilte
V-Sync
== V-Sync
Version
== Version
Version:
== Version:
Vote command:
== Afstemningsordre:
Vote description:
== Afstemningsbeskrivelse:
Vote no
== Stem nej
Vote yes
== Stem ja
Voting
== Afstemning
Warmup
== Opvarmning
Weapon
== Våben
Welcome to Teeworlds
== Velkommen til Teeworlds
Yes
== Ja
You must restart the game for all settings to take effect.
== Du skal genstarte spillet før alle indstillingerne virker.
Your skin
== Dit udseende
no limit
== Ingen grænse
Demofile: %s
== Demo fil: %s
Play background music
== Spil baggrunds musik
Player country:
== Spillernes land:
Spectate next
== Kig på næste
Spectate previous
== Kig på forrige
Strict gametype filter
== Streng spiltype filter
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d van %d Servers, %d spelers
%d%% loaded
== %d%% is geladen
%ds left
== %ds over
%i minute left
== nog %i minuut
%i minutes left
== nog %i minuten
%i second left
== nog %i seconde
%i seconds left
== nog %i seconden
%s wins!
== %s wint!
-Page %d-
== -Pagina %d-
Abort
== Afbreken
Add
== Toevoegen
Add Friend
== Voeg vriend toe
Address
== Adres
All
== Alle
Alpha
== Alpha
Always show name plates
== Altijd naamplaten laten zien
Are you sure that you want to delete the demo?
== Weet je zeker dat je de demo wil verwijderen?
Are you sure that you want to quit?
== Weet je zeker dat je wil stoppen?
Are you sure that you want to remove the player from your friends list?
== Weet je zeker dat je deze speler uit je vriendenlijst wilt verwijderen?
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.
== Omdat dit de eerste keer is dat je het spel opstart, moet je een bijnaam kiezen. Doe dat hieronder. Het is aanbevolen om de instellingen te controleren voordat je een spel start.
Automatically record demos
== Automatisch demo's opnemen
Automatically take game over screenshot
== Automatisch schermafbeeldingen nemen
Blue team
== Blauwe team
Blue team wins!
== Blauwe team wint!
Body
== Lichaam
Call vote
== Stem
Change settings
== Verander instellingen
Chat
== Chat
Clan
== Clan
Client
== Client
Close
== Sluiten
Compatible version
== Samenwerkende versie
Connect
== Verbinden
Connecting to
== Verbinden met
Connection Problems...
== Verbindingsproblemen...
Console
== Console
Controls
== Besturing
Count players only
== Tel alleen spelers
Country
== Land
Crc:
== Crc:
Created:
== Gemaakt:
Current
== Huidig
Current version: %s
== Huidige versie: %s
Custom colors
== Aangepaste kleuren
Delete
== Verwijder
Delete demo
== Verwijder demo
Demo details
== Demo details
Demofile: %s
== Demobestand: %s
Demos
== Demo's
Disconnect
== Stoppen
Disconnected
== Verbinding verbroken
Display Modes
== Laat modes zien
Downloading map
== Kaart downloaden
Draw!
== Gelijkspel!
Dynamic Camera
== Dynamische camera
Emoticon
== Emoticon
Enter
== Starten
Error
== Fout
Error loading demo
== Fout bij laden demo
FSAA samples
== FSAA samples
Favorite
== Favoriet
Favorites
== Favorieten
Feet
== Voeten
Filter
== Filter
Fire
== Schieten
Folder
== Map
Force vote
== Forceer stem
Free-View
== Vrij bewegen
Friends
== Vrienden
Fullscreen
== Volledig scherm
Game
== Spel
Game info
== Spelinfo
Game over
== Spel afgelopen
Game type
== Speltype
Game types:
== Speltypes:
General
== Algemeen
Graphics
== Beeld
Grenade
== Granaat
Hammer
== Hamer
Has people playing
== Mensen in server
High Detail
== Veel details
Hook
== Haak
Host address
== Server adres
Hue
== Tint
Info
== Info
Internet
== Internet
Invalid Demo
== Ongeldige demo
Join blue
== Ga bij blauw
Join game
== Binnenkomen
Join red
== Ga bij rood
Jump
== Springen
Kick player
== Kick speler
LAN
== LAN
Language
== Taal
Length:
== Lengte:
Lht.
== Licht
Loading
== Laden
MOTD
== MOTD
Map
== Kaart
Map:
== Kaart:
Max Screenshots
== Maximaal aantal schermafbeeldingen
Max demos
== Maximaal aantal demo's
Maximum ping:
== Hoogste ping:
Miscellaneous
== Diverse
Mouse sens.
== Muis resolutie
Move left
== Naar links
Move player to spectators
== Verplaats speler naar toeschouwers
Move right
== Naar rechts
Movement
== Bewegen
Mute when not active
== Dempen wanneer inactief
Name
== Naam
Name plates size
== Grootte naamplaat
Netversion:
== Netversie:
New name:
== Nieuwe naam:
News
== Nieuws
Next weapon
== Volgend wapen
Nickname
== Bijnaam
No
== Nee
No password
== Geen wachtwoord
No servers found
== Geen servers gevonden
No servers match your filter criteria
== Geen servers gevonden op zoekopdracht
Ok
== Oké
Open
== Open
Parent Folder
== Bovenliggende map
Password
== Wachtwoord
Password incorrect
== Wachtwoord verkeerd
Ping
== Ping
Pistol
== Pistool
Play
== Spelen
Play background music
== Speel achtergrondmuziek
Player
== Speler
Player country:
== Speler land:
Player options
== Speler opties
Players
== Spelers
Please balance teams!
== Balanceer teams!
Prev. weapon
== Vorig wapen
Quality Textures
== Structuurkwaliteit
Quick search:
== Snel zoeken:
Quit
== Afsluiten
Quit anyway?
== Toch afsluiten?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Reden:
Record demo
== Neem demo op
Red team
== Rode team
Red team wins!
== Rode team wint!
Refresh
== Vernieuwen
Refreshing master servers
== Masterservers vernieuwen
Remote console
== Remote console
Remove
== Verwijderen
Remove friend
== Verwijder vriend
Rename
== Hernoem
Rename demo
== Hernoem demo
Reset filter
== Herstel filter
Reset to defaults
== Standaardinstellingen
Rifle
== Laser
Round
== Ronde
Sample rate
== Voorbeeldssnelheid
Sat.
== Verz.
Score
== Score
Score board
== Score bord
Score limit
== Score limiet
Scoreboard
== Scorebord
Screenshot
== Schermafbeelding
Server address:
== Serveradres:
Server details
== Serverdetails
Server filter
== Serverfilter
Server info
== Serverinfo
Server not full
== Server niet vol
Settings
== Instellingen
Shotgun
== Geweer
Show chat
== Laat chat zien
Show friends only
== Laat vrienden zien
Show ingame HUD
== Laat ingame HUD zien
Show name plates
== Laat naamplaat zien
Show only supported
== Laat alleen compatibele servers zien
Size:
== Grootte:
Skins
== Skins
Sound
== Geluid
Sound error
== Geluidsfout
Sound volume
== Volume
Spectate
== Toekijken
Spectate next
== Volg volgende speler
Spectate previous
== Volg vorige speler
Spectator mode
== Toeschouwer modus
Spectators
== Toeschouwers
Standard gametype
== Standaard speltype
Standard map
== Standaard kaart
Stop record
== Stop met opnemen
Strict gametype filter
== Strikt speltype filter
Sudden Death
== Sudden Death
Switch weapon on pickup
== Verander wapen bij het oppakken
Team
== Team
Team chat
== Team chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s is uit! Download het op www.teeworlds.com!
Texture Compression
== Structuurscompressie
The audio device couldn't be initialised.
== Het geluid kon niet worden geladen.
The server is running a non-standard tuning on a pure game type.
== The server draait geen standaard spel type.
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.
Time limit
== Tijdslimiet
Time limit: %d min
== Tijdslimiet: %d minuten
Try again
== Probeer opnieuw
Type
== Type
Type:
== Type:
UI Color
== UI kleur
Unable to delete the demo
== Demo kon niet worden verwijderd
Unable to rename the demo
== Niet mogelijk om de demo te hernoemen
Use sounds
== Gebruik geluid
Use team colors for name plates
== Gebruik teamkleuren voor naamplaten
V-Sync
== V-Sync
Version
== Versie
Version:
== Versie:
Vote command:
== Stem commando:
Vote description:
== Stem omschrijving:
Vote no
== Stem nee
Vote yes
== Stem ja
Voting
== Stemmen
Warmup
== Opwarmen
Weapon
== Wapen
Welcome to Teeworlds
== Welkom bij Teeworlds
Yes
== Ja
You must restart the game for all settings to take effect.
== U moet het spel herstarten voordat de veranderingen effect hebben.
Your skin
== Jouw skin
no limit
== ongelimiteerd
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d tavua
%d of %d servers, %d players
== %d/%d palvelinta, %d pelaajaa
%d%% loaded
== %d%% ladattu
%ds left
== %ds jäljellä
%i minute left
== %i minuutti jäljellä
%i minutes left
== %i minuuttia jäljellä
%i second left
== %i sekunti jäljellä
%i seconds left
== %i sekuntia jäljellä
%s wins!
== %s voitti!
-Page %d-
== -Sivu %d-
Abort
== Keskeytä
Add
== Lisää
Add Friend
== Lisää ystävä
Address
== Osoite
All
== Kaikki
Alpha
== Alfa
Always show name plates
== Näytä nimikyltit aina
Are you sure that you want to delete the demo?
== Oletko varma, että haluat poistaa demon?
Are you sure that you want to quit?
== Oletko varma, että haluat lopettaa?
Are you sure that you want to remove the player from your friends list?
== Oletko varma, että haluat poistaa pelaajan ystävälistaltasi?
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.
== Tämä on ensimmäinen kerta kun käynnistät pelin, ole hyvä ja kirjoita nimimerkkisi alle. On suositeltua, että tarkistat asetukset ja muutat niitä mielesi mukaan ennen kuin liityt palvelimille.
Automatically record demos
== Nauhoita demot automaattisesti
Automatically take game over screenshot
== Ota pelin jälkeinen kuvankaappaus autom.
Blue team
== Sininen joukkue
Blue team wins!
== Sininen joukkue voitti!
Body
== Vartalo
Call vote
== Aloita äänestys
Change settings
== Muuta asetuksia
Chat
== Chatti
Clan
== Klaani
Client
== Asiakasohjelma
Close
== Sulje
Compatible version
== Yhteensopiva versio
Connect
== Yhdistä
Connecting to
== Yhdistetään
Connection Problems...
== Yhteysongelmia...
Console
== Konsoli
Controls
== Kontrollit
Count players only
== Laske vain pelaajat
Country
== Maa
Crc:
== Crc:
Created:
== Luotu:
Current
== Nykyinen
Current version: %s
== Nykyinen versio: %s
Custom colors
== Omat värit
Delete
== Poista
Delete demo
== Poista demo
Demo details
== Demon tiedot
Demofile: %s
== Demotiedosto: %s
Demos
== Demot
Disconnect
== Katk. yhteys
Disconnected
== Yhteys katkaistu
Display Modes
== Näyttötilat
Downloading map
== Ladataan kenttää
Draw!
== Tasapeli!
Dynamic Camera
== Dynaaminen kamera
Emoticon
== Hymiö
Enter
== Jatka
Error
== Virhe
Error loading demo
== Virhe ladattaessa demoa
FSAA samples
== FSAA näytteet
Favorite
== Suosikki
Favorites
== Suosikit
Feet
== Jalat
Filter
== Suotimet
Fire
== Ammu
Folder
== Kansio
Force vote
== Päätä äänestys
Free-View
== Vapaa näkymä
Friends
== Ystävät
Fullscreen
== Koko näyttö
Game
== Peli
Game info
== Pelin tiedot
Game over
== Peli loppui
Game type
== Pelityyppi
Game types:
== Pelityypit:
General
== Yleinen
Graphics
== Grafiikat
Grenade
== Kranaatti
Hammer
== Nuija
Has people playing
== Ihmisiä pelaamassa
High Detail
== Korkea yksityiskohtataso
Hook
== Koukku
Host address
== Palvelimen osoite
Hue
== Värisävy
Info
== Info
Internet
== Internet
Invalid Demo
== Epäkelpo demo
Join blue
== Liity sinisiin
Join game
== Liity peliin
Join red
== Liity punaisiin
Jump
== Hyppää
Kick player
== Potkaise pelaaja
LAN
== LAN
Language
== Kieli
Length:
== Pituus:
Lht.
== Valoisuus
Loading
== Ladataan
MOTD
== Palvelimen viesti
Map
== Kenttä
Map:
== Kenttä:
Max Screenshots
== Kuvankaappausmaksimi
Max demos
== Demomaksimi
Maximum ping:
== Maksimiping:
Miscellaneous
== Sekalaista
Mouse sens.
== Hiiren herkkyys
Move left
== Liiku vasemmalle
Move player to spectators
== Siirrä pelaaja katsojaksi
Move right
== Liiku oikealle
Movement
== Liike
Mute when not active
== Mykistä, kun ei aktiivinen
Name
== Nimi
Name plates size
== Nimikylttien koko
Netversion:
== Yhteysversio:
New name:
== Uusi nimi:
News
== Uutiset
Next weapon
== Seuraava ase
Nickname
== Nimimerkki
No
== Ei
No password
== Ei salasanaa
No servers found
== Palvelimia ei löytynyt
No servers match your filter criteria
== Yksikään palvelin ei täyttänyt suodinkriteerejäsi
Ok
== Ok
Open
== Avaa
Parent Folder
== Yläkansio
Password
== Salasana
Password incorrect
== Väärä salasana
Ping
== Ping
Pistol
== Pistooli
Play
== Toista
Play background music
== Soita taustamusiikki
Player
== Pelaaja
Player country:
== Pelaajan maa:
Player options
== Pelaajavalinnat
Players
== Pelaajat
Please balance teams!
== Ole hyvä ja tasoita joukkueita!
Prev. weapon
== Edellinen ase
Quality Textures
== Hyvälaatuiset tekstuurit
Quick search:
== Pikahaku:
Quit
== Lopeta
Quit anyway?
== Lopeta siitä huolimatta?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Syy:
Record demo
== Nauhoita demo
Red team
== Punainen joukkue
Red team wins!
== Punainen joukkue voitti!
Refresh
== Päivitä
Refreshing master servers
== Päivitetään isäntäpalvelimia
Remote console
== Etäkonsoli
Remove
== Poista
Remove friend
== Poista ystävä
Rename
== Nimeä
Rename demo
== Uudelleennimeä demo
Reset filter
== Nollaa suotimet
Reset to defaults
== Palaa oletusasetuksiin
Rifle
== Kivääri
Round
== Kierros
Sample rate
== Näytteenottotaajuus
Sat.
== Kyllästys
Score
== Pisteet
Score board
== Tulostaulu
Score limit
== Pisteraja
Scoreboard
== Tuloslista
Screenshot
== Kuvankaappaus
Server address:
== Palvelimen osoite:
Server details
== Palvelimen yksityiskohdat
Server filter
== Palvelinsuotimet
Server info
== Palvelintiedot
Server not full
== Palvelin ei täysi
Settings
== Asetukset
Shotgun
== Haulikko
Show chat
== Näytä chatti
Show friends only
== Näytä vain ystävät
Show ingame HUD
== Näytä peli-HUD
Show name plates
== Näytä nimikyltit
Show only supported
== Näytä vain tuetut
Size:
== Koko:
Skins
== Ulkonäkö
Sound
== Äänet
Sound error
== Äänivirhe
Sound volume
== Äänenvoimakkuus
Spectate
== Katso
Spectate next
== Katso seuraavaa
Spectate previous
== Katso edellistä
Spectator mode
== Katsojatila
Spectators
== Katsojat
Standard gametype
== Standardipelityyppi
Standard map
== Standardikenttä
Stop record
== Lopeta nauhoit.
Strict gametype filter
== Tarkka pelityyppisuodin
Sudden Death
== Äkkikuolema
Switch weapon on pickup
== Vaihda asetta nostaessasi uuden
Team
== Joukkue
Team chat
== Joukkuechatti
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s on julkaistu! Lataa se osoitteesta www.teeworlds.com!
Texture Compression
== Tekstuuripakkaus
The audio device couldn't be initialised.
== Äänilaitteen alustaminen ei onnistunut.
The server is running a non-standard tuning on a pure game type.
== Tämä palvelin ajaa ei-standardeja virityksiä standardipelityypillä.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Editorissa on tallentamaton kenttä, saatat haluta tallentaa sen ennen kuin lopetat pelin.
Time limit
== Aikaraja
Time limit: %d min
== Aikaraja: %d min
Try again
== Yritä uudelleen
Type
== Tyyppi
Type:
== Tyyppi:
UI Color
== Käyttöliittymäväri
Unable to delete the demo
== Demon poistaminen ei onnistunut
Unable to rename the demo
== Demon nimeäminen ei onnistunut
Use sounds
== Käytä ääniefektejä
Use team colors for name plates
== Käytä joukkueiden värejä nimikylteissä
V-Sync
== V-Sync
Version
== Versio
Version:
== Versio:
Vote command:
== Äänestyskäsky:
Vote description:
== Äänestyksen kuvaus:
Vote no
== Äänestä ei
Vote yes
== Äänestä kyllä
Voting
== Äänestys
Warmup
== Lämmittely
Weapon
== Ase
Welcome to Teeworlds
== Tervetuloa Teeworldsiin
Yes
== Kyllä
You must restart the game for all settings to take effect.
== Sinun täytyy uudelleenkäynnistää peli, jotta kaikki asetukset tulisivat voimaan.
Your skin
== Sinun ulkonäkösi
no limit
== ei rajaa
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d octets
%d of %d servers, %d players
== %d/%d serveurs, %d joueurs
%d%% loaded
== %d%% chargé
%ds left
== %ds restantes
%i minute left
== %i minute restante
%i minutes left
== %i minutes restantes
%i second left
== %i seconde restante
%i seconds left
== %i secondes restantes
%s wins!
== %s gagne !
-Page %d-
== -Page %d-
Abort
== Annuler
Add
== Ajouter
Add Friend
== Ajouter aux amis
Address
== Adresse
All
== Tout le monde
Alpha
== Alpha
Always show name plates
== Toujours afficher les pseudonymes
Are you sure that you want to delete the demo?
== Êtes-vous sûr de vouloir supprimer cette démo ?
Are you sure that you want to quit?
== Êtes-vous sûr de vouloir quitter ?
Are you sure that you want to remove the player from your friends list?
== Êtes-vous sûr de vouloir enlever le joueur de votre liste d'amis ?
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.
== Comme c'est la première fois que vous lancez le jeu, veuillez entrer votre pseudonyme ci-dessous. Vous devriez vérifier les réglages et les ajuster avant de rejoindre un serveur.
Automatically record demos
== Enregistrer automatiquement une démo
Automatically take game over screenshot
== Sauvegarder les résultats à la fin de la partie
Blue team
== Équipe bleue
Blue team wins!
== L'équipe bleue gagne !
Body
== Corps
Call vote
== Voter
Change settings
== Changer les options
Chat
== Chat
Clan
== Clan
Client
== Client
Close
== Fermer
Compatible version
== Version compatible
Connect
== Connecter
Connecting to
== Connexion à
Connection Problems...
== Problèmes de connexion...
Console
== Console
Controls
== Contrôles
Count players only
== Seulement les joueurs
Country
== Pays
Crc:
== Crc :
Created:
== Créé le :
Current
== Actuellement
Current version: %s
== Version actuelle : %s
Custom colors
== Couleurs personnalisées
Delete
== Supprimer
Delete demo
== Supprimer la démo
Demo details
== Détails de la démo
Demofile: %s
== Démo : %s
Demos
== Démos
Disconnect
== Partir
Disconnected
== Déconnecté
Display Modes
== Résolutions
Downloading map
== Téléchargement de la carte
Draw!
== Égalité !
Dynamic Camera
== Caméra dynamique
Emoticon
== Émoticônes
Enter
== Démarrer
Error
== Erreur
Error loading demo
== Erreur pendant le chargement de la démo
FSAA samples
== Échantillons FSAA
Favorite
== Favori
Favorites
== Favoris
Feet
== Pieds
Filter
== Filtre
Fire
== Tirer
Folder
== Dossier
Force vote
== Forcer le vote
Free-View
== Vue libre
Friends
== Amis
Fullscreen
== Plein écran
Game
== Jeu
Game info
== Info. jeu
Game over
== Fin de la partie
Game type
== Type de jeu
Game types:
== Types de jeu :
General
== Général
Graphics
== Affichage
Grenade
== Lance-grenade
Hammer
== Maillet
Has people playing
== Au moins un joueur
High Detail
== Tous les détails
Hook
== Grappin
Host address
== Adresse hôte
Hue
== Teinte
Info
== Info.
Internet
== Internet
Invalid Demo
== Démo invalide
Join blue
== Rej. Bleus
Join game
== Rejoindre
Join red
== Rej. Rouges
Jump
== Sauter
Kick player
== Éjecter un joueur
LAN
== LAN
Language
== Langue
Length:
== Longueur :
Lht.
== Luminosité
Loading
== Chargement
MOTD
== MOTD
Map
== Carte
Map:
== Carte :
Max Screenshots
== Nombre maximum de captures d'écran
Max demos
== Nombre maximum de démos
Maximum ping:
== Ping maximum :
Miscellaneous
== Divers
Mouse sens.
== Sensib. souris
Move left
== Aller à gauche
Move player to spectators
== Déplacer le joueur dans les spectateurs
Move right
== Aller à droite
Movement
== Mouvement
Mute when not active
== Rendre muet en cas d'inactivité
Name
== Nom
Name plates size
== Taille
Netversion:
== Netversion :
New name:
== Nouveau nom :
News
== Nouvelles
Next weapon
== Arme suivante
Nickname
== Pseudonyme
No
== Non
No password
== Pas de mot de passe
No servers found
== Aucun serveur trouvé
No servers match your filter criteria
== Aucun serveur ne correspond à vos critères
Ok
== Ok
Open
== Ouvrir
Parent Folder
== Dossier parent
Password
== Mot de passe
Password incorrect
== Mot de passe incorrect
Ping
== Ping
Pistol
== Pistolet
Play
== Jouer
Play background music
== Jouer la musique de fond
Player
== Joueur
Player country:
== Nation joueurs :
Player options
== Joueurs
Players
== Joueurs
Please balance teams!
== Équilibrez les équipes !
Prev. weapon
== Arme précédente
Quality Textures
== Textures haute qualité
Quick search:
== Recherche rapide :
Quit
== Quitter
Quit anyway?
== Quitter quand même ?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Raison :
Record demo
== Enregistrer
Red team
== Équipe rouge
Red team wins!
== L'équipe rouge gagne !
Refresh
== Rafraîchir
Refreshing master servers
== Rafraîchissement des serveurs maîtres
Remote console
== Console serveur
Remove
== Enlever
Remove friend
== Enlever des amis
Rename
== Renommer
Rename demo
== Renommer la démo
Reset filter
== Filtres par défaut
Reset to defaults
== Réinitialiser
Rifle
== Laser
Round
== Round
Sample rate
== Fréquence
Sat.
== Saturation
Score
== Score
Score board
== Scores
Score limit
== Score limite
Scoreboard
== Scores
Screenshot
== Capture d'écran
Server address:
== Addresse :
Server details
== Détails du serveur
Server filter
== Filtres
Server info
== Info. serveur
Server not full
== Pas de serveurs pleins
Settings
== Options
Shotgun
== Fusil à pompe
Show chat
== Montrer le chat
Show friends only
== Montrer les amis
Show ingame HUD
== Afficher l'interface du jeu
Show name plates
== Montrer les pseudonymes
Show only supported
== Ne montrer que les résolutions supportées
Size:
== Taille :
Skins
== Skins
Sound
== Son
Sound error
== Erreur de son
Sound volume
== Volume du son
Spectate
== Regarder
Spectate next
== Suivre suivant
Spectate previous
== Suivre précédent
Spectator mode
== Menu spectateur
Spectators
== Spectateurs
Standard gametype
== Types de jeu standards
Standard map
== Cartes standards
Stop record
== Arrêter
Strict gametype filter
== Types de jeu exacts
Sudden Death
== Mort Subite
Switch weapon on pickup
== Sélectionner l'arme ramassée
Team
== Équipe
Team chat
== Chat équipe
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s est sorti ! Téléchargez-le sur www.teeworlds.com !
Texture Compression
== Compression des textures
The audio device couldn't be initialised.
== Le périphérique audio n'a pas pu être initialisé.
The server is running a non-standard tuning on a pure game type.
== Le serveur utilise des paramètres non standards sur un type de jeu standard.
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.
Time limit
== Temps limite
Time limit: %d min
== Temps limite : %d min
Try again
== Réessayer
Type
== Type
Type:
== Type :
UI Color
== Couleur du menu
Unable to delete the demo
== Impossible de supprimer la démo
Unable to rename the demo
== Impossible de renommer la démo
Use sounds
== Jouer les sons
Use team colors for name plates
== Utiliser la couleur des équipes
V-Sync
== V-Sync
Version
== Version
Version:
== Version :
Vote command:
== Commande :
Vote description:
== Description :
Vote no
== Voter non
Vote yes
== Voter oui
Voting
== Vote
Warmup
== Échauffement
Weapon
== Arme
Welcome to Teeworlds
== Bienvenue dans Teeworlds
Yes
== Oui
You must restart the game for all settings to take effect.
== Les changements prendront effet au prochain redémarrage.
Your skin
== Votre skin
no limit
== pas de limite
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d von %d Servern, %d Spieler
%d%% loaded
== %d%% geladen
%ds left
== Noch %ds
%i minute left
== Noch %i Minute
%i minutes left
== Noch %i Minuten
%i second left
== Noch %i Sekunde
%i seconds left
== Noch %i Sekunden
%s wins!
== %s gewinnt!
-Page %d-
== -Seite %d-
Abort
== Abbrechen
Add
== Hinzufügen
Add Friend
== Freund hinzufügen
Address
== Adresse
All
== Alle
Alpha
== Alpha
Always show name plates
== Spielernamen immer anzeigen
Are you sure that you want to delete the demo?
== Möchtest du die Aufnahme wirklich löschen?
Are you sure that you want to quit?
== Bist du sicher, dass du beenden möchtest?
Are you sure that you want to remove the player from your friends list?
== Bist du sicher, dass du diesen Spieler aus deiner Freundesliste entfernen möchtest?
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.
== Da dies der erste Start des Spiels ist, gib bitte unten deinen Namen ein. Es wird empfohlen die Einstellungen zu überprüfen, um sie deinen Vorstellungen anzupassen, bevor du einem Server beitrittst.
Automatically record demos
== Automatisch Aufnahmen erstellen
Automatically take game over screenshot
== Autom. ein Bild vom Spielergebnis erstellen
Blue team
== Blaues Team
Blue team wins!
== Blaues Team gewinnt!
Body
== Körper
Call vote
== Abstimmen
Change settings
== Einstellungen ändern
Chat
== Chat
Clan
== Clan
Client
== Client
Close
== Schließ.
Compatible version
== Kompatible Version
Connect
== Verbinden
Connecting to
== Verbinden mit
Connection Problems...
== Verbindungsprobleme...
Console
== Konsole
Controls
== Steuerung
Count players only
== Nur Spieler zählen
Country
== Land
Crc:
== Prüfsumme:
Created:
== Erstellt:
Current
== Aktuell
Current version: %s
== Aktuelle Version: %s
Custom colors
== Eigene Farben
Delete
== Löschen
Delete demo
== Aufnahme löschen
Demo details
== Aufnahmendetails:
Demofile: %s
== Demodatei: %s
Demos
== Aufnahm.
Disconnect
== Trennen
Disconnected
== Verbindung getrennt
Display Modes
== Auflösungen
Downloading map
== Karte herunterladen
Draw!
== Unentschieden!
Dynamic Camera
== Dynamische Kamera
Emoticon
== Emoticon
Enter
== Starten
Error
== Fehlgeschlagen
Error loading demo
== Fehler beim Laden der Aufnahme, die Datei ist ungültig.
FSAA samples
== Vollbild Anti-Aliasing
Favorite
== Favorit
Favorites
== Favoriten
Feet
== Füße
Filter
== Filter
Fire
== Feuern
Folder
== Ordner
Force vote
== Erzwingen
Free-View
== Freie Ansicht
Friends
== Freunde
Fullscreen
== Vollbild
Game
== Spiel
Game info
== Spielinfo
Game over
== Spiel vorbei
Game type
== Spieltyp
Game types:
== Spieltypen:
General
== Allgemein
Graphics
== Grafik
Grenade
== Granate
Hammer
== Hammer
Has people playing
== Server nicht leer
High Detail
== Hohe Details
Hook
== Haken
Host address
== Serveradresse
Hue
== Farb.
Info
== Info
Internet
== Internet
Invalid Demo
== Ungültige Aufnahme
Join blue
== zu Blau
Join game
== Beitreten
Join red
== zu Rot
Jump
== Springen
Kick player
== Spieler kicken
LAN
== LAN
Language
== Sprache
Length:
== Länge
Lht.
== Hell.
Loading
== Laden
MOTD
== Nachricht des Tages
Map
== Karte
Map:
== Karte:
Max Screenshots
== Maximale Anzahl an Bildschirmfotos
Max demos
== Maximale Anzahl an Aufnahmen
Maximum ping:
== Maximaler Ping:
Miscellaneous
== Verschiedenes
Mouse sens.
== Maus-Empfindl.
Move left
== Nach links
Move player to spectators
== Spieler zu Zuschauer machen
Move right
== Nach rechts
Movement
== Bewegungen
Mute when not active
== Stumm, wenn inaktiv
Name
== Name
Name plates size
== Größe der Spielernamen
Netversion:
== Netversion:
New name:
== Neuer Name:
News
== News
Next weapon
== Nächste Waffe
Nickname
== Spitzname
No
== Nein
No password
== Kein Passwort
No servers found
== Keine Server gefunden
No servers match your filter criteria
== Kein Server entspricht den Kriterien
Ok
== OK
Open
== Öffnen
Parent Folder
== Übergeordneter Ordner
Password
== Passwort
Password incorrect
== Passwort falsch
Ping
== Ping
Pistol
== Pistole
Play
== Abspielen
Play background music
== Hintergrundmusik abspielen
Player
== Spieler
Player country:
== Spielerland:
Player options
== Spieleroptionen
Players
== Spieler
Please balance teams!
== Bitte Teams ausgleichen!
Prev. weapon
== Vorherige Waffe
Quality Textures
== Hochauflösende Texturen
Quick search:
== Schnellsuche:
Quit
== Beenden
Quit anyway?
== Trotzdem beenden?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Grund:
Record demo
== Aufnahme sta.
Red team
== Rotes team
Red team wins!
== Rotes Team gewinnt!
Refresh
== Erneuern
Refreshing master servers
== Aktualisiere Masterserver
Remote console
== Remotekonsole
Remove
== Löschen
Remove friend
== Freund entfernen
Rename
== Umbenennen
Rename demo
== Aufnahme umbenennen
Reset filter
== Standardfilter
Reset to defaults
== Standardeinstellung
Rifle
== Laser
Round
== Runde
Sample rate
== Abtastrate
Sat.
== Sätt.
Score
== Score
Score board
== Punktetafel
Score limit
== Punktelimit
Scoreboard
== Punktetafel
Screenshot
== Bildschirmfoto
Server address:
== Serveradresse:
Server details
== Serverdetails
Server filter
== Filter
Server info
== Serverinfo
Server not full
== Server nicht voll
Settings
== Optionen
Shotgun
== Schrotflinte
Show chat
== Chat anzeigen
Show friends only
== Nur Freunde zeigen
Show ingame HUD
== Spielanzeigen
Show name plates
== Zeige Namen
Show only supported
== Zeige nur unterstützte
Size:
== Größe:
Skins
== Skins
Sound
== Ton
Sound error
== Audiofehler
Sound volume
== Lautstärke
Spectate
== Zuschauen
Spectate next
== Nächstem zusehen
Spectate previous
== Vorherigem zusehen
Spectator mode
== Zuschaueroptionen
Spectators
== Zuschauer
Standard gametype
== Standard-Spieltyp
Standard map
== Standardkarte
Stop record
== Aufnahme be.
Strict gametype filter
== Genauer Spieltyp
Sudden Death
== Sudden Death
Switch weapon on pickup
== Waffe beim Aufnehmen wechseln
Team
== Team
Team chat
== Teamchat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworld %s ist da! Lade es unter www.teeworlds.com runter!
Texture Compression
== Texturkompression
The audio device couldn't be initialised.
== 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.
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.
Time limit
== Zeitlimit
Time limit: %d min
== Zeitlimit: %d min
Try again
== Nochmal versuchen
Type
== Typ
Type:
== Typ:
UI Color
== Menüfarbe
Unable to delete the demo
== Aufnahme konnte nicht gelöscht werden
Unable to rename the demo
== Aufnahme konnte nicht umbenannt werden
Use sounds
== Aktiviere Ton
Use team colors for name plates
== Nutze Teamfarben für Spielernamen
V-Sync
== V-Sync
Version
== Version
Version:
== Version:
Vote command:
== Kommando:
Vote description:
== Beschreibung:
Vote no
== Nein
Vote yes
== Ja
Voting
== Abstimmung
Warmup
== Aufwärmen
Weapon
== Waffe
Welcome to Teeworlds
== Willkommen bei Teeworlds
Yes
== Ja
You must restart the game for all settings to take effect.
== Du musst das Spiel neustarten um die Änderungen zu übernehmen.
Your skin
== Dein Skin
no limit
== Keine Begrenzung
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bit
%d of %d servers, %d players
== %d Szerver, %d Játékos
%d%% loaded
== %d%% betöltve
%ds left
== %ds vissza
%i minute left
== %i perc vissza
%i minutes left
== %i perc vissza
%i second left
== %i másodperc vissza
%i seconds left
== %i másodperc vissza
%s wins!
== %s nyert!
-Page %d-
== -oldal %d-
Abort
== Mégse
Add
== Hozzáad
Add Friend
== Hozzáad barátot
Address
== Cím
All
== Mindenki
Alpha
== Alpha
Always show name plates
== Mindig mutassa a névtáblát
Are you sure that you want to delete the demo?
== Biztos hogy le akarod törölni a demót?
Are you sure that you want to quit?
== Biztos hogy ki akarsz lépni?
Are you sure that you want to remove the player from your friends list?
== Biztos vagy benne hogy ki akarod törölni a játékost a barátok listájáról?
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.
== Mivel ez az első alkalom hogy elindítottad ezt a játékot, kérlekk add meg a neved!
Automatically record demos
== Magától rögzítse a demókat
Automatically take game over screenshot
== Magától készítsen a játék végén képet
Blue team
== Kék csapat
Blue team wins!
== A kék csapat nyert!
Body
== Test
Call vote
== Szavazás
Change settings
== Beállítások átállítása
Chat
== Chat
Clan
== Klán
Client
== Kliens
Close
== Bezárás
Compatible version
== Kompatibilis Verzió
Connect
== Csatlakozás
Connecting to
== Csatlakozás a
Connection Problems...
== Csatlakozási problémák...
Console
== Konzol
Controls
== Irányítás
Count players only
== Csak számontartott játékosok
Country
== Ország
Crc:
== Crc:
Created:
== Készítette:
Current
== Aktuális
Current version: %s
== Aktuális verzió: %s
Custom colors
== Egyéni színek
Delete
== Törlés
Delete demo
== Demó törlése
Demo details
== Információk a demóról
Demos
== Demók
Disconnect
== Szerver elhagyása
Disconnected
== Kilépett
Display Modes
== Kijelző módok
Downloading map
== Pálya letöltése
Draw!
== Rajzolj!
Dynamic Camera
== Dinamikus kamera
Emoticon
== Hangulatjel
Enter
== Belépés
Error
== Hiba
Error loading demo
== Hiba a demó betöltésében
FSAA samples
== FSAA mintáku
Favorite
== Kedvenc
Favorites
== Kedvencek
Feet
== Láb
Filter
== Szűrő
Fire
== Tűz
Folder
== Mappa
Force vote
== Különleges szavazás
Free-View
== Szabad-nézet
Friends
== Barátok
Fullscreen
== Teljesképernyő
Game
== Játék
Game info
== Játék infó
Game over
== Játék vége
Game type
== Játék fajtája
Game types:
== Játék fajtái:
General
== Általános
Graphics
== Grafika
Grenade
== Gránát
Hammer
== Kalapács
Has people playing
== Játékos játszik
High Detail
== Jó részletek
Hook
== Horog
Host address
== Szerver címe
Hue
== Színárnyalat
Info
== Infó
Internet
== Internet
Invalid Demo
== Érvénytelen demó
Join blue
== Kékhez lépés
Join game
== Csatlakozás a játékhoz
Join red
== Piroshoz lépés
Jump
== Ugrás
Kick player
== Játékos kirúgása
LAN
== Helyi
Language
== Nyelv
Length:
== Hossza:
Lht.
== Lht.
Loading
== Betöltés
MOTD
== Napi üzenet
Map
== Pálya
Map:
== Pálya:
Max Screenshots
== Maximum Fotó
Max demos
== Maximum Demó
Maximum ping:
== Maximum Ping:
Miscellaneous
== Vegyes
Mouse sens.
== Egér érzékenysége
Move left
== Balra lépés
Move player to spectators
== Megfigyelő lett
Move right
== Jobbra lépés
Movement
== Mozgás
Mute when not active
== Letiltás ha nem aktív
Name
== Név
Name plates size
== Névtáblák mérete
Netversion:
== Netes verzió:
New name:
== Új Név:
News
== Hírek
Next weapon
== Következő fegyver
Nickname
== Becenév
No
== Nem
No password
== Jelszó nélküli
No servers found
== Nem talált szervereket
No servers match your filter criteria
== Nincs szerver a szűrőfeltételeidhez
Ok
== Oké
Open
== Megnyit
Parent Folder
== Szülői mappa
Password
== Jelszó
Password incorrect
== Helytelen jelszó
Ping
== Ping
Pistol
== Pisztoly
Play
== Játék
Player
== Játékos
Player options
== Játékos beállításai
Players
== Játékosok
Please balance teams!
== Kérlek egyenlítsd ki a csapatokat!
Prev. weapon
== Előző fegyver
Quality Textures
== Minőségi kidolgozás
Quick search:
== Gyors keresés:
Quit
== Kilépés
Quit anyway?
== Mindenképpen kilép?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Indok:
Record demo
== Demó felvétele
Red team
== Piros csapat
Red team wins!
== A piros csapat nyert!
Refresh
== Újratöltés
Refreshing master servers
== A master szerverek frissítése
Remote console
== Távoli konzol
Remove
== Eltávolítás
Remove friend
== Barát eltávolítása
Rename
== Átnevezés
Rename demo
== Demó átnevezése
Reset filter
== Szűrő visszaállítása
Reset to defaults
== Visszaállítás az alapértelmezettre
Rifle
== Lézer
Round
== Menet
Sample rate
== Mintavételi frekvencia
Sat.
== Sat.
Score
== Pontszám
Score board
== Pontszám tábla
Score limit
== Ponthatár
Scoreboard
== Pontszámtábla
Screenshot
== Pillanatkép
Server address:
== Szerver címe:
Server details
== Szerver részletei
Server filter
== Szerver szűrő
Server info
== Szerver infó
Server not full
== Szerver nincs tele
Settings
== Beállítások
Shotgun
== Sörétes puska
Show chat
== Chat mutatása
Show friends only
== Barátok mutatása
Show ingame HUD
== Játék közbeni HUD mutatása
Show name plates
== Név táblák mutatása
Show only supported
== Csak támogatott mutatása
Size:
== Méret:
Skins
== Skinek
Sound
== Hang
Sound error
== Hang hiba
Sound volume
== Hangerő
Spectate
== Megfigyelés
Spectator mode
== Néző mód
Spectators
== Megfigyelők
Standard gametype
== Általános játékfajta
Standard map
== Általános pálya
Stop record
== Felvétel megállítása
Sudden Death
== Gyors halál
Switch weapon on pickup
== Fegyverváltás felvételnél
Team
== Csapat
Team chat
== Csapat chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s kint van! Töltsd le www.teeworlds.com oldalon!
Texture Compression
== Textúra tömörítés
The audio device couldn't be initialised.
== A hangeszköz nem kezdeményezhető.
The server is running a non-standard tuning on a pure game type.
== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Van egy mentett térkép a szerkesztőben, talán akarod menteni, mielőtt kilépsz a játékból.
Time limit
== Időhatár
Time limit: %d min
== Időhatár: %d perc
Try again
== Próbáld újra
Type
== Típus
Type:
== Típus:
UI Color
== UI Szín
Unable to delete the demo
== Nem sikerült törölni a demó
Unable to rename the demo
== Nem sikerült átnevezni a demó
Use sounds
== Hangok használata
Use team colors for name plates
== Csapat szín használata név tábláknál
V-Sync
== V-Sync
Version
== Verzió
Version:
== Verzió:
Vote command:
== Szavazás parancsa:
Vote description:
== Szavazás leírása:
Vote no
== Nem
Vote yes
== Igen
Voting
== Szavazás
Warmup
== Kezdés
Weapon
== Fegyver
Welcome to Teeworlds
== Üdvözöljük a Teeworlds-ben
Yes
== Igen
You must restart the game for all settings to take effect.
== Újra kell indítani a játékot, a beállítások érvénybe lépéséhez.
Your skin
== Te skined
no limit
== Nincs korlát
##### needs translation #####
Demofile: %s
==
Play background music
==
Player country:
==
Spectate next
==
Spectate previous
==
Strict gametype filter
==
##### old translations #####

View file

@ -1,94 +0,0 @@
##### language indices #####
belarusian
== Беларуская
== 112
bosnian
== Bosanski
== 70
brazilian_portuguese
== Português brasileiro
== 76
bulgarian
== Български
== 100
czech
== Česky
== 203
danish
== Dansk
== 208
dutch
== Nederlands
== 528
finnish
== Suomi
== 246
french
== Français
== 250
german
== Deutsch
== 276
hungarian
== Magyar
== 348
italian
== Italiano
== 380
norwegian
== Norsk
== 578
polish
== Polski
== 616
portuguese
== Português
== 620
romanian
== Română
== 642
russian
== Русский
== 643
serbian
== Srpski
== 688
slovak
== Slovensky
== 703
spanish
== Español
== 724
swedish
== Svenska
== 752
turkish
== Türkçe
== 792
ukrainian
== Українська
== 804

View file

@ -1,682 +0,0 @@
##### translated strings #####
%d Bytes
== %d byte
%d of %d servers, %d players
== %d di %d server, %d giocatori
%d%% loaded
== %d%% caricato
%ds left
== %ds sec.
%i minute left
== %i minuto rimanente
%i minutes left
== %i minuti rimanenti
%i second left
== %i secondo rimanente
%i seconds left
== %i secondi rimanenti
%s wins!
== %s ha vinto!
-Page %d-
== -Pagina %d-
Abort
== Annulla
Add
== Aggiungi
Add Friend
== Aggiungi amico
Address
== Indirizzo
All
== Tutti
Alpha
== Alpha
Always show name plates
== Mostra sempre i nomi
Are you sure that you want to delete the demo?
== Sicuro di voler eliminare la demo?
Are you sure that you want to quit?
== Sicuro di voler chiudere il gioco?
Are you sure that you want to remove the player from your friends list?
== Sicuro di voler rimuovere il giocatore dalla lista di amici?
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.
== Essendo la prima volta che avvii il gioco, ti preghiamo di inserire il tuo nickname qui sotto. Puoi cambiare le impostazioni in base alle tue preferenze prima di entrare in gioco.
Automatically record demos
== Registra automaticamente demo
Automatically take game over screenshot
== Cattura schermata alla fine di ogni partita
Blue team
== Squadra blu
Blue team wins!
== La squadra blu ha vinto!
Body
== Corpo
Call vote
== Vota
Change settings
== Cambia opzioni
Chat
== Chat
Clan
== Clan
Client
== Client
Close
== Chiudi
Compatible version
== Versione compatibile
Connect
== Connetti
Connecting to
== Connessione a
Connection Problems...
== Problemi di connessione...
Console
== Console
Controls
== Comandi
Count players only
== Conta solo giocatori
Country
== Paese
Crc:
== Crc:
Created:
== Creata:
Current
== Attuale
Current version: %s
== Versione attuale: %s
Custom colors
== Colori personalizzati
Delete
== Elimina
Delete demo
== Elimina demo
Demo details
== Dettagli demo
Demofile: %s
== Demo: %s
Demos
== Demo
Disconnect
== Disconnetti
Disconnected
== Disconnesso
Display Modes
== Risoluzioni schermo
Downloading map
== Scaricamento mappa in corso
Draw!
== Pareggio!
Dynamic Camera
== Camera dinamica
Emoticon
== Emoticon
Enter
== Entra
Error
== Errore
Error loading demo
== Errore caricamento demo
FSAA samples
== Campioni FSAA
Favorite
== Preferito
Favorites
== Preferiti
Feet
== Piedi
Filter
== Filtro
Fire
== Fuoco
Folder
== Cartella
Force vote
== Forza voto
Free-View
== Visione libera
Friends
== Amici
Fullscreen
== Schermo intero
Game
== Partita
Game info
== Info partita
Game over
== Partita finita
Game type
== Tipo
Game types:
== Tipo di gioco:
General
== Generale
Graphics
== Aspetto
Grenade
== Lanciagranate
Hammer
== Martello
Has people playing
== Con giocatori
High Detail
== Alta qualità
Hook
== Rampino
Host address
== Indirizzo host
Hue
== Tinta
Info
== Info
Internet
== Internet
Invalid Demo
== Demo non valida
Join blue
== Vai ai blu
Join game
== Entra
Join red
== Vai ai rossi
Jump
== Salta
Kick player
== Caccia giocatore
LAN
== LAN
Language
== Lingua
Length:
== Durata:
Lht.
== Luminosità
Loading
== Caricamento
MOTD
== MOTD
Map
== Mappa
Map:
== Mappa:
Max Screenshots
== Numero massimo di catture
Max demos
== Numero massimo di demo
Maximum ping:
== Ping massimo:
Miscellaneous
== Altro
Mouse sens.
== Sensibilità
Move left
== Sinistra
Move player to spectators
== Fai osservare il giocatore
Move right
== Destra
Movement
== Movimento
Mute when not active
== Silenzioso quanto inattivo
Name
== Nome
Name plates size
== Dimensione nomi
Netversion:
== Versione net
New name:
== Nuovo nome:
News
== Novità
Next weapon
== Arma seguente
Nickname
== Nickname
No
== No
No password
== Senza password
No servers found
== Nessun server trovato
No servers match your filter criteria
== Nessun server corrisponde ai tuoi criteri di ricerca
Ok
== Ok
Open
== Apri
Parent Folder
== Cartella superiore
Password
== Password
Password incorrect
== Password errata
Ping
== Ping
Pistol
== Pistola
Play
== Riproduci
Play background music
== Riproduci musica di sottofondo
Player
== Giocatore
Player country:
== Filtra per paese:
Player options
== Opzioni giocatore
Players
== Giocatori
Please balance teams!
== Equilibra le squadre!
Prev. weapon
== Arma precedente
Quality Textures
== Texture di qualità
Quick search:
== Ricerca rapida:
Quit
== Chiudi
Quit anyway?
== Vuoi chiudere comunque?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Motivo:
Record demo
== Registra demo
Red team
== Squadra rossa
Red team wins!
== La squadra rossa ha vinto!
Refresh
== Aggiorna
Refreshing master servers
== Aggiornamento server principali
Remote console
== Console remota
Remove
== Elimina
Remove friend
== Elimina amico
Rename
== Rinomina
Rename demo
== Rinomina demo
Reset filter
== Azzera filtri
Reset to defaults
== Reimposta
Rifle
== Laser
Round
== Turno
Sample rate
== Frequenza
Sat.
== Saturazione
Score
== Punti
Score board
== Punteggio
Score limit
== Limite punti
Scoreboard
== Punteggi
Screenshot
== Cattura schermata
Server address:
== Indirizzo server:
Server details
== Dettagli server
Server filter
== Filtro server
Server info
== Info server
Server not full
== Server non pieno
Settings
== Opzioni
Shotgun
== Fucile
Show chat
== Mostra chat
Show friends only
== Mostra solo amici
Show ingame HUD
== Mostra HUD in gioco
Show name plates
== Mostra nomi
Show only supported
== Mostra solo supportati
Size:
== Dimensione:
Skins
== Skin
Sound
== Suono
Sound error
== Errore suono
Sound volume
== Volume suono
Spectate
== Osserva
Spectate next
== Osserva succ.
Spectate previous
== Osserva prec.
Spectator mode
== Menu osservazione
Spectators
== Spettatori
Standard gametype
== Tipo di gioco normale
Standard map
== Mappa normale
Stop record
== Ferma reg.
Strict gametype filter
== Tipo di gioco preciso
Sudden Death
== Tempo supplementare
Switch weapon on pickup
== Cambia arma ad ogni raccolta
Team
== Squadra
Team chat
== Chat di squadra
Teeworlds %s is out! Download it at www.teeworlds.com!
== È uscito Teeworld %s! Scaricalo su www.teeworlds.com!
Texture Compression
== Compressione texture
The audio device couldn't be initialised.
== Il dispositivo audio non può essere inizializzato.
The server is running a non-standard tuning on a pure game type.
== Il server presenta impostazioni non standard in un tipo di gioco normale.
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.
Time limit
== Limite di tempo
Time limit: %d min
== Limite di tempo: %d min
Try again
== Ritenta
Type
== Tipo
Type:
== Tipo:
UI Color
== Color interfaccia
Unable to delete the demo
== Impossibile eliminare la demo
Unable to rename the demo
== Impossibile rinominare la demo
Use sounds
== Attiva suoni
Use team colors for name plates
== Usa i colori della squadra nei nomi
V-Sync
== Sincronizzazione verticale
Version
== Versione
Version:
== Versione:
Vote command:
== Comando di voto:
Vote description:
== Descrizione voto:
Vote no
== Vota no
Vote yes
== Vota sì
Voting
== Votazione
Warmup
== Riscaldamento
Weapon
== Arma
Welcome to Teeworlds
== Benvenuto su Teeworlds
Yes
== Sì
You must restart the game for all settings to take effect.
== Devi riavviare il gioco per rendere effettive le modifiche.
Your skin
== La tua skin
no limit
== senza limiti
##### needs translation #####
##### old translations #####

== ## translated strings #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d av %d servere, %d spillere
%d%% loaded
== %d%% lastet
%ds left
== %d sekunder igjen
%i minute left
== %i minutt igjen
%i minutes left
== %i minutter igjen
%i second left
== %i sekund igjen
%i seconds left
== %i sekunder igjen
%s wins!
== %s Vinner!
-Page %d-
== -Side %d-
Abort
== Avbryt
Add
== Legg til
Add Friend
== Legg til venn
Address
== Adresse
All
== Alle
Alpha
== Synlighet
Always show name plates
== Vis alltid navnskilt
Are you sure that you want to delete the demo?
== Er du sikker på at du vil slette denne demoen?
Are you sure that you want to quit?
== Er du sikker på at du vil avslutte?
Are you sure that you want to remove the player from your friends list?
== Er du sikker på at du vil fjerne denne spilleren fra vennelisten?
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.
== Siden dette er første gang du starter spillet, må du skrive inn et kallenavn nedenfor. Det anbefales at du sjekker innstillingene for å justere dem slik du ønsker før du kobler til en server.
Automatically record demos
== Spill inn demoer automatisk
Automatically take game over screenshot
== Ta skjermbilder når runden er over
Blue team
== Blått lag
Blue team wins!
== Blått lag vant!
Body
== Kropp
Call vote
== Stem
Change settings
== Endre innstillinger
Chat
== Chat
Clan
== Klan
Client
== Klient
Close
== Lukk
Compatible version
== Kompitabel versjon
Connect
== Koble til
Connecting to
== Kobler til
Connection Problems...
== Tilkoblingsproblemer...
Console
== Konsoll
Controls
== Kontroller
Count players only
== Tell bare spillere
Country
== Land
Crc:
== Crc:
Created:
== Opprettet:
Current
== Nåværende
Current version: %s
== Nåværende versjon: %s
Custom colors
== Egendefinerte farger
Delete
== Slett
Delete demo
== Slett demo
Demo details
== Demo detaljer
Demofile: %s
== Demo fil: %s
Demos
== Demoer
Disconnect
== Koble fra
Disconnected
== Frakoblet
Display Modes
== Skjerm moduser
Downloading map
== Laster ned banen
Draw!
== Uavgjort!
Dynamic Camera
== Dynamisk kamera
Emoticon
== Uttrykksikoner
Enter
== Enter
Error
== Feil
Error loading demo
== Kunne ikke laste in Demo`en
FSAA samples
== FSAA prøver
Favorite
== Favoritt
Favorites
== Favoritter
Feet
== Føtter
Filter
== Filter
Fire
== Skyt
Folder
== Mappe
Force vote
== Tvungen valg
Free-View
== fri-visning
Friends
== Venner
Fullscreen
== Fullskjerm
Game
== Spill
Game info
== Spill info
Game over
== Spill avsluttet
Game type
== Spilltype
Game types:
== Spilletyper:
General
== Generelt
Graphics
== Grafikk
Grenade
== Granat
Hammer
== Hammer
Has people playing
== Har folk som spiller
High Detail
== Ekstra detaljer
Hook
== Gripe tang
Host address
== Serveradresse
Hue
== Farge
Info
== Info
Internet
== Internett
Invalid Demo
== Ugyldig Demo
Join blue
== Bli med blå
Join game
== Bli med i spillet
Join red
== Bli med rød
Jump
== Hopp
Kick player
== Kast ut spiller
LAN
== LAN
Language
== Språk
Length:
== Lengde
Lht.
== Lysstyrke
Loading
== Laster inn
MOTD
== Dagens melding
Map
== Bane
Map:
== Bane:
Max Screenshots
== Maks antall skjermbilder
Max demos
== Maks antall demoer
Maximum ping:
== Maks ping:
Miscellaneous
== Diverse
Mouse sens.
== Mushastighet
Move left
== Gå til venstre
Move player to spectators
== Gjør spiller til tilskuer
Move right
== Gå til høyre
Movement
== Beveglighet
Mute when not active
== Slå av lyd når spillet ikke er aktivt
Name
== Navn
Name plates size
== Størrelse på navnskilt
Netversion:
== Net versjon:
New name:
== Nytt navn:
News
== Nyheter
Next weapon
== Neste Våpen
Nickname
== Kallenavn
No
== Nei
No password
== ikke passord
No servers found
== Ingen servere funnet
No servers match your filter criteria
== Ingen servere tilsvarer dine filter kriterier
Ok
== Ok
Open
== Åpne
Parent Folder
== Forrige mappe
Password
== Passord
Password incorrect
== Feil passord
Ping
== Ping
Pistol
== Pistol
Play
== Spill
Play background music
== Spill bakrunds musikk
Player
== Spiller
Player country:
== spiller landet
Player options
== Spillerinstillinger
Players
== Spillere
Please balance teams!
== Balanser lagene!
Prev. weapon
== Forrige våpen
Quality Textures
== Teksturkvalitet
Quick search:
== Raskt Søk:
Quit
== Avslutt
Quit anyway?
== Avslutt uansett?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Grunn:
Record demo
== Ta opp demo
Red team
== Rødt lag
Red team wins!
== Rødt lag vant!
Refresh
== Oppdater
Refreshing master servers
== Opdaterer master servere
Remote console
== Server konsoll
Remove
== Ta bort
Remove friend
== Ta bort venn
Rename
== Gi nytt navn
Rename demo
== Gi nytt navn på Demo
Reset filter
== Tilbakestill filteret
Reset to defaults
== Tilbakestill standardinstillinger
Rifle
== Laser
Round
== Runde
Sample rate
== Enkel frekvens
Sat.
== Metning
Score
== Poeng
Score board
== Poengliste
Score limit
== Poenggrense
Scoreboard
== Poengliste
Screenshot
== Skjermbilde
Server address:
== Serveradresse
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
Server not full
== Serveren er ikke full
Settings
== Instillinger
Shotgun
== Hagle
Show chat
== Vis samtale
Show friends only
== Vis venner
Show ingame HUD
== Vis HUD i spillet
Show name plates
== Vis navnskilt
Show only supported
== Vis kompatible
Size:
== Størrelse:
Skins
== Utseender
Sound
== Lyd
Sound error
== Lydfeil
Sound volume
== Lydvolum
Spectate
== Se på
Spectate next
== Se på neste
Spectate previous
== Se på forige
Spectator mode
== Tilhenger modus
Spectators
== Tilskuere:
Standard gametype
== Standard spilletyper
Standard map
== Standard bane
Stop record
== Stopp inspilling
Strict gametype filter
== spilltype-filter
Sudden Death
== Brå død
Switch weapon on pickup
== Bytt våpen ved innsamling
Team
== Lag
Team chat
== Lagsamtale
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s er ute! Last ned på www.teeworlds.com!
Texture Compression
== Teksturkompressjon
The audio device couldn't be initialised.
== Lydenheten kunne ikke initialiseres.
The server is running a non-standard tuning on a pure game type.
== Denne serveren kjører ikke standard-innstillinger på standard spilltype.
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.
Time limit
== Tidsbegrensning
Time limit: %d min
== Tidsgrense: %d min
Try again
== Prøv igjen
Type
== Type
Type:
== Type:
UI Color
== Menyfarge
Unable to delete the demo
== Kunne ikke slette demoen
Unable to rename the demo
== Kunne ikke endre navn på demoen
Use sounds
== Lyd på
Use team colors for name plates
== Bruk lagfarger for navnskilt
V-Sync
== V-Sync
Version
== Versjon
Version:
== Versjon:
Vote command:
== Stemmingskommando:
Vote description:
== Stemmebeskrivelse:
Vote no
== Stem Nei
Vote yes
== Stem Ja
Voting
== Stemming
Warmup
== Oppvarming
Weapon
== Våpen
Welcome to Teeworlds
== Velkommen til Teeworlds
Yes
== Ja
You must restart the game for all settings to take effect.
== Du må starte spillet på nytt før alle endringene tar effekt.
Your skin
== Ditt utseende
no limit
== Ingen begrensninger
##### needs translation #####
##### old translations #####

View file

@ -1,682 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bajtów
%d of %d servers, %d players
== %d z %d serwerów, %d graczy
%d%% loaded
== Załadowano %d%%
%ds left
== Pozostało %ds
%i minute left
== Pozostało minut: %i
%i minutes left
== Pozostało minut: %i
%i second left
== Pozostało sekund: %i
%i seconds left
== Pozostało sekund: %i
%s wins!
== Wygrał %d!
-Page %d-
== -Strona %d-
Abort
== Anuluj
Add
== Dodaj
Add Friend
== Dodaj znajomego
Address
== Adres
All
== Wszyscy
Alpha
== Alfa
Always show name plates
== Zawsze pokazuj nicki graczy
Are you sure that you want to delete the demo?
== Czy na pewno chcesz usunąć to demo?
Are you sure that you want to quit?
== Czy na pewno chcesz opuścić grę?
Are you sure that you want to remove the player from your friends list?
== Czy na pewno chcesz usunąć tego gracza z listy znajomych?
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.
== To pierwsze uruchomienie gry, podaj swój nick poniżej. Zalecane jest też sprawdzenie ustawień i dopasowanie ich do swoich upodobań przed dołączeniem do gry.
Automatically record demos
== Automatycznie rejestruj dema
Automatically take game over screenshot
== Automatycznie zrób zrzut ekranu końca gry
Blue team
== Niebiescy
Blue team wins!
== Niebiescy wygrali!
Body
== Ciało
Call vote
== Głosowanie
Change settings
== Zmień ustawienia
Chat
== Chat
Clan
== Klan
Client
== Klient
Close
== Zamknij
Compatible version
== Kompatybilna wersja
Connect
== Połącz
Connecting to
== Łączenie z
Connection Problems...
== Problemy z połączeniem...
Console
== Konsola
Controls
== Sterowanie
Count players only
== Licz tylko graczy
Country
== Kraj
Crc:
== Crc:
Created:
== Utworzono:
Current
== Aktualnie
Current version: %s
== Aktualna wersja: %s
Custom colors
== Dostosuj kolory
Delete
== Usuń
Delete demo
== Usuń demo
Demo details
== Szczegóły dema
Demofile: %s
== Plik dema: %s
Demos
== Dema
Disconnect
== Rozłącz
Disconnected
== Rozłączono
Display Modes
== Tryby wyświetlania
Downloading map
== Pobieranie mapy
Draw!
== Remis!
Dynamic Camera
== Dynamiczna kamera
Emoticon
== Emotikona
Enter
== Wejdź
Error
== Błąd
Error loading demo
== Błąd przy ładowaniu dema
FSAA samples
== Próbkowanie FSAA (Antyaliasing)
Favorite
== Ulubiony
Favorites
== Ulubione
Feet
== Stopy
Filter
== Filtr
Fire
== Strzał
Folder
== Katalog
Force vote
== Wymuś głosowanie
Free-View
== Wolna kamera
Friends
== Znajomi
Fullscreen
== Pełny ekran
Game
== Gra
Game info
== Info o grze
Game over
== Koniec gry
Game type
== Typ gry
Game types:
== Typy gier:
General
== Ogólne
Graphics
== Grafika
Grenade
== Granatnik
Hammer
== Młot
Has people playing
== Nie pokazuj pustych
High Detail
== Wysoka jakość
Hook
== Hak
Host address
== Adres serwera
Hue
== Kolor
Info
== Info
Internet
== Internet
Invalid Demo
== Nieprawidłowe demo
Join blue
== Do niebieskich
Join game
== Dołącz
Join red
== Do czerwonych
Jump
== Skok
Kick player
== Wyrzuć gracza
LAN
== LAN
Language
== Język
Length:
== Długość:
Lht.
== Jasność
Loading
== Ładowanie
MOTD
== Wiadomość dnia
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Maksymalnie screenshotów
Max demos
== Maksymalnie dem
Maximum ping:
== Maksymalny ping:
Miscellaneous
== Różne
Mouse sens.
== Czułość myszy
Move left
== W lewo
Move player to spectators
== Przesuń gracza do obserwatorów
Move right
== W prawo
Movement
== Ruch
Mute when not active
== Wycisz, kiedy gra nieaktywna
Name
== Nazwa
Name plates size
== Wielkość wyświetlanych nicków
Netversion:
== Wersja sieciowa:
New name:
== Nowa nazwa:
News
== Wiadomości
Next weapon
== Następna broń
Nickname
== Nick
No
== Nie
No password
== Bez hasła
No servers found
== Nie znaleziono serwerów
No servers match your filter criteria
== Nie znaleziono serwerów spełniających twoje kryteria
Ok
== Ok
Open
== Otwórz
Parent Folder
== Nadrzędny katalog
Password
== Hasło
Password incorrect
== Błędne hasło
Ping
== Ping
Pistol
== Pistolet
Play
== Graj
Play background music
== Odtwarzaj muzykę w tle
Player
== Gracz
Player country:
== Narodowość:
Player options
== Opcje gracza
Players
== Gracze
Please balance teams!
== Proszę wyrównać szanse drużyn!
Prev. weapon
== Poprzednia broń
Quality Textures
== Szczegółowe tekstury
Quick search:
== Szybkie wyszukiwanie:
Quit
== Wyjście
Quit anyway?
== Wyjść mimo wszystko?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Powód:
Record demo
== Nagraj demo
Red team
== Czerwoni
Red team wins!
== Czerwoni wygrali!
Refresh
== Odśwież
Refreshing master servers
== Odświeżanie głównych serwerów
Remote console
== Zdalna konsola
Remove
== Usuń
Remove friend
== Usuń znajomego
Rename
== Zmień nazwę
Rename demo
== Zmień nazwę dema
Reset filter
== Domyślne filtry
Reset to defaults
== Przywróć domyślne
Rifle
== Laser
Round
== Runda
Sample rate
== Częstotliwość próbkowania
Sat.
== Nasycenie
Score
== Wynik
Score board
== Tablica wyników
Score limit
== Limit punktów
Scoreboard
== Tablica wyników
Screenshot
== Screenshot
Server address:
== Adres serwera:
Server details
== Szczegóły serwera
Server filter
== Filtr serwerów
Server info
== Info serwera
Server not full
== Nie pokazuj pełnych
Settings
== Opcje
Shotgun
== Shotgun
Show chat
== Pokaż chat
Show friends only
== Pokaż tylko znajomych
Show ingame HUD
== Pokaż wewnętrzny HUD
Show name plates
== Pokaż nicki
Show only supported
== Pokaż tylko wspierane
Size:
== Rozmiar:
Skins
== Motywy
Sound
== Dźwięk
Sound error
== Błąd dźwięku
Sound volume
== Głośność
Spectate
== Obserwuj
Spectate next
== Obserwuj następnego
Spectate previous
== Obserwuj poprzedniego
Spectator mode
== Tryb obserwatora
Spectators
== Obserwatorzy
Standard gametype
== Standardowy typ gry
Standard map
== Standardowa mapa
Stop record
== Zakończ REC
Strict gametype filter
== Szczegółowy filtr typu gry
Sudden Death
== Nagła śmierć
Switch weapon on pickup
== Zmień broń po podniesieniu
Team
== Drużyna
Team chat
== Chat drużynowy
Teeworlds %s is out! Download it at www.teeworlds.com!
== Nowa wersja Teeworlds %s jest dostępna! Do ściągnięcia z www.teeworlds.com!
Texture Compression
== Kompresja tekstur
The audio device couldn't be initialised.
== Urządzenie dźwiękowe nie mogło zostać zainicjowane
The server is running a non-standard tuning on a pure game type.
== Ten serwer korzysta z niestandardowych ustawień.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== W edytorze jest niezapisana mapa! Zapisz ją, jeśli nie chcesz
Time limit
== Limit czasu
Time limit: %d min
== Limit czasu: %d min
Try again
== Ponów próbę
Type
== Typ
Type:
== Typ:
UI Color
== Kolor menu
Unable to delete the demo
== Nie można usunąć dema
Unable to rename the demo
== Nie można zmienić nazwy dema
Use sounds
== Włącz dźwięki
Use team colors for name plates
== Użyj koloru drużyn dla wyświetlania nicków
V-Sync
== Synchronizacja pionowa (V-Sync)
Version
== Wersja
Version:
== Wersja:
Vote command:
== Polecenie głosowania:
Vote description:
== Opis głosowania:
Vote no
== Nie
Vote yes
== Tak
Voting
== Głosowanie
Warmup
== Rozgrzewka
Weapon
== Bronie
Welcome to Teeworlds
== Witaj w Teeworlds
Yes
== Tak
You must restart the game for all settings to take effect.
== Uruchom ponownie grę, aby użyć nowych ustawieńn
Your skin
== Twój wygląd
no limit
== bez limitu
##### needs translation #####
##### old translations #####
utracić swojej pracy!
==

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d de %d servidores, %d jogadores
%d%% loaded
== %d%% A Carregar
%ds left
== faltam %ds
%i minute left
== falta %i minuto
%i minutes left
== faltam %i minutos
%i second left
== falta %i segundo
%i seconds left
== faltam %i segundos
%s wins!
== %s ganhou!
-Page %d-
== -Página %d-
Abort
== Cancelar
Add
== Adicionar
Add Friend
== Adicionar Amigo
Address
== Endereço
All
== Todos
Alpha
== Alpha
Always show name plates
== Mostrar sempre os nicks
Are you sure that you want to delete the demo?
== Tens a certeza que queres Eliminar a demo?
Are you sure that you want to quit?
== Queres mesmo sair?
Are you sure that you want to remove the player from your friends list?
== Queres mesmo apaga-lo da tua lista de amigos?
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.
== Olá! Pelos vistos é a primeira vez que inicias o jogo, por isso escolhe um Nick Name para ti!
Automatically record demos
== Gravar demos Automaticamente
Automatically take game over screenshot
== Tirar screenshot's Automaticamente
Blue team
== Equipa azul
Blue team wins!
== A Equipa azul ganhou!
Body
== Corpo
Call vote
== Votação
Change settings
== Mudar configurações
Chat
== Conversa
Clan
== Clan
Client
== Cliente
Close
== Fechar
Compatible version
== Versão compatível
Connect
== Conectar
Connecting to
== A Conectar a
Connection Problems...
== Problemas na conecção!
Console
== Console
Controls
== Controlos
Count players only
== Só contar jogadores
Country
== País
Crc:
== Crc:
Created:
== Criado:
Current
== Actualmente
Current version: %s
== Versão actual : %s
Custom colors
== Cores personalizadas
Delete
== Eliminar
Delete demo
== Eliminar demo
Demo details
== Detalhes da demo
Demofile: %s
== Demo: %s
Demos
== Demos
Disconnect
== Desconectar
Disconnected
== Desconectado
Display Modes
== Modos de exibição
Downloading map
== A fazer download do mapa...
Draw!
== Empate!
Dynamic Camera
== Câmera dinâmica
Emoticon
== Emoticon
Enter
== Entrar
Error
== Erro
Error loading demo
== Erro a carregar a demo
FSAA samples
== Amostras FSAA
Favorite
== Favorito
Favorites
== Favoritos
Feet
== Pés
Filter
== Filtro
Fire
== Disparar
Folder
== Pasta
Force vote
== Forçar
Free-View
== Vista Livre
Friends
== Amigos
Fullscreen
== Fullscreen (Ecrã inteiro)
Game
== Jogo
Game info
== Info sobre o jogo
Game over
== Fim de Jogo
Game type
== Tipo de jogo
Game types:
== Tipos de jogo:
General
== Geral
Graphics
== Gráficos
Grenade
== Granada
Hammer
== Martelo
Has people playing
== Há gente a jogar
High Detail
== Mais detalhes (HD)
Hook
== Gancho
Host address
== Direcção do Host
Hue
== Matiz
Info
== Info.
Internet
== Internet
Invalid Demo
== Demo inválida
Join blue
== Juntar - Azuis
Join game
== Entrar no jogo
Join red
== J. Vermelhos
Jump
== Saltar
Kick player
== Expulsar jogador
LAN
== LAN
Language
== Língua
Length:
== Longitude:
Lht.
== Luz
Loading
== Aguarda por favor
MOTD
== MOTD
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Máx. de Capturas de Tela
Max demos
== Demos maximas
Maximum ping:
== Ping máximo:
Miscellaneous
== Diversos
Mouse sens.
== Sens. do rato
Move left
== Esquerda
Move player to spectators
== Juntar jogador aos espectadores
Move right
== Direita
Movement
== Movimento
Mute when not active
== Silencíar os jogadores inactivos
Name
== Nome
Name plates size
== Caracteres maximos nos nicks
Netversion:
== Netversion
New name:
== Novo nome:
News
== Notícia
Next weapon
== Próxima arma
Nickname
== Nick
No
== Não
No password
== Sem password
No servers found
== Nenhum servidor encontrado.
No servers match your filter criteria
== Não há servidores que correspondam às definições de procura.
Ok
== Aceitar
Open
== Abrir
Parent Folder
== Pasta superior
Password
== Password
Password incorrect
== Password errada!
Ping
== Ping
Pistol
== Pistola
Play
== Ver
Play background music
== Tocar a música de fundo
Player
== Jogador
Player country:
== País do jogador
Player options
== Opções do jogador
Players
== Jogadores
Please balance teams!
== Equilibrem as equipas!
Prev. weapon
== Arma anterior
Quality Textures
== Texturas de Qualidade
Quick search:
== Busca rápida:
Quit
== Sair
Quit anyway?
== Sair na mesma?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Motivo:
Record demo
== Gravar uma demo
Red team
== Equipa vermelha
Red team wins!
== Ganhou a equipa vermelha!
Refresh
== Actualizar
Refreshing master servers
== A Actualizar servidores
Remote console
== Remote console
Remove
== Eliminar
Remove friend
== Deixar de ser amigo
Rename
== Renomear
Rename demo
== Renomear demo
Reset filter
== Reiniciar Fitro
Reset to defaults
== Por como defeito
Rifle
== Laser
Round
== Ronda
Sample rate
== Frequencia de rate
Sat.
== Sat.
Score
== Pontos
Score board
== Tabela de Pontos
Score limit
== Pontuação Máx.
Scoreboard
== Pontuação
Screenshot
== Screenshot
Server address:
== Direção do servidor:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info
== Info de servidor
Server not full
== Não está cheio
Settings
== Config.
Shotgun
== Espingarda
Show chat
== Mostrar chat
Show friends only
== Mostrar amigos
Show ingame HUD
== Mostrar HUD do jogo
Show name plates
== Mostrar nick's
Show only supported
== Mostrar apenas suportado
Size:
== Tamanho:
Skins
== Skins
Sound
== Som
Sound error
== Erro no som!
Sound volume
== Volume
Spectate
== Observar
Spectate next
== Observar próximo
Spectate previous
== Observar anterior
Spectator mode
== Modo espectador
Spectators
== Espectadores
Standard gametype
== Tipo de jogo normal
Standard map
== Mapa normal
Stop record
== Parar de gravar
Strict gametype filter
== Tipo de jogo especifico
Sudden Death
== Morte súbita
Switch weapon on pickup
== Mudar de arma ao agarrar
Team
== Equipa
Team chat
== Chat de equipa
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s já saiu! Download em www.teeworlds.com!
Texture Compression
== Compressão de Textura
The audio device couldn't be initialised.
== O dispositivo de som não pode ser iniciado.
The server is running a non-standard tuning on a pure game type.
== O servidor está a usar um tipo de jogo não oficial.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== O mapa que editas-te não foi gravado. Queres gravar antes de sair?
Time limit
== Tempo máx.
Time limit: %d min
== Limite de tempo: %d min
Try again
== Tenta outra vez
Type
== Tipo
Type:
== Tipo:
UI Color
== Cor do menu
Unable to delete the demo
== Não podes eliminar a demo
Unable to rename the demo
== Impossivel de renomear a demo
Use sounds
== Usar sons
Use team colors for name plates
== Usar cores dos nicks com a cor da equipa
V-Sync
== V-Sync
Version
== Versão
Version:
== Versão
Vote command:
== Comando:
Vote description:
== Descrição de votação:
Vote no
== Votar não
Vote yes
== Votar sim
Voting
== A votar
Warmup
== Aquecimento
Weapon
== Arma
Welcome to Teeworlds
== Bem-vindo ao Teeworlds!
Yes
== Sim
You must restart the game for all settings to take effect.
== Para que as configurações sejam efectuadas deves Reiniciar o jogo.
Your skin
== A tua skin
no limit
== sem limite
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d octeți
%d of %d servers, %d players
== %d/%d servere, %d jucători
%d%% loaded
== %d%% încărcat
%ds left
== %ds a ieșit
%i minute left
== %i minute rămas
%i minutes left
== %i minutes rămase
%i second left
== %i secundă rămasă
%i seconds left
== %i secunde rămase
%s wins!
== %s câștigă!
-Page %d-
== -Pagina %d-
Abort
== Anulează
Add
== Adaugă
Add Friend
== Adaugă prieten
Address
== Adresa
All
== Toți
Alpha
== Alfa
Always show name plates
== Afișează întotdeauna pseudonimele
Are you sure that you want to delete the demo?
== Sigur vrei să ștergi demo-ul?
Are you sure that you want to quit?
== Sigur vrei să ieși?
Are you sure that you want to remove the player from your friends list?
== Sigur vrei să ștergi jucătorul din lista ta de prieteni?
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.
== 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
Automatically take game over screenshot
== Fă automat o captură de ecran la final
Blue team
== Echipa albastră
Blue team wins!
== Echipa albastră a câștigat!
Body
== Corp
Call vote
== Votează
Change settings
== Modifică setările
Chat
== Chat
Clan
== Clanul
Client
== Clientul
Close
== Închide
Compatible version
== Versiune compatibilă
Connect
== Conectează
Connecting to
== Conectare la
Connection Problems...
== Probleme la conexiune...
Console
== Consolă
Controls
== Controale
Count players only
== Numără doar jucătorii
Country
== Țara
Crc:
== Suma de control:
Created:
== Creată la data:
Current
== Curent
Current version: %s
== Versiunea actuală: %s
Custom colors
== Culori personalizate
Delete
== Șterge
Delete demo
== Șterge demonstrația
Demo details
== Detalii demo
Demofile: %s
== Fișier demo: %s
Demos
== Demo
Disconnect
== Deconectare
Disconnected
== Deconectat
Display Modes
== Moduri de afișare
Downloading map
== Se descarcă harta
Draw!
== Egalitate!
Dynamic Camera
== Cameră dinamică
Emoticon
== Figurine
Enter
== Intră
Error
== Eroare
Error loading demo
== Eroare la încărcarea demo-ului
FSAA samples
== Eșantioane FSAA
Favorite
== Favorit
Favorites
== Favorite
Feet
== Picioare
Filter
== Filtre
Fire
== Foc
Folder
== Dosar
Force vote
== Forțează votul
Free-View
== Vizualizare liberă
Friends
== Prieteni
Fullscreen
== Ecrat complet
Game
== Joc
Game info
== Informații joc
Game over
== Final de joc
Game type
== Tip de joc
Game types:
== Tipuri de joc:
General
== General
Graphics
== Grafică
Grenade
== Grenade
Hammer
== Ciocan
Has people playing
== Are jucători activi
High Detail
== Detalii înalte
Hook
== Cârlig
Host address
== Adresa gazdei
Hue
== Tentă
Info
== Informații
Internet
== Internet
Invalid Demo
== Demo nevalid
Join blue
== La albaștri
Join game
== Intră în joc
Join red
== La roșii
Jump
== Salt
Kick player
== Dă afară jucător
LAN
== Rețea
Language
== Limba
Length:
== Durată:
Lht.
== Luminozitate
Loading
== Se încarcă
MOTD
== Mesajul zilei
Map
== Hartă
Map:
== Harta:
Max Screenshots
== Număr maxim de capturi de ecran
Max demos
== Număr maxim de demo-uri
Maximum ping:
== Ping maxim:
Miscellaneous
== Diverse
Mouse sens.
== Sensib. maus
Move left
== Mută la stânga
Move player to spectators
== Mută jucătorul la spectatori
Move right
== Mută la dreapta
Movement
== Mișcare
Mute when not active
== Opreşte sunetul la inactivate
Name
== Nume
Name plates size
== Dimensiune nume placă
Netversion:
== Cod rețea:
New name:
== Nume nou:
News
== Știri
Next weapon
== Arma următoare
Nickname
== Pseudonim
No
== Nu
No password
== Fără parolă
No servers found
== Nici un server găsit
No servers match your filter criteria
== Nici un server nu corespunde criteriilor
Ok
== Bine
Open
== Deschide
Parent Folder
== Dosarul părinte
Password
== Parolă
Password incorrect
== Parolă incorectă
Ping
== Ping
Pistol
== Pistol
Play
== Redă
Play background music
== Redă muzică în fundal
Player
== Jucător
Player country:
== Țara jucătorului:
Player options
== Opțiuni jucător
Players
== Jucători
Please balance teams!
== Echilibrați echipele!
Prev. weapon
== Arma precedentă
Quality Textures
== Texturi de înaltă calitate
Quick search:
== Căutare rapidă:
Quit
== Ieșire
Quit anyway?
== Ieși oricum?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Motiv:
Record demo
== Înreg. demo
Red team
== Echipa roșie
Red team wins!
== Echipa roșie a câștigat!
Refresh
== Reîncarcă
Refreshing master servers
== Reîncarcă serverele principale
Remote console
== Consolă server
Remove
== Șterge
Remove friend
== Șterge prietenul
Rename
== Redenumește
Rename demo
== Redenumește demo-ul
Reset filter
== Filtru implicit
Reset to defaults
== Setări implicite
Rifle
== Carabină
Round
== Runda
Sample rate
== Frecvența
Sat.
== Saturație
Score
== Scor
Score board
== Scoruri
Score limit
== Limita de scor
Scoreboard
== Scoruri
Screenshot
== Captură de ecran
Server address:
== Adresă server:
Server details
== Detalii server
Server filter
== Filtru servere:
Server info
== Info. server
Server not full
== Are locuri libere
Settings
== Setări
Shotgun
== Pușcă
Show chat
== Afișare chat
Show friends only
== Arată prietenii
Show ingame HUD
== Arată scorul în joc
Show name plates
== Arată pseudonimele
Show only supported
== Arată doar modurile suportate
Size:
== Dimensiunea:
Skins
== Costume
Sound
== Sunet
Sound error
== Eroare de sunet
Sound volume
== Volum sunet
Spectate
== Spectator
Spectate next
== Vezi următorul
Spectate previous
== Vezi anteriorul
Spectator mode
== Mod spectator
Spectators
== Spectatori
Standard gametype
== Jocuri standard
Standard map
== Hărți standard
Stop record
== Stop înreg.
Strict gametype filter
== Filtru strict tip joc
Sudden Death
== Moarte subită
Switch weapon on pickup
== Schimbă arma la găsire
Team
== Echipa
Team chat
== Chat cu echipa
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s este lansat! Descarcă-l de la www.teeworlds.com!
Texture Compression
== Compresie texturi
The audio device couldn't be initialised.
== 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.
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.
Time limit
== Timp limită
Time limit: %d min
== Timp limită : %d min
Try again
== Reîncearcă
Type
== Tip
Type:
== Tip:
UI Color
== Culoare meniu
Unable to delete the demo
== Nu pot șterge demo-ul
Unable to rename the demo
== Nu pot redenumi demo-ul
Use sounds
== Folosește sunetul
Use team colors for name plates
== Folosește culorile echipelor pe etichetele de nume
V-Sync
== Sincronizare verticală (V-Sync)
Version
== Versiune
Version:
== Versiune:
Vote command:
== Comandă votare:
Vote description:
== Descriere votare:
Vote no
== Votează nu
Vote yes
== Votează da
Voting
== Votare
Warmup
== Încălzire
Weapon
== Arme
Welcome to Teeworlds
== Bun venit în Teeworlds
Yes
== Da
You must restart the game for all settings to take effect.
== Trebuie să repornești jocul pentru aplicarea setărilor.
Your skin
== Costumul tău
no limit
== fără limită
##### needs translation #####
##### old translations #####

View file

@ -1,677 +0,0 @@
##### 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 #####
##### old translations #####

View file

@ -1,678 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bajtova
%d of %d servers, %d players
== %d od %d server(a), %d igrač(a)
%d%% loaded
== %d%% učitano
%ds left
== Još %ds
%i minute left
== %i minut preostao
%i minutes left
== Preostalo: %i min.
%i second left
== Preostalo: %i min.
%i seconds left
== Preostalo: %i sek.
%s wins!
== %s je pobedio!
-Page %d-
== -Strana %d-
Abort
== Prekini
Add
== Dodaj
Add Friend
== Dodaj prijatelja
Address
== Adresa
All
== Svi
Alpha
== Provid.
Always show name plates
== Uvek prikaži imena igrača
Are you sure that you want to delete the demo?
== Da li sigurni da želite da obrišete demo-snimak?
Are you sure that you want to quit?
== Jeste li sigurni da želite da izađete?
Are you sure that you want to remove the player from your friends list?
== Da li ste sigurni da želite da obrišete igrača iz liste prijatelja?
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.
== Pošto prvi put pokrećete igru, molimo da ispod unesete Vaš nadimak (nick). Preporučujemo da proverite podešavanja i podesite ih prema Vašem ukusu pre nego što se konektujete na server.
Automatically record demos
== Automatski snimi demo
Automatically take game over screenshot
== Automatski snimi screenshot
Blue team
== Plavi tim
Blue team wins!
== Plavi tim je pobedio!
Body
== Telo
Call vote
== Glasanje
Change settings
== Izmeni podešavanja
Chat
== Chat
Clan
== Klan
Client
== Klijent
Close
== Zatvori
Compatible version
== Kompatibilna verzija
Connect
== Konektuj
Connecting to
== Konektujem se na
Connection Problems...
== Problemi sa konekcijom...
Console
== Konzola
Controls
== Kontrole
Count players only
== Broj samo igrače
Country
== Država
Crc:
== Crc:
Created:
== Kreirano:
Current
== Trenutno
Current version: %s
== Trenutna verzija: %s
Custom colors
== Vlastite boje
Delete
== Izbriši
Delete demo
== Obriši demo-snimak
Demo details
== Detalji demo-a
Demofile: %s
== Demo-snimak: %s
Demos
== Demo-i
Disconnect
== Diskonektuj
Disconnected
== Diskonektovan
Display Modes
== Rezolucija i način prikaza
Downloading map
== Preuzimam mapu
Draw!
== Nerešeno!
Dynamic Camera
== Dinamična kamera
Emoticon
== Emoticon
Enter
== Započni
Error
== Greška
Error loading demo
== Greška prilikom učitavanja demo-snimka
FSAA samples
== FSAA samples
Favorite
== Omiljen
Favorites
== Omiljeni
Feet
== Stopala
Filter
== Filter
Fire
== Pucaj
Folder
== Folder
Force vote
== Obavezno glasanje
Free-View
== Slobodan pregled
Friends
== Prijatelji
Fullscreen
== Čitav ekran
Game
== Igra
Game info
== O igri
Game over
== Igra je završena
Game type
== Tip igre
Game types:
== Tipovi igre:
General
== Opšte
Graphics
== Grafika
Grenade
== Granate
Hammer
== Čekić
Has people playing
== Server nije prazan
High Detail
== Visoki detalji
Hook
== Kuka
Host address
== Adresa servera
Hue
== Nijansa
Info
== Info
Internet
== Internet
Invalid Demo
== Neispravan demo-snimak
Join blue
== U plavi tim
Join game
== Uključi se u igru
Join red
== U crveni tim
Jump
== Skok
Kick player
== Izbaci igrača iz igre
LAN
== LAN
Language
== Jezik
Length:
== Dužina:
Lht.
== Svetl.
Loading
== Učitavam
MOTD
== Vest dana
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Maksimalan broj screenshot-ova
Max demos
== Maksimalan broj demo-a
Maximum ping:
== Maksimalan ping:
Miscellaneous
== Razno
Mouse sens.
== Osetljivost miša
Move left
== Nalevo
Move player to spectators
== Prebaci igrača u posmatrače
Move right
== Nadesno
Movement
== Kretanje
Mute when not active
== Bez zvuka prilikom neaktivnosti
Name
== Ime
Name plates size
== Veličina pločice za ime
Netversion:
== Net verzija:
New name:
== Novo ime:
News
== Novosti
Next weapon
== Sledeće oružje
Nickname
== Nadimak
No
== Ne
No password
== Bez lozinke
No servers found
== Nije pronađen nijedan server
No servers match your filter criteria
== Nijedan server ne odgovara zadatom kriteriju
Ok
== Ok
Open
== Otvori
Parent Folder
== Prethodni folder
Password
== Lozinka
Password incorrect
== Pogrešna lozinka
Ping
== Ping
Pistol
== Pištolj
Play
== Pokreni
Play background music
== Pozadinska muzika
Player
== Igrač
Player country:
== Država
Player options
== Podešavanja igrača
Players
== Igrači
Please balance teams!
== Molim uravnotežite timove!
Prev. weapon
== Prethodno oružje
Quality Textures
== Visokokvalitetne teksture
Quick search:
== Brza pretraga:
Quit
== Izlaz
Quit anyway?
== Izlaz?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Razlog:
Record demo
== Snimi demo
Red team
== Crveni tim
Red team wins!
== Crveni tim je pobedio!
Refresh
== Osveži
Refreshing master servers
== Osvežavam master servere
Remote console
== Udaljena konzola
Remove
== Ukloni
Remove friend
== Ukloni prijatelja
Rename
== Preimenuj
Rename demo
== Preimenuj demo
Reset filter
== Poništi filter
Reset to defaults
== Resetuj podešavanja
Rifle
== Puška
Round
== Runda
Sample rate
== Frekvencija
Sat.
== Zasić.
Score
== Rezultat
Score board
== Bodovi
Score limit
== Max. bodova
Scoreboard
== Bodovi
Screenshot
== Screenshot
Server address:
== Adresa servera:
Server details
== Podaci o serveru
Server filter
== Filter servera
Server info
== O Serveru
Server not full
== Server nije pun
Settings
== Podešavanja
Shotgun
== Sačmarica
Show chat
== Prikaži chat
Show friends only
== Prikaži samo prijatelje
Show ingame HUD
== Prikaži HUD
Show name plates
== Prikaži imena igrača
Show only supported
== Prikaži samo podržane
Size:
== Veličina:
Skins
== Izgled
Sound
== Zvuk
Sound error
== Problem sa zvukom
Sound volume
== Jačina zvuka
Spectate
== Posmatraj
Spectate next
== Posmatraj sledećeg
Spectate previous
== Posmatraj prošlog
Spectator mode
== Posmatrački mod
Spectators
== Posmatrači
Standard gametype
== Standardni tip igre
Standard map
== Standardna mapa
Stop record
== Prekini snimanje
Strict gametype filter
== Striktan filter tipa igre
Sudden Death
== Iznenadna smrt
Switch weapon on pickup
== Aktiviraj novo oružje prilikom uzimanja
Team
== Tim
Team chat
== Timski chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworld %s je objavljen! Preuzmi ga na www.teeworlds.com!
Texture Compression
== Kompresija tekstura
The audio device couldn't be initialised.
== Audio uređaj nije moguće pokrenuti.
The server is running a non-standard tuning on a pure game type.
== Server sadrži nestandardna podešavanja.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Mapa u editoru nije zapamćena, možda želite da je zapamtite pre izlaska iz igre.
Time limit
== Max. vremena
Time limit: %d min
== Vremensko ograničenje: %d min.
Try again
== Pokušaj ponovo
Type
== Tip
Type:
== Tip:
UI Color
== Boja menija
Unable to delete the demo
== Demo nije moguće obrisati
Unable to rename the demo
== Demo nije moguće preimenovati
Use sounds
== Koristi zvuk
Use team colors for name plates
== Koristi timsku boju u prikazu imena
V-Sync
== V-Sync
Version
== Verzija
Version:
== Verzija:
Vote command:
== Komanda za glasanje:
Vote description:
== Opis glasanja:
Vote no
== Protiv
Vote yes
== Za
Voting
== Glasanje
Warmup
== Zagrejavanje
Weapon
== Oružje
Welcome to Teeworlds
== Dobrodošli u Teeworlds
Yes
== Da
You must restart the game for all settings to take effect.
== Morate ponovo pokrenuti igru da bi sva podešavanja bila primenjena.
Your skin
== Vaš izgled
no limit
== bez ograničenja
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bajtov
%d of %d servers, %d players
== %d z %d serverov, %d hráčov online
%d%% loaded
== %d%% načítaných
%ds left
== Zostáva %ds
%i minute left
== Zostávajúce minúty: %i
%i minutes left
== Zostávajúce minúty: %i
%i second left
== Zostávajúce sekundy: %i
%i seconds left
== Zostávajúce sekundy: %i
%s wins!
== %s vyhráva!
-Page %d-
== -Strana %d-
Abort
== Zrušiť
Add
== Pridať
Add Friend
== Pridať Priateľa
Address
== Adresa
All
== Všetkým
Alpha
== Alpha
Always show name plates
== Vždy zobrazovať menovky
Are you sure that you want to delete the demo?
== Určite chcete vymazať tento záznam?
Are you sure that you want to quit?
== Ukončiť hru?
Are you sure that you want to remove the player from your friends list?
== Ste si istí, že chcete tohto hráča odstrániť zo zoznamu priateľov?
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.
== Vitajte v hre TeeWorlds. Predtým, ako sa pripojíte na herný server, odporúčame nastaviť si hru podľa svojich požiadavkov. Napíšte do políčka nižšie meno pre Vášho tee a pokračujte kliknutím na tlačítko.
Automatically record demos
== Automaticky nahrávať záznamy
Automatically take game over screenshot
== Automaticky vyfotiť koniec kola
Blue team
== Modrý tým
Blue team wins!
== Modrý tým vyhráva!
Body
== Telo
Call vote
== Hlasovať
Change settings
== Zmeniť nastavenia
Chat
== Chat
Clan
== Klan
Client
== Klient
Close
== Zavrieť
Compatible version
== Kompatibilná verzia
Connect
== Pripojiť
Connecting to
== Pripojujem sa k
Connection Problems...
== Problémy s pripojením...
Console
== Konzola
Controls
== Ovládanie
Count players only
== Nepočítať divákov
Country
== Krajina
Crc:
== Crc:
Created:
== Vytvorené:
Current
== Aktuálne
Current version: %s
== Aktuálna verzia: %s
Custom colors
== Vlastné farby
Delete
== Vymazať
Delete demo
== Vymazať záznam
Demo details
== Detaily nahrávky
Demofile: %s
== Nahrávka: %s
Demos
== Záznamy
Disconnect
== Odpojiť
Disconnected
== Prerušené spojenie
Display Modes
== Možnosti zobrazenia
Downloading map
== Sťahujem mapu
Draw!
== Remíza!
Dynamic Camera
== Dynamická kamera
Emoticon
== Smajlíci
Enter
== Vstúpiť
Error
== Chyba
Error loading demo
== Problém s otvorením záznamu
FSAA samples
== Anti-aliasing
Favorite
== Obľúbený
Favorites
== Obľúbené
Feet
== Nohy
Filter
== Filter
Fire
== Streľba
Folder
== Zložka
Force vote
== Zvoliť
Free-View
== Voľná Kamera
Friends
== Priatelia
Fullscreen
== Celá obrazovka
Game
== Hra
Game info
== Info o hre
Game over
== Koniec hry
Game type
== Herný typ
Game types:
== Herné typy:
General
== Hlavné
Graphics
== Grafika
Grenade
== Granátomet
Hammer
== Kladivo
Has people playing
== Nie je prázdny
High Detail
== Detaily
Hook
== Hook/Lano
Host address
== Hostiteľ
Hue
== Hue
Info
== Info
Internet
== Internet
Invalid Demo
== Neplatný Záznam
Join blue
== K modrým
Join game
== Hrať
Join red
== K červeným
Jump
== Skok
Kick player
== Vyhodiť hráča
LAN
== LAN
Language
== Jazyk
Length:
== Dĺžka:
Lht.
== Lht.
Loading
== Nahrávam
MOTD
== MOTD
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Maximum obrázkov
Max demos
== Maximum nahrávok
Maximum ping:
== Maximálny ping:
Miscellaneous
== Ostatné
Mouse sens.
== Citlivosť myši
Move left
== Pohyb vľavo
Move player to spectators
== Poslať hráča pozorovať
Move right
== Pohyb vpravo
Movement
== Pohyb
Mute when not active
== Stlmiť pri neaktivite
Name
== Meno
Name plates size
== Veľkosť menoviek
Netversion:
== Netversion:
New name:
== Nové meno:
News
== Novinky
Next weapon
== Ďalšia zbraň
Nickname
== Prezývka
No
== Nie
No password
== Bez hesla
No servers found
== Nenájdené žiadne servery
No servers match your filter criteria
== Žiadny server nezodpovedá zadaným kritériám
Ok
== OK
Open
== Otvoriť
Parent Folder
== Nadradený Priečinok
Password
== Heslo
Password incorrect
== Nesprávne heslo
Ping
== Ping
Pistol
== Pištoľ
Play
== Prehrať
Play background music
== Prehrať hudbu na pozadí
Player
== Hráč
Player country:
== Filter krajín:
Player options
== Nastavenia hráča
Players
== Hráči
Please balance teams!
== Prosím vyrovnajte týmy!
Prev. weapon
== Predošlá zbraň
Quality Textures
== Kvalitné textúry
Quick search:
== Hľadanie:
Quit
== Ukončiť
Quit anyway?
== Aj tak ukončiť?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Dôvod:
Record demo
== Nahrávať
Red team
== Červený tým
Red team wins!
== Červený tým vyhráva!
Refresh
== Obnoviť
Refreshing master servers
== Obnovujem master servery
Remote console
== Vzdialená konzola
Remove
== Odstrániť
Remove friend
== Vymazať priateľa
Rename
== Premenovať
Rename demo
== Premenovať nahrávku
Reset filter
== Obnoviť filter
Reset to defaults
== Vrátiť na pôvodné
Rifle
== Laser
Round
== Kolo
Sample rate
== Sample rate
Sat.
== Sat.
Score
== Skóre
Score board
== Tabuľka výsledkov
Score limit
== Limit skóre
Scoreboard
== Tabuľka výsledkov
Screenshot
== Screenshot
Server address:
== Adresa servera:
Server details
== Detaily servera
Server filter
== Filter serverov
Server info
== Informácie
Server not full
== Nie je plný
Settings
== Nastavenia
Shotgun
== Brokovnica
Show chat
== Ukázať chat
Show friends only
== Ukázať priateľov
Show ingame HUD
== Ukázať HUD
Show name plates
== Zobrazovať menovky
Show only supported
== Zobraziť len podporované
Size:
== Veľkosť:
Skins
== Skiny
Sound
== Zvuk
Sound error
== Zvuková chyba
Sound volume
== Hlasitosť
Spectate
== Pozorovať
Spectate next
== Pozorovať ďalšieho
Spectate previous
== Pozorovať predch.
Spectator mode
== Mód diváka
Spectators
== Diváci
Standard gametype
== Štandardný herný typ
Standard map
== Štandardná mapa
Stop record
== Nenahrávať
Strict gametype filter
== Striktný filter módov
Sudden Death
== Rýchla Smrť
Switch weapon on pickup
== Nastavovať zdvíhanú zbraň ako aktuálnu
Team
== Týmu
Team chat
== Týmový chat
Teeworlds %s is out! Download it at www.teeworlds.com!
== Vyšla nová verzia hry: %s! Stiahnite si ju na www.teeworlds.com!
Texture Compression
== Kompresia textúr
The audio device couldn't be initialised.
== Zvukové zariadenie nemohlo byť inicializované.
The server is running a non-standard tuning on a pure game type.
== Server používa neštandardné nastavenia na základnom hernom móde.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== V editore máte neuloženú mapu, možno si ju chcete pred skončením hry uložiť.
Time limit
== Časový limit
Time limit: %d min
== Časový limit: %d min
Try again
== Skúsiť znovu
Type
== Typ
Type:
== Typ:
UI Color
== Farba prostredia
Unable to delete the demo
== Nemôžem vymazať záznam
Unable to rename the demo
== Nahrávka sa nedá premenovať
Use sounds
== Povoliť zvuky
Use team colors for name plates
== Zafarbiť menovky podľa farieb týmov
V-Sync
== V-Sync
Version
== Verzia
Version:
== Verzia:
Vote command:
== Príkaz hlasu:
Vote description:
== Popis hlasu:
Vote no
== Nie
Vote yes
== Áno
Voting
== Hlasovanie
Warmup
== Rozohrávka
Weapon
== Zbrane
Welcome to Teeworlds
== Vitajte v hre Teeworlds!
Yes
== Áno
You must restart the game for all settings to take effect.
== Zmeny sa prejavia po reštartovaní hry.
Your skin
== Váš skin
no limit
== bez limitu
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d bytes
%d of %d servers, %d players
== %d de %d servidores, %d jugadores
%d%% loaded
== %d%% cargado
%ds left
== %ds restantes
%i minute left
== %i minuto restante
%i minutes left
== %i minutos restantes
%i second left
== %i segundo restante
%i seconds left
== %i segundos restantes
%s wins!
== ¡%s gana!
-Page %d-
== -Página %d-
Abort
== Cancelar
Add
== Añadir
Add Friend
== Añadir amigo
Address
== Dirección
All
== Todos
Alpha
== Alpha
Always show name plates
== Mostrar siempre los apodos
Are you sure that you want to delete the demo?
== ¿Estás seguro de que quieres eliminar la demo?
Are you sure that you want to quit?
== ¿Estás seguro de que quieres salir?
Are you sure that you want to remove the player from your friends list?
== ¿Estás seguro de que quieres eliminar a este jugador de la lista de amigos?
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.
== Como es la primera vez que abres el juego, por favor, introduce tu apodo. Es recomendable que verifiques tu configuración y ajustes las preferencias antes de unirte a un servidor.
Automatically record demos
== Grabar demos automáticamente
Automatically take game over screenshot
== Captura de pantalla al final de la partida
Blue team
== Equipo azul
Blue team wins!
== ¡El equipo azul gana!
Body
== Cuerpo
Call vote
== Votar
Change settings
== Cambiar configuración
Chat
== Conversación
Clan
== Clan
Client
== Cliente
Close
== Cerrar
Compatible version
== Versión compatible
Connect
== Conectar
Connecting to
== Conectando con
Connection Problems...
== Problemas de conexión...
Console
== Consola
Controls
== Controles
Count players only
== Solo contar jugadores
Country
== País
Crc:
== CRC:
Created:
== Creado:
Current
== Actual
Current version: %s
== Versión actual: %s
Custom colors
== Colores personalizados
Delete
== Borrar
Delete demo
== Borrar demo
Demo details
== Detalles de la demo
Demofile: %s
== Archivo: %s
Demos
== Demos
Disconnect
== Desconectar
Disconnected
== Desconectado
Display Modes
== Modos de video
Downloading map
== Descargando mapa
Draw!
== ¡Empate!
Dynamic Camera
== Cámara dinámica
Emoticon
== Emoticon
Enter
== Entrar
Error
== Error
Error loading demo
== Error al cargar la demo
FSAA samples
== Muestras FSAA
Favorite
== Favorito
Favorites
== Favoritos
Feet
== Pies
Filter
== Filtro
Fire
== Disparar
Folder
== Carpeta
Force vote
== Forzar
Free-View
== Vista libre
Friends
== Amigos
Fullscreen
== Pantalla completa
Game
== Juego
Game info
== Información del juego
Game over
== Fin de la partida
Game type
== Modo
Game types:
== Tipos de juego:
General
== General
Graphics
== Gráficos
Grenade
== Granada
Hammer
== Martillo
Has people playing
== Hay gente jugando
High Detail
== Mas detalles (HD)
Hook
== Gancho
Host address
== Dirección del host
Hue
== Matiz
Info
== Información
Internet
== Internet
Invalid Demo
== Demo inválida
Join blue
== Unirse a azul
Join game
== Unirse
Join red
== Unirse a rojo
Jump
== Saltar
Kick player
== Expulsar jugador
LAN
== LAN
Language
== Idioma
Length:
== Longitud:
Lht.
== Luminosidad
Loading
== Cargando
MOTD
== MOTD
Map
== Mapa
Map:
== Mapa:
Max Screenshots
== Número máximo de capturas
Max demos
== Número máximo de demos
Maximum ping:
== Ping máximo:
Miscellaneous
== Miscelánea
Mouse sens.
== Sensibilidad ratón
Move left
== Mover a la izquierda
Move player to spectators
== Mover jugador a espectadores
Move right
== Mover a la derecha
Movement
== Movimiento
Mute when not active
== Silenciar si no está activo
Name
== Nombre
Name plates size
== Tamaño de la fuente de los apodos
Netversion:
== Versión Net
New name:
== Nuevo nombre:
News
== Noticias
Next weapon
== Arma siguiente
Nickname
== Apodo
No
== No
No password
== Sin contraseña
No servers found
== Ningún servidor encontrado
No servers match your filter criteria
== Ningún servidor corresponde a los criterios de filtrado
Ok
== Aceptar
Open
== Abrir
Parent Folder
== Directorio padre
Password
== Contraseña
Password incorrect
== Contraseña incorreta
Ping
== Ping
Pistol
== Pistola
Play
== Reproducir
Play background music
== Reproducir música de fondo
Player
== Jugador
Player country:
== País del jugador
Player options
== Opciones de jugador
Players
== Jugadores
Please balance teams!
== Por favor, ¡equilibrad los equipos!
Prev. weapon
== Arma anterior
Quality Textures
== Texturas de calidad
Quick search:
== Búsqueda rápida:
Quit
== Salir
Quit anyway?
== ¿Salir de todos modos?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Motivo:
Record demo
== Grabar demo
Red team
== Equipo rojo
Red team wins!
== ¡El equipo rojo gana!
Refresh
== Actualizar
Refreshing master servers
== Actualizando servidores maestros
Remote console
== Consola remota
Remove
== Eliminar
Remove friend
== Eliminar amigo
Rename
== Renombrar
Rename demo
== Renombrar demo
Reset filter
== Resetear filtro
Reset to defaults
== Resetar por defecto
Rifle
== Láser
Round
== Ronda
Sample rate
== Frecuencia de muestreo
Sat.
== Saturación
Score
== Puntos
Score board
== Puntuación
Score limit
== Límite puntos
Scoreboard
== Puntuación
Screenshot
== Captura de pantalla
Server address:
== IP del servidor:
Server details
== Detalles del servidor
Server filter
== Filtro del servidor
Server info
== Servidor
Server not full
== Servidor sin llenar
Settings
== Configuración
Shotgun
== Escopeta
Show chat
== Mostrar chat
Show friends only
== Solo mostrar amigos
Show ingame HUD
== Mostar HUD durante el juego
Show name plates
== Mostrar apodos
Show only supported
== Mostrar únicamente modos soportados
Size:
== Tamaño:
Skins
== Skins
Sound
== Sonido
Sound error
== Error de sonido
Sound volume
== Volumen de sonido
Spectate
== Asistir
Spectate next
== Observar siguiente
Spectate previous
== Observar anterior
Spectator mode
== Modo espectador
Spectators
== Espectadores
Standard gametype
== Tipo de juego estándar
Standard map
== Mapa estándar
Stop record
== Detener grabación
Strict gametype filter
== Tipo de juego del filtro
Sudden Death
== Muerte súbita
Switch weapon on pickup
== Cambiar al arma recogida
Team
== Equipo
Team chat
== En equipo
Teeworlds %s is out! Download it at www.teeworlds.com!
== ¡Teeworlds %s ha salido! ¡Descárgalo desde www.teeworlds.com!
Texture Compression
== Compresión de texturas
The audio device couldn't be initialised.
== El dispositivo de audio no puede ser inicializado.
The server is running a non-standard tuning on a pure game type.
== El servidor está ejecutando una configuración no estándar en un tipo de juego puro.
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.
Time limit
== Tiempo límite
Time limit: %d min
== Tiempo límite: %d minutos
Try again
== Intentar de nuevo
Type
== Tipo
Type:
== Tipo:
UI Color
== Color de menú
Unable to delete the demo
== No se pudo eliminar la demo
Unable to rename the demo
== No se pudo renombrar la demo
Use sounds
== Usar sonidos
Use team colors for name plates
== Usar el color de equipo en los apodos
V-Sync
== V-Sync
Version
== Versión
Version:
== Versión:
Vote command:
== Comando de votación:
Vote description:
== Descripción de la votación:
Vote no
== Votar no
Vote yes
== Votar sí
Voting
== Votación
Warmup
== Calentamiento
Weapon
== Arma
Welcome to Teeworlds
== ¡Bienvenido/a a Teeworlds!
Yes
== Sí
You must restart the game for all settings to take effect.
== Debes reiniciar el juego para que los cambios tengan efecto.
Your skin
== Tu skin
no limit
== sin límite
##### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d Bytes
== %d Bytes
%d of %d servers, %d players
== %d av %d servrar, %d spelare
%d%% loaded
== %d%% laddat
%ds left
== %d sekunder kvar
%i minute left
== %i minut kvar
%i minutes left
== %i minuter kvar
%i second left
== %i sekund kvar
%i seconds left
== %i sekunder kvar
%s wins!
== %s vinner!
-Page %d-
== -Sida %d-
Abort
== Avbryt
Add
== Lägg till
Add Friend
== Lägg till kompis
Address
== Adress
All
== Alla
Alpha
== Alpha
Always show name plates
== Visa alltid namnskyltar
Are you sure that you want to delete the demo?
== Är du säker på att du vill ta bort detta demo?
Are you sure that you want to quit?
== Är du säker på att du vill avsluta?
Are you sure that you want to remove the player from your friends list?
== Är du säker på att du vill ta bort denna spelaren från din kompislista?
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.
== Detta är första gången du startar spelet, var vänligen skriv in ditt smeknamn här nedanför. Det är rekommenderat att du kontrollera inställningarna och justerar dom till din preferens innan du börjar spela.
Automatically record demos
== Spela in demon automatiskt
Automatically take game over screenshot
== Ta skärmdumpar vid matchslut
Blue team
== Blå laget
Blue team wins!
== Blå laget vann!
Body
== Kropp
Call vote
== Röstning
Change settings
== Ändra inställningar
Chat
== Chatt
Clan
== Klan
Client
== Klient
Close
== Stäng
Compatible version
== Kompatibel version
Connect
== Anslut
Connecting to
== Ansluter till
Connection Problems...
== Anslutningsproblem...
Console
== Konsol
Controls
== Kontroller
Count players only
== Räkna endast spelare
Country
== Land
Crc:
== Crc:
Created:
== Skapad:
Current
== Nuvarande
Current version: %s
== Nuvarande version: %s
Custom colors
== Egna färger
Delete
== Ta bort
Delete demo
== Ta bort demo
Demo details
== Demoinformation
Demofile: %s
== Demofil: %s
Demos
== Demon
Disconnect
== Avsluta
Disconnected
== Frånkopplad
Display Modes
== Skärmlägen
Downloading map
== Laddar ner karta
Draw!
== Oavgjort!
Dynamic Camera
== Dynamisk kamera
Emoticon
== Känsloikon
Enter
== Fortsätt
Error
== Fel
Error loading demo
== Kunde inte ladda demot
FSAA samples
== FSAA-samplingar
Favorite
== Favorit
Favorites
== Favoriter
Feet
== Fötter
Filter
== Filter
Fire
== Skjuta
Folder
== Mapp
Force vote
== Tvinga omröstning
Free-View
== Friläge
Friends
== Kompisar
Fullscreen
== Fullskärm
Game
== Spel
Game info
== Spelinfo
Game over
== Slutspelat
Game type
== Speltyp
Game types:
== Speltyper:
General
== Generellt
Graphics
== Grafik
Grenade
== Granater
Hammer
== Hammare
Has people playing
== Inte tom
High Detail
== Extra detaljer
Hook
== Haken
Host address
== Serveraddress
Hue
== Nyans
Info
== Info
Internet
== Internet
Invalid Demo
== Ogiltigt deo
Join blue
== Spela i blått
Join game
== Spela
Join red
== Spela i rött
Jump
== Hoppa
Kick player
== Kicka spelare
LAN
== LAN
Language
== Språk
Length:
== Längd
Lht.
== Ljusstyrka
Loading
== Laddar
MOTD
== Meddelande
Map
== Bana
Map:
== Bana
Max Screenshots
== Max antal skärmdumpar
Max demos
== Max antal demon
Maximum ping:
== Högsta ping:
Miscellaneous
== Övrigt
Mouse sens.
== Muskänslighet
Move left
== Gå vänster
Move player to spectators
== Flytta till åskådarna
Move right
== Gå höger
Movement
== Förflyttning
Mute when not active
== Stäng av ljudet när spelet inte är aktivt
Name
== Namn
Name plates size
== Storlek på namnskyltar
Netversion:
== Nätversion:
New name:
== Nytt namn:
News
== Nyheter
Next weapon
== Nästa vapen
Nickname
== Smeknamn
No
== Nej
No password
== Inget lösenord
No servers found
== Inga servrar hittade
No servers match your filter criteria
== Inga servrar matchar dina filterkriterer
Ok
== Ok
Open
== Öppna
Parent Folder
== Uppliggande mapp
Password
== Lösenord
Password incorrect
== Felaktigt lösenord
Ping
== Ping
Pistol
== Pistol
Play
== Spela
Play background music
== Aktivera bakgrundsmusik
Player
== Spelare
Player country:
== Land
Player options
== Spelaralternativ
Players
== Spelare
Please balance teams!
== Balansera lagen!
Prev. weapon
== Föregående vapen
Quality Textures
== Kvalitetstexturer
Quick search:
== Snabbsök:
Quit
== Avsluta
Quit anyway?
== Avsluta i alla fall?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Anledning:
Record demo
== Spela in demo
Red team
== Röda laget
Red team wins!
== Röda laget vann!
Refresh
== Uppdatera
Refreshing master servers
== Uppdaterar huvudservrar
Remote console
== Serverkonsol
Remove
== Ta bort
Remove friend
== Ta bort kompis
Rename
== Byt namn
Rename demo
== Byt namn på demo
Reset filter
== Återställ filter
Reset to defaults
== Återställ till standard
Rifle
== Gevär
Round
== Runda
Sample rate
== Samplingsfrekvens
Sat.
== Mättnad
Score
== Poäng
Score board
== Poängtavla
Score limit
== Poängmål
Scoreboard
== Poänglista
Screenshot
== Skärmdump
Server address:
== Serveradress
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
Server not full
== Lediga platser
Settings
== Inställningar
Shotgun
== Hagelgevär
Show chat
== Visa chatten
Show friends only
== Visa kompisar
Show ingame HUD
== Visa HUD i spel
Show name plates
== Visa namnskyltar
Show only supported
== Visa endast upplösningar som stöds
Size:
== Storlek:
Skins
== Utseende
Sound
== Ljud
Sound error
== Ljudfel
Sound volume
== Volym
Spectate
== Åskåda
Spectate next
== Se på nästa
Spectate previous
== Se på föregående
Spectator mode
== Åskådarläge
Spectators
== Åskådare
Standard gametype
== Standard speltyp
Standard map
== Standardkarta
Stop record
== Sluta spela in
Strict gametype filter
== Strikt speltypsfilter
Sudden Death
== Plötslig död
Switch weapon on pickup
== Byt vapen vid anskaffning
Team
== Lag
Team chat
== Lagchatt
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s är ute nu! Ladda ner det från www.teeworlds.com.
Texture Compression
== Texturkompression
The audio device couldn't be initialised.
== Ljudet kunde inte startas
The server is running a non-standard tuning on a pure game type.
== Denna server kör inte standardinställningar på en reserverad speltyp.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Det finns en osparad bana i redigeraden, du kanske vill spara den innan du avslutar.
Time limit
== Tidsbegränsning
Time limit: %d min
== Tidsgräns: %d min
Try again
== Försök igen
Type
== Typ
Type:
== Typ:
UI Color
== Gränssnittfärg
Unable to delete the demo
== Kunde inte ta bort demot
Unable to rename the demo
== Kunde inte byta namn på demot
Use sounds
== Aktivera ljudeffekter
Use team colors for name plates
== Använd lagfärger i namnskyltar
V-Sync
== V-Synk
Version
== Version
Version:
== Version:
Vote command:
== Omröstningskommando:
Vote description:
== Beskrivning:
Vote no
== Rösta nej
Vote yes
== Rösta ja
Voting
== Röstning
Warmup
== Uppvärmning
Weapon
== Vapen
Welcome to Teeworlds
== Välkommen till Teeworlds
Yes
== Ja
You must restart the game for all settings to take effect.
== Du måste starta om spelet för att ändringarna skall verkställas.
Your skin
== Ditt skin
no limit
== Ingen gräns
##### needs translation #####
##### old translations #####

View file

@ -1,681 +0,0 @@

##### translated strings #####
%d Bytes
== %d Bayt
%d of %d servers, %d players
== %d/%d sunucu, %d oyuncu
%d%% loaded
== %d%% yüklendi
%ds left
== %ds kaldı
%i minute left
== %i dakika kaldı
%i minutes left
== %i dakika kaldı
%i second left
== %i saniye kaldı
%i seconds left
== %i saniye kaldı
%s wins!
== %s kazandı!
-Page %d-
== -Sayfa %d-
Abort
== İptal
Add
== Ekle
Add Friend
== Arkadaş Ekle
Address
== Adres
All
== Hepsi
Alpha
== Şeffaflık
Always show name plates
== Oyuncu isimlerini her zaman göster
Are you sure that you want to delete the demo?
== Demo dosyasını silmek istediğinize emin misiniz?
Are you sure that you want to quit?
== Çıkmak istediğinize emin misiniz?
Are you sure that you want to remove the player from your friends list?
== Bu oyuncuyu arkadaş listenizden kaldırmak istediğinize emin misiniz?
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.
== Oyunu ilk açışınız olduğundan dolayı takma adınızı giriniz. Bir oyuna katılmadan önce ayarları incelemeniz ve isteklerinize göre özelleştirmeniz önerilir.
Automatically record demos
== Demoları otomatik olarak kaydet
Automatically take game over screenshot
== Otomatik olarak oyun bitişinde ekran görüntüsü al
Blue team
== Mavi takım
Blue team wins!
== Mavi takım kazandı!
Body
== Gövde
Call vote
== Oylama başlat
Change settings
== Ayarları değiştir
Chat
== Sohbet
Clan
== Clan
Client
== İstemci
Close
== Kapat
Compatible version
== Uyumlu versiyon
Connect
== Bağlan
Connecting to
== Bağlanılıyor
Connection Problems...
== Bağlantı Hataları...
Console
== Konsol
Controls
== Kontroller
Count players only
== Sadece oyuncuları say
Country
== Ülke
Crc:
== Crc:
Created:
== Yaratıldı:
Current
== Şimdiki
Current version: %s
== Mevcut versiyon: %s
Custom colors
== Özel renkler
Delete
== Sil
Delete demo
== Demoyu sil
Demo details
== Demo ayrıntıları
Demos
== Demolar
Disconnect
== Bağlantıyı kes
Disconnected
== Bağlantı kesildi
Display Modes
== Çözünürlük
Downloading map
== Harita yükleniyor
Draw!
== Berabere!
Dynamic Camera
== Dinamik Kamera
Emoticon
== Yüz ifadesi
Enter
== Gir
Error
== Hata
Error loading demo
== Demo yüklenirken hata oluştu
FSAA samples
== FSAA örnekleri
Favorite
== Favori
Favorites
== Favoriler
Feet
== Ayak
Filter
== Filtre
Fire
== Ateş
Folder
== Dosya
Force vote
== Oylamayı zorla
Free-View
== Serbest Görüntü
Friends
== Arkadaşlar
Fullscreen
== Tam ekran
Game
== Oyun
Game info
== Oyun bilgisi
Game over
== Oyun sonu
Game type
== Oyun türü
Game types:
== Oyun türleri:
General
== Genel
Graphics
== Grafik
Grenade
== El bombası
Hammer
== Çekiç
Has people playing
== Insan bulunduran
High Detail
== High Detail
Hook
== Kanca
Host address
== Sunucu adresi
Hue
== Renk
Info
== Bilgi
Internet
== Internet
Invalid Demo
== Geçersiz Demo
Join blue
== Maviye katıl
Join game
== Oyuna katıl
Join red
== Kırmızıya katıl
Jump
== Zıpla
Kick player
== Oyuncuyu At
LAN
== LAN
Language
== Dil
Length:
== Uzunluk:
Lht.
== Parlaklık
Loading
== Yükleniyor
MOTD
== MOTD
Map
== Harita
Map:
== Harita:
Max Screenshots
== Maksimum Ekran Alıntısı Sayısı
Max demos
== Maksimum Demo Sayısı
Maximum ping:
== Maximum ping
Miscellaneous
== Çeşitli
Mouse sens.
== Mouse duyarlılığı
Move left
== Sola git
Move player to spectators
== Seyircilere katıl
Move right
== Sağa git
Movement
== Hareket
Mute when not active
== Aktif değilken sessizleştir
Name
== İsim
Name plates size
== Boyut
Netversion:
== Netversion :
New name:
== Yeni isim :
News
== Haberler
Next weapon
== Sonraki silah
Nickname
== Takma ad
No
== Hayır
No password
== Şifresiz
No servers found
== Sunucu bulunamadı
No servers match your filter criteria
== Filtre kriterlerinize uygun sunucu bulunamadı
Ok
== Tamam
Open
== Aç
Parent Folder
== Üst dizin
Password
== Şifre
Password incorrect
== Hatalı şifre
Ping
== Ping
Pistol
== Tabanca
Play
== Oynat
Player
== Oyuncu
Player options
== Oyuncu ayarları
Players
== Oyuncular
Please balance teams!
== Takımları dengeleyin!
Prev. weapon
== Önceki silah
Quality Textures
== Kaliteli dolgular
Quick search:
== Hızlı Arama :
Quit
== Çıkış
Quit anyway?
== Çıkmak istediğinize emin misiniz?
REC %3d:%02d
== REC %3d:%02d
Reason:
== Neden :
Record demo
== Demo kaydet
Red team
== Kırmızı takım
Red team wins!
== Kırmızı takım kazandı!
Refresh
== Yenile
Refreshing master servers
== Ana sunucu yenileniyor
Remote console
== Uzak Konsol
Remove
== Çıkar
Remove friend
== Arkadaşı sil
Rename
== Yeniden isimlendir
Rename demo
== Demonun adını değiştir
Reset filter
== Filitreleri varsayılanlara getir
Reset to defaults
== Varsayılanlara getir
Rifle
== Lazer
Round
== Raund
Sample rate
== Sample rate
Sat.
== Doygunluk
Score
== Skor
Score board
== Skor tahtası
Score limit
== Skor limiti
Scoreboard
== Skor tahtası
Screenshot
== Ekran alıntısı
Server address:
== Sunucu adresi :
Server details
== Sunucucu detayları
Server filter
== Filtreler
Server info
== Sunucu bilgisi
Server not full
== Sunucu dolu değil
Settings
== Ayarlar
Shotgun
== Tüfek
Show chat
== Sohbeti göster
Show friends only
== Sadece arkadaşları göster
Show ingame HUD
== Oyun içi HUD ı göster
Show name plates
== Oyuncu isimlerini göster
Show only supported
== Desteklenmeyen çözünürlükleri gizle
Size:
== Boyut:
Skins
== Skins
Sound
== Ses
Sound error
== Ses hatası
Sound volume
== Ses yüksekliği
Spectate
== İzle
Spectator mode
== İzleyici modu
Spectators
== İzleyiciler
Standard gametype
== Standart oyun türleri
Standard map
== Standart haritalar
Stop record
== Kaydı durdur
Sudden Death
== Ani ölüm
Switch weapon on pickup
== Silah alındığıda yeni silaha geç
Team
== Takım
Team chat
== Takım sohbeti
Teeworlds %s is out! Download it at www.teeworlds.com!
== Teeworlds %s çıktı! www.teeworlds.com dan indirin!
Texture Compression
== Dolgu sıkıştırması
The audio device couldn't be initialised.
== Ses donanımı başlatılamadı.
The server is running a non-standard tuning on a pure game type.
== Bu sunucu standart olmayan bir ayarı saf bir oyun türünde kullanıyor.
There's an unsaved map in the editor, you might want to save it before you quit the game.
== Editörde kaydedilmemiş bir harita var, kapatmadan önce kaydetmek isteyebilirsiniz.
Time limit
== Süre limiti
Time limit: %d min
== Süre limiti: %d min
Try again
== Tekrar dene
Type
== Tür
Type:
== Tür:
UI Color
== Menü rengi
Unable to delete the demo
== Demo silinemiyor
Unable to rename the demo
== Demonun ismi değiştirilemiyor
Use sounds
== Sesleri kullan
Use team colors for name plates
== İsim etiketlerinde takım renklerini kullan
V-Sync
== V-Sync
Version
== Sürüm
Version:
== Versyon :
Vote command:
== Komut:
Vote description:
== Açıklama :
Vote no
== Olumsuz oy ver
Vote yes
== Olumlu oy ver
Voting
== Oylama
Warmup
== Isınma
Weapon
== Silah
Welcome to Teeworlds
== Teeworlds'e hoşgeldiniz
Yes
== Evet
You must restart the game for all settings to take effect.
== Bütün ayarların aktif olması için oyunu yeniden başlatmalısınız.
Your skin
== Sizin görünüşünüz
no limit
== limit yok
Demofile: %s
== Demo dosyası
Play background music
== Arkaplan müziğini çal
Player country:
== Oyuncu ülkesi
Player country:
==
Spectate next
== Sıradakini izle
Spectate previous
== Öncekini izle
Strict gametype filter
== Sıkı oyun türü filtresi
#### needs translation #####
##### old translations #####

View file

@ -1,679 +0,0 @@
##### translated strings #####
%d of %d servers, %d players
== %d/%d серверів, %d гравців
%d%% loaded
== %d%% завантажено
%ds left
== залишилось %d сек.
Abort
== Відміна
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?
== Ви дійсно бажаєте вийти?
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.
== Так як це ваш перший запуск гри, будь ласка, введіть свій нік у полі нижче. Також рекомендуємо перевірити налаштування гри і змінити деякі з них, перед тим, як почати грати.
Blue team
== Сині
Blue team wins!
== Сині перемогли!
Body
== Тіло
Call vote
== Голосувати
Chat
== Чат
Close
== Зачинити
Compatible version
== Сумісна версія
Connect
== Під’єднатись
Connecting to
== Підключення до
Connection Problems...
== Проблеми зі з'єднанням...
Console
== Консоль
Controls
== Управління
Current
== Поточний
Current version: %s
== Поточна версія: %s
Custom colors
== Особистий колір
Delete
== Видалити
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
== Форсувати
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
== Стрибок
LAN
== LAN
Language
== Мова
Lht.
== Яскравість
Loading
== Завантаження
MOTD
== MOTD
Map
== Карта
Maximum ping:
== Макс. пінг:
Miscellaneous
== Додатково
Mouse sens.
== Чутлив. миші
Move left
== Вліво
Move right
== Вправо
Movement
== Переміщення
Mute when not active
== Глушити звуки, коли гра неактивна
Name
== Ім'я
News
== Новини
Next weapon
== Наступ. зброя
Nickname
== Нік
No
== Ні
No password
== Без пароля
No servers found
== Сервера не знайдені
No servers match your filter criteria
== Не знайдено ні одного сервара, який би відповідав вашим критеріям
Ok
== Ок
Open
== Відкрити
Password
== Пароль
Password incorrect
== пароль введено невірно
Ping
== Пінг
Pistol
== Пістолет
Play
== Перегляд
Player
== Гравець
Players
== Гравці
Please balance teams!
== Збалансуйте команди!
Prev. weapon
== Попер. зброя
Quality Textures
== Якісні текстури
Quick search:
== Швидкий пошук:
Quit
== Вихід
Reason:
== Причина:
Record demo
== Запис демо
Red team
== Червоні
Red team wins!
== Червоні перемогли!
Refresh
== Оновити
Refreshing master servers
== Оновлення списку майстер-сервера
Remote console
== Консоль сервера
Reset filter
== Скинути фільтри
Reset to defaults
== Скинути налаштування
Rifle
== Лазер
Round
== Раунд
Sample rate
== Частота
Sat.
== Контраст.
Score
== Очки
Score board
== Табло
Score limit
== Ліміт очок
Scoreboard
== Хід гри
Screenshot
== Скріншот
Server details
== Деталі сервера
Server info
== Інформація
Server not full
== Сервер не заповнений
Settings
== Налаштування
Shotgun
== Дробовик
Show chat
== Показати чат
Show name plates
== Показувати ніки гравців
Show only supported
== Тільки підтримувані режими
Skins
== Скіни
Sound
== Звук
Sound volume
== Гучність звуку
Spectate
== Спостерігати
Spectators
== Спостерігачі
Standard gametype
== Стандартний тип гри
Standard map
== Стандартна карта
Stop record
== Зупинити запис
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 server is running a non-standard tuning on a pure game type.
== Сервер запущено з нестандартними налаштуваннями на стандартному типі гри.
Time limit
== Ліміт часу
Time limit: %d min
== Ліміт часу: %d хв
Try again
== Спробувати знову
Type
== Тип
UI Color
== колір інтерфейсу
Use sounds
== Використовувати звуки
V-Sync
== Вертикальна синхронізація
Version
== Версія
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
== Ваш скін
##### needs translation #####
%d Bytes
==
%i minute left
==
%i minutes left
==
%i second left
==
%i seconds left
==
%s wins!
==
-Page %d-
==
Add
==
Add Friend
==
Are you sure that you want to remove the player from your friends list?
==
Automatically record demos
==
Automatically take game over screenshot
==
Change settings
==
Clan
==
Client
==
Count players only
==
Country
==
Crc:
==
Created:
==
Delete demo
==
Demo details
==
Demofile: %s
==
Free-View
==
Friends
==
Kick player
==
Length:
==
Map:
==
Max Screenshots
==
Max demos
==
Move player to spectators
==
Name plates size
==
Netversion:
==
New name:
==
Parent Folder
==
Play background music
==
Player country:
==
Player options
==
Quit anyway?
==
REC %3d:%02d
==
Remove
==
Remove friend
==
Rename
==
Rename demo
==
Server address:
==
Server filter
==
Show friends only
==
Show ingame HUD
==
Size:
==
Sound error
==
Spectate next
==
Spectate previous
==
Spectator mode
==
Strict gametype filter
==
The audio device couldn't be initialised.
==
There's an unsaved map in the editor, you might want to save it before you quit the game.
==
Type:
==
Unable to delete the demo
==
Unable to rename the demo
==
Use team colors for name plates
==
Version:
==
Vote command:
==
Vote description:
==
no limit
==
##### old translations #####

View file

@ -477,7 +477,7 @@ weapon.firedelay.Set(125)
weapon.ammoregentime.Set(500)
weapon.visual_size.Set(64)
weapon.offsetx.Set(32)
weapon.offsety.Set(-4)
weapon.offsety.Set(4)
weapon.muzzleoffsetx.Set(50)
weapon.muzzleoffsety.Set(6)
container.weapons.gun.base.Set(weapon)

View file

@ -13,7 +13,7 @@ os.chdir('../')
url_bam = "http://github.com/matricks/bam/zipball/master"
url_DDRace = "http://github.com/GreYFoX/DDRace/zipball/master"
url_teeworlds = "http://github.com/oy/teeworlds/zipball/master"
url_teeworlds = "http://github.com/teeworlds/teeworlds/zipball/master"
release_type = "server_release client_release"
arguments = OptionParser()

View file

@ -1,4 +1,10 @@
import shutil, os, sys, zipfile
import shutil, os, re, sys, zipfile
if sys.version_info[0] == 2:
import urllib
url_lib = urllib
elif sys.version_info[0] == 3:
import urllib.request
url_lib = urllib.request
#valid_platforms = ["win32", "linux86", "linux86_64", "src"]
@ -8,6 +14,7 @@ if len(sys.argv) != 3:
sys.exit(-1)
name = "DDRace"
url_languages = "https://github.com/teeworlds/teeworlds-translation/zipball/master"
version = sys.argv[1]
platform = sys.argv[2]
exe_ext = ""
@ -40,6 +47,29 @@ if platform == 'osx':
use_gz = 0
use_bundle = 1
def fetch_file(url):
try:
print("trying %s" % url)
real_url = url_lib.urlopen(url).geturl()
local = real_url.split("/")
local = local[len(local)-1].split("?")
local = local[0]
url_lib.urlretrieve(real_url, local)
return local
except:
return False
def unzip(filename, where):
try:
z = zipfile.ZipFile(filename, "r")
except:
return False
for name in z.namelist():
if "/data/languages/" in name:
z.extract(name, where)
z.close()
return z.namelist()[0]
def copydir(src, dst, excl=[]):
for root, dirs, files in os.walk(src, topdown=True):
if "/." in root or "\\." in root:
@ -50,7 +80,15 @@ def copydir(src, dst, excl=[]):
for name in files:
if name[0] != '.':
shutil.copy(os.path.join(root, name), os.path.join(dst, root, name))
def clean():
print("*** cleaning ***")
try:
shutil.rmtree(package_dir)
shutil.rmtree(languages_dir)
os.remove(src_package_languages)
except: pass
package = "%s-%s-%s" %(name, version, platform)
package_dir = package
@ -58,6 +96,16 @@ print("cleaning target")
shutil.rmtree(package_dir, True)
os.mkdir(package_dir)
print("download and extract languages")
src_package_languages = fetch_file(url_languages)
if not src_package_languages:
print("couldn't download languages")
sys.exit(-1)
languages_dir = unzip(src_package_languages, ".")
if not languages_dir:
print("couldn't unzip languages")
sys.exit(-1)
print("adding files")
shutil.copy("readme.txt", package_dir)
shutil.copy("license.txt", package_dir)
@ -73,6 +121,9 @@ shutil.copy("banmasters.cfg", package_dir)
if include_data and not use_bundle:
os.mkdir(os.path.join(package_dir, "data"))
copydir("data", package_dir)
os.chdir(languages_dir)
copydir("data", "../"+package_dir)
os.chdir("..")
if platform[:3] == "win":
shutil.copy("other/config_directory.bat", package_dir)
shutil.copy("SDL.dll", package_dir)
@ -116,7 +167,11 @@ if use_bundle:
os.mkdir(clientbundle_framework_dir)
os.mkdir(os.path.join(clientbundle_resource_dir, "data"))
copydir("data", clientbundle_resource_dir)
os.chdir(languages_dir)
copydir("data", "../"+clientbundle_resource_dir)
os.chdir("..") # TODO(GreYFoX): make sure this line doesn't change the directory of the icon file copied next, just make sure everything works
shutil.copy("other/icons/DDRace.icns", clientbundle_resource_dir)
#shutil.copy("other/icons/Teeworlds.icns", clientbundle_resource_dir)
shutil.copy(name+exe_ext, clientbundle_bin_dir)
os.system("cp -R /Library/Frameworks/SDL.framework " + clientbundle_framework_dir)
file(os.path.join(clientbundle_content_dir, "Info.plist"), "w").write("""
@ -203,5 +258,7 @@ if use_dmg:
os.system("hdiutil create -srcfolder %s -volname DDRace -quiet %s_temp" % (package_dir, package))
os.system("hdiutil convert %s_temp.dmg -format UDBZ -o %s.dmg -quiet" % (package, package))
os.system("rm -f %s_temp.dmg" % package)
clean()
print("done")

View file

@ -1,91 +0,0 @@
import os, re, sys
match = re.search('(.*)/', sys.argv[0])
if match != None:
os.chdir(match.group(1))
os.chdir('../')
source_exts = [".c", ".cpp", ".h"]
def parse_source():
stringtable = {}
def process_line(line):
if 'Localize("'.encode() in line:
fields = line.split('Localize("'.encode(), 1)[1].split('"'.encode(), 1)
stringtable[fields[0]] = ""
process_line(fields[1])
for root, dirs, files in os.walk("src"):
for name in files:
filename = os.path.join(root, name)
if os.sep + "external" + os.sep in filename:
continue
if filename[-2:] in source_exts or filename[-4:] in source_exts:
for line in open(filename, "rb"):
process_line(line)
return stringtable
def load_languagefile(filename):
f = open(filename, "rb")
lines = f.readlines()
f.close()
stringtable = {}
for i in range(0, len(lines)-1):
l = lines[i].strip()
if len(l) and not l[0:1] == "=".encode() and not l[0:1] == "#".encode():
stringtable[l] = lines[i+1][3:].rstrip()
return stringtable
def generate_languagefile(outputfilename, srctable, loctable):
f = open(outputfilename, "wb")
num_items = 0
new_items = 0
old_items = 0
srctable_keys = []
for key in srctable:
srctable_keys.append(key)
srctable_keys.sort()
content = "\n##### translated strings #####\n\n".encode()
for k in srctable_keys:
if k in loctable and len(loctable[k]):
content += k + "\n== ".encode() + loctable[k] + "\n\n".encode()
num_items += 1
content += "##### needs translation #####\n\n".encode()
for k in srctable_keys:
if not k in loctable or len(loctable[k]) == 0:
content += k + "\n== \n\n".encode()
num_items += 1
new_items += 1
content += "##### old translations #####\n\n".encode()
for k in loctable:
if not k in srctable:
content += k + "\n== ".encode() + loctable[k] + "\n\n".encode()
num_items += 1
old_items += 1
f.write(content)
f.close()
print("%-40s %8d %8d %8d" % (outputfilename, num_items, new_items, old_items))
srctable = parse_source()
print("%-40s %8s %8s %8s" % ("filename", "total", "new", "old"))
for filename in os.listdir("data/languages"):
if not ".txt" in filename:
continue
if filename == "index.txt":
continue
filename = "data/languages/" + filename
generate_languagefile(filename, srctable, load_languagefile(filename))

View file

@ -25,12 +25,18 @@ public:
vector2_base operator -(const vector2_base &v) const { return vector2_base(x-v.x, y-v.y); }
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 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; }
const vector2_base &operator +=(const vector2_base &v) { x += v.x; y += v.y; return *this; }
const vector2_base &operator -=(const vector2_base &v) { x -= v.x; y -= v.y; return *this; }
const vector2_base &operator *=(const T v) { x *= v; y *= v; return *this; }
const vector2_base &operator *=(const vector2_base &v) { x *= v.x; y *= v.y; return *this; }
const vector2_base &operator /=(const T v) { x /= v; y /= v; return *this; }
const vector2_base &operator /=(const vector2_base &v) { x /= v.x; y /= v.y; return *this; }
bool operator ==(const vector2_base &v) const { return x == v.x && y == v.y; } //TODO: do this with an eps instead
@ -107,10 +113,14 @@ public:
vector3_base operator *(const T v) const { return vector3_base(x*v, y*v, z*v); }
vector3_base operator *(const vector3_base &v) const { return vector3_base(x*v.x, y*v.y, z*v.z); }
vector3_base operator /(const T v) const { return vector3_base(x/v, y/v, z/v); }
vector3_base operator /(const vector3_base &v) const { return vector3_base(x/v.x, y/v.y, z/v.z); }
const vector3_base &operator +=(const vector3_base &v) { x += v.x; y += v.y; z += v.z; return *this; }
const vector3_base &operator -=(const vector3_base &v) { x -= v.x; y -= v.y; z -= v.z; return *this; }
const vector3_base &operator *=(const T v) { x *= v; y *= v; z *= v; return *this; }
const vector3_base &operator *=(const vector3_base &v) { x *= v.x; y *= v.y; z *= v.z; return *this; }
const vector3_base &operator /=(const T v) { x /= v; y /= v; z /= v; return *this; }
const vector3_base &operator /=(const vector3_base &v) { x /= v.x; y /= v.y; z /= v.z; return *this; }
bool operator ==(const vector3_base &v) const { return x == v.x && y == v.y && z == v.z; } //TODO: do this with an eps instead
@ -180,12 +190,17 @@ public:
vector4_base operator -() const { return vector4_base(-x, -y, -z, -w); }
vector4_base operator *(const vector4_base &v) const { return vector4_base(x*v.x, y*v.y, z*v.z, w*v.w); }
vector4_base operator *(const T v) const { return vector4_base(x*v, y*v, z*v, w*v); }
vector4_base operator /(const vector4_base &v) const { return vector4_base(x/v.x, y/v.y, z/v.z, w/v.w); }
vector4_base operator /(const T v) const { return vector4_base(x/v, y/v, z/v, w/v); }
const vector4_base &operator =(const vector4_base &v) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; }
const vector4_base &operator +=(const vector4_base &v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; }
const vector4_base &operator -=(const vector4_base &v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; }
const vector4_base &operator *=(const T v) { x *= v; y *= v; z *= v; w *= v; return *this; }
const vector4_base &operator *=(const vector4_base &v) { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; }
const vector4_base &operator /=(const T v) { x /= v; y /= v; z /= v; w /= v; return *this; }
const vector4_base &operator /=(const vector4_base &v) { x /= v.x; y /= v.y; z /= v.z; w /= v.w; return *this; }
bool operator ==(const vector4_base &v) const { return x == v.x && y == v.y && z == v.z && w == v.w; } //TODO: do this with an eps instead

View file

@ -2,6 +2,8 @@
#include "SDL.h"
#include "SDL_opengl.h"
#include <base/tl/threading.h>
#include "graphics_threaded.h"
#include "backend_sdl.h"
@ -133,6 +135,20 @@ void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &St
else
glDisable(GL_TEXTURE_2D);
switch(State.m_WrapMode)
{
case CCommandBuffer::WRAP_REPEAT:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
break;
case CCommandBuffer::WRAP_CLAMP:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break;
default:
dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode);
};
// screen mapping
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@ -389,6 +405,7 @@ int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int Width, int Height,
}
const SDL_VideoInfo *pInfo = SDL_GetVideoInfo();
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); // prevent stuck mouse cursor sdl-bug when loosing fullscreen focus in windows
// set flags
int SdlFlags = SDL_OPENGL;

View file

@ -27,25 +27,24 @@
static void GL_ReleaseContext(const SGLContext &Context) { wglMakeCurrent(NULL, NULL); }
static void GL_SwapBuffers(const SGLContext &Context) { SwapBuffers(Context.m_hDC); }
#elif defined(CONF_PLATFORM_MACOSX)
#warning Untested implementation. I have no Mac OS X machine to test on. Please test, verify, fix and then remove this warning
#include <AGL/agl.h>
struct SGLContext
{
AGLDrawable m_Drawable;
AGLContext m_Context;
};
static SGLContext GL_GetCurrentContext()
{
SGLContext Context;
Context.m_Drawable = aglGetCurrentDrawable();
Context.m_Context = aglGetCurrentContext();
return Context;
}
static void GL_MakeCurrent(const SGLContext &Context) { aglMakeCurrent(Context.m_Drawable, Context.m_Context); }
static void GL_ReleaseContext(const SGLContext &Context) { aglMakeCurrent(AGL_NONE, NULL); }
static void GL_SwapBuffers(const SGLContext &Context) { aglSwapBuffers(Context.m_Drawable); }
static void GL_MakeCurrent(const SGLContext &Context) { aglSetCurrentContext(Context.m_Context); }
static void GL_ReleaseContext(const SGLContext &Context) { aglSetCurrentContext(NULL); }
static void GL_SwapBuffers(const SGLContext &Context) { aglSwapBuffers(Context.m_Context); }
#elif defined(CONF_FAMILY_UNIX)

View file

@ -36,6 +36,8 @@
#include <engine/shared/ringbuffer.h>
#include <engine/shared/snapshot.h>
#include <game/version.h>
#include <mastersrv/mastersrv.h>
#include <versionsrv/versionsrv.h>
@ -461,6 +463,9 @@ int *CClient::GetInput(int Tick)
// ------ state handling -----
void CClient::SetState(int s)
{
if(m_State == IClient::STATE_QUITING)
return;
int Old = m_State;
if(g_Config.m_Debug)
{
@ -859,23 +864,26 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
if(m_VersionInfo.m_State == CVersionInfo::STATE_READY && net_addr_comp(&pPacket->m_Address, &m_VersionInfo.m_VersionServeraddr.m_Addr) == 0)
{
// version info
if(pPacket->m_DataSize == (int)(sizeof(VERSIONSRV_VERSION) + sizeof(VERSION_DATA)) &&
if(pPacket->m_DataSize == (int)(sizeof(VERSIONSRV_VERSION) + sizeof(GAME_RELEASE_VERSION)) &&
mem_comp(pPacket->m_pData, VERSIONSRV_VERSION, sizeof(VERSIONSRV_VERSION)) == 0)
{
unsigned char *pVersionData = (unsigned char*)pPacket->m_pData + sizeof(VERSIONSRV_VERSION);
int VersionMatch = !mem_comp(pVersionData, VERSION_DATA, sizeof(VERSION_DATA));
char *pVersionData = (char*)pPacket->m_pData + sizeof(VERSIONSRV_VERSION);
int VersionMatch = !mem_comp(pVersionData, GAME_RELEASE_VERSION, sizeof(GAME_RELEASE_VERSION));
char aVersion[sizeof(GAME_RELEASE_VERSION)];
str_copy(aVersion, pVersionData, sizeof(aVersion));
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "version does %s (%d.%d.%d)",
str_format(aBuf, sizeof(aBuf), "version does %s (%s)",
VersionMatch ? "match" : "NOT match",
pVersionData[1], pVersionData[2], pVersionData[3]);
aVersion);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/version", aBuf);
// assume version is out of date when version-data doesn't match
if (!VersionMatch)
if(!VersionMatch)
{
str_format(m_aVersionStr, sizeof(m_aVersionStr), "%d.%d.%d", pVersionData[1], pVersionData[2], pVersionData[3]);
str_copy(m_aVersionStr, aVersion, sizeof(m_aVersionStr));
}
// request the map version list now
@ -1741,8 +1749,11 @@ void CClient::Run()
// open socket
{
NETADDR BindAddr;
mem_zero(&BindAddr, sizeof(BindAddr));
BindAddr.type = NETTYPE_ALL;
if(g_Config.m_Bindaddr[0] == 0 || net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) != 0)
{
mem_zero(&BindAddr, sizeof(BindAddr));
BindAddr.type = NETTYPE_ALL;
}
if(!m_NetClient.Open(BindAddr, 0))
{
dbg_msg("client", "couldn't start network");
@ -1842,7 +1853,10 @@ void CClient::Run()
// panic quit button
if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyPressed('q'))
{
Quit();
break;
}
if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyDown('d'))
g_Config.m_Debug ^= 1;
@ -2158,6 +2172,11 @@ void CClient::DemoRecorder_Stop()
m_DemoRecorder.Stop();
}
void CClient::DemoRecorder_AddDemoMarker()
{
m_DemoRecorder.AddDemoMarker();
}
void CClient::Con_Record(IConsole::IResult *pResult, void *pUserData)
{
CClient *pSelf = (CClient *)pUserData;
@ -2173,6 +2192,12 @@ void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData)
pSelf->DemoRecorder_Stop();
}
void CClient::Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData)
{
CClient *pSelf = (CClient *)pUserData;
pSelf->DemoRecorder_AddDemoMarker();
}
void CClient::ServerBrowserUpdate()
{
m_ResortServerBrowser = true;
@ -2211,6 +2236,7 @@ void CClient::RegisterCommands()
m_pConsole->Register("play", "r", CFGFLAG_CLIENT|CFGFLAG_STORE, Con_Play, this, "Play the file specified");
m_pConsole->Register("record", "?s", CFGFLAG_CLIENT, Con_Record, this, "Record to the file");
m_pConsole->Register("stoprecord", "", CFGFLAG_CLIENT, Con_StopRecord, this, "Stop recording");
m_pConsole->Register("add_demomarker", "", CFGFLAG_CLIENT, Con_AddDemoMarker, this, "Add demo timeline marker");
m_pConsole->Register("add_favorite", "s", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite");
m_pConsole->Register("remove_favorite", "s", CFGFLAG_CLIENT, Con_RemoveFavorite, this, "Remove a server from favorites");
@ -2246,11 +2272,13 @@ static CClient *CreateClient()
*/
#if defined(CONF_PLATFORM_MACOSX)
extern "C" int SDL_main(int argc, const char **argv) // ignore_convention
extern "C" int SDL_main(int argc, char **argv_) // ignore_convention
{
const char **argv = const_cast<const char **>(argv_);
#else
int main(int argc, const char **argv) // ignore_convention
#endif
{
#endif
#if defined(CONF_FAMILY_WINDOWS)
for(int i = 1; i < argc; i++) // ignore_convention
{
@ -2270,7 +2298,7 @@ int main(int argc, const char **argv) // ignore_convention
// create the components
IEngine *pEngine = CreateEngine("Teeworlds");
IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT);
IStorage *pStorage = CreateStorage("Teeworlds", argc, argv); // ignore_convention
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, argv); // ignore_convention
IConfig *pConfig = CreateConfig();
IEngineSound *pEngineSound = CreateEngineSound();
IEngineInput *pEngineInput = CreateEngineInput();

View file

@ -289,6 +289,7 @@ public:
static void Con_Play(IConsole::IResult *pResult, void *pUserData);
static void Con_Record(IConsole::IResult *pResult, void *pUserData);
static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData);
static void Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData);
static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
void RegisterCommands();
@ -297,6 +298,7 @@ public:
void DemoRecorder_Start(const char *pFilename, bool WithTimestamp);
void DemoRecorder_HandleAutoStart();
void DemoRecorder_Stop();
void DemoRecorder_AddDemoMarker();
void AutoScreenshot_Start();
void AutoScreenshot_Cleanup();

View file

@ -3,6 +3,7 @@
#include <base/detect.h>
#include <base/math.h>
#include <base/tl/threading.h>
#include "SDL.h"
#include "SDL_opengl.h"
@ -197,6 +198,18 @@ void CGraphics_OpenGL::BlendAdditive()
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
void CGraphics_OpenGL::WrapNormal()
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
void CGraphics_OpenGL::WrapClamp()
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
int CGraphics_OpenGL::MemoryUsage() const
{
return m_TextureMemoryUsage;
@ -752,7 +765,7 @@ int CGraphics_SDL::TryInit()
m_ScreenHeight = g_Config.m_GfxScreenHeight;
const SDL_VideoInfo *pInfo = SDL_GetVideoInfo();
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); // prevent stuck mouse cursor sdl-bug when loosing fullscreen focus in windows
// set flags
int Flags = SDL_OPENGL;

View file

@ -78,6 +78,9 @@ public:
virtual void BlendNormal();
virtual void BlendAdditive();
virtual void WrapNormal();
virtual void WrapClamp();
virtual int MemoryUsage() const;
virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY);

View file

@ -3,6 +3,7 @@
#include <base/detect.h>
#include <base/math.h>
#include <base/tl/threading.h>
#include <base/system.h>
#include <engine/external/pnglite/pnglite.h>
@ -154,6 +155,7 @@ CGraphics_Threaded::CGraphics_Threaded()
m_State.m_ClipH = 0;
m_State.m_Texture = -1;
m_State.m_BlendMode = CCommandBuffer::BLEND_NONE;
m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT;
m_CurrentCommandBuffer = 0;
m_pCommandBuffer = 0x0;
@ -214,6 +216,16 @@ void CGraphics_Threaded::BlendAdditive()
m_State.m_BlendMode = CCommandBuffer::BLEND_ADDITIVE;
}
void CGraphics_Threaded::WrapNormal()
{
m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT;
}
void CGraphics_Threaded::WrapClamp()
{
m_State.m_WrapMode = CCommandBuffer::WRAP_CLAMP;
}
int CGraphics_Threaded::MemoryUsage() const
{
return m_TextureMemoryUsage;

View file

@ -1,7 +1,5 @@
#pragma once
#include <base/tl/threading.h>
#include <engine/graphics.h>
class CCommandBuffer
@ -120,6 +118,12 @@ public:
BLEND_ADDITIVE,
};
enum
{
WRAP_REPEAT = 0,
WRAP_CLAMP,
};
struct SPoint { float x, y, z; };
struct STexCoord { float u, v; };
struct SColor { float r, g, b, a; };
@ -142,6 +146,7 @@ public:
struct SState
{
int m_BlendMode;
int m_WrapMode;
int m_Texture;
SPoint m_ScreenTL;
SPoint m_ScreenBR;
@ -382,6 +387,9 @@ public:
virtual void BlendNormal();
virtual void BlendAdditive();
virtual void WrapNormal();
virtual void WrapClamp();
virtual int MemoryUsage() const;
virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY);

View file

@ -1,8 +1,11 @@
/* (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 <base/math.h>
#include <base/system.h>
#include <engine/graphics.h>
#include <engine/storage.h>
#include <engine/shared/config.h>
#include "SDL.h"
@ -19,8 +22,6 @@ enum
NUM_SAMPLES = 512,
NUM_VOICES = 64,
NUM_CHANNELS = 16,
MAX_FRAMES = 1024
};
struct CSample
@ -63,7 +64,8 @@ static int m_MixingRate = 48000;
static volatile int m_SoundVolume = 100;
static int m_NextVoice = 0;
static int *m_pMixBuffer = 0; // buffer only used by the thread callback function
static unsigned m_MaxFrames = 0;
// TODO: there should be a faster way todo this
static short Int2Short(int i)
@ -84,8 +86,9 @@ static int IntAbs(int i)
static void Mix(short *pFinalOut, unsigned Frames)
{
int aMixBuffer[MAX_FRAMES*2] = {0};
int MasterVol;
mem_zero(m_pMixBuffer, m_MaxFrames*2*sizeof(int));
Frames = min(Frames, m_MaxFrames);
// aquire lock while we are mixing
lock_wait(m_SoundLock);
@ -98,7 +101,7 @@ static void Mix(short *pFinalOut, unsigned Frames)
{
// mix voice
CVoice *v = &m_aVoices[i];
int *pOut = aMixBuffer;
int *pOut = m_pMixBuffer;
int Step = v->m_pSample->m_Channels; // setup input sources
short *pInL = &v->m_pSample->m_pData[v->m_Tick*Step];
@ -176,8 +179,8 @@ static void Mix(short *pFinalOut, unsigned Frames)
for(unsigned i = 0; i < Frames; i++)
{
int j = i<<1;
int vl = ((aMixBuffer[j]*MasterVol)/101)>>8;
int vr = ((aMixBuffer[j+1]*MasterVol)/101)>>8;
int vl = ((m_pMixBuffer[j]*MasterVol)/101)>>8;
int vr = ((m_pMixBuffer[j+1]*MasterVol)/101)>>8;
pFinalOut[j] = Int2Short(vl);
pFinalOut[j+1] = Int2Short(vr);
@ -234,6 +237,9 @@ int CSound::Init()
else
dbg_msg("client/sound", "sound init successful");
m_MaxFrames = g_Config.m_SndBufferSize*2;
m_pMixBuffer = (int *)mem_alloc(m_MaxFrames*2*sizeof(int), 1);
SDL_PauseAudio(0);
m_SoundEnabled = 1;
@ -264,6 +270,11 @@ int CSound::Shutdown()
SDL_CloseAudio();
SDL_QuitSubSystem(SDL_INIT_AUDIO);
lock_destroy(m_SoundLock);
if(m_pMixBuffer)
{
mem_free(m_pMixBuffer);
m_pMixBuffer = 0;
}
return 0;
}

View file

@ -5,6 +5,11 @@
#include "kernel.h"
enum
{
MAX_TIMELINE_MARKERS=64
};
struct CDemoHeader
{
unsigned char m_aMarker[7];
@ -16,6 +21,8 @@ struct CDemoHeader
char m_aType[8];
char m_aLength[4];
char m_aTimestamp[20];
char m_aNumTimelineMarkers[4];
char m_aTimelineMarkers[MAX_TIMELINE_MARKERS][4];
};
class IDemoPlayer : public IInterface
@ -31,6 +38,9 @@ public:
int m_FirstTick;
int m_CurrentTick;
int m_LastTick;
int m_NumTimelineMarkers;
int m_aTimelineMarkers[MAX_TIMELINE_MARKERS];
};
enum
@ -42,7 +52,7 @@ public:
~IDemoPlayer() {}
virtual void SetSpeed(float Speed) = 0;
virtual int SetPos(float Precent) = 0;
virtual int SetPos(float Percent) = 0;
virtual void Pause() = 0;
virtual void Unpause() = 0;
virtual const CInfo *BaseInfo() const = 0;

View file

@ -1,25 +0,0 @@
/* gzclose.c -- zlib gzclose() function
* Copyright (C) 2004, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
/* gzclose() is in a separate file so that it is linked in only if it is used.
That way the other gzclose functions can be used instead to avoid linking in
unneeded compression or decompression routines. */
int ZEXPORT gzclose(file)
gzFile file;
{
#ifndef NO_GZCOMPRESS
gz_statep state;
if (file == NULL)
return Z_STREAM_ERROR;
state = (gz_statep)file;
return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
#else
return gzclose_r(file);
#endif
}

View file

@ -1,132 +0,0 @@
/* gzguts.h -- zlib internal header definitions for gz* operations
* Copyright (C) 2004, 2005, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef _LARGEFILE64_SOURCE
# ifndef _LARGEFILE_SOURCE
# define _LARGEFILE_SOURCE 1
# endif
# ifdef _FILE_OFFSET_BITS
# undef _FILE_OFFSET_BITS
# endif
#endif
#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ)
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
#else
# define ZLIB_INTERNAL
#endif
#include <stdio.h>
#include "zlib.h"
#ifdef STDC
# include <string.h>
# include <stdlib.h>
# include <limits.h>
#endif
#include <fcntl.h>
#ifdef NO_DEFLATE /* for compatibility with old definition */
# define NO_GZCOMPRESS
#endif
#ifdef _MSC_VER
# include <io.h>
# define vsnprintf _vsnprintf
#endif
#ifndef local
# define local static
#endif
/* compile with -Dlocal if your debugger can't find static symbols */
/* gz* functions always use library allocation functions */
#ifndef STDC
extern voidp malloc OF((uInt size));
extern void free OF((voidpf ptr));
#endif
/* get errno and strerror definition */
#if defined UNDER_CE
# include <windows.h>
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
#else
# ifdef STDC
# include <errno.h>
# define zstrerror() strerror(errno)
# else
# define zstrerror() "stdio error (consult errno)"
# endif
#endif
/* provide prototypes for these when building zlib without LFS */
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
#endif
/* default i/o buffer size -- double this for output when reading */
#define GZBUFSIZE 8192
/* gzip modes, also provide a little integrity check on the passed structure */
#define GZ_NONE 0
#define GZ_READ 7247
#define GZ_WRITE 31153
#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
/* values for gz_state how */
#define LOOK 0 /* look for a gzip header */
#define COPY 1 /* copy input directly */
#define GZIP 2 /* decompress a gzip stream */
/* internal gzip file state data structure */
typedef struct {
/* used for both reading and writing */
int mode; /* see gzip modes above */
int fd; /* file descriptor */
char *path; /* path or fd for error messages */
z_off64_t pos; /* current position in uncompressed data */
unsigned size; /* buffer size, zero if not allocated yet */
unsigned want; /* requested buffer size, default is GZBUFSIZE */
unsigned char *in; /* input buffer */
unsigned char *out; /* output buffer (double-sized when reading) */
unsigned char *next; /* next output data to deliver or write */
/* just for reading */
unsigned have; /* amount of output data unused at next */
int eof; /* true if end of input file reached */
z_off64_t start; /* where the gzip data started, for rewinding */
z_off64_t raw; /* where the raw data started, for seeking */
int how; /* 0: get header, 1: copy, 2: decompress */
int direct; /* true if last read direct, false if gzip */
/* just for writing */
int level; /* compression level */
int strategy; /* compression strategy */
/* seek request */
z_off64_t skip; /* amount to skip (already rewound if backwards) */
int seek; /* true if seek request pending */
/* error information */
int err; /* error code */
char *msg; /* error message */
/* zlib inflate or deflate stream */
z_stream strm; /* stream structure in-place (not a pointer) */
} gz_state;
typedef gz_state FAR *gz_statep;
/* shared functions */
void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
#if defined UNDER_CE
char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
#endif
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
value -- needed when comparing unsigned to z_off64_t, which is signed
(possible z_off64_t types off_t, off64_t, and long are all signed) */
#ifdef INT_MAX
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
#else
unsigned ZLIB_INTERNAL gz_intmax OF((void));
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
#endif

View file

@ -1,537 +0,0 @@
/* gzlib.c -- zlib functions common to reading and writing gzip files
* Copyright (C) 2004, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
# define LSEEK lseek
#endif
/* Local functions */
local void gz_reset OF((gz_statep));
local gzFile gz_open OF((const char *, int, const char *));
#if defined UNDER_CE
/* Map the Windows error number in ERROR to a locale-dependent error message
string and return a pointer to it. Typically, the values for ERROR come
from GetLastError.
The string pointed to shall not be modified by the application, but may be
overwritten by a subsequent call to gz_strwinerror
The gz_strwinerror function does not change the current setting of
GetLastError. */
char ZLIB_INTERNAL *gz_strwinerror (error)
DWORD error;
{
static char buf[1024];
wchar_t *msgbuf;
DWORD lasterr = GetLastError();
DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
error,
0, /* Default language */
(LPVOID)&msgbuf,
0,
NULL);
if (chars != 0) {
/* If there is an \r\n appended, zap it. */
if (chars >= 2
&& msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
chars -= 2;
msgbuf[chars] = 0;
}
if (chars > sizeof (buf) - 1) {
chars = sizeof (buf) - 1;
msgbuf[chars] = 0;
}
wcstombs(buf, msgbuf, chars + 1);
LocalFree(msgbuf);
}
else {
sprintf(buf, "unknown win32 error (%ld)", error);
}
SetLastError(lasterr);
return buf;
}
#endif /* UNDER_CE */
/* Reset gzip file state */
local void gz_reset(state)
gz_statep state;
{
if (state->mode == GZ_READ) { /* for reading ... */
state->have = 0; /* no output data available */
state->eof = 0; /* not at end of file */
state->how = LOOK; /* look for gzip header */
state->direct = 1; /* default for empty file */
}
state->seek = 0; /* no seek request pending */
gz_error(state, Z_OK, NULL); /* clear error */
state->pos = 0; /* no uncompressed data yet */
state->strm.avail_in = 0; /* no input data yet */
}
/* Open a gzip file either by name or file descriptor. */
local gzFile gz_open(path, fd, mode)
const char *path;
int fd;
const char *mode;
{
gz_statep state;
/* allocate gzFile structure to return */
state = malloc(sizeof(gz_state));
if (state == NULL)
return NULL;
state->size = 0; /* no buffers allocated yet */
state->want = GZBUFSIZE; /* requested buffer size */
state->msg = NULL; /* no error message yet */
/* interpret mode */
state->mode = GZ_NONE;
state->level = Z_DEFAULT_COMPRESSION;
state->strategy = Z_DEFAULT_STRATEGY;
while (*mode) {
if (*mode >= '0' && *mode <= '9')
state->level = *mode - '0';
else
switch (*mode) {
case 'r':
state->mode = GZ_READ;
break;
#ifndef NO_GZCOMPRESS
case 'w':
state->mode = GZ_WRITE;
break;
case 'a':
state->mode = GZ_APPEND;
break;
#endif
case '+': /* can't read and write at the same time */
free(state);
return NULL;
case 'b': /* ignore -- will request binary anyway */
break;
case 'f':
state->strategy = Z_FILTERED;
break;
case 'h':
state->strategy = Z_HUFFMAN_ONLY;
break;
case 'R':
state->strategy = Z_RLE;
break;
case 'F':
state->strategy = Z_FIXED;
default: /* could consider as an error, but just ignore */
;
}
mode++;
}
/* must provide an "r", "w", or "a" */
if (state->mode == GZ_NONE) {
free(state);
return NULL;
}
/* save the path name for error messages */
state->path = malloc(strlen(path) + 1);
if (state->path == NULL) {
free(state);
return NULL;
}
strcpy(state->path, path);
/* open the file with the appropriate mode (or just use fd) */
state->fd = fd != -1 ? fd :
open(path,
#ifdef O_LARGEFILE
O_LARGEFILE |
#endif
#ifdef O_BINARY
O_BINARY |
#endif
(state->mode == GZ_READ ?
O_RDONLY :
(O_WRONLY | O_CREAT | (
state->mode == GZ_WRITE ?
O_TRUNC :
O_APPEND))),
0666);
if (state->fd == -1) {
free(state->path);
free(state);
return NULL;
}
if (state->mode == GZ_APPEND)
state->mode = GZ_WRITE; /* simplify later checks */
/* save the current position for rewinding (only if reading) */
if (state->mode == GZ_READ) {
state->start = LSEEK(state->fd, 0, SEEK_CUR);
if (state->start == -1) state->start = 0;
}
/* initialize stream */
gz_reset(state);
/* return stream */
return (gzFile)state;
}
/* -- see zlib.h -- */
gzFile ZEXPORT gzopen(path, mode)
const char *path;
const char *mode;
{
return gz_open(path, -1, mode);
}
/* -- see zlib.h -- */
gzFile ZEXPORT gzopen64(path, mode)
const char *path;
const char *mode;
{
return gz_open(path, -1, mode);
}
/* -- see zlib.h -- */
gzFile ZEXPORT gzdopen(fd, mode)
int fd;
const char *mode;
{
char *path; /* identifier for error messages */
gzFile gz;
if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL)
return NULL;
sprintf(path, "<fd:%d>", fd); /* for debugging */
gz = gz_open(path, fd, mode);
free(path);
return gz;
}
/* -- see zlib.h -- */
int ZEXPORT gzbuffer(file, size)
gzFile file;
unsigned size;
{
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return -1;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return -1;
/* make sure we haven't already allocated memory */
if (state->size != 0)
return -1;
/* check and set requested size */
if (size == 0)
return -1;
state->want = size;
return 0;
}
/* -- see zlib.h -- */
int ZEXPORT gzrewind(file)
gzFile file;
{
gz_statep state;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
/* check that we're reading and that there's no error */
if (state->mode != GZ_READ || state->err != Z_OK)
return -1;
/* back up and start over */
if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
return -1;
gz_reset(state);
return 0;
}
/* -- see zlib.h -- */
z_off64_t ZEXPORT gzseek64(file, offset, whence)
gzFile file;
z_off64_t offset;
int whence;
{
unsigned n;
z_off64_t ret;
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return -1;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return -1;
/* check that there's no error */
if (state->err != Z_OK)
return -1;
/* can only seek from start or relative to current position */
if (whence != SEEK_SET && whence != SEEK_CUR)
return -1;
/* normalize offset to a SEEK_CUR specification */
if (whence == SEEK_SET)
offset -= state->pos;
else if (state->seek)
offset += state->skip;
state->seek = 0;
/* if within raw area while reading, just go there */
if (state->mode == GZ_READ && state->how == COPY &&
state->pos + offset >= state->raw) {
ret = LSEEK(state->fd, offset - state->have, SEEK_CUR);
if (ret == -1)
return -1;
state->have = 0;
state->eof = 0;
state->seek = 0;
gz_error(state, Z_OK, NULL);
state->strm.avail_in = 0;
state->pos += offset;
return state->pos;
}
/* calculate skip amount, rewinding if needed for back seek when reading */
if (offset < 0) {
if (state->mode != GZ_READ) /* writing -- can't go backwards */
return -1;
offset += state->pos;
if (offset < 0) /* before start of file! */
return -1;
if (gzrewind(file) == -1) /* rewind, then skip to offset */
return -1;
}
/* if reading, skip what's in output buffer (one less gzgetc() check) */
if (state->mode == GZ_READ) {
n = GT_OFF(state->have) || (z_off64_t)state->have > offset ?
(unsigned)offset : state->have;
state->have -= n;
state->next += n;
state->pos += n;
offset -= n;
}
/* request skip (if not zero) */
if (offset) {
state->seek = 1;
state->skip = offset;
}
return state->pos + offset;
}
/* -- see zlib.h -- */
z_off_t ZEXPORT gzseek(file, offset, whence)
gzFile file;
z_off_t offset;
int whence;
{
z_off64_t ret;
ret = gzseek64(file, (z_off64_t)offset, whence);
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
}
/* -- see zlib.h -- */
z_off64_t ZEXPORT gztell64(file)
gzFile file;
{
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return -1;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return -1;
/* return position */
return state->pos + (state->seek ? state->skip : 0);
}
/* -- see zlib.h -- */
z_off_t ZEXPORT gztell(file)
gzFile file;
{
z_off64_t ret;
ret = gztell64(file);
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
}
/* -- see zlib.h -- */
z_off64_t ZEXPORT gzoffset64(file)
gzFile file;
{
z_off64_t offset;
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return -1;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return -1;
/* compute and return effective offset in file */
offset = LSEEK(state->fd, 0, SEEK_CUR);
if (offset == -1)
return -1;
if (state->mode == GZ_READ) /* reading */
offset -= state->strm.avail_in; /* don't count buffered input */
return offset;
}
/* -- see zlib.h -- */
z_off_t ZEXPORT gzoffset(file)
gzFile file;
{
z_off64_t ret;
ret = gzoffset64(file);
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
}
/* -- see zlib.h -- */
int ZEXPORT gzeof(file)
gzFile file;
{
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return 0;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return 0;
/* return end-of-file state */
return state->mode == GZ_READ ?
(state->eof && state->strm.avail_in == 0 && state->have == 0) : 0;
}
/* -- see zlib.h -- */
const char * ZEXPORT gzerror(file, errnum)
gzFile file;
int *errnum;
{
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return NULL;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return NULL;
/* return error information */
if (errnum != NULL)
*errnum = state->err;
return state->msg == NULL ? "" : state->msg;
}
/* -- see zlib.h -- */
void ZEXPORT gzclearerr(file)
gzFile file;
{
gz_statep state;
/* get internal structure and check integrity */
if (file == NULL)
return;
state = (gz_statep)file;
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
return;
/* clear error and end-of-file */
if (state->mode == GZ_READ)
state->eof = 0;
gz_error(state, Z_OK, NULL);
}
/* Create an error message in allocated memory and set state->err and
state->msg accordingly. Free any previous error message already there. Do
not try to free or allocate space if the error is Z_MEM_ERROR (out of
memory). Simply save the error message as a static string. If there is an
allocation failure constructing the error message, then convert the error to
out of memory. */
void ZLIB_INTERNAL gz_error(state, err, msg)
gz_statep state;
int err;
const char *msg;
{
/* free previously allocated message and clear */
if (state->msg != NULL) {
if (state->err != Z_MEM_ERROR)
free(state->msg);
state->msg = NULL;
}
/* set error code, and if no message, then done */
state->err = err;
if (msg == NULL)
return;
/* for an out of memory error, save as static string */
if (err == Z_MEM_ERROR) {
state->msg = (char *)msg;
return;
}
/* construct error message with path */
if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) {
state->err = Z_MEM_ERROR;
state->msg = (char *)"out of memory";
return;
}
strcpy(state->msg, state->path);
strcat(state->msg, ": ");
strcat(state->msg, msg);
return;
}
#ifndef INT_MAX
/* portably return maximum value for an int (when limits.h presumed not
available) -- we need to do this to cover cases where 2's complement not
used, since C standard permits 1's complement and sign-bit representations,
otherwise we could just use ((unsigned)-1) >> 1 */
unsigned ZLIB_INTERNAL gz_intmax()
{
unsigned p, q;
p = 1;
do {
q = p;
p <<= 1;
p++;
} while (p > q);
return q >> 1;
}
#endif

View file

@ -1,653 +0,0 @@
/* gzread.c -- zlib functions for reading gzip files
* Copyright (C) 2004, 2005, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
/* Local functions */
local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
local int gz_avail OF((gz_statep));
local int gz_next4 OF((gz_statep, unsigned long *));
local int gz_head OF((gz_statep));
local int gz_decomp OF((gz_statep));
local int gz_make OF((gz_statep));
local int gz_skip OF((gz_statep, z_off64_t));
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
state->fd, and update state->eof, state->err, and state->msg as appropriate.
This function needs to loop on read(), since read() is not guaranteed to
read the number of bytes requested, depending on the type of descriptor. */
local int gz_load(state, buf, len, have)
gz_statep state;
unsigned char *buf;
unsigned len;
unsigned *have;
{
int ret;
*have = 0;
do {
ret = read(state->fd, buf + *have, len - *have);
if (ret <= 0)
break;
*have += ret;
} while (*have < len);
if (ret < 0) {
gz_error(state, Z_ERRNO, zstrerror());
return -1;
}
if (ret == 0)
state->eof = 1;
return 0;
}
/* Load up input buffer and set eof flag if last data loaded -- return -1 on
error, 0 otherwise. Note that the eof flag is set when the end of the input
file is reached, even though there may be unused data in the buffer. Once
that data has been used, no more attempts will be made to read the file.
gz_avail() assumes that strm->avail_in == 0. */
local int gz_avail(state)
gz_statep state;
{
z_streamp strm = &(state->strm);
if (state->err != Z_OK)
return -1;
if (state->eof == 0) {
if (gz_load(state, state->in, state->size,
(unsigned *)&(strm->avail_in)) == -1)
return -1;
strm->next_in = state->in;
}
return 0;
}
/* Get next byte from input, or -1 if end or error. */
#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \
(strm->avail_in == 0 ? -1 : \
(strm->avail_in--, *(strm->next_in)++)))
/* Get a four-byte little-endian integer and return 0 on success and the value
in *ret. Otherwise -1 is returned and *ret is not modified. */
local int gz_next4(state, ret)
gz_statep state;
unsigned long *ret;
{
int ch;
unsigned long val;
z_streamp strm = &(state->strm);
val = NEXT();
val += (unsigned)NEXT() << 8;
val += (unsigned long)NEXT() << 16;
ch = NEXT();
if (ch == -1)
return -1;
val += (unsigned long)ch << 24;
*ret = val;
return 0;
}
/* Look for gzip header, set up for inflate or copy. state->have must be zero.
If this is the first time in, allocate required memory. state->how will be
left unchanged if there is no more input data available, will be set to COPY
if there is no gzip header and direct copying will be performed, or it will
be set to GZIP for decompression, and the gzip header will be skipped so
that the next available input data is the raw deflate stream. If direct
copying, then leftover input data from the input buffer will be copied to
the output buffer. In that case, all further file reads will be directly to
either the output buffer or a user buffer. If decompressing, the inflate
state and the check value will be initialized. gz_head() will return 0 on
success or -1 on failure. Failures may include read errors or gzip header
errors. */
local int gz_head(state)
gz_statep state;
{
z_streamp strm = &(state->strm);
int flags;
unsigned len;
/* allocate read buffers and inflate memory */
if (state->size == 0) {
/* allocate buffers */
state->in = malloc(state->want);
state->out = malloc(state->want << 1);
if (state->in == NULL || state->out == NULL) {
if (state->out != NULL)
free(state->out);
if (state->in != NULL)
free(state->in);
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
state->size = state->want;
/* allocate inflate memory */
state->strm.zalloc = Z_NULL;
state->strm.zfree = Z_NULL;
state->strm.opaque = Z_NULL;
state->strm.avail_in = 0;
state->strm.next_in = Z_NULL;
if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */
free(state->out);
free(state->in);
state->size = 0;
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
}
/* get some data in the input buffer */
if (strm->avail_in == 0) {
if (gz_avail(state) == -1)
return -1;
if (strm->avail_in == 0)
return 0;
}
/* look for the gzip magic header bytes 31 and 139 */
if (strm->next_in[0] == 31) {
strm->avail_in--;
strm->next_in++;
if (strm->avail_in == 0 && gz_avail(state) == -1)
return -1;
if (strm->avail_in && strm->next_in[0] == 139) {
/* we have a gzip header, woo hoo! */
strm->avail_in--;
strm->next_in++;
/* skip rest of header */
if (NEXT() != 8) { /* compression method */
gz_error(state, Z_DATA_ERROR, "unknown compression method");
return -1;
}
flags = NEXT();
if (flags & 0xe0) { /* reserved flag bits */
gz_error(state, Z_DATA_ERROR, "unknown header flags set");
return -1;
}
NEXT(); /* modification time */
NEXT();
NEXT();
NEXT();
NEXT(); /* extra flags */
NEXT(); /* operating system */
if (flags & 4) { /* extra field */
len = (unsigned)NEXT();
len += (unsigned)NEXT() << 8;
while (len--)
if (NEXT() < 0)
break;
}
if (flags & 8) /* file name */
while (NEXT() > 0)
;
if (flags & 16) /* comment */
while (NEXT() > 0)
;
if (flags & 2) { /* header crc */
NEXT();
NEXT();
}
/* an unexpected end of file is not checked for here -- it will be
noticed on the first request for uncompressed data */
/* set up for decompression */
inflateReset(strm);
strm->adler = crc32(0L, Z_NULL, 0);
state->how = GZIP;
state->direct = 0;
return 0;
}
else {
/* not a gzip file -- save first byte (31) and fall to raw i/o */
state->out[0] = 31;
state->have = 1;
}
}
/* doing raw i/o, save start of raw data for seeking, copy any leftover
input to output -- this assumes that the output buffer is larger than
the input buffer, which also assures space for gzungetc() */
state->raw = state->pos;
state->next = state->out;
if (strm->avail_in) {
memcpy(state->next + state->have, strm->next_in, strm->avail_in);
state->have += strm->avail_in;
strm->avail_in = 0;
}
state->how = COPY;
state->direct = 1;
return 0;
}
/* Decompress from input to the provided next_out and avail_out in the state.
If the end of the compressed data is reached, then verify the gzip trailer
check value and length (modulo 2^32). state->have and state->next are set
to point to the just decompressed data, and the crc is updated. If the
trailer is verified, state->how is reset to LOOK to look for the next gzip
stream or raw data, once state->have is depleted. Returns 0 on success, -1
on failure. Failures may include invalid compressed data or a failed gzip
trailer verification. */
local int gz_decomp(state)
gz_statep state;
{
int ret;
unsigned had;
unsigned long crc, len;
z_streamp strm = &(state->strm);
/* fill output buffer up to end of deflate stream */
had = strm->avail_out;
do {
/* get more input for inflate() */
if (strm->avail_in == 0 && gz_avail(state) == -1)
return -1;
if (strm->avail_in == 0) {
gz_error(state, Z_DATA_ERROR, "unexpected end of file");
return -1;
}
/* decompress and handle errors */
ret = inflate(strm, Z_NO_FLUSH);
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
gz_error(state, Z_STREAM_ERROR,
"internal error: inflate stream corrupt");
return -1;
}
if (ret == Z_MEM_ERROR) {
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
gz_error(state, Z_DATA_ERROR,
strm->msg == NULL ? "compressed data error" : strm->msg);
return -1;
}
} while (strm->avail_out && ret != Z_STREAM_END);
/* update available output and crc check value */
state->have = had - strm->avail_out;
state->next = strm->next_out - state->have;
strm->adler = crc32(strm->adler, state->next, state->have);
/* check gzip trailer if at end of deflate stream */
if (ret == Z_STREAM_END) {
if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) {
gz_error(state, Z_DATA_ERROR, "unexpected end of file");
return -1;
}
if (crc != strm->adler) {
gz_error(state, Z_DATA_ERROR, "incorrect data check");
return -1;
}
if (len != (strm->total_out & 0xffffffffL)) {
gz_error(state, Z_DATA_ERROR, "incorrect length check");
return -1;
}
state->how = LOOK; /* ready for next stream, once have is 0 (leave
state->direct unchanged to remember how) */
}
/* good decompression */
return 0;
}
/* Make data and put in the output buffer. Assumes that state->have == 0.
Data is either copied from the input file or decompressed from the input
file depending on state->how. If state->how is LOOK, then a gzip header is
looked for (and skipped if found) to determine wither to copy or decompress.
Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY
or GZIP unless the end of the input file has been reached and all data has
been processed. */
local int gz_make(state)
gz_statep state;
{
z_streamp strm = &(state->strm);
if (state->how == LOOK) { /* look for gzip header */
if (gz_head(state) == -1)
return -1;
if (state->have) /* got some data from gz_head() */
return 0;
}
if (state->how == COPY) { /* straight copy */
if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1)
return -1;
state->next = state->out;
}
else if (state->how == GZIP) { /* decompress */
strm->avail_out = state->size << 1;
strm->next_out = state->out;
if (gz_decomp(state) == -1)
return -1;
}
return 0;
}
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
local int gz_skip(state, len)
gz_statep state;
z_off64_t len;
{
unsigned n;
/* skip over len bytes or reach end-of-file, whichever comes first */
while (len)
/* skip over whatever is in output buffer */
if (state->have) {
n = GT_OFF(state->have) || (z_off64_t)state->have > len ?
(unsigned)len : state->have;
state->have -= n;
state->next += n;
state->pos += n;
len -= n;
}
/* output buffer empty -- return if we're at the end of the input */
else if (state->eof && state->strm.avail_in == 0)
break;
/* need more data to skip -- load up output buffer */
else {
/* get more output, looking for header if required */
if (gz_make(state) == -1)
return -1;
}
return 0;
}
/* -- see zlib.h -- */
int ZEXPORT gzread(file, buf, len)
gzFile file;
voidp buf;
unsigned len;
{
unsigned got, n;
gz_statep state;
z_streamp strm;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're reading and that there's no error */
if (state->mode != GZ_READ || state->err != Z_OK)
return -1;
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids the flaw in the interface) */
if ((int)len < 0) {
gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
return -1;
}
/* if len is zero, avoid unnecessary operations */
if (len == 0)
return 0;
/* process a skip request */
if (state->seek) {
state->seek = 0;
if (gz_skip(state, state->skip) == -1)
return -1;
}
/* get len bytes to buf, or less than len if at the end */
got = 0;
do {
/* first just try copying data from the output buffer */
if (state->have) {
n = state->have > len ? len : state->have;
memcpy(buf, state->next, n);
state->next += n;
state->have -= n;
}
/* output buffer empty -- return if we're at the end of the input */
else if (state->eof && strm->avail_in == 0)
break;
/* need output data -- for small len or new stream load up our output
buffer */
else if (state->how == LOOK || len < (state->size << 1)) {
/* get more output, looking for header if required */
if (gz_make(state) == -1)
return -1;
continue; /* no progress yet -- go back to memcpy() above */
/* the copy above assures that we will leave with space in the
output buffer, allowing at least one gzungetc() to succeed */
}
/* large len -- read directly into user buffer */
else if (state->how == COPY) { /* read directly */
if (gz_load(state, buf, len, &n) == -1)
return -1;
}
/* large len -- decompress directly into user buffer */
else { /* state->how == GZIP */
strm->avail_out = len;
strm->next_out = buf;
if (gz_decomp(state) == -1)
return -1;
n = state->have;
state->have = 0;
}
/* update progress */
len -= n;
buf = (char *)buf + n;
got += n;
state->pos += n;
} while (len);
/* return number of bytes read into user buffer (will fit in int) */
return (int)got;
}
/* -- see zlib.h -- */
int ZEXPORT gzgetc(file)
gzFile file;
{
int ret;
unsigned char buf[1];
gz_statep state;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
/* check that we're reading and that there's no error */
if (state->mode != GZ_READ || state->err != Z_OK)
return -1;
/* try output buffer (no need to check for skip request) */
if (state->have) {
state->have--;
state->pos++;
return *(state->next)++;
}
/* nothing there -- try gzread() */
ret = gzread(file, buf, 1);
return ret < 1 ? -1 : buf[0];
}
/* -- see zlib.h -- */
int ZEXPORT gzungetc(c, file)
int c;
gzFile file;
{
gz_statep state;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
/* check that we're reading and that there's no error */
if (state->mode != GZ_READ || state->err != Z_OK)
return -1;
/* process a skip request */
if (state->seek) {
state->seek = 0;
if (gz_skip(state, state->skip) == -1)
return -1;
}
/* can't push EOF */
if (c < 0)
return -1;
/* if output buffer empty, put byte at end (allows more pushing) */
if (state->have == 0) {
state->have = 1;
state->next = state->out + (state->size << 1) - 1;
state->next[0] = c;
state->pos--;
return c;
}
/* if no room, give up (must have already done a gzungetc()) */
if (state->have == (state->size << 1)) {
gz_error(state, Z_BUF_ERROR, "out of room to push characters");
return -1;
}
/* slide output data if needed and insert byte before existing data */
if (state->next == state->out) {
unsigned char *src = state->out + state->have;
unsigned char *dest = state->out + (state->size << 1);
while (src > state->out)
*--dest = *--src;
state->next = dest;
}
state->have++;
state->next--;
state->next[0] = c;
state->pos--;
return c;
}
/* -- see zlib.h -- */
char * ZEXPORT gzgets(file, buf, len)
gzFile file;
char *buf;
int len;
{
unsigned left, n;
char *str;
unsigned char *eol;
gz_statep state;
/* check parameters and get internal structure */
if (file == NULL || buf == NULL || len < 1)
return NULL;
state = (gz_statep)file;
/* check that we're reading and that there's no error */
if (state->mode != GZ_READ || state->err != Z_OK)
return NULL;
/* process a skip request */
if (state->seek) {
state->seek = 0;
if (gz_skip(state, state->skip) == -1)
return NULL;
}
/* copy output bytes up to new line or len - 1, whichever comes first --
append a terminating zero to the string (we don't check for a zero in
the contents, let the user worry about that) */
str = buf;
left = (unsigned)len - 1;
if (left) do {
/* assure that something is in the output buffer */
if (state->have == 0) {
if (gz_make(state) == -1)
return NULL; /* error */
if (state->have == 0) { /* end of file */
if (buf == str) /* got bupkus */
return NULL;
break; /* got something -- return it */
}
}
/* look for end-of-line in current output buffer */
n = state->have > left ? left : state->have;
eol = memchr(state->next, '\n', n);
if (eol != NULL)
n = (unsigned)(eol - state->next) + 1;
/* copy through end-of-line, or remainder if not found */
memcpy(buf, state->next, n);
state->have -= n;
state->next += n;
state->pos += n;
left -= n;
buf += n;
} while (left && eol == NULL);
/* found end-of-line or out of space -- terminate string and return it */
buf[0] = 0;
return str;
}
/* -- see zlib.h -- */
int ZEXPORT gzdirect(file)
gzFile file;
{
gz_statep state;
/* get internal structure */
if (file == NULL)
return 0;
state = (gz_statep)file;
/* check that we're reading */
if (state->mode != GZ_READ)
return 0;
/* if the state is not known, but we can find out, then do so (this is
mainly for right after a gzopen() or gzdopen()) */
if (state->how == LOOK && state->have == 0)
(void)gz_head(state);
/* return 1 if reading direct, 0 if decompressing a gzip stream */
return state->direct;
}
/* -- see zlib.h -- */
int ZEXPORT gzclose_r(file)
gzFile file;
{
int ret;
gz_statep state;
/* get internal structure */
if (file == NULL)
return Z_STREAM_ERROR;
state = (gz_statep)file;
/* check that we're reading */
if (state->mode != GZ_READ)
return Z_STREAM_ERROR;
/* free memory and close file */
if (state->size) {
inflateEnd(&(state->strm));
free(state->out);
free(state->in);
}
gz_error(state, Z_OK, NULL);
free(state->path);
ret = close(state->fd);
free(state);
return ret ? Z_ERRNO : Z_OK;
}

View file

@ -1,531 +0,0 @@
/* gzwrite.c -- zlib functions for writing gzip files
* Copyright (C) 2004, 2005, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
/* Local functions */
local int gz_init OF((gz_statep));
local int gz_comp OF((gz_statep, int));
local int gz_zero OF((gz_statep, z_off64_t));
/* Initialize state for writing a gzip file. Mark initialization by setting
state->size to non-zero. Return -1 on failure or 0 on success. */
local int gz_init(state)
gz_statep state;
{
int ret;
z_streamp strm = &(state->strm);
/* allocate input and output buffers */
state->in = malloc(state->want);
state->out = malloc(state->want);
if (state->in == NULL || state->out == NULL) {
if (state->out != NULL)
free(state->out);
if (state->in != NULL)
free(state->in);
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
/* allocate deflate memory, set up for gzip compression */
strm->zalloc = Z_NULL;
strm->zfree = Z_NULL;
strm->opaque = Z_NULL;
ret = deflateInit2(strm, state->level, Z_DEFLATED,
15 + 16, 8, state->strategy);
if (ret != Z_OK) {
free(state->in);
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
/* mark state as initialized */
state->size = state->want;
/* initialize write buffer */
strm->avail_out = state->size;
strm->next_out = state->out;
state->next = strm->next_out;
return 0;
}
/* Compress whatever is at avail_in and next_in and write to the output file.
Return -1 if there is an error writing to the output file, otherwise 0.
flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH,
then the deflate() state is reset to start a new gzip stream. */
local int gz_comp(state, flush)
gz_statep state;
int flush;
{
int ret, got;
unsigned have;
z_streamp strm = &(state->strm);
/* allocate memory if this is the first time through */
if (state->size == 0 && gz_init(state) == -1)
return -1;
/* run deflate() on provided input until it produces no more output */
ret = Z_OK;
do {
/* write out current buffer contents if full, or if flushing, but if
doing Z_FINISH then don't write until we get to Z_STREAM_END */
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
(flush != Z_FINISH || ret == Z_STREAM_END))) {
have = (unsigned)(strm->next_out - state->next);
if (have && ((got = write(state->fd, state->next, have)) < 0 ||
(unsigned)got != have)) {
gz_error(state, Z_ERRNO, zstrerror());
return -1;
}
if (strm->avail_out == 0) {
strm->avail_out = state->size;
strm->next_out = state->out;
}
state->next = strm->next_out;
}
/* compress */
have = strm->avail_out;
ret = deflate(strm, flush);
if (ret == Z_STREAM_ERROR) {
gz_error(state, Z_STREAM_ERROR,
"internal error: deflate stream corrupt");
return -1;
}
have -= strm->avail_out;
} while (have);
/* if that completed a deflate stream, allow another to start */
if (flush == Z_FINISH)
deflateReset(strm);
/* all done, no errors */
return 0;
}
/* Compress len zeros to output. Return -1 on error, 0 on success. */
local int gz_zero(state, len)
gz_statep state;
z_off64_t len;
{
int first;
unsigned n;
z_streamp strm = &(state->strm);
/* consume whatever's left in the input buffer */
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
return -1;
/* compress len zeros (len guaranteed > 0) */
first = 1;
while (len) {
n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
(unsigned)len : state->size;
if (first) {
memset(state->in, 0, n);
first = 0;
}
strm->avail_in = n;
strm->next_in = state->in;
state->pos += n;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return -1;
len -= n;
}
return 0;
}
/* -- see zlib.h -- */
int ZEXPORT gzwrite(file, buf, len)
gzFile file;
voidpc buf;
unsigned len;
{
unsigned put = len;
unsigned n;
gz_statep state;
z_streamp strm;
/* get internal structure */
if (file == NULL)
return 0;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return 0;
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids the flaw in the interface) */
if ((int)len < 0) {
gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
return 0;
}
/* if len is zero, avoid unnecessary operations */
if (len == 0)
return 0;
/* allocate memory if this is the first time through */
if (state->size == 0 && gz_init(state) == -1)
return 0;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return 0;
}
/* for small len, copy to input buffer, otherwise compress directly */
if (len < state->size) {
/* copy to input buffer, compress when full */
do {
if (strm->avail_in == 0)
strm->next_in = state->in;
n = state->size - strm->avail_in;
if (n > len)
n = len;
memcpy(strm->next_in + strm->avail_in, buf, n);
strm->avail_in += n;
state->pos += n;
buf = (char *)buf + n;
len -= n;
if (len && gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
} while (len);
}
else {
/* consume whatever's left in the input buffer */
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
/* directly compress user buffer to file */
strm->avail_in = len;
strm->next_in = (voidp)buf;
state->pos += len;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
}
/* input was all buffered or compressed (put will fit in int) */
return (int)put;
}
/* -- see zlib.h -- */
int ZEXPORT gzputc(file, c)
gzFile file;
int c;
{
unsigned char buf[1];
gz_statep state;
z_streamp strm;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return -1;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return -1;
}
/* try writing to input buffer for speed (state->size == 0 if buffer not
initialized) */
if (strm->avail_in < state->size) {
if (strm->avail_in == 0)
strm->next_in = state->in;
strm->next_in[strm->avail_in++] = c;
state->pos++;
return c;
}
/* no room in buffer or not initialized, use gz_write() */
buf[0] = c;
if (gzwrite(file, buf, 1) != 1)
return -1;
return c;
}
/* -- see zlib.h -- */
int ZEXPORT gzputs(file, str)
gzFile file;
const char *str;
{
int ret;
unsigned len;
/* write string */
len = (unsigned)strlen(str);
ret = gzwrite(file, str, len);
return ret == 0 && len != 0 ? -1 : ret;
}
#ifdef STDC
#include <stdarg.h>
/* -- see zlib.h -- */
int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
{
int size, len;
gz_statep state;
z_streamp strm;
va_list va;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return 0;
/* make sure we have some buffer space */
if (state->size == 0 && gz_init(state) == -1)
return 0;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return 0;
}
/* consume whatever's left in the input buffer */
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
/* do the printf() into the input buffer, put length in len */
size = (int)(state->size);
state->in[size - 1] = 0;
va_start(va, format);
#ifdef NO_vsnprintf
# ifdef HAS_vsprintf_void
(void)vsprintf(state->in, format, va);
va_end(va);
for (len = 0; len < size; len++)
if (state->in[len] == 0) break;
# else
len = vsprintf(state->in, format, va);
va_end(va);
# endif
#else
# ifdef HAS_vsnprintf_void
(void)vsnprintf(state->in, size, format, va);
va_end(va);
len = strlen(state->in);
# else
len = vsnprintf((char *)(state->in), size, format, va);
va_end(va);
# endif
#endif
/* check that printf() results fit in buffer */
if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
return 0;
/* update buffer and position, defer compression until needed */
strm->avail_in = (unsigned)len;
strm->next_in = state->in;
state->pos += len;
return len;
}
#else /* !STDC */
/* -- see zlib.h -- */
int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
gzFile file;
const char *format;
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
{
int size, len;
gz_statep state;
z_streamp strm;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return 0;
/* make sure we have some buffer space */
if (state->size == 0 && gz_init(state) == -1)
return 0;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return 0;
}
/* consume whatever's left in the input buffer */
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
/* do the printf() into the input buffer, put length in len */
size = (int)(state->size);
state->in[size - 1] = 0;
#ifdef NO_snprintf
# ifdef HAS_sprintf_void
sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
for (len = 0; len < size; len++)
if (state->in[len] == 0) break;
# else
len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
# endif
#else
# ifdef HAS_snprintf_void
snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
len = strlen(state->in);
# else
len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
# endif
#endif
/* check that printf() results fit in buffer */
if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
return 0;
/* update buffer and position, defer compression until needed */
strm->avail_in = (unsigned)len;
strm->next_in = state->in;
state->pos += len;
return len;
}
#endif
/* -- see zlib.h -- */
int ZEXPORT gzflush(file, flush)
gzFile file;
int flush;
{
gz_statep state;
/* get internal structure */
if (file == NULL)
return -1;
state = (gz_statep)file;
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return Z_STREAM_ERROR;
/* check flush parameter */
if (flush < 0 || flush > Z_FINISH)
return Z_STREAM_ERROR;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return -1;
}
/* compress remaining data with requested flush */
gz_comp(state, flush);
return state->err;
}
/* -- see zlib.h -- */
int ZEXPORT gzsetparams(file, level, strategy)
gzFile file;
int level;
int strategy;
{
gz_statep state;
z_streamp strm;
/* get internal structure */
if (file == NULL)
return Z_STREAM_ERROR;
state = (gz_statep)file;
strm = &(state->strm);
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return Z_STREAM_ERROR;
/* if no change is requested, then do nothing */
if (level == state->level && strategy == state->strategy)
return Z_OK;
/* check for seek request */
if (state->seek) {
state->seek = 0;
if (gz_zero(state, state->skip) == -1)
return -1;
}
/* change compression parameters for subsequent input */
if (state->size) {
/* flush previous input with previous parameters before changing */
if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)
return state->err;
deflateParams(strm, level, strategy);
}
state->level = level;
state->strategy = strategy;
return Z_OK;
}
/* -- see zlib.h -- */
int ZEXPORT gzclose_w(file)
gzFile file;
{
int ret = 0;
gz_statep state;
/* get internal structure */
if (file == NULL)
return Z_STREAM_ERROR;
state = (gz_statep)file;
/* check that we're writing */
if (state->mode != GZ_WRITE)
return Z_STREAM_ERROR;
/* check for seek request */
if (state->seek) {
state->seek = 0;
ret += gz_zero(state, state->skip);
}
/* flush, free memory, and close file */
ret += gz_comp(state, Z_FINISH);
(void)deflateEnd(&(state->strm));
free(state->out);
free(state->in);
gz_error(state, Z_OK, NULL);
free(state->path);
ret += close(state->fd);
free(state);
return ret ? Z_ERRNO : Z_OK;
}

View file

@ -5,7 +5,6 @@
#include "kernel.h"
#include <base/tl/threading.h>
class CImageInfo
{
@ -77,6 +76,8 @@ public:
virtual void BlendNone() = 0;
virtual void BlendNormal() = 0;
virtual void BlendAdditive() = 0;
virtual void WrapNormal() = 0;
virtual void WrapClamp() = 0;
virtual int MemoryUsage() const = 0;
virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) = 0;
@ -137,7 +138,7 @@ public:
virtual void Swap() = 0;
// syncronization
virtual void InsertSignal(semaphore *pSemaphore) = 0;
virtual void InsertSignal(class semaphore *pSemaphore) = 0;
virtual bool IsIdle() = 0;
virtual void WaitForIdle() = 0;
};

View file

@ -65,6 +65,7 @@ public:
virtual void Kick(int ClientID, const char *pReason) = 0;
virtual void DemoRecorder_HandleAutoStart() = 0;
virtual bool DemoRecorder_IsRecording() = 0;
// DDRace

View file

@ -1336,7 +1336,7 @@ int CServer::Run()
// start server
NETADDR BindAddr;
if(g_Config.m_SvBindaddr[0] && net_host_lookup(g_Config.m_SvBindaddr, &BindAddr, NETTYPE_ALL) == 0)
if(g_Config.m_Bindaddr[0] && net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) == 0)
{
// sweet!
BindAddr.port = g_Config.m_SvPort;
@ -1350,7 +1350,7 @@ int CServer::Run()
if(!m_NetServer.Open(BindAddr, &m_ServerBan, g_Config.m_SvMaxClients, g_Config.m_SvMaxClientsPerIP, 0))
{
dbg_msg("server", "couldn't open socket. port might already be in use");
dbg_msg("server", "couldn't open socket. port %d might already be in use", g_Config.m_SvPort);
return -1;
}
@ -1567,6 +1567,11 @@ void CServer::DemoRecorder_HandleAutoStart()
}
}
bool CServer::DemoRecorder_IsRecording()
{
return m_DemoRecorder.IsRecording();
}
void CServer::ConRecord(IConsole::IResult *pResult, void *pUser)
{
CServer* pServer = (CServer *)pUser;
@ -1742,7 +1747,7 @@ int main(int argc, const char **argv) // ignore_convention
IGameServer *pGameServer = CreateGameServer();
IConsole *pConsole = CreateConsole(CFGFLAG_SERVER|CFGFLAG_ECON);
IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer();
IStorage *pStorage = CreateStorage("Teeworlds", argc, argv); // ignore_convention
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention
IConfig *pConfig = CreateConfig();
pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole);

View file

@ -181,6 +181,7 @@ public:
void Kick(int ClientID, const char *pReason);
void DemoRecorder_HandleAutoStart();
bool DemoRecorder_IsRecording();
//int Tick()
int64 TickStartTime(int Tick);

View file

@ -17,6 +17,7 @@ MACRO_CONFIG_INT(ConsoleOutputLevel, console_output_level, 0, 0, 2, CFGFLAG_CLIE
MACRO_CONFIG_INT(ClCpuThrottle, cl_cpu_throttle, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "")
MACRO_CONFIG_INT(ClLoadCountryFlags, cl_load_country_flags, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Load and show country flags")
MACRO_CONFIG_INT(ClAutoDemoRecord, cl_auto_demo_record, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Automatically record demos")
MACRO_CONFIG_INT(ClAutoDemoMax, cl_auto_demo_max, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Maximum number of automatically recorded demos (0 = no limit)")
@ -47,7 +48,7 @@ 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(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, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size")
MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size")
MACRO_CONFIG_INT(SndRate, snd_rate, 48000, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound mixing rate")
MACRO_CONFIG_INT(SndEnable, snd_enable, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound enable")
MACRO_CONFIG_INT(SndMusic, snd_enable_music, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Play background music")
@ -77,7 +78,7 @@ MACRO_CONFIG_INT(GfxThreaded, gfx_threaded, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT
MACRO_CONFIG_INT(InpMousesens, inp_mousesens, 100, 5, 100000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Mouse sensitivity")
MACRO_CONFIG_STR(SvName, sv_name, 128, "unnamed server", CFGFLAG_SERVER, "Server name")
MACRO_CONFIG_STR(SvBindaddr, sv_bindaddr, 128, "", CFGFLAG_SERVER, "Address to bind the server to")
MACRO_CONFIG_STR(Bindaddr, bindaddr, 128, "", CFGFLAG_CLIENT|CFGFLAG_SERVER|CFGFLAG_MASTER, "Address to bind the client/server to")
MACRO_CONFIG_INT(SvPort, sv_port, 8303, 0, 0, CFGFLAG_SERVER, "Port to use for the server")
MACRO_CONFIG_INT(SvExternalPort, sv_external_port, 0, 0, 0, CFGFLAG_SERVER, "External port to report to the master servers")
MACRO_CONFIG_STR(SvMap, sv_map, 128, "dm1", CFGFLAG_SERVER, "Map to use on the server")

View file

@ -631,6 +631,75 @@ static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData)
}
}
void CConsole::ConToggle(IConsole::IResult *pResult, void *pUser)
{
CConsole* pConsole = static_cast<CConsole *>(pUser);
char aBuf[128] = {0};
CCommand *pCommand = pConsole->FindCommand(pResult->GetString(0), pConsole->m_FlagMask);
if(pCommand)
{
FCommandCallback pfnCallback = pCommand->m_pfnCallback;
void *pUserData = pCommand->m_pUserData;
// check for chain
if(pCommand->m_pfnCallback == Con_Chain)
{
CChain *pChainInfo = static_cast<CChain *>(pCommand->m_pUserData);
pfnCallback = pChainInfo->m_pfnCallback;
pUserData = pChainInfo->m_pCallbackUserData;
}
if(pfnCallback == IntVariableCommand)
{
CIntVariableData *pData = static_cast<CIntVariableData *>(pUserData);
int Val = *(pData->m_pVariable)==pResult->GetInteger(1) ? pResult->GetInteger(2) : pResult->GetInteger(1);
str_format(aBuf, sizeof(aBuf), "%s %i", pResult->GetString(0), Val);
pConsole->ExecuteLine(aBuf);
aBuf[0] = 0;
}
else
str_format(aBuf, sizeof(aBuf), "Invalid command: '%s'.", pResult->GetString(0));
}
else
str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(0));
if(aBuf[0] != 0)
pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf);
}
void CConsole::ConToggleStroke(IConsole::IResult *pResult, void *pUser)
{
CConsole* pConsole = static_cast<CConsole *>(pUser);
char aBuf[128] = {0};
CCommand *pCommand = pConsole->FindCommand(pResult->GetString(1), pConsole->m_FlagMask);
if(pCommand)
{
FCommandCallback pfnCallback = pCommand->m_pfnCallback;
// check for chain
if(pCommand->m_pfnCallback == Con_Chain)
{
CChain *pChainInfo = static_cast<CChain *>(pCommand->m_pUserData);
pfnCallback = pChainInfo->m_pfnCallback;
}
if(pfnCallback == IntVariableCommand)
{
int Val = pResult->GetInteger(0)==0 ? pResult->GetInteger(3) : pResult->GetInteger(2);
str_format(aBuf, sizeof(aBuf), "%s %i", pResult->GetString(1), Val);
pConsole->ExecuteLine(aBuf);
aBuf[0] = 0;
}
else
str_format(aBuf, sizeof(aBuf), "Invalid command: '%s'.", pResult->GetString(1));
}
else
str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(1));
if(aBuf[0] != 0)
pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf);
}
CConsole::CConsole(int FlagMask)
{
m_FlagMask = FlagMask;
@ -652,6 +721,9 @@ CConsole::CConsole(int FlagMask)
Register("echo", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Echo, this, "Echo the text");
Register("exec", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Exec, this, "Execute the specified file");
Register("toggle", "sii", CFGFLAG_SERVER|CFGFLAG_CLIENT, ConToggle, this, "Toggle config value");
Register("+toggle", "sii", CFGFLAG_CLIENT, ConToggleStroke, this, "Toggle config value via keypress");
Register("mod_command", "s?i", CFGFLAG_SERVER, ConModCommandAccess, this, "Specify command accessibility for moderators");
Register("mod_status", "", CFGFLAG_SERVER, ConModCommandStatus, this, "List all commands which are accessible for moderators");
Register("user_status", "", CFGFLAG_SERVER, ConUserCommandStatus, this, "List all commands which are accessible for users");

View file

@ -54,6 +54,8 @@ class CConsole : public IConsole
static void Con_Chain(IResult *pResult, void *pUserData);
static void Con_Echo(IResult *pResult, void *pUserData);
static void Con_Exec(IResult *pResult, void *pUserData);
static void ConToggle(IResult *pResult, void *pUser);
static void ConToggleStroke(IResult *pResult, void *pUser);
static void ConModCommandAccess(IResult *pResult, void *pUser);
static void ConModCommandStatus(IConsole::IResult *pResult, void *pUser);

View file

@ -13,8 +13,9 @@
#include "snapshot.h"
static const unsigned char gs_aHeaderMarker[7] = {'T', 'W', 'D', 'E', 'M', 'O', 0};
static const unsigned char gs_ActVersion = 3;
static const unsigned char gs_ActVersion = 4;
static const int gs_LengthOffset = 152;
static const int gs_NumMarkersOffset = 176;
CDemoRecorder::CDemoRecorder(class CSnapshotDelta *pSnapshotDelta)
@ -89,6 +90,8 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
str_copy(Header.m_aType, pType, sizeof(Header.m_aType));
// Header.m_Length - add this on stop
str_timestamp(Header.m_aTimestamp, sizeof(Header.m_aTimestamp));
// Header.m_aNumTimelineMarkers - add this on stop
// Header.m_aTimelineMarkers - add this on stop
io_write(DemoFile, &Header, sizeof(Header));
// write map data
@ -105,6 +108,7 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
m_LastKeyFrame = -1;
m_LastTickMarker = -1;
m_FirstTick = -1;
m_NumTimelineMarkers = 0;
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "Recording to '%s'", pFilename);
@ -266,6 +270,25 @@ int CDemoRecorder::Stop()
aLength[3] = (DemoLength)&0xff;
io_write(m_File, aLength, sizeof(aLength));
// add the timeline markers to the header
io_seek(m_File, gs_NumMarkersOffset, IOSEEK_START);
char aNumMarkers[4];
aNumMarkers[0] = (m_NumTimelineMarkers>>24)&0xff;
aNumMarkers[1] = (m_NumTimelineMarkers>>16)&0xff;
aNumMarkers[2] = (m_NumTimelineMarkers>>8)&0xff;
aNumMarkers[3] = (m_NumTimelineMarkers)&0xff;
io_write(m_File, aNumMarkers, sizeof(aNumMarkers));
for(int i = 0; i < m_NumTimelineMarkers; i++)
{
int Marker = m_aTimelineMarkers[i];
char aMarker[4];
aMarker[0] = (Marker>>24)&0xff;
aMarker[1] = (Marker>>16)&0xff;
aMarker[2] = (Marker>>8)&0xff;
aMarker[3] = (Marker)&0xff;
io_write(m_File, aMarker, sizeof(aMarker));
}
io_close(m_File);
m_File = 0;
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Stopped recording");
@ -273,6 +296,24 @@ int CDemoRecorder::Stop()
return 0;
}
void CDemoRecorder::AddDemoMarker()
{
if(m_LastTickMarker < 0 || m_NumTimelineMarkers >= MAX_TIMELINE_MARKERS)
return;
// not more than 1 marker in a second
if(m_NumTimelineMarkers > 0)
{
int Diff = m_LastTickMarker - m_aTimelineMarkers[m_NumTimelineMarkers-1];
if(Diff < SERVER_TICK_SPEED*1.0f)
return;
}
m_aTimelineMarkers[m_NumTimelineMarkers++] = m_LastTickMarker;
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Added timeline marker");
}
CDemoPlayer::CDemoPlayer(class CSnapshotDelta *pSnapshotDelta)
@ -622,6 +663,16 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
mem_free(pMapData);
}
// get timeline markers
int Num = ((m_Info.m_Header.m_aNumTimelineMarkers[0]<<24)&0xFF000000) | ((m_Info.m_Header.m_aNumTimelineMarkers[1]<<16)&0xFF0000) |
((m_Info.m_Header.m_aNumTimelineMarkers[2]<<8)&0xFF00) | (m_Info.m_Header.m_aNumTimelineMarkers[3]&0xFF);
m_Info.m_Info.m_NumTimelineMarkers = Num;
for(int i = 0; i < Num && i < MAX_TIMELINE_MARKERS; i++)
{
char *pTimelineMarker = m_Info.m_Header.m_aTimelineMarkers[i];
m_Info.m_Info.m_aTimelineMarkers[i] = ((pTimelineMarker[0]<<24)&0xFF000000) | ((pTimelineMarker[1]<<16)&0xFF0000) |
((pTimelineMarker[2]<<8)&0xFF00) | (pTimelineMarker[3]&0xFF);
}
// scan the file for interessting points
ScanFile();

View file

@ -17,6 +17,8 @@ class CDemoRecorder : public IDemoRecorder
int m_FirstTick;
unsigned char m_aLastSnapshotData[CSnapshot::MAX_SIZE];
class CSnapshotDelta *m_pSnapshotDelta;
int m_NumTimelineMarkers;
int m_aTimelineMarkers[MAX_TIMELINE_MARKERS];
void WriteTickMarker(int Tick, int Keyframe);
void Write(int Type, const void *pData, int Size);
@ -25,6 +27,7 @@ public:
int Start(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, const char *pNetversion, const char *pMap, unsigned MapCrc, const char *pType);
int Stop();
void AddDemoMarker();
void RecordSnapshot(int Tick, const void *pData, int Size);
void RecordMessage(const void *pData, int Size);
@ -108,7 +111,7 @@ public:
void Unpause();
int Stop();
void SetSpeed(float Speed);
int SetPos(float Precent);
int SetPos(float Percent);
const CInfo *BaseInfo() const { return &m_Info.m_Info; }
void GetDemoName(char *pBuffer, int BufferSize) const;
bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader) const;

View file

@ -141,7 +141,7 @@ void CEcon::Update()
else if(m_aClients[ClientID].m_State == CClient::STATE_AUTHED)
{
char aFormatted[256];
str_format(aFormatted, sizeof(aBuf), "cid=%d cmd='%s'", ClientID, aBuf);
str_format(aFormatted, sizeof(aFormatted), "cid=%d cmd='%s'", ClientID, aBuf);
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aFormatted);
m_UserClientID = ClientID;
Console()->ExecuteLine(aBuf);

View file

@ -583,7 +583,7 @@ void CNetBan::ConBansSave(IConsole::IResult *pResult, void *pUser)
{
int Min = pBan->m_Info.m_Expires>-1 ? (pBan->m_Info.m_Expires-Now+59)/60 : -1;
net_addr_str(&pBan->m_Data, aAddrStr1, sizeof(aAddrStr1), false);
str_format(aBuf, sizeof(aBuf), "ban_ip %s %i %s", aAddrStr1, Min, pBan->m_Info.m_aReason);
str_format(aBuf, sizeof(aBuf), "ban %s %i %s", aAddrStr1, Min, pBan->m_Info.m_aReason);
io_write(File, aBuf, str_length(aBuf));
io_write_newline(File);
}
@ -592,7 +592,7 @@ void CNetBan::ConBansSave(IConsole::IResult *pResult, void *pUser)
int Min = pBan->m_Info.m_Expires>-1 ? (pBan->m_Info.m_Expires-Now+59)/60 : -1;
net_addr_str(&pBan->m_Data.m_LB, aAddrStr1, sizeof(aAddrStr1), false);
net_addr_str(&pBan->m_Data.m_UB, aAddrStr2, sizeof(aAddrStr2), false);
str_format(aBuf, sizeof(aBuf), "ban_range %s %i %s", aAddrStr1, aAddrStr2, Min, pBan->m_Info.m_aReason);
str_format(aBuf, sizeof(aBuf), "ban_range %s %s %i %s", aAddrStr1, aAddrStr2, Min, pBan->m_Info.m_aReason);
io_write(File, aBuf, str_length(aBuf));
io_write_newline(File);
}

View file

@ -30,7 +30,7 @@ public:
m_aUserdir[0] = 0;
}
int Init(const char *pApplicationName, int NumArgs, const char **ppArguments)
int Init(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments)
{
// get userdir
fs_storage_path(pApplicationName, m_aUserdir, sizeof(m_aUserdir));
@ -52,14 +52,17 @@ public:
}
// add save directories
if(m_NumPaths && (!m_aaStoragePaths[TYPE_SAVE][0] || !fs_makedir(m_aaStoragePaths[TYPE_SAVE])))
if(StorageType != STORAGETYPE_BASIC && m_NumPaths && (!m_aaStoragePaths[TYPE_SAVE][0] || !fs_makedir(m_aaStoragePaths[TYPE_SAVE])))
{
char aPath[MAX_PATH_LENGTH];
fs_makedir(GetPath(TYPE_SAVE, "screenshots", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "screenshots/auto", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "maps", aPath, sizeof(aPath)));
if(StorageType == STORAGETYPE_CLIENT)
{
fs_makedir(GetPath(TYPE_SAVE, "screenshots", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "screenshots/auto", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "maps", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "downloadedmaps", aPath, sizeof(aPath)));
}
fs_makedir(GetPath(TYPE_SAVE, "dumps", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "downloadedmaps", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "demos", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "demos/auto", aPath, sizeof(aPath)));
fs_makedir(GetPath(TYPE_SAVE, "ghosts", aPath, sizeof(aPath)));
@ -378,10 +381,22 @@ public:
return !fs_makedir(GetPath(Type, pFoldername, aBuffer, sizeof(aBuffer)));
}
static IStorage *Create(const char *pApplicationName, int NumArgs, const char **ppArguments)
virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize)
{
if(Type < 0 || Type >= m_NumPaths)
{
if(BufferSize > 0)
pBuffer[0] = 0;
return;
}
GetPath(Type, pDir, pBuffer, BufferSize);
}
static IStorage *Create(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments)
{
CStorage *p = new CStorage();
if(p && p->Init(pApplicationName, NumArgs, ppArguments))
if(p && p->Init(pApplicationName, StorageType, NumArgs, ppArguments))
{
dbg_msg("storage", "initialisation failed");
delete p;
@ -391,4 +406,4 @@ public:
}
};
IStorage *CreateStorage(const char *pApplicationName, int NumArgs, const char **ppArguments) { return CStorage::Create(pApplicationName, NumArgs, ppArguments); }
IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) { return CStorage::Create(pApplicationName, StorageType, NumArgs, ppArguments); }

View file

@ -12,7 +12,11 @@ public:
enum
{
TYPE_SAVE = 0,
TYPE_ALL = -1
TYPE_ALL = -1,
STORAGETYPE_BASIC = 0,
STORAGETYPE_SERVER,
STORAGETYPE_CLIENT,
};
virtual void ListDirectory(int Type, const char *pPath, FS_LISTDIR_CALLBACK pfnCallback, void *pUser) = 0;
@ -21,9 +25,10 @@ public:
virtual bool RemoveFile(const char *pFilename, int Type) = 0;
virtual bool RenameFile(const char* pOldFilename, const char* pNewFilename, int Type) = 0;
virtual bool CreateFolder(const char *pFoldername, int Type) = 0;
virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) = 0;
};
extern IStorage *CreateStorage(const char *pApplicationName, int NumArgs, const char **ppArguments);
extern IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments);
#endif

View file

@ -43,6 +43,11 @@ void CChat::OnReset()
m_PlaceholderOffset = 0;
m_PlaceholderLength = 0;
m_pHistoryEntry = 0x0;
m_PendingChatCounter = 0;
m_LastChatSend = 0;
for(int i = 0; i < CHAT_NUM; ++i)
m_aLastSoundPlayed[i] = 0;
}
void CChat::OnRelease()
@ -109,9 +114,13 @@ bool CChat::OnInput(IInput::CEvent Event)
{
if(m_Input.GetString()[0])
{
Say(m_Mode == MODE_ALL ? 0 : 1, m_Input.GetString());
char *pEntry = m_History.Allocate(m_Input.GetLength()+1);
mem_copy(pEntry, m_Input.GetString(), m_Input.GetLength()+1);
if(m_LastChatSend+time_freq() < time_get())
Say(m_Mode == MODE_ALL ? 0 : 1, m_Input.GetString());
else
++m_PendingChatCounter;
CHistoryEntry *pEntry = m_History.Allocate(sizeof(CHistoryEntry)+m_Input.GetLength());
pEntry->m_Team = m_Mode == MODE_ALL ? 0 : 1;
mem_copy(pEntry->m_aText, m_Input.GetString(), m_Input.GetLength()+1);
}
m_pHistoryEntry = 0x0;
m_Mode = MODE_NONE;
@ -201,26 +210,26 @@ bool CChat::OnInput(IInput::CEvent Event)
}
if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_UP)
{
if (m_pHistoryEntry)
if(m_pHistoryEntry)
{
char *pTest = m_History.Prev(m_pHistoryEntry);
CHistoryEntry *pTest = m_History.Prev(m_pHistoryEntry);
if (pTest)
if(pTest)
m_pHistoryEntry = pTest;
}
else
m_pHistoryEntry = m_History.Last();
if (m_pHistoryEntry)
m_Input.Set(m_pHistoryEntry);
if(m_pHistoryEntry)
m_Input.Set(m_pHistoryEntry->m_aText);
}
else if (Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_DOWN)
{
if (m_pHistoryEntry)
if(m_pHistoryEntry)
m_pHistoryEntry = m_History.Next(m_pHistoryEntry);
if (m_pHistoryEntry)
m_Input.Set(m_pHistoryEntry);
m_Input.Set(m_pHistoryEntry->m_aText);
else
m_Input.Clear();
}
@ -259,7 +268,8 @@ void CChat::OnMessage(int MsgType, void *pRawMsg)
void CChat::AddLine(int ClientID, int Team, const char *pLine)
{
if(ClientID != -1 && (m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client
m_pClient->m_aClients[ClientID].m_ChatIgnore))
m_pClient->m_aClients[ClientID].m_ChatIgnore ||
(m_pClient->m_Snap.m_LocalClientID != ClientID && g_Config.m_ClShowChatFriends && !m_pClient->m_aClients[ClientID].m_Friend)))
return;
bool Highlighted = false;
@ -324,16 +334,50 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
}
// play sound
int64 Now = time_get();
if(ClientID == -1)
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_SERVER, 0, vec2(0,0));
{
if(Now-m_aLastSoundPlayed[CHAT_SERVER] >= time_freq()*3/10)
{
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_SERVER, 0);
m_aLastSoundPlayed[CHAT_SERVER] = Now;
}
}
else if(Highlighted)
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_HIGHLIGHT, 0, vec2(0.0f, 0.0f));
{
if(Now-m_aLastSoundPlayed[CHAT_HIGHLIGHT] >= time_freq()*3/10)
{
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_CLIENT, 0);
m_aLastSoundPlayed[CHAT_HIGHLIGHT] = Now;
}
}
else
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_CLIENT, 0, vec2(0,0));
{
if(Now-m_aLastSoundPlayed[CHAT_CLIENT] >= time_freq()*3/10)
{
m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_HIGHLIGHT, 0);
m_aLastSoundPlayed[CHAT_CLIENT] = Now;
}
}
}
void CChat::OnRender()
{
// send pending chat messages
if(m_PendingChatCounter > 0 && m_LastChatSend+time_freq() < time_get())
{
CHistoryEntry *pEntry = m_History.Last();
for(int i = m_PendingChatCounter-1; pEntry; --i, pEntry = m_History.Prev(pEntry))
{
if(i == 0)
{
Say(pEntry->m_Team, pEntry->m_aText);
break;
}
}
--m_PendingChatCounter;
}
float Width = 300.0f*Graphics()->ScreenAspect();
Graphics()->MapScreen(0.0f, 0.0f, Width, 300.0f);
float x = 5.0f;
@ -459,9 +503,11 @@ void CChat::OnRender()
void CChat::Say(int Team, const char *pLine)
{
m_LastChatSend = time_get();
// send chat message
CNetMsg_Cl_Say Msg;
Msg.m_Team = Team;
Msg.m_pMessage = pLine;
Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
}
}

View file

@ -36,6 +36,11 @@ class CChat : public CComponent
MODE_NONE=0,
MODE_ALL,
MODE_TEAM,
CHAT_SERVER=0,
CHAT_HIGHLIGHT,
CHAT_CLIENT,
CHAT_NUM,
};
int m_Mode;
@ -47,8 +52,17 @@ class CChat : public CComponent
char m_aCompletionBuffer[256];
int m_PlaceholderOffset;
int m_PlaceholderLength;
char *m_pHistoryEntry;
TStaticRingBuffer<char, 64*1024, CRingBufferBase::FLAG_RECYCLE> m_History;
struct CHistoryEntry
{
int m_Team;
char m_aText[1];
};
CHistoryEntry *m_pHistoryEntry;
TStaticRingBuffer<CHistoryEntry, 64*1024, CRingBufferBase::FLAG_RECYCLE> m_History;
int m_PendingChatCounter;
int64 m_LastChatSend;
int64 m_aLastSoundPlayed[CHAT_NUM];
static void ConSay(IConsole::IResult *pResult, void *pUserData);
static void ConSayTeam(IConsole::IResult *pResult, void *pUserData);

View file

@ -202,7 +202,7 @@ int CControls::SnapInput(int *pData)
void CControls::OnRender()
{
// update target pos
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED || m_pClient->m_Snap.m_SpecInfo.m_Active))
if(m_pClient->m_Snap.m_pGameInfoObj && !m_pClient->m_Snap.m_SpecInfo.m_Active)
m_TargetPos = m_pClient->m_LocalCharacterPos + m_MousePos;
else if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_UsePosition)
m_TargetPos = m_pClient->m_Snap.m_SpecInfo.m_Position + m_MousePos;

View file

@ -6,6 +6,7 @@
#include <engine/console.h>
#include <engine/graphics.h>
#include <engine/storage.h>
#include <engine/textrender.h>
#include <engine/shared/config.h>
#include <engine/shared/linereader.h>
@ -57,34 +58,57 @@ void CCountryFlags::LoadCountryflagsIndexfile()
// load the graphic file
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "countryflags/%s.png", aOrigin);
CImageInfo Info;
if(!Graphics()->LoadPNG(&Info, aBuf, IStorage::TYPE_ALL))
if(g_Config.m_ClLoadCountryFlags)
{
char aMsg[128];
str_format(aMsg, sizeof(aMsg), "failed to load '%s'", aBuf);
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aMsg);
continue;
str_format(aBuf, sizeof(aBuf), "countryflags/%s.png", aOrigin);
if(!Graphics()->LoadPNG(&Info, aBuf, IStorage::TYPE_ALL))
{
char aMsg[128];
str_format(aMsg, sizeof(aMsg), "failed to load '%s'", aBuf);
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aMsg);
continue;
}
}
// add entry
CCountryFlag CountryFlag;
CountryFlag.m_CountryCode = CountryCode;
str_copy(CountryFlag.m_aCountryCodeString, aOrigin, sizeof(CountryFlag.m_aCountryCodeString));
CountryFlag.m_Texture = Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0);
mem_free(Info.m_pData);
if(g_Config.m_ClLoadCountryFlags)
{
CountryFlag.m_Texture = Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0);
mem_free(Info.m_pData);
}
else
CountryFlag.m_Texture = -1;
if(g_Config.m_Debug)
{
str_format(aBuf, sizeof(aBuf), "loaded country flag '%s'", aOrigin);
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf);
}
m_aCountryFlags.add(CountryFlag);
m_aCountryFlags.add_unsorted(CountryFlag);
}
io_close(File);
m_aCountryFlags.sort_range();
mem_zero(m_CodeIndexLUT, sizeof(m_CodeIndexLUT));
// find index of default item
int DefaultIndex = 0, Index = 0;
for(sorted_array<CCountryFlag>::range r = m_aCountryFlags.all(); !r.empty(); r.pop_front(), ++Index)
if(r.front().m_CountryCode == -1)
{
DefaultIndex = Index;
break;
}
// init LUT
if(DefaultIndex != 0)
for(int i = 0; i < CODE_RANGE; ++i)
m_CodeIndexLUT[i] = DefaultIndex;
else
mem_zero(m_CodeIndexLUT, sizeof(m_CodeIndexLUT));
for(int i = 0; i < m_aCountryFlags.size(); ++i)
m_CodeIndexLUT[max(0, (m_aCountryFlags[i].m_CountryCode-CODE_LB)%CODE_RANGE)] = i+1;
m_CodeIndexLUT[max(0, (m_aCountryFlags[i].m_CountryCode-CODE_LB)%CODE_RANGE)] = i;
}
void CCountryFlags::OnInit()
@ -110,10 +134,31 @@ int CCountryFlags::Num() const
const CCountryFlags::CCountryFlag *CCountryFlags::GetByCountryCode(int CountryCode) const
{
return GetByIndex(m_CodeIndexLUT[max(0, (CountryCode-CODE_LB)%CODE_RANGE)]-1);
return GetByIndex(m_CodeIndexLUT[max(0, (CountryCode-CODE_LB)%CODE_RANGE)]);
}
const CCountryFlags::CCountryFlag *CCountryFlags::GetByIndex(int Index) const
{
return &m_aCountryFlags[max(0, Index%m_aCountryFlags.size())];
}
void CCountryFlags::Render(int CountryCode, const vec4 *pColor, float x, float y, float w, float h)
{
const CCountryFlag *pFlag = GetByCountryCode(CountryCode);
if(pFlag->m_Texture != -1)
{
Graphics()->TextureSet(pFlag->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(pColor->r, pColor->g, pColor->b, pColor->a);
IGraphics::CQuadItem QuadItem(x, y, w, h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
}
else
{
CTextCursor Cursor;
TextRender()->SetCursor(&Cursor, x, y, 10.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
Cursor.m_LineWidth = w;
TextRender()->TextEx(&Cursor, pFlag->m_aCountryCodeString, -1);
}
}

View file

@ -23,7 +23,7 @@ public:
int Num() const;
const CCountryFlag *GetByCountryCode(int CountryCode) const;
const CCountryFlag *GetByIndex(int Index) const;
//int Find(int CountryCode) const;
void Render(int CountryCode, const vec4 *pColor, float x, float y, float w, float h);
private:
enum

View file

@ -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 <engine/demo.h>
#include <engine/graphics.h>
#include <game/generated/protocol.h>
#include <game/generated/client_data.h>
@ -46,11 +47,25 @@ void CDamageInd::Create(vec2 Pos, vec2 Dir)
void CDamageInd::OnRender()
{
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
Graphics()->QuadsBegin();
static float s_LastLocalTime = Client()->LocalTime();
for(int i = 0; i < m_NumItems;)
{
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
if(pInfo->m_Paused)
m_aItems[i].m_StartTime += Client()->LocalTime()-s_LastLocalTime;
else
m_aItems[i].m_StartTime += (Client()->LocalTime()-s_LastLocalTime)*(1.0f-pInfo->m_Speed);
}
else
{
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
m_aItems[i].m_StartTime += Client()->LocalTime()-s_LastLocalTime;
}
float Life = 0.75f - (Client()->LocalTime() - m_aItems[i].m_StartTime);
if(Life < 0.0f)
DestroyI(&m_aItems[i]);
@ -64,6 +79,7 @@ void CDamageInd::OnRender()
i++;
}
}
s_LastLocalTime = Client()->LocalTime();
Graphics()->QuadsEnd();
}

View file

@ -47,7 +47,7 @@ void CEffects::AirJump(vec2 Pos)
p.m_Pos = Pos + vec2(6.0f, 16.0f);
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, Pos);
m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, Pos);
}
void CEffects::DamageIndicator(vec2 Pos, vec2 Dir)
@ -150,7 +150,7 @@ void CEffects::PlayerSpawn(vec2 Pos)
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
}
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_PLAYER_SPAWN, 1.0f, Pos);
m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SPAWN, 1.0f, Pos);
}
void CEffects::PlayerDeath(vec2 Pos, int ClientID)
@ -245,7 +245,7 @@ void CEffects::HammerHit(vec2 Pos)
p.m_EndSize = 0;
p.m_Rot = frandom()*pi*2;
m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p);
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_HAMMER_HIT, 1.0f, Pos);
m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_HAMMER_HIT, 1.0f, Pos);
}
void CEffects::OnRender()

View file

@ -111,14 +111,14 @@ void CEmoticon::OnRender()
m_WasActive = true;
if (length(m_SelectorMouse) > 140)
m_SelectorMouse = normalize(m_SelectorMouse) * 140;
if (length(m_SelectorMouse) > 170.0f)
m_SelectorMouse = normalize(m_SelectorMouse) * 170.0f;
float SelectedAngle = GetAngle(m_SelectorMouse) + 2*pi/24;
if (SelectedAngle < 0)
SelectedAngle += 2*pi;
if (length(m_SelectorMouse) > 100)
if (length(m_SelectorMouse) > 110.0f)
m_SelectedEmote = (int)(SelectedAngle / (2*pi) * NUM_EMOTICONS);
CUIRect Screen = *UI()->Screen();
@ -130,7 +130,7 @@ void CEmoticon::OnRender()
Graphics()->TextureSet(-1);
Graphics()->QuadsBegin();
Graphics()->SetColor(0,0,0,0.3f);
DrawCircle(Screen.w/2, Screen.h/2, 160, 64);
DrawCircle(Screen.w/2, Screen.h/2, 190.0f, 64);
Graphics()->QuadsEnd();
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_EMOTICONS].m_Id);
@ -144,10 +144,10 @@ void CEmoticon::OnRender()
bool Selected = m_SelectedEmote == i;
float Size = Selected ? 80 : 32;
float Size = Selected ? 80.0f : 50.0f;
float NudgeX = 120 * cosf(Angle);
float NudgeY = 120 * sinf(Angle);
float NudgeX = 150.0f * cosf(Angle);
float NudgeY = 150.0f * sinf(Angle);
RenderTools()->SelectSprite(SPRITE_OOP + i);
IGraphics::CQuadItem QuadItem(Screen.w/2 + NudgeX, Screen.h/2 + NudgeY, Size, Size);
Graphics()->QuadsDraw(&QuadItem, 1);

View file

@ -72,6 +72,18 @@ void CHud::RenderGameTimer()
}
}
void CHud::RenderPauseNotification()
{
if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED &&
!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER))
{
const char *pText = Localize("Game paused");
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);
}
}
void CHud::RenderSuddenDeath()
{
if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_SUDDENDEATH)
@ -91,6 +103,7 @@ void CHud::RenderScoreHud()
{
int GameFlags = m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags;
float Whole = 300*Graphics()->ScreenAspect();
float StartY = 229.0f;
if(GameFlags&GAMEFLAG_TEAMS && m_pClient->m_Snap.m_pGameDataObj)
{
@ -113,11 +126,11 @@ void CHud::RenderScoreHud()
Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f);
else
Graphics()->SetColor(0.0f, 0.0f, 1.0f, 0.25f);
RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split, 245.0f+t*20, ScoreWidthMax+ImageSize+2*Split, 18.0f, 5.0f, CUI::CORNER_L);
RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split, StartY+t*20, ScoreWidthMax+ImageSize+2*Split, 18.0f, 5.0f, CUI::CORNER_L);
Graphics()->QuadsEnd();
// draw score
TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreTeamWidth[t])/2-Split, 245.0f+t*20, 14.0f, aScoreTeam[t], -1);
TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreTeamWidth[t])/2-Split, StartY+t*20, 14.0f, aScoreTeam[t], -1);
if(GameFlags&GAMEFLAG_FLAGS)
{
@ -130,7 +143,7 @@ void CHud::RenderScoreHud()
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
Graphics()->QuadsBegin();
RenderTools()->SelectSprite(t==0?SPRITE_FLAG_RED:SPRITE_FLAG_BLUE);
IGraphics::CQuadItem QuadItem(Whole-ScoreWidthMax-ImageSize, 246.0f+t*20, ImageSize/2, ImageSize);
IGraphics::CQuadItem QuadItem(Whole-ScoreWidthMax-ImageSize, StartY+1.0f+t*20, ImageSize/2, ImageSize);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
}
@ -139,16 +152,17 @@ void CHud::RenderScoreHud()
// draw name of the flag holder
int ID = FlagCarrier[t]%MAX_CLIENTS;
const char *pName = m_pClient->m_aClients[ID].m_aName;
float w = TextRender()->TextWidth(0, 10.0f, pName, -1);
TextRender()->Text(0, Whole-ScoreWidthMax-ImageSize-3*Split-w, 247.0f+t*20, 10.0f, pName, -1);
float w = TextRender()->TextWidth(0, 8.0f, pName, -1);
TextRender()->Text(0, min(Whole-w-1.0f, Whole-ScoreWidthMax-ImageSize-2*Split), StartY+(t+1)*20.0f-3.0f, 8.0f, pName, -1);
// draw tee of the flag holder
CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo;
Info.m_Size = 18.0f;
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0),
vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, 246.0f+Info.m_Size/2+t*20));
vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, StartY+1.0f+Info.m_Size/2+t*20));
}
}
StartY += 8.0f;
}
}
else
@ -204,25 +218,33 @@ void CHud::RenderScoreHud()
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f);
else
Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.25f);
RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split-PosSize, 245.0f+t*20, ScoreWidthMax+ImageSize+2*Split+PosSize, 18.0f, 5.0f, CUI::CORNER_L);
RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split-PosSize, StartY+t*20, ScoreWidthMax+ImageSize+2*Split+PosSize, 18.0f, 5.0f, CUI::CORNER_L);
Graphics()->QuadsEnd();
// draw score
TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreWidth[t])/2-Split, 245.0f+t*20, 14.0f, aScore[t], -1);
TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreWidth[t])/2-Split, StartY+t*20, 14.0f, aScore[t], -1);
// draw tee
if(apPlayerInfo[t])
{
CTeeRenderInfo Info = m_pClient->m_aClients[apPlayerInfo[t]->m_ClientID].m_RenderInfo;
// draw name
int ID = apPlayerInfo[t]->m_ClientID;
const char *pName = m_pClient->m_aClients[ID].m_aName;
float w = TextRender()->TextWidth(0, 8.0f, pName, -1);
TextRender()->Text(0, min(Whole-w-1.0f, Whole-ScoreWidthMax-ImageSize-2*Split-PosSize), StartY+(t+1)*20.0f-3.0f, 8.0f, pName, -1);
// draw tee
CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo;
Info.m_Size = 18.0f;
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0),
vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, 246.0f+Info.m_Size/2+t*20));
vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, StartY+1.0f+Info.m_Size/2+t*20));
}
// draw position
char aBuf[32];
str_format(aBuf, sizeof(aBuf), "%d.", aPos[t]);
TextRender()->Text(0, Whole-ScoreWidthMax-ImageSize-Split-PosSize, 247.0f+t*20, 10.0f, aBuf, -1);
TextRender()->Text(0, Whole-ScoreWidthMax-ImageSize-Split-PosSize, StartY+2.0f+t*20, 10.0f, aBuf, -1);
StartY += 8.0f;
}
}
}
@ -456,6 +478,7 @@ void CHud::OnRender()
}
RenderGameTimer();
RenderPauseNotification();
RenderSuddenDeath();
RenderScoreHud();
RenderWarmupTimer();

View file

@ -17,6 +17,7 @@ class CHud : public CComponent
void RenderVoting();
void RenderHealthAndAmmo(const CNetObj_Character *pCharacter);
void RenderGameTimer();
void RenderPauseNotification();
void RenderSuddenDeath();
void RenderScoreHud();
void RenderSpectatorHud();

View file

@ -41,7 +41,10 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
Speed = m_pClient->m_Tuning.m_GunSpeed;
}
float Ct = (Client()->PrevGameTick()-pCurrent->m_StartTick)/(float)SERVER_TICK_SPEED + Client()->GameTickTime();
static float s_LastGameTickTime = Client()->GameTickTime();
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
s_LastGameTickTime = Client()->GameTickTime();
float Ct = (Client()->PrevGameTick()-pCurrent->m_StartTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime;
if(Ct < 0)
return; // projectile havn't been shot yet
@ -63,22 +66,23 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
if(pCurrent->m_Type == WEAPON_GRENADE)
{
m_pClient->m_pEffects->SmokeTrail(Pos, Vel*-1);
static float s_Time = 0.0f;
static float s_LastLocalTime = Client()->LocalTime();
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
static float Time = 0;
static float LastLocalTime = Client()->LocalTime();
if(!pInfo->m_Paused)
Time += (Client()->LocalTime()-LastLocalTime)*pInfo->m_Speed;
Graphics()->QuadsSetRotation(Time*pi*2*2 + ItemID);
LastLocalTime = Client()->LocalTime();
s_Time += (Client()->LocalTime()-s_LastLocalTime)*pInfo->m_Speed;
}
else
Graphics()->QuadsSetRotation(Client()->LocalTime()*pi*2*2 + ItemID);
{
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
s_Time += Client()->LocalTime()-s_LastLocalTime;
}
Graphics()->QuadsSetRotation(s_Time*pi*2*2 + ItemID);
s_LastLocalTime = Client()->LocalTime();
}
else
{
@ -130,26 +134,23 @@ void CItems::RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCu
Graphics()->QuadsSetRotation(Angle);
static float s_Time = 0.0f;
static float s_LastLocalTime = Client()->LocalTime();
float Offset = Pos.y/32.0f + Pos.x/32.0f;
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
static float Time = 0;
static float LastLocalTime = Client()->LocalTime();
if(!pInfo->m_Paused)
Time += (Client()->LocalTime()-LastLocalTime)*pInfo->m_Speed;
Pos.x += cosf(Time*2.0f+Offset)*2.5f;
Pos.y += sinf(Time*2.0f+Offset)*2.5f;
LastLocalTime = Client()->LocalTime();
s_Time += (Client()->LocalTime()-s_LastLocalTime)*pInfo->m_Speed;
}
else
{
Pos.x += cosf(Client()->LocalTime()*2.0f+Offset)*2.5f;
Pos.y += sinf(Client()->LocalTime()*2.0f+Offset)*2.5f;
}
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
s_Time += Client()->LocalTime()-s_LastLocalTime;
}
Pos.x += cosf(s_Time*2.0f+Offset)*2.5f;
Pos.y += sinf(s_Time*2.0f+Offset)*2.5f;
s_LastLocalTime = Client()->LocalTime();
RenderTools()->DrawSprite(Pos.x, Pos.y, Size);
Graphics()->QuadsEnd();
}

View file

@ -77,7 +77,8 @@ void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void
CMapItemEnvelope *pItem = (CMapItemEnvelope *)pThis->m_pLayers->Map()->GetItem(Start+Env, 0, 0);
static float Time = 0;
static float s_Time = 0.0f;
static float s_LastLocalTime = pThis->Client()->LocalTime();
if(pThis->Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = pThis->DemoPlayer()->BaseInfo();
@ -90,25 +91,28 @@ void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void
pThis->m_CurrentLocalTick = pInfo->m_CurrentTick;
}
Time = mix(pThis->m_LastLocalTick / (float)pThis->Client()->GameTickSpeed(),
s_Time = mix(pThis->m_LastLocalTick / (float)pThis->Client()->GameTickSpeed(),
pThis->m_CurrentLocalTick / (float)pThis->Client()->GameTickSpeed(),
pThis->Client()->IntraGameTick());
}
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, Time+TimeOffset, pChannels);
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
}
else
{
if(pItem->m_Version < 2 || pItem->m_Synchronized)
if(pThis->m_pClient->m_Snap.m_pGameInfoObj && !(pThis->m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
{
if(pThis->m_pClient->m_Snap.m_pGameInfoObj)
Time = mix((pThis->Client()->PrevGameTick()-pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)pThis->Client()->GameTickSpeed(),
if(pItem->m_Version < 2 || pItem->m_Synchronized)
{
s_Time = mix((pThis->Client()->PrevGameTick()-pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)pThis->Client()->GameTickSpeed(),
(pThis->Client()->GameTick()-pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)pThis->Client()->GameTickSpeed(),
pThis->Client()->IntraGameTick());
}
else
s_Time += pThis->Client()->LocalTime()-s_LastLocalTime;
}
else
Time = pThis->Client()->LocalTime();
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, Time+TimeOffset, pChannels);
pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels);
s_LastLocalTime = pThis->Client()->LocalTime();
}
}

View file

@ -99,14 +99,16 @@ int CMenus::DoButton_Icon(int ImageId, int SpriteId, const CUIRect *pRect)
return 0;
}
int CMenus::DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect)
int CMenus::DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect, bool Active)
{
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIBUTTONS].m_Id);
Graphics()->QuadsBegin();
if(!Active)
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f);
RenderTools()->SelectSprite(Checked?SPRITE_GUIBUTTON_ON:SPRITE_GUIBUTTON_OFF);
IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
if((UI()->HotItem() == pID))
if(UI()->HotItem() == pID && Active)
{
RenderTools()->SelectSprite(SPRITE_GUIBUTTON_HOVER);
IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h);
@ -114,7 +116,7 @@ int CMenus::DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect)
}
Graphics()->QuadsEnd();
return UI()->DoButtonLogic(pID, "", Checked, pRect);
return Active ? UI()->DoButtonLogic(pID, "", Checked, pRect) : 0;
}
int CMenus::DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect)
@ -1149,12 +1151,8 @@ int CMenus::Render()
float OldWidth = Item.m_Rect.w;
Item.m_Rect.w = Item.m_Rect.h*2;
Item.m_Rect.x += (OldWidth-Item.m_Rect.w)/ 2.0f;
Graphics()->TextureSet(pEntry->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
IGraphics::CQuadItem QuadItem(Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
vec4 Color(1.0f, 1.0f, 1.0f, 1.0f);
m_pClient->m_pCountryFlags->Render(pEntry->m_CountryCode, &Color, Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h);
UI()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, 0);
}
}
@ -1420,8 +1418,8 @@ void CMenus::OnStateChange(int NewState, int OldState)
if(NewState == IClient::STATE_OFFLINE)
{
if(OldState >= IClient::STATE_ONLINE)
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f, vec2(0, 0));
if(OldState >= IClient::STATE_ONLINE && NewState < IClient::STATE_QUITING)
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f);
m_Popup = POPUP_NONE;
if(Client()->ErrorString() && Client()->ErrorString()[0] != 0)
{

View file

@ -40,7 +40,7 @@ class CMenus : public CComponent
int DoButton_DemoPlayer(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_Sprite(const void *pID, int ImageID, int SpriteID, int Checked, const CUIRect *pRect, int Corners);
int DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect);
int DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect, bool Active);
int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners);

View file

@ -567,12 +567,8 @@ void CMenus::RenderServerbrowserFilters(CUIRect View)
float OldWidth = Rect.w;
Rect.w = Rect.h*2;
Rect.x += (OldWidth-Rect.w)/2.0f;
Graphics()->TextureSet(m_pClient->m_pCountryFlags->GetByCountryCode(g_Config.m_BrFilterCountryIndex)->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, g_Config.m_BrFilterCountry?1.0f: 0.5f);
IGraphics::CQuadItem QuadItem(Rect.x, Rect.y, Rect.w, Rect.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
vec4 Color(1.0f, 1.0f, 1.0f, g_Config.m_BrFilterCountry?1.0f: 0.5f);
m_pClient->m_pCountryFlags->Render(g_Config.m_BrFilterCountryIndex, &Color, Rect.x, Rect.y, Rect.w, Rect.h);
if(g_Config.m_BrFilterCountry && UI()->DoButtonLogic(&g_Config.m_BrFilterCountryIndex, "", 0, &Rect))
m_Popup = POPUP_COUNTRY;
@ -766,12 +762,8 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
TextRender()->TextEx(&Cursor, pClan, -1);
// flag
Graphics()->TextureSet(m_pClient->m_pCountryFlags->GetByCountryCode(pSelectedServer->m_aClients[i].m_Country)->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f);
IGraphics::CQuadItem QuadItem(Flag.x, Flag.y, Flag.w, Flag.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
vec4 Color(1.0f, 1.0f, 1.0f, 0.5f);
m_pClient->m_pCountryFlags->Render(pSelectedServer->m_aClients[i].m_Country, &Color, Flag.x, Flag.y, Flag.w, Flag.h);
}
}
}

View file

@ -88,15 +88,28 @@ void CMenus::RenderDemoPlayer(CUIRect MainView)
void *id = &s_SeekBarID;
char aBuffer[128];
// draw seek bar
RenderTools()->DrawUIRect(&SeekBar, vec4(0,0,0,0.5f), CUI::CORNER_ALL, 5.0f);
// draw filled bar
float Amount = CurrentTick/(float)TotalTicks;
CUIRect FilledBar = SeekBar;
FilledBar.w = 10.0f + (FilledBar.w-10.0f)*Amount;
RenderTools()->DrawUIRect(&FilledBar, vec4(1,1,1,0.5f), CUI::CORNER_ALL, 5.0f);
// draw markers
for(int i = 0; i < pInfo->m_NumTimelineMarkers; i++)
{
float Ratio = (pInfo->m_aTimelineMarkers[i]-pInfo->m_FirstTick) / (float)TotalTicks;
Graphics()->TextureSet(-1);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
IGraphics::CQuadItem QuadItem(SeekBar.x + (SeekBar.w-10.0f)*Ratio, SeekBar.y, UI()->PixelSize(), SeekBar.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
}
// draw time
str_format(aBuffer, sizeof(aBuffer), "%d:%02d / %d:%02d",
CurrentTick/SERVER_TICK_SPEED/60, (CurrentTick/SERVER_TICK_SPEED)%60,
TotalTicks/SERVER_TICK_SPEED/60, (TotalTicks/SERVER_TICK_SPEED)%60);

View file

@ -189,15 +189,18 @@ void CMenus::RenderPlayers(CUIRect MainView)
ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button);
Button.VSplitLeft(Button.h, &Button, 0);
if(DoButton_Toggle(&s_aPlayerIDs[Index][0], m_pClient->m_aClients[Index].m_ChatIgnore, &Button))
m_pClient->m_aClients[Index].m_ChatIgnore ^= 1;
if(&g_Config.m_ClShowChatFriends && !m_pClient->m_aClients[Index].m_Friend)
DoButton_Toggle(&s_aPlayerIDs[Index][0], 1, &Button, false);
else
if(DoButton_Toggle(&s_aPlayerIDs[Index][0], m_pClient->m_aClients[Index].m_ChatIgnore, &Button, true))
m_pClient->m_aClients[Index].m_ChatIgnore ^= 1;
// friend button
ButtonBar.VSplitLeft(20.0f, &Button, &ButtonBar);
ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button);
Button.VSplitLeft(Button.h, &Button, 0);
if(DoButton_Toggle(&s_aPlayerIDs[Index][1], m_pClient->m_aClients[Index].m_Friend, &Button))
if(DoButton_Toggle(&s_aPlayerIDs[Index][1], m_pClient->m_aClients[Index].m_Friend, &Button, true))
{
if(m_pClient->m_aClients[Index].m_Friend)
m_pClient->Friends()->RemoveFriend(m_pClient->m_aClients[Index].m_aName, m_pClient->m_aClients[Index].m_aClan);

View file

@ -98,6 +98,12 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView)
if(DoButton_CheckBox(&g_Config.m_ClShowhud, Localize("Show ingame HUD"), g_Config.m_ClShowhud, &Button))
g_Config.m_ClShowhud ^= 1;
// chat messages
Left.HSplitTop(5.0f, 0, &Left);
Left.HSplitTop(20.0f, &Button, &Left);
if(DoButton_CheckBox(&g_Config.m_ClShowChatFriends, Localize("Show only chat messages from friends"), g_Config.m_ClShowChatFriends, &Button))
g_Config.m_ClShowChatFriends ^= 1;
// name plates
Right.HSplitTop(20.0f, &Button, &Right);
if(DoButton_CheckBox(&g_Config.m_ClNameplates, Localize("Show name plates"), g_Config.m_ClNameplates, &Button))
@ -223,13 +229,10 @@ void CMenus::RenderSettingsPlayer(CUIRect MainView)
float OldWidth = Item.m_Rect.w;
Item.m_Rect.w = Item.m_Rect.h*2;
Item.m_Rect.x += (OldWidth-Item.m_Rect.w)/ 2.0f;
Graphics()->TextureSet(pEntry->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
IGraphics::CQuadItem QuadItem(Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
UI()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, 0);
vec4 Color(1.0f, 1.0f, 1.0f, 1.0f);
m_pClient->m_pCountryFlags->Render(pEntry->m_CountryCode, &Color, Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h);
if(pEntry->m_Texture != -1)
UI()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, 0);
}
}
@ -448,13 +451,14 @@ static CKeyInfo gs_aKeys[] =
{ "Remote console", "toggle_remote_console", 0 },
{ "Screenshot", "screenshot", 0 },
{ "Scoreboard", "+scoreboard", 0 },
{ "Respawn", "kill", 0 },
};
/* This is for scripts/update_localization.py to work, don't remove!
Localize("Move left");Localize("Move right");Localize("Jump");Localize("Fire");Localize("Hook");Localize("Hammer");
Localize("Pistol");Localize("Shotgun");Localize("Grenade");Localize("Rifle");Localize("Next weapon");Localize("Prev. weapon");
Localize("Vote yes");Localize("Vote no");Localize("Chat");Localize("Team chat");Localize("Show chat");Localize("Emoticon");
Localize("Spectator mode");Localize("Spectate next");Localize("Spectate previous");Localize("Console");Localize("Remote console");Localize("Screenshot");Localize("Scoreboard");
Localize("Spectator mode");Localize("Spectate next");Localize("Spectate previous");Localize("Console");Localize("Remote console");Localize("Screenshot");Localize("Scoreboard");Localize("Respawn");
*/
const int g_KeyCount = sizeof(gs_aKeys) / sizeof(CKeyInfo);
@ -594,7 +598,7 @@ void CMenus::RenderSettingsControls(CUIRect MainView)
TextRender()->Text(0, MiscSettings.x, MiscSettings.y, 14.0f*UI()->Scale(), Localize("Miscellaneous"), -1);
MiscSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &MiscSettings);
UiDoGetButtons(17, 25, MiscSettings);
UiDoGetButtons(17, 26, MiscSettings);
}
}
@ -765,7 +769,7 @@ void CMenus::RenderSettingsSound(CUIRect MainView)
if(g_Config.m_SndEnable)
{
if(g_Config.m_SndMusic)
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f, vec2(0, 0));
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f);
}
else
m_pClient->m_pSounds->Stop(SOUND_MENU);
@ -780,7 +784,7 @@ void CMenus::RenderSettingsSound(CUIRect MainView)
{
g_Config.m_SndMusic ^= 1;
if(g_Config.m_SndMusic)
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f, vec2(0, 0));
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f);
else
m_pClient->m_pSounds->Stop(SOUND_MENU);
}
@ -921,11 +925,8 @@ void CMenus::RenderLanguageSelection(CUIRect MainView)
Item.m_Rect.VSplitLeft(Item.m_Rect.h*2.0f, &Rect, &Item.m_Rect);
Rect.VMargin(6.0f, &Rect);
Rect.HMargin(3.0f, &Rect);
Graphics()->TextureSet(m_pClient->m_pCountryFlags->GetByCountryCode(r.front().m_CountryCode)->m_Texture);
Graphics()->QuadsBegin();
IGraphics::CQuadItem QuadItem(Rect.x, Rect.y, Rect.w, Rect.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
vec4 Color(1.0f, 1.0f, 1.0f, 1.0f);
m_pClient->m_pCountryFlags->Render(r.front().m_CountryCode, &Color, Rect.x, Rect.y, Rect.w, Rect.h);
Item.m_Rect.HSplitTop(2.0f, 0, &Item.m_Rect);
UI()->DoLabelScaled(&Item.m_Rect, r.front().m_Name, 16.0f, -1);
}

View file

@ -43,6 +43,11 @@ void CParticles::Add(int Group, CParticle *pPart)
if(pInfo->m_Paused)
return;
}
else
{
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
return;
}
if (m_FirstFree == -1)
return;
@ -142,7 +147,10 @@ void CParticles::OnRender()
Update((float)((t-LastTime)/(double)time_freq())*pInfo->m_Speed);
}
else
Update((float)((t-LastTime)/(double)time_freq()));
{
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
Update((float)((t-LastTime)/(double)time_freq()));
}
LastTime = t;
}

View file

@ -98,30 +98,7 @@ void CPlayers::RenderHook(
Player = *pPlayerChar;
CNetObj_PlayerInfo pInfo = *pPlayerInfo;
CTeeRenderInfo RenderInfo = m_pClient->m_aClients[pInfo.m_ClientID].m_RenderInfo;
// check for teamplay modes
bool IsTeamplay = false;
if(m_pClient->m_Snap.m_pGameInfoObj)
IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) != 0;
// check for ninja
if (Player.m_Weapon == WEAPON_NINJA)
{
// change the skin for the player to the ninja
int Skin = m_pClient->m_pSkins->Find("x_ninja");
if(Skin != -1)
{
if(IsTeamplay)
RenderInfo.m_Texture = m_pClient->m_pSkins->Get(Skin)->m_ColorTexture;
else
{
RenderInfo.m_Texture = m_pClient->m_pSkins->Get(Skin)->m_OrgTexture;
RenderInfo.m_ColorBody = vec4(1,1,1,1);
RenderInfo.m_ColorFeet = vec4(1,1,1,1);
}
}
}
CTeeRenderInfo RenderInfo = m_aRenderInfo[pInfo.m_ClientID];
float IntraTick = Client()->IntraGameTick();
@ -221,31 +198,9 @@ void CPlayers::RenderPlayer(
Player = *pPlayerChar;
CNetObj_PlayerInfo pInfo = *pPlayerInfo;
CTeeRenderInfo RenderInfo = m_pClient->m_aClients[pInfo.m_ClientID].m_RenderInfo;
CTeeRenderInfo RenderInfo = m_aRenderInfo[pInfo.m_ClientID];
// check for teamplay modes
bool IsTeamplay = false;
bool NewTick = m_pClient->m_NewTick;
if(m_pClient->m_Snap.m_pGameInfoObj)
IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) != 0;
// check for ninja
if (Player.m_Weapon == WEAPON_NINJA)
{
// change the skin for the player to the ninja
int Skin = m_pClient->m_pSkins->Find("x_ninja");
if(Skin != -1)
{
if(IsTeamplay)
RenderInfo.m_Texture = m_pClient->m_pSkins->Get(Skin)->m_ColorTexture;
else
{
RenderInfo.m_Texture = m_pClient->m_pSkins->Get(Skin)->m_OrgTexture;
RenderInfo.m_ColorBody = vec4(1,1,1,1);
RenderInfo.m_ColorFeet = vec4(1,1,1,1);
}
}
}
// set size
RenderInfo.m_Size = 64.0f;
@ -333,14 +288,17 @@ void CPlayers::RenderPlayer(
else if(!WantOtherDir)
State.Add(&g_pData->m_aAnimations[ANIM_WALK], WalkTime, 1.0f);
static float s_LastGameTickTime = Client()->GameTickTime();
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
s_LastGameTickTime = Client()->GameTickTime();
if (Player.m_Weapon == WEAPON_HAMMER)
{
float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + Client()->GameTickTime();
float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime;
State.Add(&g_pData->m_aAnimations[ANIM_HAMMER_SWING], clamp(ct*5.0f,0.0f,1.0f), 1.0f);
}
if (Player.m_Weapon == WEAPON_NINJA)
{
float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + Client()->GameTickTime();
float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime;
State.Add(&g_pData->m_aAnimations[ANIM_NINJA_SWING], clamp(ct*2.0f,0.0f,1.0f), 1.0f);
}
@ -350,7 +308,7 @@ void CPlayers::RenderPlayer(
static int64 SkidSoundTime = 0;
if(time_get()-SkidSoundTime > time_freq()/10)
{
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_PLAYER_SKID, 0.25f, Position);
m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SKID, 0.25f, Position);
SkidSoundTime = time_get();
}
@ -412,15 +370,22 @@ void CPlayers::RenderPlayer(
if ((Client()->GameTick()-Player.m_AttackTick) <= (SERVER_TICK_SPEED / 6) && g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles)
{
int IteX = rand() % g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles;
static int s_LastIteX = IteX;
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
static int s_LastIteX = IteX;
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
if(pInfo->m_Paused)
IteX = s_LastIteX;
else
s_LastIteX = IteX;
}
else
{
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
IteX = s_LastIteX;
else
s_LastIteX = IteX;
}
if(g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX])
{
vec2 Dir = vec2(pPlayerChar->m_X,pPlayerChar->m_Y) - vec2(pPrevChar->m_X, pPrevChar->m_Y);
@ -441,7 +406,11 @@ void CPlayers::RenderPlayer(
{
// TODO: should be an animation
Recoil = 0;
float a = (Client()->GameTick()-Player.m_AttackTick+IntraTick)/5.0f;
static float s_LastIntraTick = IntraTick;
if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED))
s_LastIntraTick = IntraTick;
float a = (Client()->GameTick()-Player.m_AttackTick+s_LastIntraTick)/5.0f;
if(a < 1)
Recoil = sinf(a*pi);
p = Position + Dir * g_pData->m_Weapons.m_aId[iw].m_Offsetx - Dir*Recoil*10.0f;
@ -463,6 +432,22 @@ void CPlayers::RenderPlayer(
}
int IteX = rand() % g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles;
static int s_LastIteX = IteX;
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
{
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
if(pInfo->m_Paused)
IteX = s_LastIteX;
else
s_LastIteX = IteX;
}
else
{
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
IteX = s_LastIteX;
else
s_LastIteX = IteX;
}
if (Alpha > 0.0f && g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX])
{
float OffsetY = -g_pData->m_Weapons.m_aId[iw].m_Muzzleoffsety;
@ -549,6 +534,31 @@ void CPlayers::RenderPlayer(
void CPlayers::OnRender()
{
// update RenderInfo for ninja
bool IsTeamplay = false;
if(m_pClient->m_Snap.m_pGameInfoObj)
IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) != 0;
for(int i = 0; i < MAX_CLIENTS; ++i)
{
m_aRenderInfo[i] = m_pClient->m_aClients[i].m_RenderInfo;
if(m_pClient->m_Snap.m_aCharacters[i].m_Cur.m_Weapon == WEAPON_NINJA)
{
// change the skin for the player to the ninja
int Skin = m_pClient->m_pSkins->Find("x_ninja");
if(Skin != -1)
{
if(IsTeamplay)
m_aRenderInfo[i].m_Texture = m_pClient->m_pSkins->Get(Skin)->m_ColorTexture;
else
{
m_aRenderInfo[i].m_Texture = m_pClient->m_pSkins->Get(Skin)->m_OrgTexture;
m_aRenderInfo[i].m_ColorBody = vec4(1,1,1,1);
m_aRenderInfo[i].m_ColorFeet = vec4(1,1,1,1);
}
}
}
}
// render other players in two passes, first pass we render the other, second pass we render our self
for(int p = 0; p < 4; p++)
{

View file

@ -6,6 +6,7 @@
class CPlayers : public CComponent
{
CTeeRenderInfo m_aRenderInfo[MAX_CLIENTS];
void RenderHand(class CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset);
void RenderPlayer(
const CNetObj_Character *pPrevChar,

View file

@ -305,12 +305,9 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch
TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientID].m_aClan, -1);
// country flag
Graphics()->TextureSet(m_pClient->m_pCountryFlags->GetByCountryCode(m_pClient->m_aClients[pInfo->m_ClientID].m_Country)->m_Texture);
Graphics()->QuadsBegin();
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f);
IGraphics::CQuadItem QuadItem(CountryOffset, y+(Spacing+TeeSizeMod*5.0f)/2.0f, CountryLength, LineHeight-Spacing-TeeSizeMod*5.0f);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
vec4 Color(1.0f, 1.0f, 1.0f, 0.5f);
m_pClient->m_pCountryFlags->Render(m_pClient->m_aClients[pInfo->m_ClientID].m_Country, &Color,
CountryOffset, y+(Spacing+TeeSizeMod*5.0f)/2.0f, CountryLength, LineHeight-Spacing-TeeSizeMod*5.0f);
// ping
str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Latency, 0, 1000));

View file

@ -37,6 +37,30 @@ static int LoadSoundsThread(void *pUser)
return 0;
}
int CSounds::GetSampleId(int SetId)
{
if(!g_Config.m_SndEnable || !Sound()->IsSoundEnabled() || m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds)
return -1;
CDataSoundset *pSet = &g_pData->m_aSounds[SetId];
if(!pSet->m_NumSounds)
return -1;
if(pSet->m_NumSounds == 1)
return pSet->m_aSounds[0].m_Id;
// return random one
int Id;
do
{
Id = rand() % pSet->m_NumSounds;
}
while(Id == pSet->m_Last);
pSet->m_Last = Id;
return pSet->m_aSounds[Id].m_Id;
}
void CSounds::OnInit()
{
// setup sound channels
@ -101,7 +125,7 @@ void CSounds::OnRender()
int64 Now = time_get();
if(m_QueueWaitTime <= Now)
{
Play(m_aQueue[0].m_Channel, m_aQueue[0].m_SetId, 1.0f, vec2(0,0));
Play(m_aQueue[0].m_Channel, m_aQueue[0].m_SetId, 1.0f);
m_QueueWaitTime = Now+time_freq()*3/10; // wait 300ms before playing the next one
if(--m_QueuePos > 0)
mem_move(m_aQueue, m_aQueue+1, m_QueuePos*sizeof(QueueEntry));
@ -135,38 +159,39 @@ void CSounds::PlayAndRecord(int Chn, int SetId, float Vol, vec2 Pos)
Msg.m_SoundID = SetId;
Client()->SendPackMsg(&Msg, MSGFLAG_NOSEND|MSGFLAG_RECORD);
Play(Chn, SetId, Vol, Pos);
Play(Chn, SetId, Vol);
}
void CSounds::Play(int Chn, int SetId, float Vol, vec2 Pos)
void CSounds::Play(int Chn, int SetId, float Vol)
{
if(!g_Config.m_SndEnable || !Sound()->IsSoundEnabled() || (Chn == CHN_MUSIC && !g_Config.m_SndMusic) || m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds)
if(Chn == CHN_MUSIC && !g_Config.m_SndMusic)
return;
CDataSoundset *pSet = &g_pData->m_aSounds[SetId];
if(!pSet->m_NumSounds)
int SampleId = GetSampleId(SetId);
if(SampleId == -1)
return;
int Flags = 0;
if(Chn == CHN_MUSIC)
Flags = ISound::FLAG_LOOP;
if(pSet->m_NumSounds == 1)
{
Sound()->PlayAt(Chn, pSet->m_aSounds[0].m_Id, Flags, Pos.x, Pos.y);
return;
}
Sound()->Play(Chn, SampleId, Flags);
}
// play a random one
int Id;
do
{
Id = rand() % pSet->m_NumSounds;
}
while(Id == pSet->m_Last);
Sound()->PlayAt(Chn, pSet->m_aSounds[Id].m_Id, Flags, Pos.x, Pos.y);
pSet->m_Last = Id;
void CSounds::PlayAt(int Chn, int SetId, float Vol, vec2 Pos)
{
if(Chn == CHN_MUSIC && !g_Config.m_SndMusic)
return;
int SampleId = GetSampleId(SetId);
if(SampleId == -1)
return;
int Flags = 0;
if(Chn == CHN_MUSIC)
Flags = ISound::FLAG_LOOP;
Sound()->PlayAt(Chn, SampleId, Flags, Pos.x, Pos.y);
}
void CSounds::Stop(int SetId)

View file

@ -19,6 +19,8 @@ class CSounds : public CComponent
int64 m_QueueWaitTime;
class CJob m_SoundJob;
bool m_WaitForSoundJob;
int GetSampleId(int SetId);
public:
// sound channels
@ -37,7 +39,8 @@ public:
void ClearQueue();
void Enqueue(int Channel, int SetId);
void Play(int Channel, int SetId, float Vol, vec2 Pos);
void Play(int Channel, int SetId, float Vol);
void PlayAt(int Channel, int SetId, float Vol, vec2 Pos);
void PlayAndRecord(int Channel, int SetId, float Vol, vec2 Pos);
void Stop(int SetId);
};

View file

@ -473,7 +473,7 @@ void CGameClient::OnRender()
m_NewPredictedTick = false;
// check if client info has to be resent
if(m_LastSendInfo && Client()->State() == IClient::STATE_ONLINE && !m_pMenus->IsActive() && m_LastSendInfo+time_freq()*5 < time_get())
if(m_LastSendInfo && Client()->State() == IClient::STATE_ONLINE && m_Snap.m_LocalClientID >= 0 && !m_pMenus->IsActive() && m_LastSendInfo+time_freq()*5 < time_get())
{
// resend if client info differs
if(str_comp(g_Config.m_PlayerName, m_aClients[m_Snap.m_LocalClientID].m_aName) ||
@ -575,7 +575,7 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
pMsg->m_SoundID == SOUND_CTF_GRAB_PL)
g_GameClient.m_pSounds->Enqueue(CSounds::CHN_GLOBAL, pMsg->m_SoundID);
else
g_GameClient.m_pSounds->Play(CSounds::CHN_GLOBAL, pMsg->m_SoundID, 1.0f, vec2(0,0));
g_GameClient.m_pSounds->Play(CSounds::CHN_GLOBAL, pMsg->m_SoundID, 1.0f);
}
else if(MsgId == NETMSGTYPE_CL_TEAMSSTATE)
{
@ -679,7 +679,7 @@ void CGameClient::ProcessEvents()
else if(Item.m_Type == NETEVENTTYPE_SOUNDWORLD)
{
CNetEvent_SoundWorld *ev = (CNetEvent_SoundWorld *)pData;
g_GameClient.m_pSounds->Play(CSounds::CHN_WORLD, ev->m_SoundID, 1.0f, vec2(ev->m_X, ev->m_Y));
g_GameClient.m_pSounds->PlayAt(CSounds::CHN_WORLD, ev->m_SoundID, 1.0f, vec2(ev->m_X, ev->m_Y));
}
}
}
@ -946,6 +946,15 @@ void CGameClient::OnNewSnapshot()
m_ServerMode = SERVERMODE_PUREMOD;
}
// add tuning to demo
if(DemoRecorder()->IsRecording() && mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) != 0)
{
CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS);
int *pParams = (int *)&m_Tuning;
for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++)
Msg.AddInt(pParams[i]);
Client()->SendMsg(&Msg, MSGFLAG_RECORD|MSGFLAG_NOSEND);
}
if(!m_DDRaceMsgSent && m_Snap.m_pLocalInfo)
{
CNetMsg_Cl_IsDDRace Msg;

View file

@ -74,6 +74,11 @@ CUIRect *CUI::Screen()
return &m_Screen;
}
float CUI::PixelSize()
{
return Screen()->w/Graphics()->ScreenWidth();
}
void CUI::SetScale(float s)
{
g_Config.m_UiScale = (int)(s*100.0f);

View file

@ -82,6 +82,7 @@ public:
void ConvertMouseMove(float *x, float *y);
CUIRect *Screen();
float PixelSize();
void ClipEnable(const CUIRect *pRect);
void ClipDisable();

View file

@ -223,7 +223,6 @@ void CEditor::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pU
// copied from gc_menu.cpp, should be more generalized
//extern int ui_do_edit_box(void *id, const CUIRect *rect, char *str, int str_size, float font_size, bool hidden=false);
int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden, int Corners)
{
int Inside = UI()->MouseInside(pRect);
@ -237,6 +236,7 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str
if(UI()->LastActiveItem() == pID)
{
m_EditBoxActive = 2;
int Len = str_length(pStr);
if(Len == 0)
s_AtIndex = 0;
@ -1015,7 +1015,7 @@ void CEditor::DoToolbar(CUIRect ToolBar)
// refocus button
TB_Bottom.VSplitLeft(50.0f, &Button, &TB_Bottom);
static int s_RefocusButton = 0;
if(DoButton_Editor(&s_RefocusButton, "Refocus", m_WorldOffsetX&&m_WorldOffsetY?0:-1, &Button, 0, "[HOME] Restore map focus") || Input()->KeyDown(KEY_HOME))
if(DoButton_Editor(&s_RefocusButton, "Refocus", m_WorldOffsetX&&m_WorldOffsetY?0:-1, &Button, 0, "[HOME] Restore map focus") || (m_EditBoxActive == 0 && Input()->KeyDown(KEY_HOME)))
{
m_WorldOffsetX = 0;
m_WorldOffsetY = 0;
@ -1706,6 +1706,12 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar)
pT->ShowInfo();
}
}
else
{
// fix aspect ratio of the image in the picker
float Max = min(View.w, View.h);
View.w = View.h = Max;
}
static void *s_pEditorID = (void *)&s_pEditorID;
int Inside = UI()->MouseInside(&View);
@ -2030,7 +2036,7 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar)
}
}
if(GetSelectedGroup() && GetSelectedGroup()->m_UseClipping)
if(!m_ShowPicker && GetSelectedGroup() && GetSelectedGroup()->m_UseClipping)
{
CLayerGroup *g = m_Map.m_pGameGroup;
g->MapScreen();
@ -2738,11 +2744,12 @@ void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View)
r.h *= m_Map.m_lImages[i]->m_Height/Max;
Graphics()->TextureSet(m_Map.m_lImages[i]->m_TexID);
Graphics()->BlendNormal();
Graphics()->WrapClamp();
Graphics()->QuadsBegin();
IGraphics::CQuadItem QuadItem(r.x, r.y, r.w, r.h);
Graphics()->QuadsDrawTL(&QuadItem, 1);
Graphics()->QuadsEnd();
Graphics()->WrapNormal();
}
}
@ -2839,11 +2846,13 @@ void CEditor::RenderFileDialog()
RenderTools()->DrawUIRect(&View, vec4(0,0,0,0.75f), CUI::CORNER_ALL, 5.0f);
View.Margin(10.0f, &View);
CUIRect Title, FileBox, FileBoxLabel, ButtonBar, Scroll;
CUIRect Title, FileBox, FileBoxLabel, ButtonBar, Scroll, PathBox;
View.HSplitTop(18.0f, &Title, &View);
View.HSplitTop(5.0f, 0, &View); // some spacing
View.HSplitBottom(14.0f, &View, &ButtonBar);
View.HSplitBottom(10.0f, &View, 0); // some spacing
View.HSplitBottom(14.0f, &View, &PathBox);
View.HSplitBottom(5.0f, &View, 0); // some spacing
View.HSplitBottom(14.0f, &View, &FileBox);
FileBox.VSplitLeft(55.0f, &FileBoxLabel, &FileBox);
View.HSplitBottom(10.0f, &View, 0); // some spacing
@ -2854,6 +2863,15 @@ void CEditor::RenderFileDialog()
Title.VMargin(10.0f, &Title);
UI()->DoLabel(&Title, m_pFileDialogTitle, 12.0f, -1, -1);
// pathbox
char aPath[128], aBuf[128];
if(m_FilesSelectedIndex != -1)
Storage()->GetCompletePath(m_FileList[m_FilesSelectedIndex].m_StorageType, m_pFileDialogPath, aPath, sizeof(aPath));
else
aPath[0] = 0;
str_format(aBuf, sizeof(aBuf), "Current path: %s", aPath);
UI()->DoLabel(&PathBox, aBuf, 10.0f, -1, -1);
// filebox
if(m_FileDialogStorageType == IStorage::TYPE_SAVE)
{
@ -2950,6 +2968,7 @@ void CEditor::RenderFileDialog()
static int s_OkButton = 0;
static int s_CancelButton = 0;
static int s_NewFolderButton = 0;
static int s_MapInfoButton = 0;
CUIRect Button;
ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button);
@ -3025,6 +3044,22 @@ void CEditor::RenderFileDialog()
UI()->SetActiveItem(0);
}
}
if(m_FileDialogStorageType == IStorage::TYPE_SAVE)
{
ButtonBar.VSplitLeft(40.0f, 0, &ButtonBar);
ButtonBar.VSplitLeft(70.0f, &Button, &ButtonBar);
if(DoButton_Editor(&s_MapInfoButton, "Map details", 0, &Button, 0, 0))
{
str_copy(m_Map.m_MapInfo.m_aAuthorTmp, m_Map.m_MapInfo.m_aAuthor, sizeof(m_Map.m_MapInfo.m_aAuthorTmp));
str_copy(m_Map.m_MapInfo.m_aVersionTmp, m_Map.m_MapInfo.m_aVersion, sizeof(m_Map.m_MapInfo.m_aVersionTmp));
str_copy(m_Map.m_MapInfo.m_aCreditsTmp, m_Map.m_MapInfo.m_aCredits, sizeof(m_Map.m_MapInfo.m_aCreditsTmp));
str_copy(m_Map.m_MapInfo.m_aLicenseTmp, m_Map.m_MapInfo.m_aLicense, sizeof(m_Map.m_MapInfo.m_aLicenseTmp));
static int s_MapInfoPopupID = 0;
UiInvokePopupMenu(&s_MapInfoPopupID, 0, Width/2.0f-200.0f, Height/2.0f-100.0f, 400.0f, 200.0f, PopupMapInfo);
UI()->SetActiveItem(0);
}
}
}
void CEditor::FilelistPopulate(int StorageType)
@ -3656,10 +3691,15 @@ void CEditor::RenderMenubar(CUIRect MenuBar)
(void)0;
*/
CUIRect Info;
MenuBar.VSplitLeft(40.0f, 0, &MenuBar);
MenuBar.VSplitLeft(MenuBar.w*0.75f, &MenuBar, &Info);
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "File: %s", m_aFileName);
UI()->DoLabel(&MenuBar, aBuf, 10.0f, -1, -1);
str_format(aBuf, sizeof(aBuf), "Z: %i, A: %.1f, G: %i", m_ZoomLevel, m_AnimateSpeed, m_GridFactor);
UI()->DoLabel(&Info, aBuf, 10.0f, 1, -1);
}
void CEditor::Render()
@ -3675,6 +3715,9 @@ void CEditor::Render()
// reset tip
m_pTooltip = 0;
if(m_EditBoxActive)
--m_EditBoxActive;
// render checker
RenderBackground(View, ms_CheckerTexture, 32.0f, 1.0f);
@ -3940,6 +3983,8 @@ void CEditorMap::Clean()
m_lEnvelopes.delete_all();
m_lImages.delete_all();
m_MapInfo.Reset();
m_pGameLayer = 0x0;
m_pGameGroup = 0x0;

View file

@ -276,6 +276,34 @@ public:
array<CEditorImage*> m_lImages;
array<CEnvelope*> m_lEnvelopes;
class CMapInfo
{
public:
char m_aAuthorTmp[32];
char m_aVersionTmp[16];
char m_aCreditsTmp[128];
char m_aLicenseTmp[32];
char m_aAuthor[32];
char m_aVersion[16];
char m_aCredits[128];
char m_aLicense[32];
void Reset()
{
m_aAuthorTmp[0] = 0;
m_aVersionTmp[0] = 0;
m_aCreditsTmp[0] = 0;
m_aLicenseTmp[0] = 0;
m_aAuthor[0] = 0;
m_aVersion[0] = 0;
m_aCredits[0] = 0;
m_aLicense[0] = 0;
}
};
CMapInfo m_MapInfo;
class CLayerGame *m_pGameLayer;
CLayerGroup *m_pGameGroup;
@ -497,6 +525,7 @@ public:
m_Mode = MODE_LAYERS;
m_Dialog = 0;
m_EditBoxActive = 0;
m_pTooltip = 0;
m_GridActive = false;
@ -599,6 +628,7 @@ public:
int m_Mode;
int m_Dialog;
int m_EditBoxActive;
const char *m_pTooltip;
bool m_GridActive;
@ -740,6 +770,7 @@ public:
static int PopupQuad(CEditor *pEditor, CUIRect View);
static int PopupPoint(CEditor *pEditor, CUIRect View);
static int PopupNewFolder(CEditor *pEditor, CUIRect View);
static int PopupMapInfo(CEditor *pEditor, CUIRect View);
static int PopupEvent(CEditor *pEditor, CUIRect View);
static int PopupSelectImage(CEditor *pEditor, CUIRect View);
static int PopupSelectGametileOp(CEditor *pEditor, CUIRect View);

View file

@ -223,6 +223,31 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName)
df.AddItem(MAPITEMTYPE_VERSION, 0, sizeof(Item), &Item);
}
// save map info
{
CMapItemInfo Item;
Item.m_Version = 1;
if(m_MapInfo.m_aAuthor[0])
Item.m_Author = df.AddData(str_length(m_MapInfo.m_aAuthor)+1, m_MapInfo.m_aAuthor);
else
Item.m_Author = -1;
if(m_MapInfo.m_aVersion[0])
Item.m_MapVersion = df.AddData(str_length(m_MapInfo.m_aVersion)+1, m_MapInfo.m_aVersion);
else
Item.m_MapVersion = -1;
if(m_MapInfo.m_aCredits[0])
Item.m_Credits = df.AddData(str_length(m_MapInfo.m_aCredits)+1, m_MapInfo.m_aCredits);
else
Item.m_Credits = -1;
if(m_MapInfo.m_aLicense[0])
Item.m_License = df.AddData(str_length(m_MapInfo.m_aLicense)+1, m_MapInfo.m_aLicense);
else
Item.m_License = -1;
df.AddItem(MAPITEMTYPE_INFO, 0, sizeof(Item), &Item);
}
// save images
for(int i = 0; i < m_lImages.size(); i++)
{
@ -462,6 +487,22 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag
{
//editor.reset(false);
// load map info
{
CMapItemInfo *pItem = (CMapItemInfo *)DataFile.FindItem(MAPITEMTYPE_INFO, 0);
if(pItem && pItem->m_Version == 1)
{
if(pItem->m_Author > -1)
str_copy(m_MapInfo.m_aAuthor, (char *)DataFile.GetData(pItem->m_Author), sizeof(m_MapInfo.m_aAuthor));
if(pItem->m_MapVersion > -1)
str_copy(m_MapInfo.m_aVersion, (char *)DataFile.GetData(pItem->m_MapVersion), sizeof(m_MapInfo.m_aVersion));
if(pItem->m_Credits > -1)
str_copy(m_MapInfo.m_aCredits, (char *)DataFile.GetData(pItem->m_Credits), sizeof(m_MapInfo.m_aCredits));
if(pItem->m_License > -1)
str_copy(m_MapInfo.m_aLicense, (char *)DataFile.GetData(pItem->m_License), sizeof(m_MapInfo.m_aLicense));
}
}
// load images
{
int Start, Num;

View file

@ -285,6 +285,8 @@ void CLayerTiles::FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect)
if(m_Readonly)
return;
Snap(&Rect);
int sx = ConvertX(Rect.x);
int sy = ConvertY(Rect.y);
int w = ConvertX(Rect.w);
@ -292,9 +294,9 @@ void CLayerTiles::FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect)
CLayerTiles *pLt = static_cast<CLayerTiles*>(pBrush);
for(int y = 0; y <= h; y++)
for(int y = 0; y < h; y++)
{
for(int x = 0; x <= w; x++)
for(int x = 0; x < w; x++)
{
int fx = x+sx;
int fy = y+sy;

View file

@ -713,6 +713,74 @@ int CEditor::PopupNewFolder(CEditor *pEditor, CUIRect View)
return 0;
}
int CEditor::PopupMapInfo(CEditor *pEditor, CUIRect View)
{
CUIRect Label, ButtonBar, Button;
// title
View.HSplitTop(10.0f, 0, &View);
View.HSplitTop(30.0f, &Label, &View);
pEditor->UI()->DoLabel(&Label, "Map details", 20.0f, 0);
View.HSplitBottom(10.0f, &View, 0);
View.HSplitBottom(20.0f, &View, &ButtonBar);
View.VMargin(40.0f, &View);
// author box
View.HSplitTop(20.0f, &Label, &View);
pEditor->UI()->DoLabel(&Label, "Author:", 10.0f, -1);
Label.VSplitLeft(40.0f, 0, &Button);
Button.HSplitTop(12.0f, &Button, 0);
static float s_AuthorBox = 0;
pEditor->DoEditBox(&s_AuthorBox, &Button, pEditor->m_Map.m_MapInfo.m_aAuthorTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aAuthorTmp), 10.0f, &s_AuthorBox);
// version box
View.HSplitTop(20.0f, &Label, &View);
pEditor->UI()->DoLabel(&Label, "Version:", 10.0f, -1);
Label.VSplitLeft(40.0f, 0, &Button);
Button.HSplitTop(12.0f, &Button, 0);
static float s_VersionBox = 0;
pEditor->DoEditBox(&s_VersionBox, &Button, pEditor->m_Map.m_MapInfo.m_aVersionTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aVersionTmp), 10.0f, &s_VersionBox);
// credits box
View.HSplitTop(20.0f, &Label, &View);
pEditor->UI()->DoLabel(&Label, "Credits:", 10.0f, -1);
Label.VSplitLeft(40.0f, 0, &Button);
Button.HSplitTop(12.0f, &Button, 0);
static float s_CreditsBox = 0;
pEditor->DoEditBox(&s_CreditsBox, &Button, pEditor->m_Map.m_MapInfo.m_aCreditsTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aCreditsTmp), 10.0f, &s_CreditsBox);
// license box
View.HSplitTop(20.0f, &Label, &View);
pEditor->UI()->DoLabel(&Label, "License:", 10.0f, -1);
Label.VSplitLeft(40.0f, 0, &Button);
Button.HSplitTop(12.0f, &Button, 0);
static float s_LicenseBox = 0;
pEditor->DoEditBox(&s_LicenseBox, &Button, pEditor->m_Map.m_MapInfo.m_aLicenseTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aLicenseTmp), 10.0f, &s_LicenseBox);
// button bar
ButtonBar.VSplitLeft(30.0f, 0, &ButtonBar);
ButtonBar.VSplitLeft(110.0f, &Label, &ButtonBar);
static int s_CreateButton = 0;
if(pEditor->DoButton_Editor(&s_CreateButton, "Save", 0, &Label, 0, 0))
{
str_copy(pEditor->m_Map.m_MapInfo.m_aAuthor, pEditor->m_Map.m_MapInfo.m_aAuthorTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aAuthor));
str_copy(pEditor->m_Map.m_MapInfo.m_aVersion, pEditor->m_Map.m_MapInfo.m_aVersionTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aVersion));
str_copy(pEditor->m_Map.m_MapInfo.m_aCredits, pEditor->m_Map.m_MapInfo.m_aCreditsTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aCredits));
str_copy(pEditor->m_Map.m_MapInfo.m_aLicense, pEditor->m_Map.m_MapInfo.m_aLicenseTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aLicense));
return 1;
}
ButtonBar.VSplitRight(30.0f, &ButtonBar, 0);
ButtonBar.VSplitRight(110.0f, &ButtonBar, &Label);
static int s_AbortButton = 0;
if(pEditor->DoButton_Editor(&s_AbortButton, "Abort", 0, &Label, 0, 0))
return 1;
return 0;
}
int CEditor::PopupEvent(CEditor *pEditor, CUIRect View)
{
CUIRect Label, ButtonBar;
@ -820,13 +888,14 @@ int CEditor::PopupSelectImage(CEditor *pEditor, CUIRect View)
ImageView.w *= pEditor->m_Map.m_lImages[ShowImage]->m_Width/Max;
ImageView.h *= pEditor->m_Map.m_lImages[ShowImage]->m_Height/Max;
pEditor->Graphics()->TextureSet(pEditor->m_Map.m_lImages[ShowImage]->m_TexID);
pEditor->Graphics()->BlendNormal();
pEditor->Graphics()->WrapClamp();
pEditor->Graphics()->QuadsBegin();
IGraphics::CQuadItem QuadItem(ImageView.x, ImageView.y, ImageView.w, ImageView.h);
pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1);
pEditor->Graphics()->QuadsEnd();
pEditor->Graphics()->WrapNormal();
}
else
pEditor->Graphics()->TextureSet(-1);
pEditor->Graphics()->QuadsBegin();
IGraphics::CQuadItem QuadItem(ImageView.x, ImageView.y, ImageView.w, ImageView.h);
pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1);
pEditor->Graphics()->QuadsEnd();
return 0;
}

View file

@ -188,6 +188,15 @@ public:
unsigned char m_Reserved;
};
struct CMapItemInfo
{
int m_Version;
int m_Author;
int m_MapVersion;
int m_Credits;
int m_License;
} ;
struct CMapItemImage
{
int m_Version;

View file

@ -730,6 +730,20 @@ void CCharacter::TickDefered()
}
}
void CCharacter::TickPaused()
{
++m_AttackTick;
++m_DamageTakenTick;
++m_Ninja.m_ActivationTick;
++m_ReckoningTick;
if(m_LastAction != -1)
++m_LastAction;
if(m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart > -1)
++m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart;
if(m_EmoteStop > -1)
++m_EmoteStop;
}
bool CCharacter::IncreaseHealth(int Amount)
{
if(m_Health >= 10)

View file

@ -32,6 +32,7 @@ public:
virtual void Destroy();
virtual void Tick();
virtual void TickDefered();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
bool IsGrounded();

View file

@ -24,6 +24,13 @@ void CFlag::Reset()
m_GrabTick = 0;
}
void CFlag::TickPaused()
{
++m_DropTick;
if(m_GrabTick)
++m_GrabTick;
}
void CFlag::Snap(int SnappingClient)
{
if(NetworkClipped(SnappingClient))

View file

@ -22,6 +22,7 @@ public:
CFlag(CGameWorld *pGameWorld, int Team);
virtual void Reset();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
};

View file

@ -136,6 +136,11 @@ void CLaser::Tick()
DoBounce();
}
void CLaser::TickPaused()
{
++m_EvalTick;
}
void CLaser::Snap(int SnappingClient)
{
if(NetworkClipped(SnappingClient))

View file

@ -12,6 +12,7 @@ public:
virtual void Reset();
virtual void Tick();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
protected:

View file

@ -139,6 +139,12 @@ void CPickup::Tick()
}
}
void CPickup::TickPaused()
{
/*if(m_SpawnTick != -1)
++m_SpawnTick;*/
}
void CPickup::Snap(int SnappingClient)
{
/*if(m_SpawnTick != -1 || NetworkClipped(SnappingClient))

View file

@ -14,6 +14,7 @@ public:
virtual void Reset();
virtual void Tick();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
private:

Some files were not shown because too many files have changed in this diff Show more