De onde vêm os dados do site
Quais dados do site são lidos do código e quais são escritos à mão, como as versões estável e de desenvolvimento são separadas, o que o build confere e como o site é publicado e mantido.
Este site é gerado a partir do repositório do Xendroid+, em dois idiomas: o inglês na raiz do endereço e o português em pt-br/. Cada página existe nos dois, com o mesmo conteúdo, e o seletor de idioma do cabeçalho leva à mesma página no outro idioma. O que dá para ler do código é lido do código a cada build; o que precisa de explicação é escrito à mão, em Markdown, e conferido contra o código quando possível. Nada garante que um texto escrito à mão continue certo depois que o app muda: por isso cada página diz com qual versão foi revisada e avisa quando o código citado mudou depois disso.
Duas versões #
- Estável: o commit da release mais recente publicada no GitHub, hoje a build 63 (
732c64db). É a versão que a página inicial oferece para baixar e a base da documentação e do simulador. - Desenvolvimento: o commit do
mainem que o site é gerado (87b5c00f).
O build lê as duas separadamente: a estável numa árvore de trabalho própria, no commit da release. Quando as duas dão os mesmos dados (o main mudou só o site, um workflow ou comentários do código), o site mostra uma versão só e diz isso. Quando mudou, a referência de ajustes lista as diferenças, os trechos da documentação marcados com uma versão dizem a partir de qual build valem, e os dados das duas são publicados em dados/estavel.json e dados/desenvolvimento.json.
O que é lido do código #
| Dado | Arquivo de origem | Como é lido | Versão |
|---|---|---|---|
| Ajustes (nome, grupo, nível, textos, opções) | app/src/main/java/xendroid/compose/settings/SettingsSchema.kt, app/src/main/java/xendroid/compose/settings/SettingCatalog.kt, app/src/main/java/xendroid/compose/ui/settings/SettingTexts.kt, app/src/main/java/xendroid/compose/ui/settings/XdSettings.kt | lidos do Kotlin, com os textos de values-pt-rBR (inglês quando falta tradução) e, nas páginas em inglês, de values/ | estável e desenvolvimento |
| Padrão de cada ajuste | emulator-core/src/main/assets/config/default_config.toml, app/src/main/java/xendroid/compose/settings/SettingsSchema.kt | o valor do modelo default_config.toml; sem ele, o do esquema, como o app faz | estável e desenvolvimento |
| Cvars do núcleo (tipo, seção, padrão) | emulator-core/src/main/cpp/xenia/src/xenia/ | DEFINE_* do C++, com o pré-processador do build Android | estável e desenvolvimento |
| Correções automáticas por jogo | emulator-core/src/main/cpp/xenia/src/xenia/game_quirks.cc | tabela do game_quirks.cc | estável |
| Patches de jogos | patches/xenia-canary/patches | arquivos *.patch.toml copiados para o APK no build | estável |
| Nomes de jogos por Title ID | patches/xenia-canary/patches, emulator-core/src/main/cpp/xenia/assets/game-compatibility/master.json | nome do arquivo de patch; senão a base vendorizada do Xenia (só o nome) | estável |
| Pacote, Android mínimo, ABI e pastas | app/build.gradle, .github/workflows/XenDroid.yml, emulator-core/src/main/java/xendroid/compose/Application.java, app/src/main/java/xendroid/compose/settings/ConfigStore.kt, app/src/main/java/xendroid/compose/driver/DriverSources.kt | padrões no build.gradle, no workflow e no código | estável e desenvolvimento |
| Medições de desempenho | README.md, README.pt-BR.md | tabela "## Desempenho" do README.pt-BR.md (páginas em português) e "## Performance snapshot" do README.md (páginas em inglês) | desenvolvimento (README atual) |
| Versões publicadas e APK | API de releases do GitHub, no momento do build; as páginas em português mostram o bloco update-summary:pt-BR de cada release, as em inglês o update-summary:en | releases | |
| Prints das telas | docs/ui-redesign/prints/app/ | imagens dos testes de tela (Roborazzi), convertidas para WebP | as do repositório |
Os textos dos ajustes são os do próprio app: em português, os de values-pt-rBR (quando o app não tem tradução, o texto aparece em inglês, marcado como tal); em inglês, os de values. O resumo de cada release vem do bloco update-summary:pt-BR das notas nas páginas em português e do update-summary:en nas em inglês, e a tabela de desempenho vem do README.pt-BR.md e do README.md. A base de títulos do Xenia que acompanha o núcleo serve só para dar nome a um Title ID: o estado de compatibilidade dela é do Xenia para PC e não vale para o Xendroid+.
O que é escrito à mão #
- As páginas da documentação, em
website/content/docs/*.md(português) ewebsite/content/docs/en/*.md(inglês). - Os textos da página inicial e as legendas dos prints, em
website/scripts/site/landing.mjs,website/content/prints.mjsewebsite/content/prints.en.mjs. - As anotações e os dados de exemplo do simulador (jogos, sessões, perfis), marcados como exemplo na própria ferramenta. O simulador é escrito em português; o build gera a versão em inglês trocando cada texto pelo do dicionário
website/content/simulador.en.json, ou pelo texto do próprio app em inglês quando é o mesmo rótulo do app, e para se faltar a tradução de algum texto.
Cada página da documentação diz no cabeçalho o commit com que foi revisada (conferido) e lista os arquivos do app que ela descreve (fontes). Se algum desses arquivos mudou entre a revisão e a versão estável, a página mostra um aviso no topo e o build registra o caso. Valores como a versão, o tamanho do APK, o pacote e as contagens entram nas páginas por referência aos dados ({{estavel.build}}, por exemplo), e não escritos no texto.
O que o build confere #
A cada build, o site confere:
- se cada ajuste do app tem uma cvar no núcleo, na mesma seção, e se os valores que o app grava são do tipo que o núcleo aceita;
- se as chaves do modelo
default_config.tomlexistem no núcleo; - se as correções automáticas por jogo apontam para cvars que existem;
- se os arquivos de patch têm o Title ID do nome;
- se cada link interno, âncora, arquivo do repositório citado, print e tela do simulador existe;
- se cada página tem a versão no outro idioma e se as duas apontam uma para a outra.
Um problema que torna o site errado (um dado que não pôde ser lido, um link quebrado) para a publicação. Uma inconsistência do próprio app não para o site: vai para a lista abaixo, que é o retrato do código da build 63.
Avisos sobre o código (17)
- Vulkan|vulkan_validation = "false": a cvar é int32 e o valor seria boolean ·
app/src/main/java/xendroid/compose/settings/SettingsSchema.kt:20 - Vulkan|vulkan_validation = "true": a cvar é int32 e o valor seria boolean ·
app/src/main/java/xendroid/compose/settings/SettingsSchema.kt:20 - Kernel|stack_size_multiplier_hack: o core não define a cvar "stack_size_multiplier_hack"; o valor gravado é ignorado ·
app/src/main/java/xendroid/compose/settings/SettingsSchema.kt:105 - emulator-core/src/main/assets/config/default_config.toml [CPU] disable_global_lock: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [CPU] disable_global_lock - emulator-core/src/main/assets/config/default_config.toml [GPU] gamma_render_target_as_srgb: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [GPU] gamma_render_target_as_srgb - emulator-core/src/main/assets/config/default_config.toml [GPU] query_occlusion_sample_lower_threshold: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [GPU] query_occlusion_sample_lower_threshold - emulator-core/src/main/assets/config/default_config.toml [GPU] query_occlusion_sample_upper_threshold: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [GPU] query_occlusion_sample_upper_threshold - emulator-core/src/main/assets/config/default_config.toml [GPU] readback_memexport: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [GPU] readback_memexport - emulator-core/src/main/assets/config/default_config.toml [General] notification_sound_path: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [General] notification_sound_path - emulator-core/src/main/assets/config/default_config.toml [Kernel] Allow_nui_initialization: o core não define essa cvar ·
emulator-core/src/main/assets/config/default_config.toml [Kernel] Allow_nui_initialization - emulator-core/src/main/assets/config/default_config.toml [Vulkan] vulkan_validation = false: a cvar é int32 e o valor seria boolean ·
emulator-core/src/main/assets/config/default_config.toml [Vulkan] vulkan_validation - [desenvolvimento] 464507E1 - Farming Simulator (TU1).patch.toml: title_id 464507DC difere do nome do arquivo
- [desenvolvimento] 464507E1 - Farming Simulator.patch.toml: title_id 464507DC difere do nome do arquivo
- [desenvolvimento] 534507D4 - Syndicate.patch.toml: title_id 45410923 difere do nome do arquivo
- [estavel] 464507E1 - Farming Simulator (TU1).patch.toml: title_id 464507DC difere do nome do arquivo
- [estavel] 464507E1 - Farming Simulator.patch.toml: title_id 464507DC difere do nome do arquivo
- [estavel] 534507D4 - Syndicate.patch.toml: title_id 45410923 difere do nome do arquivo
Padrões do app diferentes dos do núcleo (12)
O app grava o valor dele na primeira abertura (o do modelo default_config.toml, ou o do esquema quando o modelo não traz a chave); o núcleo só usaria o próprio padrão se a chave faltasse no arquivo.
Publicação #
O site é publicado pelo GitHub Pages com o workflow .github/workflows/pages.yml, que roda:
- a cada push no
mainque muda o site ou um arquivo que ele lê: o app, o núcleo, os patches, os README e os documentos; - quando o workflow do APK termina com sucesso no
main, o que cobre as releases novas (as releases criadas pelo próprio CI não disparam outros workflows); - uma vez por dia, para pegar releases publicadas ou editadas à mão;
- sob pedido, pela aba Actions.
Num pull request, o workflow só gera e confere o site, sem publicar. O token do GitHub Actions é usado só durante o build, para ler as releases; ele nunca chega às páginas.
Manter o site #
- Gerar e ver localmente: em
website/,npm ci,npm run buildenpm run serve, que serve o site no mesmo caminho do GitHub Pages. - Conferir:
npm run checkprocura links e recursos quebrados;npm testroda os testes no navegador (layout, teclado, busca, simulador). - Uma página nova são dois arquivos Markdown, um em
website/content/docs/e outro emwebsite/content/docs/en/, com título, descrição, seção e ordem no cabeçalho; o inglês leva tambémpt: <nome do arquivo em português>, que pareia as duas. - Depois de revisar uma página contra o código atual, atualize o
conferidodela.
O guia de manutenção completo está no README do site.