Este projecto nasceu para ajudar a acompanhar corridas de SuperTuxKart em tempo real. A ideia e simples: o servidor do STK envia a posicao dos karts por UDP, e o menu em Python mostra esses karts num mapa 2D com a classificação ao lado. Também permite organizar participantes em grupos.
Foi feito principalmente a pensar em Linux, torneios locais, LAN parties,
projectores e computadores diferentes ligados na mesma rede. Os scripts Python
tambem devem correr em macOS, desde que tenhas Python e pygame-ce.
Os ficheiros principais estao dentro da pasta projeto/:
app_menu/contém o menu para um, dois ou quatro servidores.stk-code/tem o codigo do SuperTuxKart modificado.stk-assets/tem as pistas e assets usados para desenhar os mapas.pontuacoes/guarda as classificações quando sais do mapa.
O ficheiro importante do lado do SuperTuxKart e:
projeto/stk-code/src/modes/world.cpp
E nele que o STK foi alterado para enviar os dados dos jogadores.
Durante a corrida, o STK envia mensagens com estes seis campos:
track|nome|kart|x|z|pos
O script usa o track para abrir o mapa local em:
projeto/stk-assets/tracks/<track_id>/quads.xml
Depois desenha a pista, coloca os jogadores nas coordenadas x e z, e ordena
a leaderboard usando o campo pos.
A única alteração intencional ao código do SuperTuxKart está em
projeto/stk-code/src/modes/world.cpp. Esta alteração envia por UDP os dados
necessários para o viewer da aplicação:
- pista atual
- nome do jogador
- kart
- posição X/Z
- posição na corrida
O viewer envia um pedido ao servidor STK na porta UDP 9998. Depois de receber esse pedido, o STK envia os dados da corrida para a porta UDP 9999 da máquina onde está a correr a aplicação Python.
A aplicação usa estes dados para identificar a pista, desenhar o minimapa com
o quads.xml local e mostrar os jogadores e a classificação em tempo real.
Não substituas world.cpp pela versão original do SuperTuxKart: isso remove
a telemetria UDP e o viewer deixa de receber os dados da corrida.
Instala estas ferramentas e bibliotecas antes de compilar:
sudo apt update
sudo apt install -y \
build-essential \
cmake \
pkg-config \
git \
libsdl2-dev \
libjpeg-dev \
libpng-dev \
zlib1g-dev \
libbluetooth-dev \
libopenal-dev \
libfreetype6-dev \
libvorbis-dev \
libogg-dev \
libharfbuzz-dev \
libcurl4-openssl-dev \
libssl-dev \
libsqlite3-devInstala o Python e o suporte para ambientes virtuais:
sudo apt install -y python3 python3-venv python3-pipNa raiz do repositório, cria a venv do menu e instala os pacotes Python:
cd projeto/app_menu
python3 -m venv .venv
source .venv/bin/activate
pip install pygame-ce numpyUsa pygame-ce, não o pacote Ubuntu python3-pygame. O menu usa
pygame.Window e precisa do pygame-ce 2.5.7 ou superior.
Não instales pygame e pygame-ce juntos na mesma venv. Os SVG são carregados
pelo pygame-ce; não é necessário CairoSVG.
Requisitos: Python 3, pygame-ce 2.5.7 ou superior e as pistas em
projeto/stk-assets/tracks/. Para receber dados, precisas do servidor STK
modificado descrito abaixo. Assistir inicia apenas o servidor configurado
como local. O menu não compila STK nem inicia a corrida dentro do lobby.
Se todos os servidores forem remotos, não precisas de compilar ou instalar STK
na máquina do menu. Podes usar o menu no Mac e o servidor no Pop!_OS.
Mantém as pistas em projeto/stk-assets/tracks/ na máquina do menu.
Se já tens uma .venv a funcionar, podes continuar a usá-la.
Dentro de projeto/app_menu/, com a venv ativada:
python app_menu.pyOu, sem ativar a venv:
.venv/bin/python app_menu.py- Escolhe 1, 2 ou 4 servidores e indica os nomes e IPs.
- Em Configurar grupos, indica os participantes, os nomes e o número de grupos. Usa Randomizar para distribuir os nomes preenchidos.
- Volta ao menu e usa Assistir para acompanhar os servidores. O servidor local é iniciado pelo menu; os remotos devem estar a correr nos seus computadores. Assistir mostra todos os servidores ao mesmo tempo: um mapa grande, dois lado a lado ou quatro numa grelha 2×2, cada um com a sua classificação.
- Voltar, Escape ou fechar a janela usa
pkill supertuxkartse o menu iniciou um servidor local e guarda a classificação atual emprojeto/pontuacoes/. Escape no menu fecha a aplicação.
Cada IP identifica o computador de um servidor. O menu pode correr noutro
computador. Para um servidor local, escreve 127.0.0.1 ou localhost.
Para um servidor remoto, escreve o IP real do outro computador. O menu não
procura os IPs de rede desta máquina: qualquer outro endereço é tratado como
remoto. Só o servidor local é iniciado automaticamente, com o nome indicado.
Nos remotos, usa um IP numérico IPv4, não um nome de máquina.
Os remotos são iniciados manualmente nos respetivos computadores; os nomes no
menu identificam os seus mapas e pontuações, sem alterar o nome do STK remoto.
Um torneio de 2 ou 4 servidores não inicia 2 ou 4 processos nesta máquina. Usa um computador por servidor, com no máximo um servidor local. Qualquer entrada pode ser local, não apenas a primeira. Também podes usar só servidores remotos. Usa IPs diferentes para cada servidor.
Os grupos ficam apenas em memória e não são enviados ao STK. Usa a roda do rato para percorrer participantes, grupos ou classificações que não caibam no ecrã.
Em Configurar grupos, podes preparar entre 2 e 32 campos de participantes e escolher entre 1 e 16 grupos. Só os nomes preenchidos entram na distribuição; são necessários pelo menos dois. Os resultados aparecem no ecrã e no terminal. Esta é a ferramenta atual de organização de grupos do projeto.
Mantém o terminal aberto para acompanhar os servidores selecionados, os pedidos UDP, a primeira receção de dados, as pistas, os novos jogadores e os erros. O menu não imprime cada pacote nem inicia corridas: estas são iniciadas no STK.
Só o servidor local gera uma configuração em
projeto/app_menu/runtime/local_server.xml, numa pasta ignorada pelo Git.
O XML é recriado ao iniciar o servidor local, com o nome e dificuldade atuais.
Não é lido para recuperar escolhas anteriores: as opções do menu ficam apenas
em memória. A referência my.xml não é alterada.
O menu procura o executável compilado em projeto/stk-code/build-server/ e
inicia-o em segundo plano com os.system. Usa --server-config com o XML
gerado, --lan-server com o nome escolhido, --port=2759 e --network-console.
Os caminhos e nomes são protegidos com shlex.quote para aceitar espaços.
As variáveis nativas SUPERTUXKART_DATADIR e SUPERTUXKART_ASSETS_DIR indicam
os dados e assets deste repositório. O STK usa a sua pasta de utilizador normal.
O menu não cria logs do servidor nem redireciona stdout/stderr: a saída aparece
no terminal. O STK pode criar os seus próprios logs na pasta de utilizador.
O jogo usa a porta 2759 e a descoberta LAN usa 2757. Cada computador STK
recebe pedidos de telemetria em 9998; o menu recebe as respostas em 9999.
Ao sair de uma sessão com servidor local, o menu executa pkill supertuxkart.
Este comando pode parar todos os processos SuperTuxKart que o utilizador tem
permissão para terminar nesta máquina, incluindo os iniciados fora do menu.
O projeto assume apenas uma instância local do STK. Sessões só com servidores
remotos não executam pkill, e os servidores dos outros computadores não são
parados. O menu não acompanha o processo nem confirma que ficou pronto.
Como o comando corre em segundo plano, falhas posteriores aparecem no terminal.
Sem dados de um remoto, confirma que está em corrida, que o IP está correto e que a firewall permite UDP.
O código do menu está dividido em quatro ficheiros:
app_menu.py: eventos, navegação e organização dos participantes.menu_ui.py: botões, campos, SVG e desenho dos ecrãs.stk_viewer.py: UDP, leitura de pistas e gravação de pontuações.server_process.py: configurações, arranque e paragem dos processos STK.
Para mudar os nomes dos botões, começa em MenuApp.__init__ no app_menu.py.
Os ecrãs estão nas funções draw_home, draw_groups e draw_viewer do
menu_ui.py. O formato dos pacotes está em parse_packet no stk_viewer.py.
O projecto precisa do SuperTuxKart compilado com a alteracao no world.cpp.
Na raiz do repositório, executa:
cd projeto/stk-code
cmake -S . -B build-server \
-DCMAKE_BUILD_TYPE=Debug \
-DNO_SHADERC=on
cmake --build build-server -j"$(nproc)"Os avisos sobre astc-encoder e libopenglrecorder são opcionais e não
impedem a compilação. A falta de libopenglrecorder desativa o gravador do jogo.
Em macOS, troca o ultimo comando por:
cmake --build build-server -j"$(sysctl -n hw.ncpu)"Se precisares de detalhes sobre dependencias do STK, ve:
projeto/stk-code/INSTALL.md
Exemplo:
cd projeto/stk-code/build-server
./bin/supertuxkart --server-config=my.xml --lan-server=torneio1 --network-consoleHa uma configuracao de referencia em:
projeto/necessary_files/my.xml
Se my.xml nao existir na tua pasta build-server, copia esse ficheiro para la
ou cria uma configuracao equivalente.
Os níveis desta versão do STK são Novice (0), Intermediate (1), Expert (2)
e SuperTux (3). O campo de configuração é server-difficulty.
No menu, clica no botão Local: Novice para percorrer os quatro níveis.
Escolhe antes de Assistir. O menu escreve o nível escolhido em
app_menu/runtime/local_server.xml, apenas para o servidor local.
O nível inicial é Novice, como na configuração de referência.
O botão do menu não altera servidores remotos. Em cada computador remoto:
-
Instala as dependências e compila STK com os comandos acima.
-
Na raiz do repositório, copia a configuração:
cp projeto/necessary_files/my.xml projeto/stk-code/build-server/my.xml
-
Edita essa cópia e escolhe o nível. Por exemplo, Expert:
<server-difficulty value="2" />
Mantém
<server-configurable value="false" />para que o dono não altere a dificuldade no lobby. -
Inicia o servidor nesse computador, usando o nome pretendido:
cd projeto/stk-code/build-server ./bin/supertuxkart --server-config=my.xml --lan-server="GLUA Race 1" --network-console
-
Introduz o IP desse computador no menu Python e usa Assistir.
No menu, escolhe o número de servidores e escreve os respetivos IPs. Usa um computador por servidor: a telemetria do STK usa portas fixas, pelo que vários servidores na mesma máquina entram em conflito. Abre apenas um menu por computador para receber os dados.
As portas usadas sao:
9998/udppara o Python pedir dados ao STK.9999/udppara o STK enviar os dados de volta ao Python.
Se estiveres a usar computadores diferentes, confirma que a firewall deixa essas portas passar.
Para descobrir o IP do servidor em Linux:
hostname -IEm macOS:
ipconfig getifaddr en0Quando sais do mapa no menu, é guardada a classificação atual em:
projeto/pontuacoes/
O menu cria ficheiros app_viewer_<data>_<hora>.txt, com o nome e IP de cada
servidor, a pista e os jogadores ordenados pela posição. Se dois ficheiros
forem guardados no mesmo segundo, acrescenta um número ao nome.
Isto e util para guardar um registo rapido do fim da corrida ou do estado da leaderboard.
Se a janela abrir mas nao aparecer mapa, normalmente ainda nao chegaram pacotes
do servidor, o IP esta errado, a firewall bloqueou as portas, ou a pista nao
existe em stk-assets/tracks/.
Se aparecer Mapa indisponível, confirma que existe o quads.xml da pista
recebida em projeto/stk-assets/tracks/ e que o XML é válido.
Se aparecer Address already in use, já tens outro menu ou outro processo a
usar a porta 9999.
Se nao aparecerem jogadores, confirma que estas mesmo a correr o STK compilado
com o world.cpp modificado. Um servidor normal do SuperTuxKart nao envia estes
dados UDP.
Este projecto inclui e modifica codigo do SuperTuxKart. O SuperTuxKart esta sob a licenca GNU GPLv3.
projeto/stk-code/COPYING
Espero que este projecto ajude a criar bons momentos e que traga alguma felicidade a este mundo em que vivemos.
Obrigado ao GLUA e a equipa por detras do STK :)
Obrigado a ti por jogares!